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