diff --git a/.env b/.env index 46b026c..8373562 100644 --- a/.env +++ b/.env @@ -14,3 +14,9 @@ DATABASE_URL=sqlite:///%kernel.project_dir%/var/test.db3 ###> symfony/mailer ### MAILER_DSN=null://null ###< symfony/mailer ### + +###> lexik/jwt-authentication-bundle ### +JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem +JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem +JWT_PASSPHRASE=b406fa29adfd637669a87d0d0e0032139731110641fcf3ac692c3fde392a9566 +###< lexik/jwt-authentication-bundle ### diff --git a/.github/workflows/symfony.yml b/.github/workflows/symfony.yml index a07adbe..47f2c56 100644 --- a/.github/workflows/symfony.yml +++ b/.github/workflows/symfony.yml @@ -55,5 +55,8 @@ jobs: - name: Load Doctrine fixtures run: php bin/console doctrine:fixtures:load --quiet + - name: Generate JWT keypair + run: php bin/console lexik:jwt:generate-keypair + - name: Run functional tests run: vendor/bin/codecept run Functional diff --git a/.gitignore b/.gitignore index fab85ac..8bcd6f2 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,7 @@ yarn-error.log /phpunit.xml .phpunit.result.cache ###< phpunit/phpunit ### + +###> lexik/jwt-authentication-bundle ### +/config/jwt/*.pem +###< lexik/jwt-authentication-bundle ### diff --git a/README.md b/README.md index 204288d..7fd8abc 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,13 @@ Lastly, if you just want to see the module in action and run the tests yourself ```shell composer update ``` -3. Update database schema and load Doctrine fixtures +3. Update database schema, load Doctrine fixtures and generate JWT keypair ```shell php bin/console doctrine:schema:update --force php bin/console doctrine:fixtures:load --quiet + + php bin/console lexik:jwt:generate-keypair ``` Then, go to the project directory and run: diff --git a/composer.json b/composer.json index f05ac49..8ab1bc1 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,9 @@ "php": ">=8.1.0", "ext-ctype": "*", "ext-iconv": "*", + "api-platform/symfony": "^4.0", "doctrine/doctrine-bundle": "^2.11", + "lexik/jwt-authentication-bundle": "^3.1", "symfony/apache-pack": "^1.0", "symfony/console": "6.4.*", "symfony/dotenv": "6.4.*", @@ -34,6 +36,7 @@ "codeception/module-asserts": "^3.0", "codeception/module-doctrine": "^3.1", "codeception/module-phpbrowser": "^3.0", + "codeception/module-rest": "^3.4", "codeception/module-symfony": "^3.2 | *@dev", "doctrine/doctrine-fixtures-bundle": "^3.5", "friendsofphp/php-cs-fixer": "^3.46", @@ -61,7 +64,7 @@ }, "sort-packages": true, "platform": { - "php": "8.1.0" + "php": "8.2.0" } }, "autoload": { @@ -102,7 +105,8 @@ ], "post-create-project-cmd": [ "@php bin/console doctrine:schema:update --force", - "@php bin/console doctrine:fixtures:load --quiet" + "@php bin/console doctrine:fixtures:load --quiet", + "@php bin/console lexik:jwt:generate-keypair" ] }, "conflict": { diff --git a/composer.lock b/composer.lock index 87e40cf..0540b64 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,943 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a7a01d196e9e501adf36a70920c8f29c", + "content-hash": "d15f2ae912e786fa82641bbf1559f4db", "packages": [ + { + "name": "api-platform/documentation", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/documentation.git", + "reference": "20334b3b29dca992e3520685f33f75f7fcba8da6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/documentation/zipball/20334b3b29dca992e3520685f33f75f7fcba8da6", + "reference": "20334b3b29dca992e3520685f33f75f7fcba8da6", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.2" + }, + "type": "project", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Documentation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform documentation controller.", + "support": { + "source": "https://github.com/api-platform/documentation/tree/v4.1.7" + }, + "time": "2025-02-28T10:08:08+00:00" + }, + { + "name": "api-platform/http-cache", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/http-cache.git", + "reference": "2eff0c4ae6320426586db4ce5dcd730f51665ea5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/http-cache/zipball/2eff0c4ae6320426586db4ce5dcd730f51665ea5", + "reference": "2eff0c4ae6320426586db4ce5dcd730f51665ea5", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1", + "api-platform/state": "^4.1", + "php": ">=8.2", + "symfony/http-foundation": "^6.4 || ^7.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "^11.2", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/http-client": "^6.4 || ^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\HttpCache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/comunnity/contributors" + } + ], + "description": "API Platform HttpCache component", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "cache", + "http", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/http-cache/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/hydra", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/hydra.git", + "reference": "f05dbc5ed805859ef4335fd844493b10fd857046" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/hydra/zipball/f05dbc5ed805859ef4335fd844493b10fd857046", + "reference": "f05dbc5ed805859ef4335fd844493b10fd857046", + "shasum": "" + }, + "require": { + "api-platform/documentation": "^4.1", + "api-platform/json-schema": "^4.1", + "api-platform/jsonld": "^4.1", + "api-platform/metadata": "^4.1", + "api-platform/serializer": "^4.1", + "api-platform/state": "^4.1", + "php": ">=8.2", + "symfony/web-link": "^6.4 || ^7.1" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "phpspec/prophecy": "^1.19", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "^11.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Hydra\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Hydra support", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "jsonapi", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/hydra/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/json-schema", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/json-schema.git", + "reference": "32bf153319c1d4778f6daafe00d636508ee2c4d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/json-schema/zipball/32bf153319c1d4778f6daafe00d636508ee2c4d9", + "reference": "32bf153319c1d4778f6daafe00d636508ee2c4d9", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1", + "php": ">=8.2", + "symfony/console": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/uid": "^6.4 || ^7.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "^11.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\JsonSchema\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "Generate a JSON Schema from a PHP class", + "homepage": "https://api-platform.com", + "keywords": [ + "JSON Schema", + "api", + "json", + "openapi", + "rest", + "swagger" + ], + "support": { + "source": "https://github.com/api-platform/json-schema/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/jsonld", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/jsonld.git", + "reference": "ef2112bd65a49761efe4253bbf1ba5328e307e00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/jsonld/zipball/ef2112bd65a49761efe4253bbf1ba5328e307e00", + "reference": "ef2112bd65a49761efe4253bbf1ba5328e307e00", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1", + "api-platform/serializer": "^4.1", + "api-platform/state": "^4.1", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "files": [ + "./HydraContext.php" + ], + "psr-4": { + "ApiPlatform\\JsonLd\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API JSON-LD support", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/jsonld/tree/v4.1.7" + }, + "time": "2025-04-10T12:08:09+00:00" + }, + { + "name": "api-platform/metadata", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/metadata.git", + "reference": "8adff3619c680ff4cb69b77228ac62dd4e4e1cc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/metadata/zipball/8adff3619c680ff4cb69b77228ac62dd4e4e1cc3", + "reference": "8adff3619c680ff4cb69b77228ac62dd4e4e1cc3", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.0 || ^2.0", + "php": ">=8.2", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/string": "^6.4 || ^7.0", + "symfony/type-info": "^7.1" + }, + "require-dev": { + "api-platform/json-schema": "^4.1", + "api-platform/openapi": "^4.1", + "api-platform/state": "^4.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpstan/phpdoc-parser": "^1.29 || ^2.0", + "phpunit/phpunit": "^11.2", + "symfony/config": "^6.4 || ^7.0", + "symfony/routing": "^6.4 || ^7.0", + "symfony/var-dumper": "^6.4 || ^7.0", + "symfony/web-link": "^6.4 || ^7.1", + "symfony/yaml": "^6.4 || ^7.0" + }, + "suggest": { + "phpstan/phpdoc-parser": "For PHP documentation support.", + "symfony/config": "For XML resource configuration.", + "symfony/yaml": "For YAML resource configuration." + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Metadata\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Resource-oriented metadata attributes and factories", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "openapi", + "rest", + "swagger" + ], + "support": { + "source": "https://github.com/api-platform/metadata/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/openapi", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/openapi.git", + "reference": "32e4591d18b19401f9c0aeb0965ffb178938b978" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/openapi/zipball/32e4591d18b19401f9c0aeb0965ffb178938b978", + "reference": "32e4591d18b19401f9c0aeb0965ffb178938b978", + "shasum": "" + }, + "require": { + "api-platform/json-schema": "^4.1", + "api-platform/metadata": "^4.1", + "api-platform/state": "^4.1", + "php": ">=8.2", + "symfony/console": "^6.4 || ^7.0", + "symfony/filesystem": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "^11.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\OpenApi\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "Models to build and serialize an OpenAPI specification.", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "openapi", + "rest", + "swagger" + ], + "support": { + "source": "https://github.com/api-platform/openapi/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/serializer", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/serializer.git", + "reference": "132bca30db7f0074e93e36c48af2f13f33d91958" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/serializer/zipball/132bca30db7f0074e93e36c48af2f13f33d91958", + "reference": "132bca30db7f0074e93e36c48af2f13f33d91958", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1", + "api-platform/state": "^4.1", + "php": ">=8.2", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "api-platform/json-schema": "^4.1", + "api-platform/openapi": "^4.1", + "doctrine/collections": "^2.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "^11.2", + "symfony/mercure-bundle": "*", + "symfony/var-dumper": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0" + }, + "suggest": { + "api-platform/doctrine-odm": "To support Doctrine MongoDB ODM state options.", + "api-platform/doctrine-orm": "To support Doctrine ORM state options." + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform core Serializer", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "graphql", + "rest", + "serializer" + ], + "support": { + "source": "https://github.com/api-platform/serializer/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/state", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/state.git", + "reference": "ddae2e24bdfc83b69460662581aaa9f095523a0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/state/zipball/ddae2e24bdfc83b69460662581aaa9f095523a0d", + "reference": "ddae2e24bdfc83b69460662581aaa9f095523a0d", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1", + "php": ">=8.2", + "psr/container": "^1.0 || ^2.0", + "symfony/http-kernel": "^6.4 || ^7.0" + }, + "require-dev": { + "api-platform/serializer": "^4.1", + "api-platform/validator": "^4.1", + "phpunit/phpunit": "^11.2", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/web-link": "^6.4 || ^7.1", + "willdurand/negotiation": "^3.1" + }, + "suggest": { + "api-platform/serializer": "To use API Platform serializer.", + "api-platform/validator": "To use API Platform validation.", + "symfony/http-foundation": "To use our HTTP providers and processor.", + "symfony/web-link": "To support adding web links to the response headers.", + "willdurand/negotiation": "To use the API Platform content negoatiation provider." + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\State\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform State component ", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "openapi", + "rest", + "swagger" + ], + "support": { + "source": "https://github.com/api-platform/state/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/symfony", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/symfony.git", + "reference": "8e295045e1c036efaa7bf64213de90365139e68c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/symfony/zipball/8e295045e1c036efaa7bf64213de90365139e68c", + "reference": "8e295045e1c036efaa7bf64213de90365139e68c", + "shasum": "" + }, + "require": { + "api-platform/documentation": "^4.1", + "api-platform/http-cache": "^4.1", + "api-platform/hydra": "^4.1", + "api-platform/json-schema": "^4.1", + "api-platform/jsonld": "^4.1", + "api-platform/metadata": "^4.1", + "api-platform/openapi": "^4.1", + "api-platform/serializer": "^4.1", + "api-platform/state": "^4.1", + "api-platform/validator": "^4.1", + "php": ">=8.2", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/security-core": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0", + "willdurand/negotiation": "^3.1" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "api-platform/elasticsearch": "^4.1", + "api-platform/graphql": "^4.1", + "api-platform/parameter-validator": "^3.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "^11.2", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/mercure-bundle": "*", + "symfony/routing": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "webonyx/graphql-php": "^15.0" + }, + "suggest": { + "api-platform/doctrine-odm": "To support MongoDB. Only versions 4.0 and later are supported.", + "api-platform/doctrine-orm": "To support Doctrine ORM.", + "api-platform/elasticsearch": "To support Elasticsearch.", + "api-platform/graphql": "To support GraphQL.", + "api-platform/ramsey-uuid": "To support Ramsey's UUID identifiers.", + "ocramius/package-versions": "To display the API Platform's version in the debug bar.", + "phpstan/phpdoc-parser": "To support extracting metadata from PHPDoc.", + "psr/cache-implementation": "To use metadata caching.", + "symfony/cache": "To have metadata caching when using Symfony integration.", + "symfony/config": "To load XML configuration files.", + "symfony/expression-language": "To use authorization and mercure advanced features.", + "symfony/http-client": "To use the HTTP cache invalidation system.", + "symfony/mercure-bundle": "To support mercure integration.", + "symfony/messenger": "To support messenger integration and asynchronous Mercure updates.", + "symfony/security": "To use authorization features.", + "symfony/twig-bundle": "To use the Swagger UI integration.", + "symfony/uid": "To support Symfony UUID/ULID identifiers.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Symfony\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "Symfony API Platform integration", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "openapi", + "rest", + "swagger", + "symfony" + ], + "support": { + "source": "https://github.com/api-platform/symfony/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, + { + "name": "api-platform/validator", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/api-platform/validator.git", + "reference": "a7052710c60ca2c85a10b3e1d841f71d3e316fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/validator/zipball/a7052710c60ca2c85a10b3e1d841f71d3e316fa8", + "reference": "a7052710c60ca2c85a10b3e1d841f71d3e316fa8", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1", + "php": ">=8.2", + "symfony/web-link": "^6.4 || ^7.1" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "^11.2", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Validator\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform validator component", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "graphql", + "rest", + "validator" + ], + "support": { + "source": "https://github.com/api-platform/validator/tree/v4.1.7" + }, + "time": "2025-04-11T09:32:56+00:00" + }, { "name": "doctrine/cache", "version": "2.2.0", @@ -461,6 +1396,97 @@ ], "time": "2024-05-22T20:47:39+00:00" }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "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%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, { "name": "doctrine/lexer", "version": "3.0.1", @@ -605,126 +1631,347 @@ "email": "ocramius@gmail.com" } ], - "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://www.doctrine-project.org/projects/persistence.html", - "keywords": [ - "mapper", - "object", - "odm", - "orm", - "persistence" + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2024-10-30T19:48:12+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ergebnis/phpunit-slow-test-detector": "^2.14", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "https://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" + }, + "time": "2025-01-24T11:45:48+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "b115554301161fa21467629f1e1391c1936de517" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", + "reference": "b115554301161fa21467629f1e1391c1936de517", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "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/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2024-12-27T00:36:43+00:00" + }, + { + "name": "lcobucci/clock", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "db3713a61addfffd615b79bf0bc22f0ccc61b86b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/db3713a61addfffd615b79bf0bc22f0ccc61b86b", + "reference": "db3713a61addfffd615b79bf0bc22f0ccc61b86b", + "shasum": "" + }, + "require": { + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "infection/infection": "^0.29", + "lcobucci/coding-standard": "^11.1.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.25", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^11.3.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } ], + "description": "Yet another clock abstraction", "support": { - "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.4.0" + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.3.1" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" + "url": "https://github.com/lcobucci", + "type": "github" }, { - "url": "https://www.patreon.com/phpdoctrine", + "url": "https://www.patreon.com/lcobucci", "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", - "type": "tidelift" } ], - "time": "2024-10-30T19:48:12+00:00" + "time": "2024-09-24T20:45:14+00:00" }, { - "name": "doctrine/sql-formatter", - "version": "1.5.2", + "name": "lcobucci/jwt", + "version": "5.5.0", "source": { "type": "git", - "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" + "url": "https://github.com/lcobucci/jwt.git", + "reference": "a835af59b030d3f2967725697cf88300f579088e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/a835af59b030d3f2967725697cf88300f579088e", + "reference": "a835af59b030d3f2967725697cf88300f579088e", "shasum": "" }, "require": { - "php": "^8.1" + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/clock": "^1.0" }, "require-dev": { - "doctrine/coding-standard": "^12", - "ergebnis/phpunit-slow-test-detector": "^2.14", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" }, - "bin": [ - "bin/sql-formatter" - ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\SqlFormatter\\": "src" + "Lcobucci\\JWT\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "https://jeremydorn.com/" + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" } ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/doctrine/sql-formatter/", + "description": "A simple library to work with JSON Web Token and JSON Web Signature", "keywords": [ - "highlight", - "sql" + "JWS", + "jwt" ], "support": { - "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.5.0" }, - "time": "2025-01-24T11:45:48+00:00" + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-01-26T21:29:45+00:00" }, { - "name": "egulias/email-validator", - "version": "4.0.3", + "name": "lexik/jwt-authentication-bundle", + "version": "v3.1.1", "source": { "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "b115554301161fa21467629f1e1391c1936de517" + "url": "https://github.com/lexik/LexikJWTAuthenticationBundle.git", + "reference": "ebe0e2c6a0ae17b4702feffc89e32e3aaba6cb61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", - "reference": "b115554301161fa21467629f1e1391c1936de517", + "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/ebe0e2c6a0ae17b4702feffc89e32e3aaba6cb61", + "reference": "ebe0e2c6a0ae17b4702feffc89e32e3aaba6cb61", "shasum": "" }, "require": { - "doctrine/lexer": "^2.0 || ^3.0", - "php": ">=8.1", - "symfony/polyfill-intl-idn": "^1.26" + "ext-openssl": "*", + "lcobucci/clock": "^3.0", + "lcobucci/jwt": "^5.0", + "php": ">=8.2", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.4|^3.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/security-bundle": "^6.4|^7.0", + "symfony/translation-contracts": "^1.0|^2.0|^3.0" }, "require-dev": { - "phpunit/phpunit": "^10.2", - "vimeo/psalm": "^5.12" + "api-platform/core": "^3.0|^4.0", + "rector/rector": "^1.2", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/phpunit-bridge": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } + "gesdinet/jwt-refresh-token-bundle": "Implements a refresh token system over Json Web Tokens in Symfony", + "spomky-labs/lexik-jose-bridge": "Provides a JWT Token encoder with encryption support" }, + "type": "symfony-bundle", "autoload": { "psr-4": { - "Egulias\\EmailValidator\\": "src" - } + "Lexik\\Bundle\\JWTAuthenticationBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -732,29 +1979,61 @@ ], "authors": [ { - "name": "Eduardo Gulias Davis" + "name": "Jeremy Barthe", + "email": "j.barthe@lexik.fr", + "homepage": "https://github.com/jeremyb" + }, + { + "name": "Nicolas Cabot", + "email": "n.cabot@lexik.fr", + "homepage": "https://github.com/slashfan" + }, + { + "name": "Cedric Girard", + "email": "c.girard@lexik.fr", + "homepage": "https://github.com/cedric-g" + }, + { + "name": "Dev Lexik", + "email": "dev@lexik.fr", + "homepage": "https://github.com/lexik" + }, + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com", + "homepage": "https://github.com/chalasr" + }, + { + "name": "Lexik Community", + "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle/graphs/contributors" } ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", + "description": "This bundle provides JWT authentication for your Symfony REST API", + "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle", "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" + "Authentication", + "JWS", + "api", + "bundle", + "jwt", + "rest", + "symfony" ], "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" + "issues": "https://github.com/lexik/LexikJWTAuthenticationBundle/issues", + "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v3.1.1" }, "funding": [ { - "url": "https://github.com/egulias", + "url": "https://github.com/chalasr", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/lexik/jwt-authentication-bundle", + "type": "tidelift" } ], - "time": "2024-12-27T00:36:43+00:00" + "time": "2025-01-06T16:34:57+00:00" }, { "name": "psr/cache", @@ -956,6 +2235,62 @@ }, "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/link", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/link.git", + "reference": "84b159194ecfd7eaa472280213976e96415433f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/link/zipball/84b159194ecfd7eaa472280213976e96415433f7", + "reference": "84b159194ecfd7eaa472280213976e96415433f7", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "suggest": { + "fig/link-util": "Provides some useful PSR-13 utilities" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Link\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for HTTP links", + "homepage": "https://github.com/php-fig/link", + "keywords": [ + "http", + "http-link", + "link", + "psr", + "psr-13", + "rest" + ], + "support": { + "source": "https://github.com/php-fig/link/tree/2.0.1" + }, + "time": "2021-03-11T23:00:27+00:00" + }, { "name": "psr/log", "version": "3.0.2", @@ -3461,12 +4796,86 @@ "require": { "php": ">=7.2" }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.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" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, "type": "library", "extra": { "thanks": { @@ -3479,8 +4888,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3496,17 +4908,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -3525,22 +4936,28 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php83", + "name": "symfony/polyfill-uuid", "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { "php": ">=7.2" }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, "type": "library", "extra": { "thanks": { @@ -3553,11 +4970,8 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Symfony\\Polyfill\\Uuid\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3565,24 +4979,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill for uuid functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", - "shim" + "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -4279,6 +5693,104 @@ ], "time": "2025-01-28T19:24:43+00:00" }, + { + "name": "symfony/serializer", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "a221b2f6066af304d760cff7a26f201b4fab4aef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/a221b2f6066af304d760cff7a26f201b4fab4aef", + "reference": "a221b2f6066af304d760cff7a26f201b4fab4aef", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<5.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4.24|>=6,<6.2.11", + "symfony/uid": "<5.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.26|^6.3|^7.0", + "symfony/property-info": "^5.4.24|^6.2.11|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-24T08:42:36+00:00" + }, { "name": "symfony/service-contracts", "version": "v3.5.1", @@ -4498,11 +6010,154 @@ }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-13T10:18:43+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.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" + }, + { + "name": "symfony/type-info", + "version": "v7.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/c4824a6b658294c828e609d3d8dbb4e87f6a375d", + "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.0|^2.0" + }, + "type": "library", + "autoload": { "psr-4": { - "Symfony\\Component\\Translation\\": "" + "Symfony\\Component\\TypeInfo\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4514,18 +6169,28 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools to internationalize your application", + "description": "Extracts PHP types information.", "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.19" + "source": "https://github.com/symfony/type-info/tree/v7.2.5" }, "funding": [ { @@ -4541,41 +6206,36 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:18:43+00:00" + "time": "2025-03-24T09:03:36+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.5.1", + "name": "symfony/uid", + "version": "v6.4.13", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "url": "https://github.com/symfony/uid.git", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Contracts\\Translation\\": "" + "Symfony\\Component\\Uid\\": "" }, "exclude-from-classmap": [ - "/Test/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4583,6 +6243,10 @@ "MIT" ], "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -4592,18 +6256,15 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to translation", + "description": "Provides an object-oriented API to generate and represent UIDs", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "UID", + "ulid", + "uuid" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/uid/tree/v6.4.13" }, "funding": [ { @@ -4619,7 +6280,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/validator", @@ -4880,6 +6541,89 @@ ], "time": "2025-02-13T09:33:32+00:00" }, + { + "name": "symfony/web-link", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-link.git", + "reference": "4d188b64bb9a9c5e2e4d20c8d5fdce6bbbb32c94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-link/zipball/4d188b64bb9a9c5e2e4d20c8d5fdce6bbbb32c94", + "reference": "4d188b64bb9a9c5e2e4d20c8d5fdce6bbbb32c94", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/link": "^1.1|^2.0" + }, + "conflict": { + "symfony/http-kernel": "<5.4" + }, + "provide": { + "psr/link-implementation": "1.0|2.0" + }, + "require-dev": { + "symfony/http-kernel": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\WebLink\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages links between resources", + "homepage": "https://symfony.com", + "keywords": [ + "dns-prefetch", + "http", + "http2", + "link", + "performance", + "prefetch", + "preload", + "prerender", + "psr13", + "push" + ], + "support": { + "source": "https://github.com/symfony/web-link/tree/v6.4.13" + }, + "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:18:03+00:00" + }, { "name": "symfony/yaml", "version": "v6.4.18", @@ -4951,6 +6695,62 @@ } ], "time": "2025-01-07T09:44:41+00:00" + }, + { + "name": "willdurand/negotiation", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/willdurand/Negotiation.git", + "reference": "68e9ea0553ef6e2ee8db5c1d98829f111e623ec2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/68e9ea0553ef6e2ee8db5c1d98829f111e623ec2", + "reference": "68e9ea0553ef6e2ee8db5c1d98829f111e623ec2", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Negotiation\\": "src/Negotiation" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "will+git@drnd.me" + } + ], + "description": "Content Negotiation tools for PHP provided as a standalone library.", + "homepage": "http://williamdurand.fr/Negotiation/", + "keywords": [ + "accept", + "content", + "format", + "header", + "negotiation" + ], + "support": { + "issues": "https://github.com/willdurand/Negotiation/issues", + "source": "https://github.com/willdurand/Negotiation/tree/3.1.0" + }, + "time": "2022-01-30T20:08:53+00:00" } ], "packages-dev": [ @@ -5374,6 +7174,55 @@ }, "time": "2025-02-09T12:05:55+00:00" }, + { + "name": "codeception/lib-xml", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-xml.git", + "reference": "ba49213e60807e3612513f404a5c93aec63f4c72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-xml/zipball/ba49213e60807e3612513f404a5c93aec63f4c72", + "reference": "ba49213e60807e3612513f404a5c93aec63f4c72", + "shasum": "" + }, + "require": { + "codeception/lib-web": "^1.0.6", + "ext-dom": "*", + "php": "^8.0", + "symfony/css-selector": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/codeception": "<5.0.0-alpha3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Files used by module-rest and module-soap", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-xml/issues", + "source": "https://github.com/Codeception/lib-xml/tree/1.0.3" + }, + "time": "2024-02-06T21:00:41+00:00" + }, { "name": "codeception/module-asserts", "version": "3.0.0", @@ -5486,44 +7335,108 @@ "doctrine" ], "support": { - "issues": "https://github.com/Codeception/module-doctrine/issues", - "source": "https://github.com/Codeception/module-doctrine/tree/3.1.0" + "issues": "https://github.com/Codeception/module-doctrine/issues", + "source": "https://github.com/Codeception/module-doctrine/tree/3.1.0" + }, + "time": "2024-02-17T22:31:34+00:00" + }, + { + "name": "codeception/module-phpbrowser", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-phpbrowser.git", + "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/a972411f60cd00d00d5e5e3b35496ba4a23bcffc", + "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-innerbrowser": "*@dev", + "ext-json": "*", + "guzzlehttp/guzzle": "^7.4", + "php": "^8.0", + "symfony/browser-kit": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "codeception/codeception": "<5.0", + "codeception/lib-innerbrowser": "<3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.199", + "codeception/module-rest": "^2.0 || *@dev", + "ext-curl": "*" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing web application over HTTP", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "functional-testing", + "http" + ], + "support": { + "issues": "https://github.com/Codeception/module-phpbrowser/issues", + "source": "https://github.com/Codeception/module-phpbrowser/tree/3.0.1" }, - "time": "2024-02-17T22:31:34+00:00" + "time": "2023-12-08T19:41:28+00:00" }, { - "name": "codeception/module-phpbrowser", - "version": "3.0.1", + "name": "codeception/module-rest", + "version": "3.4.1", "source": { "type": "git", - "url": "https://github.com/Codeception/module-phpbrowser.git", - "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc" + "url": "https://github.com/Codeception/module-rest.git", + "reference": "5db3a2e62ce6948d1822709c034a22fa1b1f2309" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/a972411f60cd00d00d5e5e3b35496ba4a23bcffc", - "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc", + "url": "https://api.github.com/repos/Codeception/module-rest/zipball/5db3a2e62ce6948d1822709c034a22fa1b1f2309", + "reference": "5db3a2e62ce6948d1822709c034a22fa1b1f2309", "shasum": "" }, "require": { - "codeception/codeception": "*@dev", - "codeception/lib-innerbrowser": "*@dev", + "codeception/codeception": "^5.0.8", + "codeception/lib-xml": "^1.0", + "ext-dom": "*", "ext-json": "*", - "guzzlehttp/guzzle": "^7.4", - "php": "^8.0", - "symfony/browser-kit": "^5.4 || ^6.0 || ^7.0" - }, - "conflict": { - "codeception/codeception": "<5.0", - "codeception/lib-innerbrowser": "<3.0" + "justinrainbow/json-schema": "^5.2.9 || ^6", + "php": "^8.1", + "softcreatr/jsonpath": "^0.8 || ^0.9 || ^0.10" }, "require-dev": { - "aws/aws-sdk-php": "^3.199", - "codeception/module-rest": "^2.0 || *@dev", - "ext-curl": "*" + "codeception/lib-innerbrowser": "^3.0 | ^4.0", + "codeception/stub": "^4.0", + "codeception/util-universalframework": "^1.0", + "ext-libxml": "*", + "ext-simplexml": "*" }, "suggest": { - "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + "aws/aws-sdk-php": "For using AWS Auth" }, "type": "library", "autoload": { @@ -5536,25 +7449,21 @@ "MIT" ], "authors": [ - { - "name": "Michael Bodnarchuk" - }, { "name": "Gintautas Miselis" } ], - "description": "Codeception module for testing web application over HTTP", + "description": "REST module for Codeception", "homepage": "https://codeception.com/", "keywords": [ "codeception", - "functional-testing", - "http" + "rest" ], "support": { - "issues": "https://github.com/Codeception/module-phpbrowser/issues", - "source": "https://github.com/Codeception/module-phpbrowser/tree/3.0.1" + "issues": "https://github.com/Codeception/module-rest/issues", + "source": "https://github.com/Codeception/module-rest/tree/3.4.1" }, - "time": "2023-12-08T19:41:28+00:00" + "time": "2025-03-25T23:04:38+00:00" }, { "name": "codeception/module-symfony", @@ -5562,12 +7471,12 @@ "source": { "type": "git", "url": "https://github.com/Codeception/module-symfony.git", - "reference": "12fdf094fea572f8fd6e975c4f4b440d95684d44" + "reference": "d9084f562015e5749a66647b977be0710cdc65d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-symfony/zipball/12fdf094fea572f8fd6e975c4f4b440d95684d44", - "reference": "12fdf094fea572f8fd6e975c4f4b440d95684d44", + "url": "https://api.github.com/repos/Codeception/module-symfony/zipball/d9084f562015e5749a66647b977be0710cdc65d4", + "reference": "d9084f562015e5749a66647b977be0710cdc65d4", "shasum": "" }, "require": { @@ -5645,7 +7554,7 @@ "issues": "https://github.com/Codeception/module-symfony/issues", "source": "https://github.com/Codeception/module-symfony/tree/main" }, - "time": "2025-02-20T16:35:08+00:00" + "time": "2025-04-09T22:03:00+00:00" }, { "name": "codeception/stub", @@ -6170,97 +8079,6 @@ ], "time": "2024-12-03T17:07:51+00:00" }, - { - "name": "doctrine/inflector", - "version": "2.0.10", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" - }, - "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%2Finflector", - "type": "tidelift" - } - ], - "time": "2024-02-18T20:23:39+00:00" - }, { "name": "doctrine/instantiator", "version": "2.0.0", @@ -7019,6 +8837,154 @@ ], "time": "2024-07-18T11:15:46+00:00" }, + { + "name": "justinrainbow/json-schema", + "version": "6.4.0", + "source": { + "type": "git", + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "16b274cb469bc8165c59b76c283724a035d27f4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/16b274cb469bc8165c59b76c283724a035d27f4c", + "reference": "16b274cb469bc8165c59b76c283724a035d27f4c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "marc-mabe/php-enum": "^4.0", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.3.0", + "json-schema/json-schema-test-suite": "1.2.0", + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/jsonrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.0" + }, + "time": "2025-04-01T18:50:59+00:00" + }, + { + "name": "marc-mabe/php-enum", + "version": "v4.7.1", + "source": { + "type": "git", + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "shasum": "" + }, + "require": { + "ext-reflection": "*", + "php": "^7.1 | ^8.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" + } + }, + "autoload": { + "psr-4": { + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" + } + ], + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", + "keywords": [ + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" + ], + "support": { + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" + }, + "time": "2024-11-28T04:54:44+00:00" + }, { "name": "masterminds/html5", "version": "2.9.0", @@ -9851,6 +11817,75 @@ ], "time": "2023-02-07T11:34:05+00:00" }, + { + "name": "softcreatr/jsonpath", + "version": "0.10.0", + "source": { + "type": "git", + "url": "https://github.com/SoftCreatR/JSONPath.git", + "reference": "74f0b330a98135160db947ba7bc65216b64a0c86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SoftCreatR/JSONPath/zipball/74f0b330a98135160db947ba7bc65216b64a0c86", + "reference": "74f0b330a98135160db947ba7bc65216b64a0c86", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "8.1 - 8.4" + }, + "replace": { + "flow/jsonpath": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.58", + "phpunit/phpunit": "10 - 12", + "squizlabs/php_codesniffer": "^3.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Flow\\JSONPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Frank", + "email": "stephen@flowsa.com", + "homepage": "https://prismaticbytes.com", + "role": "Developer" + }, + { + "name": "Sascha Greuel", + "email": "hello@1-2.dev", + "homepage": "https://1-2.dev", + "role": "Developer" + } + ], + "description": "JSONPath implementation for parsing, searching and flattening arrays", + "support": { + "email": "hello@1-2.dev", + "forum": "https://github.com/SoftCreatR/JSONPath/discussions", + "issues": "https://github.com/SoftCreatR/JSONPath/issues", + "source": "https://github.com/SoftCreatR/JSONPath" + }, + "funding": [ + { + "url": "https://ecologi.com/softcreatr?r=61212ab3fc69b8eb8a2014f4", + "type": "custom" + }, + { + "url": "https://github.com/softcreatr", + "type": "github" + } + ], + "time": "2025-03-22T00:28:17+00:00" + }, { "name": "squizlabs/php_codesniffer", "version": "3.11.3", @@ -10927,7 +12962,7 @@ }, "platform-dev": {}, "platform-overrides": { - "php": "8.1.0" + "php": "8.2.0" }, "plugin-api-version": "2.6.0" } diff --git a/config/bundles.php b/config/bundles.php index 417f6fe..ad227f6 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -9,4 +9,6 @@ Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], + Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], ]; diff --git a/config/packages/api_platform.php b/config/packages/api_platform.php new file mode 100644 index 0000000..c5a6fa5 --- /dev/null +++ b/config/packages/api_platform.php @@ -0,0 +1,16 @@ +title('Hello API Platform'); + $apiPlatformConfig->version('1.0.0'); + $apiPlatformConfig->formats('jsonld', ['mime_types' => ['application/ld+json']]); + $apiPlatformConfig->formats('json', ['mime_types' => ['application/json']]); + $defaults = $apiPlatformConfig->defaults(); + $defaults->stateless(true); + $defaults->cacheHeaders(['vary' => ['Content-Type', 'Authorization', 'Origin']]); + $apiPlatformConfig->doctrine(['enabled' => false]); +}; diff --git a/config/packages/lexik_jwt_authentication.php b/config/packages/lexik_jwt_authentication.php new file mode 100644 index 0000000..e36ca02 --- /dev/null +++ b/config/packages/lexik_jwt_authentication.php @@ -0,0 +1,11 @@ +secretKey('%env(resolve:JWT_SECRET_KEY)%') + ->publicKey('%env(resolve:JWT_PUBLIC_KEY)%') + ->passPhrase('%env(JWT_PASSPHRASE)%'); +}; diff --git a/config/packages/security.php b/config/packages/security.php index cbb8691..5ff53cf 100644 --- a/config/packages/security.php +++ b/config/packages/security.php @@ -19,6 +19,18 @@ ->pattern('^/(_(profiler|wdt)|css|images|js)/') ->security(false); + $apiFirewall = $security->firewall('api'); + $apiFirewall + ->pattern('^/api') + ->stateless(true) + ->provider('app_user_provider') + ->jwt(); + $apiFirewall->jsonLogin([ + 'check_path' => '/api/login', + 'success_handler' => 'lexik_jwt_authentication.handler.authentication_success', + 'failure_handler' => 'lexik_jwt_authentication.handler.authentication_failure', + ]); + $mainFirewall = $security->firewall('main'); $mainFirewall ->lazy(true) @@ -27,7 +39,7 @@ $mainFirewall->logout(['path' => 'app_logout']); $mainFirewall->rememberMe(['secret' => '%env(APP_SECRET)%']); - $security->accessControl([ - 'path' => '^/dashboard', 'roles' => 'ROLE_USER' - ]); + $security->accessControl(['path' => '^/api/login', 'roles' => 'PUBLIC_ACCESS']); + $security->accessControl(['path' => '^/api', 'roles' => 'IS_AUTHENTICATED_FULLY']); + $security->accessControl(['path' => '^/dashboard', 'roles' => 'ROLE_USER']); }; diff --git a/config/packages/uid.php b/config/packages/uid.php new file mode 100644 index 0000000..6311e85 --- /dev/null +++ b/config/packages/uid.php @@ -0,0 +1,11 @@ +uid(); + $uid->defaultUuidVersion(7); + $uid->timeBasedUuidVersion(7); +}; diff --git a/config/routes.php b/config/routes.php index 0446a1a..3f3b055 100644 --- a/config/routes.php +++ b/config/routes.php @@ -88,4 +88,7 @@ $routes->add('send_email', '/send-email') ->controller(App\Controller\SendEmailController::class) ->methods(['GET']); + + $routes->add('api_login', '/api/login') + ->methods(['POST']); }; diff --git a/config/routes/api_platform.php b/config/routes/api_platform.php new file mode 100644 index 0000000..c67a64d --- /dev/null +++ b/config/routes/api_platform.php @@ -0,0 +1,10 @@ +import('.', 'api_platform') + ->prefix('/api'); +}; diff --git a/src/ApiResource/Book.php b/src/ApiResource/Book.php new file mode 100644 index 0000000..d9ef353 --- /dev/null +++ b/src/ApiResource/Book.php @@ -0,0 +1,13 @@ + 'fixture@fixture.test', - 'password' => uniqid(), + 'password' => uniqid(more_entropy: true), ] ); $ormConnection = $I->grabService('doctrine.orm.default_entity_manager')->getConnection(); @@ -53,4 +54,22 @@ public function runSymfonyConsoleCommandIgnoresSpecificOptions(FunctionalTester $numRecords = $I->grabNumRecords(User::class); $I->assertSame(1, $numRecords); } + + /** + * @see https://github.com/Codeception/module-symfony/pull/209 + */ + public function resetFormatsAfterRequest(FunctionalTester $I) + { + $I->amApiAuthenticated(); + $I->haveHttpHeader('Content-Type', 'application/json'); + $I->haveHttpHeader('Accept', 'application/json'); + $I->sendPost('/api/books'); + $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY); + $I->seeHttpHeader('Content-Type', 'application/problem+json; charset=utf-8'); + + $I->amApiAuthenticated(); // This would fail because of overwrite of format mimetypes + $I->sendPost('/api/books', ['name' => 'test']); + $I->seeResponseCodeIs(HttpCode::CREATED); + $I->seeHttpHeader('Content-Type', 'application/json; charset=utf-8'); + } } diff --git a/tests/Support/FunctionalTester.php b/tests/Support/FunctionalTester.php index 6015508..194b687 100644 --- a/tests/Support/FunctionalTester.php +++ b/tests/Support/FunctionalTester.php @@ -9,4 +9,16 @@ class FunctionalTester extends Actor { use _generated\FunctionalTesterActions; + + public function amApiAuthenticated(): void + { + $this->haveHttpHeader('content-type', 'application/json'); + $this->sendPost('/api/login', [ + 'username' => 'john_doe@gmail.com', + 'password' => '123456', + ]); + $token = $this->grabDataFromResponseByJsonPath('$.token')[0]; + + $this->amBearerAuthenticated($token); + } }