diff --git a/.gitignore b/.gitignore index cfb2621..fbec77c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .php-cs-fixer.cache .phpactor.json vendor/ +tests/database/* +!tests/database/.gitkeep diff --git a/composer.json b/composer.json index 55c5cea..02470ac 100644 --- a/composer.json +++ b/composer.json @@ -3,18 +3,23 @@ "type": "library", "autoload": { "psr-4": { - "Libsql\\Laravel\\": "src/" - } + "Libsql\\Laravel\\": "src/", + "Libsql\\Laravel\\Tests\\": "tests/" + }, + "files": [ + "src/helpers.php" + ] }, "require": { - "turso/libsql": "^0.2", "illuminate/database": "^11.0", - "spatie/laravel-package-tools": "^1.16" + "spatie/laravel-package-tools": "^1.16", + "turso/libsql": "dev-master" }, "require-dev": { - "phpunit/phpunit": "^11", "friendsofphp/php-cs-fixer": "^3.64", - "phpstan/phpstan": "2.0.x-dev" + "phpstan/phpstan": "2.0.x-dev", + "pestphp/pest": "^3.7", + "orchestra/testbench": "^9.9" }, "authors": [ { @@ -22,11 +27,27 @@ "email": "levyddsa@gmail.com" } ], + "scripts": { + "test": [ + "@php vendor/bin/pest" + ], + "test-feature": [ + "@php vendor/bin/pest --testsuite=Feature" + ], + "test-unit": [ + "@php vendor/bin/pest --testsuite=Unit" + ] + }, "extra": { "laravel": { "providers": [ "Libsql\\Laravel\\LibsqlServiceProvider" ] } + }, + "config": { + "allow-plugins": { + "pestphp/pest-plugin": true + } } } diff --git a/composer.lock b/composer.lock index 972339c..1dd626e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "de8dea2c83db89efd3d22f50b89df758", + "content-hash": "b95ce94a77328b9e1ba329af363e10c0", "packages": [ { "name": "brick/math", @@ -135,6 +135,81 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, { "name": "doctrine/inflector", "version": "2.0.10", @@ -227,41 +302,33 @@ "time": "2024-02-18T20:23:39+00:00" }, { - "name": "illuminate/collections", - "version": "v11.36.1", + "name": "doctrine/lexer", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/illuminate/collections.git", - "reference": "21868f9ac221a42d4346dc56495d11ab7e0d339a" + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/21868f9ac221a42d4346dc56495d11ab7e0d339a", - "reference": "21868f9ac221a42d4346dc56495d11ab7e0d339a", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "php": "^8.2" + "php": "^8.1" }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -270,44 +337,82 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "The Illuminate Collections package.", - "homepage": "https://laravel.com", + "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", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, - "time": "2024-12-13T13:58:10+00:00" + "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" }, { - "name": "illuminate/conditionable", - "version": "v11.36.1", + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", "source": { "type": "git", - "url": "https://github.com/illuminate/conditionable.git", - "reference": "911df1bda950a3b799cf80671764e34eede131c6" + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/911df1bda950a3b799cf80671764e34eede131c6", - "reference": "911df1bda950a3b799cf80671764e34eede131c6", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { - "php": "^8.0.2" + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Support\\": "" + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", @@ -316,49 +421,63 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" } ], - "description": "The Illuminate Conditionable package.", - "homepage": "https://laravel.com", + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, - "time": "2024-11-21T16:28:56+00:00" + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-09T13:47:03+00:00" }, { - "name": "illuminate/container", - "version": "v11.36.1", + "name": "egulias/email-validator", + "version": "4.0.3", "source": { "type": "git", - "url": "https://github.com/illuminate/container.git", - "reference": "4a777578ce2388384565bf5c8e76881f0da68e54" + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "b115554301161fa21467629f1e1391c1936de517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/4a777578ce2388384565bf5c8e76881f0da68e54", - "reference": "4a777578ce2388384565bf5c8e76881f0da68e54", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", + "reference": "b115554301161fa21467629f1e1391c1936de517", "shasum": "" }, "require": { - "illuminate/contracts": "^11.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" }, - "provide": { - "psr/container-implementation": "1.1|2.0" + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Container\\": "" + "Egulias\\EmailValidator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -367,46 +486,62 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Eduardo Gulias Davis" } ], - "description": "The Illuminate Container package.", - "homepage": "https://laravel.com", + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" }, - "time": "2024-12-08T15:40:56+00:00" + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2024-12-27T00:36:43+00:00" }, { - "name": "illuminate/contracts", - "version": "v11.36.1", + "name": "fruitcake/php-cors", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "184317f701ba20ca265e36808ed54b75b115972d" + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/184317f701ba20ca265e36808ed54b75b115972d", - "reference": "184317f701ba20ca265e36808ed54b75b115972d", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", "shasum": "" }, "require": { - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/simple-cache": "^1.0|^2.0|^3.0" + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "1.2-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Contracts\\": "" + "Fruitcake\\Cors\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -415,61 +550,62 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" } ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" }, - "time": "2024-11-25T15:33:38+00:00" + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" }, { - "name": "illuminate/database", - "version": "v11.36.1", + "name": "graham-campbell/result-type", + "version": "v1.1.3", "source": { "type": "git", - "url": "https://github.com/illuminate/database.git", - "reference": "c080bdcc537d5d800af02cae848a2fa6ce6cd14e" + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/c080bdcc537d5d800af02cae848a2fa6ce6cd14e", - "reference": "c080bdcc537d5d800af02cae848a2fa6ce6cd14e", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", "shasum": "" }, "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", - "ext-pdo": "*", - "illuminate/collections": "^11.0", - "illuminate/container": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "laravel/serializable-closure": "^1.3|^2.0", - "php": "^8.2" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" }, - "suggest": { - "ext-filter": "Required to use the Postgres database driver.", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.24).", - "illuminate/console": "Required to use the database commands (^11.0).", - "illuminate/events": "Required to use the observers with Eloquent (^11.0).", - "illuminate/filesystem": "Required to use the migrations (^11.0).", - "illuminate/pagination": "Required to paginate the result set (^11.0).", - "symfony/finder": "Required to use Eloquent model factories (^7.0)." + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, "autoload": { "psr-4": { - "Illuminate\\Database\\": "" + "GrahamCampbell\\ResultType\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -478,50 +614,86 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "The Illuminate Database package.", - "homepage": "https://laravel.com", + "description": "An Implementation Of The Result Type", "keywords": [ - "database", - "laravel", - "orm", - "sql" + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" }, - "time": "2024-12-17T15:08:55+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" }, { - "name": "illuminate/macroable", - "version": "v11.36.1", + "name": "guzzlehttp/guzzle", + "version": "7.9.2", "source": { "type": "git", - "url": "https://github.com/illuminate/macroable.git", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { - "php": "^8.2" + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "11.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Illuminate\\Support\\": "" + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -530,75 +702,104 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "The Illuminate Macroable package.", - "homepage": "https://laravel.com", + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, - "time": "2024-06-28T20:10:30+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" }, { - "name": "illuminate/support", - "version": "v11.36.1", + "name": "guzzlehttp/promises", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "fba1ff58e30fa280248ce3db9b18d6341c6ac339" + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/fba1ff58e30fa280248ce3db9b18d6341c6ac339", - "reference": "fba1ff58e30fa280248ce3db9b18d6341c6ac339", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { - "doctrine/inflector": "^2.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "illuminate/collections": "^11.0", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "nesbot/carbon": "^2.72.2|^3.4", - "php": "^8.2", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" + "php": "^7.2.5 || ^8.0" }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^11.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", - "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.0).", - "symfony/uid": "Required to use Str::ulid() (^7.0).", - "symfony/var-dumper": "Required to use the dd function (^7.0).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "11.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -607,51 +808,92 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, - "time": "2024-12-17T20:20:09+00:00" - }, - { - "name": "laravel/serializable-closure", - "version": "v2.0.1", - "source": { + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8" + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8", - "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "illuminate/support": "^10.0|^11.0", - "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36", - "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Laravel\\SerializableClosure\\": "src/" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -660,87 +902,105 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Nuno Maduro", - "email": "nuno@laravel.com" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ - "closure", - "laravel", - "serializable" + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" ], "support": { - "issues": "https://github.com/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, - "time": "2024-12-16T15:26:28+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" }, { - "name": "nesbot/carbon", - "version": "3.8.3", + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "f01cfa96468f4c38325f507ab81a4f1d2cd93cfe" + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f01cfa96468f4c38325f507ab81a4f1d2cd93cfe", - "reference": "f01cfa96468f4c38325f507ab81a4f1d2cd93cfe", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", "shasum": "" }, "require": { - "carbonphp/carbon-doctrine-types": "<100.0", - "ext-json": "*", - "php": "^8.1", - "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" - }, - "provide": { - "psr/clock-implementation": "1.0" + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "doctrine/dbal": "^3.6.3 || ^4.0", - "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", - "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", - "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.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" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "GuzzleHttp\\UriTemplate\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -749,64 +1009,241 @@ ], "authors": [ { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" } ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "description": "A polyfill class for uri_template of PHP", "keywords": [ - "date", - "datetime", - "time" + "guzzlehttp", + "uri-template" ], "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" }, "funding": [ { - "url": "https://github.com/sponsors/kylekatarnls", + "url": "https://github.com/GrahamCampbell", "type": "github" }, { - "url": "https://opencollective.com/Carbon#sponsor", - "type": "opencollective" + "url": "https://github.com/Nyholm", + "type": "github" }, { - "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", "type": "tidelift" } ], - "time": "2024-12-21T18:03:19+00:00" + "time": "2023-12-03T19:50:20+00:00" }, { - "name": "psr/clock", - "version": "1.0.0", + "name": "laravel/framework", + "version": "v11.38.2", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/laravel/framework.git", + "reference": "9d290aa90fcad44048bedca5219d2b872e98772a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/laravel/framework/zipball/9d290aa90fcad44048bedca5219d2b872e98772a", + "reference": "9d290aa90fcad44048bedca5219d2b872e98772a", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.6", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.72.2|^3.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.0.3", + "symfony/error-handler": "^7.0.3", + "symfony/finder": "^7.0.3", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.0.3", + "symfony/mailer": "^7.0.3", + "symfony/mime": "^7.0.3", + "symfony/polyfill-php83": "^1.31", + "symfony/process": "^7.0.3", + "symfony/routing": "^7.0.3", + "symfony/uid": "^7.0.3", + "symfony/var-dumper": "^7.0.3", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^9.6", + "pda/pheanstalk": "^5.0.6", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^1.11.5", + "phpunit/phpunit": "^10.5.35|^11.3.6", + "predis/predis": "^2.3", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0.3", + "symfony/http-client": "^7.0.3", + "symfony/psr-http-message-bridge": "^7.0.3", + "symfony/translation": "^7.0.3" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", + "predis/predis": "Required to use the predis connector (^2.3).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], "psr-4": { - "Psr\\Clock\\": "src/" + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -815,104 +1252,114 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" + "framework", + "laravel" ], "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "time": "2022-11-25T14:36:26+00:00" + "time": "2025-01-15T00:06:46+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "laravel/prompts", + "version": "v0.3.3", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/laravel/prompts.git", + "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/laravel/prompts/zipball/749395fcd5f8f7530fe1f00dfa84eb22c83d94ea", + "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea", "shasum": "" }, "require": { - "php": ">=7.4.0" + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-main": "0.3.x-dev" } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "Psr\\Container\\": "src/" + "Laravel\\Prompts\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.3" }, - "time": "2021-11-05T16:47:00+00:00" + "time": "2024-12-30T15:53:31+00:00" }, { - "name": "psr/simple-cache", - "version": "3.0.0", + "name": "laravel/serializable-closure", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8", + "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Psr\\SimpleCache\\": "src/" + "Laravel\\SerializableClosure\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -921,188 +1368,267 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" } ], - "description": "Common interfaces for simple caching", + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" + "closure", + "laravel", + "serializable" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" }, - "time": "2021-10-29T13:26:27+00:00" + "time": "2024-12-16T15:26:28+00:00" }, { - "name": "spatie/laravel-package-tools", - "version": "1.17.0", + "name": "league/commonmark", + "version": "2.6.1", "source": { "type": "git", - "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "9ab30fd24f677e5aa370ea4cf6b41c517d16cf85" + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/9ab30fd24f677e5aa370ea4cf6b41c517d16cf85", - "reference": "9ab30fd24f677e5aa370ea4cf6b41c517d16cf85", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad", "shasum": "" }, "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0", - "php": "^8.0" + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0|^9.0", - "pestphp/pest": "^1.22|^2", - "phpunit/phpunit": "^9.5.24|^10.5", - "spatie/pest-plugin-test-time": "^1.1|^2.2" + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.7-dev" + } + }, "autoload": { "psr-4": { - "Spatie\\LaravelPackageTools\\": "src" + "League\\CommonMark\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "role": "Developer" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "Tools for creating Laravel packages", - "homepage": "https://github.com/spatie/laravel-package-tools", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", "keywords": [ - "laravel-package-tools", - "spatie" + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" ], "support": { - "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.17.0" + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" }, "funding": [ { - "url": "https://github.com/spatie", + "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://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" } ], - "time": "2024-12-09T16:29:14+00:00" + "time": "2024-12-29T14:10:59+00:00" }, { - "name": "symfony/clock", - "version": "v7.2.0", + "name": "league/config", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" }, - "provide": { - "psr/clock-implementation": "1.0" + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, "autoload": { - "files": [ - "Resources/now.php" - ], "psr-4": { - "Symfony\\Component\\Clock\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "League\\Config\\": "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": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "Decouples applications from the system clock", - "homepage": "https://symfony.com", + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", "keywords": [ - "clock", - "psr20", - "time" + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.colinodell.com/sponsor", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://github.com/colinodell", + "type": "github" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2022-12-11T20:36:23+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "name": "league/flysystem", + "version": "3.29.1", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", "shasum": "" }, "require": { - "php": ">=8.1" + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "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" + }, + "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", + "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", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" }, + "type": "library", "autoload": { - "files": [ - "function.php" - ] + "psr-4": { + "League\\Flysystem\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1110,71 +1636,54 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" }, - "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:20:29+00:00" + "time": "2024-10-08T08:58:34+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "name": "league/flysystem-local", + "version": "3.29.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "League\\Flysystem\\Local\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1183,76 +1692,51 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "Local filesystem adapter for Flysystem.", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "Flysystem", + "file", + "files", + "filesystem", + "local" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" }, - "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-09T11:45:10+00:00" + "time": "2024-08-09T21:24:39+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "name": "league/mime-type-detection", + "version": "1.16.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { - "php": ">=7.2" + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "League\\MimeTypeDetection\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1260,100 +1744,68 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "Mime-type detection for Flysystem", "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/frankdejonge", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { - "name": "symfony/translation", - "version": "v7.2.0", + "name": "league/uri", + "version": "7.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5" + "url": "https://github.com/thephpleague/uri.git", + "reference": "81fb5145d2644324614cc532b28efd0215bda430" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/dc89e16b44048ceecc879054e5b7f38326ab6cc5", - "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", + "reference": "81fb5145d2644324614cc532b28efd0215bda430", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" + "league/uri-interfaces": "^7.5", + "php": "^8.1" }, "conflict": { - "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" + "league/uri-schemes": "^1.0" }, - "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" + "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" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "League\\Uri\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1361,69 +1813,85 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.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" + ], "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.0" + "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" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-11-12T20:47:56+00:00" + "time": "2024-12-08T08:40:02+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.5.1", + "name": "league/uri-interfaces", + "version": "7.5.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", "shasum": "" }, "require": { - "php": ">=8.1" + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "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" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "7.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "League\\Uri\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1431,119 +1899,113 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "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" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:20:29+00:00" - }, - { - "name": "turso/libsql", - "version": "dev-master", - "dist": { - "type": "path", - "url": "../libsql-php", - "reference": "97cc764699287ce3c456a82ca3962c04db34da21" - }, - "require": { - "ext-ffi": "*", - "php": ">=8.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.64", - "phpstan/phpstan": "2.0.x-dev", - "phpunit/phpunit": "^11" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/functions.php" - ], - "psr-4": { - "Libsql\\": "src/", - "Libsql\\Tests\\": "tests/" - } - }, - "scripts": { - "test": [ - "@php vendor/bin/phpunit tests --fail-on-warning --fail-on-deprecation" - ] - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Levy A.", - "email": "levyddsa@gmail.com" } ], - "description": "libSQL bindings for PHP", - "transport-options": { - "relative": true - } + "time": "2024-12-08T08:18:47+00:00" }, { - "name": "voku/portable-ascii", - "version": "2.0.3", + "name": "monolog/monolog", + "version": "3.8.1", "source": { "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "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": { - "ext-intl": "Use Intl for transliterator_transliterate() support" + "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" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "voku\\": "src/voku/" + "Monolog\\": "src/Monolog" } }, "notification-url": "https://packagist.org/downloads/", @@ -1552,73 +2014,95 @@ ], "authors": [ { - "name": "Lars Moelleken", - "homepage": "https://www.moelleken.org/" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", "keywords": [ - "ascii", - "clean", - "php" + "log", + "logging", + "psr-3" ], "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.8.1" }, "funding": [ { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", + "url": "https://github.com/Seldaek", "type": "github" }, { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", "type": "tidelift" } ], - "time": "2024-11-21T01:49:47+00:00" - } - ], - "packages-dev": [ + "time": "2024-12-05T17:15:07+00:00" + }, { - "name": "clue/ndjson-react", - "version": "v1.3.0", + "name": "nesbot/carbon", + "version": "3.8.4", "source": { "type": "git", - "url": "https://github.com/clue/reactphp-ndjson.git", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "129700ed449b1f02d70272d2ac802357c8c30c58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/129700ed449b1f02d70272d2ac802357c8c30c58", + "reference": "129700ed449b1f02d70272d2ac802357c8c30c58", "shasum": "" }, "require": { - "php": ">=5.3", - "react/stream": "^1.2" + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/event-loop": "^1.2" + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.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" + } + }, "autoload": { "psr-4": { - "Clue\\React\\NDJson\\": "src/" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1627,145 +2111,237 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", - "homepage": "https://github.com/clue/reactphp-ndjson", + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", "keywords": [ - "NDJSON", - "json", - "jsonlines", - "newline", - "reactphp", - "streaming" + "date", + "datetime", + "time" ], "support": { - "issues": "https://github.com/clue/reactphp-ndjson/issues", - "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" }, "funding": [ { - "url": "https://clue.engineering/support", - "type": "custom" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://github.com/clue", - "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": "2022-12-23T10:58:28+00:00" + "time": "2024-12-27T09:25:35+00:00" }, { - "name": "composer/pcre", - "version": "3.3.2", + "name": "nette/schema", + "version": "v1.3.2", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<1.11.10" + "nette/utils": "^4.0", + "php": "8.1 - 8.4" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" }, "type": "library", "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, "branch-alias": { - "dev-main": "3.x-dev" + "dev-master": "1.3-dev" } }, "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "config", + "nette" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "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()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ { - "url": "https://github.com/composer", - "type": "github" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "time": "2024-11-12T16:29:46+00:00" + "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": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.5" + }, + "time": "2024-08-07T15:39:19+00:00" }, { - "name": "composer/semver", - "version": "3.4.3", + "name": "nunomaduro/termwind", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.1.8" }, "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "illuminate/console": "^11.33.2", + "laravel/pint": "^1.18.2", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^7.1.8", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, "branch-alias": { - "dev-main": "3.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { + "files": [ + "src/Functions.php" + ], "psr-4": { - "Composer\\Semver\\": "src" + "Termwind\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1774,139 +2350,135 @@ ], "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" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", + "description": "Its like Tailwind CSS, but for the console.", "keywords": [ - "semantic", - "semver", - "validation", - "versioning" + "cli", + "console", + "css", + "package", + "php", + "style" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://www.paypal.com/paypalme/enunomaduro", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/nunomaduro", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "url": "https://github.com/xiCO2k", + "type": "github" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2024-11-21T10:39:51+00:00" }, { - "name": "composer/xdebug-handler", - "version": "3.0.5", + "name": "phpoption/phpoption", + "version": "1.9.3", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "PhpOption\\": "src/PhpOption/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "Restarts a process without Xdebug.", + "description": "Option Type for PHP", "keywords": [ - "Xdebug", - "performance" + "language", + "option", + "php", + "type" ], "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" + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", + "url": "https://github.com/GrahamCampbell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", "type": "tidelift" } ], - "time": "2024-05-06T16:37:16+00:00" + "time": "2024-07-20T21:41:07+00:00" }, { - "name": "evenement/evenement", - "version": "v3.0.2", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^9 || ^6" + "php": "^7.0 || ^8.0" }, "type": "library", "autoload": { "psr-4": { - "Evenement\\": "src/" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1915,53 +2487,51 @@ ], "authors": [ { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Événement is a very simple event dispatching library for PHP", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", "keywords": [ - "event-dispatcher", - "event-emitter" + "clock", + "now", + "psr", + "psr-20", + "time" ], "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/v3.0.2" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2023-08-08T05:53:35+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "fidry/cpu-core-counter", - "version": "1.2.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "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": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { - "Fidry\\CpuCoreCounter\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1970,96 +2540,52 @@ ], "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 Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "CPU", - "core" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2024-08-06T10:04:20+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.65.0", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/79d4f3e77b250a7d8043d76c6af8f0695e8a469f", - "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "clue/ndjson-react": "^1.0", - "composer/semver": "^3.4", - "composer/xdebug-handler": "^3.0.3", - "ext-filter": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "fidry/cpu-core-counter": "^1.2", - "php": "^7.4 || ^8.0", - "react/child-process": "^0.6.5", - "react/event-loop": "^1.0", - "react/promise": "^2.0 || ^3.0", - "react/socket": "^1.0", - "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^5.4 || ^6.0 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", - "symfony/polyfill-mbstring": "^1.28", - "symfony/polyfill-php80": "^1.28", - "symfony/polyfill-php81": "^1.28", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.4", - "infection/infection": "^0.29.8", - "justinrainbow/json-schema": "^5.3 || ^6.0", - "keradus/cli-executor": "^2.1", - "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.7", - "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", - "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", - "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", - "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" + "php": ">=7.2.0" }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters." + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", "autoload": { "psr-4": { - "PhpCsFixer\\": "src/" - }, - "exclude-from-classmap": [ - "src/Fixer/Internal/*" - ] + "Psr\\EventDispatcher\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2067,171 +2593,144 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "A tool to automatically fix PHP code style", + "description": "Standard interfaces for event handling.", "keywords": [ - "Static code analysis", - "fixer", - "standards", - "static analysis" + "events", + "psr", + "psr-14" ], "support": { - "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.65.0" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2024-11-25T00:39:24+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.12.1", + "name": "psr/http-client", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "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.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], "psr-4": { - "DeepCopy\\": "src/DeepCopy/" + "Psr\\Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "http", + "http-client", + "psr", + "psr-18" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + "source": "https://github.com/php-fig/http-client" }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-11-08T17:47:46+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { - "name": "nikic/php-parser", - "version": "v5.3.1", + "name": "psr/http-factory", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, - "bin": [ - "bin/php-parse" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A PHP parser written in PHP", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "parser", - "php" + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2024-10-08T18:51:32+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "phar-io/manifest", - "version": "2.0.4", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", "php": "^7.2 || ^8.0" }, "type": "library", @@ -2241,605 +2740,613 @@ } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { - "name": "phar-io/version", - "version": "3.2.1", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Log\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Library for handling version information and constraints", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2022-02-21T01:04:05+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "phpstan/phpstan", - "version": "2.0.x-dev", + "name": "psr/simple-cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "87f4671b7d0d5d1b872dea26c46a92546b09f656" + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/87f4671b7d0d5d1b872dea26c46a92546b09f656", - "reference": "87f4671b7d0d5d1b872dea26c46a92546b09f656", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "php": "^7.4|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" + "php": ">=8.0.0" }, - "default-branch": true, - "bin": [ - "phpstan", - "phpstan.phar" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, "autoload": { - "files": [ - "bootstrap.php" - ] + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHPStan - PHP Static Analysis Tool", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", "keywords": [ - "dev", - "static analysis" + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" ], "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" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - } - ], - "time": "2024-12-21T14:52:04+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "11.0.8", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", - "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^5.3.1", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.2.3" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^11.5.0" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "11.0.x-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "files": [ + "src/getallheaders.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.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": "A polyfill for getallheaders.", "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/11.0.8" + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-12-11T12:34:27+00:00" + "time": "2019-03-08T08:55:37+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "name": "ramsey/collection", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", "shasum": "" }, "require": { - "php": ">=8.2" + "php": "^8.1" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "5.0-dev" + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Ramsey\\Collection\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "A PHP library for representing and manipulating collections.", "keywords": [ - "filesystem", - "iterator" + "array", + "collection", + "hash", + "map", + "queue", + "set" ], "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/5.1.0" + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/ramsey", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2022-12-31T21:50:55+00:00" }, { - "name": "phpunit/php-invoker", - "version": "5.0.1", + "name": "ramsey/uuid", + "version": "4.7.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "php": ">=8.2" + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" }, "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" }, "suggest": { - "ext-pcntl": "*" + "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." }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "5.0-dev" + "captainhook": { + "force-install": true } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } + "MIT" ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", "keywords": [ - "process" + "guid", + "identifier", + "uuid" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/ramsey", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { - "name": "phpunit/php-text-template", - "version": "4.0.1", + "name": "spatie/laravel-package-tools", + "version": "1.18.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "8332205b90d17164913244f4a8e13ab7e6761d29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/8332205b90d17164913244f4a8e13ab7e6761d29", + "reference": "8332205b90d17164913244f4a8e13ab7e6761d29", "shasum": "" }, "require": { - "php": ">=8.2" + "illuminate/contracts": "^9.28|^10.0|^11.0", + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7|^8.0|^9.0", + "pestphp/pest": "^1.22|^2", + "phpunit/phpunit": "^9.5.24|^10.5", + "spatie/pest-plugin-test-time": "^1.1|^2.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", "keywords": [ - "template" + "laravel-package-tools", + "spatie" ], "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/4.0.1" + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.18.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/spatie", "type": "github" } ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2024-12-30T13:13:39+00:00" }, { - "name": "phpunit/php-timer", - "version": "7.0.1", + "name": "symfony/clock", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" }, - "require-dev": { - "phpunit/phpunit": "^11.0" + "provide": { + "psr/clock-implementation": "1.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "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": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", "keywords": [ - "timer" + "clock", + "psr20", + "time" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + "source": "https://github.com/symfony/clock/tree/v7.2.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T05:09:35+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "phpunit/phpunit", - "version": "11.5.2", + "name": "symfony/console", + "version": "v7.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "153d0531b9f7e883c5053160cad6dd5ac28140b3" + "url": "https://github.com/symfony/console.git", + "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/153d0531b9f7e883c5053160cad6dd5ac28140b3", - "reference": "153d0531b9f7e883c5053160cad6dd5ac28140b3", + "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.8", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.2", - "sebastian/comparator": "^6.2.1", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.0", - "sebastian/exporter": "^6.3.0", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.0", - "sebastian/version": "^5.0.2", - "staabm/side-effects-detector": "^1.0.5" + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "11.5-dev" - } + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, + "type": "library", "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "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": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", "keywords": [ - "phpunit", - "testing", - "xunit" + "cli", + "command-line", + "console", + "terminal" ], "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.2" + "source": "https://github.com/symfony/console/tree/v7.2.1" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-21T05:51:08+00:00" + "time": "2024-12-11T03:49:26+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "symfony/css-selector", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=8.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2847,49 +3354,70 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" }, - "time": "2019-01-08T18:20:26+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "psr/log", - "version": "3.0.2", + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=8.1" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-master": "3.x-dev" + "dev-main": "3.5-dev" } }, "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2897,48 +3425,74 @@ ], "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 logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, - "time": "2024-09-11T13:17:53+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "react/cache", - "version": "v1.2.0", + "name": "symfony/error-handler", + "version": "v7.2.1", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + "url": "https://github.com/symfony/error-handler.git", + "reference": "6150b89186573046167796fa5f3f76601d5145f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8", + "reference": "6150b89186573046167796fa5f3f76601d5145f8", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], "type": "library", "autoload": { "psr-4": { - "React\\Cache\\": "src/" - } + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2946,75 +3500,79 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Async, Promise-based cache interface for ReactPHP", - "keywords": [ - "cache", - "caching", - "promise", - "reactphp" - ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/v1.2.0" + "source": "https://github.com/symfony/error-handler/tree/v7.2.1" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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": "2022-11-30T15:59:55+00:00" + "time": "2024-12-07T08:50:44+00:00" }, { - "name": "react/child-process", - "version": "v0.6.5", + "name": "symfony/event-dispatcher", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/reactphp/child-process.git", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/event-loop": "^1.2", - "react/stream": "^1.2" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/socket": "^1.8", - "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "React\\ChildProcess\\": "src" - } + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3022,77 +3580,66 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Event-driven library for executing child processes with ReactPHP.", - "keywords": [ - "event-driven", - "process", - "reactphp" - ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "url": "https://github.com/clue", + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2022-09-16T13:41:56+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "react/dns", - "version": "v1.13.0", + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.2", - "react/promise": "^3.2 || ^2.7 || ^1.2.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4.3 || ^3 || ^2", - "react/promise-timer": "^1.11" + "php": ">=8.1", + "psr/event-dispatcher": "^1" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, "autoload": { "psr-4": { - "React\\Dns\\": "src/" + "Symfony\\Contracts\\EventDispatcher\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3101,73 +3648,71 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Async DNS resolver for ReactPHP", + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.13.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-06-13T14:18:03+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "react/event-loop", - "version": "v1.5.0", + "name": "symfony/finder", + "version": "v7.2.2", "source": { "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + "url": "https://github.com/symfony/finder.git", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" - }, - "suggest": { - "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "React\\EventLoop\\": "src/" - } + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3175,72 +3720,77 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", - "keywords": [ - "asynchronous", - "event-loop" - ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + "source": "https://github.com/symfony/finder/tree/v7.2.2" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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": "2023-11-13T13:48:05+00:00" + "time": "2024-12-30T19:00:17+00:00" }, { - "name": "react/promise", - "version": "v3.2.0", + "name": "symfony/http-foundation", + "version": "v7.2.2", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62d1a43796ca3fea3f83a8470dfe63a4af3bc588", + "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588", "shasum": "" }, "require": { - "php": ">=7.1.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", - "phpunit/phpunit": "^9.6 || ^7.5" + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" }, "type": "library", "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "React\\Promise\\": "src/" - } + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3248,76 +3798,113 @@ ], "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.2.0" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.2" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-05-24T10:39:05+00:00" + "time": "2024-12-30T19:00:17+00:00" }, { - "name": "react/socket", - "version": "v1.16.0", + "name": "symfony/http-kernel", + "version": "v7.2.2", "source": { "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3c432966bd8c7ec7429663105f5a02d7e75b4306", + "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^1.13", - "react/event-loop": "^1.2", - "react/promise": "^3.2 || ^2.6 || ^1.2.1", - "react/stream": "^1.4" + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4.3 || ^3.3 || ^2", - "react/promise-stream": "^1.4", - "react/promise-timer": "^1.11" + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" }, "type": "library", "autoload": { "psr-4": { - "React\\Socket\\": "src/" - } + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3325,74 +3912,79 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.2.2" + }, + "funding": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", - "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" - ], - "support": { - "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.16.0" - }, - "funding": [ + "url": "https://github.com/fabpot", + "type": "github" + }, { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-07-26T10:38:09+00:00" + "time": "2024-12-31T14:59:40+00:00" }, { - "name": "react/stream", - "version": "v1.4.0", + "name": "symfony/mailer", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + "url": "https://github.com/symfony/mailer.git", + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" }, "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "React\\Stream\\": "src/" - } + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3400,1071 +3992,1265 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", - "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" - ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.4.0" + "source": "https://github.com/symfony/mailer/tree/v7.2.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-06-11T12:45:25+00:00" + "time": "2024-11-25T15:21:05+00:00" }, { - "name": "sebastian/cli-parser", - "version": "3.0.2", + "name": "symfony/mime", + "version": "v7.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "url": "https://github.com/symfony/mime.git", + "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/symfony/mime/zipball/7f9617fcf15cb61be30f8b252695ed5e2bfac283", + "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "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": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "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": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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 parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], "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/3.0.2" + "source": "https://github.com/symfony/mime/tree/v7.2.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T04:41:36+00:00" + "time": "2024-12-07T08:50:44+00:00" }, { - "name": "sebastian/code-unit", - "version": "3.0.2", + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", - "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^11.5" + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.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": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-12-12T09:59:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^11.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "4.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" + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T04:45:54+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/comparator", - "version": "6.2.1", + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/43d129d6a0f81c78bee378b46688293eb7ea3739", - "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, - "require-dev": { - "phpunit/phpunit": "^11.4" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "6.2-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "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": "Laurent Bassin", + "email": "laurent@bassin.info" }, { - "name": "Volker Dusch", - "email": "github@wallbash.com" + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" }, { - "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 intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", "keywords": [ - "comparator", - "compare", - "equality" + "compatibility", + "idn", + "intl", + "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/6.2.1" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-10-31T05:30:08+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/complexity", - "version": "4.0.1", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^11.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "4.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", - "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 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/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T04:49:50+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/diff", - "version": "6.0.2", + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "6.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": "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 for the Mbstring extension", + "homepage": "https://symfony.com", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "compatibility", + "mbstring", + "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/6.0.2" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T04:53:05+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/environment", - "version": "7.2.0", + "name": "symfony/polyfill-php80", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "suggest": { - "ext-posix": "*" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "7.2-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ - "src/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "Xdebug", - "environment", - "hhvm" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T04:54:44+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/exporter", - "version": "6.3.0", + "name": "symfony/polyfill-php83", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.3" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "6.1-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, "classmap": [ - "src/" + "Resources/stubs" ] }, "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": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "export", - "exporter" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-12-05T09:17:50+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/global-state", - "version": "7.0.2", + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=7.2" }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^11.0" + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "7.0-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", "keywords": [ - "global state" + "compatibility", + "polyfill", + "portable", + "uuid" ], "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/7.0.2" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T04:57:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/lines-of-code", - "version": "3.0.1", + "name": "symfony/process", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "url": "https://github.com/symfony/process.git", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", "php": ">=8.2" }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-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", - "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": "Executes commands in sub-processes", + "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/3.0.1" + "source": "https://github.com/symfony/process/tree/v7.2.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T04:58:38+00:00" + "time": "2024-11-06T14:24:19+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "6.0.1", + "name": "symfony/routing", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "url": "https://github.com/symfony/routing.git", + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", "shasum": "" }, "require": { "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + "source": "https://github.com/symfony/routing/tree/v7.2.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T05:00:13+00:00" + "time": "2024-11-25T11:08:51+00:00" }, { - "name": "sebastian/object-reflector", - "version": "4.0.1", + "name": "symfony/service-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "require-dev": { - "phpunit/phpunit": "^11.0" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "3.5-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": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T05:01:32+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "sebastian/recursion-context", - "version": "6.0.2", + "name": "symfony/string", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "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": { - "phpunit/phpunit": "^11.0" + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.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": "Jeff Welch", - "email": "whatthejeff@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], "support": { - "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/6.0.2" + "source": "https://github.com/symfony/string/tree/v7.2.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-07-03T05:10:34+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { - "name": "sebastian/type", - "version": "5.1.0", + "name": "symfony/translation", + "version": "v7.2.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" + "url": "https://github.com/symfony/translation.git", + "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", - "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "url": "https://api.github.com/repos/symfony/translation/zipball/e2674a30132b7cc4d74540d6c2573aa363f05923", + "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" }, - "require-dev": { - "phpunit/phpunit": "^11.3" + "conflict": { + "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" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" }, + "type": "library", "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": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" + "source": "https://github.com/symfony/translation/tree/v7.2.2" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-17T13:12:04+00:00" + "time": "2024-12-07T08:18:10+00:00" }, { - "name": "sebastian/version", - "version": "5.0.2", + "name": "symfony/translation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { - "php": ">=8.2" + "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.5-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", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" - }, - "funding": [ + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "time": "2024-10-09T05:16:32+00:00" - }, - { - "name": "staabm/side-effects-detector", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.6", - "phpunit/phpunit": "^9.6.21", - "symfony/var-dumper": "^5.4.43", - "tomasvotruba/type-coverage": "1.0.0", - "tomasvotruba/unused-public": "1.0.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A static analysis tool to detect side effects in PHP code", + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", "keywords": [ - "static analysis" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { - "url": "https://github.com/staabm", + "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-10-20T05:08:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/console", - "version": "v7.2.1", + "name": "symfony/uid", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" + "url": "https://github.com/symfony/uid.git", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" + "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Component\\Uid\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4476,24 +5262,27 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", + "description": "Provides an object-oriented API to generate and represent UIDs", "homepage": "https://symfony.com", "keywords": [ - "cli", - "command-line", - "console", - "terminal" + "UID", + "ulid", + "uuid" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.1" + "source": "https://github.com/symfony/uid/tree/v7.2.0" }, "funding": [ { @@ -4509,48 +5298,47 @@ "type": "tidelift" } ], - "time": "2024-12-11T03:49:26+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "symfony/event-dispatcher", + "name": "symfony/var-dumper", "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/event-dispatcher-contracts": "^2.5|^3" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "symfony/console": "<6.4" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", "autoload": { + "files": [ + "Resources/functions/dump.php" + ], "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" + "Symfony\\Component\\VarDumper\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4562,18 +5350,22 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" }, "funding": [ { @@ -4589,113 +5381,98 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-11-08T15:48:14+00:00" }, { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" + "TijsVerkoyen\\CssToInlineStyles\\": "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": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" } ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" }, - "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:20:29+00:00" + "time": "2024-12-21T16:25:41+00:00" }, { - "name": "symfony/filesystem", - "version": "v7.2.0", + "name": "turso/libsql", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "url": "https://github.com/tursodatabase/libsql-php.git", + "reference": "6b473bf0e4911452580454e157907e63ea325fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/tursodatabase/libsql-php/zipball/6b473bf0e4911452580454e157907e63ea325fe1", + "reference": "6b473bf0e4911452580454e157907e63ea325fe1", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "ext-ffi": "*", + "php": ">=8.3" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "friendsofphp/php-cs-fixer": "^3.64", + "phpstan/phpstan": "2.0.x-dev", + "phpunit/phpunit": "^11" }, + "default-branch": true, "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Symfony\\Component\\Filesystem\\": "" + "Libsql\\": "src/", + "Libsql\\Tests\\": "tests/" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4704,125 +5481,129 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Levy A.", + "email": "levyddsa@gmail.com" } ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", + "description": "libSQL bindings for PHP", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "issues": "https://github.com/tursodatabase/libsql-php/issues", + "source": "https://github.com/tursodatabase/libsql-php/tree/master" }, - "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-10-25T15:15:23+00:00" + "time": "2025-01-14T15:35:45+00:00" }, { - "name": "symfony/finder", - "version": "v7.2.0", + "name": "vlucas/phpdotenv", + "version": "v5.6.1", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49" + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49", - "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", "shasum": "" }, "require": { - "php": ">=8.2" + "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" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "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." }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Dotenv\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" } ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.0" + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/GrahamCampbell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", "type": "tidelift" } ], - "time": "2024-10-23T06:56:12+00:00" + "time": "2024-07-20T21:52:34+00:00" }, { - "name": "symfony/options-resolver", - "version": "v7.2.0", + "name": "voku/portable-ascii", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "voku\\": "src/voku/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4830,76 +5611,79 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" } ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", "keywords": [ - "config", - "configuration", - "options" + "ascii", + "clean", + "php" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.paypal.me/moelleken", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/voku", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", "type": "tidelift" } ], - "time": "2024-11-20T11:17:29+00:00" + "time": "2024-11-21T01:49:47+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "name": "webmozart/assert", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": ">=7.2" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, - "provide": { - "ext-ctype": "*" + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "phpunit/phpunit": "^8.5.13" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-master": "1.10-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4908,74 +5692,220 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "assert", + "check", + "validate" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "brianium/paratest", + "version": "v7.7.0", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "4fb3f73bc5a4c3146bac2850af7dc72435a32daf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/4fb3f73bc5a4c3146bac2850af7dc72435a32daf", + "reference": "4fb3f73bc5a4c3146bac2850af7dc72435a32daf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.2.0", + "jean85/pretty-package-versions": "^2.1.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^11.0.8", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-timer": "^7.0.1", + "phpunit/phpunit": "^11.5.1", + "sebastian/environment": "^7.2.0", + "symfony/console": "^6.4.14 || ^7.2.1", + "symfony/process": "^6.4.14 || ^7.2.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^2.0.3", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.1", + "phpstan/phpstan-strict-rules": "^2", + "squizlabs/php_codesniffer": "^3.11.1", + "symfony/filesystem": "^6.4.13 || ^7.2.0" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" } ], - "time": "2024-09-09T11:45:10+00:00" + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.7.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2024-12-11T14:50:44+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "name": "clue/ndjson-react", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=5.3", + "react/stream": "^1.2" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4984,79 +5914,4242 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "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.3" + }, + "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-09-19T14:15:21+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" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "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": "doctrine/deprecations", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + }, + "time": "2024-12-07T21:18:45+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "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." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "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": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "filp/whoops", + "version": "2.16.0", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.16.0" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2024-09-25T12:00:00+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.68.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "73f78d8b2b34a0dd65fedb434a602ee4c2c8ad4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/73f78d8b2b34a0dd65fedb434a602ee4c2c8ad4c", + "reference": "73f78d8b2b34a0dd65fedb434a602ee4c2c8ad4c", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.2", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.1 || ^6.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/polyfill-mbstring": "^1.31", + "symfony/polyfill-php80": "^1.31", + "symfony/polyfill-php81": "^1.31", + "symfony/process": "^5.4 || ^6.4 || ^7.2", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", + "justinrainbow/json-schema": "^5.3 || ^6.0", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2", + "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2025-01-13T17:01:01+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" + }, + "time": "2024-11-18T16:19:46+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "353ac12134b98e2e7c3333d916bd3e523931e583" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/353ac12134b98e2e7c3333d916bd3e523931e583", + "reference": "353ac12134b98e2e7c3333d916bd3e523931e583", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0", + "illuminate/contracts": "^10.24|^11.0", + "illuminate/log": "^10.24|^11.0", + "illuminate/process": "^10.24|^11.0", + "illuminate/support": "^10.24|^11.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.12|^9.0", + "pestphp/pest": "^2.20", + "pestphp/pest-plugin-type-coverage": "^2.3", + "phpstan/phpstan": "^1.10", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2024-10-23T12:56:23+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.0" + }, + "time": "2024-09-23T13:32:56+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "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" + ], + "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" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "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" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + }, + "time": "2024-12-30T11:07:19+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.5.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "f5c101b929c958e849a633283adff296ed5f38f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f5c101b929c958e849a633283adff296ed5f38f5", + "reference": "f5c101b929c958e849a633283adff296ed5f38f5", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.16.0", + "nunomaduro/termwind": "^2.1.0", + "php": "^8.2.0", + "symfony/console": "^7.1.5" + }, + "conflict": { + "laravel/framework": "<11.0.0 || >=12.0.0", + "phpunit/phpunit": "<10.5.1 || >=12.0.0" + }, + "require-dev": { + "larastan/larastan": "^2.9.8", + "laravel/framework": "^11.28.0", + "laravel/pint": "^1.18.1", + "laravel/sail": "^1.36.0", + "laravel/sanctum": "^4.0.3", + "laravel/tinker": "^2.10.0", + "orchestra/testbench-core": "^9.5.3", + "pestphp/pest": "^2.36.0 || ^3.4.0", + "sebastian/environment": "^6.1.0 || ^7.2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-10-15T16:06:32+00:00" + }, + { + "name": "orchestra/canvas", + "version": "v9.2.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas.git", + "reference": "b7156c011d780ee1e09a66eb73a38bfa23db759a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas/zipball/b7156c011d780ee1e09a66eb73a38bfa23db759a", + "reference": "b7156c011d780ee1e09a66eb73a38bfa23db759a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^11.35", + "illuminate/database": "^11.35", + "illuminate/filesystem": "^11.35", + "illuminate/support": "^11.35", + "orchestra/canvas-core": "^9.0", + "orchestra/testbench-core": "^9.7", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/yaml": "^7.0.3" + }, + "require-dev": { + "laravel/framework": "^11.35", + "laravel/pint": "^1.17", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^11.3.6", + "spatie/laravel-ray": "^1.35" + }, + "bin": [ + "canvas" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Orchestra\\Canvas\\LaravelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas/tree/v9.2.0" + }, + "time": "2024-11-30T15:48:36+00:00" + }, + { + "name": "orchestra/canvas-core", + "version": "v9.0.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas-core.git", + "reference": "3a29eecf324fe02e3e5628e422314b5cd1a80e48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas-core/zipball/3a29eecf324fe02e3e5628e422314b5cd1a80e48", + "reference": "3a29eecf324fe02e3e5628e422314b5cd1a80e48", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^11.0", + "illuminate/filesystem": "^11.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.28" + }, + "require-dev": { + "laravel/framework": "^11.0", + "laravel/pint": "^1.6", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^9.0", + "phpstan/phpstan": "^1.10.6", + "phpunit/phpunit": "^10.1", + "symfony/yaml": "^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Orchestra\\Canvas\\Core\\LaravelServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "9.0-dev" + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\Core\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators Builder for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas-core/tree/v9.0.0" + }, + "time": "2024-03-06T10:00:21+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v9.9.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "2f3e8c687ca5c0bd4d8bc91c4448983d046ba32b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/2f3e8c687ca5c0bd4d8bc91c4448983d046ba32b", + "reference": "2f3e8c687ca5c0bd4d8bc91c4448983d046ba32b", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.35.0", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^9.9.0", + "orchestra/workbench": "^9.13.0", + "php": "^8.2", + "phpunit/phpunit": "^10.5.35 || ^11.3.6", + "symfony/process": "^7.0.3", + "symfony/yaml": "^7.0.3", + "vlucas/phpdotenv": "^5.6.1" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v9.9.0" + }, + "time": "2024-12-25T23:40:19+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v9.9.1", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "ad211dc59c830a987eb34c18742f9c7875178eae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/ad211dc59c830a987eb34c18742f9c7875178eae", + "reference": "ad211dc59c830a987eb34c18742f9c7875178eae", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31" + }, + "conflict": { + "brianium/paratest": "<7.3.0 || >=8.0.0", + "laravel/framework": "<11.35.0 || >=12.0.0", + "laravel/serializable-closure": "<1.3.0 || >=3.0.0", + "nunomaduro/collision": "<8.0.0 || >=9.0.0", + "orchestra/testbench-dusk": "<9.10.0 || >=10.0.0", + "phpunit/phpunit": "<10.5.35 || >=11.0.0 <11.3.6 || >=11.6.0" + }, + "require-dev": { + "fakerphp/faker": "^1.24", + "laravel/framework": "^11.35.0", + "laravel/pint": "^1.17", + "laravel/serializable-closure": "^1.3 || ^2.0", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35 || ^11.3.6", + "spatie/laravel-ray": "^1.39", + "symfony/process": "^7.0.3", + "symfony/yaml": "^7.0.3", + "vlucas/phpdotenv": "^5.6.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel testing (^7.3).", + "ext-pcntl": "Required to use all features of the console signal trapping.", + "fakerphp/faker": "Allow using Faker for testing (^1.23).", + "laravel/framework": "Required for testing (^11.35.0).", + "mockery/mockery": "Allow using Mockery for testing (^1.6).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^8.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^9.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^10.5 || ^11.0).", + "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^7.0).", + "symfony/yaml": "Required for Testbench CLI (^7.0).", + "vlucas/phpdotenv": "Required for Testbench CLI (^5.4.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "time": "2025-01-07T02:00:47+00:00" + }, + { + "name": "orchestra/workbench", + "version": "v9.13.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/workbench.git", + "reference": "9c9a42060735bfb49b1298c39dba392f936de372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/workbench/zipball/9c9a42060735bfb49b1298c39dba392f936de372", + "reference": "9c9a42060735bfb49b1298c39dba392f936de372", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.35", + "laravel/pail": "^1.2", + "laravel/tinker": "^2.9", + "nunomaduro/collision": "^8.0", + "orchestra/canvas": "^9.1", + "orchestra/testbench-core": "^9.9.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31", + "symfony/process": "^7.0.3", + "symfony/yaml": "^7.0.3" + }, + "require-dev": { + "laravel/pint": "^1.17", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35 || ^11.3.6", + "spatie/laravel-ray": "^1.39" + }, + "suggest": { + "ext-pcntl": "Required to use all features of the console signal trapping." + }, + "type": "library", + "autoload": { + "psr-4": { + "Orchestra\\Workbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Workbench Companion for Laravel Packages Development", + "keywords": [ + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/workbench/issues", + "source": "https://github.com/orchestral/workbench/tree/v9.13.0" + }, + "time": "2024-12-24T11:40:02+00:00" + }, + { + "name": "pestphp/pest", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "bf3178473dcaa53b0458f21dfdb271306ea62512" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/bf3178473dcaa53b0458f21dfdb271306ea62512", + "reference": "bf3178473dcaa53b0458f21dfdb271306ea62512", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.7.0", + "nunomaduro/collision": "^8.5.0", + "nunomaduro/termwind": "^2.3.0", + "pestphp/pest-plugin": "^3.0.0", + "pestphp/pest-plugin-arch": "^3.0.0", + "pestphp/pest-plugin-mutate": "^3.0.5", + "php": "^8.2.0", + "phpunit/phpunit": "^11.5.1" + }, + "conflict": { + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">11.5.1", + "sebastian/exporter": "<6.0.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^3.3.0", + "pestphp/pest-plugin-type-coverage": "^3.2.0", + "symfony/process": "^7.2.0" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Mutate\\Plugins\\Mutate", + "Pest\\Plugins\\Configuration", + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Parallel" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "The elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-12-12T11:52:01+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.2" + }, + "conflict": { + "pestphp/pest": "<3.0.0" + }, + "require-dev": { + "composer/composer": "^2.7.9", + "pestphp/pest": "^3.0.0", + "pestphp/pest-dev-tools": "^3.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-09-08T23:21:41+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/0a27e55a270cfe73d8cb70551b91002ee2cb64b0", + "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "ta-tikoma/phpunit-architecture-test": "^0.8.4" + }, + "require-dev": { + "pestphp/pest": "^3.0.0", + "pestphp/pest-dev-tools": "^3.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Arch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Arch plugin for Pest PHP.", + "keywords": [ + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-09-08T23:23:55+00:00" + }, + { + "name": "pestphp/pest-plugin-mutate", + "version": "v3.0.5", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-mutate.git", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.2.0", + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "psr/simple-cache": "^3.0.0" + }, + "require-dev": { + "pestphp/pest": "^3.0.8", + "pestphp/pest-dev-tools": "^3.0.0", + "pestphp/pest-plugin-type-coverage": "^3.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pest\\Mutate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sandro Gehri", + "email": "sandrogehri@gmail.com" + } + ], + "description": "Mutates your code to find untested cases", + "keywords": [ + "framework", + "mutate", + "mutation", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-09-22T07:54:40+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "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" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "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": "phpdocumentor/reflection-docblock", + "version": "5.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "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" + }, + "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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "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/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" + }, + "time": "2024-12-07T09:39:29+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0" + }, + "time": "2024-10-13T11:29:49+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "87f4671b7d0d5d1b872dea26c46a92546b09f656" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/87f4671b7d0d5d1b872dea26c46a92546b09f656", + "reference": "87f4671b7d0d5d1b872dea26c46a92546b09f656", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "default-branch": true, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "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" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-12-21T14:52:04+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.3.1", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.0" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "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/11.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-11T12:34:27+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "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/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-27T05:02:59+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "2b94d4f2450b9869fa64a46fd8a6a41997aef56a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2b94d4f2450b9869fa64a46fd8a6a41997aef56a", + "reference": "2b94d4f2450b9869fa64a46fd8a6a41997aef56a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.7", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.1", + "sebastian/comparator": "^6.2.1", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.0", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.1" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-12-11T10:52:48+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.7", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + }, + "time": "2024-12-10T01:58:33+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.6", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-01-01T16:37:48+00:00" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, + { + "name": "react/socket", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-07-26T10:38:09+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-12T09:59:06+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115", + "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-01-06T10:28:19+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "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/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:54:44+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "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": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-05T09:17:50+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "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/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:10:34+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-09-17T13:12:04+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "name": "symfony/filesystem", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/symfony/filesystem.git", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "symfony/process": "^6.4|^7.0" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Component\\Filesystem\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5065,26 +10158,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/filesystem/tree/v7.2.0" }, "funding": [ { @@ -5100,41 +10185,33 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-10-25T15:15:23+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "name": "symfony/options-resolver", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Component\\OptionsResolver\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5143,28 +10220,23 @@ ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "config", + "configuration", + "options" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" }, "funding": [ { @@ -5180,7 +10252,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-11-20T11:17:29+00:00" }, { "name": "symfony/polyfill-php81", @@ -5259,29 +10331,38 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/process", - "version": "v7.2.0", + "name": "symfony/polyfill-php84", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5290,18 +10371,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Executes commands in sub-processes", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/process/tree/v7.2.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.31.0" }, "funding": [ { @@ -5317,46 +10404,33 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:24:19+00:00" + "time": "2024-09-09T12:04:04+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.5.1", + "name": "symfony/stopwatch", + "version": "v7.2.2", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "url": "https://github.com/symfony/stopwatch.git", + "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df", + "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df", "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", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" + "Symfony\\Component\\Stopwatch\\": "" }, "exclude-from-classmap": [ - "/Test/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5365,26 +10439,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/stopwatch/tree/v7.2.2" }, "funding": [ { @@ -5400,30 +10466,40 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-12-18T14:28:33+00:00" }, { - "name": "symfony/stopwatch", + "name": "symfony/yaml", "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "696f418b0d722a4225e1c3d95489d262971ca924" + "url": "https://github.com/symfony/yaml.git", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924", - "reference": "696f418b0d722a4225e1c3d95489d262971ca924", + "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5443,10 +10519,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.0" + "source": "https://github.com/symfony/yaml/tree/v7.2.0" }, "funding": [ { @@ -5462,51 +10538,38 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-10-23T06:56:12+00:00" }, { - "name": "symfony/string", - "version": "v7.2.0", + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.4", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636", "shasum": "" }, "require": { - "php": ">=8.2", - "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" + "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", + "symfony/finder": "^6.4.0 || ^7.0.0" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "PHPUnit\\Architecture\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5514,42 +10577,27 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.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", + "description": "Methods for testing application architecture", "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "architecture", + "phpunit", + "stucture", + "test", + "testing" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.4" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2024-01-05T14:10:56+00:00" }, { "name": "theseer/tokenizer", diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..7d0904f --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,18 @@ + + + + + ./tests + + + + + ./app + ./src + + + diff --git a/src/Database/LibsqlConnection.php b/src/Database/LibsqlConnection.php new file mode 100644 index 0000000..1c29f4f --- /dev/null +++ b/src/Database/LibsqlConnection.php @@ -0,0 +1,262 @@ +db = $db; + $this->schemaGrammar = $this->getDefaultSchemaGrammar(); + } + + public function sync(): void + { + $this->db->sync(); + } + + public function getConnectionMode(): string + { + return $this->db->getConnectionMode(); + } + + public function inTransaction(): bool + { + return $this->db->inTransaction(); + } + + public function setFetchMode(int $mode, mixed ...$args): bool + { + $this->mode = $mode; + + return true; + } + + public function getServerVersion(): string + { + return $this->db->version(); + } + + public function getPdo(): LibsqlDatabase + { + return $this->db; + } + + /** + * Set the active PDO connection used for reads. + * + * @param LibsqlDatabase|\Closure $pdo + * @return \Libsql\Laravel\Database\LibsqlConnection + */ + public function setReadPdo($pdo): self + { + $this->readPdo = $pdo; + + return $this; + } + + public function createReadPdo(array $config): ?LibsqlDatabase + { + $db = function () use ($config) { + return new LibsqlDatabase($config); + }; + $this->setReadPdo($db); + + return $db(); + } + + public function selectOne($query, $bindings = [], $useReadPdo = true) + { + $records = $this->select($query, $bindings, $useReadPdo); + + return array_shift($records); + } + + public function select($query, $bindings = [], $useReadPdo = true) + { + $bindings = array_map(function ($binding) { + return is_bool($binding) ? (int) $binding : $binding; + }, $bindings); + + $data = $this->run($query, $bindings, function ($query, $bindings) { + if ($this->pretending()) { + return []; + } + + $statement = $this->getPdo()->prepare($query); + $results = (array) $statement->query($bindings); + + $decodedResults = array_map(function ($row) { + return decodeBlobs($row); + }, $results); + + return $decodedResults; + }); + + $rowValues = array_values($data); + + return match ($this->mode) { + \PDO::FETCH_BOTH => array_merge($data, $rowValues), + \PDO::FETCH_ASSOC, \PDO::FETCH_NAMED => $data, + \PDO::FETCH_NUM => $rowValues, + \PDO::FETCH_OBJ => arrayToStdClass($data), + default => throw new \PDOException('Unsupported fetch mode.'), + }; + } + + public function insert($query, $bindings = []): bool + { + return $this->affectingStatement($query, $bindings) > 0; + } + + public function update($query, $bindings = []) + { + return $this->affectingStatement($query, $bindings); + } + + public function delete($query, $bindings = []) + { + return $this->affectingStatement($query, $bindings); + } + + public function affectingStatement($query, $bindings = []) + { + $bindings = array_map(function ($binding) { + return is_bool($binding) ? (int) $binding : $binding; + }, $bindings); + + return $this->run($query, $bindings, function ($query, $bindings) { + if ($this->pretending()) { + return 0; + } + + $statement = $this->getPdo()->prepare($query); + + foreach ($bindings as $key => $value) { + $type = is_resource($value) ? \PDO::PARAM_LOB : \PDO::PARAM_STR; + $statement->bindValue($key, $value, $type); + } + + $statement->execute(); + + $this->recordsHaveBeenModified(($count = $statement->rowCount()) > 0); + + return $count; + }); + } + + #[\ReturnTypeWillChange] + protected function getDefaultSchemaGrammar(): LibsqlSchemaGrammar + { + ($grammar = new LibsqlSchemaGrammar)->setConnection($this); + return $this->withTablePrefix($grammar); + } + + public function getSchemaBuilder(): LibsqlSchemaBuilder + { + if ($this->schemaGrammar === null) { + $this->useDefaultSchemaGrammar(); + } + + return new LibsqlSchemaBuilder($this->db, $this); + } + + public function getDefaultPostProcessor(): LibsqlQueryProcessor + { + return new LibsqlQueryProcessor; + } + + public function useDefaultPostProcessor() + { + $this->postProcessor = $this->getDefaultPostProcessor(); + } + + protected function getDefaultQueryGrammar() + { + ($grammar = new LibsqlQueryGrammar)->setConnection($this); + $this->withTablePrefix($grammar); + + return $grammar; + } + + public function useDefaultQueryGrammar() + { + $this->queryGrammar = $this->getDefaultQueryGrammar(); + } + + public function query() + { + $grammar = $this->getQueryGrammar(); + $processor = $this->getPostProcessor(); + + return new LibsqlQueryBuilder( + $this, + $grammar, + $processor + ); + } + + public function getSchemaState(?Filesystem $files = null, ?callable $processFactory = null): LibsqlSchemaState + { + return new LibSQLSchemaState($this, $files, $processFactory); + } + + public function isUniqueConstraintError(\Exception $exception): bool + { + return (bool) preg_match('#(column(s)? .* (is|are) not unique|UNIQUE constraint failed: .*)#i', $exception->getMessage()); + } + + public function escapeString($input) + { + if ($input === null) { + return 'NULL'; + } + + return \SQLite3::escapeString($input); + } + + public function quote($input) + { + if ($input === null) { + return 'NULL'; + } + + if (is_string($input)) { + return "'" . $this->escapeString($input) . "'"; + } + + if (is_resource($input)) { + return $this->escapeBinary(stream_get_contents($input)); + } + + return $this->escapeBinary($input); + } + +} diff --git a/src/Database/LibsqlConnectionFactory.php b/src/Database/LibsqlConnectionFactory.php new file mode 100644 index 0000000..25779ca --- /dev/null +++ b/src/Database/LibsqlConnectionFactory.php @@ -0,0 +1,34 @@ +createConfig($config); + $connectionMode = $this->detectConnectionMode($config); + + $this->db = $this->buildConnection($connectionMode, $config); + $this->in_transaction = false; + } + + private function createConfig(array $config): array + { + return [ + 'path' => $config['database'] ?? null, + 'url' => $config['url'] ?? null, + 'authToken' => $config['password'] ?? null, + 'encryptionKey' => $config['encryptionKey'] ?? null, + 'syncInterval' => $config['syncInterval'] ?? 0, + 'disable_read_your_writes' => $config['read_your_writes'] ?? true, + 'webpki' => $config['webpki'] ?? false, + ]; + } + + private function buildConnection(string $mode, array $config): Connection + { + $db = match ($mode) { + 'local' => new Database(path: $config['path']), + 'remote' => new Database(url: $config['url'], authToken: $config['authToken']), + 'remote_replica' => new Database( + path: $config['path'], + url: $config['url'], + authToken: $config['authToken'], + syncInterval: $config['syncInterval'], + readYourWrites: $config['disable_read_your_writes'], + webpki: $config['webpki'] + ), + default => new Database(':memory:') + }; + + return $db->connect(); + } + + private function detectConnectionMode(array $config): string + { + $database = $config['path']; + $url = $config['url']; + $authToken = $config['authToken']; + + $mode = 'unknown'; + + if ($database === ':memory:') { + $mode = 'memory'; + } + + if (empty($database) && !empty($url) && !empty($authToken)) { + $mode = 'remote'; + } + + if (!empty($database) && $database !== ':memory:' && empty($url) && empty($authToken) && empty($url)) { + $mode = 'local'; + } + + if (!empty($database) && $database !== ':memory:' && !empty($authToken) && !empty($url)) { + $mode = 'remote_replica'; + } + + $this->connection_mode = $mode; + + return $mode; + } + + public function version(): string + { + // TODO: Need to return an actual version from libSQL binary + return '0.0.1'; + } + + public function inTransaction(): bool + { + return $this->in_transaction; + } + + public function sync(): void + { + if ($this->connection_mode !== 'remote_replica') { + throw new \Exception("[Libsql:{$this->connection_mode}] Sync is only available for Remote Replica Connection.", 1); + } + $this->conn->sync(); + } + + public function getConnectionMode(): string + { + return $this->connection_mode; + } + + public function setFetchMode(int $mode, mixed ...$args): bool + { + $this->mode = $mode; + + return true; + } + + public function beginTransaction(): bool + { + if ($this->inTransaction()) { + throw new \PDOException('Already in a transaction'); + } + + $this->in_transaction = true; + $this->tx = $this->db->transaction(); + + return true; + } + + public function prepare(string $sql): LibsqlStatement + { + return new LibsqlStatement( + ($this->inTransaction() ? $this->tx : $this->db)->prepare($sql), + $sql + ); + } + + public function exec(string $queryStatement): int + { + $statement = $this->prepare($queryStatement); + $statement->execute(); + + return $statement->rowCount(); + } + + public function query(string $sql, array $params = []) + { + $results = $this->db->query($sql, $params)->fetchArray(); + $rowValues = array_values($results); + + return match ($this->mode) { + \PDO::FETCH_BOTH => array_merge($results, $rowValues), + \PDO::FETCH_ASSOC, \PDO::FETCH_NAMED => $results, + \PDO::FETCH_NUM => $rowValues, + \PDO::FETCH_OBJ => $results, + default => throw new \PDOException('Unsupported fetch mode.'), + }; + } + + public function setLastInsertId(?string $name = null, ?int $value = null): void + { + if ($name === null) { + $name = 'id'; + } + + $this->lastInsertIds[$name] = $value; + } + + public function lastInsertId(?string $name = null): int|string + { + if ($name === null) { + $name = 'id'; + } + + return isset($this->lastInsertIds[$name]) + ? (string) $this->lastInsertIds[$name] + : $this->db->lastInsertId(); + + } + + public function escapeString($input) + { + if ($input === null) { + return 'NULL'; + } + + return \SQLite3::escapeString($input); + } + + public function quote($input) + { + if ($input === null) { + return 'NULL'; + } + + return "'" . $this->escapeString($input) . "'"; + } + + public function commit(): bool + { + if (!$this->inTransaction()) { + throw new \PDOException('No active transaction'); + } + + $this->tx->commit(); + $this->in_transaction = false; + + return true; + } + + public function rollBack(): bool + { + if (!$this->inTransaction()) { + throw new \PDOException('No active transaction'); + } + + $this->tx->rollback(); + $this->in_transaction = false; + + return true; + } + +} diff --git a/src/Database/LibsqlQueryBuilder.php b/src/Database/LibsqlQueryBuilder.php new file mode 100644 index 0000000..463608a --- /dev/null +++ b/src/Database/LibsqlQueryBuilder.php @@ -0,0 +1,30 @@ +applyBeforeQueryCallbacks(); + + $results = $this->connection->select( + $this->grammar->compileExists($this), + $this->getBindings(), + !$this->useWritePdo + ); + + $results = (array) $results; + if (isset($results[0])) { + $results = (array) $results[0]; + + return (bool) ($results['exists'] ?? false); + } + + return false; + } +} diff --git a/src/Database/LibsqlQueryGrammar.php b/src/Database/LibsqlQueryGrammar.php new file mode 100644 index 0000000..5778294 --- /dev/null +++ b/src/Database/LibsqlQueryGrammar.php @@ -0,0 +1,11 @@ + $result->name, + 'schema' => $result->schema ?? null, // PostgreSQL and SQL Server + 'size' => isset($result->size) ? (int) $result->size : null, + 'comment' => $result->comment ?? null, // MySQL and PostgreSQL + 'collation' => $result->collation ?? null, // MySQL only + 'engine' => $result->engine ?? null, // MySQL only + ]; + }, $results); + } + + public function processViews($results) + { + return array_map(function ($result) { + $result = (object) $result; + + return [ + 'name' => $result->name, + 'schema' => $result->schema ?? null, // PostgreSQL and SQL Server + 'definition' => $result->definition, + ]; + }, $results); + } + + public function processSelect(Builder $query, $results) + { + return $results; + } +} diff --git a/src/Database/LibsqlSchemaBuilder.php b/src/Database/LibsqlSchemaBuilder.php new file mode 100644 index 0000000..d7036a5 --- /dev/null +++ b/src/Database/LibsqlSchemaBuilder.php @@ -0,0 +1,134 @@ +db->prepare($this->grammar()->compileDropAllIndexes()); + $results = $statement->query(); + + collect($results)->each(function (array $query) { + $query = array_values($query)[0]; + $this->db->query($query); + }); + } + + public function dropAllTables(): void + { + $this->dropAllTriggers(); + $this->dropAllIndexes(); + + $this->db->exec($this->grammar()->compileDisableForeignKeyConstraints()); + + $statement = $this->db->prepare($this->grammar()->compileDropAllTables()); + $results = $statement->query(); + + collect($results)->each(function (array $query) { + $query = array_values($query)[0]; + $this->db->query($query); + }); + + $this->db->exec($this->grammar()->compileEnableForeignKeyConstraints()); + } + + protected function dropAllTriggers(): void + { + $statement = $this->db->prepare($this->grammar()->compileDropAllTriggers()); + $results = $statement->query(); + + collect($results)->each(function (array $query) { + $query = array_values($query)[0]; + $this->db->query($query); + }); + } + + public function dropAllViews(): void + { + $statement = $this->db->prepare($this->grammar()->compileDropAllViews()); + $results = $statement->query(); + + collect($results)->each(function (array $query) { + $query = array_values($query)[0]; + $this->db->query($query); + }); + } + + public function getColumns($table) + { + $table = $this->connection->getTablePrefix() . $table; + + $data = $this->connection->select("PRAGMA table_xinfo('{$table}')"); + + $columns = $this->connection->selectOne("SELECT sql FROM sqlite_master WHERE type='table' AND name='{$table}'"); + + $pattern = '/(?:\(|,)\s*[\'"`]?([a-zA-Z_][a-zA-Z0-9_]*)[\'"`]?\s+[a-zA-Z]+/i'; + preg_match_all($pattern, $columns->sql, $matches); + $columnMatches = $matches[1] ?? []; + + $delctypes = stdClassToArray($data); + foreach ($delctypes as $key => $value) { + + if (isset($delctypes[$key]['name'])) { + $delctypes[$key]['name'] = $columnMatches[$key]; + } + + if (isset($delctypes[$key]['type'])) { + $type = strtolower($delctypes[$key]['type']); + $delctypes[$key]['type'] = $type; + $delctypes[$key]['type_name'] = $type; + } + + if (isset($delctypes[$key]['notnull'])) { + $delctypes[$key]['nullable'] = $delctypes[$key]['notnull'] == 1 ? false : true; + } + + if (isset($delctypes[$key]['dflt_value'])) { + $delctypes[$key]['default'] = $delctypes[$key]['dflt_value'] == 'NULL' ? null : new Expression(Str::wrap($delctypes[$key]['dflt_value'], '(', ')')); + } + + if (isset($delctypes[$key]['pk'])) { + $delctypes[$key]['auto_increment'] = $delctypes[$key]['pk'] == 1 ? true : false; + } + + $delctypes[$key]['collation'] = null; + $delctypes[$key]['comment'] = null; + $delctypes[$key]['generation'] = null; + } + + $keyOrder = ['name', 'type_name', 'type', 'collation', 'nullable', 'default', 'auto_increment', 'comment', 'generation', 'pk', 'notnull', 'dflt_value', 'cid', 'hidden']; + $delctypes = reorderArrayKeys($delctypes, $keyOrder); + + return $delctypes; + } + + protected function grammar(): LibsqlSchemaGrammar + { + $grammar = new LibsqlSchemaGrammar; + + return $grammar; + } +} diff --git a/src/Database/LibsqlSchemaGrammar.php b/src/Database/LibsqlSchemaGrammar.php new file mode 100644 index 0000000..8a32e21 --- /dev/null +++ b/src/Database/LibsqlSchemaGrammar.php @@ -0,0 +1,45 @@ +dimensions) && $column->dimensions !== '') { + return "F32_BLOB({$column->dimensions})"; + } + + throw new \RuntimeException('Dimension must be set for vector embedding'); + } +} diff --git a/src/Database/LibsqlSchemaState.php b/src/Database/LibsqlSchemaState.php new file mode 100644 index 0000000..b8fc894 --- /dev/null +++ b/src/Database/LibsqlSchemaState.php @@ -0,0 +1,11 @@ +mode = $mode; + + return true; + } + + public function bindValue($parameter, $value = null, $type = \PDO::PARAM_STR): self + { + if (is_int($parameter)) { + $this->bindings[$parameter] = $value; + } elseif (is_string($parameter)) { + $this->bindings[$parameter] = $value; + } else { + throw new \InvalidArgumentException('Parameter must be an integer or string.'); + } + + $this->bindings = $this->parameterCasting($this->bindings); + + return $this; + } + + public function prepare(string $query): self + { + return new self($this->statement, $query); + } + + public function query(array $parameters = []): mixed + { + if (empty($parameters)) { + $parameters = $this->parameterCasting($this->bindings); + + foreach ($parameters as $key => $value) { + $this->statement->bind([$key => $value]); + } + + $results = $this->statement->query()->fetchArray(); + $rows = decodeDoubleBase64($results); + $rowValues = array_values($rows); + + return match ($this->mode) { + \PDO::FETCH_BOTH => array_merge($rows, $rowValues), + \PDO::FETCH_ASSOC, \PDO::FETCH_NAMED => $rows, + \PDO::FETCH_NUM => $rowValues, + \PDO::FETCH_OBJ => (object) $rows, + default => throw new \PDOException('Unsupported fetch mode.'), + }; + } + + $parameters = $this->parameterCasting($parameters); + foreach ($parameters as $key => $value) { + $this->statement->bind([$key => $value]); + } + $result = $this->statement->query()->fetchArray(); + $rows = decodeDoubleBase64($result); + + return match ($this->mode) { + \PDO::FETCH_ASSOC => collect($rows), + \PDO::FETCH_OBJ => (object) $rows, + \PDO::FETCH_NUM => array_values($rows), + default => collect($rows) + }; + } + + public function execute(array $parameters = []): bool + { + try { + + if (empty($parameters)) { + $parameters = $this->bindings; + } + + foreach ($parameters as $key => $value) { + $this->statement->bind([$key => $value]); + } + + if (str_starts_with(strtolower($this->query), 'select')) { + $queryRows = $this->statement->query()->fetchArray(); + $this->affectedRows = count($queryRows); + } else { + $this->affectedRows = $this->statement->execute(); + } + + return true; + } catch (\Exception $e) { + return false; + } + } + + #[\ReturnTypeWillChange] + public function fetch(int $mode = \PDO::FETCH_DEFAULT, int $cursorOrientation = \PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): array|false + { + if ($mode === \PDO::FETCH_DEFAULT) { + $mode = $this->mode; + } + + $parameters = $this->bindings; + $parameters = $this->parameterCasting($parameters); + foreach ($parameters as $key => $value) { + $this->statement->bind([$key => $value]); + } + + $result = $this->statement->query(); + $rows = $result->fetchArray(); + + $row = $rows[$cursorOffset]; + $mode = \PDO::FETCH_ASSOC; + + if ($this->response === $row) { + return false; + } + $this->response = $row; + + $rowValues = array_values($row); + + $response = match ($mode) { + \PDO::FETCH_BOTH => array_merge($row, $rowValues), + \PDO::FETCH_ASSOC, \PDO::FETCH_NAMED => $row, + \PDO::FETCH_NUM => $rowValues, + \PDO::FETCH_OBJ => (object) $row, + default => throw new \PDOException('Unsupported fetch mode.'), + }; + + return $response; + } + + #[\ReturnTypeWillChange] + public function fetchAll(int $mode = \PDO::FETCH_DEFAULT, ...$args): array + { + if ($mode === \PDO::FETCH_DEFAULT) { + $mode = $this->mode; + } + + $parameters = $this->parameterCasting($this->bindings); + foreach ($parameters as $key => $value) { + $this->statement->bind([$key => $value]); + } + + $result = $this->statement->query(); + $rows = $result->fetchArray(); + + $allRows = $rows; + $decodedRows = $this->parameterCasting($allRows); + $rowValues = \array_map('array_values', $decodedRows); + + $data = match ($mode) { + \PDO::FETCH_BOTH => array_merge($allRows, $rowValues), + \PDO::FETCH_ASSOC, \PDO::FETCH_NAMED => $allRows, + \PDO::FETCH_NUM => $rowValues, + \PDO::FETCH_OBJ => (object) $allRows, + default => throw new \PDOException('Unsupported fetch mode.'), + }; + + return $data; + } + + public function getAffectedRows(): int + { + return $this->affectedRows; + } + + public function nextRowset(): bool + { + // TFIDK: database is support for multiple rowset. + return false; + } + + public function rowCount(): int + { + return $this->affectedRows; + } + + public function closeCursor(): void + { + $this->statement->reset(); + } + + private function parameterCasting(array $parameters): array + { + $parameters = collect(array_values($parameters))->map(function ($value) { + $type = match (true) { + is_string($value) && (!ctype_print($value) || !mb_check_encoding($value, 'UTF-8')) => 'blob', + is_float($value) || is_float($value) => 'float', + is_int($value) => 'integer', + is_bool($value) => 'boolean', + $value === null => 'null', + $value instanceof Carbon => 'datetime', + is_vector($value) => 'vector', + default => 'text', + }; + + if ($type === 'blob') { + $value = base64_encode(base64_encode($value)); + } + + if ($type === 'boolean') { + $value = (int) $value; + } + + if ($type === 'datetime') { + $value = $value->toDateTimeString(); + } + + if ($type === 'vector') { + $value = json_encode($value); + } + + return $value; + })->toArray(); + + return $parameters; + } +} diff --git a/src/Exceptions/ConfigurationIsNotFound.php b/src/Exceptions/ConfigurationIsNotFound.php new file mode 100644 index 0000000..0a1f682 --- /dev/null +++ b/src/Exceptions/ConfigurationIsNotFound.php @@ -0,0 +1,11 @@ +setConnection($this); - return $this->withTablePrefix($grammar); - } -} diff --git a/src/LibsqlManager.php b/src/LibsqlManager.php new file mode 100644 index 0000000..2f171c4 --- /dev/null +++ b/src/LibsqlManager.php @@ -0,0 +1,31 @@ +config = new Collection($config); + $this->client = new LibSQLDatabase($config); + } + + public function __call(string $method, array $arguments = []): mixed + { + if (!method_exists($this->client, $method)) { + throw new BadMethodCallException('Call to undefined method ' . static::class . '::' . $method . '()'); + } + + return $this->client->$method(...$arguments); + } +} diff --git a/src/LibsqlSchemaGrammar.php b/src/LibsqlSchemaGrammar.php deleted file mode 100644 index a73ce2b..0000000 --- a/src/LibsqlSchemaGrammar.php +++ /dev/null @@ -1,16 +0,0 @@ -dimensions) && $column->dimensions !== '') { - return "F32_BLOB({$column->dimensions})"; - } - - throw new RuntimeException('Dimension must be set for vector embedding'); - } -} diff --git a/src/LibsqlServiceProvider.php b/src/LibsqlServiceProvider.php index de006c9..1793b8e 100644 --- a/src/LibsqlServiceProvider.php +++ b/src/LibsqlServiceProvider.php @@ -1,15 +1,15 @@ table}(libsql_vector_idx({$column}))"); - }); - - Builder::macro('nearest', function ($index_name, $vector, $limit = 10) { - return $this->joinSub( - DB::table(DB::raw("vector_top_k('$index_name', '[" . implode(',', $vector) . "]', $limit)")), - 'v', - 'todos.rowid', - '=', - 'v.id' - ); - }); } @@ -44,27 +30,15 @@ public function configurePackage(Package $package): void public function register(): void { parent::register(); - $this->app->singleton('db.factory', function ($app) { - return new class($app) extends ConnectionFactory { - protected function createConnection($driver, $connection, $database, $prefix = '', array $config = []) - { - $connection = function () use ($config) { - return new \Libsql\PDO( - $config["database"] ?? '', - password: $config["password"] ?? '', - options: $config, - ); - }; - var_dump($config); + VectorMacro::create(); - return new LibsqlConnection( - $connection, - database: $config["database"] ?? '', - config: $config, - ); - } - }; + $this->app->singleton('db.factory', function ($app) { + return new LibsqlConnectionFactory($app); + }); + + $this->app->scoped(LibsqlManager::class, function ($app) { + return new LibsqlManager(config('database.connections.libsql')); }); $this->app->resolving('db', function (DatabaseManager $db) { @@ -75,17 +49,15 @@ protected function createConnection($driver, $connection, $database, $prefix = ' $config['driver'] = 'libsql'; } - return new LibsqlConnection( - function () use ($config) { - return new \Libsql\PDO( - $config["database"] ?? '', - password: $config["password"] ?? '', - options: $config - ); - }, - database: $config["database"], - config: $config, - ); + $connector = new LibsqlConnector(); + $db = $connector->connect($config); + + $connection = new LibsqlConnection($db, $config['database'] ?? ':memory:', $config['prefix'], $config); + app()->instance(LibsqlConnection::class, $connection); + + $connection->createReadPdo($config); + + return $connection; }); }); } diff --git a/src/Vector/VectorMacro.php b/src/Vector/VectorMacro.php new file mode 100644 index 0000000..361ccfb --- /dev/null +++ b/src/Vector/VectorMacro.php @@ -0,0 +1,30 @@ +table}(libsql_vector_idx({$column}))"); + }); + + Builder::macro('nearest', function ($index_name, $vector, $limit = 10) { + /** @var Builder $this */ + return $this->joinSub( + DB::table(DB::raw("vector_top_k('$index_name', '[" . implode(',', $vector) . "]', $limit)")), + 'v', + "{$this->from}.rowid", + '=', + 'v.id' + ); + }); + } +} diff --git a/src/VectorCast.php b/src/VectorCast.php index 8ff22cf..b4c2e5e 100644 --- a/src/VectorCast.php +++ b/src/VectorCast.php @@ -1,11 +1,13 @@ $value) { + if (is_array($value) && !is_vector($value)) { + // Encode only the nested array as a JSON string + $formattedItem[$key] = json_encode($value); + } else { + $formattedItem[$key] = $value; + } + } + + // Convert the formatted item to a stdClass + $result[] = (object) $formattedItem; + } + + return $result; +} + +function stdClassToArray(\stdClass|array $object): array +{ + if (is_array($object)) { + return array_map('stdClassToArray', $object); + } + + if (!$object instanceof \stdClass) { + return $object; + } + + $array = []; + + foreach (get_object_vars($object) as $key => $value) { + $array[$key] = (is_array($value) || $value instanceof \stdClass) + ? stdClassToArray($value) + : $value; + } + + return $array; +} + +function reorderArrayKeys(array $data, array $keyOrder): array +{ + return array_map(function ($item) use ($keyOrder) { + $ordered = array_fill_keys($keyOrder, null); + + return array_merge($ordered, $item); + }, $data); +} + +function is_vector($value): bool +{ + if (!is_array($value)) { + return false; + } + + foreach ($value as $element) { + if (!is_numeric($element)) { + return false; + } + } + + return array_keys($value) === range(0, count($value) - 1); +} + +function decodeBlobs(array $row): array +{ + return array_map(function ($value) { + return is_resource($value) ? stream_get_contents($value) : $value; + }, $row); +} + +function decodeDoubleBase64(array $result): array +{ + if (isset($result) && is_array($result)) { + foreach ($result as &$row) { + foreach ($row as $key => &$value) { + if (is_string($value) && isValidDateOrTimestamp($value)) { + continue; + } + + if (is_string($value) && $decoded = json_decode($value, true)) { + $value = $decoded; + } + + if (is_string($value) && isValidBlob($value)) { + $value = base64_decode(base64_decode($value)); + } + } + } + } + + return $result; +} + +function isValidBlob(mixed $value): bool +{ + return (bool) preg_match('/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/', $value); +} + +function isValidDateOrTimestamp($string, $format = null): bool +{ + if (is_numeric($string) && (int) $string > 0 && (int) $string <= PHP_INT_MAX) { + return true; + } + + if (is_numeric($string) && strlen($string) === 4 && (int) $string >= 1000 && (int) $string <= 9999) { + return true; + } + + $formats = $format ? [$format] : ['Y-m-d H:i:s', 'Y-m-d']; + + foreach ($formats as $fmt) { + $dateTime = \DateTime::createFromFormat($fmt, $string); + if ($dateTime && $dateTime->format($fmt) === $string) { + return true; + } + } + + return false; +} diff --git a/tests/ArchTest.php b/tests/ArchTest.php new file mode 100644 index 0000000..d324ce1 --- /dev/null +++ b/tests/ArchTest.php @@ -0,0 +1,30 @@ +expect([ + // 'dd', + 'debug_backtrace', + 'die', + // 'dump', + 'echo', + 'eval', + 'exec', + 'exit', + 'passthru', + 'phpinfo', + 'print_r', + 'proc_open', + 'ray', + 'shell_exec', + 'system', + 'var_dump', + ]) + ->each->not->toBeUsed(); + +arch('it should implement strict types') + ->expect('Libsql\\Laravel') + ->toUseStrictTypes(); + +arch('test fixtures should implement strict types') + ->expect('Libsql\\Laravel\\Tests\\Fixtures') + ->toUseStrictTypes(); diff --git a/tests/Feature/DataTypes/BlobDataTest.php b/tests/Feature/DataTypes/BlobDataTest.php new file mode 100644 index 0000000..3cef1cf --- /dev/null +++ b/tests/Feature/DataTypes/BlobDataTest.php @@ -0,0 +1,48 @@ +id(); + $table->binary('blob'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('blob_table'); +}); + +test('it can insert a new blob data', function () { + $data = random_bytes(50); + + $result = DB::table('blob_table')->insert([ + 'blob' => $data, + ]); + + $newData = DB::table('blob_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('blob_table')->count())->toBe(1) + ->and($newData->blob)->toBe($data); +})->group('BlobDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing blob data', function () { + $data = random_bytes(50); + + DB::table('blob_table')->insert([ + 'blob' => $data, + ]); + + $newData = random_bytes(50); + + $result = DB::table('blob_table')->update([ + 'blob' => $newData, + ]); + + $updatedData = DB::table('blob_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->blob)->toBe($newData); +})->group('BlobDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/BooleanDataTest.php b/tests/Feature/DataTypes/BooleanDataTest.php new file mode 100644 index 0000000..f3a071d --- /dev/null +++ b/tests/Feature/DataTypes/BooleanDataTest.php @@ -0,0 +1,56 @@ +id(); + $table->boolean('confirmed'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('boolean_table'); +}); + +test('it can insert a new boolean data, and the value will be saved as an integer', function () { + $result = DB::table('boolean_table')->insert([ + 'confirmed' => true, + ]); + + $newData = DB::table('boolean_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('boolean_table')->count())->toBe(1) + ->and($newData->confirmed)->toBe(1); +})->group('BooleanDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing boolean data, and the retrieved value will be an integer', function () { + DB::table('boolean_table')->insert([ + 'confirmed' => true, + ]); + + $result = DB::table('boolean_table')->update([ + 'confirmed' => false, + ]); + + $updatedData = DB::table('boolean_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->confirmed)->toBe(0); +})->group('BooleanDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + DB::table('boolean_table')->insert([ + 'confirmed' => true, + ]); + DB::table('boolean_table')->insert([ + 'confirmed' => false, + ]); + + $found = DB::table('boolean_table')->where('confirmed', false)->first(); + + expect($found->id)->toBe(2) + ->and($found->confirmed)->toBe(0); +})->group('BooleanDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/DateDataTest.php b/tests/Feature/DataTypes/DateDataTest.php new file mode 100644 index 0000000..14bccae --- /dev/null +++ b/tests/Feature/DataTypes/DateDataTest.php @@ -0,0 +1,64 @@ +id(); + $table->date('started_at'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('date_table'); +}); + +test('it can insert a new date data', function () { + $date = '2021-01-01'; + + $result = DB::table('date_table')->insert([ + 'started_at' => $date, + ]); + + $newData = DB::table('date_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('date_table')->count())->toBe(1) + ->and($newData->started_at)->toBe($date); +})->group('DateDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing date data', function () { + $date = '2021-01-01'; + + DB::table('date_table')->insert([ + 'started_at' => $date, + ]); + + $newDate = '2021-02-01'; + + $result = DB::table('date_table')->update([ + 'started_at' => $newDate, + ]); + + $updatedData = DB::table('date_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->started_at)->toBe($newDate); +})->group('DateDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $date = '2021-01-01'; + + DB::table('date_table')->insert([ + 'started_at' => '2021-02-01', + ]); + DB::table('date_table')->insert([ + 'started_at' => $date, + ]); + + $found = DB::table('date_table')->where('started_at', $date)->first(); + + expect($found->id)->toBe(2) + ->and($found->started_at)->toBe($date); +})->group('DateDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/DateTimeDataTest.php b/tests/Feature/DataTypes/DateTimeDataTest.php new file mode 100644 index 0000000..0c1cc50 --- /dev/null +++ b/tests/Feature/DataTypes/DateTimeDataTest.php @@ -0,0 +1,65 @@ +id(); + $table->dateTime('published_at'); + $table->timestamps(); + }); +}); + +afterEach(function () { + Schema::dropIfExists('datetime_table'); +}); + +test('it can insert a new datetime data', function () { + $publishedAt = now(); + + $result = DB::table('datetime_table')->insert([ + 'published_at' => $publishedAt, + ]); + + $newData = DB::table('datetime_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('datetime_table')->count())->toBe(1) + ->and($newData->published_at)->toBe($publishedAt->format('Y-m-d H:i:s')); +})->group('DateTimeDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing datetime data', function () { + $publishedAt = now(); + + DB::table('datetime_table')->insert([ + 'published_at' => $publishedAt, + ]); + + $newPublishedAt = now()->subDay(); + + $result = DB::table('datetime_table')->update([ + 'published_at' => $newPublishedAt, + ]); + + $updatedData = DB::table('datetime_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->published_at)->toBe($newPublishedAt->format('Y-m-d H:i:s')); +})->group('DateTimeDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $publishedAt = now(); + + DB::table('datetime_table')->insert([ + 'published_at' => now()->subDay(), + ]); + DB::table('datetime_table')->insert([ + 'published_at' => $publishedAt, + ]); + + $found = DB::table('datetime_table')->where('published_at', '>=', $publishedAt->format('Y-m-d H:i:s'))->first(); + + expect($found->id)->toBe(2) + ->and($found->published_at)->toBe($publishedAt->format('Y-m-d H:i:s')); +})->group('DateTimeDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/DoubleDataTest.php b/tests/Feature/DataTypes/DoubleDataTest.php new file mode 100644 index 0000000..32851b2 --- /dev/null +++ b/tests/Feature/DataTypes/DoubleDataTest.php @@ -0,0 +1,64 @@ +id(); + $table->double('amount'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('double_table'); +}); + +test('it can insert a new double data', function () { + $amount = 123.45; + + $result = DB::table('double_table')->insert([ + 'amount' => $amount, + ]); + + $newData = DB::table('double_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('double_table')->count())->toBe(1) + ->and($newData->amount)->toBe($amount); +})->group('DoubleDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing double data', function () { + $amount = 123.45; + + DB::table('double_table')->insert([ + 'amount' => $amount, + ]); + + $newAmount = 543.21; + + $result = DB::table('double_table')->update([ + 'amount' => $newAmount, + ]); + + $updatedData = DB::table('double_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->amount)->toBe($newAmount); +})->group('DoubleDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $amount = 123.45; + + DB::table('double_table')->insert([ + 'amount' => 543.21, + ]); + DB::table('double_table')->insert([ + 'amount' => $amount, + ]); + + $found = DB::table('double_table')->where('amount', $amount)->first(); + + expect($found->id)->toBe(2) + ->and($found->amount)->toBe($amount); +})->group('DoubleDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/FloatDataTest.php b/tests/Feature/DataTypes/FloatDataTest.php new file mode 100644 index 0000000..0dd8541 --- /dev/null +++ b/tests/Feature/DataTypes/FloatDataTest.php @@ -0,0 +1,64 @@ +id(); + $table->float('amount', precision: 53); + }); +}); + +afterEach(function () { + Schema::dropIfExists('float_table'); +}); + +test('it can insert a new float data', function () { + $amount = 123.45; + + $result = DB::table('float_table')->insert([ + 'amount' => $amount, + ]); + + $newData = DB::table('float_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('float_table')->count())->toBe(1) + ->and($newData->amount)->toBe($amount); +})->group('FloatDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing float data', function () { + $amount = 123.45; + + DB::table('float_table')->insert([ + 'amount' => $amount, + ]); + + $newAmount = 543.21; + + $result = DB::table('float_table')->update([ + 'amount' => $newAmount, + ]); + + $updatedData = DB::table('float_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->amount)->toBe($newAmount); +})->group('FloatDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $amount = 123.45; + + DB::table('float_table')->insert([ + 'amount' => 543.21, + ]); + DB::table('float_table')->insert([ + 'amount' => $amount, + ]); + + $found = DB::table('float_table')->where('amount', $amount)->first(); + + expect($found->id)->toBe(2) + ->and($found->amount)->toBe($amount); +})->group('FloatDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/IntegerDataTest.php b/tests/Feature/DataTypes/IntegerDataTest.php new file mode 100644 index 0000000..3fa142d --- /dev/null +++ b/tests/Feature/DataTypes/IntegerDataTest.php @@ -0,0 +1,218 @@ +id(); + $table->tinyInteger('tiny_integer'); + $table->smallInteger('small_integer'); + $table->mediumInteger('medium_integer'); + $table->integer('integer'); + $table->bigInteger('big_integer'); + + $table->unsignedTinyInteger('unsigned_tiny_integer'); + $table->unsignedSmallInteger('unsigned_small_integer'); + $table->unsignedMediumInteger('unsigned_medium_integer'); + $table->unsignedInteger('unsigned_integer'); + $table->unsignedBigInteger('unsigned_big_integer'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('integer_table'); +}); + +test('it can insert a new integer data', function () { + $tinyInteger = 127; + $smallInteger = 32767; + $mediumInteger = 8388607; + $integer = 2147483647; + $bigInteger = 9223372036854775807; + + $unsignedTinyInteger = 255; + $unsignedSmallInteger = 65535; + $unsignedMediumInteger = 16777215; + $unsignedInteger = 4294967295; + $unsignedBigInteger = 9223372036854775807; + + $result = DB::table('integer_table')->insert([ + 'tiny_integer' => $tinyInteger, + 'small_integer' => $smallInteger, + 'medium_integer' => $mediumInteger, + 'integer' => $integer, + 'big_integer' => $bigInteger, + + 'unsigned_tiny_integer' => $unsignedTinyInteger, + 'unsigned_small_integer' => $unsignedSmallInteger, + 'unsigned_medium_integer' => $unsignedMediumInteger, + 'unsigned_integer' => $unsignedInteger, + 'unsigned_big_integer' => $unsignedBigInteger, + ]); + + $newData = DB::table('integer_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('integer_table')->count())->toBe(1) + ->and($newData->tiny_integer)->toBe($tinyInteger) + ->and($newData->small_integer)->toBe($smallInteger) + ->and($newData->medium_integer)->toBe($mediumInteger) + ->and($newData->integer)->toBe($integer) + ->and($newData->big_integer)->toBe($bigInteger) + + ->and($newData->unsigned_tiny_integer)->toBe($unsignedTinyInteger) + ->and($newData->unsigned_small_integer)->toBe($unsignedSmallInteger) + ->and($newData->unsigned_medium_integer)->toBe($unsignedMediumInteger) + ->and($newData->unsigned_integer)->toBe($unsignedInteger) + ->and($newData->unsigned_big_integer)->toBe($unsignedBigInteger); +})->group('IntegerDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing integer data', function () { + $tinyInteger = 127; + $smallInteger = 32767; + $mediumInteger = 8388607; + $integer = 2147483647; + $bigInteger = 9223372036854775807; + + $unsignedTinyInteger = 255; + $unsignedSmallInteger = 65535; + $unsignedMediumInteger = 16777215; + $unsignedInteger = 4294967295; + $unsignedBigInteger = 9223372036854775807; + + DB::table('integer_table')->insert([ + 'tiny_integer' => $tinyInteger, + 'small_integer' => $smallInteger, + 'medium_integer' => $mediumInteger, + 'integer' => $integer, + 'big_integer' => $bigInteger, + + 'unsigned_tiny_integer' => $unsignedTinyInteger, + 'unsigned_small_integer' => $unsignedSmallInteger, + 'unsigned_medium_integer' => $unsignedMediumInteger, + 'unsigned_integer' => $unsignedInteger, + 'unsigned_big_integer' => $unsignedBigInteger, + ]); + + $newTinyInteger = 63; + $newSmallInteger = 16383; + $newMediumInteger = 4194303; + $newInteger = 1073741823; + $newBigInteger = 4611686018427387903; + + $newUnsignedTinyInteger = 127; + $newUnsignedSmallInteger = 32767; + $newUnsignedMediumInteger = 8388607; + $newUnsignedInteger = 2147483647; + $newUnsignedBigInteger = 9223372036854775807; + + $result = DB::table('integer_table')->update([ + 'tiny_integer' => $newTinyInteger, + 'small_integer' => $newSmallInteger, + 'medium_integer' => $newMediumInteger, + 'integer' => $newInteger, + 'big_integer' => $newBigInteger, + + 'unsigned_tiny_integer' => $newUnsignedTinyInteger, + 'unsigned_small_integer' => $newUnsignedSmallInteger, + 'unsigned_medium_integer' => $newUnsignedMediumInteger, + 'unsigned_integer' => $newUnsignedInteger, + 'unsigned_big_integer' => $newUnsignedBigInteger, + ]); + + $updatedData = DB::table('integer_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->tiny_integer)->toBe($newTinyInteger) + ->and($updatedData->small_integer)->toBe($newSmallInteger) + ->and($updatedData->medium_integer)->toBe($newMediumInteger) + ->and($updatedData->integer)->toBe($newInteger) + ->and($updatedData->big_integer)->toBe($newBigInteger) + + ->and($updatedData->unsigned_tiny_integer)->toBe($newUnsignedTinyInteger) + ->and($updatedData->unsigned_small_integer)->toBe($newUnsignedSmallInteger) + ->and($updatedData->unsigned_medium_integer)->toBe($newUnsignedMediumInteger) + ->and($updatedData->unsigned_integer)->toBe($newUnsignedInteger) + ->and($updatedData->unsigned_big_integer)->toBe($newUnsignedBigInteger); +})->group('IntegerDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $tinyInteger = 127; + $smallInteger = 32767; + $mediumInteger = 8388607; + $integer = 2147483647; + $bigInteger = 9223372036854775807; + + $unsignedTinyInteger = 255; + $unsignedSmallInteger = 65535; + $unsignedMediumInteger = 16777215; + $unsignedInteger = 4294967295; + $unsignedBigInteger = 9223372036854775807; + + DB::table('integer_table')->insert([ + 'tiny_integer' => 63, + 'small_integer' => 16383, + 'medium_integer' => 4194303, + 'integer' => 1073741823, + 'big_integer' => 4611686018427387903, + + 'unsigned_tiny_integer' => 127, + 'unsigned_small_integer' => 32767, + 'unsigned_medium_integer' => 8388607, + 'unsigned_integer' => 2147483647, + 'unsigned_big_integer' => 9223372036854775807, + ]); + DB::table('integer_table')->insert([ + 'tiny_integer' => $tinyInteger, + 'small_integer' => $smallInteger, + 'medium_integer' => $mediumInteger, + 'integer' => $integer, + 'big_integer' => $bigInteger, + + 'unsigned_tiny_integer' => $unsignedTinyInteger, + 'unsigned_small_integer' => $unsignedSmallInteger, + 'unsigned_medium_integer' => $unsignedMediumInteger, + 'unsigned_integer' => $unsignedInteger, + 'unsigned_big_integer' => $unsignedBigInteger, + ]); + + $found = DB::table('integer_table')->where('tiny_integer', $tinyInteger)->first(); + + expect($found->id)->toBe(2) + ->and($found->tiny_integer)->toBe($tinyInteger) + ->and($found->small_integer)->toBe($smallInteger) + ->and($found->medium_integer)->toBe($mediumInteger) + ->and($found->integer)->toBe($integer) + ->and($found->big_integer)->toBe($bigInteger) + + ->and($found->unsigned_tiny_integer)->toBe($unsignedTinyInteger) + ->and($found->unsigned_small_integer)->toBe($unsignedSmallInteger) + ->and($found->unsigned_medium_integer)->toBe($unsignedMediumInteger) + ->and($found->unsigned_integer)->toBe($unsignedInteger) + ->and($found->unsigned_big_integer)->toBe($unsignedBigInteger); +})->group('IntegerDataTest', 'DataTypes', 'FeatureTest'); + +test('it handles maximum unsigned big integer value', function () { + $maxUnsignedBigInteger = 18446744073709551615; + + $result = DB::table('integer_table')->insert([ + 'tiny_integer' => 127, + 'small_integer' => 32767, + 'medium_integer' => 8388607, + 'integer' => 2147483647, + 'big_integer' => 9223372036854775807, + + 'unsigned_tiny_integer' => 255, + 'unsigned_small_integer' => 65535, + 'unsigned_medium_integer' => 16777215, + 'unsigned_integer' => 4294967295, + 'unsigned_big_integer' => $maxUnsignedBigInteger, + ]); + + $newData = DB::table('integer_table')->first(); + + // Assertions + expect($result)->toBeTrue() + ->and($newData->unsigned_big_integer)->toBe($maxUnsignedBigInteger); +})->group('IntegerDataTest', 'EdgeCases', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/StringDataTest.php b/tests/Feature/DataTypes/StringDataTest.php new file mode 100644 index 0000000..491e3f7 --- /dev/null +++ b/tests/Feature/DataTypes/StringDataTest.php @@ -0,0 +1,64 @@ +id(); + $table->string('name', length: 100); + }); +}); + +afterEach(function () { + Schema::dropIfExists('string_table'); +}); + +test('it can insert a new string data', function () { + $name = 'John Doe'; + + $result = DB::table('string_table')->insert([ + 'name' => $name, + ]); + + $newData = DB::table('string_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('string_table')->count())->toBe(1) + ->and($newData->name)->toBe($name); +})->group('StringDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing string data', function () { + $name = 'John Doe'; + + DB::table('string_table')->insert([ + 'name' => $name, + ]); + + $newName = 'Jane Doe'; + + $result = DB::table('string_table')->update([ + 'name' => $newName, + ]); + + $updatedData = DB::table('string_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->name)->toBe($newName); +})->group('StringDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $name = 'John Doe'; + + DB::table('string_table')->insert([ + 'name' => 'Jane Doe', + ]); + DB::table('string_table')->insert([ + 'name' => $name, + ]); + + $found = DB::table('string_table')->where('name', $name)->first(); + + expect($found->id)->toBe(2) + ->and($found->name)->toBe($name); +})->group('StringDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/TextDataTest.php b/tests/Feature/DataTypes/TextDataTest.php new file mode 100644 index 0000000..262d5f8 --- /dev/null +++ b/tests/Feature/DataTypes/TextDataTest.php @@ -0,0 +1,64 @@ +id(); + $table->string('description'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('text_table'); +}); + +test('it can insert a new text data', function () { + $description = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + + $result = DB::table('text_table')->insert([ + 'description' => $description, + ]); + + $newData = DB::table('text_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('text_table')->count())->toBe(1) + ->and($newData->description)->toBe($description); +})->group('TextDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing text data', function () { + $description = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + + DB::table('text_table')->insert([ + 'description' => $description, + ]); + + $newDescription = 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'; + + $result = DB::table('text_table')->update([ + 'description' => $newDescription, + ]); + + $updatedData = DB::table('text_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->description)->toBe($newDescription); +})->group('TextDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $description = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + + DB::table('text_table')->insert([ + 'description' => 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + ]); + DB::table('text_table')->insert([ + 'description' => $description, + ]); + + $found = DB::table('text_table')->where('description', $description)->first(); + + expect($found->id)->toBe(2) + ->and($found->description)->toBe($description); +})->group('TextDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/TimestampDataTest.php b/tests/Feature/DataTypes/TimestampDataTest.php new file mode 100644 index 0000000..fe0264e --- /dev/null +++ b/tests/Feature/DataTypes/TimestampDataTest.php @@ -0,0 +1,63 @@ +id(); + $table->timestamp('added_at', precision: 0); + }); +}); + +afterEach(function () { + Schema::dropIfExists('timestamp_table'); +}); + +test('it can insert a new timestamp data', function () { + $timestamp = '2021-01-01 12:34:56'; + + $result = DB::table('timestamp_table')->insert([ + 'added_at' => $timestamp, + ]); + + $newData = DB::table('timestamp_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('timestamp_table')->count())->toBe(1) + ->and($newData->added_at)->toBe($timestamp); +})->group('TimestampDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing timestamp data', function () { + $timestamp = '2021-01-01 12:34:56'; + + DB::table('timestamp_table')->insert([ + 'added_at' => $timestamp, + ]); + + $newTimestamp = '2021-02-01 23:45:01'; + + $result = DB::table('timestamp_table')->update([ + 'added_at' => $newTimestamp, + ]); + + $updatedData = DB::table('timestamp_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->added_at)->toBe($newTimestamp); +})->group('TimestampDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $timestamp = '2021-01-01 12:34:56'; + + DB::table('timestamp_table')->insert([ + 'added_at' => '2021-02-01 23:45:01', + ]); + DB::table('timestamp_table')->insert([ + 'added_at' => $timestamp, + ]); + + $found = DB::table('timestamp_table')->where('added_at', $timestamp)->first(); + + expect($found->added_at)->toBe($timestamp); +})->group('TimestampDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/VectorDataTest.php b/tests/Feature/DataTypes/VectorDataTest.php new file mode 100644 index 0000000..9ab1a6d --- /dev/null +++ b/tests/Feature/DataTypes/VectorDataTest.php @@ -0,0 +1,69 @@ +id(); + $table->string('title'); + $table->string('genre'); + $table->integer('release_year'); + $table->vector('plot_embedding', 5); // 5-dimensional vector + $table->timestamps(); + }); + + Schema::table('movies', function ($table) { + $table->vectorIndex('plot_embedding', 'movies_plot_embedding_idx'); + }); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can insert a new vector data', function () { + $embedding = [0.1, 0.2, 0.3, 0.4, 0.5]; + + DB::table('movies')->insert([ + 'title' => 'The Matrix', + 'genre' => 'Action', + 'release_year' => 1999, + 'plot_embedding' => $embedding, + ]); + + $movie = DB::table('movies')->first(); + + expect($movie->plot_embedding)->toBe($embedding); +})->group('VectorDataTest', 'FeatureTest'); + +test('it can find nearest vector data', function () { + + DB::table('movies')->insert([ + [ + 'title' => 'The Matrix', + 'genre' => 'Action', + 'release_year' => 1999, + 'plot_embedding' => [0.1, 0.2, 0.3, 0.4, 0.5], + ], + [ + 'title' => 'Inception', + 'genre' => 'Sci-Fi', + 'release_year' => 2010, + 'plot_embedding' => [0.15, 0.25, 0.35, 0.45, 0.55], + ], + [ + 'title' => 'Interstellar', + 'genre' => 'Sci-Fi', + 'release_year' => 2014, + 'plot_embedding' => [0.2, 0.3, 0.4, 0.5, 0.6], + ], + ]); + + $queryVector = [0.15, 0.25, 0.35, 0.45, 0.55]; + $result = DB::table('movies') + ->nearest('movies_plot_embedding_idx', $queryVector, 5) + ->get(); + + expect($result->count())->toBe(3); +})->group('VectorDataTest', 'FeatureTest'); diff --git a/tests/Feature/DataTypes/YearDataTest.php b/tests/Feature/DataTypes/YearDataTest.php new file mode 100644 index 0000000..30bfb8f --- /dev/null +++ b/tests/Feature/DataTypes/YearDataTest.php @@ -0,0 +1,63 @@ +id(); + $table->year('birth_year'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('year_table'); +}); + +test('it can insert a new year data', function () { + $year = 2021; + + $result = DB::table('year_table')->insert([ + 'birth_year' => $year, + ]); + + $newData = DB::table('year_table')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('year_table')->count())->toBe(1) + ->and($newData->birth_year)->toBe($year); +})->group('YearDataTest', 'DataTypes', 'FeatureTest'); + +test('it can update an existing year data', function () { + $year = 2021; + + DB::table('year_table')->insert([ + 'birth_year' => $year, + ]); + + $newYear = 2022; + + $result = DB::table('year_table')->update([ + 'birth_year' => $newYear, + ]); + + $updatedData = DB::table('year_table')->first(); + + expect($result)->toBe(1) + ->and($updatedData->birth_year)->toBe($newYear); +})->group('YearDataTest', 'DataTypes', 'FeatureTest'); + +test('it can find the saved record', function () { + $year = 2021; + + DB::table('year_table')->insert([ + 'birth_year' => 2022, + ]); + DB::table('year_table')->insert([ + 'birth_year' => $year, + ]); + + $found = DB::table('year_table')->where('birth_year', $year)->first(); + + expect($found->birth_year)->toBe($year); +})->group('YearDataTest', 'DataTypes', 'FeatureTest'); diff --git a/tests/Feature/DatabaseTransactionsTest.php b/tests/Feature/DatabaseTransactionsTest.php new file mode 100644 index 0000000..e18612a --- /dev/null +++ b/tests/Feature/DatabaseTransactionsTest.php @@ -0,0 +1,89 @@ +user = User::factory()->create(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can rollback the transaction', function () { + $this->user->name = 'John Doe'; + $this->user->save(); + + expect(User::count())->toBe(1); + + DB::transaction(function () { + $this->user->name = 'Jane Doe'; + $this->user->save(); + + expect(User::first()->name)->toBe('Jane Doe'); + + DB::rollBack(); + }); + + expect(User::count())->toBe(1); + expect(User::first()->name)->toBe('John Doe'); +})->group('DatabaseTransactionsTest', 'FeatureTest'); + +test('it can rollback the transaction by manually using the transactions', function () { + $this->user->name = 'John Doe'; + $this->user->save(); + + expect(User::count())->toBe(1); + + DB::beginTransaction(); + + $this->user->name = 'Jane Doe'; + $this->user->save(); + + expect(User::first()->name)->toBe('Jane Doe'); + + DB::rollBack(); + + expect(User::count())->toBe(1); + expect(User::first()->name)->toBe('John Doe'); +})->group('DatabaseTransactionsTest', 'FeatureTest'); + +test('it can commit the transaction', function () { + $this->user->name = 'John Doe'; + $this->user->save(); + + expect(User::count())->toBe(1); + + DB::transaction(function () { + $this->user->name = 'Jane Doe'; + $this->user->save(); + + expect(User::first()->name)->toBe('Jane Doe'); + }); + + expect(User::count())->toBe(1); + expect(User::first()->name)->toBe('Jane Doe'); +})->group('DatabaseTransactionsTest', 'FeatureTest'); + +test('it can commit the transaction by manually using the transactions', function () { + $this->user->name = 'John Doe'; + $this->user->save(); + + expect(User::count())->toBe(1); + + DB::beginTransaction(); + + $this->user->name = 'Jane Doe'; + $this->user->save(); + + expect(User::first()->name)->toBe('Jane Doe'); + + DB::commit(); + + expect(User::count())->toBe(1); + expect(User::first()->name)->toBe('Jane Doe'); +})->group('DatabaseTransactionsTest', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/ArrayCastingTest.php b/tests/Feature/EloquentAttributeCasting/ArrayCastingTest.php new file mode 100644 index 0000000..0d8cae7 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/ArrayCastingTest.php @@ -0,0 +1,49 @@ +id(); + $table->json('data'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('array_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $data = ['name' => 'John Doe', 'city' => 'New York']; + + ArrayCastingModel::create([ + 'data' => $data, + ]); + + $result = ArrayCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->data))->toBe('array') + ->and($result->data)->toBe($data); +})->group('ArrayCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $data = ['name' => 'John Doe', 'city' => 'New York']; + + ArrayCastingModel::create([ + 'data' => $data, + ]); + + $newData = ['name' => 'Jane Doe', 'city' => 'Los Angeles']; + + ArrayCastingModel::first()->update([ + 'data' => $newData, + ]); + + $result = ArrayCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->data))->toBe('array') + ->and($result->data)->toBe($newData); +})->group('ArrayCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/AsStringableCastingTest.php b/tests/Feature/EloquentAttributeCasting/AsStringableCastingTest.php new file mode 100644 index 0000000..37bf353 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/AsStringableCastingTest.php @@ -0,0 +1,64 @@ +id(); + $table->string('data'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('stringable_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $data = 'John Doe'; + + StringableCastingModel::create([ + 'data' => $data, + ]); + + $result = StringableCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->data))->toBe('Illuminate\Support\Stringable') + ->and($result->data->toString())->toBe($data); +})->group('AsStringableCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $data = 'John Doe'; + + StringableCastingModel::create([ + 'data' => $data, + ]); + + $newData = 'Jane Doe'; + + StringableCastingModel::first()->update([ + 'data' => $newData, + ]); + + $result = StringableCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->data))->toBe('Illuminate\Support\Stringable') + ->and($result->data->toString())->toBe($newData); +}); + +test('it can find the saved record', function () { + $data = 'John Doe'; + + StringableCastingModel::create([ + 'data' => 'Jane Doe', + ]); + StringableCastingModel::create([ + 'data' => $data, + ]); + + $found = StringableCastingModel::where('data', $data)->first(); + + expect($found->data->toString())->toBe($data); +})->group('AsStringableCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/BooleanCastingTest.php b/tests/Feature/EloquentAttributeCasting/BooleanCastingTest.php new file mode 100644 index 0000000..823cda0 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/BooleanCastingTest.php @@ -0,0 +1,66 @@ +id(); + $table->boolean('confirmed'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('boolean_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $confirmed = true; + + BooleanCastingModel::create([ + 'confirmed' => $confirmed, + ]); + + $result = BooleanCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->confirmed))->toBe('boolean') + ->and($result->confirmed)->toBe($confirmed); +})->group('BooleanCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $confirmed = true; + + BooleanCastingModel::create([ + 'confirmed' => $confirmed, + ]); + + $newConfirmed = false; + + BooleanCastingModel::first()->update([ + 'confirmed' => $newConfirmed, + ]); + + $result = BooleanCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->confirmed))->toBe('boolean') + ->and($result->confirmed)->toBe($newConfirmed); +})->group('BooleanCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can find the saved record using Eloquent ORM', function () { + $confirmed = true; + + BooleanCastingModel::create([ + 'confirmed' => false, + ]); + BooleanCastingModel::create([ + 'confirmed' => $confirmed, + ]); + + $found = BooleanCastingModel::where('confirmed', $confirmed)->first(); + + expect($found->id)->toBe(2) + ->and(gettype($found->confirmed))->toBe('boolean') + ->and($found->confirmed)->toBe($confirmed); +})->group('BooleanCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/ArrayCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/ArrayCastingModel.php new file mode 100644 index 0000000..96e4476 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/ArrayCastingModel.php @@ -0,0 +1,23 @@ + 'array', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/BooleanCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/BooleanCastingModel.php new file mode 100644 index 0000000..6010e1b --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/BooleanCastingModel.php @@ -0,0 +1,23 @@ + 'boolean', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/CollectionCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/CollectionCastingModel.php new file mode 100644 index 0000000..8a6736e --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/CollectionCastingModel.php @@ -0,0 +1,23 @@ + 'collection', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/DateCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/DateCastingModel.php new file mode 100644 index 0000000..09fb4f2 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/DateCastingModel.php @@ -0,0 +1,23 @@ + 'date', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/DatetimeCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/DatetimeCastingModel.php new file mode 100644 index 0000000..c0726e8 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/DatetimeCastingModel.php @@ -0,0 +1,23 @@ + 'datetime', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/DoubleCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/DoubleCastingModel.php new file mode 100644 index 0000000..131f8e6 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/DoubleCastingModel.php @@ -0,0 +1,23 @@ + 'double', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/EnumCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/EnumCastingModel.php new file mode 100644 index 0000000..de18e9e --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/EnumCastingModel.php @@ -0,0 +1,24 @@ + Status::class, + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/FloatCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/FloatCastingModel.php new file mode 100644 index 0000000..03eb3fe --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/FloatCastingModel.php @@ -0,0 +1,23 @@ + 'float', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/IntegerCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/IntegerCastingModel.php new file mode 100644 index 0000000..27c079b --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/IntegerCastingModel.php @@ -0,0 +1,23 @@ + 'integer', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/StringableCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/StringableCastingModel.php new file mode 100644 index 0000000..c3ce61b --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/StringableCastingModel.php @@ -0,0 +1,24 @@ + AsStringable::class, + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CastingModels/TimestampCastingModel.php b/tests/Feature/EloquentAttributeCasting/CastingModels/TimestampCastingModel.php new file mode 100644 index 0000000..65f56cb --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CastingModels/TimestampCastingModel.php @@ -0,0 +1,23 @@ + 'timestamp', + ]; + } +} diff --git a/tests/Feature/EloquentAttributeCasting/CollectionCastingTest.php b/tests/Feature/EloquentAttributeCasting/CollectionCastingTest.php new file mode 100644 index 0000000..a452328 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/CollectionCastingTest.php @@ -0,0 +1,53 @@ +id(); + $table->json('data'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('collection_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $data = collect(['name' => 'John Doe', 'city' => 'New York']); + + CollectionCastingModel::create([ + 'data' => $data, + ]); + + $result = CollectionCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->data))->toBe('Illuminate\Support\Collection') + ->and($result->data->toArray())->toBe($data->toArray()) + ->and($result->data->get('name'))->toBe('John Doe') + ->and($result->data->get('city'))->toBe('New York'); +})->group('CollectionCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $data = collect(['name' => 'John Doe', 'city' => 'New York']); + + CollectionCastingModel::create([ + 'data' => $data, + ]); + + $newData = collect(['name' => 'Jane Doe', 'city' => 'Los Angeles']); + + CollectionCastingModel::first()->update([ + 'data' => $newData, + ]); + + $result = CollectionCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->data))->toBe('Illuminate\Support\Collection') + ->and($result->data->toArray())->toBe($newData->toArray()) + ->and($result->data->get('name'))->toBe('Jane Doe') + ->and($result->data->get('city'))->toBe('Los Angeles'); +})->group('CollectionCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/DateCastingTest.php b/tests/Feature/EloquentAttributeCasting/DateCastingTest.php new file mode 100644 index 0000000..2b721ac --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/DateCastingTest.php @@ -0,0 +1,100 @@ +id(); + $table->date('birthdate'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('date_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $birthdate = '1990-01-01'; + + DateCastingModel::create([ + 'birthdate' => $birthdate, + ]); + + $result = DateCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->birthdate))->toBe('Illuminate\Support\Carbon') + ->and($result->birthdate->format('Y-m-d'))->toBe($birthdate); +})->group('DateCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $birthdate = '1990-01-01'; + + DateCastingModel::create([ + 'birthdate' => $birthdate, + ]); + + $newBirthdate = '1995-01-01'; + + DateCastingModel::first()->update([ + 'birthdate' => $newBirthdate, + ]); + + $result = DateCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->birthdate))->toBe('Illuminate\Support\Carbon') + ->and($result->birthdate->format('Y-m-d'))->toBe($newBirthdate); +}); + +test('it can insert a new record using Eloquent ORM with Carbon instance', function () { + $birthdate = '1990-01-01'; + + DateCastingModel::create([ + 'birthdate' => new \Illuminate\Support\Carbon($birthdate), + ]); + + $result = DateCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->birthdate))->toBe('Illuminate\Support\Carbon') + ->and($result->birthdate->format('Y-m-d'))->toBe($birthdate); +})->group('DateCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM with Carbon instance', function () { + $birthdate = '1990-01-01'; + + DateCastingModel::create([ + 'birthdate' => $birthdate, + ]); + + $newBirthdate = '1995-01-01'; + + DateCastingModel::first()->update([ + 'birthdate' => new \Illuminate\Support\Carbon($newBirthdate), + ]); + + $result = DateCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->birthdate))->toBe('Illuminate\Support\Carbon') + ->and($result->birthdate->format('Y-m-d'))->toBe($newBirthdate); +}); + +test('it can find the saved record using Eloquent ORM', function () { + $birthdate = '1990-01-01'; + + DateCastingModel::create([ + 'birthdate' => '1995-01-01', + ]); + DateCastingModel::create([ + 'birthdate' => $birthdate, + ]); + + $found = DateCastingModel::whereRaw('date("birthdate") = date(?)', [$birthdate])->first(); + + expect($found->id)->toBe(2) + ->and(get_class($found->birthdate))->toBe('Illuminate\Support\Carbon') + ->and($found->birthdate->format('Y-m-d'))->toBe($birthdate); +})->group('DateCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/DatetimeCastingTest.php b/tests/Feature/EloquentAttributeCasting/DatetimeCastingTest.php new file mode 100644 index 0000000..52eb092 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/DatetimeCastingTest.php @@ -0,0 +1,100 @@ +id(); + $table->dateTime('started_at'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('datetime_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $startedAt = '2021-01-01 12:00:00'; + + DatetimeCastingModel::create([ + 'started_at' => $startedAt, + ]); + + $result = DatetimeCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->started_at))->toBe('Illuminate\Support\Carbon') + ->and($result->started_at->format('Y-m-d H:i:s'))->toBe($startedAt); +})->group('DatetimeCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $startedAt = '2021-01-01 12:00:00'; + + DatetimeCastingModel::create([ + 'started_at' => $startedAt, + ]); + + $newStartedAt = '2021-01-01 13:00:00'; + + DatetimeCastingModel::first()->update([ + 'started_at' => $newStartedAt, + ]); + + $result = DatetimeCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->started_at))->toBe('Illuminate\Support\Carbon') + ->and($result->started_at->format('Y-m-d H:i:s'))->toBe($newStartedAt); +})->group('DatetimeCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can insert a new record using Eloquent ORM with Carbon instance', function () { + $startedAt = now(); + + DatetimeCastingModel::create([ + 'started_at' => $startedAt, + ]); + + $result = DatetimeCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->started_at))->toBe('Illuminate\Support\Carbon') + ->and($result->started_at->format('Y-m-d H:i:s'))->toBe($startedAt->format('Y-m-d H:i:s')); +})->group('DatetimeCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM with Carbon instance', function () { + $startedAt = now(); + + DatetimeCastingModel::create([ + 'started_at' => $startedAt, + ]); + + $newStartedAt = now()->addHour(); + + DatetimeCastingModel::first()->update([ + 'started_at' => $newStartedAt, + ]); + + $result = DatetimeCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(get_class($result->started_at))->toBe('Illuminate\Support\Carbon') + ->and($result->started_at->format('Y-m-d H:i:s'))->toBe($newStartedAt->format('Y-m-d H:i:s')); +})->group('DatetimeCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can find the saved record using Eloquent ORM', function () { + $startedAt = now(); + + DatetimeCastingModel::create([ + 'started_at' => now()->subHour(), + ]); + DatetimeCastingModel::create([ + 'started_at' => $startedAt, + ]); + + $found = DatetimeCastingModel::where('started_at', $startedAt)->first(); + + expect($found->id)->toBe(2) + ->and(get_class($found->started_at))->toBe('Illuminate\Support\Carbon') + ->and($found->started_at->format('Y-m-d H:i:s'))->toBe($startedAt->format('Y-m-d H:i:s')); +})->group('DatetimeCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/DoubleCastingTest.php b/tests/Feature/EloquentAttributeCasting/DoubleCastingTest.php new file mode 100644 index 0000000..528b746 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/DoubleCastingTest.php @@ -0,0 +1,63 @@ +id(); + $table->double('amount'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('double_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $amount = 100.50; + + DoubleCastingModel::create([ + 'amount' => $amount, + ]); + + $result = DoubleCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('double') + ->and($result->amount)->toBe($amount); +})->group('DoubleCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $amount = 100.50; + + DoubleCastingModel::create([ + 'amount' => $amount, + ]); + + $newAmount = 200.75; + + DoubleCastingModel::first()->update([ + 'amount' => $newAmount, + ]); + + $result = DoubleCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('double') + ->and($result->amount)->toBe($newAmount); +})->group('DoubleCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can find the saved record using Eloquent ORM', function () { + $amount = 100.50; + + DoubleCastingModel::create([ + 'amount' => $amount, + ]); + + $result = DoubleCastingModel::where('amount', $amount)->first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('double') + ->and($result->amount)->toBe($amount); +})->group('DoubleCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/EnumCastingTest.php b/tests/Feature/EloquentAttributeCasting/EnumCastingTest.php new file mode 100644 index 0000000..56657f2 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/EnumCastingTest.php @@ -0,0 +1,67 @@ +id(); + $table->tinyInteger('status'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('enum_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $status = Status::Approved; + + EnumCastingModel::create([ + 'status' => $status->value, + ]); + + $result = EnumCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->status))->toBe('object') + ->and(get_class($result->status))->toBe(Status::class) + ->and($result->status)->toBe($status); +})->group('EnumCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $status = Status::Approved; + + EnumCastingModel::create([ + 'status' => $status->value, + ]); + + $newStatus = Status::Rejected; + + EnumCastingModel::first()->update([ + 'status' => $newStatus->value, + ]); + + $result = EnumCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->status))->toBe('object') + ->and(get_class($result->status))->toBe(Status::class) + ->and($result->status)->toBe($newStatus); +})->group('EnumCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can find the saved record using Eloquent ORM', function () { + $status = Status::Approved; + + EnumCastingModel::create([ + 'status' => $status, + ]); + + $result = EnumCastingModel::where('status', $status->value)->first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->status))->toBe('object') + ->and(get_class($result->status))->toBe(Status::class) + ->and($result->status)->toBe($status); +})->group('EnumCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/Enums/Status.php b/tests/Feature/EloquentAttributeCasting/Enums/Status.php new file mode 100644 index 0000000..c5d9258 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/Enums/Status.php @@ -0,0 +1,10 @@ +id(); + $table->float('amount'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('float_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $amount = 100.50; + + FloatCastingModel::create([ + 'amount' => $amount, + ]); + + $result = FloatCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('double') + ->and($result->amount)->toBe($amount); +})->group('FloatCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $amount = 100.50; + + FloatCastingModel::create([ + 'amount' => $amount, + ]); + + $newAmount = 200.75; + + FloatCastingModel::first()->update([ + 'amount' => $newAmount, + ]); + + $result = FloatCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('double') + ->and($result->amount)->toBe($newAmount); +})->group('FloatCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can find the saved record using Eloquent ORM', function () { + $amount = 100.50; + + FloatCastingModel::create([ + 'amount' => $amount, + ]); + + $result = FloatCastingModel::where('amount', $amount)->first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('double') + ->and($result->amount)->toBe($amount); +})->group('FloatCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/IntegerCastingTest.php b/tests/Feature/EloquentAttributeCasting/IntegerCastingTest.php new file mode 100644 index 0000000..9c47ca2 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/IntegerCastingTest.php @@ -0,0 +1,63 @@ +id(); + $table->integer('amount'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('integer_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $amount = 100; + + IntegerCastingModel::create([ + 'amount' => $amount, + ]); + + $result = IntegerCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('integer') + ->and($result->amount)->toBe($amount); +})->group('IntegerCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $amount = 100; + + IntegerCastingModel::create([ + 'amount' => $amount, + ]); + + $newAmount = 200; + + IntegerCastingModel::first()->update([ + 'amount' => $newAmount, + ]); + + $result = IntegerCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('integer') + ->and($result->amount)->toBe($newAmount); +})->group('IntegerCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can find a record using Eloquent ORM', function () { + $amount = 100; + + IntegerCastingModel::create([ + 'amount' => $amount, + ]); + + $result = IntegerCastingModel::where('amount', $amount)->first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->amount))->toBe('integer') + ->and($result->amount)->toBe($amount); +})->group('IntegerCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentAttributeCasting/TimestampCastingTest.php b/tests/Feature/EloquentAttributeCasting/TimestampCastingTest.php new file mode 100644 index 0000000..3053be2 --- /dev/null +++ b/tests/Feature/EloquentAttributeCasting/TimestampCastingTest.php @@ -0,0 +1,63 @@ +id(); + $table->timestamp('added_at'); + }); +}); + +afterEach(function () { + Schema::dropIfExists('timestamp_casting_table'); +}); + +test('it can insert a new record using Eloquent ORM', function () { + $addedAt = now(); + + TimestampCastingModel::create([ + 'added_at' => $addedAt, + ]); + + $result = TimestampCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->added_at))->toBe('integer') + ->and($result->added_at)->toBe($addedAt->timestamp); +})->group('TimestampCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can update an existing record using Eloquent ORM', function () { + $addedAt = now(); + + TimestampCastingModel::create([ + 'added_at' => $addedAt, + ]); + + $newAddedAt = now()->addHour(); + + TimestampCastingModel::first()->update([ + 'added_at' => $newAddedAt, + ]); + + $result = TimestampCastingModel::first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->added_at))->toBe('integer') + ->and($result->added_at)->toBe($newAddedAt->timestamp); +})->group('TimestampCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); + +test('it can retrieve a record using Eloquent ORM', function () { + $addedAt = now(); + + TimestampCastingModel::create([ + 'added_at' => $addedAt, + ]); + + $result = TimestampCastingModel::where('added_at', $addedAt)->first(); + + expect($result->id)->toBe(1) + ->and(gettype($result->added_at))->toBe('integer') + ->and($result->added_at)->toBe($addedAt->timestamp); +})->group('TimestampCastingTest', 'EloquentAttributeCastings', 'FeatureTest'); diff --git a/tests/Feature/EloquentCollectionTest.php b/tests/Feature/EloquentCollectionTest.php new file mode 100644 index 0000000..70e4dea --- /dev/null +++ b/tests/Feature/EloquentCollectionTest.php @@ -0,0 +1,26 @@ +count(3)->create(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can perform the fresh() method', function () { + $collection = Project::all(); + + $collection->first()->delete(); + + $freshCollection = $collection->fresh(); + + expect($freshCollection)->toBeInstanceOf(Collection::class) + ->and($freshCollection->count())->toBe($collection->count() - 1); +})->group('EloquentCollectionTest', 'FeatureTest'); diff --git a/tests/Feature/EloquentDeleteTest.php b/tests/Feature/EloquentDeleteTest.php new file mode 100644 index 0000000..8b3e2c1 --- /dev/null +++ b/tests/Feature/EloquentDeleteTest.php @@ -0,0 +1,48 @@ +project1 = Project::create(['name' => 'Project 1']); + $this->project2 = Project::create(['name' => 'Project 2']); + $this->project3 = Project::create(['name' => 'Project 3']); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can delete a single record', function () { + $this->project2->delete(); + + expect(Project::count())->toBe(2) + ->and(Project::find($this->project2->getKey()))->toBeNull(); +})->group('EloquentDeleteTest', 'FeatureTest'); + +test('it can delete multiple records using query', function () { + Project::whereIn('id', [$this->project1->getKey(), $this->project3->getKey()])->delete(); + + expect(Project::count())->toBe(1) + ->and(Project::find($this->project1->getKey()))->toBeNull() + ->and(Project::find($this->project3->getKey()))->toBeNull(); +})->group('EloquentDeleteTest', 'FeatureTest'); + +test('it can delete multiple records using destroy method', function () { + Project::destroy([$this->project1->getKey(), $this->project3->getKey()]); + + expect(Project::count())->toBe(1) + ->and(Project::find($this->project1->getKey()))->toBeNull() + ->and(Project::find($this->project3->getKey()))->toBeNull(); +})->group('EloquentDeleteTest', 'FeatureTest'); + +test('it can truncate the whole table', function () { + Project::truncate(); + + expect(Project::count())->toBe(0) + ->and(Project::find($this->project1->getKey()))->toBeNull() + ->and(Project::find($this->project2->getKey()))->toBeNull() + ->and(Project::find($this->project3->getKey()))->toBeNull(); +})->group('EloquentDeleteTest', 'FeatureTest'); diff --git a/tests/Feature/EloquentRelationship/HasManyThroughTest.php b/tests/Feature/EloquentRelationship/HasManyThroughTest.php new file mode 100644 index 0000000..b4c25b2 --- /dev/null +++ b/tests/Feature/EloquentRelationship/HasManyThroughTest.php @@ -0,0 +1,60 @@ +project = Project::factory()->create(); + $this->environment = Environment::factory()->create([ + 'project_id' => $this->project->getKey(), + ]); + + $this->deployment1 = Deployment::factory()->create([ + 'environment_id' => $this->environment->getKey(), + ]); + $this->deployment2 = Deployment::factory()->create([ + 'environment_id' => $this->environment->getKey(), + ]); + $this->deployment3 = Deployment::factory()->create([ + 'environment_id' => $this->environment->getKey(), + ]); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can retrieve the related model in has many through relationship', function () { + $project = Project::findOrFail($this->project->getKey()); + $deployments = $project->deployments; + + expect($deployments)->not->toBeEmpty() + ->and($deployments)->toBeInstanceOf(Collection::class) + ->and($deployments->count())->toBe(3) + ->and($deployments->first()->getKey())->toBe($this->deployment1->getKey()) + ->and($deployments->last()->getKey())->toBe($this->deployment3->getKey()) + ->and($deployments->first()->environment->getKey())->toBe($this->environment->getKey()) + ->and($deployments->last()->environment->getKey())->toBe($this->environment->getKey()) + ->and($deployments->first()->environment->project->getKey())->toBe($this->project->getKey()) + ->and($deployments->last()->environment->project->getKey())->toBe($this->project->getKey()); +})->group('HasManyThroughTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in has many through relationship using eager loading', function () { + $project = Project::with('deployments')->findOrFail($this->project->getKey()); + $deployments = $project->deployments; + + expect($deployments)->not->toBeEmpty() + ->and($deployments)->toBeInstanceOf(Collection::class) + ->and($deployments->count())->toBe(3) + ->and($deployments->first()->getKey())->toBe($this->deployment1->getKey()) + ->and($deployments->last()->getKey())->toBe($this->deployment3->getKey()) + ->and($deployments->first()->environment->getKey())->toBe($this->environment->getKey()) + ->and($deployments->last()->environment->getKey())->toBe($this->environment->getKey()) + ->and($deployments->first()->environment->project->getKey())->toBe($this->project->getKey()) + ->and($deployments->last()->environment->project->getKey())->toBe($this->project->getKey()); +})->group('HasManyThroughTest', 'EloquentRelationship', 'FeatureTest'); diff --git a/tests/Feature/EloquentRelationship/ManyToManyTest.php b/tests/Feature/EloquentRelationship/ManyToManyTest.php new file mode 100644 index 0000000..b20ce27 --- /dev/null +++ b/tests/Feature/EloquentRelationship/ManyToManyTest.php @@ -0,0 +1,71 @@ +user = User::factory()->create(); + $this->role1 = Role::factory()->create(); + $this->role2 = Role::factory()->create(); + $this->role3 = Role::factory()->create(); + + $this->user->roles()->attach($this->role1->getKey()); + $this->user->roles()->attach($this->role3->getKey()); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can retrieve the related model in many to many relationship', function () { + $user = User::findOrFail($this->user->getKey()); + $roles = $user->roles; + + expect($roles)->not->toBeEmpty() + ->and($roles->count())->toBe(2) + ->and($roles->first()->getKey())->toBe($this->role1->getKey()) + ->and($roles->last()->getKey())->toBe($this->role3->getKey()); +})->group('ManyToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in many to many relationship using eager loading', function () { + $user = User::with('roles')->findOrFail($this->user->getKey()); + $roles = $user->roles; + + expect($roles)->not->toBeEmpty() + ->and($roles->count())->toBe(2) + ->and($roles->first()->getKey())->toBe($this->role1->getKey()) + ->and($roles->last()->getKey())->toBe($this->role3->getKey()); +})->group('ManyToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in inverted way of many to many relationship', function () { + $role = Role::findOrFail($this->role1->getKey()); + $users = $role->users; + + expect($users)->not->toBeEmpty() + ->and($users)->toBeInstanceOf(Collection::class) + ->and($users->count())->toBe(1) + ->and($users->first()->getKey())->toBe($this->user->getKey()); +})->group('ManyToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in inverted way of many to many relationship using eager loading', function () { + $role = Role::with('users')->findOrFail($this->role1->getKey()); + $users = $role->users; + + expect($users)->not->toBeEmpty() + ->and($users)->toBeInstanceOf(Collection::class) + ->and($users->count())->toBe(1) + ->and($users->first()->getKey())->toBe($this->user->getKey()); +})->group('ManyToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can filter the many to many relationship by specifying a column value', function () { + $user = User::findOrFail($this->user->getKey()); + $role = $user->roles()->where('name', $this->role3->name)->first(); + + expect($role)->not->toBeNull() + ->and($role->getKey())->toBe($this->role3->getKey()) + ->and($role->name)->toBe($this->role3->name); +})->group('ManyToManyTest', 'EloquentRelationship', 'FeatureTest'); diff --git a/tests/Feature/EloquentRelationship/OneToManyTest.php b/tests/Feature/EloquentRelationship/OneToManyTest.php new file mode 100644 index 0000000..ccc248a --- /dev/null +++ b/tests/Feature/EloquentRelationship/OneToManyTest.php @@ -0,0 +1,94 @@ +user = User::factory()->create(); + $this->post1 = Post::factory()->create([ + 'user_id' => $this->user->getKey(), + ]); + $this->post2 = Post::factory()->create([ + 'user_id' => $this->user->getKey(), + ]); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can retrieve the related model in one to many relationship', function () { + $user = User::findOrFail($this->user->getKey()); + $posts = $user->posts; + + expect($posts)->not->toBeEmpty() + ->and($posts)->toBeInstanceOf(Collection::class) + ->and($posts->count())->toBe(2) + ->and($posts->first()->getKey())->toBe($this->post1->getKey()) + ->and($posts->last()->getKey())->toBe($this->post2->getKey()) + ->and($posts->first()->user->getKey())->toBe($this->user->getKey()) + ->and($posts->last()->user->getKey())->toBe($this->user->getKey()); +})->group('OneToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in one to many relationship using eager loading', function () { + $user = User::with('posts')->findOrFail($this->user->getKey()); + $posts = $user->posts; + + expect($posts)->not->toBeEmpty() + ->and($posts)->toBeInstanceOf(Collection::class) + ->and($posts->count())->toBe(2) + ->and($posts->first()->getKey())->toBe($this->post1->getKey()) + ->and($posts->last()->getKey())->toBe($this->post2->getKey()) + ->and($posts->first()->user->getKey())->toBe($this->user->getKey()) + ->and($posts->last()->user->getKey())->toBe($this->user->getKey()); +})->group('OneToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in inverted way of one to many relationship', function () { + $post = Post::findOrFail($this->post1->getKey()); + $user = $post->user; + + expect($user)->not->toBeNull() + ->and($user->getKey())->toBe($this->user->getKey()) + ->and($user->name)->toBe($this->user->name) + ->and($user->email)->toBe($this->user->email) + ->and($user->email_verified_at->format('Y-m-d H:i:s'))->toBe($this->user->email_verified_at->format('Y-m-d H:i:s')); +})->group('OneToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in inverted way of one to many relationship using eager loading', function () { + $post = Post::with('user')->findOrFail($this->post1->getKey()); + $user = $post->user; + + expect($user)->not->toBeNull() + ->and($user->getKey())->toBe($this->user->getKey()) + ->and($user->name)->toBe($this->user->name) + ->and($user->email)->toBe($this->user->email) + ->and($user->email_verified_at->format('Y-m-d H:i:s'))->toBe($this->user->email_verified_at->format('Y-m-d H:i:s')); +})->group('OneToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can create a new Post record using eloquent relationship', function () { + $user = User::findOrFail($this->user->getKey()); + $post = $user->posts()->create([ + 'title' => 'New Post Title', + 'content' => 'New Post Content', + ]); + + expect($post)->not->toBeNull() + ->and($post->getKey())->not->toBeNull() + ->and($post->user->getKey())->toBe($user->getKey()) + ->and($post->title)->toBe('New Post Title') + ->and($post->content)->toBe('New Post Content'); +})->group('OneToManyTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can filter the has many relationship by specifying column value', function () { + $user = User::findOrFail($this->user->getKey()); + $post = $user->posts()->where('title', $this->post1->title)->first(); + + expect($post)->not->toBeNull() + ->and($post->getKey())->toBe($this->post1->getKey()) + ->and($post->title)->toBe($this->post1->title) + ->and($post->content)->toBe($this->post1->content); +})->group('OneToManyTest', 'EloquentRelationship', 'FeatureTest'); diff --git a/tests/Feature/EloquentRelationship/OneToOneTest.php b/tests/Feature/EloquentRelationship/OneToOneTest.php new file mode 100644 index 0000000..5542142 --- /dev/null +++ b/tests/Feature/EloquentRelationship/OneToOneTest.php @@ -0,0 +1,60 @@ +user = User::factory()->create(); + $this->phone = Phone::factory()->create([ + 'user_id' => $this->user->getKey(), + ]); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can retrieve the related model in one to one relationship', function () { + $user = User::findOrFail($this->user->getKey()); + $phone = $user->phone; + + expect($phone)->not->toBeNull() + ->and($phone->getKey())->toBe($this->phone->getKey()) + ->and($phone->user->getKey())->toBe($this->user->getKey()) + ->and($phone->phone_number)->toBe($this->phone->phone_number); +})->group('OneToOneTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in one to one relationship using eager loading', function () { + $user = User::with('phone')->findOrFail($this->user->getKey()); + $phone = $user->phone; + + expect($phone)->not->toBeNull() + ->and($phone->getKey())->toBe($this->phone->getKey()) + ->and($phone->user->getKey())->toBe($this->user->getKey()) + ->and($phone->phone_number)->toBe($this->phone->phone_number); +})->group('OneToOneTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in inverted way of one to one relationship', function () { + $phone = Phone::findOrFail($this->phone->getKey()); + $user = $phone->user; + + expect($user)->not->toBeNull() + ->and($user->getKey())->toBe($this->user->getKey()) + ->and($user->name)->toBe($this->user->name) + ->and($user->email)->toBe($this->user->email) + ->and($user->email_verified_at->format('Y-m-d H:i:s'))->toBe($this->user->email_verified_at->format('Y-m-d H:i:s')); +})->group('OneToOneTest', 'EloquentRelationship', 'FeatureTest'); + +test('it can retrieve the related model in inverted way of one to one relationship using eager loading', function () { + $phone = Phone::with('user')->findOrFail($this->phone->getKey()); + $user = $phone->user; + + expect($user)->not->toBeNull() + ->and($user->getKey())->toBe($this->user->getKey()) + ->and($user->name)->toBe($this->user->name) + ->and($user->email)->toBe($this->user->email) + ->and($user->email_verified_at->format('Y-m-d H:i:s'))->toBe($this->user->email_verified_at->format('Y-m-d H:i:s')); +})->group('OneToOneTest', 'EloquentRelationship', 'FeatureTest'); diff --git a/tests/Feature/EloquentSoftDeleteTest.php b/tests/Feature/EloquentSoftDeleteTest.php new file mode 100644 index 0000000..86e6ef6 --- /dev/null +++ b/tests/Feature/EloquentSoftDeleteTest.php @@ -0,0 +1,50 @@ +role1 = Role::create(['name' => 'Role 1']); + $this->role2 = Role::create(['name' => 'Role 2']); + $this->role3 = Role::create(['name' => 'Role 3']); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can delete a single record', function () { + $this->role2->delete(); + + expect(Role::count())->toBe(2) + ->and(Role::withTrashed()->count())->toBe(3) + ->and(Role::find($this->role2->getKey()))->toBeNull(); +})->group('EloquentSoftDeleteTest', 'FeatureTest'); + +test('deleted record can be retrieved using soft deletes specific feature', function () { + $this->role2->delete(); + + $role = Role::withTrashed()->find($this->role2->getKey()); + + expect($role)->not->toBeNull() + ->and($role->getKey())->toBe($this->role2->getKey()) + ->and($role->name)->toBe($this->role2->name); +})->group('EloquentSoftDeleteTest', 'FeatureTest'); + +test('it can restore a soft deleted record', function () { + $this->role2->delete(); + + expect(Role::count())->toBe(2) + ->and(Role::withTrashed()->find($this->role2->getKey()))->not->toBeNull(); + + $role = Role::withTrashed()->find($this->role2->getKey()); + $role->restore(); + + $role = Role::find($this->role2->getKey()); + + expect(Role::count())->toBe(3) + ->and(Role::whereNotNull('deleted_at')->count())->toBe(0) + ->and(Role::find($this->role2->getKey()))->not->toBeNull(); +})->group('EloquentSoftDeleteTest', 'FeatureTest'); diff --git a/tests/Feature/EmbebdedReplicaTest.php b/tests/Feature/EmbebdedReplicaTest.php new file mode 100644 index 0000000..c754f1b --- /dev/null +++ b/tests/Feature/EmbebdedReplicaTest.php @@ -0,0 +1,39 @@ +markTestSkipped('This test skipped by default because it need a running libsql server'); + } + clearDirectory(); + sleep(2); + DB::setDefaultConnection('otherdb2'); +}); + +test('it can connect to a embedded replica', function () { + DB::setDefaultConnection('otherdb2'); + $mode = DB::connection('otherdb2')->getConnectionMode(); + expect($mode)->toBe('remote_replica'); +})->group('EmbeddedReplicaTest', 'FeatureTest'); + +test('it can get all rows from the projects table through the embedded replica', function () { + DB::setDefaultConnection('otherdb2'); + Schema::dropAllTables(); + migrateTables('projects'); + + $this->project1 = Project::make()->setConnection('otherdb2')->factory()->create(); + $this->project2 = Project::make()->setConnection('otherdb2')->factory()->create(); + $this->project3 = Project::make()->setConnection('otherdb2')->factory()->create(); + $projects = DB::connection('otherdb2')->table('projects')->get(); + expect($projects->count())->toBe(3); + clearDirectory(); +})->group('EmbeddedReplicaTest', 'FeatureTest'); diff --git a/tests/Feature/LibsqlPDOStatementTest.php b/tests/Feature/LibsqlPDOStatementTest.php new file mode 100644 index 0000000..2fb4f4f --- /dev/null +++ b/tests/Feature/LibsqlPDOStatementTest.php @@ -0,0 +1,94 @@ +connection = DB::connection(); + $this->pdo = $this->connection->getPdo(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can fetch all row sets of a simple select query result in associative array format', function () { + $expectation = [ + [ + 'type' => 'table', + 'name' => 'migrations', + 'tbl_name' => 'migrations', + 'sql' => 'CREATE TABLE "migrations" ("id" integer primary key autoincrement not null, "migration" varchar not null, "batch" integer not null)', + ], + ]; + + $statement = $this->pdo->prepare('SELECT * FROM sqlite_schema WHERE type = ? AND name NOT LIKE ?'); + $this->connection->bindValues($statement, $this->connection->prepareBindings(['table', 'sqlite_%'])); + $statement->execute(); + + $statement->setFetchMode(\PDO::FETCH_ASSOC); + $response = $statement->fetchAll(); + + expect(count($response))->toBe(1) + ->and($response[0]['type'])->toBe($expectation[0]['type']) + ->and($response[0]['name'])->toBe($expectation[0]['name']) + ->and($response[0]['tbl_name'])->toBe($expectation[0]['tbl_name']) + ->and($response[0]['sql'])->toBe($expectation[0]['sql']); +})->group('LibsqlLPDOStatementTest', 'FeatureTest'); + +test('it can fetch each row set of a simple select query result in associative array format', function () { + $expectation = [ + 'type' => 'table', + 'name' => 'migrations', + 'tbl_name' => 'migrations', + 'sql' => 'CREATE TABLE "migrations" ("id" integer primary key autoincrement not null, "migration" varchar not null, "batch" integer not null)', + ]; + + $statement = $this->pdo->prepare('SELECT * FROM sqlite_schema WHERE type = ? AND name NOT LIKE ?'); + $this->connection->bindValues($statement, $this->connection->prepareBindings(['table', 'sqlite_%'])); + + $statement->execute(); + + $statement->setFetchMode(\PDO::FETCH_ASSOC); + $response = $statement->fetch(); + + expect($response['type'])->toBe($expectation['type']) + ->and($response['name'])->toBe($expectation['name']) + ->and($response['tbl_name'])->toBe($expectation['tbl_name']) + ->and($response['sql'])->toBe($expectation['sql']) + ->and($statement->fetch())->toBeFalse(); +})->group('LibsqlLPDOStatementTest', 'FeatureTest'); + +test('it can count the rows of query result set', function () { + + $statement = $this->pdo->prepare('SELECT * FROM sqlite_schema WHERE type = ? AND name NOT LIKE ?'); + $this->connection->bindValues($statement, $this->connection->prepareBindings(['table', 'sqlite_%'])); + $statement->execute(); + + expect($statement->rowCount())->toBe(1); +})->group('LibsqlLPDOStatementTest', 'FeatureTest'); + +test('it can perform query execution with binding values', function () { + DB::statement('INSERT INTO "migrations" ("migration", "batch") VALUES (?, ?)', ['CreateUsersTable', 1]); + + $statement = $this->pdo->prepare('SELECT * FROM "migrations" WHERE "migration" = ? AND "batch" = ?'); + $statement->execute(['CreateUsersTable', 1]); + + expect($statement->rowCount())->toBe(1); + + $result = $statement->fetch(); + + expect($result['migration'])->toBe('CreateUsersTable') + ->and($result['batch'])->toBe(1); +})->group('LibsqlLPDOStatementTest', 'FeatureTest'); + +test('it can perform update statement with binding values', function () { + DB::statement('INSERT INTO "migrations" ("migration", "batch") VALUES (?, ?)', ['CreateUsersTable', 1]); + + $statement = $this->pdo->prepare('UPDATE "migrations" SET "migration" = ? WHERE "id" = ?'); + $statement->execute(['CreateRolesTable', 1]); + + expect($statement->rowCount())->toBe(1); +})->group('LibsqlLPDOStatementTest', 'FeatureTest'); diff --git a/tests/Feature/LibsqlPDOTest.php b/tests/Feature/LibsqlPDOTest.php new file mode 100644 index 0000000..0f4bce1 --- /dev/null +++ b/tests/Feature/LibsqlPDOTest.php @@ -0,0 +1,47 @@ +pdo = DB::connection()->getPdo(); + + $this->pdo->exec('CREATE TABLE "projects" ("id" INTEGER PRIMARY KEY, "name" TEXT);'); +}); + +afterEach(function () { + $this->pdo->exec('DROP TABLE IF EXISTS "projects";'); +}); + +test('it can execute SQL command', function () { + expect($this->pdo->exec('PRAGMA foreign_keys = ON;'))->toBe(0); +})->group('LibsqlPDOTest', 'FeatureTest'); + +test('it can begin the database transaction, and rollback the changes.', function () { + $this->pdo->beginTransaction(); + + $this->pdo->exec('INSERT INTO "projects" ("name") VALUES (\'Project 1\');'); + $this->pdo->exec('INSERT INTO "projects" ("name") VALUES (\'Project 2\');'); + + expect($this->pdo->inTransaction())->toBeTrue() + ->and($this->pdo->exec('SELECT * FROM "projects";'))->toBe(2); + + $this->pdo->rollBack(); + + expect($this->pdo->inTransaction())->toBeFalse() + ->and($this->pdo->exec('SELECT * FROM "projects";'))->toBe(0); +})->group('LibsqlPDOTest', 'FeatureTest'); + +test('it can begin the database transaction, and commit the changes.', function () { + $this->pdo->beginTransaction(); + + $this->pdo->exec('INSERT INTO "projects" ("name") VALUES (\'Project 1\');'); + $this->pdo->exec('INSERT INTO "projects" ("name") VALUES (\'Project 2\');'); + + expect($this->pdo->inTransaction())->toBeTrue() + ->and($this->pdo->exec('SELECT * FROM "projects";'))->toBe(2); + + $this->pdo->commit(); + + expect($this->pdo->inTransaction())->toBeFalse() + ->and($this->pdo->exec('SELECT * FROM "projects";'))->toBe(2); +})->group('LibsqlPDOTest', 'FeatureTest'); diff --git a/tests/Feature/LibsqlSchemaBuilderTest.php b/tests/Feature/LibsqlSchemaBuilderTest.php new file mode 100644 index 0000000..8f7d67a --- /dev/null +++ b/tests/Feature/LibsqlSchemaBuilderTest.php @@ -0,0 +1,143 @@ +toBe([]); +})->group('LibsqlSchemaBuilderTest', 'FeatureTest'); + +test('it can retrieve all of the table information in the database', function () { + DB::select('CREATE TABLE "migrations" ("id" integer primary key autoincrement not null, "migration" varchar not null, "batch" integer not null)'); + + $result = Schema::getTables()[0]; + + expect($result['name'])->toBe('migrations') + ->and($result['schema'])->toBeNull() + ->and($result['comment'])->toBeNull() + ->and($result['collation'])->toBeNull() + ->and($result['engine'])->toBeNull(); +})->group('LibsqlSchemaBuilderTest', 'FeatureTest'); + +test('it can retrieve all of the column information in the table', function () { + DB::select('CREATE TABLE "migrations" ("id" integer primary key autoincrement not null, "migration" varchar not null, "batch" integer not null)'); + + $result = collect(Schema::getColumns('migrations'))->keyBy('name'); + + expect($result->count())->toBe(3) + ->and($result->has('id'))->toBeTrue() + ->and($result->has('migration'))->toBeTrue() + ->and($result->has('batch'))->toBeTrue() + ->and($result->get('id'))->toBe([ + 'name' => 'id', + 'type_name' => 'integer', + 'type' => 'integer', + 'collation' => null, + 'nullable' => false, + 'default' => null, + 'auto_increment' => true, + 'comment' => null, + 'generation' => null, + 'pk' => 1, + 'notnull' => 1, + 'dflt_value' => null, + 'cid' => 0, + 'hidden' => 0, + ]) + ->and($result->get('migration'))->toBe([ + 'name' => 'migration', + 'type_name' => 'varchar', + 'type' => 'varchar', + 'collation' => null, + 'nullable' => false, + 'default' => null, + 'auto_increment' => false, + 'comment' => null, + 'generation' => null, + 'pk' => 0, + 'notnull' => 1, + 'dflt_value' => null, + 'cid' => 1, + 'hidden' => 0, + ]) + ->and($result->get('batch'))->toBe([ + 'name' => 'batch', + 'type_name' => 'integer', + 'type' => 'integer', + 'collation' => null, + 'nullable' => false, + 'default' => null, + 'auto_increment' => false, + 'comment' => null, + 'generation' => null, + 'pk' => 0, + 'notnull' => 1, + 'dflt_value' => null, + 'cid' => 2, + 'hidden' => 0, + ]); +})->group('LibsqlSchemaBuilderTest', 'FeatureTest'); + +test('it can create a new table', function () { + Schema::dropIfExists('users'); + Schema::create('users', function (Blueprint $table) { + $table->id(); + $table->string('name'); + }); + + $result = Schema::getTables()[0]; + + expect($result['name'])->toBe('users') + ->and($result['schema'])->toBeNull() + ->and($result['comment'])->toBeNull() + ->and($result['collation'])->toBeNull() + ->and($result['engine'])->toBeNull(); + + $columns = collect(Schema::getColumns('users'))->keyBy('name')->keys()->all(); + + expect($columns)->toBe(['id', 'name']); +})->group('LibsqlSchemaBuilderTest', 'FeatureTest'); + +test('it can alter an existing table.', function () { + Schema::create('users', function (Blueprint $table) { + $table->id(); + $table->string('name'); + }); + + Schema::table('users', function (Blueprint $table) { + $table->string('email')->after('name'); + }); + + expect(Schema::hasColumn('users', 'email'))->toBeTrue() + ->and(Schema::hasColumns('users', ['id', 'name', 'email']))->toBeTrue() + ->and(Schema::getColumnType('users', 'email', true))->toBe('varchar') + ->and(Schema::getColumnListing('users'))->toBe(['id', 'name', 'email']); +})->group('LibsqlSchemaBuilderTest', 'FeatureTest'); + +test('it can drop all views from the database', function () { + $createSql = 'CREATE VIEW foo (id) AS SELECT 1'; + + DB::statement($createSql); + + $view = collect(Schema::getViews())->first(); + + expect($view['name'])->toBe('foo') + ->and($view['schema'])->toBeNull() + ->and($view['definition'])->toBe($createSql); + + Schema::dropAllViews(); + + expect(Schema::getViews())->toBe([]); +})->group('LibsqlSchemaBuilderTest', 'FeatureTest'); diff --git a/tests/Feature/MulticonnectionTest.php b/tests/Feature/MulticonnectionTest.php new file mode 100644 index 0000000..e2062ac --- /dev/null +++ b/tests/Feature/MulticonnectionTest.php @@ -0,0 +1,50 @@ +markTestSkipped('This test skipped by default because it need a running libsql server'); + } + + DB::setDefaultConnection('otherdb'); + Schema::dropAllTables(); + migrateTables('projects'); + + $this->project1 = Project::make()->setConnection('otherdb')->factory()->create(); + $this->project2 = Project::make()->setConnection('otherdb')->factory()->create(); + $this->project3 = Project::make()->setConnection('otherdb')->factory()->create(); +}); + +afterEach(function () { + DB::setDefaultConnection('otherdb'); + Schema::dropAllTables(); +}); + +test('it can connect to a in-memory database', function () { + $mode = DB::connection('libsql')->getConnectionMode(); + expect($mode)->toBe('memory'); +})->group('MultiConnectionsTest', 'FeatureTest'); + +test('it can connect to a remote database', function () { + $mode = DB::connection('otherdb')->getConnectionMode(); + expect($mode)->toBe('remote'); +})->group('MultiConnectionsTest', 'FeatureTest'); + +test('each connection has its own libsql client instance', function () { + $client1 = DB::connection('libsql')->getPdo(); // In Memory Connection + $client2 = DB::connection('otherdb')->getPdo(); // Remote Connection + + expect($client1)->not->toBe($client2); +})->group('MultiConnectionsTest', 'FeatureTest'); + +test('it can get all rows from the projects table through the remote connection', function () { + $projects = DB::connection('otherdb')->table('projects')->get(); + + expect($projects)->toHaveCount(3) + ->and($projects[0]->name)->toEqual($this->project1->name) + ->and($projects[1]->name)->toEqual($this->project2->name) + ->and($projects[2]->name)->toEqual($this->project3->name); +})->group('MultiConnectionsTest', 'FeatureTest'); diff --git a/tests/Feature/QueryBuilder/DatabaseQueriesTest.php b/tests/Feature/QueryBuilder/DatabaseQueriesTest.php new file mode 100644 index 0000000..f0ff486 --- /dev/null +++ b/tests/Feature/QueryBuilder/DatabaseQueriesTest.php @@ -0,0 +1,105 @@ +project1 = Project::factory()->create(); + $this->project2 = Project::factory()->create(); + $this->project3 = Project::factory()->create(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can get all rows from the table', function () { + $projects = DB::table('projects')->get(); + + expect($projects)->toHaveCount(3) + ->and($projects[0]->name)->toEqual($this->project1->name) + ->and($projects[1]->name)->toEqual($this->project2->name) + ->and($projects[2]->name)->toEqual($this->project3->name); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can retrieve a single row from the table with first() method', function () { + $project = DB::table('projects')->where('name', $this->project2->name)->first(); + + expect($project)->not->toBeNull() + ->and($project)->toBeObject() + ->and($project->id)->toEqual($this->project2->id) + ->and($project->name)->toEqual($this->project2->name); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can retrieve a single row from the table with find() method', function () { + $project = DB::table('projects')->find($this->project2->getKey()); + + expect($project)->not->toBeNull() + ->and($project)->toBeObject() + ->and($project->id)->toEqual($this->project2->id) + ->and($project->name)->toEqual($this->project2->name); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it will return null if there was no record with the given id to be found', function () { + $project = DB::table('projects')->find(999); + + expect($project)->toBeNull(); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can retrieve a list of column values', function () { + $expectation = [ + $this->project1->name, + $this->project2->name, + $this->project3->name, + ]; + + $projects = DB::table('projects')->get()->pluck('name')->toArray(); + + expect($projects)->toBeArray() + ->and($projects)->toHaveCount(3) + ->and($projects)->toEqual($expectation); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can stream the results lazily', function () { + $expectations = [ + $this->project1, + $this->project2, + $this->project3, + ]; + + DB::table('projects') + ->orderBy('id') + ->lazy() + ->each(function (object $project, int $index) use ($expectations) { + expect($project)->toBeObject() + ->and($project->id)->toEqual($expectations[$index]->id) + ->and($project->name)->toEqual($expectations[$index]->name); + }); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can count the records count', function () { + expect(DB::table('projects')->count())->toEqual(3); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can return the maximum value of a column from the table', function () { + expect(DB::table('projects')->max('id'))->toEqual(3); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can return the minimum value of a column from the table', function () { + expect(DB::table('projects')->min('id'))->toEqual(1); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can return the average value of a column from the table', function () { + expect(DB::table('projects')->avg('id'))->toEqual(2); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); + +test('it can determine if a record exists in the table', function () { + $exists = DB::table('projects')->where('name', $this->project2->name)->exists(); + $doesntExist = DB::table('projects')->where('name', 'unknown')->doesntExist(); + + expect($exists)->toBeTrue() + ->and($doesntExist)->toBeTrue(); +})->group('DatabaseQueriesTest', 'QueryBuilder', 'FeatureTest'); diff --git a/tests/Feature/QueryBuilder/DeleteStatementsTest.php b/tests/Feature/QueryBuilder/DeleteStatementsTest.php new file mode 100644 index 0000000..4229344 --- /dev/null +++ b/tests/Feature/QueryBuilder/DeleteStatementsTest.php @@ -0,0 +1,41 @@ +user1 = User::factory()->create(); + $this->user2 = User::factory()->create(); + $this->user3 = User::factory()->create(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can delete multiple records', function () { + DB::table('users')->where('id', '>', 1)->delete(); + + expect(DB::table('users')->count())->toBe(1); +})->group('DeleteStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can truncate the whole table content', function () { + DB::table('users')->truncate(); + + expect(DB::table('users')->count())->toBe(0); +})->group('DeleteStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can delete a single record', function () { + DB::table('users')->where('id', $this->user2->getKey())->delete(); + + expect(DB::table('users')->count())->toBe(2); +})->group('DeleteStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can delete all records', function () { + DB::table('users')->delete(); + + expect(DB::table('users')->count())->toBe(0); +})->group('DeleteStatementsTest', 'QueryBuilder', 'FeatureTest'); diff --git a/tests/Feature/QueryBuilder/InsertStatementsTest.php b/tests/Feature/QueryBuilder/InsertStatementsTest.php new file mode 100644 index 0000000..d00c442 --- /dev/null +++ b/tests/Feature/QueryBuilder/InsertStatementsTest.php @@ -0,0 +1,67 @@ +insert([ + 'name' => 'John Doe', + 'email' => 'john.doe@gmail.com', + ]); + + $user = DB::table('users')->first(); + + expect($result)->toBeTrue() + ->and(DB::table('users')->count())->toBe(1) + ->and($user->name)->toBe('John Doe') + ->and($user->email)->toBe('john.doe@gmail.com'); +})->group('InsertStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can insert multiple records', function () { + $result = DB::table('users')->insert([ + [ + 'name' => 'John Doe', + 'email' => 'john.doe@gmail.com', + ], + [ + 'name' => 'June Monroe', + 'email' => 'june.monroe@gmail.com', + ], + ]); + + $users = DB::table('users')->get(); + + expect($result)->toBeTrue() + ->and(DB::table('users')->count())->toBe(2) + ->and($users->first()->name)->toBe('John Doe') + ->and($users->first()->email)->toBe('john.doe@gmail.com') + ->and($users->last()->name)->toBe('June Monroe') + ->and($users->last()->email)->toBe('june.monroe@gmail.com'); +})->group('InsertStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can get the auto increment id as the result of insert command', function () { + User::factory()->create(); + + $expectation = User::factory()->make(); + + $result = DB::table('users')->insertGetId([ + 'name' => $expectation->name, + 'email' => $expectation->email, + ]); + + $newUser = DB::table('users')->find($result); + + expect(DB::table('users')->count())->toBe(2) + ->and($result)->toBe(2) + ->and($newUser->name)->toBe($expectation->name) + ->and($newUser->email)->toBe($expectation->email); +})->group('InsertStatementsTest', 'QueryBuilder', 'FeatureTest'); diff --git a/tests/Feature/QueryBuilder/RawExpressionsTest.php b/tests/Feature/QueryBuilder/RawExpressionsTest.php new file mode 100644 index 0000000..cb1a616 --- /dev/null +++ b/tests/Feature/QueryBuilder/RawExpressionsTest.php @@ -0,0 +1,66 @@ +user1 = User::factory()->create(); + $this->user2 = User::factory()->create(); + $this->user3 = User::factory()->create(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can perform raw column selection', function () { + $result = DB::table('users') + ->select(DB::raw('count (*) as user_count')) + ->get(); + + expect($result->first()->user_count)->toBe(3); +})->group('RawExpressionsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can perform selectRaw query', function () { + $result = DB::table('users') + ->selectRaw('id, id * ? as multiplied_id', [3]) + ->orderBy('id') + ->get(); + + expect($result->count())->toBe(3) + ->and($result[0]->multiplied_id)->toBe((int) $this->user1->getKey() * 3) + ->and($result[1]->multiplied_id)->toBe((int) $this->user2->getKey() * 3) + ->and($result[2]->multiplied_id)->toBe((int) $this->user3->getKey() * 3); +})->group('RawExpressionsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can perform whereRaw query', function () { + $newUser = User::factory()->create([ + 'created_at' => Carbon::parse('1945-08-17 00:00:00'), + ]); + + $selectedUser = DB::table('users') + ->whereRaw("strftime('%Y-%m', created_at) = '1945-08'") + ->first(); + + expect($selectedUser)->not->toBeNull() + ->and($selectedUser->id)->toBe($newUser->id) + ->and($selectedUser->name)->toBe($newUser->name); +})->group('RawExpressionsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can perform orderByRaw query', function () { + $newUser = User::factory()->create([ + 'created_at' => Carbon::parse('1945-08-17 00:00:00'), + ]); + + $result = DB::table('users') + ->orderByRaw('updated_at - created_at DESC') + ->first(); + + expect($result)->not->toBeNull() + ->and($result->id)->toBe($newUser->id) + ->and($result->name)->toBe($newUser->name); +})->group('RawExpressionsTest', 'QueryBuilder', 'FeatureTest'); diff --git a/tests/Feature/QueryBuilder/SelectStatementsTest.php b/tests/Feature/QueryBuilder/SelectStatementsTest.php new file mode 100644 index 0000000..e6221a0 --- /dev/null +++ b/tests/Feature/QueryBuilder/SelectStatementsTest.php @@ -0,0 +1,57 @@ +user1 = User::factory()->create(); + $this->user2 = User::factory()->create(); + $this->user3 = User::factory()->create(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can specify a select clause', function () { + $users = DB::table('users')->select('name', 'email as user_email')->get(); + + expect($users)->toHaveCount(3) + ->and($users[0]->name)->toEqual($this->user1->name) + ->and($users[0]->user_email)->toEqual($this->user1->email) + ->and($users[1]->name)->toEqual($this->user2->name) + ->and($users[1]->user_email)->toEqual($this->user2->email) + ->and($users[2]->name)->toEqual($this->user3->name) + ->and($users[2]->user_email)->toEqual($this->user3->email); +})->group('SelectStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can return distinct result', function () { + $newUser = User::factory()->create([ + 'name' => $this->user2->name, + ]); + + $users = DB::table('users')->select('name')->distinct()->get(); + + expect($users)->toHaveCount(3) + ->and(DB::table('users')->count())->toEqual(4) + ->and($users[0]->name)->toEqual($this->user1->name) + ->and($users[1]->name)->toEqual($this->user2->name) + ->and($users[2]->name)->toEqual($this->user3->name); +})->group('SelectStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can add another column selection', function () { + $query = DB::table('users')->select('name'); + + $users = $query->addSelect('email')->get(); + + expect($users)->toHaveCount(3) + ->and($users[0]->name)->toEqual($this->user1->name) + ->and($users[0]->email)->toEqual($this->user1->email) + ->and($users[1]->name)->toEqual($this->user2->name) + ->and($users[1]->email)->toEqual($this->user2->email) + ->and($users[2]->name)->toEqual($this->user3->name) + ->and($users[2]->email)->toEqual($this->user3->email); +})->group('SelectStatementsTest', 'QueryBuilder', 'FeatureTest'); diff --git a/tests/Feature/QueryBuilder/UpdateStatementsTest.php b/tests/Feature/QueryBuilder/UpdateStatementsTest.php new file mode 100644 index 0000000..9d92677 --- /dev/null +++ b/tests/Feature/QueryBuilder/UpdateStatementsTest.php @@ -0,0 +1,77 @@ +user = User::factory()->create(); +}); + +afterEach(function () { + Schema::dropAllTables(); +}); + +test('it can update the user\'s email address', function () { + DB::table('users') + ->where('id', $this->user->getKey()) + ->update([ + 'email' => 'richan.fongdasen@gmail.com', + ]); + + $updatedUser = DB::table('users')->find($this->user->getKey()); + + expect($updatedUser->email)->toBe('richan.fongdasen@gmail.com'); +})->group('UpdateStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can insert a new record with updateOrInsert method', function () { + DB::table('users') + ->updateOrInsert( + [ + 'name' => 'John Doe', + 'email' => 'john.doe@gmail.com', + ], + [ + 'remember_token' => '1234567890', + ] + ); + + $user = DB::table('users') + ->where('name', 'John Doe') + ->where('email', 'john.doe@gmail.com') + ->first(); + + expect($user->id)->toBe(2) + ->and($user->remember_token)->toBe('1234567890'); +})->group('UpdateStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can update an existing record with updateOrInsert method', function () { + DB::table('users') + ->updateOrInsert( + [ + 'name' => $this->user->name, + 'email' => $this->user->email, + ], + [ + 'remember_token' => '1234567890', + ] + ); + + $updatedUser = DB::table('users')->find($this->user->getKey()); + + expect(DB::hasModifiedRecords())->toBeTrue() + ->and(DB::table('users')->count())->toBe(1) + ->and($updatedUser->remember_token)->toBe('1234567890'); +})->group('UpdateStatementsTest', 'QueryBuilder', 'FeatureTest'); + +test('it can increment and decrement a column value', function () { + DB::table('users')->increment('id', 5); + + expect(DB::table('users')->first()->id)->toBe(6); + + DB::table('users')->decrement('id', 3); + + expect(DB::table('users')->first()->id)->toBe(3); +})->group('UpdateStatementsTest', 'QueryBuilder', 'FeatureTest'); diff --git a/tests/Fixtures/Factories/CommentFactory.php b/tests/Fixtures/Factories/CommentFactory.php new file mode 100644 index 0000000..933267c --- /dev/null +++ b/tests/Fixtures/Factories/CommentFactory.php @@ -0,0 +1,37 @@ + + */ +class CommentFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = Comment::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'user_id' => User::factory(), + 'post_id' => Post::factory(), + 'content' => $this->faker->paragraph(), // Generates random text content for comments + ]; + } +} diff --git a/tests/Fixtures/Factories/DeploymentFactory.php b/tests/Fixtures/Factories/DeploymentFactory.php new file mode 100644 index 0000000..8990ec7 --- /dev/null +++ b/tests/Fixtures/Factories/DeploymentFactory.php @@ -0,0 +1,31 @@ + + */ + public function definition(): array + { + return [ + 'environment_id' => Environment::factory(), + 'commit_hash' => sha1(Str::random(40)), + ]; + } + + public function modelName(): string + { + return Deployment::class; + } +} diff --git a/tests/Fixtures/Factories/EnvironmentFactory.php b/tests/Fixtures/Factories/EnvironmentFactory.php new file mode 100644 index 0000000..e03d107 --- /dev/null +++ b/tests/Fixtures/Factories/EnvironmentFactory.php @@ -0,0 +1,30 @@ + + */ + public function definition(): array + { + return [ + 'project_id' => Project::factory(), + 'name' => fake()->text(rand(5, 10)), + ]; + } + + public function modelName(): string + { + return Environment::class; + } +} diff --git a/tests/Fixtures/Factories/PhoneFactory.php b/tests/Fixtures/Factories/PhoneFactory.php new file mode 100644 index 0000000..4d7f3dd --- /dev/null +++ b/tests/Fixtures/Factories/PhoneFactory.php @@ -0,0 +1,30 @@ + + */ + public function definition(): array + { + return [ + 'user_id' => User::factory(), + 'phone_number' => fake()->phoneNumber(), + ]; + } + + public function modelName(): string + { + return Phone::class; + } +} diff --git a/tests/Fixtures/Factories/PostFactory.php b/tests/Fixtures/Factories/PostFactory.php new file mode 100644 index 0000000..a3ecbde --- /dev/null +++ b/tests/Fixtures/Factories/PostFactory.php @@ -0,0 +1,31 @@ + + */ + public function definition(): array + { + return [ + 'user_id' => User::factory(), + 'title' => fake()->text(rand(10, 30)), + 'content' => fake()->paragraph(), + ]; + } + + public function modelName(): string + { + return Post::class; + } +} diff --git a/tests/Fixtures/Factories/ProjectFactory.php b/tests/Fixtures/Factories/ProjectFactory.php new file mode 100644 index 0000000..4d073ec --- /dev/null +++ b/tests/Fixtures/Factories/ProjectFactory.php @@ -0,0 +1,28 @@ + + */ + public function definition(): array + { + return [ + 'name' => fake()->text(rand(5, 10)), + ]; + } + + public function modelName(): string + { + return Project::class; + } +} diff --git a/tests/Fixtures/Factories/RoleFactory.php b/tests/Fixtures/Factories/RoleFactory.php new file mode 100644 index 0000000..ef6de30 --- /dev/null +++ b/tests/Fixtures/Factories/RoleFactory.php @@ -0,0 +1,28 @@ + + */ + public function definition(): array + { + return [ + 'name' => fake()->text(rand(5, 10)), + ]; + } + + public function modelName(): string + { + return Role::class; + } +} diff --git a/tests/Fixtures/Factories/UserFactory.php b/tests/Fixtures/Factories/UserFactory.php new file mode 100644 index 0000000..953f4d8 --- /dev/null +++ b/tests/Fixtures/Factories/UserFactory.php @@ -0,0 +1,32 @@ + + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'remember_token' => Str::random(10), + ]; + } + + public function modelName(): string + { + return User::class; + } +} diff --git a/tests/Fixtures/Migrations/create_comments_table.php b/tests/Fixtures/Migrations/create_comments_table.php new file mode 100644 index 0000000..72eb036 --- /dev/null +++ b/tests/Fixtures/Migrations/create_comments_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->foreignId('post_id')->constrained()->cascadeOnDelete(); + $table->text('content'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('comments'); + } +}; diff --git a/tests/Fixtures/Migrations/create_deployments_table.php b/tests/Fixtures/Migrations/create_deployments_table.php new file mode 100644 index 0000000..63da503 --- /dev/null +++ b/tests/Fixtures/Migrations/create_deployments_table.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger('environment_id'); + $table->string('commit_hash'); + $table->timestamps(); + + $table->foreign('environment_id') + ->references('id') + ->on('environments') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('deployments'); + } +}; diff --git a/tests/Fixtures/Migrations/create_environments_table.php b/tests/Fixtures/Migrations/create_environments_table.php new file mode 100644 index 0000000..0c72107 --- /dev/null +++ b/tests/Fixtures/Migrations/create_environments_table.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger('project_id'); + $table->string('name'); + $table->timestamps(); + + $table->foreign('project_id') + ->references('id') + ->on('projects') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('environments'); + } +}; diff --git a/tests/Fixtures/Migrations/create_phones_table.php b/tests/Fixtures/Migrations/create_phones_table.php new file mode 100644 index 0000000..841e1f9 --- /dev/null +++ b/tests/Fixtures/Migrations/create_phones_table.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->string('phone_number'); + $table->timestamps(); + + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('phones'); + } +}; diff --git a/tests/Fixtures/Migrations/create_posts_table.php b/tests/Fixtures/Migrations/create_posts_table.php new file mode 100644 index 0000000..ff13912 --- /dev/null +++ b/tests/Fixtures/Migrations/create_posts_table.php @@ -0,0 +1,34 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->string('title'); + $table->text('content'); + $table->timestamps(); + + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('posts'); + } +}; diff --git a/tests/Fixtures/Migrations/create_projects_table.php b/tests/Fixtures/Migrations/create_projects_table.php new file mode 100644 index 0000000..17a1436 --- /dev/null +++ b/tests/Fixtures/Migrations/create_projects_table.php @@ -0,0 +1,27 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('projects'); + } +}; diff --git a/tests/Fixtures/Migrations/create_roles_table.php b/tests/Fixtures/Migrations/create_roles_table.php new file mode 100644 index 0000000..ae1132e --- /dev/null +++ b/tests/Fixtures/Migrations/create_roles_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('roles'); + } +}; diff --git a/tests/Fixtures/Migrations/create_user_roles_table.php b/tests/Fixtures/Migrations/create_user_roles_table.php new file mode 100644 index 0000000..1f38599 --- /dev/null +++ b/tests/Fixtures/Migrations/create_user_roles_table.php @@ -0,0 +1,37 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('role_id'); + + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onDelete('cascade'); + + $table->foreign('role_id') + ->references('id') + ->on('roles') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_roles'); + } +}; diff --git a/tests/Fixtures/Migrations/create_users_table.php b/tests/Fixtures/Migrations/create_users_table.php new file mode 100644 index 0000000..02d9252 --- /dev/null +++ b/tests/Fixtures/Migrations/create_users_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + } +}; diff --git a/tests/Fixtures/Models/Comment.php b/tests/Fixtures/Models/Comment.php new file mode 100644 index 0000000..b245b21 --- /dev/null +++ b/tests/Fixtures/Models/Comment.php @@ -0,0 +1,55 @@ + + */ + protected $fillable = [ + 'user_id', + 'post_id', + 'content', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + 'user_id' => 'integer', + 'post_id' => 'integer', + ]; + } + + /** + * Get the user who created the comment. + */ + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + /** + * Get the post the comment belongs to. + */ + public function post(): BelongsTo + { + return $this->belongsTo(Post::class); + } +} diff --git a/tests/Fixtures/Models/Deployment.php b/tests/Fixtures/Models/Deployment.php new file mode 100644 index 0000000..74f811e --- /dev/null +++ b/tests/Fixtures/Models/Deployment.php @@ -0,0 +1,41 @@ + + */ + protected $fillable = [ + 'commit_hash', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + 'environment_id' => 'integer', + ]; + } + + public function environment(): BelongsTo + { + return $this->belongsTo(Environment::class); + } +} diff --git a/tests/Fixtures/Models/Environment.php b/tests/Fixtures/Models/Environment.php new file mode 100644 index 0000000..1560175 --- /dev/null +++ b/tests/Fixtures/Models/Environment.php @@ -0,0 +1,47 @@ + + */ + protected $fillable = [ + 'name', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + 'project_id' => 'integer', + ]; + } + + public function deployments(): HasMany + { + return $this->hasMany(Deployment::class); + } + + public function project(): BelongsTo + { + return $this->belongsTo(Project::class); + } +} diff --git a/tests/Fixtures/Models/Phone.php b/tests/Fixtures/Models/Phone.php new file mode 100644 index 0000000..c107ad2 --- /dev/null +++ b/tests/Fixtures/Models/Phone.php @@ -0,0 +1,42 @@ + + */ + protected $fillable = [ + 'user_id', + 'phone_number', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + 'user_id' => 'integer', + ]; + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/tests/Fixtures/Models/Post.php b/tests/Fixtures/Models/Post.php new file mode 100644 index 0000000..c30a254 --- /dev/null +++ b/tests/Fixtures/Models/Post.php @@ -0,0 +1,49 @@ + + */ + protected $fillable = [ + 'user_id', + 'title', + 'content', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + 'user_id' => 'integer', + ]; + } + + public function comments(): HasMany + { + return $this->hasMany(Comment::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/tests/Fixtures/Models/Project.php b/tests/Fixtures/Models/Project.php new file mode 100644 index 0000000..b9ebb83 --- /dev/null +++ b/tests/Fixtures/Models/Project.php @@ -0,0 +1,46 @@ + + */ + protected $fillable = [ + 'name', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + ]; + } + + public function environments(): HasMany + { + return $this->hasMany(Environment::class); + } + + public function deployments(): HasManyThrough + { + return $this->hasManyThrough(Deployment::class, Environment::class); + } +} diff --git a/tests/Fixtures/Models/Role.php b/tests/Fixtures/Models/Role.php new file mode 100644 index 0000000..f964111 --- /dev/null +++ b/tests/Fixtures/Models/Role.php @@ -0,0 +1,42 @@ + + */ + protected $fillable = [ + 'name', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + ]; + } + + public function users(): BelongsToMany + { + return $this->belongsToMany(User::class, 'user_roles'); + } +} diff --git a/tests/Fixtures/Models/User.php b/tests/Fixtures/Models/User.php new file mode 100644 index 0000000..788c396 --- /dev/null +++ b/tests/Fixtures/Models/User.php @@ -0,0 +1,71 @@ + + */ + protected $fillable = [ + 'name', + 'email', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'id' => 'integer', + 'email_verified_at' => 'datetime', + ]; + } + + public function comments(): HasManyThrough + { + return $this->hasManyThrough(Comment::class, Post::class); + } + + public function phone(): HasOne + { + return $this->hasOne(Phone::class); + } + + public function posts(): HasMany + { + return $this->hasMany(Post::class); + } + + public function roles(): BelongsToMany + { + return $this->belongsToMany(Role::class, 'user_roles'); + } +} diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..9453fc0 --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,39 @@ +in(__DIR__); + +function migrateTables(...$tableNames): void +{ + collect($tableNames) + ->each(function (string $tableName) { + $migration = include __DIR__ . '/Fixtures/Migrations/create_' . Str::snake(Str::plural($tableName)) . '_table.php'; + $migration->up(); + }); +} + +function test_database_path(string $path): string +{ + return __DIR__ . DIRECTORY_SEPARATOR . 'database' . DIRECTORY_SEPARATOR . $path; +} + +function clearDirectory(): void +{ + $path = __DIR__ . DIRECTORY_SEPARATOR . 'database'; + $files = File::allFiles($path); + + // Delete all files + foreach ($files as $file) { + File::delete($file); + } +} + +function shouldSkipTests() +{ + return true; +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..93f4b63 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,60 @@ + 'Libsql\\Laravel\\Tests\\Fixtures\\Factories\\' . class_basename($modelName) . 'Factory' + ); + } + + protected function getPackageProviders($app) + { + return [ + LibsqlServiceProvider::class, + ]; + } + + public function getEnvironmentSetUp($app) + { + config()->set('database.connections', [ + // In-Memory Connection + 'libsql' => [ + 'driver' => 'libsql', + 'url' => '', + 'password' => '', + 'database' => ':memory:', + 'prefix' => '', + ], + // Remote Connection + 'otherdb' => [ + 'driver' => 'libsql', + 'database' => '', + 'prefix' => '', + 'url' => 'http://127.0.0.1:8081', + // Replace the token with yours + 'password' => 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSJ9.eyJpYXQiOjE3MzY2MzU1MTUsIm5iZiI6MTczNjYzNTUxNSwiZXhwIjoxNzM3MjQwMzE1LCJqdGkiOiJkYjEifQ.5sm4FN4PosAJ5h9wLay6q3ryAxbGRGuETU1A3F_Tr3WXpAEnr98tmAa92qcpZz_YZN0T_h4RqjGlEMgrSwIJAQ', + ], + // Embedded Replica + 'otherdb2' => [ + 'driver' => 'libsql', + 'database' => test_database_path('otherdb2.db'), + 'prefix' => '', + 'url' => 'http://127.0.0.1:8081', + // Replace the token with yours + 'password' => 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSJ9.eyJpYXQiOjE3MzY2MzU1MTUsIm5iZiI6MTczNjYzNTUxNSwiZXhwIjoxNzM3MjQwMzE1LCJqdGkiOiJkYjEifQ.5sm4FN4PosAJ5h9wLay6q3ryAxbGRGuETU1A3F_Tr3WXpAEnr98tmAa92qcpZz_YZN0T_h4RqjGlEMgrSwIJAQ', + ], + ]); + config()->set('database.default', 'libsql'); + config()->set('queue.default', 'sync'); + } +} diff --git a/tests/Unit/Database/LibsqlConnectionTest.php b/tests/Unit/Database/LibsqlConnectionTest.php new file mode 100644 index 0000000..c38aad3 --- /dev/null +++ b/tests/Unit/Database/LibsqlConnectionTest.php @@ -0,0 +1,35 @@ +enableQueryLog(); + + expect(DB::connection('libsql')->logging())->toBeTrue(); +})->group('LibsqlConnectionTest', 'UnitTest'); + +test('it can disable query logging feature', function () { + DB::connection('libsql')->disableQueryLog(); + + expect(DB::connection('libsql')->logging())->toBeFalse(); +})->group('LibsqlConnectionTest', 'UnitTest'); + +test('it can get the query log', function () { + DB::connection('libsql')->enableQueryLog(); + + $log = DB::connection('libsql')->getQueryLog(); + + expect($log)->toBeArray() + ->and($log)->toHaveCount(0); +})->group('LibsqlConnectionTest', 'UnitTest'); + +test('it can flush the query log', function () { + DB::connection('libsql')->enableQueryLog(); + + DB::connection('libsql')->flushQueryLog(); + + $log = DB::connection('libsql')->getQueryLog(); + + expect($log)->toBeArray() + ->and($log)->toHaveCount(0); +})->group('LibsqlConnectionTest', 'UnitTest'); diff --git a/tests/Unit/Database/LibsqlPDOTest.php b/tests/Unit/Database/LibsqlPDOTest.php new file mode 100644 index 0000000..e9811e2 --- /dev/null +++ b/tests/Unit/Database/LibsqlPDOTest.php @@ -0,0 +1,13 @@ +pdo = DB::connection()->getPdo(); +}); + +test('it can manage the last insert id value', function () { + $this->pdo->setLastInsertId(value: 123); + + expect($this->pdo->lastInsertId())->toBe('123'); +})->group('LibsqlPDOTest', 'UnitTest'); diff --git a/tests/Unit/Database/LibsqlSchemaBuilderTest.php b/tests/Unit/Database/LibsqlSchemaBuilderTest.php new file mode 100644 index 0000000..d50a2ad --- /dev/null +++ b/tests/Unit/Database/LibsqlSchemaBuilderTest.php @@ -0,0 +1,12 @@ +throws(FeatureNotSupportedException::class)->group('LibsqlSchemaBuilderTest', 'UnitTest'); + +test('it raises exception on dropping database.', function () { + Schema::dropDatabaseIfExists('test'); +})->throws(FeatureNotSupportedException::class)->group('LibsqlSchemaBuilderTest', 'UnitTest'); diff --git a/tests/database/.gitkeep b/tests/database/.gitkeep new file mode 100644 index 0000000..e69de29