diff --git a/.gitattributes b/.gitattributes index f958e9d..dcc7079 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,10 @@ -/.* export-ignore -/tests export-ignore -/*.xml export-ignore -/*.yml export-ignore -/*.yaml export-ignore -/*.lock export-ignore -/*.dist export-ignore +/.* export-ignore +/tests export-ignore +/*.xml export-ignore +/*.yml export-ignore +/*.yaml export-ignore +/*.lock export-ignore +/*.dist export-ignore +/*.json export-ignore +/CLAUDE.md export-ignore +/composer.json -export-ignore diff --git a/.github/workflows/infection.yml b/.github/workflows/infection.yml new file mode 100644 index 0000000..a1d2dc6 --- /dev/null +++ b/.github/workflows/infection.yml @@ -0,0 +1,52 @@ +name: ๐Ÿงฌ Mutation Tests + +on: # yamllint disable-line rule:truthy + push: + paths: + - 'src/**' + - 'tests/**' + - 'infection.json' + - 'testo.php' + - 'composer.json' + - 'composer.lock' + - '.github/workflows/infection.yml' + pull_request: + paths: + - 'src/**' + - 'tests/**' + - 'infection.json' + - 'testo.php' + - 'composer.json' + - 'composer.lock' + - '.github/workflows/infection.yml' + +jobs: + infection: + name: Infection ยท PHP ${{ matrix.php }} + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + php: ['8.4'] + dependencies: [highest] + + steps: + - name: ๐Ÿ“ฆ Check out the codebase + uses: actions/checkout@v5 + + - name: ๐Ÿ› ๏ธ Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: mbstring, pdo, pdo_sqlite + ini-values: error_reporting=E_ALL + coverage: xdebug + + - name: ๐Ÿ“ฅ Install dependencies with composer + uses: ramsey/composer-install@v3 + with: + dependency-versions: ${{ matrix.dependencies }} + + - name: ๐Ÿงฌ Run Infection + run: composer infect:ci diff --git a/.github/workflows/refactoring.yml b/.github/workflows/refactoring.yml index 7c99449..7d4ee4e 100644 --- a/.github/workflows/refactoring.yml +++ b/.github/workflows/refactoring.yml @@ -41,7 +41,7 @@ jobs: coverage: none - name: ๐Ÿค– Validate composer.json and composer.lock - run: composer validate --ansi --strict + run: composer validate --ansi - name: ๐Ÿ“ฅ Install dependencies with composer uses: ramsey/composer-install@v3 diff --git a/.github/workflows/security-analysis.yml b/.github/workflows/security-analysis.yml index 55221bd..23262f0 100644 --- a/.github/workflows/security-analysis.yml +++ b/.github/workflows/security-analysis.yml @@ -39,7 +39,7 @@ jobs: coverage: none - name: ๐Ÿค– Validate composer.json and composer.lock - run: composer validate --ansi --strict + run: composer validate --ansi - name: ๐Ÿ“ฅ Install dependencies with composer uses: ramsey/composer-install@v3 diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 66752bc..0b223a6 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -45,7 +45,7 @@ jobs: run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - name: ๐Ÿค– Validate composer.json and composer.lock - run: composer validate --ansi --strict + run: composer validate --ansi - name: ๐Ÿ“ฅ Install dependencies with composer uses: ramsey/composer-install@v3 diff --git a/.github/workflows/testing-mysql.yml b/.github/workflows/testing-mysql.yml index 9f06dd0..6af3fb4 100644 --- a/.github/workflows/testing-mysql.yml +++ b/.github/workflows/testing-mysql.yml @@ -1,18 +1,65 @@ --- on: # yamllint disable-line rule:truthy + pull_request: null push: branches: + - master + - main - '*.*' - '*.*.*' - pull_request: null -name: MSSQL +name: ๐Ÿ›ข๏ธ MySQL jobs: - phpunit: - uses: cycle/gh-actions/.github/workflows/db-mssql.yml@master - with: - php: '["8.1","8.2","8.3","8.4"]' + acceptance: + name: MySQL ยท PHP ${{ matrix.php-version }} + timeout-minutes: 8 + runs-on: ubuntu-latest + concurrency: + cancel-in-progress: true + group: mysql-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.php-version }} + strategy: + fail-fast: false + matrix: + php-version: + - '8.2' + - '8.3' + - '8.4' + steps: + - name: ๐Ÿ“ฆ Check out the codebase + uses: actions/checkout@v5 + + - name: ๐Ÿ› ๏ธ Start MySQL + run: docker compose -f tests/docker-compose.yml up -d cycle-mysql + + - name: ๐Ÿ› ๏ธ Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: mbstring, pdo, pdo_sqlite, pdo_mysql + ini-values: error_reporting=E_ALL + + - name: ๐Ÿ“ฅ Install dependencies with composer + uses: ramsey/composer-install@v3 + with: + dependency-versions: highest + + - name: โณ Wait for MySQL + run: | + for i in $(seq 1 30); do + if docker exec $(docker ps -qf "ancestor=mysql:8.0.37") mysqladmin ping -h 127.0.0.1 --silent; then + echo "MySQL is up"; exit 0 + fi + echo "Waiting for MySQL... ($i)"; sleep 2 + done + echo "MySQL did not become ready in time"; exit 1 -... + - name: ๐Ÿงช Run acceptance tests (MySQL) + env: + DB_HOSTNAME: 127.0.0.1 + DB_PORT: 13306 + DB_USER: root + DB_PASSWORD: 'YourStrong!Passw0rd' + DB_DATABASE: spiral + run: composer test:mysql diff --git a/.github/workflows/testing-pgsql.yml b/.github/workflows/testing-pgsql.yml index 41c7d59..3235d7e 100644 --- a/.github/workflows/testing-pgsql.yml +++ b/.github/workflows/testing-pgsql.yml @@ -1,18 +1,65 @@ --- on: # yamllint disable-line rule:truthy + pull_request: null push: branches: + - master + - main - '*.*' - '*.*.*' - pull_request: null -name: Postgres +name: ๐Ÿ˜ Postgres jobs: - phpunit: - uses: cycle/gh-actions/.github/workflows/db-pgsql.yml@master - with: - php: '["8.1","8.2","8.3","8.4"]' + acceptance: + name: Postgres ยท PHP ${{ matrix.php-version }} + timeout-minutes: 8 + runs-on: ubuntu-latest + concurrency: + cancel-in-progress: true + group: pgsql-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.php-version }} + strategy: + fail-fast: false + matrix: + php-version: + - '8.2' + - '8.3' + - '8.4' + steps: + - name: ๐Ÿ“ฆ Check out the codebase + uses: actions/checkout@v5 + + - name: ๐Ÿ› ๏ธ Start PostgreSQL + run: docker compose -f tests/docker-compose.yml up -d cycle-postgres + + - name: ๐Ÿ› ๏ธ Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: mbstring, pdo, pdo_sqlite, pdo_pgsql + ini-values: error_reporting=E_ALL + + - name: ๐Ÿ“ฅ Install dependencies with composer + uses: ramsey/composer-install@v3 + with: + dependency-versions: highest + + - name: โณ Wait for PostgreSQL + run: | + for i in $(seq 1 30); do + if docker exec $(docker ps -qf "ancestor=postgres:15.2") pg_isready -U postgres; then + echo "PostgreSQL is up"; exit 0 + fi + echo "Waiting for PostgreSQL... ($i)"; sleep 2 + done + echo "PostgreSQL did not become ready in time"; exit 1 -... + - name: ๐Ÿงช Run acceptance tests (PostgreSQL) + env: + DB_HOSTNAME: 127.0.0.1 + DB_PORT: 15432 + DB_USER: postgres + DB_PASSWORD: 'YourStrong!Passw0rd' + DB_DATABASE: spiral + run: composer test:pgsql diff --git a/.github/workflows/testing-sqlserver.yml b/.github/workflows/testing-sqlserver.yml index 9f06dd0..539251e 100644 --- a/.github/workflows/testing-sqlserver.yml +++ b/.github/workflows/testing-sqlserver.yml @@ -1,18 +1,76 @@ --- on: # yamllint disable-line rule:truthy + pull_request: null push: branches: + - master + - main - '*.*' - '*.*.*' - pull_request: null -name: MSSQL +name: ๐Ÿ“€ SQLServer jobs: - phpunit: - uses: cycle/gh-actions/.github/workflows/db-mssql.yml@master - with: - php: '["8.1","8.2","8.3","8.4"]' + acceptance: + name: SQLServer ยท PHP ${{ matrix.php-version }} + timeout-minutes: 10 + runs-on: ubuntu-latest + concurrency: + cancel-in-progress: true + group: mssql-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.php-version }} + strategy: + fail-fast: false + matrix: + php-version: + - '8.2' + - '8.3' + - '8.4' + steps: + - name: ๐Ÿ“ฆ Check out the codebase + uses: actions/checkout@v5 + + - name: ๐Ÿ› ๏ธ Install ODBC driver + run: | + curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list \ + | sudo tee /etc/apt/sources.list.d/mssql-release.list + sudo apt-get update + sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 + + - name: ๐Ÿ› ๏ธ Start SQLServer + run: docker compose -f tests/docker-compose.yml up -d cycle-sqlserver + + - name: ๐Ÿ› ๏ธ Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + tools: pecl + extensions: mbstring, pdo, pdo_sqlite, sqlsrv, pdo_sqlsrv + ini-values: error_reporting=E_ALL + + - name: ๐Ÿ“ฅ Install dependencies with composer + uses: ramsey/composer-install@v3 + with: + dependency-versions: highest + + - name: โณ Wait for SQLServer + run: | + container=$(docker ps -qf "ancestor=mcr.microsoft.com/mssql/server:2019-latest") + for i in $(seq 1 30); do + # The image ships sqlcmd under mssql-tools18 (v18 encrypts by default, so it needs -C); + # fall back to the legacy mssql-tools path for older images. + if docker exec "$container" bash -c \ + "/opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P 'YourStrong!Passw0rd' -C -Q 'SELECT 1' -b \ + || /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1' -b"; then + echo "SQLServer is up"; exit 0 + fi + echo "Waiting for SQLServer... ($i)"; sleep 3 + done + echo "SQLServer did not become ready in time"; exit 1 -... + - name: ๐Ÿงช Run acceptance tests (SQLServer) + env: + DB_HOSTNAME: 127.0.0.1 + DB_PORT: 11433 + DB_PASSWORD: 'YourStrong!Passw0rd' + run: composer test:sqlserver diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 5e06ca1..f5da460 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1,37 +1,34 @@ --- on: # yamllint disable-line rule:truthy - pull_request: - branches: - - '*.*' + pull_request: null push: branches: + - master + - main - '*.*' + - '*.*.*' name: ๐Ÿ” Continuous integration jobs: - code-coverage: + unit: + name: Unit ยท PHP ${{ matrix.php-version }} timeout-minutes: 4 runs-on: ${{ matrix.os }} concurrency: cancel-in-progress: true - group: code-coverage-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + group: unit-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.php-version }} strategy: - fail-fast: true + fail-fast: false matrix: os: - ubuntu-latest php-version: - '8.2' - dependencies: - - locked + - '8.3' + - '8.4' steps: - - name: Install ODBC driver. - run: | - sudo curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list - sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 - - name: ๐Ÿ“ฆ Check out the codebase uses: actions/checkout@v5 @@ -41,42 +38,25 @@ jobs: php-version: ${{ matrix.php-version }} extensions: mbstring, pdo, pdo_sqlite ini-values: error_reporting=E_ALL - coverage: xdebug - name: ๐Ÿค– Validate composer.json and composer.lock - run: composer validate --ansi --strict + run: composer validate --ansi - name: ๐Ÿ“ฅ Install dependencies with composer uses: ramsey/composer-install@v3 with: - dependency-versions: "highest" + dependency-versions: highest - - name: ๐Ÿงช Collect code coverage with Xdebug and phpunit/phpunit - run: composer test:cc + - name: ๐Ÿงช Run tests (excluding driver-bound groups) + run: composer test:no-driver - - name: ๐Ÿ“ค Upload code coverage report to Codecov - uses: codecov/codecov-action@v4 - with: - files: runtime/phpunit/logs/clover.xml - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true - - - arch-testing: + code-coverage: + name: Code coverage timeout-minutes: 4 - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest concurrency: cancel-in-progress: true - group: arch-testing-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.php-version }}-${{ matrix.dependencies }} - strategy: - fail-fast: true - matrix: - os: - - ubuntu-latest - php-version: - - '8.2' - dependencies: - - locked + group: code-coverage-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} steps: - name: ๐Ÿ“ฆ Check out the codebase uses: actions/checkout@v5 @@ -84,18 +64,22 @@ jobs: - name: ๐Ÿ› ๏ธ Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: ${{ matrix.php-version }} + php-version: '8.4' extensions: mbstring, pdo, pdo_sqlite ini-values: error_reporting=E_ALL coverage: xdebug - - name: ๐Ÿค– Validate composer.json and composer.lock - run: composer validate --ansi --strict - - name: ๐Ÿ“ฅ Install dependencies with composer uses: ramsey/composer-install@v3 with: - dependency-versions: "highest" + dependency-versions: highest + + - name: ๐Ÿงช Collect code coverage with Testo + run: composer test:cc - - name: ๐Ÿš€ Run architecture tests - run: composer test:arch + - name: ๐Ÿ“ค Upload code coverage report to Codecov + uses: codecov/codecov-action@v4 + with: + files: runtime/clover.xml + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true diff --git a/.gitignore b/.gitignore index 265091e..6d08a64 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ !/.well-known/ !/.pre-commit-config.yaml /runtime/ -/tests/runtime/ /vendor/ .env composer.lock diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..ed66513 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,95 @@ +# CLAUDE.md + +Guidance for working in this repository. + +`cycle/active-record` is an ActiveRecord layer over Cycle ORM. Source lives in `src/` (namespace +`Cycle\ActiveRecord\`). Entities reach the ORM through the static `Cycle\ActiveRecord\Facade`, which +holds a PSR-11 container that resolves `ORMInterface` and `DatabaseManager`. + +## Testing + +Tests run on **[Testo](https://php-testo.github.io)**, not PHPUnit. Do **not** add `phpunit`, +`mockery`, or `extends TestCase` โ€” they have been removed on purpose. + +When writing or changing tests, load the `testo-write-tests` skill and follow it. The essentials: + +### Suites & layout + +Two suites are declared in `testo.php`: + +- **Unit** โ€” `tests/src/Unit/` (namespace `Cycle\Tests\Unit\`). Driver-agnostic, no database server. + Where a SQLite in-memory ORM is needed, build one with `OrmEnvironment::forDriver(...)`. +- **Acceptance** โ€” only the concrete per-driver classes under `tests/src/Acceptance/Driver//` + are discovered. The actual scenarios live in the abstract `Acceptance/Common/ActiveRecordTestCase` + and run once per driver. Shared test harness is in `tests/src/Acceptance/Testo/`. + +Mirror the structure: a new driver-bound scenario is usually **a new method on the abstract +`ActiveRecordTestCase`** โ€” it then runs on every driver automatically. + +### `#[Group('driver-*')]` is mandatory for DB-bound tests + +The `DatabasePlugin` (registered on the Acceptance suite) provisions the database **based on the +driver group**: + +- The abstract case carries `#[Group('driver')]`; each concrete class carries `#[Group('driver-sqlite')]`, + `driver-mysql`, `driver-pgsql`, or `driver-sqlserver`. +- For each test the plugin's interceptor resolves the driver from that group, builds the schema/seed + **once per driver**, binds a fresh ORM to the `Facade` (via a container `scope`), and wraps the test + in a transaction that is **rolled back** afterwards. So a test never recreates tables and never leaks + state. +- A test class with **no** `driver-*` group gets no database โ€” put database-touching tests in the + Acceptance suite with the proper group, not in Unit. + +Inside a scenario, read the environment back from the Facade through the base helpers: +`$this->orm()`, `$this->database('default'|'secondary')`, `$this->selectEntity($role, cleanHeap: true)`. +The baseline seed is two users โ€” `Antony` (id `1`) and `John` (id `2`) โ€” plus their identity rows. + +Use `#[WithoutTransaction]` (from `Cycle\Tests\Acceptance\Testo`) only for the rare test that must +observe the absence of an open transaction. Such a test **must not** mutate committed seed data. + +### Test classes instead of mocks + +There is no mocking library. Write small hand-rolled fakes that implement the real interface and +exercise the behaviour you need โ€” see `tests/src/Unit/Stub/Container/ConfigurableContainer.php` +(a PSR-11 container whose `get()` is a closure) used by `FacadeTest` instead of `createMock(...)`. +Never mock `final` classes or enums; instantiate the real type. + +### Testo conventions + +- Class-level `#[Test]`, `final class`, no base class for the concrete test. +- Assertions: `Testo\Assert`, argument order **actual, expected** โ€” `Assert::same($actual, $expected)`, + `Assert::count($collection, 3)`, `Assert::instanceOf($object, Foo::class)`. Typed chains: + `Assert::int($n)->greaterThan(0)`, `Assert::array($a)->hasCount(5)`. +- Expected exceptions: declare `Testo\Expect::exception(X::class)->withMessageContaining(...)` **before** + the throwing call; the method returns `never`. Use a `try/catch` only when you assert state *after* + the exception (e.g. that a transaction rolled back). +- Lifecycle: `#[BeforeTest]`/`#[AfterTest]`/`#[BeforeClass]`/`#[AfterClass]` โ€” never `setUp`/`tearDown`. +- Coverage: `#[Covers(...)]` (repeatable) points at concrete classes; the abstract `ActiveRecordTestCase` + declares the set it covers and the concrete driver classes inherit it. + +### Commands + +``` +composer test # full run (all suites) +composer test:unit # Unit suite +composer test:no-driver # everything except driver-bound tests (no DB needed) +composer test:sqlite # Acceptance against SQLite (in-memory) +composer test:mysql # Acceptance against MySQL (needs the docker-compose service) +composer test:pgsql # Acceptance against PostgreSQL +composer test:sqlserver # Acceptance against SQL Server +composer test:cc # run with coverage; writes runtime/clover.xml (needs Xdebug/PCOV) +``` + +Real databases for the driver suites come from `tests/docker-compose.yml`; connection parameters are +read from `DB_HOSTNAME` / `DB_PORT` / `DB_USER` / `DB_PASSWORD` / `DB_DATABASE` (see +`Acceptance/Testo/DatabaseDriver`). Always pass `--json` to `vendor/bin/testo` when you need a +machine-readable result. + +## Static analysis & style + +``` +composer psalm # Psalm (analyses src/ only) +composer cs:fix # PHP-CS-Fixer +composer refactor # Rector +composer infect # Infection (mutation testing, testFramework = testo) +``` diff --git a/README.md b/README.md index fb37b41..b93c7d8 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ This allows for more straightforward and rapid development cycles, particularly
-## ๐Ÿšฉ Prerequisites +## Prerequisites Before you begin, ensure your development environment meets the following requirements: @@ -46,7 +46,7 @@ Before you begin, ensure your development environment meets the following requir
-## ๐Ÿ’ฟ Installation +## Installation The preferred way to install this package is through [Composer](https://getcomposer.org/). @@ -117,7 +117,7 @@ This package uses [PSR-11](https://www.php-fig.org/psr/psr-11/) compatible `cont \Cycle\ActiveRecord\Facade::setContainer($container); ``` -## ๐Ÿ“– Usage +## Usage > [!NOTE] > For detailed usage instructions, refer to the [documentation][Documentation]. @@ -198,7 +198,7 @@ User::transact(function (DatabaseInterface $db, EntityManagerInterface $em) {
-## ๐Ÿ™Œ Want to Contribute? +## Want to Contribute? Thank you for considering contributing to the cycle community! We are open to all kinds of contributions. If you want to: diff --git a/composer.json b/composer.json index 9d94d68..894050a 100644 --- a/composer.json +++ b/composer.json @@ -14,8 +14,8 @@ ], "authors": [ { - "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" + "name": "Aleksei Gagarin", + "homepage": "https://github.com/roxblnfk" }, { "name": "Andrij Orlenko", @@ -35,31 +35,25 @@ } ], "require": { - "php": ">=8.1", - "cycle/database": "^2.11", - "cycle/orm": "^2.7", - "psr/container": "^2.0", - "yiisoft/injector": "^1.2" + "php": ">=8.2", + "cycle/database": "^2.20", + "cycle/orm": "^2.18", + "cycle/transaction": "^1", + "psr/container": "^2.0.2", + "yiisoft/injector": "^1.2.1" }, "require-dev": { - "buggregator/trap": "^1.5", - "cycle/entity-behavior": "^1.3", - "ergebnis/phpunit-slow-test-detector": "^2.14", - "fakerphp/faker": "^1.23", - "illuminate/support": "^10.48 || ^11.0", - "mockery/mockery": "^1.6", - "phpunit/phpunit": "^10.5", - "psalm/plugin-phpunit": "~0.19.0", - "rector/rector": "^1.0", - "infection/infection": ">=0.29", + "cycle/entity-behavior": "^1.7.1", + "illuminate/support": "^12 || ^13", + "infection/infection": ">=0.32.6", + "llm/skills": "^1.8", + "rector/rector": "^1.2.10", "spiral/boot": "^3.12", - "spiral/code-style": "^2.3", - "spiral/cycle-bridge": "^2.9", - "spiral/framework": "^3.12", - "spiral/logger": "^3.12", - "spiral/testing": "^2.7", - "ta-tikoma/phpunit-architecture-test": "^0.8.5", - "vimeo/psalm": "^6.0" + "spiral/code-style": "^2.3.1", + "spiral/cycle-bridge": "^2.13", + "testo/bridge-infection": "^0.1.6", + "testo/testo": "^0.10.26", + "vimeo/psalm": "^7@beta" }, "suggest": { "spiral/cycle-bridge": "Provides integration with Spiral Framework", @@ -75,22 +69,19 @@ }, "autoload-dev": { "psr-4": { - "Cycle\\App\\": "tests/app/", - "Cycle\\Tests\\": "tests/src/" + "Cycle\\Tests\\": "tests/" } }, "config": { "allow-plugins": { "ergebnis/composer-normalize": true, "infection/extension-installer": true, + "llm/skills": true, "spiral/composer-publish-plugin": true }, "audit": { "abandoned": "report" }, - "platform": { - "php": "8.1.17" - }, "sort-packages": true }, "extra": { @@ -123,44 +114,24 @@ "infect:ci": [ "Composer\\Config::disableProcessTimeout", "@putenv XDEBUG_MODE=coverage", - "infection --ansi --logger-github --ignore-msi-with-no-mutations --only-covered" + "infection --ansi --configuration=infection.json --logger-github --threads=max --show-mutations=0 --min-msi=50" ], "psalm": "psalm --show-info=true", "psalm:baseline": "psalm --set-baseline=psalm-baseline.xml", "psalm:ci": "psalm --output-format=github --shepherd --show-info=false --stats --threads=4", "refactor": "rector process --config=rector.php", "refactor:ci": "rector process --config=rector.php --dry-run --ansi", - "test": [ - "@putenv XDEBUG_MODE=coverage", - "phpunit --color=always" - ], - "test:arch": [ - "@putenv XDEBUG_MODE=coverage", - "phpunit --color=always" - ], + "test": "testo", + "test:unit": "testo --suite=Unit", + "test:acceptance": "testo --suite=Acceptance", + "test:no-driver": "testo --group=!driver", + "test:sqlite": "testo --suite=Acceptance --group=driver-sqlite", + "test:mysql": "testo --suite=Acceptance --group=driver-mysql", + "test:pgsql": "testo --suite=Acceptance --group=driver-pgsql", + "test:sqlserver": "testo --suite=Acceptance --group=driver-sqlserver", "test:cc": [ "@putenv XDEBUG_MODE=coverage", - "phpunit --coverage-clover=runtime/phpunit/logs/clover.xml --color=always" - ], - "test:mysql": [ - "@putenv XDEBUG_MODE=coverage", - "@putenv DB_DRIVER=mysql", - "phpunit --color=always" - ], - "test:pgsql": [ - "@putenv XDEBUG_MODE=coverage", - "@putenv DB_DRIVER=pgsql", - "phpunit --color=always" - ], - "test:sqlite": [ - "@putenv XDEBUG_MODE=coverage", - "@putenv DB_DRIVER=sqlite", - "phpunit --color=always" - ], - "test:sqlserver": [ - "@putenv XDEBUG_MODE=coverage", - "@putenv DB_DRIVER=sqlserver", - "phpunit --color=always" + "testo --coverage" ] } } diff --git a/composer.lock b/composer.lock index bf490e6..d115c3a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,207 +4,25 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "68d723ec5ccf2cd6e9ca2ec0b17ffca4", + "content-hash": "35285e4b71367b219aadf0e8e508a288", "packages": [ - { - "name": "brick/math", - "version": "0.13.1", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", - "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.1", - "vimeo/psalm": "6.8.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Brick\\Math\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Arbitrary-precision arithmetic library", - "keywords": [ - "Arbitrary-precision", - "BigInteger", - "BigRational", - "arithmetic", - "bigdecimal", - "bignum", - "bignumber", - "brick", - "decimal", - "integer", - "math", - "mathematics", - "rational" - ], - "support": { - "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.13.1" - }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - } - ], - "time": "2025-03-29T13:50:30+00:00" - }, - { - "name": "cocur/slugify", - "version": "v4.6.0", - "source": { - "type": "git", - "url": "https://github.com/cocur/slugify.git", - "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cocur/slugify/zipball/1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", - "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" - }, - "conflict": { - "symfony/config": "<3.4 || >=4,<4.3", - "symfony/dependency-injection": "<3.4 || >=4,<4.3", - "symfony/http-kernel": "<3.4 || >=4,<4.3", - "twig/twig": "<2.12.1" - }, - "require-dev": { - "laravel/framework": "^5.0|^6.0|^7.0|^8.0", - "latte/latte": "~2.2", - "league/container": "^2.2.0", - "mikey179/vfsstream": "~1.6.8", - "mockery/mockery": "^1.3", - "nette/di": "~2.4", - "pimple/pimple": "~1.1", - "plumphp/plum": "~0.1", - "symfony/config": "^3.4 || ^4.3 || ^5.0 || ^6.0", - "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0 || ^6.0", - "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.4 || ^6.0", - "twig/twig": "^2.12.1 || ~3.0", - "zendframework/zend-modulemanager": "~2.2", - "zendframework/zend-servicemanager": "~2.2", - "zendframework/zend-view": "~2.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cocur\\Slugify\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florian Eckerstorfer", - "email": "florian@eckerstorfer.co", - "homepage": "https://florian.ec" - }, - { - "name": "Ivo Bathke", - "email": "ivo.bathke@gmail.com" - } - ], - "description": "Converts a string into a slug.", - "keywords": [ - "slug", - "slugify" - ], - "support": { - "issues": "https://github.com/cocur/slugify/issues", - "source": "https://github.com/cocur/slugify/tree/v4.6.0" - }, - "time": "2024-09-10T14:09:25+00:00" - }, - { - "name": "codedungeon/php-cli-colors", - "version": "1.12.2", - "source": { - "type": "git", - "url": "https://github.com/mikeerickson/php-cli-colors.git", - "reference": "e346156f75717140a3dd622124d2ec686aa7ff8e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mikeerickson/php-cli-colors/zipball/e346156f75717140a3dd622124d2ec686aa7ff8e", - "reference": "e346156f75717140a3dd622124d2ec686aa7ff8e", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": ">=5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Codedungeon\\PHPCliColors\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike Erickson", - "email": "codedungeon@gmail.com" - } - ], - "description": "Liven up you PHP Console Apps with standard colors", - "homepage": "https://github.com/mikeerickson/php-cli-colors", - "keywords": [ - "color", - "colors", - "composer", - "package", - "php" - ], - "support": { - "issues": "https://github.com/mikeerickson/php-cli-colors/issues", - "source": "https://github.com/mikeerickson/php-cli-colors/tree/1.12.2" - }, - "time": "2021-01-05T04:48:27+00:00" - }, { "name": "cycle/database", - "version": "2.15.0", + "version": "2.21.0", "source": { "type": "git", "url": "https://github.com/cycle/database.git", - "reference": "3d7ee3524b299c5897e2b03dc51bad2ddd609a90" + "reference": "14c2bc280aa0973a9339866b21d8c03931a5c18e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cycle/database/zipball/3d7ee3524b299c5897e2b03dc51bad2ddd609a90", - "reference": "3d7ee3524b299c5897e2b03dc51bad2ddd609a90", + "url": "https://api.github.com/repos/cycle/database/zipball/14c2bc280aa0973a9339866b21d8c03931a5c18e", + "reference": "14c2bc280aa0973a9339866b21d8c03931a5c18e", "shasum": "" }, "require": { "ext-pdo": "*", - "php": ">=8.0", + "php": ">=8.1", "psr/log": "1 - 3", "spiral/core": "^2.8 || ^3.0", "spiral/pagination": "^2.8 || ^3.0", @@ -214,6 +32,7 @@ "spiral/database": "*" }, "require-dev": { + "buggregator/trap": "^1.15", "ergebnis/composer-normalize": "^2.42", "infection/infection": ">=0.26.10", "mockery/mockery": "^1.5", @@ -279,42 +98,48 @@ "type": "github" } ], - "time": "2025-07-22T05:27:52+00:00" + "time": "2026-06-24T09:51:31+00:00" }, { "name": "cycle/orm", - "version": "v2.10.1", + "version": "v2.18.0", "source": { "type": "git", "url": "https://github.com/cycle/orm.git", - "reference": "0b659067c00c3ffbee05109fa17812754acc2525" + "reference": "a7a1db351df8037ff7a1196e19688bfc7d35c63e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cycle/orm/zipball/0b659067c00c3ffbee05109fa17812754acc2525", - "reference": "0b659067c00c3ffbee05109fa17812754acc2525", + "url": "https://api.github.com/repos/cycle/orm/zipball/a7a1db351df8037ff7a1196e19688bfc7d35c63e", + "reference": "a7a1db351df8037ff7a1196e19688bfc7d35c63e", "shasum": "" }, "require": { - "cycle/database": "^2.8.1", + "cycle/database": "^2.19.0", "doctrine/instantiator": "^1.3.1 || ^2.0", - "ext-pdo": "*", - "php": ">=8.0", + "php": ">=8.1", "spiral/core": "^2.8 || ^3.0" }, "require-dev": { + "buggregator/trap": "^1.15", "doctrine/collections": "^1.6 || ^2.0", - "illuminate/collections": "9 - 11", + "ext-pdo": "*", + "illuminate/collections": "9 - 12", "loophp/collection": "^6.0 || ^7.0", "mockery/mockery": "^1.1", "phpunit/phpunit": "^9.5", "ramsey/uuid": "^4.0", + "roxblnfk/unpoly": "^1.8", "spiral/code-style": "~2.2.0", "spiral/tokenizer": "^2.8 || ^3.0", - "symfony/var-dumper": "^5.2 || ^6.0 || ^7.0", - "vimeo/psalm": "5.21 || ^6.8" + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, "autoload": { "psr-4": { "Cycle\\ORM\\": "src/" @@ -366,103 +191,89 @@ "type": "github" } ], - "time": "2025-03-31T19:41:17+00:00" + "time": "2026-06-15T16:45:48+00:00" }, { - "name": "defuse/php-encryption", - "version": "v2.4.0", + "name": "cycle/transaction", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/defuse/php-encryption.git", - "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" + "url": "https://github.com/cycle/transaction.git", + "reference": "6f851f3a864d878f351ccb0d3f86d767cdec96f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", - "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", + "url": "https://api.github.com/repos/cycle/transaction/zipball/6f851f3a864d878f351ccb0d3f86d767cdec96f2", + "reference": "6f851f3a864d878f351ccb0d3f86d767cdec96f2", "shasum": "" }, "require": { - "ext-openssl": "*", - "paragonie/random_compat": ">= 2", - "php": ">=5.6.0" + "cycle/database": "^2.20", + "cycle/orm": "^2.18", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", - "yoast/phpunit-polyfills": "^2.0.0" + "cycle/skills": "1.x-dev", + "infection/infection": ">=0.32.6", + "llm/skills": "^1.7", + "testo/bridge-infection": "^0.1.6", + "testo/testo": "^0.10.26", + "vimeo/psalm": "^7" }, - "bin": [ - "bin/generate-defuse-key" - ], "type": "library", "autoload": { "psr-4": { - "Defuse\\Crypto\\": "src" + "Cycle\\Transaction\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Taylor Hornby", - "email": "taylor@defuse.ca", - "homepage": "https://defuse.ca/" - }, - { - "name": "Scott Arciszewski", - "email": "info@paragonie.com", - "homepage": "https://paragonie.com" + "name": "Aleksei Gagarin", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Secure PHP Encryption Library", - "keywords": [ - "aes", - "authenticated encryption", - "cipher", - "crypto", - "cryptography", - "encrypt", - "encryption", - "openssl", - "security", - "symmetric key cryptography" - ], + "description": "Transaction abstraction for Cycle ORM: run DBAL operations and a scoped Entity Manager within a single database transaction.", "support": { - "issues": "https://github.com/defuse/php-encryption/issues", - "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" + "issues": "https://github.com/cycle/transaction/issues", + "source": "https://github.com/cycle/transaction/tree/1.0.0" }, - "time": "2023-06-19T06:10:36+00:00" + "time": "2026-06-24T11:21:31+00:00" }, { - "name": "doctrine/inflector", - "version": "2.1.0", + "name": "doctrine/instantiator", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^12.0 || ^13.0", - "phpstan/phpstan": "^1.12 || ^2.0", - "phpstan/phpstan-phpunit": "^1.4 || ^2.0", - "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", - "phpunit/phpunit": "^8.5 || ^12.2" + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "src" + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -471,43 +282,20 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" } ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" + "constructor", + "instantiate" ], "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.1.0" + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { @@ -519,43 +307,38 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", "type": "tidelift" } ], - "time": "2025-08-10T19:31:58+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { - "name": "doctrine/instantiator", - "version": "2.0.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -564,65 +347,51 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "constructor", - "instantiate" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:23:10+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "doctrine/lexer", - "version": "3.0.1", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.21" + "php": ">=7.2.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -631,82 +400,48 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "Standard interfaces for event handling.", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "events", + "psr", + "psr-14" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.1" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2024-02-05T11:56:58+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "egulias/email-validator", - "version": "4.0.4", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", - "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "doctrine/lexer": "^2.0 || ^3.0", - "php": ">=8.1", - "symfony/polyfill-intl-idn": "^1.26" - }, - "require-dev": { - "phpunit/phpunit": "^10.2", - "vimeo/psalm": "^5.12" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Egulias\\EmailValidator\\": "src" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -715,55 +450,58 @@ ], "authors": [ { - "name": "Eduardo Gulias Davis" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2025-03-06T22:45:56+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "graham-campbell/result-type", - "version": "v1.1.3", + "name": "spiral/core", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + "url": "https://github.com/spiral/core.git", + "reference": "faa40cb998ac0ba58b24cb599315026fe276f099" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "url": "https://api.github.com/repos/spiral/core/zipball/faa40cb998ac0ba58b24cb599315026fe276f099", + "reference": "faa40cb998ac0ba58b24cb599315026fe276f099", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "spiral/security": "^3.17" + }, + "provide": { + "psr/container-implementation": "^1.1|^2.0" }, "require-dev": { - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" + "Spiral\\Core\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -772,86 +510,70 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "An Implementation Of The Result Type", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" - ], + "description": "IoC container, IoC scopes, factory, memory, configuration interfaces", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/core" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/sponsors/spiral", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" } ], - "time": "2024-07-20T21:45:45+00:00" + "time": "2026-06-03T10:04:47+00:00" }, { - "name": "league/flysystem", - "version": "3.30.0", + "name": "spiral/hmvc", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" + "url": "https://github.com/spiral/hmvc.git", + "reference": "42ff28d261ef5335d80b33423f642aeb20f5420e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", - "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", + "url": "https://api.github.com/repos/spiral/hmvc/zipball/42ff28d261ef5335d80b33423f642aeb20f5420e", + "reference": "42ff28d261ef5335d80b33423f642aeb20f5420e", "shasum": "" }, "require": { - "league/flysystem-local": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "conflict": { - "async-aws/core": "<1.19.0", - "async-aws/s3": "<1.14.0", - "aws/aws-sdk-php": "3.209.31 || 3.210.0", - "guzzlehttp/guzzle": "<7.0", - "guzzlehttp/ringphp": "<1.1.1", - "phpseclib/phpseclib": "3.0.15", - "symfony/http-client": "<5.2" + "php": ">=8.1", + "psr/event-dispatcher": "^1.0", + "spiral/core": "^3.17", + "spiral/interceptors": "^3.17" }, "require-dev": { - "async-aws/s3": "^1.5 || ^2.0", - "async-aws/simple-s3": "^1.1 || ^2.0", - "aws/aws-sdk-php": "^3.295.10", - "composer/semver": "^3.0", - "ext-fileinfo": "*", - "ext-ftp": "*", - "ext-mongodb": "^1.3|^2", - "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.5", - "google/cloud-storage": "^1.23", - "guzzlehttp/psr7": "^2.6", - "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2|^2", - "phpseclib/phpseclib": "^3.0.36", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.5.11|^10.0", - "sabre/dav": "^4.6.0" + "phpunit/phpunit": "^10.5.41", + "spiral/testing": "^2.12", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { "psr-4": { - "League\\Flysystem\\": "src" + "Spiral\\Core\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -860,54 +582,71 @@ ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "File storage abstraction for PHP", - "keywords": [ - "WebDAV", - "aws", - "cloud", - "file", - "files", - "filesystem", - "filesystems", - "ftp", - "s3", - "sftp", - "storage" - ], + "description": "HMVC Core and Controllers", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" + "chat": "https://discord.gg/V6EK4he", + "docs": "https://spiral.dev/docs", + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/hmvc" }, - "time": "2025-06-25T13:29:59+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:08:18+00:00" }, { - "name": "league/flysystem-local", - "version": "3.30.0", + "name": "spiral/interceptors", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" + "url": "https://github.com/spiral/interceptors.git", + "reference": "b5b5712311b51a06c64f2197ee5ac69d1a1c56f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", - "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", + "url": "https://api.github.com/repos/spiral/interceptors/zipball/b5b5712311b51a06c64f2197ee5ac69d1a1c56f0", + "reference": "b5b5712311b51a06c64f2197ee5ac69d1a1c56f0", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "league/flysystem": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" + "php": ">=8.1", + "psr/event-dispatcher": "^1.0", + "spiral/core": "^3.17" + }, + "require-dev": { + "phpunit/phpunit": "^10.5.41", + "spiral/testing": "^2.12", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { "psr-4": { - "League\\Flysystem\\Local\\": "" + "Spiral\\Interceptors\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -916,50 +655,74 @@ ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Local filesystem adapter for Flysystem.", + "description": "Spiral Interceptors", + "homepage": "https://spiral.dev", "keywords": [ - "Flysystem", - "file", - "files", - "filesystem", - "local" + "aop", + "interceptors", + "spiral" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" + "chat": "https://discord.gg/V6EK4he", + "docs": "https://spiral.dev/docs", + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/interceptors" }, - "time": "2025-05-21T10:34:19+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:09:12+00:00" }, { - "name": "league/mime-type-detection", - "version": "1.16.0", + "name": "spiral/pagination", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + "url": "https://github.com/spiral/pagination.git", + "reference": "da6931e2e40c7f378ae7bd8a5d9cf03a840e526b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "url": "https://api.github.com/repos/spiral/pagination/zipball/da6931e2e40c7f378ae7bd8a5d9cf03a840e526b", + "reference": "da6931e2e40c7f378ae7bd8a5d9cf03a840e526b", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" + "php": ">=8.1" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { "psr-4": { - "League\\MimeTypeDetection\\": "src" + "Spiral\\Pagination\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -968,94 +731,70 @@ ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Mime-type detection for Flysystem", + "description": "Common pagination interfaces", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/pagination" }, "funding": [ { - "url": "https://github.com/frankdejonge", + "url": "https://github.com/sponsors/spiral", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" } ], - "time": "2024-09-21T08:32:55+00:00" + "time": "2026-06-02T20:04:16+00:00" }, { - "name": "monolog/monolog", - "version": "3.9.0", + "name": "spiral/security", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + "url": "https://github.com/spiral/security.git", + "reference": "52bab8373ba0172256321cb7cdc9baf06567eb66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "url": "https://api.github.com/repos/spiral/security/zipball/52bab8373ba0172256321cb7cdc9baf06567eb66", + "reference": "52bab8373ba0172256321cb7cdc9baf06567eb66", "shasum": "" }, "require": { "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" + "spiral/core": "^3.17", + "spiral/hmvc": "^3.17" }, "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2.0", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.8", - "phpstan/phpstan": "^2", - "phpstan/phpstan-deprecation-rules": "^2", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^10.5.17 || ^11.0.7", - "predis/predis": "^1.1 || ^2", - "rollbar/rollbar": "^4.0", - "ruflin/elastica": "^7 || ^8", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "spiral/console": "^3.17", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { "psr-4": { - "Monolog\\": "src/Monolog" + "Spiral\\Security\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1064,353 +803,381 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], + "description": "Spiral, RBAC security layer", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/security" }, "funding": [ { - "url": "https://github.com/Seldaek", + "url": "https://github.com/sponsors/spiral", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" } ], - "time": "2025-03-24T10:02:05+00:00" + "time": "2026-06-03T10:05:17+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.13.4", + "name": "symfony/polyfill-php83", + "version": "v1.38.2", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/796a26abb75ce49f3a84433cd81bf1009d73d5f8", + "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + "php": ">=7.2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { "files": [ - "src/DeepCopy/deep_copy.php" + "bootstrap.php" ], "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.38.2" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "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": "2025-08-01T08:46:24+00:00" + "time": "2026-05-27T06:51:48+00:00" }, { - "name": "nette/php-generator", - "version": "v4.2.0", + "name": "yiisoft/injector", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/nette/php-generator.git", - "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac" + "url": "https://github.com/yiisoft/injector.git", + "reference": "d3f718256b734933670ad11143cca724d340fc90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/4707546a1f11badd72f5d82af4f8a6bc64bd56ac", - "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac", + "url": "https://api.github.com/repos/yiisoft/injector/zipball/d3f718256b734933670ad11143cca724d340fc90", + "reference": "d3f718256b734933670ad11143cca724d340fc90", "shasum": "" }, "require": { - "nette/utils": "^4.0.6", - "php": "8.1 - 8.5" + "php": "7.4 - 8.5" }, "require-dev": { - "jetbrains/phpstorm-attributes": "^1.2", - "nette/tester": "^2.4", - "nikic/php-parser": "^5.0", - "phpstan/phpstan-nette": "^2.0@stable", - "tracy/tracy": "^2.8" + "bamarni/composer-bin-plugin": "^1.8.3", + "maglnet/composer-require-checker": "^3.8 || ^4.2", + "phpbench/phpbench": "^1.1", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0 || ^2.0", + "rector/rector": "^2.0.10", + "spatie/phpunit-watcher": "^1.23", + "yiisoft/test-support": "^1.4 || ^3.1" }, "suggest": { - "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" + "psr/container": "For automatic resolving of dependencies" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.2-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": true, + "target-directory": "tools" } }, "autoload": { "psr-4": { - "Nette\\": "src" - }, - "classmap": [ - "src/" - ] + "Yiisoft\\Injector\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "BSD-3-Clause" ], - "authors": [ + "description": "PSR-11 compatible injector. Executes a callable and makes an instances by injecting dependencies from a given DI container.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "PSR-11", + "dependency injection", + "di", + "injector", + "reflection" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/injector/issues?state=open", + "source": "https://github.com/yiisoft/injector", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" + "url": "https://github.com/sponsors/yiisoft", + "type": "github" }, { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" } ], - "description": "๐Ÿ˜ Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.5 features.", - "homepage": "https://nette.org", - "keywords": [ - "code", - "nette", - "php", - "scaffolding" - ], - "support": { - "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v4.2.0" - }, - "time": "2025-08-06T18:24:31+00:00" - }, + "time": "2025-12-01T11:14:17+00:00" + } + ], + "packages-dev": [ { - "name": "nette/utils", - "version": "v4.0.8", + "name": "amphp/amp", + "version": "v3.1.2", "source": { "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" + "url": "https://github.com/amphp/amp.git", + "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", - "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "url": "https://api.github.com/repos/amphp/amp/zipball/2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", + "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", "shasum": "" }, "require": { - "php": "8.0 - 8.5" - }, - "conflict": { - "nette/finder": "<3", - "nette/schema": "<1.2.2" + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, "require-dev": { - "jetbrains/phpstorm-attributes": "^1.2", - "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^2.0@stable", - "tracy/tracy": "^2.9" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, "autoload": { + "files": [ + "src/functions.php", + "src/Future/functions.php", + "src/Internal/functions.php" + ], "psr-4": { - "Nette\\": "src" - }, - "classmap": [ - "src/" - ] + "Amp\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" } ], - "description": "๐Ÿ›  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" ], "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.8" + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v3.1.2" }, - "time": "2025-08-06T21:43:34+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-06-21T13:59:44+00:00" }, { - "name": "nikic/php-parser", - "version": "v5.6.1", + "name": "amphp/byte-stream", + "version": "v2.1.2", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" + "url": "https://github.com/amphp/byte-stream.git", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" + "amphp/amp": "^3", + "amphp/parser": "^1.1", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2.3" }, "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.22.1" }, - "bin": [ - "bin/php-parse" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php" + ], "psr-4": { - "PhpParser\\": "lib/PhpParser" + "Amp\\ByteStream\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "A PHP parser written in PHP", + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", "keywords": [ - "parser", - "php" + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" }, - "time": "2025-08-13T20:13:15+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-03-16T17:10:27+00:00" }, { - "name": "nyholm/psr7", - "version": "1.8.2", + "name": "amphp/cache", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/Nyholm/psr7.git", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + "url": "https://github.com/amphp/cache.git", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0", - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "amphp/amp": "^3", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "php-http/message-factory": "^1.0", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", - "symfony/error-handler": "^4.4" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, "autoload": { "psr-4": { - "Nyholm\\Psr7\\": "src/" + "Amp\\Cache\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1419,187 +1186,231 @@ ], "authors": [ { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" } ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https://tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], + "description": "A fiber-aware cache API based on Amp and Revolt.", + "homepage": "https://amphp.org/cache", "support": { - "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + "issues": "https://github.com/amphp/cache/issues", + "source": "https://github.com/amphp/cache/tree/v2.0.1" }, "funding": [ { - "url": "https://github.com/Zegnat", - "type": "github" - }, - { - "url": "https://github.com/nyholm", + "url": "https://github.com/amphp", "type": "github" } ], - "time": "2024-09-09T07:06:30+00:00" + "time": "2024-04-19T03:38:06+00:00" }, { - "name": "paragonie/random_compat", - "version": "v9.99.100", + "name": "amphp/dns", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + "url": "https://github.com/amphp/dns.git", + "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", "shasum": "" }, "require": { - "php": ">= 7" + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/process": "^2", + "daverandom/libdns": "^2.0.2", + "ext-filter": "*", + "ext-json": "*", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.20" }, "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Dns\\": "src" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" + "name": "Chris Wright", + "email": "addr@daverandom.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" } ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "description": "Async DNS resolution for Amp.", + "homepage": "https://github.com/amphp/dns", "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" + "amp", + "amphp", + "async", + "client", + "dns", + "resolve" ], "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" + "issues": "https://github.com/amphp/dns/issues", + "source": "https://github.com/amphp/dns/tree/v2.4.0" }, - "time": "2020-10-15T08:29:30+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-01-19T15:43:40+00:00" }, { - "name": "phpoption/phpoption", - "version": "1.9.4", + "name": "amphp/parallel", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + "url": "https://github.com/amphp/parallel.git", + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", - "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "url": "https://api.github.com/repos/amphp/parallel/zipball/37f5b2754fadc229c00f9416bd68fb8d04529a81", + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/pipeline": "^1", + "amphp/process": "^2", + "amphp/serialization": "^1", + "amphp/socket": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, "autoload": { + "files": [ + "src/Context/functions.php", + "src/Context/Internal/functions.php", + "src/Ipc/functions.php", + "src/Worker/functions.php" + ], "psr-4": { - "PhpOption\\": "src/PhpOption/" + "Amp\\Parallel\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" }, { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" } ], - "description": "Option Type for PHP", + "description": "Parallel processing component for Amp.", + "homepage": "https://github.com/amphp/parallel", "keywords": [ - "language", - "option", - "php", - "type" + "async", + "asynchronous", + "concurrent", + "multi-processing", + "multi-threading" ], "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + "issues": "https://github.com/amphp/parallel/issues", + "source": "https://github.com/amphp/parallel/tree/v2.4.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" } ], - "time": "2025-08-21T11:53:16+00:00" + "time": "2026-05-16T16:54:01+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "amphp/parser", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=7.4" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Amp\\Parser\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1608,47 +1419,63 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Common interface for caching libraries", + "description": "A generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", "keywords": [ - "cache", - "psr", - "psr-6" + "async", + "non-blocking", + "parser", + "stream" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" }, - "time": "2021-02-03T23:26:27+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:16:53+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "amphp/pipeline", + "version": "v1.2.4", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/amphp/pipeline.git", + "reference": "a044733e080940d1483f56caff0c412ad6982776" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/a044733e080940d1483f56caff0c412ad6982776", + "reference": "a044733e080940d1483f56caff0c412ad6982776", "shasum": "" }, "require": { - "php": ">=7.4.0" + "amphp/amp": "^3", + "php": ">=8.1", + "revolt/event-loop": "^1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Amp\\Pipeline\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1657,51 +1484,70 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Asynchronous iterators and operators.", + "homepage": "https://amphp.org/pipeline", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "amp", + "amphp", + "async", + "io", + "iterator", + "non-blocking" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "issues": "https://github.com/amphp/pipeline/issues", + "source": "https://github.com/amphp/pipeline/tree/v1.2.4" }, - "time": "2021-11-05T16:47:00+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-05-06T05:37:57+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "amphp/process", + "version": "v2.1.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/amphp/process.git", + "reference": "583959df17d00304ad7b0b32285373f985935643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/amphp/process/zipball/583959df17d00304ad7b0b32285373f985935643", + "reference": "583959df17d00304ad7b0b32285373f985935643", "shasum": "" }, "require": { - "php": ">=7.2.0" + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, + "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Amp\\Process\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1710,49 +1556,63 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], + "description": "A fiber-aware process manager based on Amp and Revolt.", + "homepage": "https://amphp.org/process", "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/amphp/process/issues", + "source": "https://github.com/amphp/process/tree/v2.1.0" }, - "time": "2019-01-08T18:20:26+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-05-31T15:11:55+00:00" }, { - "name": "psr/http-factory", - "version": "1.1.0", + "name": "amphp/serialization", + "version": "v1.1.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + "url": "https://github.com/amphp/serialization.git", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "url": "https://api.github.com/repos/amphp/serialization/zipball/fdf2834d78cebb0205fb2672676c1b1eb84371f0", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0", "shasum": "" }, "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" + "php": ">=7.4" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "ext-json": "*", + "ext-zlib": "*", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, + "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Amp\\Serialization\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1761,52 +1621,75 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" + "async", + "asynchronous", + "serialization", + "serialize" ], "support": { - "source": "https://github.com/php-fig/http-factory" + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/v1.1.0" }, - "time": "2024-04-15T12:06:14+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-04-05T15:59:53+00:00" }, { - "name": "psr/http-message", - "version": "2.0", + "name": "amphp/socket", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + "url": "https://github.com/amphp/socket.git", + "reference": "dadb63c5d3179fd83803e29dfeac27350e619314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "url": "https://api.github.com/repos/amphp/socket/zipball/dadb63c5d3179fd83803e29dfeac27350e619314", + "reference": "dadb63c5d3179fd83803e29dfeac27350e619314", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/dns": "^2", + "ext-openssl": "*", + "kelunik/certificate": "^1.1", + "league/uri": "^7", + "league/uri-interfaces": "^7", + "php": ">=8.1", + "revolt/event-loop": "^1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "amphp/process": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, + "type": "library", "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" + "files": [ + "src/functions.php", + "src/Internal/functions.php", + "src/SocketAddress/functions.php" + ], + "psr-4": { + "Amp\\Socket\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1815,52 +1698,75 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", + "homepage": "https://github.com/amphp/socket", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "amp", + "async", + "encryption", + "non-blocking", + "sockets", + "tcp", + "tls" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" + "issues": "https://github.com/amphp/socket/issues", + "source": "https://github.com/amphp/socket/tree/v2.4.0" }, - "time": "2023-04-04T09:54:51+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-04-19T15:09:56+00:00" }, { - "name": "psr/http-server-handler", - "version": "1.0.2", + "name": "amphp/sync", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + "url": "https://github.com/amphp/sync.git", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", "shasum": "" }, "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0" + "amphp/amp": "^3", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23" }, + "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Psr\\Http\\Server\\": "src/" + "Amp\\Sync\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1869,55 +1775,68 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" } ], - "description": "Common interface for HTTP server-side request handler", + "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", + "homepage": "https://github.com/amphp/sync", "keywords": [ - "handler", - "http", - "http-interop", - "psr", - "psr-15", - "psr-7", - "request", - "response", - "server" + "async", + "asynchronous", + "mutex", + "semaphore", + "synchronization" ], "support": { - "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v2.3.0" }, - "time": "2023-04-10T20:06:20+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-08-03T19:31:26+00:00" }, { - "name": "psr/http-server-middleware", - "version": "1.0.2", + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", "shasum": "" }, "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0", - "psr/http-server-handler": "^1.0" + "php": "^8.1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Http\\Server\\": "src/" + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1926,53 +1845,84 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" } ], - "description": "Common interface for HTTP server-side middleware", + "description": "Types to use Carbon in Doctrine", "keywords": [ - "http", - "http-interop", - "middleware", - "psr", - "psr-15", - "psr-7", - "request", - "response" + "carbon", + "date", + "datetime", + "doctrine", + "time" ], "support": { - "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" }, - "time": "2023-04-11T06:14:47+00:00" + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" }, { - "name": "psr/log", - "version": "3.0.2", + "name": "cocur/slugify", + "version": "v4.7.1", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + "url": "https://github.com/cocur/slugify.git", + "reference": "a860dab2b9f5f37775fc6414d4f049434848165f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "url": "https://api.github.com/repos/cocur/slugify/zipball/a860dab2b9f5f37775fc6414d4f049434848165f", + "reference": "a860dab2b9f5f37775fc6414d4f049434848165f", "shasum": "" }, "require": { - "php": ">=8.0.0" + "ext-mbstring": "*", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } + "conflict": { + "symfony/config": "<3.4 || >=4,<4.3", + "symfony/dependency-injection": "<3.4 || >=4,<4.3", + "symfony/http-kernel": "<3.4 || >=4,<4.3", + "twig/twig": "<2.12.1" + }, + "require-dev": { + "laravel/framework": "^5.0|^6.0|^7.0|^8.0", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6.8", + "mockery/mockery": "^1.3", + "nette/di": "~2.4", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "symfony/config": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0", + "twig/twig": "^2.12.1 || ~3.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Cocur\\Slugify\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1981,48 +1931,47 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + }, + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Converts a string into a slug.", "keywords": [ - "log", - "psr", - "psr-3" + "slug", + "slugify" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "issues": "https://github.com/cocur/slugify/issues", + "source": "https://github.com/cocur/slugify/tree/v4.7.1" }, - "time": "2024-09-11T13:17:53+00:00" + "time": "2025-11-27T18:57:36+00:00" }, { - "name": "psr/simple-cache", - "version": "3.0.0", + "name": "codedungeon/php-cli-colors", + "version": "1.12.2", "source": { "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + "url": "https://github.com/mikeerickson/php-cli-colors.git", + "reference": "e346156f75717140a3dd622124d2ec686aa7ff8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "url": "https://api.github.com/repos/mikeerickson/php-cli-colors/zipball/e346156f75717140a3dd622124d2ec686aa7ff8e", + "reference": "e346156f75717140a3dd622124d2ec686aa7ff8e", "shasum": "" }, - "require": { - "php": ">=8.0.0" + "require-dev": { + "phpunit/phpunit": ">=5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\SimpleCache\\": "src/" + "Codedungeon\\PHPCliColors\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2031,71 +1980,67 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Mike Erickson", + "email": "codedungeon@gmail.com" } ], - "description": "Common interfaces for simple caching", + "description": "Liven up you PHP Console Apps with standard colors", + "homepage": "https://github.com/mikeerickson/php-cli-colors", "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" + "color", + "colors", + "composer", + "package", + "php" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + "issues": "https://github.com/mikeerickson/php-cli-colors/issues", + "source": "https://github.com/mikeerickson/php-cli-colors/tree/1.12.2" }, - "time": "2021-10-29T13:26:27+00:00" + "time": "2021-01-05T04:48:27+00:00" }, { - "name": "ramsey/collection", - "version": "2.1.1", + "name": "colinodell/json5", + "version": "v3.0.0", "source": { "type": "git", - "url": "https://github.com/ramsey/collection.git", - "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + "url": "https://github.com/colinodell/json5.git", + "reference": "5724d21bc5c910c2560af1b8915f0cc0163579c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", - "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "url": "https://api.github.com/repos/colinodell/json5/zipball/5724d21bc5c910c2560af1b8915f0cc0163579c8", + "reference": "5724d21bc5c910c2560af1b8915f0cc0163579c8", "shasum": "" }, "require": { - "php": "^8.1" + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0" }, "require-dev": { - "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.45", - "fakerphp/faker": "^1.24", - "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^2.1", - "mockery/mockery": "^1.6", - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.4", - "phpspec/prophecy-phpunit": "^2.3", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-mockery": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^10.5", - "ramsey/coding-standard": "^2.3", - "ramsey/conventional-commits": "^1.6", - "roave/security-advisories": "dev-latest" + "mikehaertl/php-shellcommand": "^1.7.0", + "phpstan/phpstan": "^1.10.57", + "scrutinizer/ocular": "^1.9", + "squizlabs/php_codesniffer": "^3.8.1", + "symfony/finder": "^6.0|^7.0", + "symfony/phpunit-bridge": "^7.0.3" }, + "bin": [ + "bin/json5" + ], "type": "library", "extra": { - "captainhook": { - "force-install": true - }, - "ramsey/conventional-commits": { - "configFile": "conventional-commits.json" + "branch-alias": { + "dev-main": "4.0-dev" } }, "autoload": { + "files": [ + "src/global.php" + ], "psr-4": { - "Ramsey\\Collection\\": "src/" + "ColinODell\\Json5\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2104,137 +2049,153 @@ ], "authors": [ { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Developer" } ], - "description": "A PHP library for representing and manipulating collections.", + "description": "UTF-8 compatible JSON5 parser for PHP", + "homepage": "https://github.com/colinodell/json5", "keywords": [ - "array", - "collection", - "hash", - "map", - "queue", - "set" + "JSON5", + "json", + "json5_decode", + "json_decode" ], "support": { - "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.1.1" + "issues": "https://github.com/colinodell/json5/issues", + "source": "https://github.com/colinodell/json5/tree/v3.0.0" }, - "time": "2025-03-22T05:38:12+00:00" + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + } + ], + "time": "2024-02-09T13:06:12+00:00" }, { - "name": "ramsey/uuid", - "version": "4.9.0", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0", - "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", - "php": "^8.0", - "ramsey/collection": "^1.2 || ^2.0" + "php": "^7.4 || ^8.0" }, - "replace": { - "rhumsaa/uuid": "self.version" + "conflict": { + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "captainhook/captainhook": "^5.25", - "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "ergebnis/composer-normalize": "^2.47", - "mockery/mockery": "^1.6", - "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.6", - "php-mock/php-mock-mockery": "^1.5", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpbench/phpbench": "^1.2.14", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-mockery": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^9.6", - "slevomat/coding-standard": "^8.18", - "squizlabs/php_codesniffer": "^3.13" - }, - "suggest": { - "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", - "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { - "captainhook": { - "force-install": true + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Ramsey\\Uuid\\": "src/" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "guid", - "identifier", - "uuid" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.9.0" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, - "time": "2025-06-25T14:20:11+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "spiral/attributes", - "version": "v3.1.8", + "name": "composer/semver", + "version": "3.4.4", "source": { "type": "git", - "url": "https://github.com/spiral/attributes.git", - "reference": "a7e368a42b079f56c16d7fc513b68190b96842c3" + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/attributes/zipball/a7e368a42b079f56c16d7fc513b68190b96842c3", - "reference": "a7e368a42b079f56c16d7fc513b68190b96842c3", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/cache": "1 - 3", - "psr/simple-cache": "1 - 3" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "doctrine/annotations": "^1.14 || ^2.0", - "jetbrains/phpstorm-attributes": "^1.0", - "phpunit/phpunit": "^9.5.20", - "spiral/code-style": "^2.2", - "vimeo/psalm": "^5.17" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { - "files": [ - "src/polyfill.php" - ], "psr-4": { - "Spiral\\Attributes\\": "src" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2243,77 +2204,73 @@ ], "authors": [ { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" - }, - { - "name": "Pavel Butchnev (butschster)", - "email": "pavel.buchnev@spiralscout.com" - }, - { - "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" }, { - "name": "Maksim Smakouz (msmakouz)", - "email": "maksim.smakouz@spiralscout.com" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" }, { - "name": "Kirill Nesmeyanov (SerafimArts)", - "email": "kirill.nesmeyanov@spiralscout.com" + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "PHP attributes reader", - "homepage": "https://spiral.dev", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "annotations", - "attributes", - "metadata" + "semantic", + "semver", + "validation", + "versioning" ], "support": { - "chat": "https://discord.gg/V6EK4he", - "docs": "https://spiral.dev/docs", - "issues": "https://github.com/spiral/attributes/issues", - "source": "https://github.com/spiral/attributes" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { - "url": "https://github.com/sponsors/spiral", + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", "type": "github" } ], - "time": "2024-12-09T15:33:18+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { - "name": "spiral/composer-publish-plugin", - "version": "v1.1.2", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/spiral/composer-publish-plugin.git", - "reference": "8d25c228389fcc0d4315a83913b8a5eb26c4e45b" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/composer-publish-plugin/zipball/8d25c228389fcc0d4315a83913b8a5eb26c4e45b", - "reference": "8d25c228389fcc0d4315a83913b8a5eb26c4e45b", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1|^2.0", - "php": ">=7.1" + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "composer/composer": "^1.7", - "phpunit/phpunit": "~7.0", - "spiral/code-style": "^1.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Spiral\\Composer\\PublishPlugin" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, + "type": "library", "autoload": { "psr-4": { - "Spiral\\Composer\\": "src/" + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2322,204 +2279,71 @@ ], "authors": [ { - "name": "Wolfy-J", - "email": "wolfy.jd@gmail.com" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], "support": { - "issues": "https://github.com/spiral/composer-publish-plugin/issues", - "source": "https://github.com/spiral/composer-publish-plugin/tree/v1.1.2" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, - "time": "2020-11-12T23:10:18+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "spiral/framework", - "version": "3.15.8", + "name": "cycle/annotated", + "version": "v4.6.0", "source": { "type": "git", - "url": "https://github.com/spiral/framework.git", - "reference": "a3107e0f848e66974363684e260b3fedc10a17c4" + "url": "https://github.com/cycle/annotated.git", + "reference": "e04328c7e532ba109c3a3cfd21856f63bacf3453" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/framework/zipball/a3107e0f848e66974363684e260b3fedc10a17c4", - "reference": "a3107e0f848e66974363684e260b3fedc10a17c4", + "url": "https://api.github.com/repos/cycle/annotated/zipball/e04328c7e532ba109c3a3cfd21856f63bacf3453", + "reference": "e04328c7e532ba109c3a3cfd21856f63bacf3453", "shasum": "" }, "require": { - "cocur/slugify": "^3.2 || ^4.0", - "codedungeon/php-cli-colors": "^1.11", - "defuse/php-encryption": "^2.2", - "doctrine/inflector": "^1.4|^2.0", - "ext-json": "*", - "ext-mbstring": "*", - "ext-tokenizer": "*", - "league/flysystem": "^2.3.1 || ^3.0", - "monolog/monolog": "^2.9.2 || ^3.5", - "myclabs/deep-copy": "^1.9", - "nette/php-generator": "^4.1.7", - "nikic/php-parser": "^5.4", + "cycle/database": "^2.20", + "cycle/orm": "^2.18", + "cycle/schema-builder": "^2.12", + "doctrine/inflector": "^2.1", "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "psr/event-dispatcher": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-factory-implementation": "^1.0", - "psr/http-message": "^1.0|^2.0", - "psr/http-server-middleware": "^1.0", - "psr/log": "1 - 3", - "psr/simple-cache": "2 - 3", - "ramsey/uuid": "^4.7", - "spiral/attributes": "^3.1.8", - "spiral/composer-publish-plugin": "^1.0", - "symfony/console": "^6.4.17 || ^7.2", - "symfony/finder": "^5.4.45 || ^6.4.17 || ^7.2", - "symfony/mailer": "^5.4.45 || ^6.4.17 || ^7.2", - "symfony/translation": "^5.4.45 || ^6.4.17 || ^7.2", - "vlucas/phpdotenv": "^5.4" - }, - "conflict": { - "spiral/roadrunner-bridge": "<3.7", - "spiral/sapi-bridge": "<1.1" - }, - "replace": { - "spiral/annotated-routes": "self.version", - "spiral/auth": "self.version", - "spiral/auth-http": "self.version", - "spiral/boot": "self.version", - "spiral/broadcasting": "self.version", - "spiral/cache": "self.version", - "spiral/config": "self.version", - "spiral/console": "self.version", - "spiral/cookies": "self.version", - "spiral/core": "self.version", - "spiral/csrf": "self.version", - "spiral/debug": "self.version", - "spiral/distribution": "self.version", - "spiral/dotenv-bridge": "self.version", - "spiral/encrypter": "self.version", - "spiral/events": "self.version", - "spiral/exceptions": "self.version", - "spiral/files": "self.version", - "spiral/filters": "self.version", - "spiral/hmvc": "self.version", - "spiral/http": "self.version", - "spiral/interceptors": "self.version", - "spiral/logger": "self.version", - "spiral/mailer": "self.version", - "spiral/models": "self.version", - "spiral/monolog-bridge": "self.version", - "spiral/pagination": "self.version", - "spiral/prototype": "self.version", - "spiral/queue": "self.version", - "spiral/reactor": "self.version", - "spiral/router": "self.version", - "spiral/scaffolder": "self.version", - "spiral/security": "self.version", - "spiral/sendit": "self.version", - "spiral/serializer": "self.version", - "spiral/session": "self.version", - "spiral/snapshots": "self.version", - "spiral/stempler": "self.version", - "spiral/stempler-bridge": "self.version", - "spiral/storage": "self.version", - "spiral/streams": "self.version", - "spiral/telemetry": "self.version", - "spiral/tokenizer": "self.version", - "spiral/translator": "self.version", - "spiral/validation": "self.version", - "spiral/views": "self.version" + "spiral/attributes": "^2.8 || ^3.1", + "spiral/tokenizer": "^2.8 || ^3.17" }, "require-dev": { - "aws/aws-sdk-php": "^3.338", - "buggregator/trap": "^1.13.3", - "doctrine/annotations": "^2.0.2", - "google/protobuf": "^3.25|^4.29", - "guzzlehttp/psr7": "^1.7|^2.7", - "jetbrains/phpstorm-attributes": "^1.2", - "league/flysystem-async-aws-s3": "^2.5 || ^3.29", - "league/flysystem-aws-s3-v3": "^2.5 || ^3.29", - "mikey179/vfsstream": "^1.6.12", - "mockery/mockery": "^1.6.12", - "phpunit/phpunit": "^10.5.41", - "ramsey/collection": "^1.3", - "rector/rector": "~2.0.9", - "spiral/code-style": "^2.2.2", - "spiral/nyholm-bridge": "^1.3", - "spiral/testing": "^2.8.3", - "spiral/validator": "^1.5.4", - "symplify/monorepo-builder": "^10.3.3", - "vimeo/psalm": "^6.0" + "buggregator/trap": "^1.15", + "doctrine/annotations": "^1.14 || ^2.0", + "phpunit/phpunit": "^10.5", + "spiral/code-style": "^2.3", + "spiral/dumper": "^3.3", + "vimeo/psalm": "^5.26 || ^6.16" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.15.x-dev" - } - }, "autoload": { - "files": [ - "src/Boot/src/helpers.php", - "src/Framework/helpers.php", - "src/Scaffolder/src/helpers.php", - "src/Stempler/src/helpers.php", - "src/Translator/src/helpers.php" - ], "psr-4": { - "Spiral\\": "src/Framework", - "Spiral\\Auth\\": [ - "src/Auth/src", - "src/AuthHttp/src" - ], - "Spiral\\Boot\\": "src/Boot/src", - "Spiral\\Core\\": [ - "src/Core/src", - "src/Hmvc/src" - ], - "Spiral\\Csrf\\": "src/Csrf/src", - "Spiral\\Http\\": "src/Http/src", - "Spiral\\Cache\\": "src/Cache/src", - "Spiral\\Debug\\": "src/Debug/src", - "Spiral\\Files\\": "src/Files/src", - "Spiral\\Queue\\": "src/Queue/src", - "Spiral\\Views\\": "src/Views/src", - "Spiral\\Config\\": "src/Config/src", - "Spiral\\DotEnv\\": "src/Bridge/Dotenv/src", - "Spiral\\Events\\": "src/Events/src", - "Spiral\\Logger\\": "src/Logger/src", - "Spiral\\Mailer\\": "src/Mailer/src", - "Spiral\\Models\\": "src/Models/src", - "Spiral\\Router\\": [ - "src/AnnotatedRoutes/src", - "src/Router/src" - ], - "Spiral\\SendIt\\": "src/SendIt/src", - "Spiral\\Console\\": "src/Console/src", - "Spiral\\Cookies\\": "src/Cookies/src", - "Spiral\\Filters\\": "src/Filters/src", - "Spiral\\Monolog\\": "src/Bridge/Monolog/src", - "Spiral\\Reactor\\": "src/Reactor/src", - "Spiral\\Session\\": "src/Session/src", - "Spiral\\Storage\\": "src/Storage/src", - "Spiral\\Streams\\": "src/Streams/src", - "Spiral\\Security\\": "src/Security/src", - "Spiral\\Stempler\\": [ - "src/Bridge/Stempler/src", - "src/Stempler/src" - ], - "Spiral\\Encrypter\\": "src/Encrypter/src", - "Spiral\\Prototype\\": "src/Prototype/src", - "Spiral\\Snapshots\\": "src/Snapshots/src", - "Spiral\\Telemetry\\": "src/Telemetry/src", - "Spiral\\Tokenizer\\": "src/Tokenizer/src", - "Spiral\\Exceptions\\": "src/Exceptions/src", - "Spiral\\Pagination\\": "src/Pagination/src", - "Spiral\\Scaffolder\\": "src/Scaffolder/src", - "Spiral\\Serializer\\": "src/Serializer/src", - "Spiral\\Translator\\": "src/Translator/src", - "Spiral\\Validation\\": "src/Validation/src", - "Spiral\\Broadcasting\\": "src/Broadcasting/src", - "Spiral\\Distribution\\": "src/Distribution/src", - "Spiral\\Interceptors\\": "src/Interceptors/src" + "Cycle\\Annotated\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2532,84 +2356,70 @@ "email": "wolfy-j@spiralscout.com" }, { - "name": "Pavel Butchnev (butschster)", - "email": "pavel.buchnev@spiralscout.com" + "name": "Aleksei Gagarin", + "homepage": "https://github.com/roxblnfk" }, { - "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" + "name": "Pavel Butchnev", + "homepage": "https://github.com/butschster" }, { "name": "Maksim Smakouz (msmakouz)", "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Spiral, High-Performance PHP/Go Framework", - "homepage": "https://spiral.dev", + "description": "Cycle ORM Annotated Entities generator", + "homepage": "https://cycle-orm.dev", "support": { - "issues": "https://github.com/spiral/framework/issues", - "source": "https://github.com/spiral/framework" + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/annotated/issues", + "source": "https://github.com/cycle/annotated" }, "funding": [ { - "url": "https://github.com/sponsors/spiral", + "url": "https://github.com/sponsors/cycle", "type": "github" } ], - "time": "2025-04-22T13:51:37+00:00" + "time": "2026-06-15T20:56:29+00:00" }, { - "name": "symfony/console", - "version": "v6.4.25", + "name": "cycle/entity-behavior", + "version": "1.7.1", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae" + "url": "https://github.com/cycle/entity-behavior.git", + "reference": "afe1fe2d1f01bbc6856a21c5a1bc7f37096fd227" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/273fd29ff30ba0a88ca5fb83f7cf1ab69306adae", - "reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae", + "url": "https://api.github.com/repos/cycle/entity-behavior/zipball/afe1fe2d1f01bbc6856a21c5a1bc7f37096fd227", + "reference": "afe1fe2d1f01bbc6856a21c5a1bc7f37096fd227", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" + "cycle/database": "^2.14", + "cycle/orm": "^2.10", + "cycle/schema-builder": "^2.8", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1", + "yiisoft/injector": "^1.0" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "cycle/annotated": "^3.0", + "phpunit/phpunit": "^9.5", + "ramsey/uuid": "^4.5", + "spiral/code-style": "^2.2", + "spiral/tokenizer": "^2.8 || ^3.0", + "vimeo/psalm": "^5.11 || ^6.8" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Cycle\\ORM\\Entity\\Behavior\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2617,156 +2427,116 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], + "description": "Provides a collection of attributes that add behaviors to Cycle ORM entities", + "homepage": "https://cycle-orm.dev", "support": { - "source": "https://github.com/symfony/console/tree/v6.4.25" + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/entity-behavior/issues", + "source": "https://github.com/cycle/entity-behavior" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sponsors/cycle", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-08-22T10:21:53+00:00" + "time": "2025-11-24T07:12:50+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "name": "cycle/migrations", + "version": "v4.2.6", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "url": "https://github.com/cycle/migrations.git", + "reference": "c1712b6703441a381f707dd710cc3880c004b92c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/cycle/migrations/zipball/c1712b6703441a381f707dd710cc3880c004b92c", + "reference": "c1712b6703441a381f707dd710cc3880c004b92c", "shasum": "" }, "require": { - "php": ">=8.1" + "cycle/database": "^2.7.0", + "php": ">=8.1", + "spiral/core": "^3.0", + "spiral/files": "^3.0", + "spiral/reactor": "^3.0", + "spiral/tokenizer": "^3.0" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } + "require-dev": { + "buggregator/trap": "^1.11", + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5", + "spiral/code-style": "^2.2.0", + "vimeo/psalm": "^6.4" }, + "type": "library", "autoload": { - "files": [ - "function.php" - ] + "psr-4": { + "Cycle\\Migrations\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "Database migrations, migration scaffolding", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "issues": "https://github.com/cycle/migrations/issues", + "source": "https://github.com/cycle/migrations/tree/v4.2.6" }, - "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": "2025-07-13T07:22:37+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v6.4.25", + "name": "cycle/schema-builder", + "version": "v2.12.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b0cf3162020603587363f0551cd3be43958611ff" + "url": "https://github.com/cycle/schema-builder.git", + "reference": "cde7e2a3e6fa6818f5381f4ff83cc611325deb17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b0cf3162020603587363f0551cd3be43958611ff", - "reference": "b0cf3162020603587363f0551cd3be43958611ff", + "url": "https://api.github.com/repos/cycle/schema-builder/zipball/cde7e2a3e6fa6818f5381f4ff83cc611325deb17", + "reference": "cde7e2a3e6fa6818f5381f4ff83cc611325deb17", "shasum": "" }, "require": { + "cycle/database": "^2.20", + "cycle/orm": "^2.18", "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "yiisoft/friendly-exception": "^1.1" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "phpunit/phpunit": "^9.5", + "spiral/code-style": "^2.2", + "spiral/tokenizer": "^2.8", + "symfony/console": "^6.0 || ^7.0", + "vimeo/psalm": "^5.12 || ^6.12" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Cycle\\Schema\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2774,555 +2544,340 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Aleksei Gagarin", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Pavel Butchnev", + "homepage": "https://github.com/butschster" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", + "description": "Cycle ORM Schema Builder", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.25" + "issues": "https://github.com/cycle/schema-builder/issues", + "source": "https://github.com/cycle/schema-builder/tree/v2.12.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sponsors/cycle", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-08-13T09:41:44+00:00" + "time": "2026-06-15T17:35:53+00:00" }, { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "name": "cycle/schema-migrations-generator", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "url": "https://github.com/cycle/schema-migrations-generator.git", + "reference": "766c68dc1c89aa20128a4cecf1995f101c05e5f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/cycle/schema-migrations-generator/zipball/766c68dc1c89aa20128a4cecf1995f101c05e5f0", + "reference": "766c68dc1c89aa20128a4cecf1995f101c05e5f0", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" + "cycle/database": "^2.11.3", + "cycle/migrations": "^4.2.4", + "cycle/schema-builder": "^2.11.1", + "php": ">=8.1" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } + "require-dev": { + "cycle/annotated": "^3.5", + "cycle/orm": "^2.9.1", + "phpunit/phpunit": "^9.6.22", + "spiral/code-style": "^2.2.0", + "spiral/dumper": "^3.3.1", + "spiral/framework": "^3.14.8", + "vimeo/psalm": "^5.26.1" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" + "Cycle\\Schema\\Generator\\Migrations\\": "src/" } }, "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": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "Cycle ORM Migration generation", "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/schema-migrations-generator/issues", + "source": "https://github.com/cycle/schema-migrations-generator" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sponsors/cycle", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-12-23T11:27:31+00:00" }, { - "name": "symfony/finder", - "version": "v6.4.24", + "name": "cycle/schema-renderer", + "version": "1.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "73089124388c8510efb8d2d1689285d285937b08" + "url": "https://github.com/cycle/schema-renderer.git", + "reference": "1a471320ce4987a9722b5e39c64d3b4dc741cf1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/73089124388c8510efb8d2d1689285d285937b08", - "reference": "73089124388c8510efb8d2d1689285d285937b08", + "url": "https://api.github.com/repos/cycle/schema-renderer/zipball/1a471320ce4987a9722b5e39c64d3b4dc741cf1b", + "reference": "1a471320ce4987a9722b5e39c64d3b4dc741cf1b", "shasum": "" }, "require": { - "php": ">=8.1" + "cycle/orm": "^2.0", + "php": ">=8.1", + "symfony/polyfill-php83": "^1.31.0" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "phpunit/phpunit": "^10.5", + "spiral/code-style": "^2.2.2", + "spiral/dumper": "^3.3", + "vimeo/psalm": "^5.26.1 || ^6.8.9" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Cycle\\Schema\\Renderer\\": "src/" + } }, "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": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", + "description": "Utils for Cycle ORM Schema rendering", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.24" + "issues": "https://github.com/cycle/schema-renderer/issues", + "source": "https://github.com/cycle/schema-renderer/tree/1.4.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": "2025-07-15T12:02:45+00:00" + "time": "2025-11-04T05:47:31+00:00" }, { - "name": "symfony/mailer", - "version": "v6.4.25", + "name": "danog/advanced-json-rpc", + "version": "v3.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "628b43b45a3e6b15c8a633fb22df547ed9b492a2" + "url": "https://github.com/danog/php-advanced-json-rpc.git", + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/628b43b45a3e6b15c8a633fb22df547ed9b492a2", - "reference": "628b43b45a3e6b15c8a633fb22df547ed9b492a2", + "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/ae703ea7b4811797a10590b6078de05b3b33dd91", + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3|^4", + "netresearch/jsonmapper": "^5", "php": ">=8.1", - "psr/event-dispatcher": "^1", - "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", - "symfony/service-contracts": "^2.5|^3" + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0 || ^6" }, - "conflict": { - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", - "symfony/twig-bridge": "<6.2.1" + "replace": { + "felixfbecker/php-advanced-json-rpc": "^3" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.2|^7.0", - "symfony/twig-bridge": "^6.2|^7.0" + "phpunit/phpunit": "^9" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mailer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "AdvancedJsonRpc\\": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "ISC" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Felix Becker", + "email": "felix.b@outlook.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Daniil Gentili", + "email": "daniil@daniil.it" } ], - "description": "Helps sending emails", - "homepage": "https://symfony.com", + "description": "A more advanced JSONRPC implementation", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.25" + "issues": "https://github.com/danog/php-advanced-json-rpc/issues", + "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.3" }, - "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": "2025-08-13T09:41:44+00:00" + "time": "2026-01-12T21:07:10+00:00" }, { - "name": "symfony/mime", - "version": "v6.4.24", + "name": "daverandom/libdns", + "version": "v2.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "664d5e844a2de5e11c8255d0aef6bc15a9660ac7" + "url": "https://github.com/DaveRandom/LibDNS.git", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/664d5e844a2de5e11c8255d0aef6bc15a9660ac7", - "reference": "664d5e844a2de5e11c8255d0aef6bc15a9660ac7", + "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" - }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", - "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + "ext-ctype": "*", + "php": ">=7.1" }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1|^4", - "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3" + "suggest": { + "ext-intl": "Required for IDN support" }, "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "LibDNS\\": "src/" + } }, "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 manipulating MIME messages", - "homepage": "https://symfony.com", + "description": "DNS protocol implementation written in pure PHP", "keywords": [ - "mime", - "mime-type" + "dns" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.24" + "issues": "https://github.com/DaveRandom/LibDNS/issues", + "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.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": "2025-07-15T12:02:45+00:00" + "time": "2024-04-12T12:12:48+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=5.3.2" }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "XdgBaseDir\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], + "description": "implementation of xdg base directory specification for php", "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" }, - "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" + "time": "2019-12-04T15:06:13+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "name": "doctrine/deprecations", + "version": "1.1.6", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { - "php": ">=7.2" + "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": { - "ext-intl": "For best performance" + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Doctrine\\Deprecations\\": "src" } }, "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" - ], + "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": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "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": "2025-06-27T09:58:17+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "name": "doctrine/inflector", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { - "php": ">=7.2", - "symfony/polyfill-intl-normalizer": "^1.10" + "php": "^7.2 || ^8.0" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3331,173 +2886,148 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-master": "1.x-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "LanguageServerProtocol\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "ISC" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Felix Becker", + "email": "felix.b@outlook.com" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", + "description": "PHP classes for the Language Server Protocol", "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" + "language", + "microsoft", + "php", + "server" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "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" + "time": "2024-04-30T00:40:11+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "name": "fidry/cpu-core-counter", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { - "ext-iconv": "*", - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" + "php": "^7.2 || ^8.0" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "Fidry\\CpuCoreCounter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3506,80 +3036,68 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Thรฉo FIDRY", + "email": "theo.fidry@gmail.com" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "Tiny utility to get the number of CPU cores.", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "CPU", + "core" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/theofidry", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2025-08-14T07:29:31+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "name": "illuminate/collections", + "version": "v12.62.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "url": "https://github.com/illuminate/collections.git", + "reference": "83313b009c4afb6f02dbc090bdb67809756eefa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/illuminate/collections/zipball/83313b009c4afb6f02dbc090bdb67809756eefa2", + "reference": "83313b009c4afb6f02dbc090bdb67809756eefa2", "shasum": "" }, "require": { - "php": ">=7.2" + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33" + }, + "suggest": { + "illuminate/http": "Required to convert collections to API resources (^12.0).", + "symfony/var-dumper": "Required to use the dump method (^7.2)." }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-master": "12.x-dev" } }, "autoload": { "files": [ - "bootstrap.php" + "functions.php", + "helpers.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3587,83 +3105,45 @@ ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "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": "2025-01-02T08:10:11+00:00" + "time": "2026-03-11T14:13:25+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "name": "illuminate/conditionable", + "version": "v12.62.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/illuminate/conditionable.git", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/ec677967c1f2faf90b8428919124d2184a4c9b49", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49", "shasum": "" }, "require": { - "php": ">=7.2" + "php": "^8.2" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-master": "12.x-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3671,84 +3151,47 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "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": "2025-07-08T02:45:35+00:00" + "time": "2025-05-13T15:08:45+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.6.0", + "name": "illuminate/contracts", + "version": "v12.62.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "url": "https://github.com/illuminate/contracts.git", + "reference": "c16fd7ba7d8e6b8f336639ceb6b7e1ff6ed0efb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/c16fd7ba7d8e6b8f336639ceb6b7e1ff6ed0efb5", + "reference": "c16fd7ba7d8e6b8f336639ceb6b7e1ff6ed0efb5", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-master": "12.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "Illuminate\\Contracts\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3756,85 +3199,45 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "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": "2025-04-25T09:37:31+00:00" + "time": "2026-06-09T13:20:54+00:00" }, { - "name": "symfony/string", - "version": "v6.4.25", + "name": "illuminate/macroable", + "version": "v12.62.0", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1" + "url": "https://github.com/illuminate/macroable.git", + "reference": "e295d62d89dcdb87e2b1bd70dd14d074a0ed73cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1", - "reference": "7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e295d62d89dcdb87e2b1bd70dd14d074a0ed73cc", + "reference": "e295d62d89dcdb87e2b1bd70dd14d074a0ed73cc", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" - }, - "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "php": "^8.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3842,106 +3245,50 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "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" - ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", "support": { - "source": "https://github.com/symfony/string/tree/v6.4.25" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "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": "2025-08-22T12:33:20+00:00" + "time": "2026-03-30T19:05:19+00:00" }, { - "name": "symfony/translation", - "version": "v6.4.24", + "name": "illuminate/reflection", + "version": "v12.62.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1" + "url": "https://github.com/illuminate/reflection.git", + "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/300b72643e89de0734d99a9e3f8494a3ef6936e1", - "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1", + "url": "https://api.github.com/repos/illuminate/reflection/zipball/348cf5da9de89b596d7723be6425fb048e2bf4bb", + "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, - "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "php": "^8.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, "autoload": { "files": [ - "Resources/functions.php" + "helpers.php" ], "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3949,73 +3296,79 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", + "description": "The Illuminate Reflection package.", + "homepage": "https://laravel.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.24" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "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": "2025-07-30T17:30:48+00:00" + "time": "2026-02-25T15:25:18+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.6.0", + "name": "illuminate/support", + "version": "v12.62.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + "url": "https://github.com/illuminate/support.git", + "reference": "3a8772095ef7d6b1961a77f2f0b8921c056c48ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "url": "https://api.github.com/repos/illuminate/support/zipball/3a8772095ef7d6b1961a77f2f0b8921c056c48ea", + "reference": "3a8772095ef7d6b1961a77f2f0b8921c056c48ea", "shasum": "" }, "require": { - "php": ">=8.1" + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^12.0", + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/reflection": "^12.0", + "nesbot/carbon": "^3.8.4", + "php": "^8.2", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php85": "^1.33", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "suggest": { + "illuminate/filesystem": "Required to use the Composer class (^12.0).", + "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", + "league/uri": "Required to use the Uri class (^7.5.1).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the Composer class (^7.2).", + "symfony/uid": "Required to use Str::ulid() (^7.2).", + "symfony/var-dumper": "Required to use the dd function (^7.2).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-master": "12.x-dev" } }, "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "Illuminate\\Support\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4023,87 +3376,44 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "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-27T08:32:26+00:00" + "time": "2026-05-31T22:10:17+00:00" }, { - "name": "vlucas/phpdotenv", - "version": "v5.6.2", + "name": "infection/abstract-testframework-adapter", + "version": "0.5.0", "source": { "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + "url": "https://github.com/infection/abstract-testframework-adapter.git", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", - "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", "shasum": "" }, "require": { - "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.3", - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3", - "symfony/polyfill-ctype": "^1.24", - "symfony/polyfill-mbstring": "^1.24", - "symfony/polyfill-php80": "^1.24" + "php": "^7.4 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-filter": "*", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator." + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^2.17", + "phpunit/phpunit": "^9.5" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, - "branch-alias": { - "dev-master": "5.6-dev" - } - }, "autoload": { "psr-4": { - "Dotenv\\": "src/" + "Infection\\AbstractTestFramework\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4112,530 +3422,499 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" } ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], + "description": "Abstract Test Framework Adapter for Infection", "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + "issues": "https://github.com/infection/abstract-testframework-adapter/issues", + "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/infection", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" + "url": "https://opencollective.com/infection", + "type": "open_collective" } ], - "time": "2025-04-30T23:37:27+00:00" + "time": "2021-08-17T18:49:12+00:00" }, { - "name": "yiisoft/injector", - "version": "1.2.0", + "name": "infection/extension-installer", + "version": "0.1.2", "source": { "type": "git", - "url": "https://github.com/yiisoft/injector.git", - "reference": "0dc0127a7542341bdaabda7b85204e992938b83e" + "url": "https://github.com/infection/extension-installer.git", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/yiisoft/injector/zipball/0dc0127a7542341bdaabda7b85204e992938b83e", - "reference": "0dc0127a7542341bdaabda7b85204e992938b83e", + "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", "shasum": "" }, "require": { - "php": "^7.4|^8.0" + "composer-plugin-api": "^1.1 || ^2.0" }, "require-dev": { - "maglnet/composer-require-checker": "^3.8|^4.2", - "phpbench/phpbench": "^1.1", - "phpunit/phpunit": "^9.5", - "psr/container": "^1.0|^2.0", - "rector/rector": "^0.18.12", - "roave/infection-static-analysis-plugin": "^1.16", - "spatie/phpunit-watcher": "^1.23", - "vimeo/psalm": "^4.30|^5.7", - "yiisoft/test-support": "^1.2" - }, - "suggest": { - "psr/container": "For automatic resolving of dependencies" - }, - "type": "library", + "composer/composer": "^1.9 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.18, <2.19", + "infection/infection": "^0.15.2", + "php-coveralls/php-coveralls": "^2.4", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.10", + "phpstan/phpstan-phpunit": "^0.12.6", + "phpstan/phpstan-strict-rules": "^0.12.2", + "phpstan/phpstan-webmozart-assert": "^0.12.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.8" + }, + "type": "composer-plugin", + "extra": { + "class": "Infection\\ExtensionInstaller\\Plugin" + }, "autoload": { "psr-4": { - "Yiisoft\\Injector\\": "src" + "Infection\\ExtensionInstaller\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "description": "PSR-11 compatible injector. Executes a callable and makes an instances by injecting dependencies from a given DI container.", - "homepage": "https://www.yiiframework.com/", - "keywords": [ - "PSR-11", - "dependency injection", - "di", - "injector", - "reflection" + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } ], + "description": "Infection Extension Installer", "support": { - "chat": "https://t.me/yii3en", - "forum": "https://www.yiiframework.com/forum/", - "irc": "irc://irc.freenode.net/yii", - "issues": "https://github.com/yiisoft/injector/issues?state=open", - "source": "https://github.com/yiisoft/injector", - "wiki": "https://www.yiiframework.com/wiki/" + "issues": "https://github.com/infection/extension-installer/issues", + "source": "https://github.com/infection/extension-installer/tree/0.1.2" }, "funding": [ { - "url": "https://github.com/yiisoft", + "url": "https://github.com/infection", "type": "github" }, { - "url": "https://opencollective.com/yiisoft", + "url": "https://opencollective.com/infection", "type": "open_collective" } ], - "time": "2023-12-20T09:39:03+00:00" - } - ], - "packages-dev": [ + "time": "2021-10-20T22:08:34+00:00" + }, { - "name": "amphp/amp", - "version": "v3.1.1", + "name": "infection/include-interceptor", + "version": "0.2.5", "source": { "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" + "url": "https://github.com/infection/include-interceptor.git", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", "shasum": "" }, - "require": { - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23.1" + "friendsofphp/php-cs-fixer": "^2.16", + "infection/infection": "^0.15.0", + "phan/phan": "^2.4 || ^3", + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "^0.12.8", + "phpunit/phpunit": "^8.5", + "vimeo/psalm": "^3.8" }, "type": "library", "autoload": { - "files": [ - "src/functions.php", - "src/Future/functions.php", - "src/Internal/functions.php" - ], "psr-4": { - "Amp\\": "src" + "Infection\\StreamWrapper\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" } ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], + "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", "support": { - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.1" + "issues": "https://github.com/infection/include-interceptor/issues", + "source": "https://github.com/infection/include-interceptor/tree/0.2.5" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://github.com/infection", "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" } ], - "time": "2025-08-27T21:42:00+00:00" + "time": "2021-08-09T10:03:57+00:00" }, { - "name": "amphp/byte-stream", - "version": "v2.1.2", + "name": "infection/infection", + "version": "0.32.6", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" + "url": "https://github.com/infection/infection.git", + "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "url": "https://api.github.com/repos/infection/infection/zipball/4ed769947eaf2ecf42203027301bad2bedf037e5", + "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/parser": "^1.1", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2.3" + "colinodell/json5": "^3.0", + "composer-runtime-api": "^2.0", + "composer/xdebug-handler": "^3.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "fidry/cpu-core-counter": "^1.0", + "infection/abstract-testframework-adapter": "^0.5.0", + "infection/extension-installer": "^0.1.0", + "infection/include-interceptor": "^0.2.5", + "infection/mutator": "^0.4", + "justinrainbow/json-schema": "^6.0", + "nikic/php-parser": "^5.6.2", + "ondram/ci-detector": "^4.1.0", + "php": "^8.2", + "psr/log": "^2.0 || ^3.0", + "sanmai/di-container": "^0.1.12", + "sanmai/duoclock": "^0.1.0", + "sanmai/later": "^0.1.7", + "sanmai/pipeline": "^7.2", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/console": "^6.4 || ^7.0 || ^8.0", + "symfony/filesystem": "^6.4 || ^7.0 || ^8.0", + "symfony/finder": "^6.4 || ^7.0 || ^8.0", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^6.4 || ^7.0 || ^8.0", + "thecodingmachine/safe": "^v3.0", + "webmozart/assert": "^1.11 || ^2.0" + }, + "conflict": { + "antecedent/patchwork": "<2.1.25", + "dg/bypass-finals": "<1.4.1" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.22.1" + "ext-simplexml": "*", + "fidry/makefile": "^1.0", + "fig/log-test": "^1.2", + "phpbench/phpbench": "^1.4", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", + "phpunit/phpunit": "^11.5.27", + "rector/rector": "^2.2.4", + "shipmonk/dead-code-detector": "^0.14.0", + "shipmonk/name-collision-detector": "^2.1", + "sidz/phpstan-rules": "^0.5.1", + "symfony/yaml": "^6.4 || ^7.0 || ^8.0", + "thecodingmachine/phpstan-safe-rule": "^1.4", + "webmozarts/strict-phpunit": "^7.15" }, + "bin": [ + "bin/infection" + ], "type": "library", "autoload": { - "files": [ - "src/functions.php", - "src/Internal/functions.php" - ], "psr-4": { - "Amp\\ByteStream\\": "src" + "Infection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com", + "homepage": "https://twitter.com/maks_rafalko" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Oleg Zhulnev", + "homepage": "https://github.com/sidz" + }, + { + "name": "Gert de Pagter", + "homepage": "https://github.com/BackEndTea" + }, + { + "name": "Thรฉo FIDRY", + "email": "theo.fidry@gmail.com", + "homepage": "https://twitter.com/tfidry" + }, + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com", + "homepage": "https://www.alexeykopytko.com" + }, + { + "name": "Andreas Mรถller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" } ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "https://amphp.org/byte-stream", + "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" + "coverage", + "mutant", + "mutation framework", + "mutation testing", + "testing", + "unit testing" ], "support": { - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" + "issues": "https://github.com/infection/infection/issues", + "source": "https://github.com/infection/infection/tree/0.32.6" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://github.com/infection", "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" } ], - "time": "2025-03-16T17:10:27+00:00" + "time": "2026-02-26T14:34:26+00:00" }, { - "name": "amphp/cache", - "version": "v2.0.1", + "name": "infection/mutator", + "version": "0.4.1", "source": { "type": "git", - "url": "https://github.com/amphp/cache.git", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" + "url": "https://github.com/infection/mutator.git", + "reference": "3c976d721b02b32f851ee4e15d553ef1e9186d1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", + "url": "https://api.github.com/repos/infection/mutator/zipball/3c976d721b02b32f851ee4e15d553ef1e9186d1d", + "reference": "3c976d721b02b32f851ee4e15d553ef1e9186d1d", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/serialization": "^1", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "nikic/php-parser": "^5.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "phpunit/phpunit": "^9.6 || ^10" }, "type": "library", "autoload": { "psr-4": { - "Amp\\Cache\\": "src" + "Infection\\Mutator\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" } ], - "description": "A fiber-aware cache API based on Amp and Revolt.", - "homepage": "https://amphp.org/cache", + "description": "Mutator interface to implement custom mutators (mutation operators) for Infection", "support": { - "issues": "https://github.com/amphp/cache/issues", - "source": "https://github.com/amphp/cache/tree/v2.0.1" + "issues": "https://github.com/infection/mutator/issues", + "source": "https://github.com/infection/mutator/tree/0.4.1" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://github.com/infection", "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" } ], - "time": "2024-04-19T03:38:06+00:00" + "time": "2025-04-29T08:19:52+00:00" }, { - "name": "amphp/dns", - "version": "v2.4.0", + "name": "internal/destroy", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/amphp/dns.git", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" + "url": "https://github.com/php-internal/destroy.git", + "reference": "93068c4f7da218034f5373e31407f564b74b4a06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "url": "https://api.github.com/repos/php-internal/destroy/zipball/93068c4f7da218034f5373e31407f564b74b4a06", + "reference": "93068c4f7da218034f5373e31407f564b74b4a06", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/process": "^2", - "daverandom/libdns": "^2.0.2", - "ext-filter": "*", - "ext-json": "*", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "php": ">=8.1" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.20" + "buggregator/trap": "^1.10", + "phpunit/phpunit": "^10.5", + "spiral/code-style": "^2.2.2", + "ta-tikoma/phpunit-architecture-test": "^0.8.4", + "vimeo/psalm": "^6.10" + }, + "suggest": { + "ext-simplexml": "to support XML configs parsing" }, "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Dns\\": "src" + "Internal\\Destroy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Chris Wright", - "email": "addr@daverandom.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Async DNS resolution for Amp.", - "homepage": "https://github.com/amphp/dns", "keywords": [ - "amp", - "amphp", - "async", - "client", - "dns", - "resolve" + "download binaries", + "memory" ], "support": { - "issues": "https://github.com/amphp/dns/issues", - "source": "https://github.com/amphp/dns/tree/v2.4.0" + "issues": "https://github.com/php-internal/destroy/issues", + "source": "https://github.com/php-internal/destroy/tree/1.0.0" }, "funding": [ { - "url": "https://github.com/amphp", - "type": "github" + "url": "https://patreon.com/roxblnfk", + "type": "patreon" } ], - "time": "2025-01-19T15:43:40+00:00" + "time": "2025-09-08T14:29:16+00:00" }, { - "name": "amphp/parallel", - "version": "v2.3.2", + "name": "internal/path", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/amphp/parallel.git", - "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce" + "url": "https://github.com/php-internal/path.git", + "reference": "ec0ddb060a204793f1ddfb5219bb024a754df0e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parallel/zipball/321b45ae771d9c33a068186b24117e3cd1c48dce", - "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce", + "url": "https://api.github.com/repos/php-internal/path/zipball/ec0ddb060a204793f1ddfb5219bb024a754df0e0", + "reference": "ec0ddb060a204793f1ddfb5219bb024a754df0e0", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/pipeline": "^1", - "amphp/process": "^2", - "amphp/serialization": "^1", - "amphp/socket": "^2", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1" + "php": ">=8.1" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "buggregator/trap": "^1.15", + "roxblnfk/unpoly": "^1.8.1", + "spiral/code-style": "^2.3.1", + "testo/testo": "^1.0@dev", + "vimeo/psalm": "^6.13" }, "type": "library", "autoload": { - "files": [ - "src/Context/functions.php", - "src/Context/Internal/functions.php", - "src/Ipc/functions.php", - "src/Worker/functions.php" - ], "psr-4": { - "Amp\\Parallel\\": "src" + "Internal\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Parallel processing component for Amp.", - "homepage": "https://github.com/amphp/parallel", + "description": "Type-safe, immutable file path library with cross-platform support and automatic normalization.", "keywords": [ - "async", - "asynchronous", - "concurrent", - "multi-processing", - "multi-threading" + "cross-platform", + "file", + "filepath", + "filesystem", + "helper", + "path", + "unix", + "windows" ], "support": { - "issues": "https://github.com/amphp/parallel/issues", - "source": "https://github.com/amphp/parallel/tree/v2.3.2" + "issues": "https://github.com/php-internal/path/issues", + "source": "https://github.com/php-internal/path/tree/1.2.0" }, "funding": [ { - "url": "https://github.com/amphp", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-08-27T21:55:40+00:00" + "time": "2025-12-03T11:32:09+00:00" }, { - "name": "amphp/parser", - "version": "v1.1.1", + "name": "justinrainbow/json-schema", + "version": "6.10.0", "source": { "type": "git", - "url": "https://github.com/amphp/parser.git", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "8b1308a9d7bdbdb20ce87ef920f82b4564bb2d33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/8b1308a9d7bdbdb20ce87ef920f82b4564bb2d33", + "reference": "8b1308a9d7bdbdb20ce87ef920f82b4564bb2d33", "shasum": "" }, "require": { - "php": ">=7.4" + "ext-json": "*", + "marc-mabe/php-enum": "^4.4", + "php": "^7.2 || ^8.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "friendsofphp/php-cs-fixer": "3.3.0", + "json-schema/json-schema-test-suite": "dev-main", + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" }, + "bin": [ + "bin/validate-json" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, "autoload": { "psr-4": { - "Amp\\Parser\\": "src" + "JsonSchema\\": "src/JsonSchema/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4644,63 +3923,65 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schรถnthal", + "email": "seroscho@googlemail.com" } ], - "description": "A generator parser to make streaming parsers simple.", - "homepage": "https://github.com/amphp/parser", + "description": "A library to validate a json schema.", + "homepage": "https://github.com/jsonrainbow/json-schema", "keywords": [ - "async", - "non-blocking", - "parser", - "stream" + "json", + "schema" ], "support": { - "issues": "https://github.com/amphp/parser/issues", - "source": "https://github.com/amphp/parser/tree/v1.1.1" + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/6.10.0" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T19:16:53+00:00" + "time": "2026-06-16T20:50:26+00:00" }, { - "name": "amphp/pipeline", - "version": "v1.2.3", + "name": "kelunik/certificate", + "version": "v1.1.3", "source": { "type": "git", - "url": "https://github.com/amphp/pipeline.git", - "reference": "7b52598c2e9105ebcddf247fc523161581930367" + "url": "https://github.com/kelunik/certificate.git", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", - "reference": "7b52598c2e9105ebcddf247fc523161581930367", + "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", "shasum": "" }, "require": { - "amphp/amp": "^3", - "php": ">=8.1", - "revolt/event-loop": "^1" + "ext-openssl": "*", + "php": ">=7.0" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "phpunit/phpunit": "^6 | 7 | ^8 | ^9" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { "psr-4": { - "Amp\\Pipeline\\": "src" + "Kelunik\\Certificate\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4708,71 +3989,71 @@ "MIT" ], "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, { "name": "Niklas Keller", "email": "me@kelunik.com" } ], - "description": "Asynchronous iterators and operators.", - "homepage": "https://amphp.org/pipeline", + "description": "Access certificate details and transform between different formats.", "keywords": [ - "amp", - "amphp", - "async", - "io", - "iterator", - "non-blocking" + "DER", + "certificate", + "certificates", + "openssl", + "pem", + "x509" ], "support": { - "issues": "https://github.com/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.3" + "issues": "https://github.com/kelunik/certificate/issues", + "source": "https://github.com/kelunik/certificate/tree/v1.1.3" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-03-16T16:33:53+00:00" + "time": "2023-02-03T21:26:53+00:00" }, { - "name": "amphp/process", - "version": "v2.0.3", + "name": "league/uri", + "version": "7.8.1", "source": { "type": "git", - "url": "https://github.com/amphp/process.git", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d" + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Process\\": "src" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4781,60 +4062,87 @@ ], "authors": [ { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "A fiber-aware process manager based on Amp and Revolt.", - "homepage": "https://amphp.org/process", + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], "support": { - "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v2.0.3" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" } ], - "time": "2024-04-19T03:13:44+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { - "name": "amphp/serialization", - "version": "v1.0.0", + "name": "league/uri-interfaces", + "version": "7.8.1", "source": { "type": "git", - "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Serialization\\": "src" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4843,1408 +4151,1037 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Serialization tools for IPC and data storage in PHP.", - "homepage": "https://github.com/amphp/serialization", + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "async", - "asynchronous", - "serialization", - "serialize" + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" ], "support": { - "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, - "time": "2020-03-25T21:39:07+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" }, { - "name": "amphp/socket", - "version": "v2.3.1", + "name": "llm/skills", + "version": "1.8.0", "source": { "type": "git", - "url": "https://github.com/amphp/socket.git", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" + "url": "https://github.com/roxblnfk/skills.git", + "reference": "bd6c7dc4f031754db92530724bb1efa7d3cf5b92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", + "url": "https://api.github.com/repos/roxblnfk/skills/zipball/bd6c7dc4f031754db92530724bb1efa7d3cf5b92", + "reference": "bd6c7dc4f031754db92530724bb1efa7d3cf5b92", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/dns": "^2", - "ext-openssl": "*", - "kelunik/certificate": "^1.1", - "league/uri": "^6.5 | ^7", - "league/uri-interfaces": "^2.3 | ^7", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "composer-plugin-api": "^2.0", + "internal/path": "^1.2", + "php": ">=8.2" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "amphp/process": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.20" + "buggregator/trap": "^1.10", + "composer/composer": "^2.9.0", + "infection/infection": "dev-testo-bridge-82 as 0.32.6", + "roxblnfk/unpoly": "^1.8", + "spiral/code-style": "^2.3", + "testo/bridge-infection": "0.1 - 1", + "testo/testo": "0.1 - 1", + "vimeo/psalm": "^7" + }, + "type": "composer-plugin", + "extra": { + "class": "LLM\\Skills\\Composer\\SkillsPlugin" }, - "type": "library", "autoload": { - "files": [ - "src/functions.php", - "src/Internal/functions.php", - "src/SocketAddress/functions.php" - ], "psr-4": { - "Amp\\Socket\\": "src" + "LLM\\Skills\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Daniel Lowrey", - "email": "rdlowrey@gmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Aleksei Gagarin", + "email": "roxblnfk@gmail.com" } ], - "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", - "homepage": "https://github.com/amphp/socket", + "description": "AI skills discovery and management system for LLM agents", "keywords": [ - "amp", - "async", - "encryption", - "non-blocking", - "sockets", - "tcp", - "tls" + "agents", + "ai", + "ai-agents", + "ai-skills", + "claude-code", + "dev", + "llm", + "llm-agents", + "skills" ], "support": { - "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.3.1" + "issues": "https://github.com/roxblnfk/skills/issues", + "source": "https://github.com/roxblnfk/skills" }, "funding": [ { - "url": "https://github.com/amphp", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2024-04-21T14:33:03+00:00" + "time": "2026-06-22T07:38:09+00:00" }, { - "name": "amphp/sync", - "version": "v2.3.0", + "name": "marc-mabe/php-enum", + "version": "v4.7.2", "source": { "type": "git", - "url": "https://github.com/amphp/sync.git", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "ext-reflection": "*", + "php": "^7.1 | ^8.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23" + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Sync\\": "src" - } + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" } ], - "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", - "homepage": "https://github.com/amphp/sync", + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", "keywords": [ - "async", - "asynchronous", - "mutex", - "semaphore", - "synchronization" + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" ], "support": { - "issues": "https://github.com/amphp/sync/issues", - "source": "https://github.com/amphp/sync/tree/v2.3.0" + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-08-03T19:31:26+00:00" + "time": "2025-09-14T11:18:39+00:00" }, { - "name": "buggregator/trap", - "version": "1.13.16", + "name": "nesbot/carbon", + "version": "3.13.0", "source": { "type": "git", - "url": "https://github.com/buggregator/trap.git", - "reference": "2c08a25c77fc5aa5cde1a3ce9b0199306a3ee49a" + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "40f6618f052df16b545f626fbf9a878e6497d16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/buggregator/trap/zipball/2c08a25c77fc5aa5cde1a3ce9b0199306a3ee49a", - "reference": "2c08a25c77fc5aa5cde1a3ce9b0199306a3ee49a", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/40f6618f052df16b545f626fbf9a878e6497d16a", + "reference": "40f6618f052df16b545f626fbf9a878e6497d16a", "shasum": "" }, "require": { - "clue/stream-filter": "^1.6", - "ext-filter": "*", - "ext-sockets": "*", - "nunomaduro/termwind": "^1.15.1 || ^2", - "nyholm/psr7": "^1.8", - "php": ">=8.1", - "php-http/message": "^1.15", - "psr/container": "^1.1 || ^2.0", - "psr/http-message": "^1.1 || ^2", - "symfony/console": "^6.4 || ^7", - "symfony/var-dumper": "^6.3 || ^7", - "yiisoft/injector": "^1.2" + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" }, - "require-dev": { - "dereuromark/composer-prefer-lowest": "^0.1.10", - "ergebnis/phpunit-slow-test-detector": "^2.14", - "google/protobuf": "^3.25 || ^4.30", - "phpunit/phpunit": "^10.5.10", - "rector/rector": "^1.1", - "roxblnfk/unpoly": "^1.8.1", - "spiral/code-style": "^2.2.2", - "ta-tikoma/phpunit-architecture-test": "^0.8.4", - "vimeo/psalm": "^6.5" + "provide": { + "psr/clock-implementation": "1.0" }, - "suggest": { - "ext-simplexml": "To load trap.xml", - "roxblnfk/unpoly": "If you want to remove unnecessary PHP polyfills depend on PHP version." + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" }, "bin": [ - "bin/trap" + "bin/carbon" ], "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Buggregator\\Trap\\": "src/" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Aleksei Gagarin (roxblnfk)", - "homepage": "https://github.com/roxblnfk" + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" }, { - "name": "Pavel Buchnev (butschster)", - "homepage": "https://github.com/butschster" + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" } ], - "description": "A simple and powerful tool for debugging PHP applications.", - "homepage": "https://buggregator.dev/", + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", "keywords": [ - "Fibers", - "WebSockets", - "binary dump", - "cli", - "console", - "debug", - "dev", - "dump", - "dumper", - "helper", - "sentry", - "server", - "smtp" + "date", + "datetime", + "time" ], "support": { - "issues": "https://github.com/buggregator/trap/issues", - "source": "https://github.com/buggregator/trap/tree/1.13.16" + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" }, "funding": [ { - "url": "https://boosty.to/roxblnfk", - "type": "boosty" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://patreon.com/roxblnfk", - "type": "patreon" + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" } ], - "time": "2025-06-09T08:58:44+00:00" + "time": "2026-06-18T13:49:15+00:00" }, { - "name": "carbonphp/carbon-doctrine-types", - "version": "3.2.0", + "name": "netresearch/jsonmapper", + "version": "v5.0.1", "source": { "type": "git", - "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "980674efdda65913492d29a8fd51c82270dd37bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/980674efdda65913492d29a8fd51c82270dd37bb", + "reference": "980674efdda65913492d29a8fd51c82270dd37bb", "shasum": "" }, "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/dbal": "<4.0.0 || >=5.0.0" + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" }, "require-dev": { - "doctrine/dbal": "^4.0.0", - "nesbot/carbon": "^2.71.0 || ^3.0.0", - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" }, "type": "library", "autoload": { - "psr-4": { - "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + "psr-0": { + "JsonMapper": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "OSL-3.0" ], "authors": [ { - "name": "KyleKatarn", - "email": "kylekatarnls@gmail.com" + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" } ], - "description": "Types to use Carbon in Doctrine", - "keywords": [ - "carbon", - "date", - "datetime", - "doctrine", - "time" - ], + "description": "Map nested JSON structures onto PHP classes", "support": { - "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.1" }, - "funding": [ - { - "url": "https://github.com/kylekatarnls", - "type": "github" - }, - { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", - "type": "tidelift" - } - ], - "time": "2024-02-09T16:56:22+00:00" + "time": "2026-02-22T16:28:03+00:00" }, { - "name": "clue/stream-filter", - "version": "v1.7.0", + "name": "nette/php-generator", + "version": "v4.2.2", "source": { "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + "url": "https://github.com/nette/php-generator.git", + "reference": "0d7060926f5c3e8c488b9b9ced42d857f12a34b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", + "url": "https://api.github.com/repos/nette/php-generator/zipball/0d7060926f5c3e8c488b9b9ced42d857f12a34b5", + "reference": "0d7060926f5c3e8c488b9b9ced42d857f12a34b5", "shasum": "" }, "require": { - "php": ">=5.3" + "nette/utils": "^4.0.6", + "php": "8.1 - 8.5" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "nikic/php-parser": "^5.0", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.40@stable", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "Clue\\StreamFilter\\": "src/" - } + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Christian Lรผck", - "email": "christian@clue.engineering" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/stream-filter", + "description": "๐Ÿ˜ Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.5 features.", + "homepage": "https://nette.org", "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" + "code", + "nette", + "php", + "scaffolding" ], "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.2.2" }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2023-12-20T15:40:13+00:00" + "time": "2026-02-26T00:58:33+00:00" }, { - "name": "colinodell/json5", - "version": "v3.0.0", + "name": "nette/utils", + "version": "v4.1.4", "source": { "type": "git", - "url": "https://github.com/colinodell/json5.git", - "reference": "5724d21bc5c910c2560af1b8915f0cc0163579c8" + "url": "https://github.com/nette/utils.git", + "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/colinodell/json5/zipball/5724d21bc5c910c2560af1b8915f0cc0163579c8", - "reference": "5724d21bc5c910c2560af1b8915f0cc0163579c8", + "url": "https://api.github.com/repos/nette/utils/zipball/7da6c396d7ebe142bc857c20479d5e70a5e1aac7", + "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7", "shasum": "" }, "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.0" + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" }, "require-dev": { - "mikehaertl/php-shellcommand": "^1.7.0", - "phpstan/phpstan": "^1.10.57", - "scrutinizer/ocular": "^1.9", - "squizlabs/php_codesniffer": "^3.8.1", - "symfony/finder": "^6.0|^7.0", - "symfony/phpunit-bridge": "^7.0.3" + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, - "bin": [ - "bin/json5" - ], "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { - "files": [ - "src/global.php" - ], "psr-4": { - "ColinODell\\Json5\\": "src" - } + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Developer" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "UTF-8 compatible JSON5 parser for PHP", - "homepage": "https://github.com/colinodell/json5", + "description": "๐Ÿ›  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", "keywords": [ - "JSON5", + "array", + "core", + "datetime", + "images", "json", - "json5_decode", - "json_decode" - ], - "support": { - "issues": "https://github.com/colinodell/json5/issues", - "source": "https://github.com/colinodell/json5/tree/v3.0.0" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" - } - ], - "time": "2024-02-09T13:06:12+00:00" - }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.4" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-01-17T14:14:24+00:00" + "time": "2026-05-11T20:49:54+00:00" }, { - "name": "composer/pcre", - "version": "3.3.2", + "name": "nikic/php-parser", + "version": "v5.7.0", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<1.11.10" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" - }, - "type": "library", - "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } + "bin": [ + "bin/php-parse" ], - "time": "2024-11-12T16:29:46+00:00" - }, - { - "name": "composer/semver", - "version": "3.4.4", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.4" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" + "dev-master": "5.x-dev" } - ], - "time": "2025-08-20T19:15:30+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.5", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", - "shasum": "" }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" - }, - "type": "library", "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "Nikita Popov" } ], - "description": "Restarts a process without Xdebug.", + "description": "A PHP parser written in PHP", "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-05-06T16:37:16+00:00" - }, - { - "name": "cycle/annotated", - "version": "v4.3.1", - "source": { - "type": "git", - "url": "https://github.com/cycle/annotated.git", - "reference": "f996d3ee0c22aa8f2c03dca5d693408f8b7fdbbe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cycle/annotated/zipball/f996d3ee0c22aa8f2c03dca5d693408f8b7fdbbe", - "reference": "f996d3ee0c22aa8f2c03dca5d693408f8b7fdbbe", - "shasum": "" - }, - "require": { - "cycle/database": "^2.15", - "cycle/orm": "^2.9.2", - "cycle/schema-builder": "^2.11.1", - "doctrine/inflector": "^2.0", - "php": ">=8.1", - "spiral/attributes": "^2.8|^3.0", - "spiral/tokenizer": "^2.8|^3.0" - }, - "require-dev": { - "doctrine/annotations": "^1.14.3 || ^2.0.1", - "phpunit/phpunit": "^10.1", - "spiral/code-style": "^2.2", - "spiral/dumper": "^3.3", - "vimeo/psalm": "^5.26 || ^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cycle\\Annotated\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" - }, - { - "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" - }, - { - "name": "Pavel Butchnev (butschster)", - "email": "pavel.buchnev@spiralscout.com" - }, - { - "name": "Maksim Smakouz (msmakouz)", - "email": "maksim.smakouz@spiralscout.com" - } - ], - "description": "Cycle ORM Annotated Entities generator", - "homepage": "https://cycle-orm.dev", - "support": { - "chat": "https://discord.gg/spiralphp", - "docs": "https://cycle-orm.dev/docs", - "issues": "https://github.com/cycle/annotated/issues", - "source": "https://github.com/cycle/annotated" - }, - "funding": [ - { - "url": "https://github.com/sponsors/cycle", - "type": "github" - } - ], - "time": "2025-07-22T06:19:06+00:00" - }, - { - "name": "cycle/entity-behavior", - "version": "1.7.0", - "source": { - "type": "git", - "url": "https://github.com/cycle/entity-behavior.git", - "reference": "0c8d84fb3eaa50ec426f336a158d62ad2b4a83b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cycle/entity-behavior/zipball/0c8d84fb3eaa50ec426f336a158d62ad2b4a83b6", - "reference": "0c8d84fb3eaa50ec426f336a158d62ad2b4a83b6", - "shasum": "" - }, - "require": { - "cycle/database": "^2.14", - "cycle/orm": "^2.10", - "cycle/schema-builder": "^2.8", - "php": ">=8.0", - "psr/container": "^1.0|^2.0", - "psr/event-dispatcher": "^1", - "yiisoft/injector": "^1.0" - }, - "require-dev": { - "cycle/annotated": "^3.0", - "phpunit/phpunit": "^9.5", - "ramsey/uuid": "^4.5", - "spiral/code-style": "^2.2", - "spiral/tokenizer": "^2.8 || ^3.0", - "vimeo/psalm": "^5.11 || ^6.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cycle\\ORM\\Entity\\Behavior\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" - }, - { - "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" - }, - { - "name": "Pavel Butchnev (butschster)", - "email": "pavel.buchnev@spiralscout.com" - }, - { - "name": "Maksim Smakouz (msmakouz)", - "email": "maksim.smakouz@spiralscout.com" - } + "parser", + "php" ], - "description": "Provides a collection of attributes that add behaviors to Cycle ORM entities", - "homepage": "https://cycle-orm.dev", "support": { - "chat": "https://discord.gg/spiralphp", - "docs": "https://cycle-orm.dev/docs", - "issues": "https://github.com/cycle/entity-behavior/issues", - "source": "https://github.com/cycle/entity-behavior" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "funding": [ - { - "url": "https://github.com/sponsors/cycle", - "type": "github" - } - ], - "time": "2025-07-22T05:27:05+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { - "name": "cycle/migrations", - "version": "v4.2.6", + "name": "ondram/ci-detector", + "version": "4.2.0", "source": { "type": "git", - "url": "https://github.com/cycle/migrations.git", - "reference": "c1712b6703441a381f707dd710cc3880c004b92c" + "url": "https://github.com/OndraM/ci-detector.git", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" }, "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cycle/migrations/zipball/c1712b6703441a381f707dd710cc3880c004b92c", - "reference": "c1712b6703441a381f707dd710cc3880c004b92c", + "type": "zip", + "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", "shasum": "" }, "require": { - "cycle/database": "^2.7.0", - "php": ">=8.1", - "spiral/core": "^3.0", - "spiral/files": "^3.0", - "spiral/reactor": "^3.0", - "spiral/tokenizer": "^3.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "buggregator/trap": "^1.11", - "mockery/mockery": "^1.5", - "phpunit/phpunit": "^9.5", - "spiral/code-style": "^2.2.0", - "vimeo/psalm": "^6.4" + "ergebnis/composer-normalize": "^2.13.2", + "lmc/coding-standard": "^3.0.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.6.13" }, "type": "library", "autoload": { "psr-4": { - "Cycle\\Migrations\\": "src/" + "OndraM\\CiDetector\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Database migrations, migration scaffolding", + "authors": [ + { + "name": "Ondล™ej Machulda", + "email": "ondrej.machulda@gmail.com" + } + ], + "description": "Detect continuous integration environment and provide unified access to properties of current build", + "keywords": [ + "CircleCI", + "Codeship", + "Wercker", + "adapter", + "appveyor", + "aws", + "aws codebuild", + "azure", + "azure devops", + "azure pipelines", + "bamboo", + "bitbucket", + "buddy", + "ci-info", + "codebuild", + "continuous integration", + "continuousphp", + "devops", + "drone", + "github", + "gitlab", + "interface", + "jenkins", + "pipelines", + "sourcehut", + "teamcity", + "travis" + ], "support": { - "issues": "https://github.com/cycle/migrations/issues", - "source": "https://github.com/cycle/migrations/tree/v4.2.6" + "issues": "https://github.com/OndraM/ci-detector/issues", + "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" }, - "time": "2025-07-13T07:22:37+00:00" + "time": "2024-03-12T13:22:30+00:00" }, { - "name": "cycle/schema-builder", - "version": "v2.11.2", + "name": "php-cs-fixer/shim", + "version": "v3.95.10", "source": { "type": "git", - "url": "https://github.com/cycle/schema-builder.git", - "reference": "c59071a22dc9368a599253f541ff5338a61a1511" + "url": "https://github.com/PHP-CS-Fixer/shim.git", + "reference": "898f61c5365778a2a705546965dd56ef5b7742f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cycle/schema-builder/zipball/c59071a22dc9368a599253f541ff5338a61a1511", - "reference": "c59071a22dc9368a599253f541ff5338a61a1511", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/898f61c5365778a2a705546965dd56ef5b7742f7", + "reference": "898f61c5365778a2a705546965dd56ef5b7742f7", "shasum": "" }, "require": { - "cycle/database": "^2.7.1", - "cycle/orm": "^2.7", - "php": ">=8.0", - "yiisoft/friendly-exception": "^1.1" + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, - "require-dev": { - "phpunit/phpunit": "^9.5", - "spiral/code-style": "^2.2", - "spiral/tokenizer": "^2.8", - "symfony/console": "^6.0 || ^7.0", - "vimeo/psalm": "^5.12 || ^6.12" + "replace": { + "friendsofphp/php-cs-fixer": "self.version" }, - "type": "library", - "autoload": { - "psr-4": { - "Cycle\\Schema\\": "src/" - } + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." }, + "bin": [ + "php-cs-fixer", + "php-cs-fixer.phar" + ], + "type": "application", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" - }, - { - "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" - }, - { - "name": "Pavel Butchnev (butschster)", - "email": "pavel.buchnev@spiralscout.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Maksim Smakouz (msmakouz)", - "email": "maksim.smakouz@spiralscout.com" + "name": "Dariusz Rumiล„ski", + "email": "dariusz.ruminski@gmail.com" } ], - "description": "Cycle ORM Schema Builder", + "description": "A tool to automatically fix PHP code style", "support": { - "issues": "https://github.com/cycle/schema-builder/issues", - "source": "https://github.com/cycle/schema-builder/tree/v2.11.2" + "issues": "https://github.com/PHP-CS-Fixer/shim/issues", + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.95.10" }, - "funding": [ - { - "url": "https://github.com/sponsors/cycle", - "type": "github" - } - ], - "time": "2025-07-10T03:45:14+00:00" + "time": "2026-06-19T14:45:50+00:00" }, { - "name": "cycle/schema-migrations-generator", - "version": "2.3.0", + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/cycle/schema-migrations-generator.git", - "reference": "766c68dc1c89aa20128a4cecf1995f101c05e5f0" + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cycle/schema-migrations-generator/zipball/766c68dc1c89aa20128a4cecf1995f101c05e5f0", - "reference": "766c68dc1c89aa20128a4cecf1995f101c05e5f0", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { - "cycle/database": "^2.11.3", - "cycle/migrations": "^4.2.4", - "cycle/schema-builder": "^2.11.1", - "php": ">=8.1" - }, - "require-dev": { - "cycle/annotated": "^3.5", - "cycle/orm": "^2.9.1", - "phpunit/phpunit": "^9.6.22", - "spiral/code-style": "^2.2.0", - "spiral/dumper": "^3.3.1", - "spiral/framework": "^3.14.8", - "vimeo/psalm": "^5.26.1" + "php": "^7.2 || ^8.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, "autoload": { "psr-4": { - "Cycle\\Schema\\Generator\\Migrations\\": "src/" + "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Cycle ORM Migration generation", - "support": { - "chat": "https://discord.gg/spiralphp", - "docs": "https://cycle-orm.dev/docs", - "issues": "https://github.com/cycle/schema-migrations-generator/issues", - "source": "https://github.com/cycle/schema-migrations-generator" - }, - "funding": [ + "authors": [ { - "url": "https://github.com/sponsors/cycle", - "type": "github" + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" } ], - "time": "2024-12-23T11:27:31+00:00" + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" }, { - "name": "cycle/schema-renderer", - "version": "1.3.0", + "name": "phpdocumentor/reflection-docblock", + "version": "6.0.3", "source": { "type": "git", - "url": "https://github.com/cycle/schema-renderer.git", - "reference": "75afcb552432eb58dffda15d63f4451601c60c82" + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cycle/schema-renderer/zipball/75afcb552432eb58dffda15d63f4451601c60c82", - "reference": "75afcb552432eb58dffda15d63f4451601c60c82", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", "shasum": "" }, "require": { - "cycle/orm": "^2.0", - "php": ">=8.1", - "symfony/polyfill-php83": "^1.31.0" + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^2.0", + "phpstan/phpdoc-parser": "^2.0", + "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { - "phpunit/phpunit": "^10.5", - "spiral/code-style": "^2.2.2", - "spiral/dumper": "^3.3", - "vimeo/psalm": "^5.26.1 || ^6.8.9" + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26", + "shipmonk/dead-code-detector": "^0.5.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { "psr-4": { - "Cycle\\Schema\\Renderer\\": "src/" + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Utils for Cycle ORM Schema rendering", + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { - "issues": "https://github.com/cycle/schema-renderer/issues", - "source": "https://github.com/cycle/schema-renderer/tree/1.3.0" + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" }, - "time": "2025-05-08T08:51:06+00:00" + "time": "2026-03-18T20:49:53+00:00" }, { - "name": "daverandom/libdns", - "version": "v2.1.0", + "name": "phpdocumentor/type-resolver", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/DaveRandom/LibDNS.git", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9", "shasum": "" }, "require": { - "ext-ctype": "*", - "php": ">=7.1" + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^2.0" }, - "suggest": { - "ext-intl": "Required for IDN support" + "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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev" + } }, - "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "LibDNS\\": "src/" + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "DNS protocol implementation written in pure PHP", - "keywords": [ - "dns" + "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/DaveRandom/LibDNS/issues", - "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0" }, - "time": "2024-04-12T12:12:48+00:00" + "time": "2026-01-06T21:53:42+00:00" }, { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", + "name": "phpstan/phpdoc-parser", + "version": "2.3.2", "source": { "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + "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": { - "XdgBaseDir\\": "src/" + "PHPStan\\PhpDocParser\\": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "implementation of xdg base directory specification for php", + "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2019-12-04T15:06:13+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { - "name": "doctrine/deprecations", - "version": "1.1.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" - }, + "name": "phpstan/phpstan", + "version": "1.12.33", "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/37982d6fc7cbb746dda7773530cda557cdf119e1", + "reference": "37982d6fc7cbb746dda7773530cda557cdf119e1", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.2|^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", - "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", - "psr/log": "^1 || ^2 || ^3" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + "phpstan/phpstan-shim": "*" }, + "bin": [ + "phpstan", + "phpstan.phar" + ], "type": "library", "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "src" - } + "files": [ + "bootstrap.php" + ] }, "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/", + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "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" }, - "time": "2025-04-07T20:06:18+00:00" + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2026-02-28T20:30:03+00:00" }, { - "name": "ergebnis/phpunit-slow-test-detector", - "version": "2.20.0", + "name": "psalm/psalm-plugin-api", + "version": "0.1.0", "source": { "type": "git", - "url": "https://github.com/ergebnis/phpunit-slow-test-detector.git", - "reference": "36225d36071cb0e7aae3e05a8baa82ace28e1094" + "url": "https://github.com/psalm/psalm-plugin-api.git", + "reference": "a995ad2c44df828f5333cb37b0ced92bb4b74b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/phpunit-slow-test-detector/zipball/36225d36071cb0e7aae3e05a8baa82ace28e1094", - "reference": "36225d36071cb0e7aae3e05a8baa82ace28e1094", + "url": "https://api.github.com/repos/psalm/psalm-plugin-api/zipball/a995ad2c44df828f5333cb37b0ced92bb4b74b5b", + "reference": "a995ad2c44df828f5333cb37b0ced92bb4b74b5b", "shasum": "" }, - "require": { - "php": "~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", - "phpunit/phpunit": "^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.47.0", - "ergebnis/license": "^2.6.0", - "ergebnis/php-cs-fixer-config": "^6.52.0", - "fakerphp/faker": "~1.20.0", - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.11", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.1", - "phpstan/phpstan-strict-rules": "^1.6.1", - "psr/container": "~1.0.0", - "rector/rector": "^1.2.10" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.16-dev" - }, - "composer-normalize": { - "indent-size": 2, - "indent-style": "space" - } - }, - "autoload": { - "psr-4": { - "Ergebnis\\PHPUnit\\SlowTestDetector\\": "src/" - } + "conflict": { + "vimeo/psalm": "<7.0.0" }, + "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Andreas Mรถller", - "email": "am@localheinz.com", - "homepage": "https://localheinz.com" + "name": "Daniil Gentili", + "email": "daniil@daniil.it" } ], - "description": "Provides facilities for detecting slow tests in phpunit/phpunit.", - "homepage": "https://github.com/ergebnis/phpunit-slow-test-detector", - "keywords": [ - "detector", - "extension", - "phpunit", - "slow", - "test" - ], + "description": "Stable, semantically versioned API for Psalm plugins", "support": { - "issues": "https://github.com/ergebnis/phpunit-slow-test-detector/issues", - "security": "https://github.com/ergebnis/phpunit-slow-test-detector/blob/main/.github/SECURITY.md", - "source": "https://github.com/ergebnis/phpunit-slow-test-detector" + "issues": "https://github.com/psalm/psalm-plugin-api/issues", + "source": "https://github.com/psalm/psalm-plugin-api/tree/0.1.0" }, - "time": "2025-08-19T07:48:39+00:00" + "time": "2026-03-19T15:12:37+00:00" }, { - "name": "fakerphp/faker", - "version": "v1.24.1", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", - "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "conflict": { - "fzaninotto/faker": "*" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "doctrine/persistence": "^1.3 || ^2.0", - "ext-intl": "*", - "phpunit/phpunit": "^9.5.26", - "symfony/phpunit-bridge": "^5.4.16" - }, - "suggest": { - "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", - "ext-curl": "Required by Faker\\Provider\\Image to download images.", - "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", - "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", - "ext-mbstring": "Required for multibyte Unicode string functionality." + "php": ">=8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Faker\\": "src/Faker/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6253,154 +5190,150 @@ ], "authors": [ { - "name": "Franรงois Zaninotto" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Faker is a PHP library that generates fake data for you.", + "description": "Common interface for caching libraries", "keywords": [ - "data", - "faker", - "fixtures" + "cache", + "psr", + "psr-6" ], "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2024-11-21T13:46:39+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" + "php": "^7.0 || ^8.0" }, "type": "library", "autoload": { "psr-4": { - "AdvancedJsonRpc\\": "lib/" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A more advanced JSONRPC implementation", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2021-06-11T22:34:44+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.3", + "name": "psr/http-factory", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "LanguageServerProtocol\\": "src/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "PHP classes for the Language Server Protocol", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "language", - "microsoft", - "php", - "server" + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2024-04-30T00:40:11+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "fidry/cpu-core-counter", - "version": "1.3.0", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", - "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, - "require-dev": { - "fidry/makefile": "^0.2.0", - "fidry/php-cs-fixer-config": "^1.1.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-deprecation-rules": "^2.0.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } }, - "type": "library", "autoload": { "psr-4": { - "Fidry\\CpuCoreCounter\\": "src/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6409,113 +5342,109 @@ ], "authors": [ { - "name": "Thรฉo FIDRY", - "email": "theo.fidry@gmail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Tiny utility to get the number of CPU cores.", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "CPU", - "core" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2025-08-14T07:29:31+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { - "name": "hamcrest/hamcrest-php", - "version": "v2.1.1", + "name": "psr/http-server-handler", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", "shasum": "" }, "require": { - "php": "^7.4|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "classmap": [ - "hamcrest" - ] + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } ], - "description": "This is the PHP port of Hamcrest Matchers", + "description": "Common interface for HTTP server-side request handler", "keywords": [ - "test" + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" ], "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" }, - "time": "2025-04-30T06:54:44+00:00" + "time": "2023-04-10T20:06:20+00:00" }, { - "name": "illuminate/collections", - "version": "v10.48.28", + "name": "psr/http-server-middleware", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/illuminate/collections.git", - "reference": "48de3d6bc6aa779112ddcb608a3a96fc975d89d8" + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/48de3d6bc6aa779112ddcb608a3a96fc975d89d8", - "reference": "48de3d6bc6aa779112ddcb608a3a96fc975d89d8", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", "shasum": "" }, "require": { - "illuminate/conditionable": "^10.0", - "illuminate/contracts": "^10.0", - "illuminate/macroable": "^10.0", - "php": "^8.1" - }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^6.2)." + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "10.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "files": [ - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "Psr\\Http\\Server\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6524,44 +5453,53 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "The Illuminate Collections package.", - "homepage": "https://laravel.com", + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" }, - "time": "2024-11-21T14:02:44+00:00" + "time": "2023-04-11T06:14:47+00:00" }, { - "name": "illuminate/conditionable", - "version": "v10.48.28", + "name": "psr/simple-cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/illuminate/conditionable.git", - "reference": "3ee34ac306fafc2a6f19cd7cd68c9af389e432a5" + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/3ee34ac306fafc2a6f19cd7cd68c9af389e432a5", - "reference": "3ee34ac306fafc2a6f19cd7cd68c9af389e432a5", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "php": "^8.0.2" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "10.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Support\\": "" + "Psr\\SimpleCache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6570,92 +5508,114 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "The Illuminate Conditionable package.", - "homepage": "https://laravel.com", + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "time": "2024-11-21T14:02:44+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { - "name": "illuminate/contracts", - "version": "v10.48.28", + "name": "rector/rector", + "version": "1.2.10", "source": { "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "f90663a69f926105a70b78060a31f3c64e2d1c74" + "url": "https://github.com/rectorphp/rector.git", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/f90663a69f926105a70b78060a31f3c64e2d1c74", - "reference": "f90663a69f926105a70b78060a31f3c64e2d1c74", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61", "shasum": "" }, "require": { - "php": "^8.1", - "psr/container": "^1.1.1|^2.0.1", - "psr/simple-cache": "^1.0|^2.0|^3.0" + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.12.5" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "10.x-dev" - } + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" }, + "bin": [ + "bin/rector" + ], + "type": "library", "autoload": { - "psr-4": { - "Illuminate\\Contracts\\": "" - } + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/1.2.10" }, - "time": "2024-11-21T14:02:44+00:00" + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-11-08T13:59:10+00:00" }, { - "name": "illuminate/macroable", - "version": "v10.48.28", + "name": "revolt/event-loop", + "version": "v1.0.9", "source": { "type": "git", - "url": "https://github.com/illuminate/macroable.git", - "reference": "dff667a46ac37b634dcf68909d9d41e94dc97c27" + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "44061cf513e53c6200372fc935ac42271566295d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/dff667a46ac37b634dcf68909d9d41e94dc97c27", - "reference": "dff667a46ac37b634dcf68909d9d41e94dc97c27", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/44061cf513e53c6200372fc935ac42271566295d", + "reference": "44061cf513e53c6200372fc935ac42271566295d", "shasum": "" }, "require": { - "php": "^8.1" + "php": ">=8.1" + }, + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "10.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Support\\": "" + "Revolt\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6664,477 +5624,480 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.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": "The Illuminate Macroable package.", - "homepage": "https://laravel.com", + "description": "Rock-solid event loop for concurrent PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "event", + "event-loop", + "non-blocking", + "scheduler" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/revoltphp/event-loop/issues", + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.9" }, - "time": "2023-06-05T12:46:42+00:00" + "time": "2026-05-16T17:55:38+00:00" }, { - "name": "illuminate/support", - "version": "v10.48.28", + "name": "sanmai/di-container", + "version": "0.1.17", "source": { "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "6d09b480d34846245d9288f4dcefb17a73ce6e6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/6d09b480d34846245d9288f4dcefb17a73ce6e6a", - "reference": "6d09b480d34846245d9288f4dcefb17a73ce6e6a", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^2.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "illuminate/collections": "^10.0", - "illuminate/conditionable": "^10.0", - "illuminate/contracts": "^10.0", - "illuminate/macroable": "^10.0", - "nesbot/carbon": "^2.67", - "php": "^8.1", - "voku/portable-ascii": "^2.0" + "url": "https://github.com/sanmai/di-container.git", + "reference": "a901c4a8778c9212ef4d66607525281af2f787bd" }, - "conflict": { - "tightenco/collect": "<5.5.33" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sanmai/di-container/zipball/a901c4a8778c9212ef4d66607525281af2f787bd", + "reference": "a901c4a8778c9212ef4d66607525281af2f787bd", + "shasum": "" }, - "suggest": { - "illuminate/filesystem": "Required to use the composer class (^10.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the composer class (^6.2).", - "symfony/uid": "Required to use Str::ulid() (^6.2).", - "symfony/var-dumper": "Required to use the dd function (^6.2).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." + "require": { + "php": ">=8.2", + "psr/container": "^1.1.2 || ^2.0", + "sanmai/pipeline": "^6.17 || ^7.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.31", + "php-coveralls/php-coveralls": "^2.4.1", + "phpbench/phpbench": "^1.4", + "phpstan/extension-installer": "^1.4", + "phpunit/phpunit": "^11.5.25", + "sanmai/phpstan-rules": "^0.3.10" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "10.x-dev" - } + "dev-main": "0.1.x-dev" + }, + "preferred-install": "dist" }, "autoload": { - "files": [ - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "DIContainer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com", + "homepage": "https://github.com/sanmai" + }, + { + "name": "Maks Rafalko", + "homepage": "https://twitter.com/maks_rafalko" + }, + { + "name": "Thรฉo FIDRY", + "homepage": "https://twitter.com/tfidry" } ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", + "description": "dependency injection container with automatic constructor dependency resolution", + "keywords": [ + "Autowiring", + "constructor di", + "di container", + "psr 11" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/sanmai/di-container/issues", + "source": "https://github.com/sanmai/di-container/tree/0.1.17" }, - "time": "2024-12-10T14:47:55+00:00" + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2026-06-01T08:52:14+00:00" }, { - "name": "infection/abstract-testframework-adapter", - "version": "0.5.0", + "name": "sanmai/duoclock", + "version": "0.1.3", "source": { "type": "git", - "url": "https://github.com/infection/abstract-testframework-adapter.git", - "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" + "url": "https://github.com/sanmai/DuoClock.git", + "reference": "47461e3ff65b7308635047831a55615652e7be1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", - "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "url": "https://api.github.com/repos/sanmai/DuoClock/zipball/47461e3ff65b7308635047831a55615652e7be1a", + "reference": "47461e3ff65b7308635047831a55615652e7be1a", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": ">=8.2", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^2.17", - "phpunit/phpunit": "^9.5" + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.29", + "php-coveralls/php-coveralls": "^2.4.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^11.5.25", + "sanmai/phpstan-rules": "^0.3.1" }, "type": "library", + "extra": { + "preferred-install": "dist" + }, "autoload": { "psr-4": { - "Infection\\AbstractTestFramework\\": "src/" + "DuoClock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "Apache-2.0" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" } ], - "description": "Abstract Test Framework Adapter for Infection", + "description": "PHP time mocking for tests - PSR-20 clock with mockable sleep(), time(), and TimeSpy for PHPUnit testing", "support": { - "issues": "https://github.com/infection/abstract-testframework-adapter/issues", - "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" + "issues": "https://github.com/sanmai/DuoClock/issues", + "source": "https://github.com/sanmai/DuoClock/tree/0.1.3" }, "funding": [ { - "url": "https://github.com/infection", + "url": "https://github.com/sanmai", "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" } ], - "time": "2021-08-17T18:49:12+00:00" + "time": "2025-12-26T06:12:34+00:00" }, { - "name": "infection/extension-installer", - "version": "0.1.2", + "name": "sanmai/later", + "version": "0.1.7", "source": { "type": "git", - "url": "https://github.com/infection/extension-installer.git", - "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" + "url": "https://github.com/sanmai/later.git", + "reference": "72a82d783864bca90412d8a26c1878f8981fee97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", - "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "url": "https://api.github.com/repos/sanmai/later/zipball/72a82d783864bca90412d8a26c1878f8981fee97", + "reference": "72a82d783864bca90412d8a26c1878f8981fee97", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1 || ^2.0" + "php": ">=8.2" }, "require-dev": { - "composer/composer": "^1.9 || ^2.0", - "friendsofphp/php-cs-fixer": "^2.18, <2.19", - "infection/infection": "^0.15.2", - "php-coveralls/php-coveralls": "^2.4", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.10", - "phpstan/phpstan-phpunit": "^0.12.6", - "phpstan/phpstan-strict-rules": "^0.12.2", - "phpstan/phpstan-webmozart-assert": "^0.12.2", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.8" + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.35.1", + "infection/infection": ">=0.27.6", + "phan/phan": ">=2", + "php-coveralls/php-coveralls": "^2.0", + "phpstan/phpstan": ">=1.4.5", + "phpunit/phpunit": ">=9.5 <10", + "vimeo/psalm": ">=2" }, - "type": "composer-plugin", + "type": "library", "extra": { - "class": "Infection\\ExtensionInstaller\\Plugin" + "branch-alias": { + "dev-main": "0.1.x-dev" + } }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Infection\\ExtensionInstaller\\": "src/" + "Later\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "Apache-2.0" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" } ], - "description": "Infection Extension Installer", + "description": "Later: deferred wrapper object", "support": { - "issues": "https://github.com/infection/extension-installer/issues", - "source": "https://github.com/infection/extension-installer/tree/0.1.2" + "issues": "https://github.com/sanmai/later/issues", + "source": "https://github.com/sanmai/later/tree/0.1.7" }, "funding": [ { - "url": "https://github.com/infection", + "url": "https://github.com/sanmai", "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" } ], - "time": "2021-10-20T22:08:34+00:00" + "time": "2025-05-11T01:48:00+00:00" }, { - "name": "infection/include-interceptor", - "version": "0.2.5", + "name": "sanmai/pipeline", + "version": "7.9", "source": { "type": "git", - "url": "https://github.com/infection/include-interceptor.git", - "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" + "url": "https://github.com/sanmai/pipeline.git", + "reference": "d7046ecce91ae57fca403be694888371a21250eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", - "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", + "url": "https://api.github.com/repos/sanmai/pipeline/zipball/d7046ecce91ae57fca403be694888371a21250eb", + "reference": "d7046ecce91ae57fca403be694888371a21250eb", "shasum": "" }, + "require": { + "php": ">=8.2" + }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "infection/infection": "^0.15.0", - "phan/phan": "^2.4 || ^3", - "php-coveralls/php-coveralls": "^2.2", - "phpstan/phpstan": "^0.12.8", - "phpunit/phpunit": "^8.5", - "vimeo/psalm": "^3.8" + "ergebnis/composer-normalize": "^2.8", + "esi/phpunit-coverage-check": ">2", + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.32.3", + "league/pipeline": "^0.3 || ^1.0", + "php-coveralls/php-coveralls": "^2.4.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": ">=9.4 <12", + "sanmai/phpstan-rules": "^0.3.11", + "sanmai/phpunit-double-colon-syntax": "^0.1.1", + "vimeo/psalm": ">=2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.x-dev" + } + }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Infection\\StreamWrapper\\": "src/" + "Pipeline\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "Apache-2.0" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" } ], - "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", + "description": "General-purpose collections pipeline", "support": { - "issues": "https://github.com/infection/include-interceptor/issues", - "source": "https://github.com/infection/include-interceptor/tree/0.2.5" + "issues": "https://github.com/sanmai/pipeline/issues", + "source": "https://github.com/sanmai/pipeline/tree/7.9" }, "funding": [ { - "url": "https://github.com/infection", + "url": "https://github.com/sanmai", "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" } ], - "time": "2021-08-09T10:03:57+00:00" + "time": "2026-01-16T11:54:05+00:00" }, { - "name": "infection/infection", - "version": "0.29.9", + "name": "sebastian/diff", + "version": "6.0.2", "source": { "type": "git", - "url": "https://github.com/infection/infection.git", - "reference": "beac2ca971b37dd7feb92fe2d3e705c175b2360b" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/infection/zipball/beac2ca971b37dd7feb92fe2d3e705c175b2360b", - "reference": "beac2ca971b37dd7feb92fe2d3e705c175b2360b", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "colinodell/json5": "^2.2 || ^3.0", - "composer-runtime-api": "^2.0", - "composer/xdebug-handler": "^2.0 || ^3.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "fidry/cpu-core-counter": "^0.4.0 || ^0.5.0 || ^1.0", - "infection/abstract-testframework-adapter": "^0.5.0", - "infection/extension-installer": "^0.1.0", - "infection/include-interceptor": "^0.2.5", - "infection/mutator": "^0.4", - "justinrainbow/json-schema": "^5.3", - "nikic/php-parser": "^5.3", - "ondram/ci-detector": "^4.1.0", - "php": "^8.1", - "sanmai/later": "^0.1.1", - "sanmai/pipeline": "^5.1 || ^6", - "sebastian/diff": "^3.0.2 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "thecodingmachine/safe": "dev-master as 2.5.0", - "webmozart/assert": "^1.11" - }, - "conflict": { - "antecedent/patchwork": "<2.1.25", - "dg/bypass-finals": "<1.4.1", - "phpunit/php-code-coverage": ">9,<9.1.4 || >9.2.17,<9.2.21" + "php": ">=8.2" }, "require-dev": { - "ext-simplexml": "*", - "fidry/makefile": "^1.0", - "helmich/phpunit-json-assert": "^3.0", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "^1.10.15", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpstan/phpstan-strict-rules": "^1.1.0", - "phpstan/phpstan-webmozart-assert": "^1.0.2", - "phpunit/phpunit": "^10.5", - "rector/rector": "^1.0", - "sidz/phpstan-rules": "^0.4", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0", - "thecodingmachine/phpstan-safe-rule": "^1.2.0" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, - "bin": [ - "bin/infection" - ], "type": "library", - "autoload": { - "psr-4": { - "Infection\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com", - "homepage": "https://twitter.com/maks_rafalko" - }, - { - "name": "Oleg Zhulnev", - "homepage": "https://github.com/sidz" - }, - { - "name": "Gert de Pagter", - "homepage": "https://github.com/BackEndTea" - }, - { - "name": "Thรฉo FIDRY", - "email": "theo.fidry@gmail.com", - "homepage": "https://twitter.com/tfidry" - }, - { - "name": "Alexey Kopytko", - "email": "alexey@kopytko.com", - "homepage": "https://www.alexeykopytko.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, - { - "name": "Andreas Mรถller", - "email": "am@localheinz.com", - "homepage": "https://localheinz.com" + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "coverage", - "mutant", - "mutation framework", - "mutation testing", - "testing", - "unit testing" + "diff", + "udiff", + "unidiff", + "unified diff" ], "support": { - "issues": "https://github.com/infection/infection/issues", - "source": "https://github.com/infection/infection/tree/0.29.9" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { - "url": "https://github.com/infection", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" } ], - "time": "2024-12-08T22:23:44+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { - "name": "infection/mutator", - "version": "0.4.1", + "name": "spatie/array-to-xml", + "version": "3.4.4", "source": { "type": "git", - "url": "https://github.com/infection/mutator.git", - "reference": "3c976d721b02b32f851ee4e15d553ef1e9186d1d" + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/mutator/zipball/3c976d721b02b32f851ee4e15d553ef1e9186d1d", - "reference": "3c976d721b02b32f851ee4e15d553ef1e9186d1d", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0" + "ext-dom": "*", + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^10" + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "Infection\\Mutator\\": "src/" + "Spatie\\ArrayToXml\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" } ], - "description": "Mutator interface to implement custom mutators (mutation operators) for Infection", + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], "support": { - "issues": "https://github.com/infection/mutator/issues", - "source": "https://github.com/infection/mutator/tree/0.4.1" + "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" }, "funding": [ { - "url": "https://github.com/infection", - "type": "github" + "url": "https://spatie.be/open-source/support-us", + "type": "custom" }, { - "url": "https://opencollective.com/infection", - "type": "open_collective" + "url": "https://github.com/spatie", + "type": "github" } ], - "time": "2025-04-29T08:19:52+00:00" + "time": "2025-12-15T09:00:41+00:00" }, { - "name": "justinrainbow/json-schema", - "version": "5.3.0", + "name": "spiral/attributes", + "version": "v3.1.8", "source": { "type": "git", - "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + "url": "https://github.com/spiral/attributes.git", + "reference": "a7e368a42b079f56c16d7fc513b68190b96842c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "url": "https://api.github.com/repos/spiral/attributes/zipball/a7e368a42b079f56c16d7fc513b68190b96842c3", + "reference": "a7e368a42b079f56c16d7fc513b68190b96842c3", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "psr/cache": "1 - 3", + "psr/simple-cache": "1 - 3" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "doctrine/annotations": "^1.14 || ^2.0", + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^9.5.20", + "spiral/code-style": "^2.2", + "vimeo/psalm": "^5.17" }, - "bin": [ - "bin/validate-json" - ], "type": "library", "autoload": { + "files": [ + "src/polyfill.php" + ], "psr-4": { - "JsonSchema\\": "src/JsonSchema/" + "Spiral\\Attributes\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -7143,65 +6106,78 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" }, { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" }, { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" }, { - "name": "Robert Schรถnthal", - "email": "seroscho@googlemail.com" + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" } ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "description": "PHP attributes reader", + "homepage": "https://spiral.dev", "keywords": [ - "json", - "schema" + "annotations", + "attributes", + "metadata" ], "support": { - "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + "chat": "https://discord.gg/V6EK4he", + "docs": "https://spiral.dev/docs", + "issues": "https://github.com/spiral/attributes/issues", + "source": "https://github.com/spiral/attributes" }, - "time": "2024-07-06T21:00:26+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-12-09T15:33:18+00:00" }, { - "name": "kelunik/certificate", - "version": "v1.1.3", + "name": "spiral/auth", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/kelunik/certificate.git", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + "url": "https://github.com/spiral/auth.git", + "reference": "3a0767f9bbfda5fd03cbea007d2a7d2a9dac9d80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "url": "https://api.github.com/repos/spiral/auth/zipball/3a0767f9bbfda5fd03cbea007d2a7d2a9dac9d80", + "reference": "3a0767f9bbfda5fd03cbea007d2a7d2a9dac9d80", "shasum": "" }, "require": { - "ext-openssl": "*", - "php": ">=7.0" + "php": ">=8.1", + "psr/event-dispatcher": "^1.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^6 | 7 | ^8 | ^9" + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { "psr-4": { - "Kelunik\\Certificate\\": "src" + "Spiral\\Auth\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -7210,65 +6186,77 @@ ], "authors": [ { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Access certificate details and transform between different formats.", - "keywords": [ - "DER", - "certificate", - "certificates", - "openssl", - "pem", - "x509" - ], + "description": "Common Authentication Interfaces", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/kelunik/certificate/issues", - "source": "https://github.com/kelunik/certificate/tree/v1.1.3" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/auth" }, - "time": "2023-02-03T21:26:53+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-01-19T11:08:39+00:00" }, { - "name": "league/uri", - "version": "7.5.1", + "name": "spiral/boot", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/uri.git", - "reference": "81fb5145d2644324614cc532b28efd0215bda430" + "url": "https://github.com/spiral/boot.git", + "reference": "c9e8842c03304b7f434eb0151d613ac57d5e692c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", - "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "url": "https://api.github.com/repos/spiral/boot/zipball/c9e8842c03304b7f434eb0151d613ac57d5e692c", + "reference": "c9e8842c03304b7f434eb0151d613ac57d5e692c", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.5", - "php": "^8.1" - }, - "conflict": { - "league/uri-schemes": "^1.0" + "php": ">=8.1", + "spiral/attributes": "^2.8|^3.0", + "spiral/config": "^3.17", + "spiral/core": "^3.17", + "spiral/debug": "^3.17", + "spiral/events": "^3.17", + "spiral/exceptions": "^3.17", + "spiral/files": "^3.17" }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-fileinfo": "to create Data URI from file contennts", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "php-64bit": "to improve IPV4 host parsing", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + "require-dev": { + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "League\\Uri\\": "" + "Spiral\\Boot\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -7277,84 +6265,63 @@ ], "authors": [ { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" - } - ], - "description": "URI manipulation library", - "homepage": "https://uri.thephpleague.com", - "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "middleware", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "uri-template", - "url", - "ws" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } ], + "description": "Environment Bootloader and Dispatch Manager", + "homepage": "https://spiral.dev", "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.5.1" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/boot" }, "funding": [ { - "url": "https://github.com/sponsors/nyamsprod", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2024-12-08T08:40:02+00:00" + "time": "2026-06-03T10:04:49+00:00" }, { - "name": "league/uri-interfaces", - "version": "7.5.0", + "name": "spiral/code-style", + "version": "v2.3.1", "source": { "type": "git", - "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + "url": "https://github.com/spiral/code-style.git", + "reference": "a0407ffcb300c9d2977cb3d1c36af0d13b2ffb72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "url": "https://api.github.com/repos/spiral/code-style/zipball/a0407ffcb300c9d2977cb3d1c36af0d13b2ffb72", + "reference": "a0407ffcb300c9d2977cb3d1c36af0d13b2ffb72", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^8.1", - "psr/http-factory": "^1", - "psr/http-message": "^1.1 || ^2.0" + "php": ">=8.0", + "php-cs-fixer/shim": "^3.64" }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "php-64bit": "to improve IPV4 host parsing", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + "require-dev": { + "phpunit/phpunit": "^10.5", + "spiral/dumper": "^3.3", + "vimeo/psalm": "^5.26" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, "autoload": { "psr-4": { - "League\\Uri\\": "" + "Spiral\\CodeStyle\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7363,191 +6330,135 @@ ], "authors": [ { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" + "name": "Aleksandr Novikov", + "email": "aleksandr.novikov@spiralscout.com" + }, + { + "name": "Aleksei Gagarin", + "email": "alexey.gagarin@spiralscout.com" } ], - "description": "Common interfaces and classes for URI representation and interaction", - "homepage": "https://uri.thephpleague.com", - "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "url", - "ws" - ], + "description": "Code style and static analysis tools rulesets collection", + "homepage": "https://github.com/spiral/code-style", "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" + "source": "https://github.com/spiral/code-style/tree/v2.3.1" }, "funding": [ { - "url": "https://github.com/sponsors/nyamsprod", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2024-12-08T08:18:47+00:00" + "time": "2025-10-06T17:24:48+00:00" }, { - "name": "mockery/mockery", - "version": "1.6.12", + "name": "spiral/config", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + "url": "https://github.com/spiral/config.git", + "reference": "22bab35070378b38c76b1e5f91aff60cca91bda7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "url": "https://api.github.com/repos/spiral/config/zipball/22bab35070378b38c76b1e5f91aff60cca91bda7", + "reference": "22bab35070378b38c76b1e5f91aff60cca91bda7", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": ">=7.3" - }, - "conflict": { - "phpunit/phpunit": "<8.0" + "ext-json": "*", + "php": ">=8.1", + "spiral/core": "^3.17" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.6.17", - "symplify/easy-coding-standard": "^12.1.14" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { - "files": [ - "library/helpers.php", - "library/Mockery.php" - ], "psr-4": { - "Mockery\\": "library/Mockery" + "Spiral\\Config\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Pรกdraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "https://github.com/padraic", - "role": "Author" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" }, { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "https://davedevelopment.co.uk", - "role": "Developer" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" }, { - "name": "Nathanael Esayeas", - "email": "nathanael.esayeas@protonmail.com", - "homepage": "https://github.com/ghostwriter", - "role": "Lead Developer" + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], + "description": "Config injector and configuration mutator", + "homepage": "https://spiral.dev", "support": { - "docs": "https://docs.mockery.io/", - "issues": "https://github.com/mockery/mockery/issues", - "rss": "https://github.com/mockery/mockery/releases.atom", - "security": "https://github.com/mockery/mockery/security/advisories", - "source": "https://github.com/mockery/mockery" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/config" }, - "time": "2024-05-16T03:13:13+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:08:06+00:00" }, { - "name": "nesbot/carbon", - "version": "2.73.0", + "name": "spiral/console", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075" + "url": "https://github.com/spiral/console.git", + "reference": "262d0691947f9264b2f2fc8b983879e82403eda8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075", - "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075", + "url": "https://api.github.com/repos/spiral/console/zipball/262d0691947f9264b2f2fc8b983879e82403eda8", + "reference": "262d0691947f9264b2f2fc8b983879e82403eda8", "shasum": "" }, "require": { - "carbonphp/carbon-doctrine-types": "*", - "ext-json": "*", - "php": "^7.1.8 || ^8.0", - "psr/clock": "^1.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" - }, - "provide": { - "psr/clock-implementation": "1.0" + "php": ">=8.1", + "spiral/core": "^3.17", + "spiral/events": "^3.17", + "spiral/hmvc": "^3.17", + "spiral/tokenizer": "^3.17", + "symfony/console": "^6.4.30 || ^7.4 || ^8.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", - "doctrine/orm": "^2.7 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "ondrejmirtes/better-reflection": "<6", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.99 || ^1.7.14", - "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", - "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", - "squizlabs/php_codesniffer": "^3.4" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "spiral/boot": "^3.17", + "vimeo/psalm": "^6.0" }, - "bin": [ - "bin/carbon" - ], "type": "library", "extra": { - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - }, "branch-alias": { - "dev-2.x": "2.x-dev", - "dev-master": "3.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "Spiral\\Console\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -7556,138 +6467,163 @@ ], "authors": [ { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" }, { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", - "keywords": [ - "date", - "datetime", - "time" - ], + "description": "Console Core, Auto-Discovery, Command Sequencing", + "homepage": "https://spiral.dev", "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/console" }, "funding": [ { - "url": "https://github.com/sponsors/kylekatarnls", + "url": "https://github.com/sponsors/spiral", "type": "github" - }, - { - "url": "https://opencollective.com/Carbon#sponsor", - "type": "opencollective" - }, - { - "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", - "type": "tidelift" } ], - "time": "2025-01-08T20:10:23+00:00" + "time": "2026-06-03T10:05:01+00:00" }, { - "name": "netresearch/jsonmapper", - "version": "v4.5.0", + "name": "spiral/cycle-bridge", + "version": "v2.13.0", "source": { "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" + "url": "https://github.com/spiral/cycle-bridge.git", + "reference": "24c6f83b208f8bda06af67b2e55f72bb1ad12833" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "url": "https://api.github.com/repos/spiral/cycle-bridge/zipball/24c6f83b208f8bda06af67b2e55f72bb1ad12833", + "reference": "24c6f83b208f8bda06af67b2e55f72bb1ad12833", "shasum": "" }, "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" + "cycle/annotated": "^4.4.0", + "cycle/migrations": "^4.2.6", + "cycle/orm": "^2.12.0", + "cycle/schema-builder": "^2.11.2", + "cycle/schema-migrations-generator": "^2.3", + "cycle/schema-renderer": "^1.4", + "doctrine/inflector": "^1.4 || ^2.0.10", + "php": ">=8.1", + "psr/container": "^1.1 || ^2.0.2", + "spiral/attributes": "^2.10 || ^3.1.8", + "spiral/auth": "^3.15", + "spiral/boot": "^3.15", + "spiral/config": "^3.15", + "spiral/console": "^3.15", + "spiral/core": "^3.15", + "spiral/data-grid-bridge": "^3.0.1", + "spiral/filters": "^3.15", + "spiral/prototype": "^3.15", + "spiral/reactor": "^3.15", + "spiral/scaffolder": "^3.15", + "spiral/tokenizer": "^3.15" }, "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", - "squizlabs/php_codesniffer": "~3.5" + "cycle/entity-behavior": "^1.3.1", + "doctrine/collections": "^2.2.2", + "illuminate/collections": "^10.48 || ^11.0", + "infection/infection": "^0.29.9", + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^9.6.22", + "spiral-packages/database-seeder": "^3.3", + "spiral/code-style": "^2.2.2", + "spiral/framework": "^3.15.1", + "spiral/nyholm-bridge": "^1.3", + "spiral/testing": "^2.9", + "spiral/validator": "^1.5.4", + "vimeo/psalm": "^6.4" }, "type": "library", "autoload": { - "psr-0": { - "JsonMapper": "src/" + "psr-4": { + "Spiral\\Cycle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "OSL-3.0" + "MIT" ], "authors": [ { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" } ], - "description": "Map nested JSON structures onto PHP classes", + "description": "Cycle ORM integration package", + "homepage": "https://spiral.dev", "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/cycle-bridge" }, - "time": "2024-09-08T10:13:13+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2025-12-12T19:56:43+00:00" }, { - "name": "nunomaduro/termwind", - "version": "v1.17.0", + "name": "spiral/data-grid", + "version": "v3.0.1", "source": { "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301" + "url": "https://github.com/spiral/data-grid.git", + "reference": "6718350c8f8d49483442f04f50f293c069f5fc78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/5369ef84d8142c1d87e4ec278711d4ece3cbf301", - "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301", + "url": "https://api.github.com/repos/spiral/data-grid/zipball/6718350c8f8d49483442f04f50f293c069f5fc78", + "reference": "6718350c8f8d49483442f04f50f293c069f5fc78", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": "^8.1", - "symfony/console": "^6.4.15" + "php": ">=8.1", + "spiral/attributes": "^3.0" }, "require-dev": { - "illuminate/console": "^10.48.24", - "illuminate/support": "^10.48.24", - "laravel/pint": "^1.18.2", - "pestphp/pest": "^2.36.0", - "pestphp/pest-plugin-mock": "2.0.0", - "phpstan/phpstan": "^1.12.11", - "phpstan/phpstan-strict-rules": "^1.6.1", - "symfony/var-dumper": "^6.4.15", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" + "phpunit/phpunit": "^9.5.20", + "ramsey/uuid": "^4.2.3", + "rector/rector": "^2.1.2", + "spiral/code-style": "^2.2.2", + "vimeo/psalm": "^4.27" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] + "branch-alias": { + "dev-3.0": "3.0.x-dev" } }, "autoload": { "files": [ - "src/Functions.php" + "src/helpers.php" ], "psr-4": { - "Termwind\\": "src/" + "Spiral\\DataGrid\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -7696,69 +6632,58 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Its like Tailwind CSS, but for the console.", - "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" - ], - "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.17.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" + "name": "Valentin Vintsukevich (vvval)", + "email": "valentin@spiralscout.com" }, { - "url": "https://github.com/xiCO2k", - "type": "github" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" } ], - "time": "2024-11-21T10:36:35+00:00" + "description": "Data Grid specification builder", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/data-grid" + }, + "time": "2025-07-27T09:23:44+00:00" }, { - "name": "ondram/ci-detector", - "version": "4.2.0", + "name": "spiral/data-grid-bridge", + "version": "v3.0.1", "source": { "type": "git", - "url": "https://github.com/OndraM/ci-detector.git", - "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" + "url": "https://github.com/spiral/data-grid-bridge.git", + "reference": "29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", - "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "url": "https://api.github.com/repos/spiral/data-grid-bridge/zipball/29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584", + "reference": "29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "ext-json": "*", + "php": ">=8.1", + "spiral/attributes": "^2.10 || ^3.0", + "spiral/boot": "^3.0", + "spiral/data-grid": "^3.0", + "spiral/http": "^3.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.13.2", - "lmc/coding-standard": "^3.0.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "^1.2.0", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpunit/phpunit": "^9.6.13" + "phpunit/phpunit": "^9.5.20", + "spiral/hmvc": "^3.0", + "vimeo/psalm": "^4.27" }, "type": "library", + "extra": { + "branch-alias": { + "dev-3.0": "3.0.x-dev" + } + }, "autoload": { "psr-4": { - "OndraM\\CiDetector\\": "src/" + "Spiral\\DataGrid\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -7767,260 +6692,197 @@ ], "authors": [ { - "name": "Ondล™ej Machulda", - "email": "ondrej.machulda@gmail.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" } ], - "description": "Detect continuous integration environment and provide unified access to properties of current build", - "keywords": [ - "CircleCI", - "Codeship", - "Wercker", - "adapter", - "appveyor", - "aws", - "aws codebuild", - "azure", - "azure devops", - "azure pipelines", - "bamboo", - "bitbucket", - "buddy", - "ci-info", - "codebuild", - "continuous integration", - "continuousphp", - "devops", - "drone", - "github", - "gitlab", - "interface", - "jenkins", - "pipelines", - "sourcehut", - "teamcity", - "travis" - ], + "description": "Data Grid specification builder adapter for Spiral Framework", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/OndraM/ci-detector/issues", - "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/data-grid-bridge" }, - "time": "2024-03-12T13:22:30+00:00" + "time": "2022-09-14T18:48:30+00:00" }, { - "name": "phar-io/manifest", - "version": "2.0.4", + "name": "spiral/debug", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" + "url": "https://github.com/spiral/debug.git", + "reference": "296948fa1d8a1465457151055f8d2d020e85767d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", + "url": "https://api.github.com/repos/spiral/debug/zipball/296948fa1d8a1465457151055f8d2d020e85767d", + "reference": "296948fa1d8a1465457151055f8d2d020e85767d", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" + "php": ">=8.1", + "spiral/logger": "^3.17" + }, + "require-dev": { + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spiral\\Debug\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" }, { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "description": "Debug Toolkit: Log factory interface, variable dumper, benchmarker", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/debug" }, "funding": [ { - "url": "https://github.com/theseer", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2024-03-03T12:33:53+00:00" + "time": "2026-06-03T10:08:25+00:00" }, { - "name": "phar-io/version", - "version": "3.2.1", + "name": "spiral/events", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + "url": "https://github.com/spiral/events.git", + "reference": "5aa128c28754c902c918d48d71b8de002a380e28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "url": "https://api.github.com/repos/spiral/events/zipball/5aa128c28754c902c918d48d71b8de002a380e28", + "reference": "5aa128c28754c902c918d48d71b8de002a380e28", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=8.1", + "psr/event-dispatcher": "^1.0", + "spiral/attributes": "^2.8|^3.0", + "spiral/tokenizer": "^3.17" + }, + "require-dev": { + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "spiral/boot": "^3.17", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spiral\\Events\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" }, { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Library for handling version information and constraints", + "description": "Spiral Framework: PSR-14 Event Dispatcher", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "php-cs-fixer/shim", - "version": "v3.86.0", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/shim.git", - "reference": "b43770ec215a30afff187ac273da6b43575c0ae3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/b43770ec215a30afff187ac273da6b43575c0ae3", - "reference": "b43770ec215a30afff187ac273da6b43575c0ae3", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" - }, - "replace": { - "friendsofphp/php-cs-fixer": "self.version" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters." + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/events" }, - "bin": [ - "php-cs-fixer", - "php-cs-fixer.phar" - ], - "type": "application", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, + "funding": [ { - "name": "Dariusz Rumiล„ski", - "email": "dariusz.ruminski@gmail.com" + "url": "https://github.com/sponsors/spiral", + "type": "github" } ], - "description": "A tool to automatically fix PHP code style", - "support": { - "issues": "https://github.com/PHP-CS-Fixer/shim/issues", - "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.86.0" - }, - "time": "2025-08-13T22:37:38+00:00" + "time": "2026-06-03T10:05:50+00:00" }, { - "name": "php-http/message", - "version": "1.16.2", + "name": "spiral/exceptions", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" + "url": "https://github.com/spiral/exceptions.git", + "reference": "cb769773eef771060826f4738d26c2c125ff5497" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", - "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "url": "https://api.github.com/repos/spiral/exceptions/zipball/cb769773eef771060826f4738d26c2c125ff5497", + "reference": "cb769773eef771060826f4738d26c2c125ff5497", "shasum": "" }, "require": { - "clue/stream-filter": "^1.5", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" + "codedungeon/php-cli-colors": "^1.11", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "psr/log": "1 - 3", + "spiral/debug": "^3.17" }, "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0 || ^2.0", - "laminas/laminas-diactoros": "^2.0 || ^3.0", - "php-http/message-factory": "^1.0.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "slim/slim": "^3.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { - "files": [ - "src/filters.php" - ], "psr-4": { - "Http\\Message\\": "src/" + "Spiral\\Exceptions\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8029,49 +6891,67 @@ ], "authors": [ { - "name": "Mรกrk Sรกgi-Kazรกr", - "email": "mark.sagikazar@gmail.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", - "keywords": [ - "http", - "message", - "psr-7" - ], + "description": "Exceptions Toolkit: exception and error handler, CLI and HTML renderer", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.2" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/exceptions" }, - "time": "2024-10-02T11:34:13+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:04:49+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "name": "spiral/files", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "url": "https://github.com/spiral/files.git", + "reference": "cf1eb3f5e302598a71b287c2534aa1b60e188149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/spiral/files/zipball/cf1eb3f5e302598a71b287c2534aa1b60e188149", + "reference": "cf1eb3f5e302598a71b287c2534aa1b60e188149", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=8.1" + }, + "require-dev": { + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src/" + "Spiral\\Files\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8080,66 +6960,76 @@ ], "authors": [ { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], + "description": "File Toolkit: atomic file manager", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/files" }, - "time": "2020-06-27T09:03:43+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-01-19T11:05:57+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.6.3", + "name": "spiral/filters", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9" + "url": "https://github.com/spiral/filters.git", + "reference": "8b5f471db1f78445ca36f8b569c1270cb6976e5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9", - "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9", + "url": "https://api.github.com/repos/spiral/filters/zipball/8b5f471db1f78445ca36f8b569c1270cb6976e5a", + "reference": "8b5f471db1f78445ca36f8b569c1270cb6976e5a", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.1", - "ext-filter": "*", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" + "php": ">=8.1", + "psr/http-message": "^1.0|^2.0", + "spiral/attributes": "^2.8|^3.0", + "spiral/auth": "^3.17", + "spiral/core": "^3.17", + "spiral/hmvc": "^3.17", + "spiral/models": "^3.17", + "spiral/validation": "^3.17" }, "require-dev": { - "mockery/mockery": "~1.3.5 || ~1.6.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" + "mockery/mockery": "^1.6.12", + "nyholm/psr7": "^1.8", + "phpunit/phpunit": "^10.5.41", + "ramsey/uuid": "^4.7", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "Spiral\\Filters\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8148,60 +7038,79 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" }, { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "description": "Deep Structural Validation, Data Mapper, Inheritance", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/filters" }, - "time": "2025-08-01T19:43:32+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:09:04+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.10.0", + "name": "spiral/http", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + "url": "https://github.com/spiral/http.git", + "reference": "467cc92674ce003abfdf147e9186a032e363dc2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "url": "https://api.github.com/repos/spiral/http/zipball/467cc92674ce003abfdf147e9186a032e363dc2b", + "reference": "467cc92674ce003abfdf147e9186a032e363dc2b", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-middleware": "^1.0", + "spiral/core": "^3.17", + "spiral/files": "^3.17", + "spiral/streams": "^3.17", + "spiral/telemetry": "^3.17" }, "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" + "mockery/mockery": "^1.6.12", + "nyholm/psr7": "^1.8", + "phpunit/phpunit": "^10.5.41", + "spiral/boot": "^3.17", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "Spiral\\Http\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8210,594 +7119,662 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "description": "HTTP Request pipeline", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/http" }, - "time": "2024-11-09T15:12:26+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:06:46+00:00" }, { - "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "name": "spiral/logger", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "url": "https://github.com/spiral/logger.git", + "reference": "bbb7a2f5dc27f6e7c06de48e904d5f7d2aadc9a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/spiral/logger/zipball/bbb7a2f5dc27f6e7c06de48e904d5f7d2aadc9a8", + "reference": "bbb7a2f5dc27f6e7c06de48e904d5f7d2aadc9a8", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": ">=8.1", + "psr/log": "1 - 3", + "spiral/core": "^3.17" }, "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" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] + "Spiral\\Logger\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "LogFactory and global log listeners", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/logger" }, - "time": "2025-08-30T15:50:23+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:06:03+00:00" }, { - "name": "phpstan/phpstan", - "version": "1.12.28", + "name": "spiral/models", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "fcf8b71aeab4e1a1131d1783cef97b23a51b87a9" + "url": "https://github.com/spiral/models.git", + "reference": "7fdd7a6514f498b2b85f74380109140f40ff9021" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/fcf8b71aeab4e1a1131d1783cef97b23a51b87a9", - "reference": "fcf8b71aeab4e1a1131d1783cef97b23a51b87a9", + "url": "https://api.github.com/repos/spiral/models/zipball/7fdd7a6514f498b2b85f74380109140f40ff9021", + "reference": "7fdd7a6514f498b2b85f74380109140f40ff9021", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": ">=8.1" }, - "conflict": { - "phpstan/phpstan-shim": "*" + "require-dev": { + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "vimeo/psalm": "^6.0" }, - "bin": [ - "phpstan", - "phpstan.phar" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.17.x-dev" + } + }, "autoload": { - "files": [ - "bootstrap.php" - ] + "psr-4": { + "Spiral\\Models\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } ], + "description": "DataEntity models", + "homepage": "https://spiral.dev", "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/spiral/framework/issues", + "source": "https://github.com/spiral/models" }, "funding": [ { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2025-07-17T17:15:39+00:00" + "time": "2026-01-19T11:08:38+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", + "name": "spiral/prototype", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + "url": "https://github.com/spiral/prototype.git", + "reference": "d25c351c7d853af3111b7e3833c58646f9b23b09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "url": "https://api.github.com/repos/spiral/prototype/zipball/d25c351c7d853af3111b7e3833c58646f9b23b09", + "reference": "d25c351c7d853af3111b7e3833c58646f9b23b09", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "nikic/php-parser": "^5.4", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" + "spiral/attributes": "^2.8|^3.0", + "spiral/config": "^3.17", + "spiral/reactor": "^3.17" }, "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "mockery/mockery": "^1.6.12", + "nyholm/psr7": "^1.8", + "phpunit/phpunit": "^10.5.41", + "spiral/dumper": "^3.3", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1.x-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spiral\\Prototype\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], + "description": "Automatic dependency injection", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/prototype" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2024-08-22T04:31:57+00:00" + "time": "2026-06-03T10:04:47+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", + "name": "spiral/reactor", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + "url": "https://github.com/spiral/reactor.git", + "reference": "682f2e599862480333f7f49c50f04e2c9241edb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "url": "https://api.github.com/repos/spiral/reactor/zipball/682f2e599862480333f7f49c50f04e2c9241edb1", + "reference": "682f2e599862480333f7f49c50f04e2c9241edb1", "shasum": "" }, "require": { - "php": ">=8.1" + "doctrine/inflector": "^1.4|^2.0", + "nette/php-generator": "^4.1.7", + "php": ">=8.1", + "spiral/files": "^3.17" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "psr/container": "^1.1|^2.0", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spiral\\Reactor\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], + "description": "Reactor: Code Scaffolding", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/reactor" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2023-08-31T06:24:48+00:00" + "time": "2026-06-03T10:06:32+00:00" }, { - "name": "phpunit/php-invoker", - "version": "4.0.0", + "name": "spiral/scaffolder", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + "url": "https://github.com/spiral/scaffolder.git", + "reference": "b2335db34baca2daed4771157c972be7818701bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "url": "https://api.github.com/repos/spiral/scaffolder/zipball/b2335db34baca2daed4771157c972be7818701bc", + "reference": "b2335db34baca2daed4771157c972be7818701bc", "shasum": "" }, "require": { - "php": ">=8.1" + "cocur/slugify": "^3.2 || ^4.0", + "doctrine/inflector": "^1.4|^2.0", + "nette/php-generator": "^4.1.7", + "php": ">=8.1", + "spiral/reactor": "^3.17" }, "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" + "phpunit/phpunit": "^10.5.41", + "spiral/framework": "^3.1", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spiral\\Scaffolder\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Valentin Vintsukevich (vvval)", + "email": "valentin@spiralscout.com" } ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "description": "Spiral, Code Scaffolding module", + "homepage": "https://spiral.dev", "keywords": [ - "process" + "scaffolding" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/scaffolder" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2023-02-03T06:56:09+00:00" + "time": "2026-06-03T10:07:50+00:00" }, { - "name": "phpunit/php-text-template", - "version": "3.0.1", + "name": "spiral/streams", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + "url": "https://github.com/spiral/streams.git", + "reference": "29832b95222b27dc74859da53d6bc8d4da5fcb9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "url": "https://api.github.com/repos/spiral/streams/zipball/29832b95222b27dc74859da53d6bc8d4da5fcb9b", + "reference": "29832b95222b27dc74859da53d6bc8d4da5fcb9b", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "psr/http-message": "^1.0|^2.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "mockery/mockery": "^1.6.12", + "nyholm/psr7": "^1.8", + "phpunit/phpunit": "^10.5.41", + "spiral/files": "^3.17", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spiral\\Streams\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], + "description": "PSR-7 Stream Wrappers", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/streams" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2026-06-03T10:08:56+00:00" }, { - "name": "phpunit/php-timer", - "version": "6.0.0", + "name": "spiral/telemetry", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "url": "https://github.com/spiral/telemetry.git", + "reference": "683e17b309eb4f0b1e720f3fd693764e37f87aa1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/spiral/telemetry/zipball/683e17b309eb4f0b1e720f3fd693764e37f87aa1", + "reference": "683e17b309eb4f0b1e720f3fd693764e37f87aa1", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "spiral/boot": "^3.17", + "spiral/core": "^3.17" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "spiral/testing": "^2.12", + "vimeo/psalm": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spiral\\Telemetry\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], + "description": "Telemetry is a collection of tools to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) to help you analyze your softwareโ€™s performance and behavior.", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/telemetry" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/sponsors/spiral", "type": "github" } ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2026-06-03T10:08:52+00:00" }, { - "name": "phpunit/phpunit", - "version": "10.5.53", + "name": "spiral/tokenizer", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "32768472ebfb6969e6c7399f1c7b09009723f653" + "url": "https://github.com/spiral/tokenizer.git", + "reference": "118c5b352cc343d81a1daa117dcd2fd80692523f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/32768472ebfb6969e6c7399f1c7b09009723f653", - "reference": "32768472ebfb6969e6c7399f1c7b09009723f653", + "url": "https://api.github.com/repos/spiral/tokenizer/zipball/118c5b352cc343d81a1daa117dcd2fd80692523f", + "reference": "118c5b352cc343d81a1daa117dcd2fd80692523f", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", + "ext-tokenizer": "*", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.3", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.2", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.1", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" + "spiral/core": "^3.17", + "spiral/logger": "^3.17", + "symfony/finder": "^6.4.30 || ^7.4 || ^8.0" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "require-dev": { + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "spiral/attributes": "^2.8|^3.0", + "spiral/boot": "^3.17", + "spiral/files": "^3.17", + "vimeo/psalm": "^6.0" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-main": "10.5-dev" + "dev-master": "3.17.x-dev" } }, "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] + "psr-4": { + "Spiral\\Tokenizer\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], + "description": "Static Analysis: Class and Invocation locators", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.53" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/tokenizer" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/sponsors/spiral", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" } ], - "time": "2025-08-20T14:40:06+00:00" + "time": "2026-06-03T10:08:42+00:00" }, { - "name": "psalm/plugin-phpunit", - "version": "0.19.3", + "name": "spiral/validation", + "version": "3.17.0", "source": { "type": "git", - "url": "https://github.com/psalm/psalm-plugin-phpunit.git", - "reference": "07dbf9fec23a694f2c095d8e2d44ccd6992afe38" + "url": "https://github.com/spiral/validation.git", + "reference": "bc6faa890f3241cb7f13a531b1ea6b1e087b2297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/07dbf9fec23a694f2c095d8e2d44ccd6992afe38", - "reference": "07dbf9fec23a694f2c095d8e2d44ccd6992afe38", + "url": "https://api.github.com/repos/spiral/validation/zipball/bc6faa890f3241cb7f13a531b1ea6b1e087b2297", + "reference": "bc6faa890f3241cb7f13a531b1ea6b1e087b2297", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.10", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "ext-simplexml": "*", "php": ">=8.1", - "vimeo/psalm": "dev-master || ^6 || ^7" - }, - "conflict": { - "phpunit/phpunit": "<7.5" + "spiral/core": "^3.17" }, "require-dev": { - "behat/gherkin": "~4.11.0", - "codeception/codeception": "^4.0.3", - "php": "^7.3 || ^8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.3.1", - "weirdan/codeception-psalm-module": "^0.11.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "type": "psalm-plugin", + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.41", + "spiral/boot": "^3.17", + "vimeo/psalm": "^6.0" + }, + "type": "library", "extra": { - "psalm": { - "pluginClass": "Psalm\\PhpUnitPlugin\\Plugin" + "branch-alias": { + "dev-master": "3.17.x-dev" } }, "autoload": { "psr-4": { - "Psalm\\PhpUnitPlugin\\": "src" + "Spiral\\Validation\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8806,39 +7783,69 @@ ], "authors": [ { - "name": "Matt Brown", - "email": "github@muglug.com" + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "homepage": "https://github.com/butschster" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" } ], - "description": "Psalm plugin for PHPUnit", + "description": "Nested validation, Checkers, Conditional Validation", + "homepage": "https://spiral.dev", "support": { - "issues": "https://github.com/psalm/psalm-plugin-phpunit/issues", - "source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.19.3" + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/validation" }, - "time": "2025-03-20T11:21:58+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2026-06-03T10:08:18+00:00" }, { - "name": "psr/clock", - "version": "1.0.0", + "name": "symfony/clock", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/symfony/clock.git", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "type": "library", "autoload": { + "files": [ + "Resources/now.php" + ], "psr-4": { - "Psr\\Clock\\": "src/" - } + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8846,117 +7853,173 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", "keywords": [ "clock", - "now", - "psr", - "psr-20", + "psr20", "time" ], "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" + "source": "https://github.com/symfony/clock/tree/v7.4.8" }, - "time": "2022-11-25T14:36:26+00:00" + "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-24T13:12:05+00:00" }, { - "name": "rector/rector", - "version": "1.2.10", + "name": "symfony/console", + "version": "v7.4.13", "source": { "type": "git", - "url": "https://github.com/rectorphp/rector.git", - "reference": "40f9cf38c05296bd32f444121336a521a293fa61" + "url": "https://github.com/symfony/console.git", + "reference": "85095d2573eaefaf35e40b9513a9bf09f72cd217" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", - "reference": "40f9cf38c05296bd32f444121336a521a293fa61", + "url": "https://api.github.com/repos/symfony/console/zipball/85095d2573eaefaf35e40b9513a9bf09f72cd217", + "reference": "85095d2573eaefaf35e40b9513a9bf09f72cd217", "shasum": "" }, "require": { - "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.12.5" + "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": { - "rector/rector-doctrine": "*", - "rector/rector-downgrade-php": "*", - "rector/rector-phpunit": "*", - "rector/rector-symfony": "*" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, - "suggest": { - "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + "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" }, - "bin": [ - "bin/rector" - ], "type": "library", "autoload": { - "files": [ - "bootstrap.php" + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "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": [ - "automation", - "dev", - "migration", - "refactoring" + "cli", + "command-line", + "console", + "terminal" ], "support": { - "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.2.10" + "source": "https://github.com/symfony/console/tree/v7.4.13" }, "funding": [ { - "url": "https://github.com/tomasvotruba", + "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-11-08T13:59:10+00:00" + "time": "2026-05-24T08:56:14+00:00" }, { - "name": "revolt/event-loop", - "version": "v1.0.7", + "name": "symfony/deprecation-contracts", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/revoltphp/event-loop.git", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", "shasum": "" }, "require": { "php": ">=8.1" }, - "require-dev": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" - }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-main": "1.x-dev" + "dev-main": "3.7-dev" } }, "autoload": { - "psr-4": { - "Revolt\\": "src" - } + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8964,886 +8027,1129 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Christian Lรผck", - "email": "christian@clue.engineering" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Rock-solid event loop for concurrent PHP applications.", - "keywords": [ - "async", - "asynchronous", - "concurrency", - "event", - "event-loop", - "non-blocking", - "scheduler" - ], - "support": { - "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7" - }, - "time": "2025-01-25T19:27:39+00:00" + "time": "2026-04-13T15:52:40+00:00" }, { - "name": "sanmai/later", - "version": "0.1.5", + "name": "symfony/filesystem", + "version": "v7.4.11", "source": { "type": "git", - "url": "https://github.com/sanmai/later.git", - "reference": "cf5164557d19930295892094996f049ea12ba14d" + "url": "https://github.com/symfony/filesystem.git", + "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/later/zipball/cf5164557d19930295892094996f049ea12ba14d", - "reference": "cf5164557d19930295892094996f049ea12ba14d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d721ea61b4a5fba8c5b6e7c1feda19efea144b50", + "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50", "shasum": "" }, "require": { - "php": ">=7.4" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^3.35.1", - "infection/infection": ">=0.27.6", - "phan/phan": ">=2", - "php-coveralls/php-coveralls": "^2.0", - "phpstan/phpstan": ">=1.4.5", - "phpunit/phpunit": ">=9.5 <10", - "vimeo/psalm": ">=2" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.1.x-dev" - } + "require-dev": { + "symfony/process": "^6.4|^7.0|^8.0" }, + "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Later\\": "src/" - } + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { - "name": "Alexey Kopytko", - "email": "alexey@kopytko.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Later: deferred wrapper object", + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sanmai/later/issues", - "source": "https://github.com/sanmai/later/tree/0.1.5" + "source": "https://github.com/symfony/filesystem/tree/v7.4.11" }, "funding": [ { - "url": "https://github.com/sanmai", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-12-06T02:36:26+00:00" + "time": "2026-05-11T16:38:44+00:00" }, { - "name": "sanmai/pipeline", - "version": "6.12", + "name": "symfony/finder", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/sanmai/pipeline.git", - "reference": "ad7dbc3f773eeafb90d5459522fbd8f188532e25" + "url": "https://github.com/symfony/finder.git", + "reference": "e0be088d22278583a82da281886e8c3592fbf149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/pipeline/zipball/ad7dbc3f773eeafb90d5459522fbd8f188532e25", - "reference": "ad7dbc3f773eeafb90d5459522fbd8f188532e25", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": ">=8.2" }, "require-dev": { - "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^3.17", - "infection/infection": ">=0.10.5", - "league/pipeline": "^0.3 || ^1.0", - "phan/phan": ">=1.1", - "php-coveralls/php-coveralls": "^2.4.1", - "phpstan/phpstan": ">=0.10", - "phpunit/phpunit": ">=9.4", - "vimeo/psalm": ">=2" + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v6.x-dev" - } - }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Pipeline\\": "src/" - } + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { - "name": "Alexey Kopytko", - "email": "alexey@kopytko.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "General-purpose collections pipeline", + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sanmai/pipeline/issues", - "source": "https://github.com/sanmai/pipeline/tree/6.12" + "source": "https://github.com/symfony/finder/tree/v7.4.8" }, "funding": [ { - "url": "https://github.com/sanmai", + "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-10-17T02:22:57+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { - "name": "sebastian/cli-parser", - "version": "2.0.1", + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.0-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-03-02T07:12:49+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { - "name": "sebastian/code-unit", - "version": "2.0.0", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.38.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.0-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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": "2023-02-03T06:58:43+00:00" + "time": "2026-05-26T05:58:03+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.38.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.0-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ - "src/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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": "2023-02-03T06:59:15+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { - "name": "sebastian/comparator", - "version": "5.0.3", + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" + "ext-iconv": "*", + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^10.5" + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "5.0-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", "keywords": [ - "comparator", - "compare", - "equality" + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-10-18T14:56:07+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { - "name": "sebastian/complexity", - "version": "3.2.0", + "name": "symfony/polyfill-php84", + "version": "v1.38.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.2-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, "classmap": [ - "src/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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": "2023-12-21T08:37:17+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { - "name": "sebastian/diff", - "version": "5.1.1", + "name": "symfony/polyfill-php85", + "version": "v1.38.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "5.1-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, "classmap": [ - "src/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-03-02T07:15:17+00:00" + "time": "2026-05-26T02:25:22+00:00" }, { - "name": "sebastian/environment", - "version": "6.1.0", + "name": "symfony/process", + "version": "v7.4.13", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + "url": "https://github.com/symfony/process.git", + "reference": "f5804be144caceb570f6747519999636b664f24c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", + "reference": "f5804be144caceb570f6747519999636b664f24c", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" + "php": ">=8.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + "source": "https://github.com/symfony/process/tree/v7.4.13" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-03-23T08:47:14+00:00" + "time": "2026-05-23T16:05:06+00:00" }, { - "name": "sebastian/exporter", - "version": "5.1.2", + "name": "symfony/service-contracts", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", "shasum": "" }, "require": { - "ext-mbstring": "*", "php": ">=8.1", - "sebastian/recursion-context": "^5.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "3.7-dev" } }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", "keywords": [ - "export", - "exporter" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-03-02T07:17:12+00:00" + "time": "2026-03-28T09:44:51+00:00" }, { - "name": "sebastian/global-state", - "version": "6.0.2", + "name": "symfony/string", + "version": "v7.4.13", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + "url": "https://github.com/symfony/string.git", + "reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "url": "https://api.github.com/repos/symfony/string/zipball/961683010db3b27ec6ebcd7308e6e1ee8fa7ffde", + "reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", + "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": [ - "global state" + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + "source": "https://github.com/symfony/string/tree/v7.4.13" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-03-02T07:19:19+00:00" + "time": "2026-05-23T15:23:29+00:00" }, { - "name": "sebastian/lines-of-code", - "version": "2.0.2", + "name": "symfony/translation", + "version": "v7.4.10", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + "url": "https://github.com/symfony/translation.git", + "reference": "ada7578c30dd5feaa8259cff3e885069ea81ddde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "url": "https://api.github.com/repos/symfony/translation/zipball/ada7578c30dd5feaa8259cff3e885069ea81ddde", + "reference": "ada7578c30dd5feaa8259cff3e885069ea81ddde", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + "source": "https://github.com/symfony/translation/tree/v7.4.10" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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": "2023-12-21T08:38:20+00:00" + "time": "2026-05-06T11:19:24+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "5.0.0", + "name": "symfony/translation-contracts", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/0ab302977a952b42fd51475c4ebac81f8da0a95d", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "php": ">=8.1" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "3.7-dev" } }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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": "2023-02-03T07:08:32+00:00" + "time": "2026-01-05T13:30:16+00:00" }, { - "name": "sebastian/object-reflector", - "version": "3.0.0", + "name": "testo/assert", + "version": "0.1.8", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + "url": "https://github.com/php-testo/assert.git", + "reference": "edbbf1bbc7f7a5977d5229250bff21be04adf575" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "url": "https://api.github.com/repos/php-testo/assert/zipball/edbbf1bbc7f7a5977d5229250bff21be04adf575", + "reference": "edbbf1bbc7f7a5977d5229250bff21be04adf575", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "php": ">=8.2", + "testo/testo": "0.10.24 - 1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "Assert.php", + "Expect.php" + ], + "psr-4": { + "Testo\\Assert\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9851,54 +9157,59 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "description": "Assert plugin for the Testo testing framework.", + "keywords": [ + "assert", + "testo" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + "source": "https://github.com/php-testo/assert/tree/0.1.8" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2023-02-03T07:06:18+00:00" + "time": "2026-06-19T08:28:23+00:00" }, { - "name": "sebastian/recursion-context", - "version": "5.0.1", + "name": "testo/bench", + "version": "0.1.5", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" + "url": "https://github.com/php-testo/bench.git", + "reference": "6691cee75e2bb1d207b3bfa261e830e69f9d2cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", + "url": "https://api.github.com/repos/php-testo/bench/zipball/6691cee75e2bb1d207b3bfa261e830e69f9d2cdf", + "reference": "6691cee75e2bb1d207b3bfa261e830e69f9d2cdf", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" + "php": ">=8.2", + "testo/data": "^0.1.6", + "testo/inline": "^0.1.5", + "testo/testo": "0.10.19 - 1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "Bench.php" + ], + "psr-4": { + "Testo\\Bench\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9906,75 +9217,58 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", + "description": "Benchmark plugin for the Testo testing framework.", + "keywords": [ + "benchmark", + "testo" + ], "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" + "source": "https://github.com/php-testo/bench/tree/0.1.5" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", - "type": "tidelift" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-08-10T07:50:56+00:00" + "time": "2026-06-07T19:39:00+00:00" }, { - "name": "sebastian/type", - "version": "4.0.0", + "name": "testo/bridge-infection", + "version": "0.1.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + "url": "https://github.com/php-testo/bridge-infection.git", + "reference": "3256d2e9cb5ae7e15f89d9ccb537c23e2510d806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "url": "https://api.github.com/repos/php-testo/bridge-infection/zipball/3256d2e9cb5ae7e15f89d9ccb537c23e2510d806", + "reference": "3256d2e9cb5ae7e15f89d9ccb537c23e2510d806", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "infection/abstract-testframework-adapter": "^0.5", + "infection/include-interceptor": "^0.2 || ^1.0", + "php": ">=8.2" }, - "type": "library", + "type": "infection-extension", "extra": { + "infection": { + "class": "Testo\\Bridge\\Infection\\TestoAdapterFactory" + }, "branch-alias": { - "dev-main": "4.0-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Testo\\Bridge\\Infection\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9982,52 +9276,59 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "Infection mutation testing adapter for the Testo testing framework.", + "keywords": [ + "Infection", + "mutation testing", + "testo" + ], "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + "source": "https://github.com/php-testo/bridge-infection/tree/0.1.6" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2023-02-03T07:10:45+00:00" + "time": "2026-06-07T19:37:37+00:00" }, { - "name": "sebastian/version", - "version": "4.0.1", + "name": "testo/bridge-symfony-console", + "version": "0.1.7", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + "url": "https://github.com/php-testo/bridge-symfony-console.git", + "reference": "09c1b59d7c94a161ff2df2ecc7223468436e167a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "url": "https://api.github.com/repos/php-testo/bridge-symfony-console/zipball/09c1b59d7c94a161ff2df2ecc7223468436e167a", + "reference": "09c1b59d7c94a161ff2df2ecc7223468436e167a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/console": "^6.4 || ^7 || ^8.0", + "testo/testo": "0.10.24 - 1" }, + "bin": [ + "bin/testo" + ], "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Testo\\Bridge\\Symfony\\Console\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -10035,754 +9336,653 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", + "description": "Symfony Console bridge for the Testo testing framework.", + "keywords": [ + "console", + "symfony", + "testo" + ], "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + "source": "https://github.com/php-testo/bridge-symfony-console/tree/0.1.7" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2023-02-07T11:34:05+00:00" + "time": "2026-06-19T08:28:42+00:00" }, { - "name": "spatie/array-to-xml", - "version": "3.4.0", + "name": "testo/codecov", + "version": "0.1.11", "source": { "type": "git", - "url": "https://github.com/spatie/array-to-xml.git", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67" + "url": "https://github.com/php-testo/codecov.git", + "reference": "cfa3d7cf66318379bac9cb9500b014e61053bfce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", + "url": "https://api.github.com/repos/php-testo/codecov/zipball/cfa3d7cf66318379bac9cb9500b014e61053bfce", + "reference": "cfa3d7cf66318379bac9cb9500b014e61053bfce", "shasum": "" }, "require": { - "ext-dom": "*", - "php": "^8.0" - }, - "require-dev": { - "mockery/mockery": "^1.2", - "pestphp/pest": "^1.21", - "spatie/pest-plugin-snapshots": "^1.1" + "ext-xmlwriter": "*", + "php": ">=8.2", + "testo/data": "^0.1.6", + "testo/inline": "^0.1.5", + "testo/testo": "0.10.26 - 1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { "psr-4": { - "Spatie\\ArrayToXml\\": "src" + "Testo\\Codecov\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://freek.dev", - "role": "Developer" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Convert an array to xml", - "homepage": "https://github.com/spatie/array-to-xml", + "description": "Code coverage plugin for the Testo testing framework.", "keywords": [ - "array", - "convert", - "xml" + "code-coverage", + "testo" ], "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.4.0" + "source": "https://github.com/php-testo/codecov/tree/0.1.11" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2024-12-16T12:45:15+00:00" + "time": "2026-06-21T15:50:34+00:00" }, { - "name": "spiral/code-style", - "version": "v2.3.0", + "name": "testo/convention", + "version": "0.1.3", "source": { "type": "git", - "url": "https://github.com/spiral/code-style.git", - "reference": "d9742a53dbd9ae815054ba5ffc89c8cf92a774fc" + "url": "https://github.com/php-testo/convention.git", + "reference": "b6c75c42db5e84bf446bcabd8c5c19fa37546f23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/code-style/zipball/d9742a53dbd9ae815054ba5ffc89c8cf92a774fc", - "reference": "d9742a53dbd9ae815054ba5ffc89c8cf92a774fc", + "url": "https://api.github.com/repos/php-testo/convention/zipball/b6c75c42db5e84bf446bcabd8c5c19fa37546f23", + "reference": "b6c75c42db5e84bf446bcabd8c5c19fa37546f23", "shasum": "" }, "require": { - "php": ">=8.0", - "php-cs-fixer/shim": "^3.64" - }, - "require-dev": { - "phpunit/phpunit": "^10.5", - "spiral/dumper": "^3.3", - "vimeo/psalm": "^5.26" + "php": ">=8.2", + "testo/testo": "0.10.19 - 1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, "autoload": { "psr-4": { - "Spiral\\CodeStyle\\": "src/" + "Testo\\Convention\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Aleksandr Novikov", - "email": "aleksandr.novikov@spiralscout.com" - }, - { - "name": "Aleksei Gagarin", - "email": "alexey.gagarin@spiralscout.com" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Code style and static analysis tools rulesets collection", - "homepage": "https://github.com/spiral/code-style", + "description": "Naming convention plugin for the Testo testing framework.", + "keywords": [ + "convention", + "testo" + ], "support": { - "source": "https://github.com/spiral/code-style/tree/v2.3.0" + "source": "https://github.com/php-testo/convention/tree/0.1.3" }, "funding": [ { - "url": "https://github.com/sponsors/spiral", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-08-28T07:10:02+00:00" + "time": "2026-06-07T19:36:02+00:00" }, { - "name": "spiral/cycle-bridge", - "version": "v2.11.1", + "name": "testo/data", + "version": "0.1.6", "source": { "type": "git", - "url": "https://github.com/spiral/cycle-bridge.git", - "reference": "0150830ad2002a89b7fc56a711265547287d15c2" + "url": "https://github.com/php-testo/data.git", + "reference": "18f990382cf6e0d39c05ec060de2c4386d2c05de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/cycle-bridge/zipball/0150830ad2002a89b7fc56a711265547287d15c2", - "reference": "0150830ad2002a89b7fc56a711265547287d15c2", + "url": "https://api.github.com/repos/php-testo/data/zipball/18f990382cf6e0d39c05ec060de2c4386d2c05de", + "reference": "18f990382cf6e0d39c05ec060de2c4386d2c05de", "shasum": "" }, "require": { - "cycle/annotated": "^4.2.3", - "cycle/migrations": "^4.2.4", - "cycle/orm": "^2.9.3", - "cycle/schema-builder": "^2.11.1", - "cycle/schema-migrations-generator": "^2.3", - "cycle/schema-renderer": "^1.2", - "doctrine/inflector": "^1.4 || ^2.0.10", - "php": ">=8.1", - "psr/container": "^1.1 || ^2.0.2", - "spiral/attributes": "^2.10 || ^3.1.8", - "spiral/auth": "^3.15", - "spiral/boot": "^3.15", - "spiral/config": "^3.15", - "spiral/console": "^3.15", - "spiral/core": "^3.15", - "spiral/data-grid-bridge": "^3.0.1", - "spiral/filters": "^3.15", - "spiral/prototype": "^3.15", - "spiral/reactor": "^3.15", - "spiral/scaffolder": "^3.15", - "spiral/tokenizer": "^3.15" - }, - "require-dev": { - "cycle/entity-behavior": "^1.3.1", - "doctrine/collections": "^2.2.2", - "illuminate/collections": "^10.48", - "infection/infection": "^0.29.9", - "mockery/mockery": "^1.6.12", - "phpunit/phpunit": "^9.6.22", - "spiral-packages/database-seeder": "^3.3", - "spiral/code-style": "^2.2.2", - "spiral/framework": "^3.15.1", - "spiral/nyholm-bridge": "^1.3", - "spiral/testing": "^2.9", - "spiral/validator": "^1.5.4", - "vimeo/psalm": "^6.4" + "php": ">=8.2", + "testo/filter": "^0.1.2", + "testo/testo": "0.10.19 - 1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, "autoload": { "psr-4": { - "Spiral\\Cycle\\": "src" + "Testo\\Data\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ - { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" - }, - { - "name": "Pavel Buchnev (butschster)", - "email": "pavel.buchnev@spiralscout.com" - }, { "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" + "homepage": "https://github.com/roxblnfk" } ], - "description": "Cycle ORM integration package", - "homepage": "https://spiral.dev", + "description": "Data provider plugin for the Testo testing framework.", + "keywords": [ + "data-provider", + "testo" + ], "support": { - "issues": "https://github.com/spiral/framework/issues", - "source": "https://github.com/spiral/cycle-bridge" + "source": "https://github.com/php-testo/data/tree/0.1.6" }, "funding": [ { - "url": "https://github.com/sponsors/spiral", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-02-07T09:15:21+00:00" + "time": "2026-06-07T19:36:52+00:00" }, { - "name": "spiral/data-grid", - "version": "v3.0.1", + "name": "testo/filter", + "version": "0.1.4", "source": { "type": "git", - "url": "https://github.com/spiral/data-grid.git", - "reference": "6718350c8f8d49483442f04f50f293c069f5fc78" + "url": "https://github.com/php-testo/filter.git", + "reference": "9674b9a0e8cb0c74cf6c3efeb9d2c219c4574a81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/data-grid/zipball/6718350c8f8d49483442f04f50f293c069f5fc78", - "reference": "6718350c8f8d49483442f04f50f293c069f5fc78", + "url": "https://api.github.com/repos/php-testo/filter/zipball/9674b9a0e8cb0c74cf6c3efeb9d2c219c4574a81", + "reference": "9674b9a0e8cb0c74cf6c3efeb9d2c219c4574a81", "shasum": "" }, "require": { - "php": ">=8.1", - "spiral/attributes": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.20", - "ramsey/uuid": "^4.2.3", - "rector/rector": "^2.1.2", - "spiral/code-style": "^2.2.2", - "vimeo/psalm": "^4.27" + "php": ">=8.2", + "testo/testo": "0.10.27 - 1" }, "type": "library", "extra": { "branch-alias": { - "dev-3.0": "3.0.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { "files": [ - "src/helpers.php" + "Filter.php" ], "psr-4": { - "Spiral\\DataGrid\\": "src" + "Testo\\Filter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Valentin Vintsukevich (vvval)", - "email": "valentin@spiralscout.com" - }, - { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Data Grid specification builder", - "homepage": "https://spiral.dev", + "description": "Test filtering plugin for the Testo testing framework.", + "keywords": [ + "filter", + "testo" + ], "support": { - "issues": "https://github.com/spiral/framework/issues", - "source": "https://github.com/spiral/data-grid" + "source": "https://github.com/php-testo/filter/tree/0.1.4" }, - "time": "2025-07-27T09:23:44+00:00" + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-06-24T07:41:49+00:00" }, { - "name": "spiral/data-grid-bridge", - "version": "v3.0.1", + "name": "testo/inline", + "version": "0.1.5", "source": { "type": "git", - "url": "https://github.com/spiral/data-grid-bridge.git", - "reference": "29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584" + "url": "https://github.com/php-testo/inline.git", + "reference": "178cc399f7cd8861a375cc2b77233a5acad0d211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/data-grid-bridge/zipball/29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584", - "reference": "29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584", + "url": "https://api.github.com/repos/php-testo/inline/zipball/178cc399f7cd8861a375cc2b77233a5acad0d211", + "reference": "178cc399f7cd8861a375cc2b77233a5acad0d211", "shasum": "" }, "require": { - "ext-json": "*", - "php": ">=8.1", - "spiral/attributes": "^2.10 || ^3.0", - "spiral/boot": "^3.0", - "spiral/data-grid": "^3.0", - "spiral/http": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.20", - "spiral/hmvc": "^3.0", - "vimeo/psalm": "^4.27" + "php": ">=8.2", + "testo/assert": "^0.1.7", + "testo/data": "^0.1.6", + "testo/filter": "^0.1.2", + "testo/testo": "0.10.19 - 1" }, "type": "library", "extra": { "branch-alias": { - "dev-3.0": "3.0.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { "psr-4": { - "Spiral\\DataGrid\\": "src" + "Testo\\Inline\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Data Grid specification builder adapter for Spiral Framework", - "homepage": "https://spiral.dev", + "description": "Inline test plugin for the Testo testing framework.", + "keywords": [ + "inline", + "testo" + ], "support": { - "issues": "https://github.com/spiral/framework/issues", - "source": "https://github.com/spiral/data-grid-bridge" + "source": "https://github.com/php-testo/inline/tree/0.1.5" }, - "time": "2022-09-14T18:48:30+00:00" + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-06-07T19:36:58+00:00" }, { - "name": "spiral/testing", - "version": "2.9.0", + "name": "testo/lifecycle", + "version": "0.1.4", "source": { "type": "git", - "url": "https://github.com/spiral/testing.git", - "reference": "d7ef7c4011c98206cb90037652a93728ec6aed93" + "url": "https://github.com/php-testo/lifecycle.git", + "reference": "2ccab755eaedb6fa58b3226f7306280e09d8b552" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/testing/zipball/d7ef7c4011c98206cb90037652a93728ec6aed93", - "reference": "d7ef7c4011c98206cb90037652a93728ec6aed93", + "url": "https://api.github.com/repos/php-testo/lifecycle/zipball/2ccab755eaedb6fa58b3226f7306280e09d8b552", + "reference": "2ccab755eaedb6fa58b3226f7306280e09d8b552", "shasum": "" }, "require": { - "ext-json": "*", - "mockery/mockery": "^1.6.12", - "nyholm/psr7": "^1.8.2", - "php": ">=8.1", - "phpunit/phpunit": "^9.6 || ^10.5.44", - "spiral/auth": "^3.15", - "spiral/auth-http": "^3.15", - "spiral/boot": "^3.15", - "spiral/console": "^3.15", - "spiral/core": "^3.15", - "spiral/events": "^3.15", - "spiral/http": "^3.15", - "spiral/mailer": "^3.15", - "spiral/queue": "^3.15", - "spiral/scaffolder": "^3.15", - "spiral/security": "^3.15", - "spiral/session": "^3.15", - "spiral/storage": "^3.15", - "spiral/tokenizer": "^3.15", - "spiral/translator": "^3.15", - "spiral/views": "^3.15", - "symfony/mime": "^6.4.18 || ^7.2" - }, - "require-dev": { - "spiral-packages/league-event": "^1.0.1", - "spiral/code-style": "^2.2.2", - "spiral/dumper": "^3.3.1", - "spiral/framework": "^3.15.0", - "spiral/nyholm-bridge": "^1.3", - "spiral/roadrunner-bridge": "^2.2 || ^3.7 || ^4.0", - "vimeo/psalm": "^5.26.1 || ^6.1" - }, - "suggest": { - "brianium/paratest": "Required to run tests in parallel (^6.0).", - "ext-gd": "Required to use generate fake image files" + "php": ">=8.2", + "testo/testo": "0.10.19 - 1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, "autoload": { "psr-4": { - "Spiral\\Testing\\": "src" + "Testo\\Lifecycle\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ - { - "name": "Anton Titov (wolfy-j)", - "email": "wolfy-j@spiralscout.com" - }, - { - "name": "Pavel Buchnev (butschster)", - "email": "pavel.buchnev@spiralscout.com" - }, { "name": "Aleksei Gagarin (roxblnfk)", - "email": "alexey.gagarin@spiralscout.com" - }, - { - "name": "Maksim Smakouz (msmakouz)", - "email": "maksim.smakouz@spiralscout.com" - }, - { - "name": "RoadRunner Community", - "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + "homepage": "https://github.com/roxblnfk" } ], - "description": "Spiral Framework testing SDK", - "homepage": "https://spiral.dev/", + "description": "Lifecycle hooks plugin for the Testo testing framework.", "keywords": [ - "spiral", - "spiral-packages", - "testing" + "lifecycle", + "testo" ], "support": { - "chat": "https://discord.gg/TFeEmCs", - "docs": "https://spiral.dev/docs/testing-start", - "issues": "https://github.com/spiral/testing/issues", - "source": "https://github.com/spiral/testing/tree/2.9.0" + "source": "https://github.com/php-testo/lifecycle/tree/0.1.4" }, "funding": [ { - "url": "https://github.com/sponsors/spiral", - "type": "github" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-01-31T20:48:30+00:00" + "time": "2026-06-07T19:36:46+00:00" }, { - "name": "symfony/filesystem", - "version": "v6.4.24", + "name": "testo/repeat", + "version": "0.1.8", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8" + "url": "https://github.com/php-testo/repeat.git", + "reference": "0e6a74716e34e7d85710189347ff14aaaac81d21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", + "url": "https://api.github.com/repos/php-testo/repeat/zipball/0e6a74716e34e7d85710189347ff14aaaac81d21", + "reference": "0e6a74716e34e7d85710189347ff14aaaac81d21", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "php": ">=8.2", + "testo/testo": "0.10.19 - 1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, "autoload": { + "files": [ + "Repeat.php" + ], "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Testo\\Repeat\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", + "description": "Repeat policy plugin for the Testo testing framework.", + "keywords": [ + "repeat", + "test", + "testo" + ], "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.24" + "source": "https://github.com/php-testo/repeat/tree/0.1.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" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2026-06-07T19:36:04+00:00" }, { - "name": "symfony/process", - "version": "v6.4.25", + "name": "testo/retry", + "version": "0.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8" + "url": "https://github.com/php-testo/retry.git", + "reference": "4394270c794528b7967ee39bb5151ece52b4436b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", - "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", + "url": "https://api.github.com/repos/php-testo/retry/zipball/4394270c794528b7967ee39bb5151ece52b4436b", + "reference": "4394270c794528b7967ee39bb5151ece52b4436b", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "testo/testo": "0.10.19 - 1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, "autoload": { + "files": [ + "Retry.php" + ], "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Testo\\Retry\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "Retry policy plugin for the Testo testing framework.", + "keywords": [ + "retry", + "testo" + ], "support": { - "source": "https://github.com/symfony/process/tree/v6.4.25" + "source": "https://github.com/php-testo/retry/tree/0.1.4" }, "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" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-08-14T06:23:17+00:00" + "time": "2026-06-07T19:36:25+00:00" }, { - "name": "symfony/var-dumper", - "version": "v6.4.25", + "name": "testo/test", + "version": "0.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "c6cd92486e9fc32506370822c57bc02353a5a92c" + "url": "https://github.com/php-testo/test.git", + "reference": "73ffd2d0c71c5e0e610f7d006e1f9831334f8986" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6cd92486e9fc32506370822c57bc02353a5a92c", - "reference": "c6cd92486e9fc32506370822c57bc02353a5a92c", + "url": "https://api.github.com/repos/php-testo/test/zipball/73ffd2d0c71c5e0e610f7d006e1f9831334f8986", + "reference": "73ffd2d0c71c5e0e610f7d006e1f9831334f8986", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<5.4" - }, - "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "php": ">=8.2", + "testo/testo": "0.10.19 - 1" }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, "autoload": { "files": [ - "Resources/functions/dump.php" + "Test.php" ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Testo\\Test\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", + "description": "Test attribute plugin for the Testo testing framework.", "keywords": [ - "debug", - "dump" + "test", + "testo" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.25" + "source": "https://github.com/php-testo/test/tree/0.1.4" }, "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" + "url": "https://boosty.to/roxblnfk", + "type": "boosty" } ], - "time": "2025-08-13T09:41:44+00:00" + "time": "2026-06-07T19:36:41+00:00" }, { - "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.5", + "name": "testo/testo", + "version": "0.10.27", "source": { "type": "git", - "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "cf6fb197b676ba716837c886baca842e4db29005" + "url": "https://github.com/php-testo/testo.git", + "reference": "7704aff9f34f86fa7c470425ae4cdb10299c3c1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", - "reference": "cf6fb197b676ba716837c886baca842e4db29005", + "url": "https://api.github.com/repos/php-testo/testo/zipball/7704aff9f34f86fa7c470425ae4cdb10299c3c1c", + "reference": "7704aff9f34f86fa7c470425ae4cdb10299c3c1c", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18.0 || ^5.0.0", - "php": "^8.1.0", - "phpdocumentor/reflection-docblock": "^5.3.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", - "symfony/finder": "^6.4.0 || ^7.0.0" + "ext-tokenizer": "*", + "internal/destroy": "^1.0", + "internal/path": "^1.2", + "php": ">=8.2", + "psr/container": "1 - 2", + "psr/event-dispatcher": "^1.0", + "psr/log": "^2.0 || ^3.0", + "symfony/console": "^6.4 || ^7 || ^8.0", + "symfony/finder": "^6.4 || ^7 || ^8.0", + "testo/assert": "^0.1.8", + "testo/bench": "^0.1.5", + "testo/bridge-symfony-console": "^0.1.7", + "testo/codecov": "^0.1.11", + "testo/convention": "^0.1.3", + "testo/data": "^0.1.6", + "testo/filter": "^0.1.4", + "testo/inline": "^0.1.5", + "testo/lifecycle": "^0.1.4", + "testo/repeat": "^0.1.8", + "testo/retry": "^0.1.4", + "testo/test": "^0.1.4", + "yiisoft/injector": "^1.2" + }, + "replace": { + "internal/container": "*" }, "require-dev": { - "laravel/pint": "^1.13.7", - "phpstan/phpstan": "^1.10.52" + "buggregator/trap": "^1.10", + "infection/infection": "dev-testo-bridge-82 as 0.32.6", + "internal/dload": "^1.6", + "llm/skills": "^1.3", + "roxblnfk/unpoly": "1.8.2", + "spiral/code-style": "^2.2.2", + "testo/bridge-infection": "^0.1.6", + "testo/facade": "^0.1.1", + "vimeo/psalm": "^7.0@dev" + }, + "suggest": { + "llm/skills": "Ship Testo's bundled AI-agent skills into your project's skills directory automatically.", + "testo/bridge-infection": "Provides integration with Infection PHP mutation testing framework." }, "type": "library", + "extra": { + "skills": { + "source": "skills" + } + }, "autoload": { "psr-4": { - "PHPUnit\\Architecture\\": "src/" + "Testo\\": "core/", + "Internal\\Container\\": "internal/container/src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Ni Shi", - "email": "futik0ma011@gmail.com" - }, - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" } ], - "description": "Methods for testing application architecture", + "description": "A lightweight PHP testing framework.", + "homepage": "https://php-testo.github.io/", "keywords": [ - "architecture", - "phpunit", - "stucture", + "dev", "test", - "testing" + "testing", + "tests" ], "support": { - "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" + "docs": "https://php-testo.github.io/", + "issues": "https://github.com/php-testo/testo/issues", + "source": "https://github.com/php-testo/testo" }, - "time": "2025-04-20T20:23:40+00:00" + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-06-24T07:41:24+00:00" }, { "name": "thecodingmachine/safe", - "version": "dev-master", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "98d020e21833599d4fc5fb94a398790de6101562" + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/98d020e21833599d4fc5fb94a398790de6101562", - "reference": "98d020e21833599d4fc5fb94a398790de6101562", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19", "shasum": "" }, "require": { @@ -10794,7 +9994,6 @@ "phpunit/phpunit": "^10", "squizlabs/php_codesniffer": "^3.2" }, - "default-branch": true, "type": "library", "autoload": { "files": [ @@ -10893,7 +10092,7 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/master" + "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0" }, "funding": [ { @@ -10913,70 +10112,20 @@ "type": "github" } ], - "time": "2025-05-16T18:20:14+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2026-02-04T18:08:13+00:00" }, { "name": "vimeo/psalm", - "version": "6.5.0", + "version": "7.0.0-beta19", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "38fc8444edf0cebc9205296ee6e30e906ade783b" + "reference": "7e751c06a756fa64dc4c759c09fe4a173afcb433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/38fc8444edf0cebc9205296ee6e30e906ade783b", - "reference": "38fc8444edf0cebc9205296ee6e30e906ade783b", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/7e751c06a756fa64dc4c759c09fe4a173afcb433", + "reference": "7e751c06a756fa64dc4c759c09fe4a173afcb433", "shasum": "" }, "require": { @@ -10986,6 +10135,7 @@ "composer-runtime-api": "^2", "composer/semver": "^1.4 || ^2.0 || ^3.0", "composer/xdebug-handler": "^2.0 || ^3.0", + "danog/advanced-json-rpc": "^3.1", "dnoegel/php-xdg-base-dir": "^0.1.1", "ext-ctype": "*", "ext-dom": "*", @@ -10994,16 +10144,17 @@ "ext-mbstring": "*", "ext-simplexml": "*", "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.1", "felixfbecker/language-server-protocol": "^1.5.3", "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "netresearch/jsonmapper": "^5.0", "nikic/php-parser": "^5.0.0", - "php": "~8.1.17 || ~8.2.4 || ~8.3.0 || ~8.4.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0", + "psalm/psalm-plugin-api": "0.1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", - "symfony/console": "^6.0 || ^7.0", - "symfony/filesystem": "^6.0 || ^7.0" + "symfony/console": "^6.0 || ^7.0 || ^8.0", + "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0", + "symfony/polyfill-php84": "^1.31.0" }, "provide": { "psalm/psalm": "self.version" @@ -11012,6 +10163,7 @@ "amphp/phpunit-util": "^3", "bamarni/composer-bin-plugin": "^1.4", "brianium/paratest": "^6.9", + "danog/class-finder": "^0.4.8", "dg/bypass-finals": "^1.5", "ext-curl": "*", "mockery/mockery": "^1.5", @@ -11020,10 +10172,10 @@ "phpstan/phpdoc-parser": "^1.6", "phpunit/phpunit": "^9.6", "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.19", + "psalm/plugin-phpunit": "^0.20.1", "slevomat/coding-standard": "^8.4", "squizlabs/php_codesniffer": "^3.6", - "symfony/process": "^6.0 || ^7.0" + "symfony/process": "^6.0 || ^7.0 || ^8.0" }, "suggest": { "ext-curl": "In order to send data to shepherd", @@ -11079,27 +10231,27 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2025-02-07T20:42:25+00:00" + "time": "2026-04-15T20:48:24+00:00" }, { "name": "voku/portable-ascii", - "version": "2.0.3", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" }, "suggest": { "ext-intl": "Use Intl for transliterator_transliterate() support" @@ -11129,7 +10281,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + "source": "https://github.com/voku/portable-ascii/tree/2.1.1" }, "funding": [ { @@ -11153,37 +10305,41 @@ "type": "tidelift" } ], - "time": "2024-11-21T01:49:47+00:00" + "time": "2026-04-26T05:33:54+00:00" }, { "name": "webmozart/assert", - "version": "1.11.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", "shasum": "" }, "require": { "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" + "ext-date": "*", + "ext-filter": "*", + "php": "^8.2" }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, "branch-alias": { - "dev-master": "1.10-dev" + "dev-master": "2.0-dev", + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -11199,6 +10355,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -11209,34 +10369,41 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/webmozarts/assert/tree/2.4.1" }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2026-06-15T15:31:57+00:00" }, { "name": "yiisoft/friendly-exception", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/yiisoft/friendly-exception.git", - "reference": "4b4a19edff251791e3c92d4d83435d2716351ff4" + "reference": "c6c36fd60a0b4f1514882d2ce8395f54352ec967" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/yiisoft/friendly-exception/zipball/4b4a19edff251791e3c92d4d83435d2716351ff4", - "reference": "4b4a19edff251791e3c92d4d83435d2716351ff4", + "url": "https://api.github.com/repos/yiisoft/friendly-exception/zipball/c6c36fd60a0b4f1514882d2ce8395f54352ec967", + "reference": "c6c36fd60a0b4f1514882d2ce8395f54352ec967", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "7.4.* || 8.0 - 8.5" }, "require-dev": { - "phpunit/phpunit": "^9.4", - "roave/infection-static-analysis-plugin": "^1.5", - "spatie/phpunit-watcher": "^1.23", - "vimeo/psalm": "^4.3" + "bamarni/composer-bin-plugin": "^1.8.3", + "maglnet/composer-require-checker": "^3.8 || ^4.3", + "phpunit/phpunit": "^9.6.22", + "spatie/phpunit-watcher": "^1.23.6" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true, + "target-directory": "tools" + } + }, "autoload": { "psr-4": { "Yiisoft\\FriendlyException\\": "src" @@ -11247,7 +10414,7 @@ "BSD-3-Clause" ], "description": "An interface for friendlier exception", - "homepage": "http://www.yiiframework.com/", + "homepage": "https://www.yiiframework.com/", "keywords": [ "error handling", "exception", @@ -11255,36 +10422,36 @@ "friendly" ], "support": { - "forum": "http://www.yiiframework.com/forum/", - "irc": "irc://irc.freenode.net/yii", + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", "issues": "https://github.com/yiisoft/friendly-exception/issues?state=open", "source": "https://github.com/yiisoft/friendly-exception", - "wiki": "http://www.yiiframework.com/wiki/" + "wiki": "https://www.yiiframework.com/wiki/" }, "funding": [ { - "url": "https://github.com/yiisoft", + "url": "https://github.com/sponsors/yiisoft", "type": "github" }, { "url": "https://opencollective.com/yiisoft", - "type": "open_collective" + "type": "opencollective" } ], - "time": "2021-10-26T21:43:25+00:00" + "time": "2025-11-28T14:51:44+00:00" } ], "aliases": [], "minimum-stability": "dev", - "stability-flags": {}, + "stability-flags": { + "vimeo/psalm": 10 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.1" + "php": ">=8.2" }, "platform-dev": {}, - "platform-overrides": { - "php": "8.1.17" - }, "plugin-api-version": "2.6.0" } diff --git a/infection.json.dist b/infection.json similarity index 58% rename from infection.json.dist rename to infection.json index b014ecf..c08f4b7 100644 --- a/infection.json.dist +++ b/infection.json @@ -1,20 +1,23 @@ { + "$schema": "vendor/infection/infection/resources/schema.json", "ignoreMsiWithNoMutations": true, "logs": { "text": "runtime/infection/infection-log.txt", "stryker": { - "report": "master" + "report": "1.x" } }, "minCoveredMsi": 50, "minMsi": 50, - "phpUnit": { - "configDir": "./" - }, "source": { "directories": [ "src" + ], + "excludes": [ + "Bridge" ] }, + "testFramework": "testo", + "tmpDir": "runtime", "timeout": 10 } diff --git a/phpunit.xml.dist b/phpunit.xml.dist deleted file mode 100644 index 891283f..0000000 --- a/phpunit.xml.dist +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - tests/src/Arch - - - tests/src/Functional - - - - - - - - - - - - - - - src - - - diff --git a/psalm-baseline.xml b/psalm-baseline.xml index eb633d9..624727c 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -13,11 +13,6 @@ get($class)]]> - - - getLastError()]]> - - diff --git a/psalm.xml b/psalm.xml index 6cc7fae..9aa74f4 100644 --- a/psalm.xml +++ b/psalm.xml @@ -11,9 +11,6 @@ findUnusedVariablesAndParams="true" strictBinaryOperands="true" > - - - @@ -24,4 +21,7 @@ + + + diff --git a/rector.php b/rector.php index e8fea27..1aaa28a 100644 --- a/rector.php +++ b/rector.php @@ -4,14 +4,11 @@ use Rector\Config; use Rector\Php81; -use Rector\PHPUnit; use Rector\ValueObject; return static function (Config\RectorConfig $rectorConfig): void { $rectorConfig->cacheDirectory(__DIR__ . '/runtime/rector/'); - $rectorConfig->import(__DIR__ . '/vendor/fakerphp/faker/rector-migrate.php'); - $rectorConfig->paths([ __DIR__ . '/src/', __DIR__ . '/tests/', @@ -24,8 +21,4 @@ $rectorConfig->rules([ Php81\Rector\Property\ReadOnlyPropertyRector::class, ]); - - $rectorConfig->sets([ - PHPUnit\Set\PHPUnitSetList::PHPUNIT_100, - ]); }; diff --git a/resources/stubs.php b/resources/stubs.php new file mode 100644 index 0000000..1cb8785 --- /dev/null +++ b/resources/stubs.php @@ -0,0 +1,31 @@ +persist($this, $cascade) - ->run() - ->isSuccess(); + TransactionFacade::persist($this, $cascade); + return true; } $transacting->persist($this, $cascade); @@ -220,10 +219,13 @@ final public function save(bool $cascade = true): bool */ final public function saveOrFail(bool $cascade = true): void { - TransactionFacade::getEntityManager() - ?->persist($this, $cascade) ?? TransactionFacade::createEntityManager(TransactionMode::Ignore) - ->persist($this, $cascade) - ->run(); + $transacting = TransactionFacade::getEntityManager(); + if ($transacting === null) { + TransactionFacade::persist($this, $cascade); + return; + } + + $transacting->persist($this, $cascade); } /** @@ -233,10 +235,8 @@ final public function delete(bool $cascade = true): bool { $transacting = TransactionFacade::getEntityManager(); if ($transacting === null) { - return TransactionFacade::createEntityManager(TransactionMode::Ignore) - ->delete($this, $cascade) - ->run() - ->isSuccess(); + TransactionFacade::delete($this, $cascade); + return true; } $transacting->delete($this, $cascade); @@ -251,10 +251,13 @@ final public function delete(bool $cascade = true): bool */ final public function deleteOrFail(bool $cascade = true): void { - TransactionFacade::getEntityManager() - ?->delete($this, $cascade) ?? TransactionFacade::createEntityManager(TransactionMode::Ignore) - ->delete($this, $cascade) - ->run(); + $transacting = TransactionFacade::getEntityManager(); + if ($transacting === null) { + TransactionFacade::delete($this, $cascade); + return; + } + + $transacting->delete($this, $cascade); } private static function getOrm(): ORMInterface diff --git a/src/Bridge/Laravel/Providers/ActiveRecordProvider.php b/src/Bridge/Laravel/Providers/ActiveRecordProvider.php index 80651f9..63f94aa 100644 --- a/src/Bridge/Laravel/Providers/ActiveRecordProvider.php +++ b/src/Bridge/Laravel/Providers/ActiveRecordProvider.php @@ -7,8 +7,12 @@ use Cycle\ActiveRecord\Facade; use Illuminate\Support\ServiceProvider; -class ActiveRecordProvider extends ServiceProvider +final class ActiveRecordProvider extends ServiceProvider { + /** + * @psalm-external-mutation-free + */ + #[\Override] public function register(): void { Facade::setContainer($this->app); diff --git a/src/Bridge/Spiral/Bootloader/ActiveRecordBootloader.php b/src/Bridge/Spiral/Bootloader/ActiveRecordBootloader.php index 412350a..e513519 100644 --- a/src/Bridge/Spiral/Bootloader/ActiveRecordBootloader.php +++ b/src/Bridge/Spiral/Bootloader/ActiveRecordBootloader.php @@ -9,8 +9,12 @@ use Spiral\Boot\Bootloader\Bootloader; use Spiral\Cycle\Bootloader\CycleOrmBootloader; -class ActiveRecordBootloader extends Bootloader +final class ActiveRecordBootloader extends Bootloader { + /** + * @psalm-pure + */ + #[\Override] public function defineDependencies(): array { return [ @@ -18,6 +22,9 @@ public function defineDependencies(): array ]; } + /** + * @psalm-external-mutation-free + */ public function init(ContainerInterface $container): void { Facade::setContainer($container); diff --git a/src/Exception/ActiveRecordException.php b/src/Exception/ActiveRecordException.php index 9367032..d7076fd 100644 --- a/src/Exception/ActiveRecordException.php +++ b/src/Exception/ActiveRecordException.php @@ -4,4 +4,7 @@ namespace Cycle\ActiveRecord\Exception; +/** + * @psalm-mutable + */ interface ActiveRecordException extends \Throwable {} diff --git a/src/Exception/ConfigurationException.php b/src/Exception/ConfigurationException.php index d81b18f..1e58f05 100644 --- a/src/Exception/ConfigurationException.php +++ b/src/Exception/ConfigurationException.php @@ -4,4 +4,4 @@ namespace Cycle\ActiveRecord\Exception; -class ConfigurationException extends \RuntimeException implements ActiveRecordException {} +final class ConfigurationException extends \RuntimeException implements ActiveRecordException {} diff --git a/src/Exception/Transaction/TransactionException.php b/src/Exception/Transaction/TransactionException.php index 6bbf0d9..af9548f 100644 --- a/src/Exception/Transaction/TransactionException.php +++ b/src/Exception/Transaction/TransactionException.php @@ -4,6 +4,5 @@ namespace Cycle\ActiveRecord\Exception\Transaction; -use Cycle\ActiveRecord\Exception\ActiveRecordException; - -class TransactionException extends \RuntimeException implements ActiveRecordException {} +/** @psalm-suppress DeprecatedClass The alias intentionally targets the deprecated class name. */ +\class_alias(\Cycle\Transaction\Exception\TransactionException::class, TransactionException::class); diff --git a/src/Facade.php b/src/Facade.php index e8d319a..a4c2eaa 100644 --- a/src/Facade.php +++ b/src/Facade.php @@ -13,12 +13,15 @@ /** * @internal */ -class Facade +final class Facade { private static ?ORMInterface $orm = null; private static ?ContainerInterface $container = null; private static ?DatabaseManager $dbal = null; + /** + * @psalm-external-mutation-free + */ public static function setContainer(ContainerInterface $container): void { self::$container = $container; @@ -40,6 +43,9 @@ public static function getDatabaseManager(): DatabaseManager return self::$dbal ??= self::getFromContainer(DatabaseManager::class); } + /** + * @psalm-external-mutation-free + */ public static function reset(): void { self::$orm = null; diff --git a/src/Internal/EmptyState.php b/src/Internal/EmptyState.php deleted file mode 100644 index a27d48e..0000000 --- a/src/Internal/EmptyState.php +++ /dev/null @@ -1,34 +0,0 @@ -error !== null; - } - - public function getLastError(): ?\Throwable - { - return $this->error; - } - - public function retry(): StateInterface - { - return $this; - } -} diff --git a/src/Internal/EntityManager.php b/src/Internal/EntityManager.php deleted file mode 100644 index 917536d..0000000 --- a/src/Internal/EntityManager.php +++ /dev/null @@ -1,74 +0,0 @@ -getUow()->persistState($entity, $cascade); - $this->autoExecute and $this->run(); - return $this; - } - - public function persist(object $entity, bool $cascade = true): EntityManagerInterface - { - $this->getUow()->persistDeferred($entity, $cascade); - $this->autoExecute and $this->run(); - return $this; - } - - public function delete(object $entity, bool $cascade = true): EntityManagerInterface - { - $this->getUow()->delete($entity, $cascade); - $this->autoExecute and $this->run(); - return $this; - } - - /** - * @throws \Throwable - */ - public function run(): StateInterface - { - if ($this->uow === null) { - return new EmptyState(); - } - - $state = $this->uow->run(); - $this->clean(); - $state->isSuccess() or throw $state->getLastError(); - return $state; - } - - public function clean(): static - { - $this->uow = null; - return $this; - } - - private function getUow(): UnitOfWork - { - return $this->uow ??= ($this->factory)(); - } -} diff --git a/src/Internal/TransactionFacade.php b/src/Internal/TransactionFacade.php index 854cbb8..d18de76 100644 --- a/src/Internal/TransactionFacade.php +++ b/src/Internal/TransactionFacade.php @@ -4,14 +4,16 @@ namespace Cycle\ActiveRecord\Internal; -use Cycle\ActiveRecord\Exception\Transaction\TransactionException; +use Cycle\Transaction\Exception\TransactionException; use Cycle\ActiveRecord\Facade; -use Cycle\ActiveRecord\TransactionMode; use Cycle\Database\DatabaseInterface; +use Cycle\ORM\EntityManager as ORMEntityManager; use Cycle\ORM\EntityManagerInterface; -use Cycle\ORM\Service\SourceProviderInterface; use Cycle\ORM\Transaction\Runner; -use Cycle\ORM\Transaction\UnitOfWork; +use Cycle\Transaction\FlushMode; +use Cycle\Transaction\Internal\TransactionImpl; +use Cycle\Transaction\Transaction; +use Cycle\Transaction\TransactionMode; use Yiisoft\Injector\Injector; /** @@ -19,21 +21,41 @@ */ final class TransactionFacade { - private static ?EntityManager $em = null; + private static ?EntityManagerInterface $em = null; + /** + * @psalm-external-mutation-free + */ public static function getEntityManager(): ?EntityManagerInterface { return self::$em; } /** - * Create a new EntityManager with its own UnitOfWork and Transaction Runner. + * Persist a single entity in its own transaction, executing it immediately. + * + * @throws TransactionException + * @throws \Throwable */ - public static function createEntityManager( - TransactionMode $mode = TransactionMode::OpenNew, - ): EntityManagerInterface { - return new EntityManager( - static fn(): UnitOfWork => new UnitOfWork(Facade::getOrm(), self::getRunner($mode)), + public static function persist(object $entity, bool $cascade = true): void + { + self::getTransaction()->transact( + static fn(EntityManagerInterface $em): EntityManagerInterface => $em->persist($entity, $cascade), + self::resolveDatabaseName($entity), + ); + } + + /** + * Delete a single entity in its own transaction, executing it immediately. + * + * @throws TransactionException + * @throws \Throwable + */ + public static function delete(object $entity, bool $cascade = true): void + { + self::getTransaction()->transact( + static fn(EntityManagerInterface $em): EntityManagerInterface => $em->delete($entity, $cascade), + self::resolveDatabaseName($entity), ); } @@ -53,11 +75,9 @@ public static function groupOrmActions( $previous = self::$em; try { - self::$em = new EntityManager( - static fn(): UnitOfWork => new UnitOfWork(Facade::getOrm(), $runner), - ); - $result = $callback(self::$em); - self::$em->run(); + self::$em = $em = new ORMEntityManager(Facade::getOrm()); + $result = $callback($em); + $em->run(runner: $runner); return $result; } finally { self::$em = $previous; @@ -73,32 +93,50 @@ public static function groupOrmActions( * * @throws TransactionException * @throws \Throwable + * + * @psalm-suppress MixedReturnStatement The transaction callback yields a value Psalm cannot narrow. */ public static function transact( callable $callback, ?string $entity, ): mixed { - $dbal = $entity === null - ? Facade::getDatabaseManager()->database() - : Facade::getOrm() - ->getService(SourceProviderInterface::class) - ->getSource($entity) - ->getDatabase(); + return self::getTransaction()->transact( + callback: static function (EntityManagerInterface $em, DatabaseInterface $db) use ($callback): mixed { + $previous = self::$em; + self::$em = $em; + try { + $orm = Facade::getOrm(); + return (new Injector())->invoke($callback, [$db, $em, $orm, $orm->getHeap(), $orm->getSchema()]); + } finally { + self::$em = $previous; + } + }, + source: $entity, + emMode: TransactionMode::Current, + flush: FlushMode::OnWrite, + ); + } + + /** + * Build a Transaction service backed by the ActiveRecord ORM and database provider. + */ + private static function getTransaction(): Transaction + { + return new TransactionImpl(Facade::getOrm(), Facade::getDatabaseManager()); + } - return $dbal->transaction(static function (DatabaseInterface $db) use ($callback): mixed { - $previous = self::$em; - try { - $orm = Facade::getOrm(); - self::$em = $em = new EntityManager( - static fn(): UnitOfWork => new UnitOfWork($orm, Runner::outerTransaction(strict: true)), - autoExecute: true, - ); + /** + * Resolve the database name the given entity is stored in. + * + * Resolving from the instance (not its class) handles ORM proxies correctly. + * + * @return non-empty-string + */ + private static function resolveDatabaseName(object $entity): string + { + $orm = Facade::getOrm(); - return (new Injector())->invoke($callback, [$db, $em, $orm, $orm->getHeap(), $orm->getSchema()]); - } finally { - self::$em = $previous; - } - }); + return $orm->getSource($orm->resolveRole($entity))->getDatabase()->getName(); } /** diff --git a/src/Query/ActiveQuery.php b/src/Query/ActiveQuery.php index 3d34007..d1d85e0 100644 --- a/src/Query/ActiveQuery.php +++ b/src/Query/ActiveQuery.php @@ -9,6 +9,8 @@ use Cycle\ORM\Select; /** + * @api + * * @template-covariant TEntity of object * * @extends Select diff --git a/src/Repository/ActiveRepository.php b/src/Repository/ActiveRepository.php index 782680a..e85a1cb 100644 --- a/src/Repository/ActiveRepository.php +++ b/src/Repository/ActiveRepository.php @@ -21,6 +21,8 @@ * * @see self::forUpdate() as an example of immutabile method. * + * @api + * * @template-covariant TEntity of object */ class ActiveRepository @@ -65,6 +67,8 @@ public function findByPK(mixed $id): ?object * * @note Limit of 1 will be added to the query. * + * @param array $orderBy + * * @return TEntity|null */ public function findOne(array $scope = [], array $orderBy = []): ?object @@ -73,6 +77,8 @@ public function findOne(array $scope = [], array $orderBy = []): ?object } /** + * @param array $orderBy + * * @return iterable */ public function findAll(array $scope = [], array $orderBy = []): iterable @@ -104,7 +110,7 @@ public function forUpdate(): static * If you need to modify the default selector, consider using a constructor or {@see self::initSelect()}. * * @return Select - * @mutation-free + * @psalm-mutation-free */ final public function select(): Select { diff --git a/src/TransactionMode.php b/src/TransactionMode.php index d4daebb..115b3e5 100644 --- a/src/TransactionMode.php +++ b/src/TransactionMode.php @@ -4,29 +4,4 @@ namespace Cycle\ActiveRecord; -use Cycle\ORM\Exception\RunnerException; - -enum TransactionMode -{ - /** - * Do nothing with transactions. - * - * @see \Cycle\ORM\Transaction\Runner::outerTransaction() with non-strict mode. - */ - case Ignore; - - /** - * The currently opened transaction will be used. If no transaction is opened, a {@see RunnerException} - * exception will be thrown. - * - * @see \Cycle\ORM\Transaction\Runner::outerTransaction() with strict mode. - */ - case Current; - - /** - * A new transaction will be open for each used driver connection and will close they on finish. - * - * @see \Cycle\ORM\Transaction\Runner::innerTransaction() - */ - case OpenNew; -} +\class_alias(\Cycle\Transaction\TransactionMode::class, TransactionMode::class); diff --git a/testo.php b/testo.php new file mode 100644 index 0000000..34cd26b --- /dev/null +++ b/testo.php @@ -0,0 +1,44 @@ + 1]); + Assert::instanceOf($user, User::class); + Assert::same($user->name, 'Antony'); + + $byName = User::findOne(['name' => 'John']); + Assert::instanceOf($byName, User::class); + Assert::same($byName->id, 2); + } + + public function findsAllEntities(): void + { + Assert::count(User::findAll(), 2); + } + + public function findsEntityByPrimaryKey(): void + { + $first = User::findByPK(1); + Assert::instanceOf($first, User::class); + Assert::same($first->name, 'Antony'); + + $second = User::findByPK(2); + Assert::instanceOf($second, User::class); + Assert::same($second->name, 'John'); + } + + public function selectsEntityViaQuery(): void + { + $user = User::query()->where('id', 1)->fetchOne(); + + Assert::instanceOf($user, User::class); + Assert::same($user->name, 'Antony'); + } + + public function makeCreatesProxyInstance(): void + { + $user = User::make(['name' => 'Alex']); + + Assert::instanceOf($user, User::class); + Assert::notSame($user::class, User::class); + Assert::same($user->name, 'Alex'); + } + + // endregion + + // region Persisting and deleting + + public function savesEntity(): void + { + $user = new User('Alex'); + + Assert::true($user->save()); + Assert::count(User::findAll(), 3); + + $stored = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user->id)->fetchOne(); + Assert::same($stored->name, $user->name); + } + + public function savesEntityWithinTransaction(): void + { + ActiveRecord::transact(static function (EntityManagerInterface $em) use (&$user): void { + $user = new User('Alex'); + Assert::true($user->save()); + }); + + Assert::count(User::findAll(), 3); + $stored = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user->id)->fetchOne(); + Assert::same($stored->name, $user->name); + } + + public function saveOrFailThrowsOnUniqueViolation(): never + { + // `name` carries a unique index; persisting a duplicate must surface the driver error. + Expect::exception(\Throwable::class)->withMessageContaining('SQLSTATE'); + + (new User('John'))->saveOrFail(); + } + + public function saveOrFailPersistsEntityOutsideTransaction(): void + { + $user = new User('Alex'); + + $user->saveOrFail(); + + Assert::count(User::findAll(), 3); + $stored = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user->id)->fetchOne(); + Assert::same($stored->name, $user->name); + } + + public function deletesEntity(): void + { + $user = User::findByPK(1); + Assert::instanceOf($user, User::class); + + Assert::true($user->delete()); + Assert::count(User::findAll(), 1); + } + + public function deleteOrFailRemovesEntity(): void + { + $user = User::findByPK(1); + Assert::instanceOf($user, User::class); + + $user->deleteOrFail(); + Assert::count(User::findAll(), 1); + } + + public function deleteOrFailWithinGroupActions(): void + { + $user = User::findByPK(1); + Assert::instanceOf($user, User::class); + + ActiveRecord::groupActions(static function () use ($user): void { + $user->deleteOrFail(); + }); + + Assert::count(User::findAll(), 1); + } + + // endregion + + // region Grouped actions and transactions + + public function groupActionsPersistsMultipleEntities(): void + { + ActiveRecord::groupActions(static function () use (&$userOne, &$userTwo): void { + ($userOne = new User('Foo'))->saveOrFail(); + ($userTwo = new User('Bar'))->saveOrFail(); + }); + + Assert::count(User::findAll(), 4); + + $storedOne = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userOne->id)->fetchOne(); + Assert::same($storedOne->name, $userOne->name); + + $storedTwo = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userTwo->id)->fetchOne(); + Assert::same($storedTwo->name, $userTwo->name); + } + + public function groupActionsReturnsValueWithoutActions(): void + { + $result = ActiveRecord::groupActions(static fn(): string => 'foo'); + + Assert::same($result, 'foo'); + } + + public function groupActionsNestedInCurrentModeRunsInner(): void + { + $result = ActiveRecord::groupActions( + static fn() => ActiveRecord::groupActions(static fn(): bool => true), + TransactionMode::Current, + ); + + Assert::true($result); + } + + #[WithoutTransaction] + public function groupActionsInCurrentModeWithoutTransactionThrows(): never + { + Expect::exception(RunnerException::class); + + ActiveRecord::groupActions(static function (): void { + User::findByPK(1)->delete(); + }, TransactionMode::Current); + } + + #[WithoutTransaction] + public function groupActionsInStrictModeOutsideTransactionThrows(): never + { + Expect::exception(RunnerException::class); + + ActiveRecord::groupActions(static function (): void { + (new User('Foo'))->saveOrFail(); + }, TransactionMode::Current); + } + + #[WithoutTransaction] + public function groupActionsInIgnoreModeOutsideTransactionSucceeds(): void + { + // When outside a transaction, TransactionMode::Ignore (with strict: false) should work fine. + // The runner will ignore the lack of a transaction. + // If mutated to strict: true, this would throw RunnerException because there's no active transaction. + $result = ActiveRecord::groupActions(static function () use (&$created, &$deleted): string { + // Create and immediately delete an entity to generate commands without leaving side effects + $user = new User('TestUser'); + $created = $user->save(); // Must succeed without transaction + $deleted = $user->delete(); // Must also succeed + return 'success'; + }, TransactionMode::Ignore); + Assert::same($result, 'success'); + Assert::true($created); + Assert::true($deleted); + } + + public function deletesMultipleEntitiesInGroupActions(): void + { + Assert::count(User::findAll(), 2); + + $userOne = User::findByPK(1); + $userTwo = User::findByPK(2); + + ActiveRecord::groupActions(static function () use ($userOne, $userTwo): void { + Assert::true($userOne->delete()); + Assert::true($userTwo->delete()); + }); + + Assert::count(User::findAll(), 0); + } + + public function transactRunsGroupActionsInsideManualTransaction(): void + { + ActiveRecord::transact(static function () use (&$userOne, &$userTwo): void { + ActiveRecord::groupActions(static function () use (&$userOne, &$userTwo): void { + ($userOne = new User('Foo'))->saveOrFail(); + ($userTwo = new User('Bar'))->saveOrFail(); + }, TransactionMode::Current); + }); + + Assert::count(User::findAll(), 4); + + $storedOne = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userOne->id)->fetchOne(); + Assert::same($storedOne->name, $userOne->name); + } + + public function transactOnEntityClassRunsGroupActions(): void + { + User::transact(static function (DatabaseInterface $dbal) use (&$userOne, &$userTwo): void { + User::groupActions(static function (EntityManagerInterface $em) use (&$userOne, &$userTwo): void { + $em->persist($userOne = new User('Foo')); + + ($userTwo = new User('Bar'))->saveOrFail(); + }, TransactionMode::Current); + }); + + Assert::count(User::findAll(), 4); + + $storedOne = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userOne->id)->fetchOne(); + Assert::same($storedOne->name, $userOne->name); + + $storedTwo = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userTwo->id)->fetchOne(); + Assert::same($storedTwo->name, $userTwo->name); + } + + public function groupActionsRestoresEntityManagerAfterCompletion(): void + { + $emBefore = TransactionFacade::getEntityManager(); + + ActiveRecord::groupActions(static function (): void { + (new User('Foo'))->saveOrFail(); + }); + + $emAfter = TransactionFacade::getEntityManager(); + + Assert::same($emBefore, $emAfter); + } + + public function groupActionsRestoresEntityManagerAfterException(): void + { + $emBefore = TransactionFacade::getEntityManager(); + + try { + ActiveRecord::groupActions(static function (): never { + throw new \RuntimeException('test error'); + }); + } catch (\RuntimeException) { + // Expected + } + + $emAfter = TransactionFacade::getEntityManager(); + + Assert::same($emBefore, $emAfter); + } + + public function nestedGroupActionsRestoreContextProperly(): void + { + $emBefore = TransactionFacade::getEntityManager(); + + ActiveRecord::groupActions(static function () use ($emBefore): void { + $emInOuter = TransactionFacade::getEntityManager(); + Assert::notSame($emInOuter, $emBefore); + + ActiveRecord::groupActions(static function () use ($emInOuter): void { + $emInInner = TransactionFacade::getEntityManager(); + Assert::notSame($emInInner, $emInOuter); + (new User('Bar'))->saveOrFail(); + }, TransactionMode::Current); + + $emAfterInner = TransactionFacade::getEntityManager(); + Assert::same($emAfterInner, $emInOuter); + }); + + $emAfter = TransactionFacade::getEntityManager(); + Assert::same($emAfter, $emBefore); + } + + public function transactExecutesOrmActions(): void + { + User::transact(function ( + DatabaseInterface $dbal, + EntityManagerInterface $em, + ) use (&$user1, &$user2, &$user3, &$user4): void { + ($user1 = new User('Foo'))->save(); + ($user2 = new User('Bar'))->saveOrFail(); + $em->persist($user3 = new User('Baz')); + $em->persistState($user4 = new User('Qux')); + }); + + Assert::count(User::findAll(), 6); + + foreach ([$user1, $user2, $user3, $user4] as $created) { + $stored = $this->selectEntity(User::class, cleanHeap: true)->wherePK($created->id)->fetchOne(); + Assert::same($stored->name, $created->name); + } + } + + public function transactExecutesOrmActionsImmediately(): void + { + User::transact(static function (DatabaseInterface $dbal, EntityManagerInterface $em): void { + $before = $dbal->table('user')->count(); + + (new User('Zoe'))->save(); + $em->persist(new User('Max')); + + // FlushMode::OnWrite flushes each operation right away, so both rows are already + // visible within the open transaction (before it is committed). + Assert::same($dbal->table('user')->count(), $before + 2); + }); + + Assert::count(User::findAll(), 4); + } + + public function transactResolvesCallbackParameters(): void + { + $args = User::transact(static fn( + SchemaInterface $schema, + EntityManagerInterface $em, + ORMInterface $orm, + HeapInterface $heap, + DatabaseInterface $dbal, + ): array => \func_get_args()); + + Assert::array($args)->hasCount(5); + } + + public function transactRestoresEntityManagerAfterException(): void + { + $emBefore = TransactionFacade::getEntityManager(); + + try { + User::transact(static function (): never { + throw new \RuntimeException('test error'); + }); + } catch (\RuntimeException) { + // Expected + } + + $emAfter = TransactionFacade::getEntityManager(); + + Assert::same($emBefore, $emAfter); + } + + // endregion + + // region Multiple databases + + public function persistsEntityIntoItsOwnDatabase(): void + { + $post = new Post('Hello'); + + Assert::true($post->save()); + Assert::int($post->id)->greaterThan(0); + + // The row physically lives in the `secondary` database... + Assert::same($this->database('secondary')->table('post')->count(), 1); + // ...and not in the default one. + Assert::false($this->database()->hasTable('post')); + } + + public function runsIndependentTransactionsPerDatabase(): void + { + User::transact(static fn(EntityManagerInterface $em) => $em->persist(new User('Alice'))); + Post::transact(static fn(EntityManagerInterface $em) => $em->persist(new Post('First'))); + + Assert::count(User::findAll(), 3); + Assert::count(Post::findAll(), 1); + } + + public function rejectsCrossDatabaseEntityWithinTransaction(): never + { + Expect::exception(TransactionException::class); + + // The transaction is opened on the default database (via User), so a Post (secondary + // database) must be rejected by the Entity Manager guard. + User::transact(static fn(EntityManagerInterface $em) => $em->persist(new Post('Should not be allowed'))); + } + + public function rollsBackFailedTransactionWithoutTouchingOtherDatabase(): void + { + try { + Post::transact(static function (EntityManagerInterface $em): void { + $em->persist(new Post('Doomed')); + throw new \RuntimeException('boom'); + }); + Assert::fail('Expected the callback exception to propagate.'); + } catch (\RuntimeException $e) { + Assert::same($e->getMessage(), 'boom'); + } + + Assert::count(Post::findAll(), 0); + Assert::count(User::findAll(), 2); + } + + public function defaultAndSecondaryUseDistinctDrivers(): void + { + $defaultDriver = $this->database('default')->getDriver(DatabaseInterface::WRITE)->getName(); + $secondaryDriver = $this->database('secondary')->getDriver(DatabaseInterface::WRITE)->getName(); + + Assert::notSame($defaultDriver, $secondaryDriver); + Assert::same($secondaryDriver, 'secondary'); + } + + // endregion + + // region Repositories and queries + + public function defaultRepositoryIsReturned(): void + { + Assert::instanceOf(User::getRepository(), Repository::class); + } + + public function repositoryFetchesOneEntity(): void + { + $user = (new ActiveRepository(User::class))->findOne(['id' => 2]); + + Assert::instanceOf($user, User::class); + Assert::same($user->id, 2); + } + + public function repositoryFetchesOneEntityByPrimaryKey(): void + { + $user = (new ActiveRepository(User::class))->findByPK(2); + + Assert::instanceOf($user, User::class); + Assert::same($user->id, 2); + } + + public function repositoryFetchesAllEntities(): void + { + $users = (new ActiveRepository(User::class))->findAll(); + + Assert::count($users, 2); + foreach ($users as $user) { + Assert::instanceOf($user, User::class); + } + } + + public function customRepositoryUsesActiveQuery(): void + { + $user = (new RepositoryWithActiveQuery())->withNameStartLetter('J')->findOne(); + + Assert::instanceOf($user, User::class); + Assert::same($user->name[0], 'J'); + } + + public function extendedRepositoryConstructorResolvesEntity(): void + { + $repository = new class extends ActiveRepository { + public function __construct() + { + parent::__construct(User::class); + } + }; + + Assert::instanceOf($repository->findOne(), User::class); + } + + public function selectMethodIsImmutable(): void + { + $repository = new ActiveRepository(User::class); + + Assert::notSame($repository->select(), $repository->select()); + } + + public function forUpdateMethodIsImmutable(): void + { + $repository = new ActiveRepository(User::class); + + Assert::notSame($repository->forUpdate(), $repository->forUpdate()); + } + + public function queryReturnsActiveQueryForRole(): void + { + Assert::instanceOf(Identity::query(), ActiveQuery::class); + Assert::same(User::query()->getRole(), User::class); + } + + public function tableNameIsResolvedFromSchema(): void + { + Assert::same(User::tableName(), 'user'); + Assert::same(Identity::tableName(), 'user_identity'); + } + + // endregion +} diff --git a/tests/Acceptance/Common/BaseTestCase.php b/tests/Acceptance/Common/BaseTestCase.php new file mode 100644 index 0000000..b8764fc --- /dev/null +++ b/tests/Acceptance/Common/BaseTestCase.php @@ -0,0 +1,48 @@ +database($name); + } + + protected function orm(): ORMInterface + { + return Facade::getOrm(); + } + + /** + * Build a fresh Select for the given role, optionally clearing the identity map first so the + * query reads straight from the database instead of returning heap-cached instances. + */ + protected function selectEntity(string $role, bool $cleanHeap = false): Select + { + $orm = $this->orm(); + + if ($cleanHeap) { + $orm->getHeap()->clean(); + } + + return new Select($orm, $role); + } +} diff --git a/tests/Acceptance/Driver/MySQL/ActiveRecordTest.php b/tests/Acceptance/Driver/MySQL/ActiveRecordTest.php new file mode 100644 index 0000000..ac425f8 --- /dev/null +++ b/tests/Acceptance/Driver/MySQL/ActiveRecordTest.php @@ -0,0 +1,19 @@ +, DatabaseManager> */ + private array $managers = []; + + /** @var array, true> */ + private array $prepared = []; + + /** + * Build a manager whose `default` connection uses the given driver and whose `secondary` + * connection is always an in-memory SQLite database (for driver-agnostic multi-database tests). + */ + public static function createManager(DriverConfig $defaultDriver): DatabaseManager + { + return new DatabaseManager(new DatabaseConfig([ + 'default' => 'default', + 'databases' => [ + 'default' => ['connection' => 'default'], + 'secondary' => ['connection' => 'secondary'], + ], + 'connections' => [ + 'default' => $defaultDriver, + 'secondary' => new SQLiteDriverConfig(connection: new MemoryConnectionConfig()), + ], + ])); + } + + public function manager(DatabaseDriver $driver): DatabaseManager + { + return $this->managers[$driver->value] ??= self::createManager($driver->defaultConfig()); + } + + public function isPrepared(DatabaseDriver $driver): bool + { + return isset($this->prepared[$driver->value]); + } + + public function markPrepared(DatabaseDriver $driver): void + { + $this->prepared[$driver->value] = true; + } +} diff --git a/tests/Acceptance/Testo/DatabaseDriver.php b/tests/Acceptance/Testo/DatabaseDriver.php new file mode 100644 index 0000000..456aac9 --- /dev/null +++ b/tests/Acceptance/Testo/DatabaseDriver.php @@ -0,0 +1,98 @@ +` group used to select it on the CLI + * (e.g. `--group=driver-mysql`); {@see DatabaseInterceptor} resolves the case back from that group. + * Each case knows how to build the {@see DriverConfig} for its `default` connection โ€” connection + * parameters come from environment variables (matching the docker-compose setup) with sensible + * local defaults. + */ +enum DatabaseDriver: string +{ + case SQLite = 'sqlite'; + case MySQL = 'mysql'; + case Postgres = 'pgsql'; + case SQLServer = 'sqlserver'; + + /** + * Resolve a driver from a `driver-` group name, or null if the name is not a driver group. + */ + public static function fromGroup(string $group): ?self + { + return \str_starts_with($group, 'driver-') + ? self::tryFrom(\substr($group, \strlen('driver-'))) + : null; + } + + /** + * Build the driver configuration for this database's `default` connection. + */ + public function defaultConfig(): DriverConfig + { + return match ($this) { + self::SQLite => new SQLiteDriverConfig( + connection: new MemoryConnectionConfig(), + queryCache: true, + options: ['logInterpolatedQueries' => true], + ), + self::MySQL => new MySQLDriverConfig( + connection: new MySQLConnection( + database: self::env('DB_DATABASE', 'spiral'), + host: self::env('DB_HOSTNAME', '127.0.0.1'), + port: (int) self::env('DB_PORT', '13306'), + user: self::env('DB_USER', 'spiral'), + password: self::env('DB_PASSWORD', 'YourStrong!Passw0rd'), + ), + queryCache: true, + options: ['logInterpolatedQueries' => true], + ), + self::Postgres => new PostgresDriverConfig( + connection: new PostgresConnection( + database: self::env('DB_DATABASE', 'spiral'), + host: self::env('DB_HOSTNAME', '127.0.0.1'), + port: (int) self::env('DB_PORT', '15432'), + user: self::env('DB_USER', 'spiral'), + password: self::env('DB_PASSWORD', 'YourStrong!Passw0rd'), + ), + schema: 'public', + queryCache: true, + options: ['logInterpolatedQueries' => true], + ), + self::SQLServer => new SQLServerDriverConfig( + connection: new SQLServerConnection( + database: 'tempdb', + host: self::env('DB_HOSTNAME', '127.0.0.1'), + port: (int) self::env('DB_PORT', '11433'), + trustServerCertificate: true, + user: 'SA', + password: self::env('DB_PASSWORD', 'YourStrong!Passw0rd'), + ), + queryCache: true, + options: ['logInterpolatedQueries' => true], + ), + }; + } + + private static function env(string $name, string $default): string + { + $value = \getenv($name); + + return $value === false || $value === '' ? $default : $value; + } +} diff --git a/tests/Acceptance/Testo/DatabaseInterceptor.php b/tests/Acceptance/Testo/DatabaseInterceptor.php new file mode 100644 index 0000000..9d30d97 --- /dev/null +++ b/tests/Acceptance/Testo/DatabaseInterceptor.php @@ -0,0 +1,189 @@ +container` resolves those bindings throughout. + * - {@see self::runTest()} runs once per test. It pulls the ORM/DBAL back out of the (scoped) + * container, clears the ORM identity map and wraps the test in a database transaction that is rolled + * back afterwards โ€” so tables and seeds are never recreated between tests, only the per-test changes + * are undone. + * + * Tests annotated with {@see WithoutTransaction} run without the wrapping transaction. If the target + * database is unreachable the case scope is never opened, so its tests find no ORM bound and are + * reported as {@see Status::Skipped} instead of failing the suite. + */ +#[InterceptorOptions( + order: InterceptorOptions::ORDER_CLOSE_TO_TEST, + testType: TestType::Test, +)] +final readonly class DatabaseInterceptor implements TestCaseRunInterceptor, TestRunInterceptor +{ + public function __construct( + private Container $container, + private ConnectionPool $pool, + private SchemaInterface $schema, + ) {} + + #[\Override] + public function runTestCase(CaseInfo $info, callable $next): CaseResult + { + $class = $info->definition->reflection; + $driver = $class === null ? null : self::resolveDriver($class); + + // A case without a driver group is not database-bound; run it untouched. + if ($driver === null) { + return $next($info); + } + + $manager = $this->pool->manager($driver); + + try { + $manager->database('default')->getDriver()->connect(); + $manager->database('secondary')->getDriver()->connect(); + } catch (\Throwable) { + // Database unreachable: skip the scope so every test of this case is reported as skipped. + return $next($info); + } + + $this->prepare($driver, $manager); + + // Build the ORM inside a fresh container scope, bind it (and the DBAL) there and let the + // Facade consume that very container. The scope โ€” and its bindings โ€” live only for this case. + return $this->container->scope(function (Container $scope) use ($manager, $info, $next): CaseResult { + $orm = OrmEnvironment::buildOrm($manager, $this->schema, $scope); + + $scope->set($orm, ORMInterface::class); + $scope->set($manager); + + Facade::setContainer($scope); + + try { + return $next($info); + } finally { + Facade::reset(); + } + }); + } + + #[\Override] + public function runTest(TestInfo $info, callable $next): TestResult + { + $class = $info->caseInfo->definition->reflection; + $driver = $class === null ? null : self::resolveDriver($class); + + // Not a database-bound case. + if ($driver === null) { + return $next($info); + } + + // No ORM in the current scope means the case scope was never opened โ€” the database is down. + if (!$this->container->has(ORMInterface::class)) { + return new TestResult( + info: $info, + status: Status::Skipped, + failure: new SkipTest(\sprintf('Database `%s` is not available.', $driver->value)), + ); + } + + // Reuse the case ORM, but start each test with a clean identity map. + $this->container->get(ORMInterface::class)->getHeap()->clean(); + + $manager = $this->container->get(DatabaseManager::class); + $default = $manager->database('default')->getDriver(); + $secondary = $manager->database('secondary')->getDriver(); + + $wrap = !self::runsWithoutTransaction($info); + if ($wrap) { + $default->beginTransaction(); + $secondary->beginTransaction(); + } + + try { + return $next($info); + } finally { + if ($wrap) { + $secondary->rollbackTransaction(); + $default->rollbackTransaction(); + } + } + } + + /** + * Find the first `driver-*` group declared on the test class or any of its ancestors. + */ + private static function resolveDriver(\ReflectionClass $class): ?DatabaseDriver + { + for ($current = $class; $current !== false; $current = $current->getParentClass()) { + foreach ($current->getAttributes(Group::class) as $attribute) { + foreach ($attribute->newInstance()->names as $name) { + $driver = DatabaseDriver::fromGroup($name); + if ($driver !== null) { + return $driver; + } + } + } + } + + return null; + } + + private static function runsWithoutTransaction(TestInfo $info): bool + { + if ($info->testDefinition->reflection->getAttributes(WithoutTransaction::class) !== []) { + return true; + } + + $class = $info->caseInfo->definition->reflection; + for ($current = $class; $current !== null && $current !== false; $current = $current->getParentClass()) { + if ($current->getAttributes(WithoutTransaction::class) !== []) { + return true; + } + } + + return false; + } + + /** + * Create the tables and seed the baseline data for a driver, once per suite run. + */ + private function prepare(DatabaseDriver $driver, DatabaseManager $manager): void + { + if ($this->pool->isPrepared($driver)) { + return; + } + + OrmEnvironment::purge($manager); + OrmEnvironment::compileSchema($manager); // creates the tables on this connection + OrmEnvironment::seed($manager); + + $this->pool->markPrepared($driver); + } +} diff --git a/tests/Acceptance/Testo/DatabasePlugin.php b/tests/Acceptance/Testo/DatabasePlugin.php new file mode 100644 index 0000000..1cafec0 --- /dev/null +++ b/tests/Acceptance/Testo/DatabasePlugin.php @@ -0,0 +1,50 @@ +defaultConfig()), + )); + $container->set($schema, SchemaInterface::class); + + $pool = new ConnectionPool(); + $container->set($pool); + + $container + ->get(InterceptorCollector::class) + ->addInterceptor(new DatabaseInterceptor($container, $pool, $schema)); + } +} diff --git a/tests/Acceptance/Testo/EntityClassLocator.php b/tests/Acceptance/Testo/EntityClassLocator.php new file mode 100644 index 0000000..94fff37 --- /dev/null +++ b/tests/Acceptance/Testo/EntityClassLocator.php @@ -0,0 +1,45 @@ + */ + private readonly array $classes; + + /** + * @param class-string ...$classes + */ + public function __construct(string ...$classes) + { + $this->classes = \array_values($classes); + } + + public function getClasses(object|string|null $target = null): array + { + $result = []; + foreach ($this->classes as $class) { + $reflection = new \ReflectionClass($class); + $result[$reflection->getName()] = $reflection; + } + + return $result; + } +} diff --git a/tests/Acceptance/Testo/OrmEnvironment.php b/tests/Acceptance/Testo/OrmEnvironment.php new file mode 100644 index 0000000..7254fcd --- /dev/null +++ b/tests/Acceptance/Testo/OrmEnvironment.php @@ -0,0 +1,170 @@ +> + */ + public static function compileSchema(DatabaseManager $dbal): array + { + $locator = new EntityClassLocator(Identity::class, User::class, Post::class); + + return (new Compiler())->compile( + registry: new Registry($dbal), + generators: [ + new ResetTables(), + new Embeddings(new TokenizerEmbeddingLocator($locator)), + new Entities(new TokenizerEntityLocator($locator)), + new TableInheritance(), + new MergeColumns(), + new GenerateRelations(), + new GenerateModifiers(), + new ValidateEntities(), + new RenderTables(), + new RenderRelations(), + new RenderModifiers(), + new MergeIndexes(), + new SyncTables(), + new GenerateTypecast(), + ], + defaults: [ + SchemaInterface::TYPECAST_HANDLER => [Typecast::class], + ], + ); + } + + /** + * Build an ORM for the given connection and pre-compiled schema. + * + * When a container is supplied, entity behaviours are wired through an + * {@see EventDrivenCommandGenerator} that resolves its listeners from it; otherwise a plain ORM is + * returned (enough for tests that only need an {@see ORMInterface} instance). + */ + public static function buildOrm( + DatabaseManager $dbal, + SchemaInterface $schema, + ?ContainerInterface $behaviors = null, + ): ORMInterface { + return new ORM( + factory: new Factory($dbal), + schema: $schema, + commandGenerator: $behaviors === null ? null : new EventDrivenCommandGenerator($schema, $behaviors), + ); + } + + /** + * Convenience factory for a standalone ORM whose `default` connection uses the given driver (the + * `secondary` connection is always in-memory SQLite). Used by tests that need an ORM without the + * plugin. + */ + public static function forDriver(DriverConfig $defaultDriver): ORMInterface + { + $dbal = ConnectionPool::createManager($defaultDriver); + + return self::buildOrm($dbal, new Schema(self::compileSchema($dbal))); + } + + /** + * Seed the baseline dataset: two users (`Antony`, `John`) backed by their identity rows. + * + * `User` joins onto `Identity`, so the identity rows must exist first; their auto-incremented ids + * (1 and 2) are then reused as the explicit user ids. Seeded once per driver and kept committed โ€” + * each test runs inside a transaction that is rolled back, so the seed is never disturbed. + */ + public static function seed(DatabaseManager $dbal): void + { + $dbal->database('default')->table('user_identity')->insertMultiple(['created_at'], [ + ['2020-11-12 12:34:56'], + ['2021-01-06 15:34:56'], + ]); + + $dbal->database('default')->table('user')->insertMultiple(['id', 'name'], [ + [1, 'Antony'], + [2, 'John'], + ]); + } + + /** + * Drop every table from both connections of the given manager. Safe to call when the tables do + * not exist yet, so it doubles as a defensive reset before building the schema for a driver. + */ + public static function purge(DatabaseManager $dbal): void + { + foreach (['default', 'secondary'] as $name) { + self::dropDatabase($dbal->database($name)); + } + } + + private static function dropDatabase(Database $database): void + { + foreach ($database->getTables() as $table) { + $schema = $table->getSchema(); + + foreach ($schema->getForeignKeys() as $foreign) { + $schema->dropForeignKey($foreign->getColumns()); + } + + $schema->save(HandlerInterface::DROP_FOREIGN_KEYS); + } + + foreach ($database->getTables() as $table) { + $schema = $table->getSchema(); + $schema->declareDropped(); + $schema->save(); + } + } +} diff --git a/tests/Acceptance/Testo/WithoutTransaction.php b/tests/Acceptance/Testo/WithoutTransaction.php new file mode 100644 index 0000000..af0c19c --- /dev/null +++ b/tests/Acceptance/Testo/WithoutTransaction.php @@ -0,0 +1,20 @@ +title = $title; + } +} diff --git a/tests/app/Entity/User.php b/tests/Stub/Entity/User.php similarity index 90% rename from tests/app/Entity/User.php rename to tests/Stub/Entity/User.php index e987e65..2de7d74 100644 --- a/tests/app/Entity/User.php +++ b/tests/Stub/Entity/User.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Cycle\App\Entity; +namespace Cycle\Tests\Stub\Entity; use Cycle\Annotated\Annotation\Column; use Cycle\Annotated\Annotation\Entity; use Cycle\Annotated\Annotation\Inheritance\JoinedTable; use Cycle\Annotated\Annotation\Table\Index; -use Cycle\App\Query\UserQuery; +use Cycle\Tests\Stub\Query\UserQuery; #[Entity(table: 'user')] #[JoinedTable] diff --git a/tests/app/Query/UserQuery.php b/tests/Stub/Query/UserQuery.php similarity index 88% rename from tests/app/Query/UserQuery.php rename to tests/Stub/Query/UserQuery.php index 70c531b..4109145 100644 --- a/tests/app/Query/UserQuery.php +++ b/tests/Stub/Query/UserQuery.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Cycle\App\Query; +namespace Cycle\Tests\Stub\Query; use Cycle\ActiveRecord\Query\ActiveQuery; -use Cycle\App\Entity\User; +use Cycle\Tests\Stub\Entity\User; /** * @extends ActiveQuery diff --git a/tests/app/Repository/RepositoryWithActiveQuery.php b/tests/Stub/Repository/RepositoryWithActiveQuery.php similarity index 86% rename from tests/app/Repository/RepositoryWithActiveQuery.php rename to tests/Stub/Repository/RepositoryWithActiveQuery.php index e4284b5..018b925 100644 --- a/tests/app/Repository/RepositoryWithActiveQuery.php +++ b/tests/Stub/Repository/RepositoryWithActiveQuery.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Cycle\App\Repository; +namespace Cycle\Tests\Stub\Repository; use Cycle\ActiveRecord\Repository\ActiveRepository; -use Cycle\App\Entity\User; -use Cycle\App\Query\UserQuery; +use Cycle\Tests\Stub\Entity\User; +use Cycle\Tests\Stub\Query\UserQuery; use Cycle\Database\Injection\Fragment; use Cycle\ORM\ORMInterface; diff --git a/tests/Unit/ActiveRecordBootloaderTest.php b/tests/Unit/ActiveRecordBootloaderTest.php new file mode 100644 index 0000000..899463c --- /dev/null +++ b/tests/Unit/ActiveRecordBootloaderTest.php @@ -0,0 +1,53 @@ +init($container); + + Assert::same(Facade::getOrm(), $orm); + } + + public function itDependsOnCycleOrmBootloader(): void + { + Assert::contains((new ActiveRecordBootloader())->defineDependencies(), CycleOrmBootloader::class); + } +} diff --git a/tests/Unit/FacadeTest.php b/tests/Unit/FacadeTest.php new file mode 100644 index 0000000..e7dc816 --- /dev/null +++ b/tests/Unit/FacadeTest.php @@ -0,0 +1,139 @@ +withMessageContaining('Container has not been set.') + ->withMessageContaining('Facade::setContainer()'); + + Facade::getOrm(); + } + + public function getsOrmFromContainer(): void + { + $orm = $this->buildOrm(); + $container = ConfigurableContainer::returning(ORMInterface::class, $orm); + + Facade::setContainer($container); + + Assert::same(Facade::getOrm(), $orm); + Assert::same($container->requested, [ORMInterface::class]); + } + + public function cachesOrmAfterFirstCall(): void + { + $orm = $this->buildOrm(); + $container = ConfigurableContainer::returning(ORMInterface::class, $orm); + + Facade::setContainer($container); + + // First call should fetch from container + $first = Facade::getOrm(); + Assert::same($first, $orm); + Assert::same($container->requested, [ORMInterface::class]); + + // Second call should return cached instance without calling getFromContainer again + $second = Facade::getOrm(); + Assert::same($second, $orm); + Assert::same($second, $first); + // Container should not have been called again + Assert::same($container->requested, [ORMInterface::class]); + } + + public function throwsWhenContainerResolvesOrmToNull(): never + { + Facade::setContainer(new ConfigurableContainer(static fn(): null => null)); + + Expect::exception(ConfigurationException::class) + ->withMessageContaining('Failed to get ORMInterface from container.'); + + Facade::getOrm(); + } + + public function throwsWhenContainerHasNoOrmService(): never + { + Facade::setContainer(new ConfigurableContainer( + static fn(string $id): never => throw new ServiceNotFoundException("No `$id` service."), + )); + + Expect::exception(ConfigurationException::class) + ->withMessageContaining('Container has no ORMInterface service.') + ->withPrevious(ServiceNotFoundException::class); + + Facade::getOrm(); + } + + public function cachesDatabaseManagerAfterFirstCall(): void + { + $dbal = ConnectionPool::createManager(new SQLiteDriverConfig(connection: new MemoryConnectionConfig())); + + $container = new ConfigurableContainer(static function (string $id) use ($dbal) { + return match ($id) { + DatabaseManager::class => $dbal, + default => throw new ServiceNotFoundException("No `$id` service."), + }; + }); + + Facade::setContainer($container); + + // First call should fetch from container + $first = Facade::getDatabaseManager(); + Assert::same($first, $dbal); + Assert::count($container->requested, 1); + + // Second call should return cached instance without calling getFromContainer again + $second = Facade::getDatabaseManager(); + Assert::same($second, $dbal); + Assert::same($second, $first); + // Container should not have been called again for DatabaseManager + Assert::count($container->requested, 1); + } + + private function buildOrm(): ORMInterface + { + return OrmEnvironment::forDriver(new SQLiteDriverConfig(connection: new MemoryConnectionConfig())); + } +} diff --git a/tests/src/Arch/InheritanceTest.php b/tests/Unit/InheritanceTest.php similarity index 54% rename from tests/src/Arch/InheritanceTest.php rename to tests/Unit/InheritanceTest.php index 45123ad..4143d3a 100644 --- a/tests/src/Arch/InheritanceTest.php +++ b/tests/Unit/InheritanceTest.php @@ -2,24 +2,26 @@ declare(strict_types=1); +namespace Cycle\Tests\Unit; use Cycle\ActiveRecord\ActiveRecord; use Cycle\ActiveRecord\Query\ActiveQuery; use Cycle\ORM\RepositoryInterface; -use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; -use PHPUnit\Framework\Attributes\Test; -use PHPUnit\Framework\TestCase; +use Testo\Assert; +use Testo\Codecov\Covers; +use Testo\Test; /** - * Test that AR classes can be extended and methods can be overridden. + * Verifies that {@see ActiveRecord} can be extended and its static API overridden โ€” no database is + * involved, the class merely has to be definable and instantiable. */ -final class InheritanceTest extends TestCase +#[Test] +#[Covers(ActiveRecord::class)] +final class InheritanceTest { - #[Test] - #[DoesNotPerformAssertions] - public function inheritActiveRecord(): void + public function activeRecordCanBeExtendedAndOverridden(): void { - new class extends ActiveRecord { + $entity = new class extends ActiveRecord { public static function make(array $data): static { return parent::make($data); @@ -35,5 +37,7 @@ public static function getRepository(): RepositoryInterface return parent::getRepository(); } }; + + Assert::instanceOf($entity, ActiveRecord::class); } } diff --git a/tests/Unit/Stub/Container/ConfigurableContainer.php b/tests/Unit/Stub/Container/ConfigurableContainer.php new file mode 100644 index 0000000..5798111 --- /dev/null +++ b/tests/Unit/Stub/Container/ConfigurableContainer.php @@ -0,0 +1,52 @@ + Identifiers that were requested through {@see self::get()}, in order. */ + public array $requested = []; + + /** + * @param \Closure(string): mixed $resolver Produces the value (or throws) for a requested id. + */ + public function __construct( + private readonly \Closure $resolver, + ) {} + + /** + * Build a container that always resolves the given identifier to the provided service. + */ + public static function returning(string $id, object $service): self + { + return new self(static fn(string $requested): object => $requested === $id + ? $service + : throw new ServiceNotFoundException(\sprintf('Unexpected service `%s`.', $requested))); + } + + public function get(string $id): mixed + { + $this->requested[] = $id; + + return ($this->resolver)($id); + } + + public function has(string $id): bool + { + return true; + } +} diff --git a/tests/Unit/Stub/Container/ServiceNotFoundException.php b/tests/Unit/Stub/Container/ServiceNotFoundException.php new file mode 100644 index 0000000..45e2e2c --- /dev/null +++ b/tests/Unit/Stub/Container/ServiceNotFoundException.php @@ -0,0 +1,15 @@ + [self::class, 'domainCore'], - ]; - } - - protected static function defineInterceptors(): array - { - return [ - CycleInterceptor::class, - ]; - } -} diff --git a/tests/app/Bootloader/SyncTablesBootloader.php b/tests/app/Bootloader/SyncTablesBootloader.php deleted file mode 100644 index d8ceaf5..0000000 --- a/tests/app/Bootloader/SyncTablesBootloader.php +++ /dev/null @@ -1,27 +0,0 @@ -get('USE_MIGRATIONS') === false) { - $schema->addGenerator(SchemaBootloader::GROUP_POSTPROCESS, SyncTables::class); - } - } -} diff --git a/tests/app/Testing/Loggable.php b/tests/app/Testing/Loggable.php deleted file mode 100644 index 04bce2c..0000000 --- a/tests/app/Testing/Loggable.php +++ /dev/null @@ -1,30 +0,0 @@ -setLogger(static::$logger); - - return $this; - } - - protected function enableProfiling(): void - { - static::$logger->display(); - } - - protected function disableProfiling(): void - { - static::$logger->hide(); - } -} diff --git a/tests/app/Testing/TestCase.php b/tests/app/Testing/TestCase.php deleted file mode 100644 index f72deb1..0000000 --- a/tests/app/Testing/TestCase.php +++ /dev/null @@ -1,28 +0,0 @@ -countWrites; - } - - public function countReadQueries(): int - { - return $this->countReads; - } - - public function log($level, string|\Stringable $message, array $context = []): void - { - $sql = \strtolower((string) $message); - if (\in_array($sql, ['insert', 'update', 'delete'], true)) { - ++$this->countWrites; - } elseif (! $this->isPostgresSystemQuery($sql)) { - ++$this->countReads; - } - - if (! $this->display) { - return; - } - - echo match ($level) { - LogLevel::ERROR => " \n! " . self::ERROR_COLOR . $message . "\033[0m", - LogLevel::ALERT => " \n! " . self::ALERT_COLOR . $message . "\033[0m", - default => $this->formatMessage($message), - }; - } - - public function display(): void - { - $this->display = true; - } - - public function hide(): void - { - $this->display = false; - } - - protected function isPostgresSystemQuery(string $query): bool - { - return \str_contains($query, 'constraint_name') || \str_contains($query, 'pg_') || \str_contains($query, 'information_schema'); - } - - private function formatMessage(string $message): string - { - if ($this->isPostgresSystemQuery($message)) { - return " \n> " . self::SYSTEM_QUERY_COLOR . $message . "\033[0m"; - } - - return " \n> " . $this->outputColor($message) . $message . "\033[0m"; - } - - private function outputColor(string $message): string - { - if (\str_starts_with($message, 'SHOW')) { - return self::SHOW_COLOR; - } elseif (\str_starts_with($message, 'SELECT')) { - return self::SELECT_COLOR; - } elseif (\str_starts_with($message, 'INSERT')) { - return self::INSERT_COLOR; - } - - return self::OTHER_COLOR; - } -} diff --git a/tests/app/config/cycle.php b/tests/app/config/cycle.php deleted file mode 100644 index 0b7451d..0000000 --- a/tests/app/config/cycle.php +++ /dev/null @@ -1,66 +0,0 @@ - [ - /* - * true (Default) - Schema will be stored in a cache after compilation. - * It won't be changed after entity modification. Use `php app.php cycle` to update schema. - * - * false - Schema won't be stored in a cache after compilation. - * It will be automatically changed after entity modification. (Development mode) - */ - 'cache' => false, - - /* - * The CycleORM provides the ability to manage default settings for - * every schema with not defined segments - */ - 'defaults' => [ - SchemaInterface::MAPPER => Cycle\ORM\Mapper\Mapper::class, - SchemaInterface::REPOSITORY => Cycle\ORM\Select\Repository::class, - SchemaInterface::SCOPE => null, - SchemaInterface::TYPECAST_HANDLER => [ - Cycle\ORM\Parser\Typecast::class, - ], - ], - - 'collections' => [ - 'default' => 'array', - 'factories' => [ - 'array' => new Cycle\ORM\Collection\ArrayCollectionFactory(), - // 'doctrine' => new \Cycle\ORM\Collection\DoctrineCollectionFactory(), - // 'illuminate' => new \Cycle\ORM\Collection\IlluminateCollectionFactory(), - ], - ], - - /* - * Schema generators (Optional) - * null (default) - Will be used schema generators defined in bootloaders - */ - 'generators' => [ - Cycle\Schema\Generator\ResetTables::class, - Cycle\Annotated\Embeddings::class, - Cycle\Annotated\Entities::class, - Cycle\Annotated\TableInheritance::class, - Cycle\Annotated\MergeColumns::class, - Cycle\Schema\Generator\GenerateRelations::class, - Cycle\Schema\Generator\GenerateModifiers::class, - Cycle\Schema\Generator\ValidateEntities::class, - Cycle\Schema\Generator\RenderTables::class, - Cycle\Schema\Generator\RenderRelations::class, - Cycle\Schema\Generator\RenderModifiers::class, - Cycle\Annotated\MergeIndexes::class, - Cycle\Schema\Generator\SyncTables::class, - Cycle\Schema\Generator\GenerateTypecast::class, - ], - ], - - /* - * Prepare all internal ORM services (mappers, repositories, typecasters...) - */ - 'warmup' => false, -]; diff --git a/tests/app/config/database.php b/tests/app/config/database.php deleted file mode 100644 index 63673df..0000000 --- a/tests/app/config/database.php +++ /dev/null @@ -1,86 +0,0 @@ - [ - 'default' => null, - 'drivers' => [ - 'memory' => 'sql_logs', // Log channel for Sql - ], - ], - - /* - * Default database connection - */ - 'default' => 'default', - - /* - * The Spiral/Database module provides support to manage multiple databases - * in one application, use read/write connections and logically separate - * multiple databases within one connection using prefixes. - * - * To register a new database simply add a new one into - * "databases" section below. - */ - 'databases' => [ - 'default' => [ - 'driver' => env('DB_DRIVER', 'memory'), - ], - ], - - /* - * Each database instance must have an associated connection object. - * Connections used to provide low-level functionality and wrap different - * database drivers. To register a new connection you have to specify - * the driver class and its connection options. - */ - 'drivers' => [ - 'memory' => new Config\SQLiteDriverConfig( - connection: new Config\SQLite\MemoryConnectionConfig(), - queryCache: true, - options: ['logQueryParameters' => true, 'logInterpolatedQueries' => true], - ), - 'sqlite' => new Config\SQLiteDriverConfig( - queryCache: true, - options: ['logQueryParameters' => true, 'logInterpolatedQueries' => true], - ), - 'mysql' => new Config\MySQLDriverConfig( - connection: new Config\MySQL\TcpConnectionConfig( - database: env('DB_DATABASE', 'default'), - host: env('DB_HOSTNAME', 'mysql'), - port: env('DB_PORT', 3306), - user: env('DB_USER', 'cycle'), - password: env('DB_PASSWORD', 'SSpaSS__1_123'), - ), - queryCache: true, - options: ['logQueryParameters' => true, 'logInterpolatedQueries' => true], - ), - 'pgsql' => new Config\PostgresDriverConfig( - connection: new Config\Postgres\TcpConnectionConfig( - database: env('DB_DATABASE', 'default'), - host: env('DB_HOSTNAME', 'pgsql'), - port: env('DB_PORT', 5432), - user: env('DB_USER', 'cycle'), - password: env('DB_PASSWORD', 'SSpaSS__1_123'), - ), - schema: 'public', - queryCache: true, - options: ['logQueryParameters' => true, 'logInterpolatedQueries' => true], - ), - 'sqlserver' => new Config\SQLServerDriverConfig( - connection: new Config\SQLServer\TcpConnectionConfig( - database: 'tempdb', - host: env('DB_HOSTNAME', 'sqlserver'), - port: env('DB_PORT', 1433), - trustServerCertificate: true, - user: 'SA', - password: env('DB_PASSWORD', 'SSpaSS__1_123'), - ), - queryCache: true, - options: ['logQueryParameters' => true, 'logInterpolatedQueries' => true], - ), - ], -]; diff --git a/tests/app/config/monolog.php b/tests/app/config/monolog.php deleted file mode 100644 index 19ad05e..0000000 --- a/tests/app/config/monolog.php +++ /dev/null @@ -1,29 +0,0 @@ - Level::Debug, - 'handlers' => [ - 'console' => [ - [ - 'class' => SyslogHandler::class, - 'options' => [ - 'ident' => 'spiral-app', - ], - ], - ], - 'sql_logs' => [ - [ - 'class' => RotatingFileHandler::class, - 'options' => [ - 'filename' => __DIR__ . '/../../runtime/logs/sql.log', - ], - ], - ], - ], -]; diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml new file mode 100644 index 0000000..1b0805b --- /dev/null +++ b/tests/docker-compose.yml @@ -0,0 +1,32 @@ +services: + cycle-sqlserver: + image: mcr.microsoft.com/mssql/server:2019-latest + ports: + - "11433:1433" + environment: + SA_PASSWORD: "YourStrong!Passw0rd" + ACCEPT_EULA: "Y" + + cycle-mysql: + image: mysql:8.0.37 + restart: on-failure + command: | + --default-authentication-plugin=mysql_native_password + --character-set-server=utf8mb4 + --collation-server=utf8mb4_unicode_ci + ports: + - "13306:3306" + environment: + MYSQL_DATABASE: "spiral" + MYSQL_ROOT_PASSWORD: "YourStrong!Passw0rd" + MYSQL_ROOT_HOST: "%" + + cycle-postgres: + image: postgres:15.2 + restart: on-failure + ports: + - "15432:5432" + environment: + POSTGRES_DB: "spiral" + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "YourStrong!Passw0rd" diff --git a/tests/src/Arch/DebugTest.php b/tests/src/Arch/DebugTest.php deleted file mode 100644 index 6584436..0000000 --- a/tests/src/Arch/DebugTest.php +++ /dev/null @@ -1,40 +0,0 @@ -layer(); - - foreach ($layer as $object) { - foreach ($object->uses as $use) { - foreach ($functions as $function) { - $function === $use and throw new \Exception( - \sprintf( - 'Function `%s()` is used in %s.', - $function, - $object->name, - ), - ); - } - } - } - - $this->assertTrue(true); - } -} diff --git a/tests/src/Functional/ActiveRecordTest.php b/tests/src/Functional/ActiveRecordTest.php deleted file mode 100644 index d7450b0..0000000 --- a/tests/src/Functional/ActiveRecordTest.php +++ /dev/null @@ -1,315 +0,0 @@ - 1]); - self::assertNotNull($user); - self::assertSame('Antony', $user->name); - - $user = User::findOne(['name' => 'John']); - self::assertNotNull($user); - self::assertSame(2, $user->id); - } - - #[Test] - public function it_finds_all_entities(): void - { - $users = User::findAll(); - self::assertCount(2, $users); - } - - #[Test] - public function it_finds_entity_by_primary_key(): void - { - $user = User::findByPK(1); - self::assertNotNull($user); - self::assertSame('Antony', $user->name); - - $user = User::findByPK(2); - self::assertNotNull($user); - self::assertSame('John', $user->name); - } - - #[Test] - public function it_uses_query_to_select_entity(): void - { - $user = User::query()->where('id', 1)->fetchOne(); - - self::assertNotNull($user); - self::assertSame('Antony', $user->name); - } - - #[Test] - public function it_creates_entity_instance_using_make(): void - { - $user = User::make(['name' => 'Alex']); - - self::assertInstanceOf(User::class, $user); - self::assertNotSame(User::class, $user::class, 'An Entity Proxy is created'); - self::assertSame('Alex', $user->name); - } - - #[Test] - public function it_saves_entity(): void - { - $user = new User('Alex'); - - self::assertTrue($user->save()); - self::assertCount(3, User::findAll()); - - $result = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user->id)->fetchOne(); - - self::assertSame($result->name, $user->name); - } - - #[Test] - public function it_triggers_exception_when_tries_to_save_entity_using_save_or_fail(): void - { - $user = new User('John'); - - self::expectException(\Throwable::class); - - // pgsql-response: SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "user_index_name_663d5b6bf1e34 - // sqlite-response: SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed: user.name - // mysql-response: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'John' for key 'user.user_index_name_663d5bc589edb' - - self::expectExceptionMessage('SQLSTATE'); - - $entityManager = $user->saveOrFail(); - - self::assertFalse($entityManager->isSuccess()); - self::assertCount(2, User::findAll()); - } - - #[Test] - public function it_persists_multiple_entities_in_single_grouping_actions_transaction(): void - { - ActiveRecord::groupActions(static function () use (&$userOne, &$userTwo): void { - $userOne = new User('Foo'); - $userOne->saveOrFail(); - - $userTwo = new User('Bar'); - $userTwo->saveOrFail(); - }); - - self::assertCount(4, User::findAll()); - - $savedUserOne = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userOne->id)->fetchOne(); - self::assertSame($savedUserOne->name, $userOne->name); - - $savedUserTwo = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userTwo->id)->fetchOne(); - self::assertSame($savedUserTwo->name, $userTwo->name); - } - - #[Test] - public function it_deletes_entity(): void - { - $user = User::findByPK(1); - self::assertNotNull($user); - - self::assertTrue($user->delete()); - self::assertCount(1, User::findAll()); - } - - #[Test] - public function it_deletes_entity_or_fail_without_fail(): void - { - $user = User::findByPK(1); - self::assertNotNull($user); - - $user->deleteOrFail(); - self::assertCount(1, User::findAll()); - } - - #[Test] - public function it_deletes_multiple_entities_in_single_transaction_using_grouping_actions(): void - { - self::assertCount(2, User::findAll()); - - /** @var User $userOne */ - $userOne = User::findByPK(1); - /** @var User $userTwo */ - $userTwo = User::findByPK(2); - - ActiveRecord::groupActions(static function () use ($userOne, $userTwo): void { - $userOne->delete(); - $userTwo->delete(); - }); - - self::assertCount(0, User::findAll()); - } - - #[Test] - public function it_gets_default_repository_of_entity(): void - { - $repository = User::getRepository(); - - self::assertInstanceOf(Repository::class, $repository); - } - - #[Test] - public function it_runs_grouping_actions_without_actions(): void - { - $result = ActiveRecord::groupActions(static function () { - return 'foo'; - }); - - self::assertSame('foo', $result); - } - - #[Test] - public function it_runs_grouping_actions_in_current_transaction_mode_without_opened_transaction(): void - { - self::expectException(RunnerException::class); - - ActiveRecord::groupActions(static function (): void { - $user = User::findByPK(1); - $user->delete(); - }, TransactionMode::Current); - } - - #[Test] - #[DoesNotPerformAssertions] - public function it_runs_grouping_actions_in_grouping_actions(): void - { - ActiveRecord::groupActions(static function () { - return ActiveRecord::groupActions(static fn() => true); - }, TransactionMode::Current); - } - - #[Test] - public function it_runs_grouping_actions_in_strict_mode_outside_transaction(): void - { - self::expectException(RunnerException::class); - - ActiveRecord::groupActions(static function (): void { - $userOne = new User('Foo'); - $userOne->saveOrFail(); - }, TransactionMode::Current); - } - - #[Test] - public function it_runs_grouping_actions_without_transaction_inside_manually_opened_transaction(): void - { - ActiveRecord::transact(static function () use (&$userOne, &$userTwo): void { - ActiveRecord::groupActions(static function () use (&$userOne, &$userTwo): void { - $userOne = new User('Foo'); - $userOne->saveOrFail(); - - $userTwo = new User('Bar'); - $userTwo->saveOrFail(); - }, TransactionMode::Current); - }); - - self::assertCount(4, User::findAll()); - - $savedUserOne = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userOne->id)->fetchOne(); - self::assertSame($savedUserOne->name, $userOne->name); - - $savedUserTwo = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userTwo->id)->fetchOne(); - self::assertSame($savedUserTwo->name, $userTwo->name); - } - - #[Test] - public function it_runs_transaction_with_group_actions_calling_on_entity_class(): void - { - User::transact(static function (DatabaseInterface $dbal) use (&$userOne, &$userTwo): void { - User::groupActions(static function (EntityManagerInterface $em) use (&$userOne, &$userTwo): void { - $userOne = new User('Foo'); - $em->persist($userOne); - - $userTwo = new User('Bar'); - $userTwo->saveOrFail(); - }, TransactionMode::Current); - }); - - self::assertCount(4, User::findAll()); - - $savedUserOne = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userOne->id)->fetchOne(); - self::assertSame($savedUserOne->name, $userOne->name); - - $savedUserTwo = $this->selectEntity(User::class, cleanHeap: true)->wherePK($userTwo->id)->fetchOne(); - self::assertSame($savedUserTwo->name, $userTwo->name); - } - - #[Test] - public function it_runs_transaction_with_orm_actions(): void - { - User::transact(function ( - DatabaseInterface $dbal, - EntityManagerInterface $em, - ) use (&$user1, &$user2, &$user3, &$user4): void { - $user1 = new User('Foo'); - $user2 = new User('Bar'); - $user3 = new User('Baz'); - $user4 = new User('Qux'); - $user1->save(); - $user2->saveOrFail(); - $em->persist($user3); - $em->persistState($user4); - }); - - self::assertCount(6, User::findAll()); - - $savedUserOne = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user1->id)->fetchOne(); - self::assertSame($savedUserOne->name, $user1->name); - - $savedUserTwo = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user2->id)->fetchOne(); - self::assertSame($savedUserTwo->name, $user2->name); - - $savedUserThree = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user3->id)->fetchOne(); - self::assertSame($savedUserThree->name, $user3->name); - - $savedUserFour = $this->selectEntity(User::class, cleanHeap: true)->wherePK($user4->id)->fetchOne(); - self::assertSame($savedUserFour->name, $user4->name); - } - - #[Test] - public function transact_method_resolves_parameters(): void - { - $ars = User::transact(static fn( - SchemaInterface $schema, - EntityManagerInterface $em, - ORMInterface $orm, - HeapInterface $heap, - DatabaseInterface $dbal, - ): array => \func_get_args()); - - self::assertIsArray($ars); - } - - #[Test] - public function query_method_returns_ActiveQuery(): void - { - self::assertInstanceOf(ActiveQuery::class, Identity::query()); - } - - #[Test] - public function get_table_name(): void - { - self::assertSame('user', User::tableName()); - self::assertSame('user_identity', Identity::tableName()); - } -} diff --git a/tests/src/Functional/Bridge/Spiral/Bootloader/ActiveRecordBootloaderTest.php b/tests/src/Functional/Bridge/Spiral/Bootloader/ActiveRecordBootloaderTest.php deleted file mode 100644 index 4b7b9d6..0000000 --- a/tests/src/Functional/Bridge/Spiral/Bootloader/ActiveRecordBootloaderTest.php +++ /dev/null @@ -1,21 +0,0 @@ -getContainer()->has(ORMInterface::class)); - } -} diff --git a/tests/src/Functional/DatabaseTestCase.php b/tests/src/Functional/DatabaseTestCase.php deleted file mode 100644 index bbc260b..0000000 --- a/tests/src/Functional/DatabaseTestCase.php +++ /dev/null @@ -1,113 +0,0 @@ -database->getDriver(); - } - - /** - * @throws \Throwable - */ - protected function setUp(): void - { - parent::setUp(); - - $this->database = $this->getContainer()->get(DatabaseInterface::class); - $this->setUpLogger($this->getDriver()); - - if (env('DEBUG', false) === true) { - $this->enableProfiling(); - } - - $this->orm = $this->getContainer()->get(ORMInterface::class); - - /** @var Table $userTable */ - $userTable = $this->database->table('user'); - /** @var Table $identityTable */ - $identityTable = $this->database->table('user_identity'); - - $identityTable->insertMultiple(['created_at'], [ - ['2020-11-12 12:34:56'], - ['2021-01-06 15:34:56'], - ]); - $userTable->insertMultiple(['id', 'name'], [ - [1, 'Antony'], - [2, 'John'], - ]); - } - - /** - * @throws \Throwable - */ - protected function tearDown(): void - { - parent::tearDown(); - - $databaseManager = $this->getContainer()->get(DatabaseManager::class); - /** @var Database $database */ - $database = $databaseManager->database('default'); - - $this->dropDatabase($database); - Facade::reset(); - } - - /** - * @throws \Throwable - */ - protected function selectEntity(string $role, bool $cleanHeap = false): Select - { - $orm = $this->getContainer()->get(ORMInterface::class); - - if ($cleanHeap) { - $orm->getHeap()->clean(); - } - - return new Select($orm, $role); - } - - protected function dropDatabase(?Database $database = null): void - { - if ($database === null) { - return; - } - - foreach ($database->getTables() as $table) { - $schema = $table->getSchema(); - - foreach ($schema->getForeignKeys() as $foreign) { - $schema->dropForeignKey($foreign->getColumns()); - } - - $schema->save(HandlerInterface::DROP_FOREIGN_KEYS); - } - - foreach ($database->getTables() as $table) { - $schema = $table->getSchema(); - $schema->declareDropped(); - $schema->save(); - } - } -} diff --git a/tests/src/Functional/FacadeTest.php b/tests/src/Functional/FacadeTest.php deleted file mode 100644 index 7ba2425..0000000 --- a/tests/src/Functional/FacadeTest.php +++ /dev/null @@ -1,121 +0,0 @@ -expectException(ConfigurationException::class); - $this->expectExceptionMessage('Container has not been set.'); - - Facade::getOrm(); - } - - /** - * @throws Exception - */ - #[Test] - public function it_gets_orm_from_facade_when_container_has_orm(): void - { - $container = $this->createMock(ContainerInterface::class); - $orm = $this->createMock(ORMInterface::class); - - $container - ->expects(self::once()) - ->method('get') - ->with(ORMInterface::class) - ->willReturn($orm); - - Facade::setContainer($container); - - // Assert that the ORM obtained from Facade is the same as the mock - self::assertSame($orm, Facade::getOrm()); - } - - /** - * @throws Exception - */ - #[Test] - public function it_throws_exception_when_container_does_not_have_orm(): void - { - $container = $this->createMock(ContainerInterface::class); - - $container - ->expects(self::once()) - ->method('get') - ->with(ORMInterface::class) - ->willReturn(null); - - Facade::setContainer($container); - - // Assert that an exception is thrown when the ORM is requested but not available - $this->expectException(ConfigurationException::class); - $this->expectExceptionMessage('Failed to get ORMInterface from container.'); - - Facade::getOrm(); - } - - /** - * @throws Exception - */ - #[Test] - public function it_throws_exception_when_container_does_not_have_orm_set(): void - { - $container = $this->createMock(ContainerInterface::class); - $exception = new class extends CoreException implements NotFoundExceptionInterface {}; - - $container - ->expects(self::once()) - ->method('get') - ->with(ORMInterface::class) - ->willThrowException($exception); - - Facade::setContainer($container); - - // Assert that an exception is thrown when the ORM is requested but not available - $this->expectException(ConfigurationException::class); - $this->expectExceptionMessage('Container has no ORMInterface service.'); - - try { - Facade::getOrm(); - } catch (ConfigurationException $e) { - self::assertSame($exception, $e->getPrevious()); - throw $e; - } - } - - protected function setUp(): void - { - parent::setUp(); - - /* - * This ensures that the Facade will have a clean, - * as ActiveRecordBootloader loads container into Facade by default. - */ - Facade::reset(); - } - - protected function tearDown(): void - { - parent::tearDown(); - - /* - * Each test-case should have a clean state. - */ - Facade::reset(); - } -} diff --git a/tests/src/Functional/Internal/EmptyStateTest.php b/tests/src/Functional/Internal/EmptyStateTest.php deleted file mode 100644 index 26e29dc..0000000 --- a/tests/src/Functional/Internal/EmptyStateTest.php +++ /dev/null @@ -1,62 +0,0 @@ -isSuccess()); - self::assertNull($state->getLastError()); - } - - #[Test] - public function it_creates_empty_state_with_error(): void - { - $error = new \Exception('Test error'); - $state = new EmptyState($error); - - self::assertTrue($state->isSuccess()); - self::assertSame($error, $state->getLastError()); - } - - #[Test] - public function it_returns_self_on_retry(): void - { - $state = new EmptyState(); - $retryState = $state->retry(); - - self::assertSame($state, $retryState); - } - - #[Test] - public function it_returns_self_on_retry_with_error(): void - { - $error = new \RuntimeException('Runtime error'); - $state = new EmptyState($error); - $retryState = $state->retry(); - - self::assertSame($state, $retryState); - self::assertSame($error, $retryState->getLastError()); - } - - #[Test] - public function it_handles_different_throwable_types(): void - { - $error = new \Error('Fatal error'); - $state = new EmptyState($error); - - self::assertTrue($state->isSuccess()); - self::assertSame($error, $state->getLastError()); - self::assertInstanceOf(\Error::class, $state->getLastError()); - } -} diff --git a/tests/src/Functional/Query/ActiveQueryTest.php b/tests/src/Functional/Query/ActiveQueryTest.php deleted file mode 100644 index 018c852..0000000 --- a/tests/src/Functional/Query/ActiveQueryTest.php +++ /dev/null @@ -1,20 +0,0 @@ -getRole()); - } -} diff --git a/tests/src/Functional/Repository/ActiveRepositoryTest.php b/tests/src/Functional/Repository/ActiveRepositoryTest.php deleted file mode 100644 index e0eb043..0000000 --- a/tests/src/Functional/Repository/ActiveRepositoryTest.php +++ /dev/null @@ -1,95 +0,0 @@ -findOne()); - } - - #[Test] - public function it_fetches_one_entity(): void - { - $repository = new ActiveRepository(User::class); - - $user = $repository->findOne(['id' => 2]); - - self::assertInstanceOf(User::class, $user); - self::assertSame(2, $user->id); - } - - #[Test] - public function it_fetches_one_entity_by_pk(): void - { - $repository = new ActiveRepository(User::class); - - $user = $repository->findByPK(2); - - self::assertInstanceOf(User::class, $user); - self::assertSame(2, $user->id); - } - - #[Test] - public function it_uses_custom_repository_with_active_query(): void - { - $repository = new RepositoryWithActiveQuery(); - $letter = 'J'; - - $user = $repository->withNameStartLetter($letter)->findOne(); - - self::assertInstanceOf(User::class, $user); - self::assertSame($letter, $user->name[0]); - } - - #[Test] - public function it_fetches_all_entities(): void - { - $repository = new ActiveRepository(User::class); - - $users = $repository->findAll(); - - self::assertCount(2, $users); - foreach ($users as $user) { - self::assertInstanceOf(User::class, $user); - } - } - - #[Test] - public function select_method_immutability(): void - { - $repository = new ActiveRepository(User::class); - - $select1 = $repository->select(); - $select2 = $repository->select(); - - self::assertNotSame($select1, $select2); - } - - #[Test] - public function forUpdate_method_immutability(): void - { - $repository = new ActiveRepository(User::class); - $repo1 = $repository->forUpdate(); - $repo2 = $repository->forUpdate(); - - self::assertNotSame($repo1, $repo2); - } -}