From 2253f5fa3b404949ebe32f07ebbf7f8aa494bd6b Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 27 Sep 2024 09:03:13 +0000 Subject: [PATCH 01/61] $ composer create-project symfony/skeleton:"7.1.*" symfony --- symfony/.env | 20 + symfony/.gitignore | 10 + symfony/bin/console | 21 + symfony/composer.json | 68 + symfony/composer.lock | 2426 ++++++++++++++++++++++++ symfony/config/bundles.php | 5 + symfony/config/packages/cache.yaml | 19 + symfony/config/packages/framework.yaml | 16 + symfony/config/packages/routing.yaml | 10 + symfony/config/preload.php | 5 + symfony/config/routes.yaml | 5 + symfony/config/routes/framework.yaml | 4 + symfony/config/services.yaml | 24 + symfony/public/index.php | 9 + symfony/src/Controller/.gitignore | 0 symfony/src/Kernel.php | 11 + symfony/symfony.lock | 58 + 17 files changed, 2711 insertions(+) create mode 100644 symfony/.env create mode 100644 symfony/.gitignore create mode 100644 symfony/bin/console create mode 100644 symfony/composer.json create mode 100644 symfony/composer.lock create mode 100644 symfony/config/bundles.php create mode 100644 symfony/config/packages/cache.yaml create mode 100644 symfony/config/packages/framework.yaml create mode 100644 symfony/config/packages/routing.yaml create mode 100644 symfony/config/preload.php create mode 100644 symfony/config/routes.yaml create mode 100644 symfony/config/routes/framework.yaml create mode 100644 symfony/config/services.yaml create mode 100644 symfony/public/index.php create mode 100644 symfony/src/Controller/.gitignore create mode 100644 symfony/src/Kernel.php create mode 100644 symfony/symfony.lock diff --git a/symfony/.env b/symfony/.env new file mode 100644 index 00000000..76f478c0 --- /dev/null +++ b/symfony/.env @@ -0,0 +1,20 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# https://symfony.com/doc/current/configuration/secrets.html +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=7b7a61b369e56568c8990c29f5b089b6 +###< symfony/framework-bundle ### diff --git a/symfony/.gitignore b/symfony/.gitignore new file mode 100644 index 00000000..a67f91e2 --- /dev/null +++ b/symfony/.gitignore @@ -0,0 +1,10 @@ + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### diff --git a/symfony/bin/console b/symfony/bin/console new file mode 100644 index 00000000..d8d530e2 --- /dev/null +++ b/symfony/bin/console @@ -0,0 +1,21 @@ +#!/usr/bin/env php +=8.2", + "ext-ctype": "*", + "ext-iconv": "*", + "symfony/console": "7.1.*", + "symfony/dotenv": "7.1.*", + "symfony/flex": "^2", + "symfony/framework-bundle": "7.1.*", + "symfony/runtime": "7.1.*", + "symfony/yaml": "7.1.*" + }, + "require-dev": { + }, + "config": { + "allow-plugins": { + "php-http/discovery": true, + "symfony/flex": true, + "symfony/runtime": true + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php73": "*", + "symfony/polyfill-php74": "*", + "symfony/polyfill-php80": "*", + "symfony/polyfill-php81": "*", + "symfony/polyfill-php82": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "7.1.*" + } + } +} diff --git a/symfony/composer.lock b/symfony/composer.lock new file mode 100644 index 00000000..9d812de0 --- /dev/null +++ b/symfony/composer.lock @@ -0,0 +1,2426 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "50f9c0973acafa44bb359f58b30b8e58", + "packages": [ + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "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" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "symfony/cache", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/86e5296b10e4dec8c8441056ca606aedb8a3be0a", + "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v7.1.5" + }, + "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-17T09:16:35+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "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\\Cache\\": "" + } + }, + "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 caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/config", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v7.1.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-05-31T14:57:53+00:00" + }, + { + "name": "symfony/console", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "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" + }, + "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": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.1.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "38465f925ec4e0707b090e9147c65869837d639d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/38465f925ec4e0707b090e9147c65869837d639d", + "reference": "38465f925ec4e0707b090e9147c65869837d639d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.5", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "6d966200b399fa59759286f3fc7c919f0677c449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/6d966200b399fa59759286f3fc7c919f0677c449", + "reference": "6d966200b399fa59759286f3fc7c919f0677c449", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/console": "<6.4", + "symfony/process": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "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": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v7.1.5" + }, + "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-17T09:16:35+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c", + "shasum": "" + }, + "require": { + "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": { + "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": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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 manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.1.3" + }, + "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-07-26T13:02:51+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "shasum": "" + }, + "require": { + "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": { + "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": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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 that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.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-05-31T14:57:53+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "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\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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 basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.1.5" + }, + "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-17T09:16:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "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": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.1.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-08-13T14:28:19+00:00" + }, + { + "name": "symfony/flex", + "version": "v2.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/4dc11919791f81d087a12db2ab4c7e044431ef6b", + "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.1", + "php": ">=8.0" + }, + "require-dev": { + "composer/composer": "^2.1", + "symfony/dotenv": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v2.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-27T10:22:22+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "8a792de86230c13a9de7750c0c8b23cc083183d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/8a792de86230c13a9de7750c0c8b23cc083183d4", + "reference": "8a792de86230c13a9de7750c0c8b23cc083183d4", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^7.1.5", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/filesystem": "^7.1", + "symfony/finder": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^6.4|^7.0" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<6.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", + "symfony/dom-crawler": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<6.4", + "symfony/serializer": "<6.4", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<6.4", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" + }, + "require-dev": { + "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/mailer": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/scheduler": "^6.4.4|^7.0.4", + "symfony/security-bundle": "^6.4|^7.0", + "symfony/semaphore": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "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 a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v7.1.5" + }, + "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-20T13:35:23+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "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": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", + "shasum": "" + }, + "require": { + "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.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "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.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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 a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" + }, + "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-21T06:09:21+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/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-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/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-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/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": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/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/routing", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "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", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.1.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-08-29T08:16:25+00:00" + }, + { + "name": "symfony/runtime", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/runtime.git", + "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/runtime/zipball/ea34522c447dd91a2b31cb330ee4540a56ba53f6", + "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=8.2" + }, + "conflict": { + "symfony/dotenv": "<6.4" + }, + "require-dev": { + "composer/composer": "^2.6", + "symfony/console": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Enables decoupling PHP applications from global state", + "homepage": "https://symfony.com", + "keywords": [ + "runtime" + ], + "support": { + "source": "https://github.com/symfony/runtime/tree/v7.1.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-05-31T14:55:39+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "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\\": "" + }, + "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 writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "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" + }, + "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" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "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": { + "source": "https://github.com/symfony/string/tree/v7.1.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "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.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" + }, + "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-16T10:07:02+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T08:00:31+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "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\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.1.5" + }, + "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-17T12:49:58+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.2", + "ext-ctype": "*", + "ext-iconv": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php new file mode 100644 index 00000000..49d3fb6f --- /dev/null +++ b/symfony/config/bundles.php @@ -0,0 +1,5 @@ + ['all' => true], +]; diff --git a/symfony/config/packages/cache.yaml b/symfony/config/packages/cache.yaml new file mode 100644 index 00000000..6899b720 --- /dev/null +++ b/symfony/config/packages/cache.yaml @@ -0,0 +1,19 @@ +framework: + cache: + # Unique name of your app: used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The "app" cache stores to the filesystem by default. + # The data in this cache should persist between deploys. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu + + # Namespaced pools use the above "app" backend by default + #pools: + #my.dedicated.cache: null diff --git a/symfony/config/packages/framework.yaml b/symfony/config/packages/framework.yaml new file mode 100644 index 00000000..877eb25d --- /dev/null +++ b/symfony/config/packages/framework.yaml @@ -0,0 +1,16 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html +framework: + secret: '%env(APP_SECRET)%' + #csrf_protection: true + + # Note that the session will be started ONLY if you read or write from it. + session: true + + #esi: true + #fragments: true + +when@test: + framework: + test: true + session: + storage_factory_id: session.storage.factory.mock_file diff --git a/symfony/config/packages/routing.yaml b/symfony/config/packages/routing.yaml new file mode 100644 index 00000000..8166181c --- /dev/null +++ b/symfony/config/packages/routing.yaml @@ -0,0 +1,10 @@ +framework: + router: + # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. + # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands + #default_uri: http://localhost + +when@prod: + framework: + router: + strict_requirements: null diff --git a/symfony/config/preload.php b/symfony/config/preload.php new file mode 100644 index 00000000..5ebcdb21 --- /dev/null +++ b/symfony/config/preload.php @@ -0,0 +1,5 @@ + Date: Fri, 27 Sep 2024 09:29:59 +0000 Subject: [PATCH 02/61] $ composer require symfony/orm-pack @ symfony --- symfony/.env | 10 + symfony/composer.json | 6 +- symfony/composer.lock | 1395 ++++++++++++++++- symfony/config/bundles.php | 2 + symfony/config/packages/doctrine.yaml | 52 + .../config/packages/doctrine_migrations.yaml | 6 + symfony/migrations/.gitignore | 0 symfony/src/Entity/.gitignore | 0 symfony/src/Repository/.gitignore | 0 symfony/symfony.lock | 27 + 10 files changed, 1495 insertions(+), 3 deletions(-) create mode 100644 symfony/config/packages/doctrine.yaml create mode 100644 symfony/config/packages/doctrine_migrations.yaml create mode 100644 symfony/migrations/.gitignore create mode 100644 symfony/src/Entity/.gitignore create mode 100644 symfony/src/Repository/.gitignore diff --git a/symfony/.env b/symfony/.env index 76f478c0..e6f0083a 100644 --- a/symfony/.env +++ b/symfony/.env @@ -18,3 +18,13 @@ APP_ENV=dev APP_SECRET=7b7a61b369e56568c8990c29f5b089b6 ###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml +# +# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" +# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8.0.32&charset=utf8mb4" +# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4" +DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8" +###< doctrine/doctrine-bundle ### diff --git a/symfony/composer.json b/symfony/composer.json index 82072074..9537b6b3 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -7,6 +7,10 @@ "php": ">=8.2", "ext-ctype": "*", "ext-iconv": "*", + "doctrine/dbal": "^3", + "doctrine/doctrine-bundle": "^2.13", + "doctrine/doctrine-migrations-bundle": "^3.3", + "doctrine/orm": "^3.2", "symfony/console": "7.1.*", "symfony/dotenv": "7.1.*", "symfony/flex": "^2", @@ -14,8 +18,6 @@ "symfony/runtime": "7.1.*", "symfony/yaml": "7.1.*" }, - "require-dev": { - }, "config": { "allow-plugins": { "php-http/discovery": true, diff --git a/symfony/composer.lock b/symfony/composer.lock index 9d812de0..45719daa 100644 --- a/symfony/composer.lock +++ b/symfony/composer.lock @@ -4,8 +4,1231 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "50f9c0973acafa44bb359f58b30b8e58", + "content-hash": "8e081fa127d424938b2b42ad624b760b", "packages": [ + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "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 Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.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%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "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 Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.2.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2024-04-18T06:56:21+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.9.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.12.0", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.20", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "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" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.9.1" + }, + "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%2Fdbal", + "type": "tidelift" + } + ], + "time": "2024-09-01T13:49:23+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "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.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.13.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/persistence": "^2.2 || ^3", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.4 || ^8.0", + "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/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" + }, + "conflict": { + "doctrine/annotations": ">=3.0", + "doctrine/orm": "<2.17 || >=4.0", + "twig/twig": "<1.34 || >=2.0 <2.4" + }, + "require-dev": { + "doctrine/annotations": "^1 || ^2", + "doctrine/coding-standard": "^12", + "doctrine/deprecations": "^1.0", + "doctrine/orm": "^2.17 || ^3.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^5", + "psr/log": "^1.1.4 || ^2.0 || ^3.0", + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^5.15" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.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%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2024-09-01T09:46:40+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^2.4", + "doctrine/migrations": "^3.2", + "php": "^7.2|^8.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "composer/semver": "^3.0", + "doctrine/coding-standard": "^12", + "doctrine/orm": "^2.6 || ^3", + "doctrine/persistence": "^2.0 || ^3 ", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.5|^9.5", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^3 || ^5", + "symfony/phpunit-bridge": "^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6 || ^7", + "vimeo/psalm": "^4.30 || ^5.15" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" + }, + "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%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2024-05-14T20:32:18+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "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" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + }, + "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%2Fevent-manager", + "type": "tidelift" + } + ], + "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/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "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": "Johannes Schmitt", + "email": "schmittjoh@gmail.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/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "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": "doctrine/migrations", + "version": "3.8.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/7760fbd0b7cb58bfb50415505a7bab821adf0877", + "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/dbal": "^3.6 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2.0", + "php": "^8.1", + "psr/log": "^1.1.3 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.2 || ^7.0" + }, + "conflict": { + "doctrine/orm": "<2.12 || >=4" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "doctrine/orm": "^2.13 || ^3", + "doctrine/persistence": "^2 || ^3", + "doctrine/sql-formatter": "^1.0", + "ext-pdo_sqlite": "*", + "fig/log-test": "^1", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.4", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^10.3", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/3.8.1" + }, + "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%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2024-08-28T13:17:28+00:00" + }, + { + "name": "doctrine/orm", + "version": "3.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "831a1eb7d260925528cdbb49cc1866c0357cf147" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/831a1eb7d260925528cdbb49cc1866c0357cf147", + "reference": "831a1eb7d260925528cdbb49cc1866c0357cf147", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1", + "ext-ctype": "*", + "php": "^8.1", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.3.9 || ^7.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "1.11.1", + "phpunit/phpunit": "^10.4.0", + "psr/log": "^1 || ^2 || ^3", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^5.4 || ^6.2 || ^7.0", + "vimeo/psalm": "5.24.0" + }, + "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "src" + } + }, + "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": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/3.2.2" + }, + "time": "2024-08-23T10:03:52+00:00" + }, + { + "name": "doctrine/persistence", + "version": "3.3.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "b337726451f5d530df338fc7f68dee8781b49779" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", + "reference": "b337726451f5d530df338fc7f68dee8781b49779", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.11.1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.24.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "src/Persistence" + } + }, + "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" + }, + { + "name": "Marco Pivetta", + "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" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.3.3" + }, + "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-06-20T10:14:30+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "7f83911cc5eba870de7ebb11283972483f7e2891" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/7f83911cc5eba870de7ebb11283972483f7e2891", + "reference": "7f83911cc5eba870de7ebb11283972483f7e2891", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "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.4.1" + }, + "time": "2024-08-05T20:32:22+00:00" + }, { "name": "psr/cache", "version": "3.0.0", @@ -696,6 +1919,114 @@ ], "time": "2024-04-18T09:32:20+00:00" }, + { + "name": "symfony/doctrine-bridge", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "2568d0adaa5b0018b07beaa90363b880a43cc957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/2568d0adaa5b0018b07beaa90363b880a43cc957", + "reference": "2568d0adaa5b0018b07beaa90363b880a43cc957", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^2", + "doctrine/persistence": "^3.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.15", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/form": "<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", + "symfony/messenger": "<6.4", + "symfony/property-info": "<6.4", + "symfony/security-bundle": "<6.4", + "symfony/security-core": "<6.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^3.6|^4", + "doctrine/orm": "^2.15|^3", + "psr/log": "^1|^2|^3", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/doctrine-messenger": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4.6|^7.0.6", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "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 integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.5" + }, + "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-08T12:32:26+00:00" + }, { "name": "symfony/dotenv", "version": "v7.1.5", @@ -2092,6 +3423,68 @@ ], "time": "2024-04-18T09:32:20+00:00" }, + { + "name": "symfony/stopwatch", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.1.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-05-31T14:57:53+00:00" + }, { "name": "symfony/string", "version": "v7.1.5", diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php index 49d3fb6f..c1fa06a6 100644 --- a/symfony/config/bundles.php +++ b/symfony/config/bundles.php @@ -2,4 +2,6 @@ return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], ]; diff --git a/symfony/config/packages/doctrine.yaml b/symfony/config/packages/doctrine.yaml new file mode 100644 index 00000000..718692d7 --- /dev/null +++ b/symfony/config/packages/doctrine.yaml @@ -0,0 +1,52 @@ +doctrine: + dbal: + url: '%env(resolve:DATABASE_URL)%' + + # IMPORTANT: You MUST configure your server version, + # either here or in the DATABASE_URL env var (see .env file) + #server_version: '16' + + profiling_collect_backtrace: '%kernel.debug%' + use_savepoints: true + orm: + auto_generate_proxy_classes: true + enable_lazy_ghost_objects: true + report_fields_where_declared: true + validate_xml_mapping: true + naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + auto_mapping: true + mappings: + App: + type: attribute + is_bundle: false + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App + controller_resolver: + auto_mapping: false + +when@test: + doctrine: + dbal: + # "TEST_TOKEN" is typically set by ParaTest + dbname_suffix: '_test%env(default::TEST_TOKEN)%' + +when@prod: + doctrine: + orm: + auto_generate_proxy_classes: false + proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies' + query_cache_driver: + type: pool + pool: doctrine.system_cache_pool + result_cache_driver: + type: pool + pool: doctrine.result_cache_pool + + framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/symfony/config/packages/doctrine_migrations.yaml b/symfony/config/packages/doctrine_migrations.yaml new file mode 100644 index 00000000..29231d94 --- /dev/null +++ b/symfony/config/packages/doctrine_migrations.yaml @@ -0,0 +1,6 @@ +doctrine_migrations: + migrations_paths: + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + 'DoctrineMigrations': '%kernel.project_dir%/migrations' + enable_profiler: false diff --git a/symfony/migrations/.gitignore b/symfony/migrations/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/symfony/src/Entity/.gitignore b/symfony/src/Entity/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/symfony/src/Repository/.gitignore b/symfony/src/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/symfony/symfony.lock b/symfony/symfony.lock index daf5c9cd..6b87afe5 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -1,4 +1,31 @@ { + "doctrine/doctrine-bundle": { + "version": "2.13", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "2.12", + "ref": "7266981c201efbbe02ae53c87f8bb378e3f825ae" + }, + "files": [ + "./config/packages/doctrine.yaml", + "./src/Entity/.gitignore", + "./src/Repository/.gitignore" + ] + }, + "doctrine/doctrine-migrations-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.1", + "ref": "1d01ec03c6ecbd67c3375c5478c9a423ae5d6a33" + }, + "files": [ + "./config/packages/doctrine_migrations.yaml", + "./migrations/.gitignore" + ] + }, "symfony/console": { "version": "7.1", "recipe": { From 362cbf1289bb7922e524fe3bd9e5a5de2fd21f3c Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 27 Sep 2024 09:34:21 +0000 Subject: [PATCH 03/61] $ composer require --dev symfony/test-pack @ symfony --- symfony/.env.test | 6 + symfony/.gitignore | 10 + symfony/bin/phpunit | 23 + symfony/composer.json | 6 + symfony/composer.lock | 2025 ++++++++++++++++++++++++++++++++++- symfony/phpunit.xml.dist | 38 + symfony/symfony.lock | 29 + symfony/tests/bootstrap.php | 13 + 8 files changed, 2148 insertions(+), 2 deletions(-) create mode 100644 symfony/.env.test create mode 100644 symfony/bin/phpunit create mode 100644 symfony/phpunit.xml.dist create mode 100644 symfony/tests/bootstrap.php diff --git a/symfony/.env.test b/symfony/.env.test new file mode 100644 index 00000000..9e7162f0 --- /dev/null +++ b/symfony/.env.test @@ -0,0 +1,6 @@ +# define your env variables for the test env here +KERNEL_CLASS='App\Kernel' +APP_SECRET='$ecretf0rt3st' +SYMFONY_DEPRECATIONS_HELPER=999999 +PANTHER_APP_ENV=panther +PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots diff --git a/symfony/.gitignore b/symfony/.gitignore index a67f91e2..b5664bad 100644 --- a/symfony/.gitignore +++ b/symfony/.gitignore @@ -8,3 +8,13 @@ /var/ /vendor/ ###< symfony/framework-bundle ### + +###> symfony/phpunit-bridge ### +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### + +###> phpunit/phpunit ### +/phpunit.xml +.phpunit.result.cache +###< phpunit/phpunit ### diff --git a/symfony/bin/phpunit b/symfony/bin/phpunit new file mode 100644 index 00000000..692baccb --- /dev/null +++ b/symfony/bin/phpunit @@ -0,0 +1,23 @@ +#!/usr/bin/env php += 80000) { + require dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit'; + } else { + define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__).'/vendor/autoload.php'); + require PHPUNIT_COMPOSER_INSTALL; + PHPUnit\TextUI\Command::main(); + } +} else { + if (!is_file(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { + echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n"; + exit(1); + } + + require dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; +} diff --git a/symfony/composer.json b/symfony/composer.json index 9537b6b3..7b9a91b9 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -66,5 +66,11 @@ "allow-contrib": false, "require": "7.1.*" } + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "symfony/browser-kit": "7.1.*", + "symfony/css-selector": "7.1.*", + "symfony/phpunit-bridge": "^7.1" } } diff --git a/symfony/composer.lock b/symfony/composer.lock index 45719daa..371af348 100644 --- a/symfony/composer.lock +++ b/symfony/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": "8e081fa127d424938b2b42ad624b760b", + "content-hash": "534f11cc1ead4321696e6ad9b856d1cd", "packages": [ { "name": "doctrine/cache", @@ -3803,7 +3803,2028 @@ "time": "2024-09-17T12:49:58+00:00" } ], - "packages-dev": [], + "packages-dev": [ + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "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.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", + "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", + "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.2.0" + }, + "time": "2024-09-15T16:40:33+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": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "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": "9.2.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/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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": "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", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.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": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.21", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-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/9.6.21" + }, + "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-09-19T10:50:18+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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": "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", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-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": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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": "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", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.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": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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": "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", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.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" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-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", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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 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", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "9c13742e3175b5815e272b981876ae329bec2040" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/9c13742e3175b5815e272b981876ae329bec2040", + "reference": "9c13742e3175b5815e272b981876ae329bec2040", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/dom-crawler": "^6.4|^7.0" + }, + "require-dev": { + "symfony/css-selector": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "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": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v7.1.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-05-31T14:57:53+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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": { + "source": "https://github.com/symfony/css-selector/tree/v7.1.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-05-31T14:57:53+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "b92af238457a7cdd2738f941cd525d76313e8283" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b92af238457a7cdd2738f941cd525d76313e8283", + "reference": "b92af238457a7cdd2738f941cd525d76313e8283", + "shasum": "" + }, + "require": { + "masterminds/html5": "^2.6", + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/css-selector": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v7.1.5" + }, + "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-15T06:48:17+00:00" + }, + { + "name": "symfony/phpunit-bridge", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/bin/" + ] + }, + "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": "Provides utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.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-08-13T14:28:19+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], diff --git a/symfony/phpunit.xml.dist b/symfony/phpunit.xml.dist new file mode 100644 index 00000000..c76a655a --- /dev/null +++ b/symfony/phpunit.xml.dist @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + tests + + + + + + src + + + + + + + + + + diff --git a/symfony/symfony.lock b/symfony/symfony.lock index 6b87afe5..03677e95 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -26,6 +26,20 @@ "./migrations/.gitignore" ] }, + "phpunit/phpunit": { + "version": "9.6", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "9.6", + "ref": "7364a21d87e658eb363c5020c072ecfdc12e2326" + }, + "files": [ + "./.env.test", + "./phpunit.xml.dist", + "./tests/bootstrap.php" + ] + }, "symfony/console": { "version": "7.1", "recipe": { @@ -69,6 +83,21 @@ "./src/Kernel.php" ] }, + "symfony/phpunit-bridge": { + "version": "7.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.3", + "ref": "a411a0480041243d97382cac7984f7dce7813c08" + }, + "files": [ + "./.env.test", + "./bin/phpunit", + "./phpunit.xml.dist", + "./tests/bootstrap.php" + ] + }, "symfony/routing": { "version": "7.1", "recipe": { diff --git a/symfony/tests/bootstrap.php b/symfony/tests/bootstrap.php new file mode 100644 index 00000000..47a58557 --- /dev/null +++ b/symfony/tests/bootstrap.php @@ -0,0 +1,13 @@ +bootEnv(dirname(__DIR__).'/.env'); +} + +if ($_SERVER['APP_DEBUG']) { + umask(0000); +} From 31b568a5d1340beb7a20c9675fbeb1128b0cfac3 Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 27 Sep 2024 09:37:37 +0000 Subject: [PATCH 04/61] $ composer require symfony/asset @ symfony --- symfony/composer.json | 1 + symfony/composer.lock | 71 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/symfony/composer.json b/symfony/composer.json index 7b9a91b9..31b7db05 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -11,6 +11,7 @@ "doctrine/doctrine-bundle": "^2.13", "doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/orm": "^3.2", + "symfony/asset": "7.1.*", "symfony/console": "7.1.*", "symfony/dotenv": "7.1.*", "symfony/flex": "^2", diff --git a/symfony/composer.lock b/symfony/composer.lock index 371af348..57495014 100644 --- a/symfony/composer.lock +++ b/symfony/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": "534f11cc1ead4321696e6ad9b856d1cd", + "content-hash": "e98920895a48f19f2ffbb1beb9288d72", "packages": [ { "name": "doctrine/cache", @@ -1431,6 +1431,75 @@ }, "time": "2024-09-11T13:17:53+00:00" }, + { + "name": "symfony/asset", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/8970de4a0cedd34e097c0f5c502a614780b9ca43", + "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "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": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v7.1.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-05-31T14:57:53+00:00" + }, { "name": "symfony/cache", "version": "v7.1.5", From 02d690272acb8a44c5b11e54961d92e92a688204 Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 27 Sep 2024 09:38:59 +0000 Subject: [PATCH 05/61] $ composer require --dev symfony/profiler-pack @ symfony --- symfony/composer.json | 4 +- symfony/composer.lock | 433 +++++++++++++++++++++- symfony/config/bundles.php | 2 + symfony/config/packages/twig.yaml | 6 + symfony/config/packages/web_profiler.yaml | 17 + symfony/config/routes/web_profiler.yaml | 8 + symfony/symfony.lock | 26 ++ symfony/templates/base.html.twig | 16 + 8 files changed, 510 insertions(+), 2 deletions(-) create mode 100644 symfony/config/packages/twig.yaml create mode 100644 symfony/config/packages/web_profiler.yaml create mode 100644 symfony/config/routes/web_profiler.yaml create mode 100644 symfony/templates/base.html.twig diff --git a/symfony/composer.json b/symfony/composer.json index 31b7db05..17dbefe0 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -72,6 +72,8 @@ "phpunit/phpunit": "^9.5", "symfony/browser-kit": "7.1.*", "symfony/css-selector": "7.1.*", - "symfony/phpunit-bridge": "^7.1" + "symfony/phpunit-bridge": "^7.1", + "symfony/stopwatch": "7.1.*", + "symfony/web-profiler-bundle": "7.1.*" } } diff --git a/symfony/composer.lock b/symfony/composer.lock index 57495014..f669174a 100644 --- a/symfony/composer.lock +++ b/symfony/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": "e98920895a48f19f2ffbb1beb9288d72", + "content-hash": "56b25c99cc42bfa135d770913ec233ea", "packages": [ { "name": "doctrine/cache", @@ -5843,6 +5843,358 @@ ], "time": "2024-08-13T14:28:19+00:00" }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "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\\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.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e997e5025b53c0f7b17632802daefdd6a04540ae", + "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/translation-contracts": "^2.5|^3", + "twig/twig": "^3.9" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<6.4", + "symfony/form": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/mime": "<6.4", + "symfony/serializer": "<6.4", + "symfony/translation": "<6.4", + "symfony/workflow": "<6.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/emoji": "^7.1", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "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 integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v7.1.5" + }, + "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-15T06:48:17+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", + "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "php": ">=8.2", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "conflict": { + "symfony/framework-bundle": "<6.4", + "symfony/translation": "<6.4" + }, + "require-dev": { + "symfony/asset": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "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 a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v7.1.5" + }, + "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-08T12:32:26+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3cfc775277a8f2dacdd0f72d196bc87b272a763f", + "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/config": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "twig/twig": "^3.10" + }, + "conflict": { + "symfony/form": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4" + }, + "require-dev": { + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "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 a development tool that gives detailed information about the execution of any request", + "homepage": "https://symfony.com", + "keywords": [ + "dev" + ], + "support": { + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.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-08-12T09:59:40+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.3", @@ -5892,6 +6244,85 @@ } ], "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "twig/twig", + "version": "v3.14.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.14.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-09-09T17:55:12+00:00" } ], "aliases": [], diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php index c1fa06a6..62c8b3ea 100644 --- a/symfony/config/bundles.php +++ b/symfony/config/bundles.php @@ -4,4 +4,6 @@ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/symfony/config/packages/twig.yaml b/symfony/config/packages/twig.yaml new file mode 100644 index 00000000..3f795d92 --- /dev/null +++ b/symfony/config/packages/twig.yaml @@ -0,0 +1,6 @@ +twig: + file_name_pattern: '*.twig' + +when@test: + twig: + strict_variables: true diff --git a/symfony/config/packages/web_profiler.yaml b/symfony/config/packages/web_profiler.yaml new file mode 100644 index 00000000..b9461110 --- /dev/null +++ b/symfony/config/packages/web_profiler.yaml @@ -0,0 +1,17 @@ +when@dev: + web_profiler: + toolbar: true + intercept_redirects: false + + framework: + profiler: + only_exceptions: false + collect_serializer_data: true + +when@test: + web_profiler: + toolbar: false + intercept_redirects: false + + framework: + profiler: { collect: false } diff --git a/symfony/config/routes/web_profiler.yaml b/symfony/config/routes/web_profiler.yaml new file mode 100644 index 00000000..8d85319f --- /dev/null +++ b/symfony/config/routes/web_profiler.yaml @@ -0,0 +1,8 @@ +when@dev: + web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + + web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/symfony/symfony.lock b/symfony/symfony.lock index 03677e95..6edb3758 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -110,5 +110,31 @@ "./config/packages/routing.yaml", "./config/routes.yaml" ] + }, + "symfony/twig-bundle": { + "version": "7.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.4", + "ref": "cab5fd2a13a45c266d45a7d9337e28dee6272877" + }, + "files": [ + "./config/packages/twig.yaml", + "./templates/base.html.twig" + ] + }, + "symfony/web-profiler-bundle": { + "version": "7.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.1", + "ref": "e42b3f0177df239add25373083a564e5ead4e13a" + }, + "files": [ + "./config/packages/web_profiler.yaml", + "./config/routes/web_profiler.yaml" + ] } } diff --git a/symfony/templates/base.html.twig b/symfony/templates/base.html.twig new file mode 100644 index 00000000..1069c147 --- /dev/null +++ b/symfony/templates/base.html.twig @@ -0,0 +1,16 @@ + + + + + {% block title %}Welcome!{% endblock %} + + {% block stylesheets %} + {% endblock %} + + {% block javascripts %} + {% endblock %} + + + {% block body %}{% endblock %} + + From 46c22885c322c67b1e08150ea7ac18b2f2c0bf6a Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 27 Sep 2024 09:42:16 +0000 Subject: [PATCH 06/61] $ composer require --dev symfony/debug-bundle @ symfony --- symfony/composer.json | 1 + symfony/composer.lock | 76 +++++++++++++++++++++++++++++- symfony/config/bundles.php | 1 + symfony/config/packages/debug.yaml | 5 ++ symfony/symfony.lock | 12 +++++ 5 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 symfony/config/packages/debug.yaml diff --git a/symfony/composer.json b/symfony/composer.json index 17dbefe0..2f3c4f60 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -72,6 +72,7 @@ "phpunit/phpunit": "^9.5", "symfony/browser-kit": "7.1.*", "symfony/css-selector": "7.1.*", + "symfony/debug-bundle": "7.1.*", "symfony/phpunit-bridge": "^7.1", "symfony/stopwatch": "7.1.*", "symfony/web-profiler-bundle": "7.1.*" diff --git a/symfony/composer.lock b/symfony/composer.lock index f669174a..a45ba050 100644 --- a/symfony/composer.lock +++ b/symfony/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": "56b25c99cc42bfa135d770913ec233ea", + "content-hash": "d3e8f2512c4c585b30f72327d29c8d2a", "packages": [ { "name": "doctrine/cache", @@ -5694,6 +5694,80 @@ ], "time": "2024-05-31T14:57:53+00:00" }, + { + "name": "symfony/debug-bundle", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug-bundle.git", + "reference": "aa024d28ce7ce0c6a16ee57c066838bece92893f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/aa024d28ce7ce0c6a16ee57c066838bece92893f", + "reference": "aa024d28ce7ce0c6a16ee57c066838bece92893f", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=8.2", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4" + }, + "require-dev": { + "symfony/config": "^6.4|^7.0", + "symfony/web-profiler-bundle": "^6.4|^7.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\DebugBundle\\": "" + }, + "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 a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug-bundle/tree/v7.1.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-05-31T14:55:39+00:00" + }, { "name": "symfony/dom-crawler", "version": "v7.1.5", diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php index 62c8b3ea..95598f9d 100644 --- a/symfony/config/bundles.php +++ b/symfony/config/bundles.php @@ -6,4 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], ]; diff --git a/symfony/config/packages/debug.yaml b/symfony/config/packages/debug.yaml new file mode 100644 index 00000000..ad874afd --- /dev/null +++ b/symfony/config/packages/debug.yaml @@ -0,0 +1,5 @@ +when@dev: + debug: + # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. + # See the "server:dump" command to start a new server. + dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" diff --git a/symfony/symfony.lock b/symfony/symfony.lock index 6edb3758..f267615c 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -52,6 +52,18 @@ "./bin/console" ] }, + "symfony/debug-bundle": { + "version": "7.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "5.3", + "ref": "5aa8aa48234c8eb6dbdd7b3cd5d791485d2cec4b" + }, + "files": [ + "./config/packages/debug.yaml" + ] + }, "symfony/flex": { "version": "2.4", "recipe": { From dae03d1d207631fdffb09c11bd3c9b5769e6bed8 Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 27 Sep 2024 09:43:25 +0000 Subject: [PATCH 07/61] $ composer require --dev symfony/maker-bundle @ symfony --- symfony/composer.json | 1 + symfony/composer.lock | 155 ++++++++++++++++++++++++++++++++++++- symfony/config/bundles.php | 1 + symfony/symfony.lock | 9 +++ 4 files changed, 165 insertions(+), 1 deletion(-) diff --git a/symfony/composer.json b/symfony/composer.json index 2f3c4f60..e9c9e5b8 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -73,6 +73,7 @@ "symfony/browser-kit": "7.1.*", "symfony/css-selector": "7.1.*", "symfony/debug-bundle": "7.1.*", + "symfony/maker-bundle": "^1.61", "symfony/phpunit-bridge": "^7.1", "symfony/stopwatch": "7.1.*", "symfony/web-profiler-bundle": "7.1.*" diff --git a/symfony/composer.lock b/symfony/composer.lock index a45ba050..2e93022c 100644 --- a/symfony/composer.lock +++ b/symfony/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": "d3e8f2512c4c585b30f72327d29c8d2a", + "content-hash": "f53d449ed6a41d01b6d9fcf3e7d20141", "packages": [ { "name": "doctrine/cache", @@ -5835,6 +5835,98 @@ ], "time": "2024-09-15T06:48:17+00:00" }, + { + "name": "symfony/maker-bundle", + "version": "v1.61.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "nikic/php-parser": "^4.18|^5.0", + "php": ">=8.1", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.2|^3", + "symfony/filesystem": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" + }, + "conflict": { + "doctrine/doctrine-bundle": "<2.10", + "doctrine/orm": "<2.15" + }, + "require-dev": { + "composer/semver": "^3.0", + "doctrine/doctrine-bundle": "^2.5.0", + "doctrine/orm": "^2.15|^3", + "symfony/http-client": "^6.4|^7.0", + "symfony/phpunit-bridge": "^6.4.1|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.0|^4.x-dev" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MakerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "keywords": [ + "code generator", + "dev", + "generator", + "scaffold", + "scaffolding" + ], + "support": { + "issues": "https://github.com/symfony/maker-bundle/issues", + "source": "https://github.com/symfony/maker-bundle/tree/v1.61.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-08-29T22:50:23+00:00" + }, { "name": "symfony/phpunit-bridge", "version": "v7.1.4", @@ -5917,6 +6009,67 @@ ], "time": "2024-08-13T14:28:19+00:00" }, + { + "name": "symfony/process", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "5c03ee6369281177f07f7c68252a280beccba847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", + "reference": "5c03ee6369281177f07f7c68252a280beccba847", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "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": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.1.5" + }, + "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-19T21:48:23+00:00" + }, { "name": "symfony/translation-contracts", "version": "v3.5.0", diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php index 95598f9d..dd27b142 100644 --- a/symfony/config/bundles.php +++ b/symfony/config/bundles.php @@ -7,4 +7,5 @@ Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], ]; diff --git a/symfony/symfony.lock b/symfony/symfony.lock index f267615c..f8f1fe47 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -95,6 +95,15 @@ "./src/Kernel.php" ] }, + "symfony/maker-bundle": { + "version": "1.61", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "1.0", + "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" + } + }, "symfony/phpunit-bridge": { "version": "7.1", "recipe": { From 97d8491d2635a7f6e9ba6a53351a896f8ab6099b Mon Sep 17 00:00:00 2001 From: n0099 Date: Sat, 28 Sep 2024 05:19:46 +0000 Subject: [PATCH 08/61] $ composer require symfony/twig-bundle # already required by symfony/web-profiler-bundle $ composer require illuminate/collections # also required by spatie/symfony-ignition-bundle $ composer require --dev spatie/symfony-ignition-bundle # to fix https://github.com/symfony/symfony/discussions/46457 as `highlight_file()` can be dangerous: https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass#filesystem-functions @ symfony --- symfony/composer.json | 23 +- symfony/composer.lock | 2160 ++++++++++++++++++---- symfony/config/bundles.php | 1 + symfony/config/packages/ignition.yaml | 2 + symfony/config/packages/translation.yaml | 7 + symfony/symfony.lock | 25 + symfony/translations/.gitignore | 0 7 files changed, 1808 insertions(+), 410 deletions(-) create mode 100644 symfony/config/packages/ignition.yaml create mode 100644 symfony/config/packages/translation.yaml create mode 100644 symfony/translations/.gitignore diff --git a/symfony/composer.json b/symfony/composer.json index e9c9e5b8..a4fc5d74 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -11,14 +11,27 @@ "doctrine/doctrine-bundle": "^2.13", "doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/orm": "^3.2", + "illuminate/collections": "^11.25", "symfony/asset": "7.1.*", "symfony/console": "7.1.*", "symfony/dotenv": "7.1.*", "symfony/flex": "^2", "symfony/framework-bundle": "7.1.*", "symfony/runtime": "7.1.*", + "symfony/twig-bundle": "7.1.*", "symfony/yaml": "7.1.*" }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "spatie/symfony-ignition-bundle": "^1.1", + "symfony/browser-kit": "7.1.*", + "symfony/css-selector": "7.1.*", + "symfony/debug-bundle": "7.1.*", + "symfony/maker-bundle": "^1.61", + "symfony/phpunit-bridge": "^7.1", + "symfony/stopwatch": "7.1.*", + "symfony/web-profiler-bundle": "7.1.*" + }, "config": { "allow-plugins": { "php-http/discovery": true, @@ -67,15 +80,5 @@ "allow-contrib": false, "require": "7.1.*" } - }, - "require-dev": { - "phpunit/phpunit": "^9.5", - "symfony/browser-kit": "7.1.*", - "symfony/css-selector": "7.1.*", - "symfony/debug-bundle": "7.1.*", - "symfony/maker-bundle": "^1.61", - "symfony/phpunit-bridge": "^7.1", - "symfony/stopwatch": "7.1.*", - "symfony/web-profiler-bundle": "7.1.*" } } diff --git a/symfony/composer.lock b/symfony/composer.lock index 2e93022c..73ec225d 100644 --- a/symfony/composer.lock +++ b/symfony/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": "f53d449ed6a41d01b6d9fcf3e7d20141", + "content-hash": "676e1217c9a4721ed88dd59868b98871", "packages": [ { "name": "doctrine/cache", @@ -1229,6 +1229,201 @@ }, "time": "2024-08-05T20:32:22+00:00" }, + { + "name": "illuminate/collections", + "version": "v11.25.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "465044f988f9a07c901388beeb15201d711387aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/465044f988f9a07c901388beeb15201d711387aa", + "reference": "465044f988f9a07c901388beeb15201d711387aa", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "php": "^8.2" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-09-25T15:08:32+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v11.25.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "362dd761b9920367bca1427a902158225e9e3a23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/362dd761b9920367bca1427a902158225e9e3a23", + "reference": "362dd761b9920367bca1427a902158225e9e3a23", + "shasum": "" + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-06-28T20:10:30+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v11.25.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/56312862af937bd6da8e6dc8bbd88188dfb478f8", + "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8", + "shasum": "" + }, + "require": { + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-09-22T15:08:08+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v11.25.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-06-28T20:10:30+00:00" + }, { "name": "psr/cache", "version": "3.0.0", @@ -1431,6 +1626,57 @@ }, "time": "2024-09-11T13:17:53+00:00" }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, { "name": "symfony/asset", "version": "v7.1.1", @@ -3642,47 +3888,38 @@ "time": "2024-09-20T08:28:38+00:00" }, { - "name": "symfony/var-dumper", - "version": "v7.1.5", + "name": "symfony/translation-contracts", + "version": "v3.5.0", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "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.0.4" + "php": ">=8.1" }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, "autoload": { - "files": [ - "Resources/functions/dump.php" - ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" + "Symfony\\Contracts\\Translation\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3699,14 +3936,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "description": "Generic abstractions related to translation", "homepage": "https://symfony.com", "keywords": [ - "debug", - "dump" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -3722,33 +3963,309 @@ "type": "tidelift" } ], - "time": "2024-09-16T10:07:02+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { - "name": "symfony/var-exporter", - "version": "v7.1.2", + "name": "symfony/twig-bridge", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e997e5025b53c0f7b17632802daefdd6a04540ae", + "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/translation-contracts": "^2.5|^3", + "twig/twig": "^3.9" }, - "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<6.4", + "symfony/form": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/mime": "<6.4", + "symfony/serializer": "<6.4", + "symfony/translation": "<6.4", + "symfony/workflow": "<6.4" }, - "type": "library", - "autoload": { - "psr-4": { + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/emoji": "^7.1", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "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 integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v7.1.5" + }, + "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-15T06:48:17+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", + "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "php": ">=8.2", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "conflict": { + "symfony/framework-bundle": "<6.4", + "symfony/translation": "<6.4" + }, + "require-dev": { + "symfony/asset": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "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 a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v7.1.5" + }, + "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-08T12:32:26+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "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.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" + }, + "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-16T10:07:02+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { "Symfony\\Component\\VarExporter\\": "" }, "exclude-from-classmap": [ @@ -3757,84 +4274,231 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T08:00:31+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "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\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.1.5" + }, + "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-17T12:49:58+00:00" + }, + { + "name": "twig/twig", + "version": "v3.14.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" + "templating" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.14.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", + "url": "https://tidelift.com/funding/github/packagist/twig/twig", "type": "tidelift" } ], - "time": "2024-06-28T08:00:31+00:00" - }, + "time": "2024-09-09T17:55:12+00:00" + } + ], + "packages-dev": [ { - "name": "symfony/yaml", - "version": "v7.1.5", + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "^1.8" + "php": "^7.4 || ^8.0" }, "conflict": { - "symfony/console": "<6.4" + "doctrine/dbal": "<3.7.0 || >=4.0.0" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3842,37 +4506,162 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" } ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.5" + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/kylekatarnls", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://opencollective.com/Carbon", + "type": "open_collective" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", "type": "tidelift" } ], - "time": "2024-09-17T12:49:58+00:00" - } - ], - "packages-dev": [ + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v11.25.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/ca9266eecf659f7e60c06758969b2ae3918ea3da", + "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-06-28T20:10:30+00:00" + }, + { + "name": "illuminate/support", + "version": "v11.25.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "ead1796b74be915705e66a695fce8d3cd4bb9034" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/ead1796b74be915705e66a695fce8d3cd4bb9034", + "reference": "ead1796b74be915705e66a695fce8d3cd4bb9034", + "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.0", + "php": "^8.2", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "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.0.2).", + "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.4.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-09-25T07:16:58+00:00" + }, { "name": "masterminds/html5", "version": "2.9.0", @@ -4000,6 +4789,112 @@ ], "time": "2024-06-12T14:39:25+00:00" }, + { + "name": "nesbot/carbon", + "version": "3.8.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "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": { + "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": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "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": "2024-08-19T06:22:39+00:00" + }, { "name": "nikic/php-parser", "version": "v5.2.0", @@ -4596,7 +5491,55 @@ "type": "tidelift" } ], - "time": "2024-09-19T10:50:18+00:00" + "time": "2024-09-19T10:50:18+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" }, { "name": "sebastian/cli-parser", @@ -5362,204 +6305,562 @@ } }, "autoload": { - "classmap": [ - "src/" - ] + "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", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.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" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-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", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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 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", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.6.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-07-22T08:21:24+00:00" + }, + { + "name": "spatie/error-solutions", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/error-solutions.git", + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/ae7393122eda72eed7cc4f176d1e96ea444f2d67", + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "illuminate/broadcasting": "^10.0|^11.0", + "illuminate/cache": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "livewire/livewire": "^2.11|^3.3.5", + "openai-php/client": "^0.10.1", + "orchestra/testbench": "^7.0|8.22.3|^9.0", + "pestphp/pest": "^2.20", + "phpstan/phpstan": "^1.11", + "psr/simple-cache": "^3.0", + "psr/simple-cache-implementation": "^3.0", + "spatie/ray": "^1.28", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "legacy/ignition", + "Spatie\\ErrorSolutions\\": "src", + "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" + } }, "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": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", + "description": "This is my package error-solutions", + "homepage": "https://github.com/spatie/error-solutions", + "keywords": [ + "error-solutions", + "spatie" + ], "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "issues": "https://github.com/spatie/error-solutions/issues", + "source": "https://github.com/spatie/error-solutions/tree/1.1.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/Spatie", "type": "github" } ], - "time": "2023-02-03T06:07:39+00:00" + "time": "2024-07-25T11:06:04+00:00" }, { - "name": "sebastian/resource-operations", - "version": "3.0.4", + "name": "spatie/flare-client-php", + "version": "1.8.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", "shasum": "" }, "require": { - "php": ">=7.3" + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", + "php": "^8.0", + "spatie/backtrace": "^1.6.1", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/pest-plugin-snapshots": "^1.0|^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "1.3.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.8.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/spatie", "type": "github" } ], - "time": "2024-03-14T16:00:52+00:00" + "time": "2024-08-01T08:27:26+00:00" }, { - "name": "sebastian/type", - "version": "3.2.1", + "name": "spatie/ignition", + "version": "1.15.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "url": "https://github.com/spatie/ignition.git", + "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/spatie/ignition/zipball/e3a68e137371e1eb9edc7f78ffa733f3b98991d2", + "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2", "shasum": "" }, "require": { - "php": ">=7.3" + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/error-solutions": "^1.0", + "spatie/flare-client-php": "^1.7", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "illuminate/cache": "^9.52|^10.0|^11.0", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "1.5.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spatie\\Ignition\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/spatie", "type": "github" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2024-06-12T14:55:22+00:00" }, { - "name": "sebastian/version", - "version": "3.0.2", + "name": "spatie/symfony-ignition-bundle", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "url": "https://github.com/spatie/symfony-ignition-bundle.git", + "reference": "b3dd2bbb318d7642ecc6ee7e051b748d68dffb89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/spatie/symfony-ignition-bundle/zipball/b3dd2bbb318d7642ecc6ee7e051b748d68dffb89", + "reference": "b3dd2bbb318d7642ecc6ee7e051b748d68dffb89", "shasum": "" }, "require": { - "php": ">=7.3" + "php": "^8.1", + "spatie/ignition": "^1.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.3 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } + "require-dev": { + "phpunit/phpunit": "^9.5", + "symfony/dom-crawler": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0" }, + "type": "symfony-bundle", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spatie\\SymfonyIgnitionBundle\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Andrew MacRobert", + "email": "andrew.macrobert@gmail.com", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", + "description": "A beautiful error page for Symfony apps", + "homepage": "https://github.com/spatie/symfony-ignition-bundle", + "keywords": [ + "spatie", + "symfony-ignition-bundle" + ], "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "issues": "https://github.com/spatie/symfony-ignition-bundle/issues", + "source": "https://github.com/spatie/symfony-ignition-bundle/tree/1.1.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/spatie", "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2023-12-16T17:16:54+00:00" }, { "name": "symfony/browser-kit", @@ -5629,6 +6930,80 @@ ], "time": "2024-05-31T14:57:53+00:00" }, + { + "name": "symfony/clock", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.1.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-05-31T14:57:53+00:00" + }, { "name": "symfony/css-selector", "version": "v7.1.1", @@ -5928,50 +7303,48 @@ "time": "2024-08-29T22:50:23+00:00" }, { - "name": "symfony/phpunit-bridge", - "version": "v7.1.4", + "name": "symfony/mime", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c" + "url": "https://github.com/symfony/mime.git", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c", - "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c", + "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "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": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.4|^7.0", - "symfony/polyfill-php81": "^1.27" - }, - "bin": [ - "bin/simple-phpunit" - ], - "type": "symfony-bridge", - "extra": { - "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" - } + "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", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" + "Symfony\\Component\\Mime\\": "" }, "exclude-from-classmap": [ - "/Tests/", - "/bin/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5980,18 +7353,22 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.4" + "source": "https://github.com/symfony/mime/tree/v7.1.5" }, "funding": [ { @@ -6007,32 +7384,53 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:28:19+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { - "name": "symfony/process", - "version": "v7.1.5", + "name": "symfony/phpunit-bridge", + "version": "v7.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "5c03ee6369281177f07f7c68252a280beccba847" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", - "reference": "5c03ee6369281177f07f7c68252a280beccba847", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c", "shasum": "" }, - "require": { - "php": ">=8.2" + "require": { + "php": ">=7.2.5" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" + } }, - "type": "library", "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -6041,18 +7439,18 @@ ], "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": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.5" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.4" }, "funding": [ { @@ -6068,42 +7466,43 @@ "type": "tidelift" } ], - "time": "2024-09-19T21:48:23+00:00" + "time": "2024-08-13T14:28:19+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.5.0", + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6111,26 +7510,30 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to translation", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -6146,77 +7549,29 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/twig-bridge", + "name": "symfony/process", "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae" + "url": "https://github.com/symfony/process.git", + "reference": "5c03ee6369281177f07f7c68252a280beccba847" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e997e5025b53c0f7b17632802daefdd6a04540ae", - "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae", + "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", + "reference": "5c03ee6369281177f07f7c68252a280beccba847", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.9" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<6.4", - "symfony/form": "<6.4", - "symfony/http-foundation": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.4", - "symfony/serializer": "<6.4", - "symfony/translation": "<6.4", - "symfony/workflow": "<6.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3|^4", - "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^6.4|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/emoji": "^7.1", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^6.4|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" + "php": ">=8.2" }, - "type": "symfony-bridge", + "type": "library", "autoload": { "psr-4": { - "Symfony\\Bridge\\Twig\\": "" + "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -6236,10 +7591,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides integration for Twig with various Symfony components", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.1.5" + "source": "https://github.com/symfony/process/tree/v7.1.5" }, "funding": [ { @@ -6255,52 +7610,62 @@ "type": "tidelift" } ], - "time": "2024-09-15T06:48:17+00:00" + "time": "2024-09-19T21:48:23+00:00" }, { - "name": "symfony/twig-bundle", + "name": "symfony/translation", "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e" + "url": "https://github.com/symfony/translation.git", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", - "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", + "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", "shasum": "" }, "require": { - "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { - "symfony/framework-bundle": "<6.4", - "symfony/translation": "<6.4" + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "symfony/asset": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", + "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/form": "^6.4|^7.0", - "symfony/framework-bundle": "^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/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^6.4|^7.0" }, - "type": "symfony-bundle", + "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" + "Symfony\\Component\\Translation\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -6320,10 +7685,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a tight integration of Twig into the Symfony full-stack framework", + "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v7.1.5" + "source": "https://github.com/symfony/translation/tree/v7.1.5" }, "funding": [ { @@ -6339,7 +7704,7 @@ "type": "tidelift" } ], - "time": "2024-09-08T12:32:26+00:00" + "time": "2024-09-16T06:30:38+00:00" }, { "name": "symfony/web-profiler-bundle", @@ -6473,83 +7838,78 @@ "time": "2024-03-03T12:36:25+00:00" }, { - "name": "twig/twig", - "version": "v3.14.0", + "name": "voku/portable-ascii", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", - "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php81": "^1.29" + "php": ">=7.0.0" }, "require-dev": { - "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" }, "type": "library", "autoload": { - "files": [ - "src/Resources/core.php", - "src/Resources/debug.php", - "src/Resources/escaper.php", - "src/Resources/string_loader.php" - ], "psr-4": { - "Twig\\": "src/" + "voku\\": "src/voku/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" } ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", "keywords": [ - "templating" + "ascii", + "clean", + "php" ], "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.14.0" + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" }, "funding": [ { - "url": "https://github.com/fabpot", + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "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-09-09T17:55:12+00:00" + "time": "2022-03-08T17:03:00+00:00" } ], "aliases": [], diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php index dd27b142..978c7d62 100644 --- a/symfony/config/bundles.php +++ b/symfony/config/bundles.php @@ -8,4 +8,5 @@ Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Spatie\SymfonyIgnitionBundle\IgnitionBundle::class => ['dev' => true], ]; diff --git a/symfony/config/packages/ignition.yaml b/symfony/config/packages/ignition.yaml new file mode 100644 index 00000000..69ff982c --- /dev/null +++ b/symfony/config/packages/ignition.yaml @@ -0,0 +1,2 @@ +ignition: + dark_mode: false diff --git a/symfony/config/packages/translation.yaml b/symfony/config/packages/translation.yaml new file mode 100644 index 00000000..b3f8f9cf --- /dev/null +++ b/symfony/config/packages/translation.yaml @@ -0,0 +1,7 @@ +framework: + default_locale: en + translator: + default_path: '%kernel.project_dir%/translations' + fallbacks: + - en + providers: diff --git a/symfony/symfony.lock b/symfony/symfony.lock index f8f1fe47..ba0ac2c9 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -40,6 +40,18 @@ "./tests/bootstrap.php" ] }, + "spatie/symfony-ignition-bundle": { + "version": "1.1", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "0.0", + "ref": "5e504db6aa95f5d8f664f6c9e073c406fb60c85d" + }, + "files": [ + "./config/packages/ignition.yaml" + ] + }, "symfony/console": { "version": "7.1", "recipe": { @@ -132,6 +144,19 @@ "./config/routes.yaml" ] }, + "symfony/translation": { + "version": "7.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.3", + "ref": "e28e27f53663cc34f0be2837aba18e3a1bef8e7b" + }, + "files": [ + "./config/packages/translation.yaml", + "./translations/.gitignore" + ] + }, "symfony/twig-bundle": { "version": "7.1", "recipe": { diff --git a/symfony/translations/.gitignore b/symfony/translations/.gitignore new file mode 100644 index 00000000..e69de29b From 1587bf7dbf9e657279ef25a6b9745e0cbf951f85 Mon Sep 17 00:00:00 2001 From: n0099 Date: Sun, 29 Sep 2024 10:18:21 +0000 Subject: [PATCH 09/61] $ composer remove doctrine/doctrine-migrations-bundle @ symfony --- symfony/composer.json | 1 - symfony/composer.lock | 321 ++++-------------- symfony/config/bundles.php | 1 - .../config/packages/doctrine_migrations.yaml | 6 - symfony/migrations/.gitignore | 0 symfony/symfony.lock | 13 - 6 files changed, 63 insertions(+), 279 deletions(-) delete mode 100644 symfony/config/packages/doctrine_migrations.yaml delete mode 100644 symfony/migrations/.gitignore diff --git a/symfony/composer.json b/symfony/composer.json index a4fc5d74..28772ea4 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -9,7 +9,6 @@ "ext-iconv": "*", "doctrine/dbal": "^3", "doctrine/doctrine-bundle": "^2.13", - "doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/orm": "^3.2", "illuminate/collections": "^11.25", "symfony/asset": "7.1.*", diff --git a/symfony/composer.lock b/symfony/composer.lock index 73ec225d..765907d2 100644 --- a/symfony/composer.lock +++ b/symfony/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": "676e1217c9a4721ed88dd59868b98871", + "content-hash": "db4690d27be5bff81b1f95e765101c63", "packages": [ { "name": "doctrine/cache", @@ -465,98 +465,6 @@ ], "time": "2024-09-01T09:46:40+00:00" }, - { - "name": "doctrine/doctrine-migrations-bundle", - "version": "3.3.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", - "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", - "shasum": "" - }, - "require": { - "doctrine/doctrine-bundle": "^2.4", - "doctrine/migrations": "^3.2", - "php": "^7.2|^8.0", - "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "composer/semver": "^3.0", - "doctrine/coding-standard": "^12", - "doctrine/orm": "^2.6 || ^3", - "doctrine/persistence": "^2.0 || ^3 ", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^8.5|^9.5", - "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^3 || ^5", - "symfony/phpunit-bridge": "^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6 || ^7", - "vimeo/psalm": "^4.30 || ^5.15" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Doctrine Project", - "homepage": "https://www.doctrine-project.org" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DoctrineMigrationsBundle", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "dbal", - "migrations", - "schema" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" - }, - "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%2Fdoctrine-migrations-bundle", - "type": "tidelift" - } - ], - "time": "2024-05-14T20:32:18+00:00" - }, { "name": "doctrine/event-manager", "version": "2.0.1", @@ -886,109 +794,6 @@ ], "time": "2024-02-05T11:56:58+00:00" }, - { - "name": "doctrine/migrations", - "version": "3.8.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/migrations.git", - "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/7760fbd0b7cb58bfb50415505a7bab821adf0877", - "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/dbal": "^3.6 || ^4", - "doctrine/deprecations": "^0.5.3 || ^1", - "doctrine/event-manager": "^1.2 || ^2.0", - "php": "^8.1", - "psr/log": "^1.1.3 || ^2 || ^3", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^6.2 || ^7.0" - }, - "conflict": { - "doctrine/orm": "<2.12 || >=4" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "doctrine/orm": "^2.13 || ^3", - "doctrine/persistence": "^2 || ^3", - "doctrine/sql-formatter": "^1.0", - "ext-pdo_sqlite": "*", - "fig/log-test": "^1", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpstan/phpstan-strict-rules": "^1.4", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^10.3", - "symfony/cache": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" - }, - "suggest": { - "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", - "symfony/yaml": "Allows the use of yaml for migration configuration files." - }, - "bin": [ - "bin/doctrine-migrations" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Migrations\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Michael Simonson", - "email": "contact@mikesimonson.com" - } - ], - "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", - "homepage": "https://www.doctrine-project.org/projects/migrations.html", - "keywords": [ - "database", - "dbal", - "migrations" - ], - "support": { - "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.8.1" - }, - "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%2Fmigrations", - "type": "tidelift" - } - ], - "time": "2024-08-28T13:17:28+00:00" - }, { "name": "doctrine/orm", "version": "3.2.2", @@ -3738,68 +3543,6 @@ ], "time": "2024-04-18T09:32:20+00:00" }, - { - "name": "symfony/stopwatch", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "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 a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.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-05-31T14:57:53+00:00" - }, { "name": "symfony/string", "version": "v7.1.5", @@ -7612,6 +7355,68 @@ ], "time": "2024-09-19T21:48:23+00:00" }, + { + "name": "symfony/stopwatch", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.1.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-05-31T14:57:53+00:00" + }, { "name": "symfony/translation", "version": "v7.1.5", diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php index 978c7d62..9d76ab6f 100644 --- a/symfony/config/bundles.php +++ b/symfony/config/bundles.php @@ -3,7 +3,6 @@ return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], - Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], diff --git a/symfony/config/packages/doctrine_migrations.yaml b/symfony/config/packages/doctrine_migrations.yaml deleted file mode 100644 index 29231d94..00000000 --- a/symfony/config/packages/doctrine_migrations.yaml +++ /dev/null @@ -1,6 +0,0 @@ -doctrine_migrations: - migrations_paths: - # namespace is arbitrary but should be different from App\Migrations - # as migrations classes should NOT be autoloaded - 'DoctrineMigrations': '%kernel.project_dir%/migrations' - enable_profiler: false diff --git a/symfony/migrations/.gitignore b/symfony/migrations/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/symfony/symfony.lock b/symfony/symfony.lock index ba0ac2c9..3bd5123a 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -13,19 +13,6 @@ "./src/Repository/.gitignore" ] }, - "doctrine/doctrine-migrations-bundle": { - "version": "3.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "3.1", - "ref": "1d01ec03c6ecbd67c3375c5478c9a423ae5d6a33" - }, - "files": [ - "./config/packages/doctrine_migrations.yaml", - "./migrations/.gitignore" - ] - }, "phpunit/phpunit": { "version": "9.6", "recipe": { From 233752cd8b2b63adf3ab664e1ab2b4947fe18366 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 09:02:07 +0000 Subject: [PATCH 10/61] + `App\Doctrine\AlwaysQuoteStrategy` to prevent explicitly quoting every case-sensitive column name with `#[Column(name: '"name"')]`: https://stackoverflow.com/questions/10471234/auto-quote-reserved-words-with-doctrine-2 https://stackoverflow.com/questions/29871735/why-doctrine2-doesnt-automatically-quote-all-sql-identifiers https://github.com/doctrine/orm/issues/7815 + `App\Repository\Post\PostRepositoryFactory` like `App\Eloquent\Model\Post\PostFactory` in `be` + `App\Repository\Post\ThreadRepository` with interpolated table name: https://stackoverflow.com/questions/30871721/doctrine2-dynamic-table-name-for-entity/49796901#49796901 + `App\Entity\Post\Thread` like `tbm.Crawler.Db.PostThreadPost` in `c#` @ symfony --- symfony/config/packages/doctrine.yaml | 3 +- symfony/src/Doctrine/AlwaysQuoteStrategy.php | 15 ++ symfony/src/Entity/Post/Thread.php | 131 ++++++++++++++++++ .../Repository/Post/PostRepositoryFactory.php | 19 +++ .../src/Repository/Post/ThreadRepository.php | 20 +++ 5 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 symfony/src/Doctrine/AlwaysQuoteStrategy.php create mode 100644 symfony/src/Entity/Post/Thread.php create mode 100644 symfony/src/Repository/Post/PostRepositoryFactory.php create mode 100644 symfony/src/Repository/Post/ThreadRepository.php diff --git a/symfony/config/packages/doctrine.yaml b/symfony/config/packages/doctrine.yaml index 718692d7..96344f11 100644 --- a/symfony/config/packages/doctrine.yaml +++ b/symfony/config/packages/doctrine.yaml @@ -13,7 +13,8 @@ doctrine: enable_lazy_ghost_objects: true report_fields_where_declared: true validate_xml_mapping: true - naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + naming_strategy: doctrine.orm.naming_strategy.default + quote_strategy: App\Doctrine\AlwaysQuoteStrategy auto_mapping: true mappings: App: diff --git a/symfony/src/Doctrine/AlwaysQuoteStrategy.php b/symfony/src/Doctrine/AlwaysQuoteStrategy.php new file mode 100644 index 00000000..afdb3470 --- /dev/null +++ b/symfony/src/Doctrine/AlwaysQuoteStrategy.php @@ -0,0 +1,15 @@ +quoteIdentifier($class->fieldMappings[$fieldName]->columnName); + } +} diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php new file mode 100644 index 00000000..4b56795e --- /dev/null +++ b/symfony/src/Entity/Post/Thread.php @@ -0,0 +1,131 @@ +tid; + } + + public function getThreadType(): int + { + return $this->threadType; + } + + public function getStickyType(): ?string + { + return $this->stickyType; + } + + public function getTopicType(): ?string + { + return $this->topicType; + } + + public function getIsGood(): ?int + { + return $this->isGood; + } + + public function getTitle(): string + { + return $this->title; + } + + public function getAuthorUid(): int + { + return $this->authorUid; + } + + public function getPostedAt(): int + { + return $this->postedAt; + } + + public function getLatestReplyPostedAt(): int + { + return $this->latestReplyPostedAt; + } + + public function getReplyCount(): ?int + { + return $this->replyCount; + } + + public function getViewCount(): ?int + { + return $this->viewCount; + } + + public function getShareCount(): ?int + { + return $this->shareCount; + } + + public function getAgreeCount(): ?int + { + return $this->agreeCount; + } + + public function getDisagreeCount(): ?int + { + return $this->disagreeCount; + } + + public function getZan(): ?string + { + return $this->zan; + } + + public function getGeolocation(): ?string + { + return $this->geolocation; + } + + public function getAuthorPhoneType(): ?string + { + return $this->authorPhoneType; + } + + public function getCreatedAt(): int + { + return $this->createdAt; + } + + public function getUpdatedAt(): ?int + { + return $this->updatedAt; + } + + public function getLastSeenAt(): ?int + { + return $this->lastSeenAt; + } +} diff --git a/symfony/src/Repository/Post/PostRepositoryFactory.php b/symfony/src/Repository/Post/PostRepositoryFactory.php new file mode 100644 index 00000000..ea9b25a1 --- /dev/null +++ b/symfony/src/Repository/Post/PostRepositoryFactory.php @@ -0,0 +1,19 @@ +registry, $this->entityManager, $fid); + } +} diff --git a/symfony/src/Repository/Post/ThreadRepository.php b/symfony/src/Repository/Post/ThreadRepository.php new file mode 100644 index 00000000..4af5c600 --- /dev/null +++ b/symfony/src/Repository/Post/ThreadRepository.php @@ -0,0 +1,20 @@ + + */ +class ThreadRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) + { + parent::__construct($registry, Thread::class); + $entityManager->getClassMetadata(Thread::class)->setPrimaryTable(['name' => "tbmc_f{$fid}_thread"]); + } +} From eedc56309039aecd707f82a1573ce9731d236bca Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 09:51:55 +0000 Subject: [PATCH 11/61] + abstract class `Post` like `tbm.Crawler.Db.Post.IPost` in `c#` + entity class `Reply` & `SubReply` * move some common props from `Thread` to `Post` @ `Post` + abstract class `TimestampedEntity` like `tbm.Crawler.Db.TimestampedEntity` in `c#` @ `App\Entity` + `PostRepository` to share common `__construct()` for derived classes + `ReplyRepository` & `SubReplyRepository` + method `new(Sub)?Reply()` @ `PostRepositoryFactory` @ `App\Repository\Post` @ symfony --- symfony/src/Entity/Post/Post.php | 28 ++++++++ symfony/src/Entity/Post/Reply.php | 65 +++++++++++++++++++ symfony/src/Entity/Post/SubReply.php | 41 ++++++++++++ symfony/src/Entity/Post/Thread.php | 28 +------- symfony/src/Entity/TimestampedEntity.php | 21 ++++++ .../src/Repository/Post/PostRepository.php | 29 +++++++++ .../Repository/Post/PostRepositoryFactory.php | 16 ++++- .../src/Repository/Post/ReplyRepository.php | 18 +++++ .../Repository/Post/SubReplyRepository.php | 18 +++++ .../src/Repository/Post/ThreadRepository.php | 8 +-- 10 files changed, 238 insertions(+), 34 deletions(-) create mode 100644 symfony/src/Entity/Post/Post.php create mode 100644 symfony/src/Entity/Post/Reply.php create mode 100644 symfony/src/Entity/Post/SubReply.php create mode 100644 symfony/src/Entity/TimestampedEntity.php create mode 100644 symfony/src/Repository/Post/PostRepository.php create mode 100644 symfony/src/Repository/Post/ReplyRepository.php create mode 100644 symfony/src/Repository/Post/SubReplyRepository.php diff --git a/symfony/src/Entity/Post/Post.php b/symfony/src/Entity/Post/Post.php new file mode 100644 index 00000000..ac6384f3 --- /dev/null +++ b/symfony/src/Entity/Post/Post.php @@ -0,0 +1,28 @@ +tid; + } + + public function getAuthorUid(): int + { + return $this->authorUid; + } + + public function getLastSeenAt(): ?int + { + return $this->lastSeenAt; + } +} diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php new file mode 100644 index 00000000..f1f7f83a --- /dev/null +++ b/symfony/src/Entity/Post/Reply.php @@ -0,0 +1,65 @@ +pid; + } + + public function getFloor(): int + { + return $this->floor; + } + + public function getSubReplyCount(): ?int + { + return $this->subReplyCount; + } + + public function getPostedAt(): int + { + return $this->postedAt; + } + + public function getIsFold(): ?int + { + return $this->isFold; + } + + public function getAgreeCount(): ?int + { + return $this->agreeCount; + } + + public function getDisagreeCount(): ?int + { + return $this->disagreeCount; + } + + public function getGeolocation(): ?string + { + return $this->geolocation; + } + + public function getSignatureId(): ?int + { + return $this->signatureId; + } +} diff --git a/symfony/src/Entity/Post/SubReply.php b/symfony/src/Entity/Post/SubReply.php new file mode 100644 index 00000000..2d08979f --- /dev/null +++ b/symfony/src/Entity/Post/SubReply.php @@ -0,0 +1,41 @@ +pid; + } + + public function getSpid(): int + { + return $this->spid; + } + + public function getPostedAt(): int + { + return $this->postedAt; + } + + public function getAgreeCount(): ?int + { + return $this->agreeCount; + } + + public function getDisagreeCount(): ?int + { + return $this->disagreeCount; + } +} diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index 4b56795e..37fea898 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -1,4 +1,4 @@ -title; } - public function getAuthorUid(): int - { - return $this->authorUid; - } - public function getPostedAt(): int { return $this->postedAt; @@ -113,19 +104,4 @@ public function getAuthorPhoneType(): ?string { return $this->authorPhoneType; } - - public function getCreatedAt(): int - { - return $this->createdAt; - } - - public function getUpdatedAt(): ?int - { - return $this->updatedAt; - } - - public function getLastSeenAt(): ?int - { - return $this->lastSeenAt; - } } diff --git a/symfony/src/Entity/TimestampedEntity.php b/symfony/src/Entity/TimestampedEntity.php new file mode 100644 index 00000000..f93958e3 --- /dev/null +++ b/symfony/src/Entity/TimestampedEntity.php @@ -0,0 +1,21 @@ +createdAt; + } + + public function getUpdatedAt(): ?int + { + return $this->updatedAt; + } +} diff --git a/symfony/src/Repository/Post/PostRepository.php b/symfony/src/Repository/Post/PostRepository.php new file mode 100644 index 00000000..c71559d4 --- /dev/null +++ b/symfony/src/Repository/Post/PostRepository.php @@ -0,0 +1,29 @@ + + */ +abstract class PostRepository extends ServiceEntityRepository +{ + /** + * @param class-string $postClass + */ + public function __construct( + ManagerRegistry $registry, + EntityManagerInterface $entityManager, + string $postClass, + string $tableNameSuffix, + int $fid, + ) { + parent::__construct($registry, $postClass); + $entityManager->getClassMetadata($postClass)->setPrimaryTable(['name' => "tbmc_f{$fid}_{$tableNameSuffix}"]); + } +} diff --git a/symfony/src/Repository/Post/PostRepositoryFactory.php b/symfony/src/Repository/Post/PostRepositoryFactory.php index ea9b25a1..8fe67831 100644 --- a/symfony/src/Repository/Post/PostRepositoryFactory.php +++ b/symfony/src/Repository/Post/PostRepositoryFactory.php @@ -5,15 +5,25 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; -class PostRepositoryFactory +readonly class PostRepositoryFactory { public function __construct( - private readonly ManagerRegistry $registry, - private readonly EntityManagerInterface $entityManager, + private ManagerRegistry $registry, + private EntityManagerInterface $entityManager, ) {} public function newThread(int $fid): ThreadRepository { return new ThreadRepository($this->registry, $this->entityManager, $fid); } + + public function newReply(int $fid): ReplyRepository + { + return new ReplyRepository($this->registry, $this->entityManager, $fid); + } + + public function newSubReply(int $fid): SubReplyRepository + { + return new SubReplyRepository($this->registry, $this->entityManager, $fid); + } } diff --git a/symfony/src/Repository/Post/ReplyRepository.php b/symfony/src/Repository/Post/ReplyRepository.php new file mode 100644 index 00000000..bc447b38 --- /dev/null +++ b/symfony/src/Repository/Post/ReplyRepository.php @@ -0,0 +1,18 @@ + + */ +class ReplyRepository extends PostRepository +{ + public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) + { + parent::__construct($registry, $entityManager, Reply::class, 'reply', $fid); + } +} diff --git a/symfony/src/Repository/Post/SubReplyRepository.php b/symfony/src/Repository/Post/SubReplyRepository.php new file mode 100644 index 00000000..1b3387eb --- /dev/null +++ b/symfony/src/Repository/Post/SubReplyRepository.php @@ -0,0 +1,18 @@ + + */ +class SubReplyRepository extends PostRepository +{ + public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) + { + parent::__construct($registry, $entityManager, SubReply::class, 'subReply', $fid); + } +} diff --git a/symfony/src/Repository/Post/ThreadRepository.php b/symfony/src/Repository/Post/ThreadRepository.php index 4af5c600..fa5095ae 100644 --- a/symfony/src/Repository/Post/ThreadRepository.php +++ b/symfony/src/Repository/Post/ThreadRepository.php @@ -3,18 +3,16 @@ namespace App\Repository\Post; use App\Entity\Post\Thread; -use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; /** - * @extends ServiceEntityRepository + * @extends PostRepository */ -class ThreadRepository extends ServiceEntityRepository +class ThreadRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) { - parent::__construct($registry, Thread::class); - $entityManager->getClassMetadata(Thread::class)->setPrimaryTable(['name' => "tbmc_f{$fid}_thread"]); + parent::__construct($registry, $entityManager, Thread::class, 'thread', $fid); } } From 993a77a28e15d33d613fca17726bdc5401b6327a Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 10:40:36 +0000 Subject: [PATCH 12/61] + entity classes `App\Entity\Post\Content\(Post|(Sub)?Reply)Content` and their repo `App\Repository\Post\Content\(Post|(Sub)?Reply)ContentRepository` + method `new(Sub)?ReplyContent()` @ `App\Repository\Post\PostRepositoryFactory` @ symfony --- .../src/Entity/Post/Content/PostContent.php | 15 +++++++++++++++ .../src/Entity/Post/Content/ReplyContent.php | 15 +++++++++++++++ .../Entity/Post/Content/SubReplyContent.php | 15 +++++++++++++++ symfony/src/Entity/Post/Reply.php | 2 +- symfony/src/Entity/Post/SubReply.php | 2 +- symfony/src/Entity/Post/Thread.php | 2 +- .../Post/Content/ReplyContentRepository.php | 19 +++++++++++++++++++ .../Content/SubReplyContentRepository.php | 19 +++++++++++++++++++ .../Repository/Post/PostRepositoryFactory.php | 12 ++++++++++++ 9 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 symfony/src/Entity/Post/Content/PostContent.php create mode 100644 symfony/src/Entity/Post/Content/ReplyContent.php create mode 100644 symfony/src/Entity/Post/Content/SubReplyContent.php create mode 100644 symfony/src/Repository/Post/Content/ReplyContentRepository.php create mode 100644 symfony/src/Repository/Post/Content/SubReplyContentRepository.php diff --git a/symfony/src/Entity/Post/Content/PostContent.php b/symfony/src/Entity/Post/Content/PostContent.php new file mode 100644 index 00000000..00b45c66 --- /dev/null +++ b/symfony/src/Entity/Post/Content/PostContent.php @@ -0,0 +1,15 @@ +protoBufBytes; + } +} diff --git a/symfony/src/Entity/Post/Content/ReplyContent.php b/symfony/src/Entity/Post/Content/ReplyContent.php new file mode 100644 index 00000000..75795c99 --- /dev/null +++ b/symfony/src/Entity/Post/Content/ReplyContent.php @@ -0,0 +1,15 @@ +pid; + } +} diff --git a/symfony/src/Entity/Post/Content/SubReplyContent.php b/symfony/src/Entity/Post/Content/SubReplyContent.php new file mode 100644 index 00000000..b495d595 --- /dev/null +++ b/symfony/src/Entity/Post/Content/SubReplyContent.php @@ -0,0 +1,15 @@ +spid; + } +} diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php index f1f7f83a..3bd670d9 100644 --- a/symfony/src/Entity/Post/Reply.php +++ b/symfony/src/Entity/Post/Reply.php @@ -8,7 +8,7 @@ #[ORM\Entity(repositoryClass: ReplyRepository::class)] class Reply extends Post { - #[ORM\Id, ORM\Column] private int $pid; + #[ORM\Column, ORM\Id] private int $pid; #[ORM\Column] private int $floor; #[ORM\Column] private ?int $subReplyCount; #[ORM\Column] private int $postedAt; diff --git a/symfony/src/Entity/Post/SubReply.php b/symfony/src/Entity/Post/SubReply.php index 2d08979f..e35f048f 100644 --- a/symfony/src/Entity/Post/SubReply.php +++ b/symfony/src/Entity/Post/SubReply.php @@ -9,7 +9,7 @@ class SubReply extends Post { #[ORM\Column] private int $pid; - #[ORM\Id, ORM\Column] private int $spid; + #[ORM\Column, ORM\Id] private int $spid; #[ORM\Column] private int $postedAt; #[ORM\Column] private ?int $agreeCount; #[ORM\Column] private ?int $disagreeCount; diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index 37fea898..55d976cc 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -8,7 +8,7 @@ #[ORM\Entity(repositoryClass: ThreadRepository::class)] class Thread extends Post { - #[ORM\Id, ORM\Column] private int $tid; + #[ORM\Column, ORM\Id] private int $tid; #[ORM\Column] private int $threadType; #[ORM\Column] private ?string $stickyType; #[ORM\Column] private ?string $topicType; diff --git a/symfony/src/Repository/Post/Content/ReplyContentRepository.php b/symfony/src/Repository/Post/Content/ReplyContentRepository.php new file mode 100644 index 00000000..b54b5207 --- /dev/null +++ b/symfony/src/Repository/Post/Content/ReplyContentRepository.php @@ -0,0 +1,19 @@ + + */ +class ReplyContentRepository extends PostRepository +{ + public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) + { + parent::__construct($registry, $entityManager, ReplyContent::class, 'reply_content', $fid); + } +} diff --git a/symfony/src/Repository/Post/Content/SubReplyContentRepository.php b/symfony/src/Repository/Post/Content/SubReplyContentRepository.php new file mode 100644 index 00000000..2c42725c --- /dev/null +++ b/symfony/src/Repository/Post/Content/SubReplyContentRepository.php @@ -0,0 +1,19 @@ + + */ +class SubReplyContentRepository extends PostRepository +{ + public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) + { + parent::__construct($registry, $entityManager, SubReplyContent::class, 'subReply_content', $fid); + } +} diff --git a/symfony/src/Repository/Post/PostRepositoryFactory.php b/symfony/src/Repository/Post/PostRepositoryFactory.php index 8fe67831..78847d2a 100644 --- a/symfony/src/Repository/Post/PostRepositoryFactory.php +++ b/symfony/src/Repository/Post/PostRepositoryFactory.php @@ -2,6 +2,8 @@ namespace App\Repository\Post; +use App\Repository\Post\Content\ReplyContentRepository; +use App\Repository\Post\Content\SubReplyContentRepository; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; @@ -22,8 +24,18 @@ public function newReply(int $fid): ReplyRepository return new ReplyRepository($this->registry, $this->entityManager, $fid); } + public function newReplyContent(int $fid): ReplyContentRepository + { + return new ReplyContentRepository($this->registry, $this->entityManager, $fid); + } + public function newSubReply(int $fid): SubReplyRepository { return new SubReplyRepository($this->registry, $this->entityManager, $fid); } + + public function newSubReplyContent(int $fid): SubReplyContentRepository + { + return new SubReplyContentRepository($this->registry, $this->entityManager, $fid); + } } From 84fd4c5fd56bd31421507d62a212a191a2b362cc Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 10:44:44 +0000 Subject: [PATCH 13/61] * remove the value of `APP_SECRET` to fix https://dashboard.gitguardian.com/core-alerting/incident-resolution/b60bf985-1310-4e10-ace9-c32ecc1cc65f/ despite https://github.com/symfony/symfony/issues/38021 @ .env - unused `template/base.html.twig` and empty `.gitignore` files that acts like `.gitkeep` @ symfony --- symfony/.env | 2 +- symfony/src/Controller/.gitignore | 0 symfony/src/Entity/.gitignore | 0 symfony/src/Repository/.gitignore | 0 symfony/templates/base.html.twig | 16 ---------------- symfony/translations/.gitignore | 0 6 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 symfony/src/Controller/.gitignore delete mode 100644 symfony/src/Entity/.gitignore delete mode 100644 symfony/src/Repository/.gitignore delete mode 100644 symfony/templates/base.html.twig delete mode 100644 symfony/translations/.gitignore diff --git a/symfony/.env b/symfony/.env index e6f0083a..f07c5f48 100644 --- a/symfony/.env +++ b/symfony/.env @@ -16,7 +16,7 @@ ###> symfony/framework-bundle ### APP_ENV=dev -APP_SECRET=7b7a61b369e56568c8990c29f5b089b6 +APP_SECRET= ###< symfony/framework-bundle ### ###> doctrine/doctrine-bundle ### diff --git a/symfony/src/Controller/.gitignore b/symfony/src/Controller/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/symfony/src/Entity/.gitignore b/symfony/src/Entity/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/symfony/src/Repository/.gitignore b/symfony/src/Repository/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/symfony/templates/base.html.twig b/symfony/templates/base.html.twig deleted file mode 100644 index 1069c147..00000000 --- a/symfony/templates/base.html.twig +++ /dev/null @@ -1,16 +0,0 @@ - - - - - {% block title %}Welcome!{% endblock %} - - {% block stylesheets %} - {% endblock %} - - {% block javascripts %} - {% endblock %} - - - {% block body %}{% endblock %} - - diff --git a/symfony/translations/.gitignore b/symfony/translations/.gitignore deleted file mode 100644 index e69de29b..00000000 From 787d7002db6048f17f378bef3599343fa6c6d3e9 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 11:23:19 +0000 Subject: [PATCH 14/61] * inline prop `tid` into derived classes to fix https://github.com/doctrine/orm/issues/4131 @ `Post` * move common props `postedAt` & `(dis)?agreeCount` from derived classes of `Post` into it @ `Post` * mark abstract classes with attribute `MappedSuperclass` @ `App\Entity` @ symfony --- .../src/Entity/Post/Content/PostContent.php | 1 + .../src/Entity/Post/Content/ReplyContent.php | 2 ++ .../Entity/Post/Content/SubReplyContent.php | 2 ++ symfony/src/Entity/Post/Post.php | 23 ++++++++++++++---- symfony/src/Entity/Post/Reply.php | 24 +++++-------------- symfony/src/Entity/Post/SubReply.php | 24 +++++-------------- symfony/src/Entity/Post/Thread.php | 18 -------------- symfony/src/Entity/TimestampedEntity.php | 1 + 8 files changed, 36 insertions(+), 59 deletions(-) diff --git a/symfony/src/Entity/Post/Content/PostContent.php b/symfony/src/Entity/Post/Content/PostContent.php index 00b45c66..9398bb29 100644 --- a/symfony/src/Entity/Post/Content/PostContent.php +++ b/symfony/src/Entity/Post/Content/PostContent.php @@ -4,6 +4,7 @@ use Doctrine\ORM\Mapping as ORM; +#[ORM\MappedSuperclass] abstract class PostContent { #[ORM\Column] private ?string $protoBufBytes; diff --git a/symfony/src/Entity/Post/Content/ReplyContent.php b/symfony/src/Entity/Post/Content/ReplyContent.php index 75795c99..34ac5180 100644 --- a/symfony/src/Entity/Post/Content/ReplyContent.php +++ b/symfony/src/Entity/Post/Content/ReplyContent.php @@ -2,8 +2,10 @@ namespace App\Entity\Post\Content; +use App\Repository\Post\Content\ReplyContentRepository; use Doctrine\ORM\Mapping as ORM; +#[ORM\Entity(repositoryClass: ReplyContentRepository::class)] class ReplyContent extends PostContent { #[ORM\Column, ORM\Id] private int $pid; diff --git a/symfony/src/Entity/Post/Content/SubReplyContent.php b/symfony/src/Entity/Post/Content/SubReplyContent.php index b495d595..44a076bb 100644 --- a/symfony/src/Entity/Post/Content/SubReplyContent.php +++ b/symfony/src/Entity/Post/Content/SubReplyContent.php @@ -2,8 +2,10 @@ namespace App\Entity\Post\Content; +use App\Repository\Post\Content\SubReplyContentRepository; use Doctrine\ORM\Mapping as ORM; +#[ORM\Entity(repositoryClass: SubReplyContentRepository::class)] class SubReplyContent extends PostContent { #[ORM\Column, ORM\Id] private int $spid; diff --git a/symfony/src/Entity/Post/Post.php b/symfony/src/Entity/Post/Post.php index ac6384f3..1b9ccdd4 100644 --- a/symfony/src/Entity/Post/Post.php +++ b/symfony/src/Entity/Post/Post.php @@ -5,24 +5,37 @@ use App\Entity\TimestampedEntity; use Doctrine\ORM\Mapping as ORM; +#[ORM\MappedSuperclass] abstract class Post extends TimestampedEntity { - #[ORM\Column] private int $tid; #[ORM\Column] private int $authorUid; + #[ORM\Column] private int $postedAt; #[ORM\Column] private ?int $lastSeenAt; + #[ORM\Column] private ?int $agreeCount; + #[ORM\Column] private ?int $disagreeCount; - public function getTid(): int + public function getAuthorUid(): int { - return $this->tid; + return $this->authorUid; } - public function getAuthorUid(): int + public function getPostedAt(): int { - return $this->authorUid; + return $this->postedAt; } public function getLastSeenAt(): ?int { return $this->lastSeenAt; } + + public function getAgreeCount(): ?int + { + return $this->agreeCount; + } + + public function getDisagreeCount(): ?int + { + return $this->disagreeCount; + } } diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php index 3bd670d9..f3b8f178 100644 --- a/symfony/src/Entity/Post/Reply.php +++ b/symfony/src/Entity/Post/Reply.php @@ -8,16 +8,19 @@ #[ORM\Entity(repositoryClass: ReplyRepository::class)] class Reply extends Post { + #[ORM\Column] private int $tid; #[ORM\Column, ORM\Id] private int $pid; #[ORM\Column] private int $floor; #[ORM\Column] private ?int $subReplyCount; - #[ORM\Column] private int $postedAt; #[ORM\Column] private ?int $isFold; - #[ORM\Column] private ?int $agreeCount; - #[ORM\Column] private ?int $disagreeCount; #[ORM\Column] private ?string $geolocation; #[ORM\Column] private ?int $signatureId; + public function getTid(): int + { + return $this->tid; + } + public function getPid(): int { return $this->pid; @@ -33,26 +36,11 @@ public function getSubReplyCount(): ?int return $this->subReplyCount; } - public function getPostedAt(): int - { - return $this->postedAt; - } - public function getIsFold(): ?int { return $this->isFold; } - public function getAgreeCount(): ?int - { - return $this->agreeCount; - } - - public function getDisagreeCount(): ?int - { - return $this->disagreeCount; - } - public function getGeolocation(): ?string { return $this->geolocation; diff --git a/symfony/src/Entity/Post/SubReply.php b/symfony/src/Entity/Post/SubReply.php index e35f048f..0155a939 100644 --- a/symfony/src/Entity/Post/SubReply.php +++ b/symfony/src/Entity/Post/SubReply.php @@ -8,11 +8,14 @@ #[ORM\Entity(repositoryClass: SubReplyRepository::class)] class SubReply extends Post { + #[ORM\Column] private int $tid; #[ORM\Column] private int $pid; #[ORM\Column, ORM\Id] private int $spid; - #[ORM\Column] private int $postedAt; - #[ORM\Column] private ?int $agreeCount; - #[ORM\Column] private ?int $disagreeCount; + + public function getTid(): int + { + return $this->tid; + } public function getPid(): int { @@ -23,19 +26,4 @@ public function getSpid(): int { return $this->spid; } - - public function getPostedAt(): int - { - return $this->postedAt; - } - - public function getAgreeCount(): ?int - { - return $this->agreeCount; - } - - public function getDisagreeCount(): ?int - { - return $this->disagreeCount; - } } diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index 55d976cc..15283282 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -14,13 +14,10 @@ class Thread extends Post #[ORM\Column] private ?string $topicType; #[ORM\Column] private ?int $isGood; #[ORM\Column] private string $title; - #[ORM\Column] private int $postedAt; #[ORM\Column] private int $latestReplyPostedAt; #[ORM\Column] private ?int $replyCount; #[ORM\Column] private ?int $viewCount; #[ORM\Column] private ?int $shareCount; - #[ORM\Column] private ?int $agreeCount; - #[ORM\Column] private ?int $disagreeCount; #[ORM\Column] private ?string $zan; #[ORM\Column] private ?string $geolocation; #[ORM\Column] private ?string $authorPhoneType; @@ -55,11 +52,6 @@ public function getTitle(): string return $this->title; } - public function getPostedAt(): int - { - return $this->postedAt; - } - public function getLatestReplyPostedAt(): int { return $this->latestReplyPostedAt; @@ -80,16 +72,6 @@ public function getShareCount(): ?int return $this->shareCount; } - public function getAgreeCount(): ?int - { - return $this->agreeCount; - } - - public function getDisagreeCount(): ?int - { - return $this->disagreeCount; - } - public function getZan(): ?string { return $this->zan; diff --git a/symfony/src/Entity/TimestampedEntity.php b/symfony/src/Entity/TimestampedEntity.php index f93958e3..a903c31b 100644 --- a/symfony/src/Entity/TimestampedEntity.php +++ b/symfony/src/Entity/TimestampedEntity.php @@ -4,6 +4,7 @@ use Doctrine\ORM\Mapping as ORM; +#[ORM\MappedSuperclass] abstract class TimestampedEntity { #[ORM\Column] private int $createdAt; From 400757b76595f68e675e1b4d33d22156929466c1 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 12:08:03 +0000 Subject: [PATCH 15/61] $ composer require symfony/serializer-pack @ symfony --- symfony/composer.json | 5 + symfony/composer.lock | 623 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 627 insertions(+), 1 deletion(-) diff --git a/symfony/composer.json b/symfony/composer.json index 28772ea4..a315d1e8 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -11,12 +11,17 @@ "doctrine/doctrine-bundle": "^2.13", "doctrine/orm": "^3.2", "illuminate/collections": "^11.25", + "phpdocumentor/reflection-docblock": "^5.4", + "phpstan/phpdoc-parser": "^1.32", "symfony/asset": "7.1.*", "symfony/console": "7.1.*", "symfony/dotenv": "7.1.*", "symfony/flex": "^2", "symfony/framework-bundle": "7.1.*", + "symfony/property-access": "7.1.*", + "symfony/property-info": "7.1.*", "symfony/runtime": "7.1.*", + "symfony/serializer": "7.1.*", "symfony/twig-bundle": "7.1.*", "symfony/yaml": "7.1.*" }, diff --git a/symfony/composer.lock b/symfony/composer.lock index 765907d2..5cb0d72b 100644 --- a/symfony/composer.lock +++ b/symfony/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": "db4690d27be5bff81b1f95e765101c63", + "content-hash": "d376619d2c8dd0053a9b2dd0cbe0be04", "packages": [ { "name": "doctrine/cache", @@ -1229,6 +1229,228 @@ }, "time": "2024-06-28T20:10:30+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.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "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", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "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.4.1" + }, + "time": "2024-05-21T05:55:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "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.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.32.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "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/1.32.0" + }, + "time": "2024-09-26T07:23:32+00:00" + }, { "name": "psr/cache", "version": "3.0.0", @@ -3300,6 +3522,166 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/property-access", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "6c709f97103355016e5782d0622437ae381012ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/6c709f97103355016e5782d0622437ae381012ad", + "reference": "6c709f97103355016e5782d0622437ae381012ad", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" + }, + "require-dev": { + "symfony/cache": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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 functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v7.1.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-08-30T16:12:47+00:00" + }, + { + "name": "symfony/property-info", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", + "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "^7.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "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": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v7.1.3" + }, + "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-07-26T07:36:36+00:00" + }, { "name": "symfony/routing", "version": "v7.1.4", @@ -3460,6 +3842,105 @@ ], "time": "2024-05-31T14:55:39+00:00" }, + { + "name": "symfony/serializer", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/71d6e1f70f00752d1469d0f5e83b0a51716f288b", + "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/type-info": "<7.1.5", + "symfony/uid": "<6.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.1.5", + "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", + "symfony/yaml": "^6.4|^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/v7.1.5" + }, + "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-20T12:13:15+00:00" + }, { "name": "symfony/service-contracts", "version": "v3.5.0", @@ -3901,6 +4382,88 @@ ], "time": "2024-09-08T12:32:26+00:00" }, + { + "name": "symfony/type-info", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/9f6094aa900d2c06bd61576a6f279d4ac441515f", + "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-info": "<6.4" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.1.5" + }, + "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-19T21:48:23+00:00" + }, { "name": "symfony/var-dumper", "version": "v7.1.5", @@ -4209,6 +4772,64 @@ } ], "time": "2024-09-09T17:55:12+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" } ], "packages-dev": [ From b0a6b25622b5b299409594aa356507669d6cdc58 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 12:38:46 +0000 Subject: [PATCH 16/61] * mark concrete classes in `App\Repository\Post` except `PostRepositoryFactory` with `#[Symfony\Component\DependencyInjection\Attribute\Exclude]`: https://stackoverflow.com/questions/57854425/ignore-a-class-in-a-autowired-directory/79043103#79043103 @ symfony --- symfony/src/Repository/Post/Content/ReplyContentRepository.php | 2 ++ .../src/Repository/Post/Content/SubReplyContentRepository.php | 2 ++ symfony/src/Repository/Post/ReplyRepository.php | 2 ++ symfony/src/Repository/Post/SubReplyRepository.php | 2 ++ symfony/src/Repository/Post/ThreadRepository.php | 2 ++ 5 files changed, 10 insertions(+) diff --git a/symfony/src/Repository/Post/Content/ReplyContentRepository.php b/symfony/src/Repository/Post/Content/ReplyContentRepository.php index b54b5207..8aef0404 100644 --- a/symfony/src/Repository/Post/Content/ReplyContentRepository.php +++ b/symfony/src/Repository/Post/Content/ReplyContentRepository.php @@ -6,10 +6,12 @@ use App\Repository\Post\PostRepository; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\Exclude; /** * @extends PostRepository */ +#[Exclude] class ReplyContentRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) diff --git a/symfony/src/Repository/Post/Content/SubReplyContentRepository.php b/symfony/src/Repository/Post/Content/SubReplyContentRepository.php index 2c42725c..f3f4c16a 100644 --- a/symfony/src/Repository/Post/Content/SubReplyContentRepository.php +++ b/symfony/src/Repository/Post/Content/SubReplyContentRepository.php @@ -6,10 +6,12 @@ use App\Repository\Post\PostRepository; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\Exclude; /** * @extends PostRepository */ +#[Exclude] class SubReplyContentRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) diff --git a/symfony/src/Repository/Post/ReplyRepository.php b/symfony/src/Repository/Post/ReplyRepository.php index bc447b38..fc5530fd 100644 --- a/symfony/src/Repository/Post/ReplyRepository.php +++ b/symfony/src/Repository/Post/ReplyRepository.php @@ -5,10 +5,12 @@ use App\Entity\Post\Reply; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\Exclude; /** * @extends PostRepository */ +#[Exclude] class ReplyRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) diff --git a/symfony/src/Repository/Post/SubReplyRepository.php b/symfony/src/Repository/Post/SubReplyRepository.php index 1b3387eb..a3df9230 100644 --- a/symfony/src/Repository/Post/SubReplyRepository.php +++ b/symfony/src/Repository/Post/SubReplyRepository.php @@ -5,10 +5,12 @@ use App\Entity\Post\SubReply; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\Exclude; /** * @extends PostRepository */ +#[Exclude] class SubReplyRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) diff --git a/symfony/src/Repository/Post/ThreadRepository.php b/symfony/src/Repository/Post/ThreadRepository.php index fa5095ae..a9fe1fd7 100644 --- a/symfony/src/Repository/Post/ThreadRepository.php +++ b/symfony/src/Repository/Post/ThreadRepository.php @@ -5,10 +5,12 @@ use App\Entity\Post\Thread; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\Exclude; /** * @extends PostRepository */ +#[Exclude] class ThreadRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) From 75135097ed3b01dd0d3ca658aa6b9ff8e1668d11 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 14:39:40 +0000 Subject: [PATCH 17/61] * sync composer packages between `symfony` & `be` $ composer require google/{protobuf,recaptcha} spatie/{laravel-collection-macros,regex} thecodingmachine/safe $ composer require --dev friendsofphp/php-cs-fixer infection/infection laravel/pint phan/phan phpmd/phpmd phpstan/{extension-installer,phpstan-{deprecation,strict}-rules} phpunit/phpunit roave/security-advisories squizlabs/php_codesniffer thecodingmachine/phpstan-safe-rule vimeo/psalm @ symfony --- symfony/.env | 7 + symfony/.gitignore | 14 + symfony/.php-cs-fixer.dist.php | 13 + symfony/composer.json | 27 +- symfony/composer.lock | 6472 ++++++++++++++--- symfony/config/packages/google_recaptcha.yaml | 21 + symfony/config/services.yaml | 1 + symfony/phpcs.xml.dist | 19 + symfony/phpstan.dist.neon | 8 + symfony/symfony.lock | 48 + 10 files changed, 5519 insertions(+), 1111 deletions(-) create mode 100644 symfony/.php-cs-fixer.dist.php create mode 100644 symfony/config/packages/google_recaptcha.yaml create mode 100644 symfony/phpcs.xml.dist create mode 100644 symfony/phpstan.dist.neon diff --git a/symfony/.env b/symfony/.env index f07c5f48..3dcc9f90 100644 --- a/symfony/.env +++ b/symfony/.env @@ -28,3 +28,10 @@ APP_SECRET= # DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4" DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8" ###< doctrine/doctrine-bundle ### + +###> google/recaptcha ### +# To use Google Recaptcha, you must register a site on Recaptcha's admin panel: +# https://www.google.com/recaptcha/admin +GOOGLE_RECAPTCHA_SITE_KEY= +GOOGLE_RECAPTCHA_SECRET= +###< google/recaptcha ### diff --git a/symfony/.gitignore b/symfony/.gitignore index b5664bad..c7f01f7b 100644 --- a/symfony/.gitignore +++ b/symfony/.gitignore @@ -18,3 +18,17 @@ /phpunit.xml .phpunit.result.cache ###< phpunit/phpunit ### + +###> phpstan/phpstan ### +phpstan.neon +###< phpstan/phpstan ### + +###> friendsofphp/php-cs-fixer ### +/.php-cs-fixer.php +/.php-cs-fixer.cache +###< friendsofphp/php-cs-fixer ### + +###> squizlabs/php_codesniffer ### +/.phpcs-cache +/phpcs.xml +###< squizlabs/php_codesniffer ### diff --git a/symfony/.php-cs-fixer.dist.php b/symfony/.php-cs-fixer.dist.php new file mode 100644 index 00000000..3788194c --- /dev/null +++ b/symfony/.php-cs-fixer.dist.php @@ -0,0 +1,13 @@ +in(__DIR__) + ->exclude('var') +; + +return (new PhpCsFixer\Config()) + ->setRules([ + '@Symfony' => true, + ]) + ->setFinder($finder) +; diff --git a/symfony/composer.json b/symfony/composer.json index a315d1e8..60dfde38 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -10,9 +10,13 @@ "doctrine/dbal": "^3", "doctrine/doctrine-bundle": "^2.13", "doctrine/orm": "^3.2", + "google/protobuf": "^4.28.2", + "google/recaptcha": "^1.3.0", "illuminate/collections": "^11.25", "phpdocumentor/reflection-docblock": "^5.4", "phpstan/phpdoc-parser": "^1.32", + "spatie/laravel-collection-macros": "^7.14.1", + "spatie/regex": "^3.1.1", "symfony/asset": "7.1.*", "symfony/console": "7.1.*", "symfony/dotenv": "7.1.*", @@ -23,24 +27,39 @@ "symfony/runtime": "7.1.*", "symfony/serializer": "7.1.*", "symfony/twig-bundle": "7.1.*", - "symfony/yaml": "7.1.*" + "symfony/yaml": "7.1.*", + "thecodingmachine/safe": "^2.5" }, "require-dev": { - "phpunit/phpunit": "^9.5", + "friendsofphp/php-cs-fixer": "^3.64.0", + "infection/infection": "^0.27.11", + "laravel/pint": "^1.17.3", + "phan/phan": "^5.4.5", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^10.5.35", + "roave/security-advisories": "dev-latest", "spatie/symfony-ignition-bundle": "^1.1", + "squizlabs/php_codesniffer": "^3.10.3", "symfony/browser-kit": "7.1.*", "symfony/css-selector": "7.1.*", "symfony/debug-bundle": "7.1.*", "symfony/maker-bundle": "^1.61", "symfony/phpunit-bridge": "^7.1", "symfony/stopwatch": "7.1.*", - "symfony/web-profiler-bundle": "7.1.*" + "symfony/web-profiler-bundle": "7.1.*", + "thecodingmachine/phpstan-safe-rule": "^1.2", + "vimeo/psalm": "^5.26.1" }, "config": { "allow-plugins": { "php-http/discovery": true, "symfony/flex": true, - "symfony/runtime": true + "symfony/runtime": true, + "infection/extension-installer": true, + "phpstan/extension-installer": true }, "sort-packages": true }, diff --git a/symfony/composer.lock b/symfony/composer.lock index 5cb0d72b..34e856a8 100644 --- a/symfony/composer.lock +++ b/symfony/composer.lock @@ -4,8 +4,77 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d376619d2c8dd0053a9b2dd0cbe0be04", + "content-hash": "4dfce564f2913d295355f360809b15a9", "packages": [ + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, { "name": "doctrine/cache", "version": "2.2.0", @@ -1034,18 +1103,114 @@ }, "time": "2024-08-05T20:32:22+00:00" }, + { + "name": "google/protobuf", + "version": "v4.28.2", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/96021a9a8a5aa7770427b1e7ef1b2e543792684e", + "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.28.2" + }, + "time": "2024-09-18T20:56:15+00:00" + }, + { + "name": "google/recaptcha", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/google/recaptcha.git", + "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/google/recaptcha/zipball/d59a801e98a4e9174814a6d71bbc268dff1202df", + "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df", + "shasum": "" + }, + "require": { + "php": ">=8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.14", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "ReCaptcha\\": "src/ReCaptcha" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", + "homepage": "https://www.google.com/recaptcha/", + "keywords": [ + "Abuse", + "captcha", + "recaptcha", + "spam" + ], + "support": { + "forum": "https://groups.google.com/forum/#!forum/recaptcha", + "issues": "https://github.com/google/recaptcha/issues", + "source": "https://github.com/google/recaptcha" + }, + "time": "2023-02-18T17:41:46+00:00" + }, { "name": "illuminate/collections", - "version": "v11.25.0", + "version": "v11.26.0", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "465044f988f9a07c901388beeb15201d711387aa" + "reference": "4d333ea19a27230b424b9af56f34cd658b5bbce2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/465044f988f9a07c901388beeb15201d711387aa", - "reference": "465044f988f9a07c901388beeb15201d711387aa", + "url": "https://api.github.com/repos/illuminate/collections/zipball/4d333ea19a27230b424b9af56f34cd658b5bbce2", + "reference": "4d333ea19a27230b424b9af56f34cd658b5bbce2", "shasum": "" }, "require": { @@ -1087,11 +1252,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-09-25T15:08:32+00:00" + "time": "2024-09-27T14:54:48+00:00" }, { "name": "illuminate/conditionable", - "version": "v11.25.0", + "version": "v11.26.0", "source": { "type": "git", "url": "https://github.com/illuminate/conditionable.git", @@ -1137,7 +1302,7 @@ }, { "name": "illuminate/contracts", - "version": "v11.25.0", + "version": "v11.26.0", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", @@ -1185,7 +1350,7 @@ }, { "name": "illuminate/macroable", - "version": "v11.25.0", + "version": "v11.26.0", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", @@ -1230,31 +1395,61 @@ "time": "2024-06-28T20:10:30+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "name": "illuminate/support", + "version": "v11.26.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "url": "https://github.com/illuminate/support.git", + "reference": "0431fbb96752bb8a13136a53e4be345fdc8484c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/illuminate/support/zipball/0431fbb96752bb8a13136a53e4be345fdc8484c2", + "reference": "0431fbb96752bb8a13136a53e4be345fdc8484c2", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "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.0", + "php": "^8.2", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "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.0.2).", + "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.4.1)." }, "type": "library", "extra": { "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-master": "11.x-dev" } }, "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], "psr-4": { - "phpDocumentor\\Reflection\\": "src/" + "Illuminate\\Support\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1263,66 +1458,218 @@ ], "authors": [ { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "time": "2020-06-27T09:03:43+00:00" + "time": "2024-09-30T14:29:28+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.4.1", + "name": "nesbot/carbon", + "version": "3.8.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", "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", - "webmozart/assert": "^1.9.1" + "carbonphp/carbon-doctrine-types": "*", + "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": { - "mockery/mockery": "~1.3.5", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^5.13" + "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": { "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "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": "2024-08-19T06:22:39+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.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "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", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1500,6 +1847,54 @@ }, "time": "2021-02-03T23:26:27+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -1705,38 +2100,48 @@ "time": "2021-10-29T13:26:27+00:00" }, { - "name": "symfony/asset", - "version": "v7.1.1", + "name": "spatie/laravel-collection-macros", + "version": "7.14.1", "source": { "type": "git", - "url": "https://github.com/symfony/asset.git", - "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43" + "url": "https://github.com/spatie/laravel-collection-macros.git", + "reference": "17dca9472ed115e270190ce2a21874673a99280c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/8970de4a0cedd34e097c0f5c502a614780b9ca43", - "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43", + "url": "https://api.github.com/repos/spatie/laravel-collection-macros/zipball/17dca9472ed115e270190ce2a21874673a99280c", + "reference": "17dca9472ed115e270190ce2a21874673a99280c", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "conflict": { - "symfony/http-foundation": "<6.4" + "illuminate/support": "^10.0|^11.0", + "php": "^8.2" }, "require-dev": { - "symfony/http-client": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0" + "amphp/parallel": "^1.4.3|^2.2", + "amphp/parallel-functions": "^1.1.0|^2.0", + "mockery/mockery": "^1.6.2", + "orchestra/testbench": "^8.5.9|^9.0", + "pestphp/pest": "^2.0", + "phpunit/phpunit": "10.2.2|^10.5", + "spatie/laravel-ray": "^1.32.5", + "symfony/stopwatch": "^6.3|^7.0" + }, + "suggest": { + "amphp/parallel-functions": "Required when using the parallel*-macros." }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\CollectionMacros\\CollectionMacroServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Asset\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Spatie\\CollectionMacros\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1744,59 +2149,191 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://github.com/freekmurze", + "role": "Developer" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://github.com/sebastiandedeyne", + "role": "Developer" } ], - "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", - "homepage": "https://symfony.com", + "description": "A set of useful Laravel collection macros", + "homepage": "https://github.com/spatie/laravel-collection-macros", + "keywords": [ + "laravel-collection-macros", + "spatie" + ], "support": { - "source": "https://github.com/symfony/asset/tree/v7.1.1" + "source": "https://github.com/spatie/laravel-collection-macros/tree/7.14.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/spatie", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-02T13:39:03+00:00" }, { - "name": "symfony/cache", - "version": "v7.1.5", + "name": "spatie/regex", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a" + "url": "https://github.com/spatie/regex.git", + "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/86e5296b10e4dec8c8441056ca606aedb8a3be0a", - "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a", + "url": "https://api.github.com/repos/spatie/regex/zipball/d543de2019a0068e7b80da0ba24f1c51c7469303", + "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/cache": "^2.0|^3.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.4|^7.0" + "php": "^8.0|^8.1" }, - "conflict": { + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Regex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A sane interface for php's built in preg_* functions", + "homepage": "https://github.com/spatie/regex", + "keywords": [ + "expression", + "expressions", + "regex", + "regular", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/regex/issues", + "source": "https://github.com/spatie/regex/tree/3.1.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-11-30T21:13:59+00:00" + }, + { + "name": "symfony/asset", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/8970de4a0cedd34e097c0f5c502a614780b9ca43", + "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "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": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v7.1.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-05-31T14:57:53+00:00" + }, + { + "name": "symfony/cache", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/86e5296b10e4dec8c8441056ca606aedb8a3be0a", + "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { "doctrine/dbal": "<3.6", "symfony/dependency-injection": "<6.4", "symfony/http-kernel": "<6.4", @@ -1946,6 +2483,80 @@ ], "time": "2024-04-18T09:32:20+00:00" }, + { + "name": "symfony/clock", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.1.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-05-31T14:57:53+00:00" + }, { "name": "symfony/config", "version": "v7.1.1", @@ -4112,52 +4723,146 @@ "time": "2024-09-20T08:28:38+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.5.0", + "name": "symfony/translation", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "url": "https://github.com/symfony/translation.git", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "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" }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "provide": { + "symfony/translation-implementation": "2.3|3.0" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "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": { + "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/v7.1.5" + }, + "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-16T06:30:38+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "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\\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", @@ -4694,6 +5399,145 @@ ], "time": "2024-09-17T12:49:58+00:00" }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + }, { "name": "twig/twig", "version": "v3.14.0", @@ -4773,6 +5617,80 @@ ], "time": "2024-09-09T17:55:12+00:00" }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "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": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "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", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, { "name": "webmozart/assert", "version": "1.11.0", @@ -4834,34 +5752,44 @@ ], "packages-dev": [ { - "name": "carbonphp/carbon-doctrine-types", - "version": "2.1.0", + "name": "amphp/amp", + "version": "v2.6.4", "source": { "type": "git", - "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + "url": "https://github.com/amphp/amp.git", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", - "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "doctrine/dbal": "<3.7.0 || >=4.0.0" + "php": ">=7.1" }, "require-dev": { - "doctrine/dbal": "^3.7.0", - "nesbot/carbon": "^2.71.0 || ^3.0.0", - "phpunit/phpunit": "^10.3" + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "react/promise": "^2", + "vimeo/psalm": "^3.12" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], "psr-4": { - "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + "Amp\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", @@ -4870,66 +5798,81 @@ ], "authors": [ { - "name": "KyleKatarn", - "email": "kylekatarnls@gmail.com" + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Types to use Carbon in Doctrine", + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", "keywords": [ - "carbon", - "date", - "datetime", - "doctrine", - "time" + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" ], "support": { - "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.4" }, "funding": [ { - "url": "https://github.com/kylekatarnls", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", - "type": "tidelift" } ], - "time": "2023-12-11T17:09:12+00:00" + "time": "2024-03-21T18:52:26+00:00" }, { - "name": "illuminate/pipeline", - "version": "v11.25.0", + "name": "amphp/byte-stream", + "version": "v1.8.2", "source": { "type": "git", - "url": "https://github.com/illuminate/pipeline.git", - "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da" + "url": "https://github.com/amphp/byte-stream.git", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/pipeline/zipball/ca9266eecf659f7e60c06758969b2ae3918ea3da", - "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", "shasum": "" }, "require": { - "illuminate/contracts": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2" + "amphp/amp": "^2", + "php": ">=7.1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" }, + "type": "library", "autoload": { + "files": [ + "lib/functions.php" + ], "psr-4": { - "Illuminate\\Pipeline\\": "" + "Amp\\ByteStream\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", @@ -4938,74 +5881,62 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "The Illuminate Pipeline package.", - "homepage": "https://laravel.com", + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" }, - "time": "2024-06-28T20:10:30+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-13T18:00:56+00:00" }, { - "name": "illuminate/support", - "version": "v11.25.0", + "name": "clue/ndjson-react", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "ead1796b74be915705e66a695fce8d3cd4bb9034" + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/ead1796b74be915705e66a695fce8d3cd4bb9034", - "reference": "ead1796b74be915705e66a695fce8d3cd4bb9034", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", "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.0", - "php": "^8.2", - "voku/portable-ascii": "^2.0" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" + "php": ">=5.3", + "react/stream": "^1.2" }, - "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.0.2).", - "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.4.1)." + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "Clue\\React\\NDJson\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5014,48 +5945,81 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", + "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/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" }, - "time": "2024-09-25T07:16:58+00:00" + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" }, { - "name": "masterminds/html5", - "version": "2.9.0", + "name": "colinodell/json5", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + "url": "https://github.com/colinodell/json5.git", + "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "url": "https://api.github.com/repos/colinodell/json5/zipball/15b063f8cb5e6deb15f0cd39123264ec0d19c710", + "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710", "shasum": "" }, "require": { - "ext-dom": "*", - "php": ">=5.3.0" + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.1.3|^8.0" + }, + "conflict": { + "scrutinizer/ocular": "1.7.*" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + "mikehaertl/php-shellcommand": "^1.2.5", + "phpstan/phpstan": "^1.4", + "scrutinizer/ocular": "^1.6", + "squizlabs/php_codesniffer": "^2.3 || ^3.0", + "symfony/finder": "^4.4|^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0" }, + "bin": [ + "bin/json5" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-main": "3.0-dev" } }, "autoload": { + "files": [ + "src/global.php" + ], "psr-4": { - "Masterminds\\": "src" + "ColinODell\\Json5\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5064,156 +6028,153 @@ ], "authors": [ { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Developer" } ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", + "description": "UTF-8 compatible JSON5 parser for PHP", + "homepage": "https://github.com/colinodell/json5", "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" + "JSON5", + "json", + "json5_decode", + "json_decode" ], "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + "issues": "https://github.com/colinodell/json5/issues", + "source": "https://github.com/colinodell/json5/tree/v2.3.0" }, - "time": "2024-03-31T07:05:07+00:00" + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + } + ], + "time": "2022-12-27T16:44:40+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.12.0", + "name": "composer/pcre", + "version": "3.3.1", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "url": "https://github.com/composer/pcre.git", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.4 || ^8.0" }, "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" + "phpstan/phpstan": "<1.11.10" }, "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" + "phpstan/phpstan": "^1.11.10", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], "psr-4": { - "DeepCopy\\": "src/DeepCopy/" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.1" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "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-06-12T14:39:25+00:00" + "time": "2024-08-27T18:44:43+00:00" }, { - "name": "nesbot/carbon", - "version": "3.8.0", + "name": "composer/semver", + "version": "3.4.3", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", - "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { - "carbonphp/carbon-doctrine-types": "*", - "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": "^5.3.2 || ^7.0 || ^8.0" }, "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" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, - "bin": [ - "bin/carbon" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev", - "dev-2.x": "2.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5222,80 +6183,2236 @@ ], "authors": [ { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" }, { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" + "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": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "date", - "datetime", - "time" + "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": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+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": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.3", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" + }, + "time": "2024-04-30T00:40:11+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": "friendsofphp/php-cs-fixer", + "version": "v3.64.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "58dd9c931c785a79739310aef5178928305ffa67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", + "reference": "58dd9c931c785a79739310aef5178928305ffa67", + "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.0", + "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 || ^2.3", + "infection/infection": "^0.29.5", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.11", + "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.19 || ^10.5.21 || ^11.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.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.64.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-08-30T23:09:38+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v11.26.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/ca9266eecf659f7e60c06758969b2ae3918ea3da", + "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-06-28T20:10:30+00:00" + }, + { + "name": "infection/abstract-testframework-adapter", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/infection/abstract-testframework-adapter.git", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^2.17", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Infection\\AbstractTestFramework\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Abstract Test Framework Adapter for Infection", + "support": { + "issues": "https://github.com/infection/abstract-testframework-adapter/issues", + "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-08-17T18:49:12+00:00" + }, + { + "name": "infection/extension-installer", + "version": "0.1.2", + "source": { + "type": "git", + "url": "https://github.com/infection/extension-installer.git", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0" + }, + "require-dev": { + "composer/composer": "^1.9 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.18, <2.19", + "infection/infection": "^0.15.2", + "php-coveralls/php-coveralls": "^2.4", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.10", + "phpstan/phpstan-phpunit": "^0.12.6", + "phpstan/phpstan-strict-rules": "^0.12.2", + "phpstan/phpstan-webmozart-assert": "^0.12.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.8" + }, + "type": "composer-plugin", + "extra": { + "class": "Infection\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "Infection\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Infection Extension Installer", + "support": { + "issues": "https://github.com/infection/extension-installer/issues", + "source": "https://github.com/infection/extension-installer/tree/0.1.2" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-10-20T22:08:34+00:00" + }, + { + "name": "infection/include-interceptor", + "version": "0.2.5", + "source": { + "type": "git", + "url": "https://github.com/infection/include-interceptor.git", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", + "shasum": "" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "infection/infection": "^0.15.0", + "phan/phan": "^2.4 || ^3", + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "^0.12.8", + "phpunit/phpunit": "^8.5", + "vimeo/psalm": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Infection\\StreamWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", + "support": { + "issues": "https://github.com/infection/include-interceptor/issues", + "source": "https://github.com/infection/include-interceptor/tree/0.2.5" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-08-09T10:03:57+00:00" + }, + { + "name": "infection/infection", + "version": "0.27.11", + "source": { + "type": "git", + "url": "https://github.com/infection/infection.git", + "reference": "6d55979c457eef2a5d0d80446c67ca533f201961" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/infection/zipball/6d55979c457eef2a5d0d80446c67ca533f201961", + "reference": "6d55979c457eef2a5d0d80446c67ca533f201961", + "shasum": "" + }, + "require": { + "colinodell/json5": "^2.2", + "composer-runtime-api": "^2.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "fidry/cpu-core-counter": "^0.4.0 || ^0.5.0 || ^1.0", + "infection/abstract-testframework-adapter": "^0.5.0", + "infection/extension-installer": "^0.1.0", + "infection/include-interceptor": "^0.2.5", + "justinrainbow/json-schema": "^5.2.10", + "nikic/php-parser": "^4.15.1", + "ondram/ci-detector": "^4.1.0", + "php": "^8.1", + "sanmai/later": "^0.1.1", + "sanmai/pipeline": "^5.1 || ^6", + "sebastian/diff": "^3.0.2 || ^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "thecodingmachine/safe": "^2.1.2", + "webmozart/assert": "^1.11" + }, + "conflict": { + "antecedent/patchwork": "<2.1.25", + "dg/bypass-finals": "<1.4.1", + "phpunit/php-code-coverage": ">9,<9.1.4 || >9.2.17,<9.2.21" + }, + "require-dev": { + "brianium/paratest": "^6.11", + "ext-simplexml": "*", + "fidry/makefile": "^1.0", + "helmich/phpunit-json-assert": "^3.0", + "phpspec/prophecy": "^1.15", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.10.15", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpstan/phpstan-webmozart-assert": "^1.0.2", + "phpunit/phpunit": "^9.6", + "rector/rector": "^0.16.0", + "sidz/phpstan-rules": "^0.4.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "thecodingmachine/phpstan-safe-rule": "^1.2.0" + }, + "bin": [ + "bin/infection" + ], + "type": "library", + "autoload": { + "psr-4": { + "Infection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com", + "homepage": "https://twitter.com/maks_rafalko" + }, + { + "name": "Oleg Zhulnev", + "homepage": "https://github.com/sidz" + }, + { + "name": "Gert de Pagter", + "homepage": "https://github.com/BackEndTea" + }, + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com", + "homepage": "https://twitter.com/tfidry" + }, + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com", + "homepage": "https://www.alexeykopytko.com" + }, + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", + "keywords": [ + "coverage", + "mutant", + "mutation framework", + "mutation testing", + "testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/infection/infection/issues", + "source": "https://github.com/infection/infection/tree/0.27.11" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2024-03-20T07:48:57+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "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/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + }, + "time": "2024-07-06T21:00:26+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.64.0", + "illuminate/view": "^10.48.20", + "larastan/larastan": "^2.9.8", + "laravel-zero/framework": "^10.4.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.35.1" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2024-09-24T17:22:50+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "microsoft/tolerant-php-parser", + "version": "v0.1.2", + "source": { + "type": "git", + "url": "https://github.com/microsoft/tolerant-php-parser.git", + "reference": "3eccfd273323aaf69513e2f1c888393f5947804b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/3eccfd273323aaf69513e2f1c888393f5947804b", + "reference": "3eccfd273323aaf69513e2f1c888393f5947804b", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Microsoft\\PhpParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rob Lourens", + "email": "roblou@microsoft.com" + } + ], + "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios", + "support": { + "issues": "https://github.com/microsoft/tolerant-php-parser/issues", + "source": "https://github.com/microsoft/tolerant-php-parser/tree/v0.1.2" + }, + "time": "2022-10-05T17:30:19+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "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.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" + }, + "time": "2024-09-08T10:13:13+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-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/v4.19.4" + }, + "time": "2024-09-29T15:01:53+00:00" + }, + { + "name": "ondram/ci-detector", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/OndraM/ci-detector.git", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.13.2", + "lmc/coding-standard": "^3.0.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.6.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "OndraM\\CiDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Machulda", + "email": "ondrej.machulda@gmail.com" + } + ], + "description": "Detect continuous integration environment and provide unified access to properties of current build", + "keywords": [ + "CircleCI", + "Codeship", + "Wercker", + "adapter", + "appveyor", + "aws", + "aws codebuild", + "azure", + "azure devops", + "azure pipelines", + "bamboo", + "bitbucket", + "buddy", + "ci-info", + "codebuild", + "continuous integration", + "continuousphp", + "devops", + "drone", + "github", + "gitlab", + "interface", + "jenkins", + "pipelines", + "sourcehut", + "teamcity", + "travis" + ], + "support": { + "issues": "https://github.com/OndraM/ci-detector/issues", + "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" + }, + "time": "2024-03-12T13:22:30+00:00" + }, + { + "name": "pdepend/pdepend", + "version": "2.16.2", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "shasum": "" + }, + "require": { + "php": ">=5.3.7", + "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.19" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0|^1.2.3", + "gregwar/rst": "^1.0", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "PDepend\\": "src/main/php/PDepend" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/2.16.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2023-12-17T18:09:59+00:00" + }, + { + "name": "phan/phan", + "version": "5.4.5", + "source": { + "type": "git", + "url": "https://github.com/phan/phan.git", + "reference": "2b15302175931a0629a85c57d0c1f91d68b26a4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phan/phan/zipball/2b15302175931a0629a85c57d0c1f91d68b26a4d", + "reference": "2b15302175931a0629a85c57d0c1f91d68b26a4d", + "shasum": "" + }, + "require": { + "composer/semver": "^1.4|^2.0|^3.0", + "composer/xdebug-handler": "^2.0|^3.0", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.4", + "microsoft/tolerant-php-parser": "0.1.2", + "netresearch/jsonmapper": "^1.6.0|^2.0|^3.0|^4.0", + "php": "^7.2.0|^8.0.0", + "sabre/event": "^5.1.3", + "symfony/console": "^3.2|^4.0|^5.0|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.11.0", + "symfony/polyfill-php80": "^1.20.0", + "tysonandre/var_representation_polyfill": "^0.0.2|^0.1.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.0" + }, + "suggest": { + "ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is needed, 1.0.16+ is recommended.", + "ext-iconv": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8", + "ext-igbinary": "Improves performance of polyfill when ext-ast is unavailable", + "ext-mbstring": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8", + "ext-tokenizer": "Needed for fallback/polyfill parser support and file/line-based suppressions.", + "ext-var_representation": "Suggested for converting values to strings in issue messages" + }, + "bin": [ + "phan", + "phan_client", + "tocheckstyle" + ], + "type": "project", + "autoload": { + "psr-4": { + "Phan\\": "src/Phan" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tyson Andre" + }, + { + "name": "Rasmus Lerdorf" + }, + { + "name": "Andrew S. Morrison" + } + ], + "description": "A static analyzer for PHP", + "keywords": [ + "analyzer", + "php", + "static", + "static analysis" + ], + "support": { + "issues": "https://github.com/phan/phan/issues", + "source": "https://github.com/phan/phan/tree/5.4.5" + }, + "time": "2024-08-13T21:41:35+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": "phpmd/phpmd", + "version": "2.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", + "shasum": "" + }, + "require": { + "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", + "ext-xml": "*", + "pdepend/pdepend": "^2.16.1", + "php": ">=5.3.9" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0 || ^1.3.2", + "ext-json": "*", + "ext-simplexml": "*", + "gregwar/rst": "^1.0", + "mikey179/vfsstream": "^1.6.8", + "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "library", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project Founder" + }, + { + "name": "Marc Würth", + "email": "ravage@bluewin.ch", + "homepage": "https://github.com/ravage84", + "role": "Project Maintainer" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "https://phpmd.org/", + "keywords": [ + "dev", + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.15.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2023-12-11T08:22:20+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" + }, + "time": "2024-09-04T20:21:43+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.12.5", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", + "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "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-09-26T12:45:22+00:00" + }, + { + "name": "phpstan/phpstan-deprecation-rules", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82", + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.12" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "support": { + "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.1" + }, + "time": "2024-09-11T15:52:35+00:00" + }, + { + "name": "phpstan/phpstan-strict-rules", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-strict-rules.git", + "reference": "daeec748b53de80a97498462513066834ec28f8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/daeec748b53de80a97498462513066834ec28f8b", + "reference": "daeec748b53de80a97498462513066834ec28f8b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.12.4" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Extra strict and opinionated rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.6.1" + }, + "time": "2024-09-20T14:04:44+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.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/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.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": "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/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "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": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.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": "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/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.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", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" ], "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { - "url": "https://github.com/sponsors/kylekatarnls", + "url": "https://github.com/sebastianbergmann", "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": "2024-08-19T06:22:39+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { - "name": "nikic/php-parser", - "version": "v5.2.0", + "name": "phpunit/phpunit", + "version": "10.5.35", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", - "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7ac8b4e63f456046dcb4c9787da9382831a1874b", + "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b", "shasum": "" }, "require": { - "ext-ctype": "*", + "ext-dom": "*", "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.2", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ - "bin/php-parse" + "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "10.5-dev" } }, "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5303,428 +8420,1429 @@ ], "authors": [ { - "name": "Nikita Popov" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "A PHP parser written in PHP", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "parser", - "php" + "phpunit", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.2.0" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.35" }, - "time": "2024-09-15T16:40:33+00:00" + "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-09-19T10:52:21+00:00" }, { - "name": "phar-io/manifest", - "version": "2.0.4", + "name": "react/cache", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" + "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", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" + "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.5", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "shasum": "" }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "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" + }, + "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\ChildProcess\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.5" }, "funding": [ { - "url": "https://github.com/theseer", + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", "type": "github" } ], - "time": "2024-03-03T12:33:53+00:00" + "time": "2022-09-16T13:41:56+00:00" }, { - "name": "phar-io/version", - "version": "3.2.1", + "name": "react/dns", + "version": "v1.13.0", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "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": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\Dns\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Library for handling version information and constraints", + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" }, - "time": "2022-02-21T01:04:05+00:00" + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "9.2.32", + "name": "react/event-loop", + "version": "v1.5.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-text-template": "^2.0.4", - "sebastian/code-unit-reverse-lookup": "^2.0.3", - "sebastian/complexity": "^2.0.3", - "sebastian/environment": "^5.1.5", - "sebastian/lines-of-code": "^1.0.4", - "sebastian/version": "^3.0.2", - "theseer/tokenizer": "^1.2.3" + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "9.2.x-dev" + "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": { - "classmap": [ - "src/" - ] + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "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": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ - "coverage", - "testing", - "xunit" + "promise", + "promises" ], "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/9.2.32" + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2024-08-22T04:23:01+00:00" + "time": "2024-05-24T10:39:05+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "name": "react/socket", + "version": "v1.16.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "shasum": "" }, "require": { - "php": ">=7.3" + "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.3" + "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", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\Socket\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "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": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", "keywords": [ - "filesystem", - "iterator" + "Connection", + "Socket", + "async", + "reactphp", + "stream" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2024-07-26T10:38:09+00:00" }, { - "name": "phpunit/php-invoker", - "version": "3.1.1", + "name": "react/stream", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { - "php": ">=7.3" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" }, "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\Stream\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "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": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", "keywords": [ - "process" + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2024-06-11T12:45:25+00:00" }, { - "name": "phpunit/php-text-template", - "version": "2.0.4", + "name": "roave/security-advisories", + "version": "dev-latest", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "6f63660a573ec1e6d48d54ff7c44dfb1e303f30d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/6f63660a573ec1e6d48d54ff7c44dfb1e303f30d", + "reference": "6f63660a573ec1e6d48d54ff7c44dfb1e303f30d", "shasum": "" }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, + "conflict": { + "3f/pygmentize": "<1.2", + "admidio/admidio": "<4.3.10", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<2.2", + "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.04.6", + "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", + "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", + "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9|==2024.04.1", + "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", + "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "airesvsg/acf-to-rest-api": "<=3.1", + "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", + "alextselegidis/easyappointments": "<1.5", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<=1.7.2|>=2,<=2.1", + "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "apache-solr-for-typo3/solr": "<2.8.3", + "apereo/phpcas": "<1.6", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", + "appwrite/server-ce": "<=1.2.1", + "arc/web": "<3", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "artesaos/seotools": "<0.17.2", + "asymmetricrypt/asymmetricrypt": "<9.9.99", + "athlon1600/php-proxy": "<=5.1", + "athlon1600/php-proxy-app": "<=3", + "austintoddj/canvas": "<=3.4.2", + "auth0/wordpress": "<=4.6", + "automad/automad": "<2.0.0.0-alpha5", + "automattic/jetpack": "<9.8", + "awesome-support/awesome-support": "<=6.0.7", + "aws/aws-sdk-php": "<3.288.1", + "azuracast/azuracast": "<0.18.3", + "backdrop/backdrop": "<1.27.3|>=1.28,<1.28.2", + "backpack/crud": "<3.4.9", + "bacula-web/bacula-web": "<8.0.0.0-RC2-dev", + "badaso/core": "<2.7", + "bagisto/bagisto": "<2.1", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "barryvdh/laravel-translation-manager": "<0.6.2", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<5.0.9", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bbpress/bbpress": "<2.6.5", + "bcosca/fatfree": "<3.7.2", + "bedita/bedita": "<4", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", + "billz/raspap-webgui": "<=3.1.4", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "blueimp/jquery-file-upload": "==6.4.4", + "bmarshall511/wordpress_zero_spam": "<5.2.13", + "bolt/bolt": "<3.7.2", + "bolt/core": "<=4.2", + "born05/craft-twofactorauthentication": "<3.3.4", + "bottelet/flarepoint": "<2.2.1", + "bref/bref": "<2.1.17", + "brightlocal/phpwhois": "<=4.2.5", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bytefury/crater": "<6.0.2", + "cachethq/cachet": "<2.5.1", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cardgate/magento2": "<2.0.33", + "cardgate/woocommerce": "<=3.1.15", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", + "causal/oidc": "<2.1", + "cecil/cecil": "<7.47.1", + "centreon/centreon": "<22.10.15", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "chriskacerguis/codeigniter-restserver": "<=2.7.1", + "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "ckeditor/ckeditor": "<4.24", + "cockpit-hq/cockpit": "<2.7|==2.7", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<3.1.9", + "codeigniter4/framework": "<4.4.7", + "codeigniter4/shield": "<1.0.0.0-beta8", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", + "concrete5/concrete5": "<9.3.4", + "concrete5/core": "<8.5.8|>=9,<9.1", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", + "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/core": "<3.5.39", + "contao/core-bundle": "<4.13.49|>=5,<5.3.15|>=5.4,<5.4.3", + "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", + "contao/managed-edition": "<=1.5", + "corveda/phpsandbox": "<1.3.5", + "cosenary/instagram": "<=2.3", + "craftcms/cms": "<4.6.2|>=5,<=5.2.2", + "croogo/croogo": "<4", + "cuyz/valinor": "<0.12", + "czim/file-handling": "<1.5|>=2,<2.3", + "czproject/git-php": "<4.0.3", + "damienharper/auditor-bundle": "<5.2.6", + "dapphp/securimage": "<3.6.6", + "darylldoyle/safe-svg": "<1.9.10", + "datadog/dd-trace": ">=0.30,<0.30.2", + "datatables/datatables": "<1.10.10", + "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", + "desperado/xml-bundle": "<=0.1.7", + "devgroup/dotplant": "<2020.09.14-dev", + "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", + "doctrine/annotations": "<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": "<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<0.7.2", + "doctrine/mongodb-odm": "<1.0.2", + "doctrine/mongodb-odm-bundle": "<3.0.1", + "doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<19.0.2", + "dompdf/dompdf": "<2.0.4", + "doublethreedigital/guest-entries": "<3.1.2", + "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<=11.0.4", + "drupal/core-recommended": ">=8,<=11.0.4", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<=11.0.4", + "duncanmcclean/guest-entries": "<3.1.2", + "dweeves/magmi": "<=0.7.24", + "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", + "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "egroupware/egroupware": "<23.1.20240624", + "elefant/cms": "<2.0.7", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "elijaa/phpmemcacheadmin": "<=1.3", + "encore/laravel-admin": "<=1.8.19", + "endroid/qr-code-bundle": "<3.4.2", + "enhavo/enhavo-app": "<=0.13.1", + "enshrined/svg-sanitize": "<0.15", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "evolutioncms/evolution": "<=3.2.3", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "<2.2.3|==3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26|>=3.3,<3.3.39", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", + "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.35", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev|>=3.3,<3.3.40", + "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.08", + "fastly/magento2": "<1.2.26", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=2.1.1", + "fenom/fenom": "<=2.12.1", + "filament/infolists": ">=3,<3.2.115", + "filament/tables": ">=3,<3.2.115", + "filegator/filegator": "<7.8", + "filp/whoops": "<2.1.13", + "fineuploader/php-traditional-server": "<=1.2.2", + "firebase/php-jwt": "<6", + "fisharebest/webtrees": "<=2.1.18", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<1.8.5", + "flarum/flarum": "<0.1.0.0-beta8", + "flarum/framework": "<1.8.5", + "flarum/mentions": "<1.6.3", + "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", + "flarum/tags": "<=0.1.0.0-beta13", + "floriangaerber/magnesium": "<0.3.1", + "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/upload": "<1.2.3", + "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.11.1", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<=11.5.1", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1,<1.3.5", + "friendsofsymfony1/swiftmailer": ">=4,<5.4.13|>=6,<6.2.5", + "friendsofsymfony1/symfony1": ">=1.1,<1.5.19", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", + "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.3", + "froxlor/froxlor": "<=2.2.0.0-RC3", + "frozennode/administrator": "<=5.0.12", + "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getformwork/formwork": "<1.13.1|==2.0.0.0-beta1", + "getgrav/grav": "<1.7.46", + "getkirby/cms": "<=3.6.6.5|>=3.7,<=3.7.5.4|>=3.8,<=3.8.4.3|>=3.9,<=3.9.8.1|>=3.10,<=3.10.1|>=4,<=4.3", + "getkirby/kirby": "<=2.5.12", + "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", + "gilacms/gila": "<=1.15.4", + "gleez/cms": "<=1.3|==2", + "globalpayments/php-sdk": "<2", + "gogentooss/samlbase": "<1.2.7", + "google/protobuf": "<3.15", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<2.2.1", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<6.1.17", + "gugoan/economizzer": "<=0.9.0.0-beta1", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", + "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", + "harvesthq/chosen": "<1.8.7", + "helloxz/imgurl": "<=2.31", + "hhxsv5/laravel-s": "<3.7.36", + "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6.0.0-beta1,<4.6.9", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.6|>=4.6,<4.6.2", + "ibexa/fieldtype-richtext": ">=4.6,<4.6.10", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", + "ibexa/post-install": "<=1.0.4", + "ibexa/solr": ">=4.5,<4.5.4", + "ibexa/user": ">=4,<4.4.3", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", + "ilicmiljan/secure-props": ">=1.2,<1.2.2", + "illuminate/auth": "<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "imdbphp/imdbphp": "<=5.1.1", + "impresscms/impresscms": "<=1.4.5", + "impresspages/impresspages": "<=1.0.12", + "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.3", + "in2code/ipandlanguageredirect": "<5.1.2", + "in2code/lux": "<17.6.1|>=18,<24.0.2", + "in2code/powermail": "<7.5.1|>=8,<8.5.1|>=9,<10.9.1|>=11,<12.4.1", + "innologi/typo3-appointments": "<2.0.6", + "intelliants/subrion": "<4.2.2", + "inter-mediator/inter-mediator": "==5.5", + "ipl/web": "<0.10.1", + "islandora/islandora": ">=2,<2.4.1", + "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "james-heinrich/phpthumb": "<1.7.12", + "jasig/phpcas": "<1.3.3", + "jcbrand/converse.js": "<3.3.3", + "johnbillion/wp-crontrol": "<1.16.2", + "joomla/application": "<1.0.13", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/framework": "<1.5.7|>=2.5.4,<=3.8.12", + "joomla/input": ">=2,<2.0.2", + "joomla/joomla-cms": ">=2.5,<3.9.12", + "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", + "jsmitty12/phpwhois": "<5.1", + "juzaweb/cms": "<=3.4", + "jweiland/events2": "<8.3.8|>=9,<9.0.6", + "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplexrd": "<3.1.1", + "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3", + "kimai/kimai": "<=2.20.1", + "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", + "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<=1.4.2", + "kohana/core": "<3.3.3", + "krayin/laravel-crm": "<1.2.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "kumbiaphp/kumbiapp": "<=1.1.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", + "laminas/laminas-http": "<2.14.2", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", + "laravel/laravel": ">=5.4,<5.4.22", + "laravel/socialite": ">=1,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=9|==10.1", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "libreform/libreform": ">=2,<=2.0.8", + "librenms/librenms": "<2017.08.18", + "liftkit/database": "<2.13.2", + "lightsaml/lightsaml": "<1.3.5", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", + "livewire/livewire": ">2.2.4,<2.2.6|>=3.3.5,<3.4.9", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", + "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch9|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch7|==2.4.7|>=2.4.7.0-patch1,<2.4.7.0-patch2", + "magento/core": "<=1.9.4.5", + "magento/magento1ce": "<1.9.4.3-dev", + "magento/magento1ee": ">=1,<1.14.4.3-dev", + "magento/product-community-edition": "<2.4.4.0-patch9|>=2.4.5,<2.4.5.0-patch8|>=2.4.6,<2.4.6.0-patch6|>=2.4.7,<2.4.7.0-patch1", + "magneto/core": "<1.9.4.4-dev", + "maikuolan/phpmussel": ">=1,<1.6", + "mainwp/mainwp": "<=4.4.3.3", + "mantisbt/mantisbt": "<=2.26.3", + "marcwillmann/turn": "<0.3.3", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.4.13|>=5,<5.1.1", + "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", + "mdanter/ecc": "<2", + "mediawiki/core": "<1.36.2", + "mediawiki/matomo": "<2.4.3", + "mediawiki/semantic-media-wiki": "<4.0.2", + "melisplatform/melis-asset-manager": "<5.0.1", + "melisplatform/melis-cms": "<5.0.1", + "melisplatform/melis-front": "<5.0.1", + "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "mgallegos/laravel-jqgrid": "<=1.3", + "microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2,<2.0.1", + "microsoft/microsoft-graph-beta": "<2.0.1", + "microsoft/microsoft-graph-core": "<2.0.2", + "microweber/microweber": "<=2.0.16", + "mikehaertl/php-shellcommand": "<1.6.1", + "miniorange/miniorange-saml": "<1.4.3", + "mittwald/typo3_forum": "<1.2.1", + "mobiledetect/mobiledetectlib": "<2.8.32", + "modx/revolution": "<=2.8.3.0-patch", + "mojo42/jirafeau": "<4.4", + "mongodb/mongodb": ">=1,<1.9.2", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<4.3.5|>=4.4.0.0-beta,<4.4.1", + "mos/cimage": "<0.7.19", + "movim/moxl": ">=0.8,<=0.10", + "movingbytes/social-network": "<=1.2.1", + "mpdf/mpdf": "<=7.1.7", + "munkireport/comment": "<4.1", + "munkireport/managedinstalls": "<2.6", + "munkireport/munki_facts": "<1.5", + "munkireport/munkireport": ">=2.5.3,<5.6.3", + "munkireport/reportdata": "<3.5", + "munkireport/softwareupdate": "<1.6", + "mustache/mustache": ">=2,<2.14.1", + "namshi/jose": "<2.2", + "nategood/httpful": "<1", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.04", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", + "neos/swiftmailer": "<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<3.0.10", + "nonfiction/nterchange": "<4.1.1", + "notrinos/notrinos-erp": "<=0.7", + "noumo/easyii": "<=0.9", + "novaksolutions/infusionsoft-php-sdk": "<1", + "nukeviet/nukeviet": "<4.5.02", + "nyholm/psr7": "<1.6.1", + "nystudio107/craft-seomatic": "<3.4.12", + "nzedb/nzedb": "<0.8", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", + "october/october": "<=3.4.4", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", + "omeka/omeka-s": "<4.0.3", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.7.4", + "opencart/opencart": ">=0", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<20.10.1", + "opensolutions/vimbadmin": "<=3.0.15", + "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", + "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", + "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", + "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/crm-call-bundle": ">=4.2,<=4.2.5|>=5,<5.0.4|>=5.1,<5.1.1", + "oro/customer-portal": ">=4.1,<=4.1.13|>=4.2,<=4.2.10|>=5,<=5.0.11|>=5.1,<=5.1.3", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<=5.0.12|>=5.1,<=5.1.3", + "oveleon/contao-cookiebar": "<1.16.3|>=2,<2.1.3", + "oxid-esales/oxideshop-ce": "<4.5", + "oxid-esales/paymorrow-module": ">=1,<1.0.2|>=2,<2.0.1", + "packbackbooks/lti-1-3-php-library": "<5", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": "<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/ecc": "<2.0.1", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<4.6.2", + "paypal/adaptivepayments-sdk-php": "<=3.9.2", + "paypal/invoice-sdk-php": "<=3.9", + "paypal/merchant-sdk-php": "<3.12", + "paypal/permissions-sdk-php": "<=3.9.1", + "pear/archive_tar": "<1.4.14", + "pear/auth": "<1.2.4", + "pear/crypt_gpg": "<1.6.7", + "pear/pear": "<=1.10.1", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", + "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", + "phenx/php-svg-lib": "<0.5.2", + "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", + "php-mod/curl": "<2.3.2", + "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", + "phpems/phpems": ">=6,<=6.1.3", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<5.2.1", + "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5", + "phpoffice/common": "<0.2.9", + "phpoffice/phpexcel": "<1.8", + "phpoffice/phpspreadsheet": "<1.29.1|>=2,<2.1.1|>=2.2,<2.2.1", + "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", + "phpservermon/phpservermon": "<3.6", + "phpsysinfo/phpsysinfo": "<3.4.3", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", + "pi/pi": "<=2.5", + "pimcore/admin-ui-classic-bundle": "<1.5.4", + "pimcore/customer-management-framework-bundle": "<4.0.6", + "pimcore/data-hub": "<1.2.4", + "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", + "pimcore/demo": "<10.3", + "pimcore/ecommerce-framework-bundle": "<1.0.10", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<11.2.4", + "pixelfed/pixelfed": "<0.11.11", + "plotly/plotly.js": "<2.25.2", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<5.11.2", + "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockreassurance": "<=5.1.3", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": "<8.1.6", + "prestashop/productcomments": "<5.0.2", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4|>=1.5,<1.7.4", + "processwire/processwire": "<=3.0.229", + "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<1.11.6", + "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", + "ptrofimov/beanstalk_console": "<1.7.14", + "pubnub/pubnub": "<6.1", + "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6.0-beta", + "pxlrbt/filament-excel": "<1.1.14|>=2.0.0.0-alpha,<2.3.3", + "pyrocms/pyrocms": "<=3.9.1", + "qcubed/qcubed": "<=3.1.1", + "quickapps/cms": "<=2.0.0.0-beta2", + "rainlab/blog-plugin": "<1.4.1", + "rainlab/debugbar-plugin": "<3.1", + "rainlab/user-plugin": "<=1.4.5", + "rankmath/seo-by-rank-math": "<=1.0.95", + "rap2hpoutre/laravel-log-viewer": "<0.13", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", + "redaxo/source": "<=5.15.1", + "remdex/livehelperchat": "<4.29", + "reportico-web/reportico": "<=8.1", + "rhukster/dom-sanitizer": "<1.0.7", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "roots/soil": "<4.1", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": "<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "sfroemken/url_redirect": "<=1.2.1", + "sheng/yiicms": "<=1.2", + "shopware/core": "<=6.5.8.12|>=6.6,<=6.6.5", + "shopware/platform": "<=6.5.8.12|>=6.6,<=6.6.5", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.7.17", + "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", + "shopxo/shopxo": "<=6.1", + "showdoc/showdoc": "<2.10.4", + "silverstripe-australia/advancedreports": ">=1,<=2", + "silverstripe/admin": "<1.13.19|>=2,<2.1.8", + "silverstripe/assets": ">=1,<1.11.1", + "silverstripe/cms": "<4.11.3", + "silverstripe/comments": ">=1.3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<5.2.16", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", + "silverstripe/recipe-cms": ">=4.5,<4.5.3", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/reports": "<5.2.3", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4|>=2.1,<2.1.2", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", + "silverstripe/subsites": ">=2,<2.6.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3|>=5,<5.4.2", + "silverstripe/versioned-admin": ">=1,<1.11.1", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4|==5.0.0.0-alpha12", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplesamlphp/xml-security": "==1.6.11", + "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", + "slim/slim": "<2.6", + "slub/slub-events": "<3.0.3", + "smarty/smarty": "<4.5.3|>=5,<5.1.1", + "snipe/snipe-it": "<6.4.2", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spatie/browsershot": "<3.57.4", + "spatie/image-optimizer": "<1.7.3", + "spipu/html2pdf": "<5.2.8", + "spoon/library": "<1.4.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<24.05.1", + "starcitizentools/citizen-skin": ">=2.6.3,<2.31", + "statamic/cms": "<4.46|>=5.3,<5.6.2", + "stormpath/sdk": "<9.9.99", + "studio-42/elfinder": "<=2.1.64", + "studiomitte/friendlycaptcha": "<0.1.4", + "subhh/libconnect": "<7.0.8|>=8,<8.1", + "sukohi/surpass": "<1", + "sulu/form-bundle": ">=2,<2.5.3", + "sulu/sulu": "<1.6.44|>=2,<2.4.17|>=2.5,<2.5.13", + "sumocoders/framework-user-bundle": "<1.4", + "superbig/craft-audit": "<3.0.2", + "swag/paypal": "<5.4.4", + "swiftmailer/swiftmailer": "<6.2.5", + "swiftyedit/swiftyedit": "<1.2", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.12.19|>=1.13.0.0-alpha1,<1.13.4", + "symbiote/silverstripe-multivaluefield": ">=3,<3.1", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<5.3.15|>=5.4.3,<5.4.4|>=6.0.3,<6.0.4", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2|>=5.4,<5.4.31|>=6,<6.3.8", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/ux-autocomplete": "<2.11.2", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/webhook": ">=6.3,<6.3.8", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7|>=2.2.0.0-beta1,<2.2.0.0-beta2", + "symphonycms/symphony-2": "<2.6.4", + "t3/dce": "<0.11.5|>=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "t3s/content-consent": "<1.0.3|>=2,<2.0.2", + "tastyigniter/tastyigniter": "<3.3", + "tcg/voyager": "<=1.4", + "tecnickcom/tcpdf": "<=6.7.4", + "terminal42/contao-tablelookupwizard": "<3.3.5", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<6.0.8", + "thorsten/phpmyfaq": "<3.2.2", + "tikiwiki/tiki-manager": "<=17.1", + "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", + "tinymce/tinymce": "<7.2", + "tinymighty/wiki-seo": "<1.2.2", + "titon/framework": "<9.9.99", + "tobiasbg/tablepress": "<=2.0.0.0-RC1", + "topthink/framework": "<6.0.17|>=6.1,<=8.0.4", + "topthink/think": "<=6.1.1", + "topthink/thinkphp": "<=3.2.3", + "torrentpier/torrentpier": "<=2.4.3", + "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", + "tribalsystems/zenario": "<9.5.60602", + "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", + "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", + "twig/twig": "<1.44.8|>=2,<2.16.1|>=3,<3.11.1|>=3.12,<3.14", + "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": "<=8.7.56|>=9,<=9.5.47|>=10,<=10.4.44|>=11,<=11.5.36|>=12,<=12.4.14|>=13,<=13.1", + "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", + "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5", + "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8", + "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "uasoft-indonesia/badaso": "<=2.9.7", + "unisharp/laravel-filemanager": "<2.6.4", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "uvdesk/community-skeleton": "<=1.1.1", + "uvdesk/core-framework": "<=1.1.1", + "vanilla/safecurl": "<0.9.2", + "verbb/comments": "<1.5.5", + "verbb/formie": "<2.1.6", + "verbb/image-resizer": "<2.0.9", + "verbb/knock-knock": "<1.2.8", + "verot/class.upload.php": "<=2.1.6", + "villagedefrance/opencart-overclocked": "<=1.11.1", + "vova07/yii2-fileapi-widget": "<0.1.9", + "vrana/adminer": "<4.8.1", + "vufind/vufind": ">=2,<9.1.1", + "waldhacker/hcaptcha": "<2.1.2", + "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.6.7", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4|>=4.5,<4.9", + "web-auth/webauthn-lib": ">=4.5,<4.9", + "web-feet/coastercms": "==5.5", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", + "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", + "webpa/webpa": "<3.1.2", + "wikibase/wikibase": "<=1.39.3", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "winter/wn-backend-module": "<1.2.4", + "winter/wn-dusk-plugin": "<2.1", + "winter/wn-system-module": "<1.2.4", + "wintercms/winter": "<=1.2.3", + "wireui/wireui": "<1.19.3|>=2,<2.1.3", + "woocommerce/woocommerce": "<6.6|>=8.8,<8.8.5|>=8.9,<8.9.3", + "wp-cli/wp-cli": ">=0.12,<2.5", + "wp-graphql/wp-graphql": "<=1.14.5", + "wp-premium/gravityforms": "<2.4.21", + "wpanel/wpanel4-cms": "<=4.3.1", + "wpcloud/wp-stateless": "<3.2", + "wpglobus/wpglobus": "<=1.9.6", + "wwbn/avideo": "<14.3", + "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", + "yab/quarx": "<2.4.5", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<=6.4", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": "<1.1.29", + "yiisoft/yii2": "<2.0.49.4-dev", + "yiisoft/yii2-authclient": "<2.2.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.43", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<=2.2.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "yuan1994/tpadmin": "<=1.3.12", + "zencart/zencart": "<=1.5.7.0-beta", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": "<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": "<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": "<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": "<2.0.2", + "zendframework/zendrest": "<2.0.2", + "zendframework/zendservice-amazon": "<2.0.3", + "zendframework/zendservice-api": "<1", + "zendframework/zendservice-audioscrobbler": "<2.0.2", + "zendframework/zendservice-nirvanix": "<2.0.2", + "zendframework/zendservice-slideshare": "<2.0.2", + "zendframework/zendservice-technorati": "<2.0.2", + "zendframework/zendservice-windowsazure": "<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zenstruck/collection": "<0.2.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<=6.1.53" + }, + "default-branch": true, + "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", "keywords": [ - "template" + "dev" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/Ocramius", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2024-09-30T18:06:02+00:00" }, { - "name": "phpunit/php-timer", - "version": "5.0.3", + "name": "sabre/event", + "version": "5.1.7", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "url": "https://github.com/sabre-io/event.git", + "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sabre-io/event/zipball/86d57e305c272898ba3c28e9bd3d65d5464587c2", + "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2", "shasum": "" }, "require": { - "php": ">=7.3" + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "friendsofphp/php-cs-fixer": "~2.17.1||^3.63", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "lib/coroutine.php", + "lib/Loop/functions.php", + "lib/Promise/functions.php" + ], + "psr-4": { + "Sabre\\Event\\": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5732,203 +9850,186 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "sabre/event is a library for lightweight event-based programming", + "homepage": "http://sabre.io/event/", "keywords": [ - "timer" + "EventEmitter", + "async", + "coroutine", + "eventloop", + "events", + "hooks", + "plugin", + "promise", + "reactor", + "signal" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/event/issues", + "source": "https://github.com/fruux/sabre-event" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2024-08-27T11:23:05+00:00" }, { - "name": "phpunit/phpunit", - "version": "9.6.21", + "name": "sanmai/later", + "version": "0.1.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" + "url": "https://github.com/sanmai/later.git", + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", - "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "url": "https://api.github.com/repos/sanmai/later/zipball/e24c4304a4b1349c2a83151a692cec0c10579f60", + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.5.0 || ^2", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.32", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.4", - "phpunit/php-timer": "^5.0.3", - "sebastian/cli-parser": "^1.0.2", - "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.6", - "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", - "sebastian/object-enumerator": "^4.0.4", - "sebastian/resource-operations": "^3.0.4", - "sebastian/type": "^3.2.1", - "sebastian/version": "^3.0.2" + "php": ">=7.4" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.35.1", + "infection/infection": ">=0.27.6", + "phan/phan": ">=2", + "php-coveralls/php-coveralls": "^2.0", + "phpstan/phpstan": ">=1.4.5", + "phpunit/phpunit": ">=9.5 <10", + "vimeo/psalm": ">=2" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "0.1.x-dev" } }, "autoload": { "files": [ - "src/Framework/Assert/Functions.php" + "src/functions.php" ], - "classmap": [ - "src/" - ] + "psr-4": { + "Later\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "Apache-2.0" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], + "description": "Later: deferred wrapper object", "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" + "issues": "https://github.com/sanmai/later/issues", + "source": "https://github.com/sanmai/later/tree/0.1.4" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/sanmai", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" } ], - "time": "2024-09-19T10:50:18+00:00" + "time": "2023-10-24T00:25:28+00:00" }, { - "name": "psr/clock", - "version": "1.0.0", + "name": "sanmai/pipeline", + "version": "v6.11", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/sanmai/pipeline.git", + "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/sanmai/pipeline/zipball/a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", + "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.10.5", + "league/pipeline": "^0.3 || ^1.0", + "phan/phan": ">=1.1", + "php-coveralls/php-coveralls": "^2.4.1", + "phpstan/phpstan": ">=0.10", + "phpunit/phpunit": ">=9.4", + "vimeo/psalm": ">=2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v6.x-dev" + } + }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Psr\\Clock\\": "src/" + "Pipeline\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" } ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], + "description": "General-purpose collections pipeline", "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" + "issues": "https://github.com/sanmai/pipeline/issues", + "source": "https://github.com/sanmai/pipeline/tree/v6.11" }, - "time": "2022-11-25T14:36:26+00:00" + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2024-06-15T03:11:19+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -5951,7 +10052,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -5959,32 +10061,32 @@ "type": "github" } ], - "time": "2024-03-02T06:27:43+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -6007,7 +10109,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { @@ -6015,32 +10117,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6062,7 +10164,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { @@ -6070,34 +10172,36 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6136,7 +10240,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" }, "funding": [ { @@ -6144,33 +10249,33 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2024-08-12T06:03:08+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.3", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -6193,7 +10298,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -6201,33 +10307,33 @@ "type": "github" } ], - "time": "2023-12-22T06:19:30+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", - "version": "4.0.6", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -6259,7 +10365,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -6267,27 +10374,27 @@ "type": "github" } ], - "time": "2024-03-02T06:30:58+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -6295,7 +10402,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -6314,7 +10421,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -6322,7 +10429,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -6330,34 +10438,34 @@ "type": "github" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.6", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -6399,7 +10507,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" }, "funding": [ { @@ -6407,38 +10516,35 @@ "type": "github" } ], - "time": "2024-03-02T06:33:00+00:00" + "time": "2024-03-02T07:17:12+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.7", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6457,13 +10563,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -6471,33 +10578,33 @@ "type": "github" } ], - "time": "2024-03-02T06:35:11+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.4", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -6520,7 +10627,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -6528,34 +10636,34 @@ "type": "github" } ], - "time": "2023-12-22T06:20:34+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6577,7 +10685,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { @@ -6585,32 +10693,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6632,7 +10740,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { @@ -6640,32 +10748,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6695,7 +10803,7 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" }, "funding": [ { @@ -6703,32 +10811,32 @@ "type": "github" } ], - "time": "2023-02-03T06:07:39+00:00" + "time": "2023-02-03T07:05:40+00:00" }, { - "name": "sebastian/resource-operations", - "version": "3.0.4", + "name": "sebastian/type", + "version": "4.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6743,13 +10851,15 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { @@ -6757,32 +10867,29 @@ "type": "github" } ], - "time": "2024-03-14T16:00:52+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { - "name": "sebastian/type", - "version": "3.2.1", + "name": "sebastian/version", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6801,11 +10908,11 @@ "role": "lead" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "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/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { @@ -6813,60 +10920,75 @@ "type": "github" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { - "name": "sebastian/version", - "version": "3.0.2", + "name": "spatie/array-to-xml", + "version": "3.3.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/f56b220fe2db1ade4c88098d83413ebdfc3bf876", + "reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876", "shasum": "" }, "require": { - "php": ">=7.3" + "ext-dom": "*", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spatie\\ArrayToXml\\": "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", + "homepage": "https://freek.dev", + "role": "Developer" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "source": "https://github.com/spatie/array-to-xml/tree/3.3.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2024-05-01T10:20:27+00:00" }, { "name": "spatie/backtrace", @@ -7227,102 +11349,113 @@ "time": "2023-12-16T17:16:54+00:00" }, { - "name": "symfony/browser-kit", - "version": "v7.1.1", + "name": "squizlabs/php_codesniffer", + "version": "3.10.3", "source": { "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "9c13742e3175b5815e272b981876ae329bec2040" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/9c13742e3175b5815e272b981876ae329bec2040", - "reference": "9c13742e3175b5815e272b981876ae329bec2040", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/dom-crawler": "^6.4|^7.0" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, "require-dev": { - "symfony/css-selector": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Greg Sherwood", + "role": "Former lead" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", - "homepage": "https://symfony.com", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.1.1" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/PHPCSStandards", + "type": "github" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/jrfnl", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-18T10:38:58+00:00" }, { - "name": "symfony/clock", + "name": "symfony/browser-kit", "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + "url": "https://github.com/symfony/browser-kit.git", + "reference": "9c13742e3175b5815e272b981876ae329bec2040" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/9c13742e3175b5815e272b981876ae329bec2040", + "reference": "9c13742e3175b5815e272b981876ae329bec2040", "shasum": "" }, "require": { "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" + "symfony/dom-crawler": "^6.4|^7.0" }, - "provide": { - "psr/clock-implementation": "1.0" + "require-dev": { + "symfony/css-selector": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { - "files": [ - "Resources/now.php" - ], "psr-4": { - "Symfony\\Component\\Clock\\": "" + "Symfony\\Component\\BrowserKit\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7334,23 +11467,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": "Decouples applications from the system clock", + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", - "keywords": [ - "clock", - "psr20", - "time" - ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.1" + "source": "https://github.com/symfony/browser-kit/tree/v7.1.1" }, "funding": [ { @@ -7676,36 +11804,102 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", + "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", + "shasum": "" + }, + "require": { + "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": { + "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", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.1.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", "shasum": "" }, "require": { "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": { - "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" + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Component\\OptionsResolver\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7725,14 +11919,15 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Allows manipulating MIME messages", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", "keywords": [ - "mime", - "mime-type" + "config", + "configuration", + "options" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.5" + "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" }, "funding": [ { @@ -7748,7 +11943,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/phpunit-bridge", @@ -8038,100 +12233,6 @@ ], "time": "2024-05-31T14:57:53+00:00" }, - { - "name": "symfony/translation", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "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" - }, - "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": { - "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/v7.1.5" - }, - "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-16T06:30:38+00:00" - }, { "name": "symfony/web-profiler-bundle", "version": "v7.1.4", @@ -8213,6 +12314,63 @@ ], "time": "2024-08-12T09:59:40+00:00" }, + { + "name": "thecodingmachine/phpstan-safe-rule", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/phpstan-safe-rule.git", + "reference": "8a7b88e0d54f209a488095085f183e9174c40e1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/8a7b88e0d54f209a488095085f183e9174c40e1e", + "reference": "8a7b88e0d54f209a488095085f183e9174c40e1e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "phpstan/phpstan": "^1.0", + "thecodingmachine/safe": "^1.0 || ^2.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^7.5.2 || ^8.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "phpstan-extension", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "phpstan": { + "includes": [ + "phpstan-safe-rule.neon" + ] + } + }, + "autoload": { + "psr-4": { + "TheCodingMachine\\Safe\\PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Négrier", + "email": "d.negrier@thecodingmachine.com" + } + ], + "description": "A PHPStan rule to detect safety issues. Must be used in conjunction with thecodingmachine/safe", + "support": { + "issues": "https://github.com/thecodingmachine/phpstan-safe-rule/issues", + "source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.2.0" + }, + "time": "2022-01-17T10:12:29+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.3", @@ -8264,32 +12422,45 @@ "time": "2024-03-03T12:36:25+00:00" }, { - "name": "voku/portable-ascii", - "version": "2.0.1", + "name": "tysonandre/var_representation_polyfill", + "version": "0.1.3", "source": { "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "b56450eed252f6801410d810c8e1727224ae0743" + "url": "https://github.com/TysonAndre/var_representation_polyfill.git", + "reference": "e9116c2c352bb0835ca428b442dde7767c11ad32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", - "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/e9116c2c352bb0835ca428b442dde7767c11ad32", + "reference": "e9116c2c352bb0835ca428b442dde7767c11ad32", "shasum": "" }, "require": { - "php": ">=7.0.0" + "ext-tokenizer": "*", + "php": "^7.2.0|^8.0.0" + }, + "provide": { + "ext-var_representation": "*" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phan/phan": "^5.4.1", + "phpunit/phpunit": "^8.5.0" }, "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" + "ext-var_representation": "For best performance" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.3-dev" + } + }, "autoload": { + "files": [ + "src/var_representation.php" + ], "psr-4": { - "voku\\": "src/voku/" + "VarRepresentation\\": "src/VarRepresentation" } }, "notification-url": "https://packagist.org/downloads/", @@ -8298,49 +12469,136 @@ ], "authors": [ { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" + "name": "Tyson Andre" } ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", + "description": "Polyfill for var_representation: convert a variable to a string in a way that fixes the shortcomings of var_export", "keywords": [ - "ascii", - "clean", - "php" + "var_export", + "var_representation" ], "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + "issues": "https://github.com/TysonAndre/var_representation_polyfill/issues", + "source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.1.3" }, - "funding": [ - { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", - "type": "github" - }, - { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" - }, + "time": "2022-08-31T12:59:22+00:00" + }, + { + "name": "vimeo/psalm", + "version": "5.26.1", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer-runtime-api": "^2", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.1", + "felixfbecker/language-server-protocol": "^1.5.2", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.17", + "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "nikic/php-parser": "4.17.0" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "amphp/phpunit-util": "^2.0", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "ext-curl": "*", + "mockery/mockery": "^1.5", + "nunomaduro/mock-final-classes": "^1.1", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpdoc-parser": "^1.6", + "phpunit/phpunit": "^9.6", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.6", + "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "project", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev", + "dev-4.x": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", - "type": "tidelift" + "name": "Matthew Brown" } ], - "time": "2022-03-08T17:03:00+00:00" + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php", + "static analysis" + ], + "support": { + "docs": "https://psalm.dev/docs", + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm" + }, + "time": "2024-09-08T18:53:08+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { diff --git a/symfony/config/packages/google_recaptcha.yaml b/symfony/config/packages/google_recaptcha.yaml new file mode 100644 index 00000000..8670b13e --- /dev/null +++ b/symfony/config/packages/google_recaptcha.yaml @@ -0,0 +1,21 @@ +services: + + # Inject this service in your controllers/services to verify a submitted captcha. + ReCaptcha\ReCaptcha: + arguments: + $secret: '%env(GOOGLE_RECAPTCHA_SECRET)%' + $requestMethod: '@ReCaptcha\RequestMethod' + + # Curl is set here as default transport to communicate with Google servers. + # If you do not have php-curl extension, you can change for a socket or a plain POST request. + # Check out the repository for all other request methods: + # https://github.com/google/recaptcha/tree/master/src/ReCaptcha/RequestMethod + ReCaptcha\RequestMethod: '@ReCaptcha\RequestMethod\CurlPost' + ReCaptcha\RequestMethod\CurlPost: null + ReCaptcha\RequestMethod\Curl: null + +# Uncomment this line if you want to inject the site key to all your Twig templates. +# You can also inject the "google_recaptcha_site_key" container parameter to your controllers. +#twig: +# globals: +# google_recaptcha_site_key: '%google_recaptcha_site_key%' diff --git a/symfony/config/services.yaml b/symfony/config/services.yaml index 2d6a76f9..b107f6f0 100644 --- a/symfony/config/services.yaml +++ b/symfony/config/services.yaml @@ -4,6 +4,7 @@ # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: + google_recaptcha_site_key: '%env(GOOGLE_RECAPTCHA_SITE_KEY)%' services: # default configuration for services in *this* file diff --git a/symfony/phpcs.xml.dist b/symfony/phpcs.xml.dist new file mode 100644 index 00000000..89195e2b --- /dev/null +++ b/symfony/phpcs.xml.dist @@ -0,0 +1,19 @@ + + + + + + + + + + + + bin/ + config/ + public/ + src/ + tests/ + + diff --git a/symfony/phpstan.dist.neon b/symfony/phpstan.dist.neon new file mode 100644 index 00000000..e0de575f --- /dev/null +++ b/symfony/phpstan.dist.neon @@ -0,0 +1,8 @@ +parameters: + level: 6 + paths: + - bin/ + - config/ + - public/ + - src/ + - tests/ diff --git a/symfony/symfony.lock b/symfony/symfony.lock index 3bd5123a..edf3d3e6 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -13,6 +13,42 @@ "./src/Repository/.gitignore" ] }, + "friendsofphp/php-cs-fixer": { + "version": "3.64", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.0", + "ref": "be2103eb4a20942e28a6dd87736669b757132435" + }, + "files": [ + "./.php-cs-fixer.dist.php" + ] + }, + "google/recaptcha": { + "version": "1.3", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "1.1", + "ref": "e5a4aa21f2e98d7440ae9aab6b56e307f99dd084" + }, + "files": [ + "./config/packages/google_recaptcha.yaml" + ] + }, + "phpstan/phpstan": { + "version": "1.12", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "1.0", + "ref": "5e490cc197fb6bb1ae22e5abbc531ddc633b6767" + }, + "files": [ + "./phpstan.dist.neon" + ] + }, "phpunit/phpunit": { "version": "9.6", "recipe": { @@ -39,6 +75,18 @@ "./config/packages/ignition.yaml" ] }, + "squizlabs/php_codesniffer": { + "version": "3.10", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "3.6", + "ref": "1019e5c08d4821cb9b77f4891f8e9c31ff20ac6f" + }, + "files": [ + "./phpcs.xml.dist" + ] + }, "symfony/console": { "version": "7.1", "recipe": { From f4c1b077e2b298153641c5ec2b4f412cd1f88e34 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 14:56:57 +0000 Subject: [PATCH 18/61] * update php version and requiring extensions for removing `symfony/ployfill-*` packages: https://stackoverflow.com/questions/18882201/how-does-the-replace-property-work-with-composer * add namespace autoload for `tbclient.protobuf/tbm_php` $ composer bump @ symfony --- symfony/composer.json | 89 ++++----- symfony/composer.lock | 406 +----------------------------------------- 2 files changed, 54 insertions(+), 441 deletions(-) diff --git a/symfony/composer.json b/symfony/composer.json index 60dfde38..555aadde 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -4,36 +4,38 @@ "minimum-stability": "stable", "prefer-stable": true, "require": { - "php": ">=8.2", + "php": "^8.3", "ext-ctype": "*", "ext-iconv": "*", - "doctrine/dbal": "^3", - "doctrine/doctrine-bundle": "^2.13", - "doctrine/orm": "^3.2", + "ext-intl": "*", + "ext-mbstring": "*", + "doctrine/dbal": "^3.9.1", + "doctrine/doctrine-bundle": "^2.13.0", + "doctrine/orm": "^3.2.2", "google/protobuf": "^4.28.2", "google/recaptcha": "^1.3.0", - "illuminate/collections": "^11.25", - "phpdocumentor/reflection-docblock": "^5.4", - "phpstan/phpdoc-parser": "^1.32", + "illuminate/collections": "^11.26.0", + "phpdocumentor/reflection-docblock": "^5.4.1", + "phpstan/phpdoc-parser": "^1.32.0", "spatie/laravel-collection-macros": "^7.14.1", "spatie/regex": "^3.1.1", - "symfony/asset": "7.1.*", - "symfony/console": "7.1.*", - "symfony/dotenv": "7.1.*", - "symfony/flex": "^2", - "symfony/framework-bundle": "7.1.*", - "symfony/property-access": "7.1.*", - "symfony/property-info": "7.1.*", - "symfony/runtime": "7.1.*", - "symfony/serializer": "7.1.*", - "symfony/twig-bundle": "7.1.*", - "symfony/yaml": "7.1.*", - "thecodingmachine/safe": "^2.5" + "symfony/asset": "^7.1.1", + "symfony/console": "^7.1.5", + "symfony/dotenv": "^7.1.5", + "symfony/flex": "^2.4.6", + "symfony/framework-bundle": "^7.1.5", + "symfony/property-access": "^7.1.4", + "symfony/property-info": "^7.1.3", + "symfony/runtime": "^7.1.1", + "symfony/serializer": "^7.1.5", + "symfony/twig-bundle": "^7.1.5", + "symfony/yaml": "^7.1.5", + "thecodingmachine/safe": "^2.5.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.64.0", "infection/infection": "^0.27.11", - "laravel/pint": "^1.17.3", + "laravel/pint": "^1.18.1", "phan/phan": "^5.4.5", "phpmd/phpmd": "^2.15.0", "phpstan/extension-installer": "^1.4.3", @@ -41,16 +43,16 @@ "phpstan/phpstan-strict-rules": "^1.6.1", "phpunit/phpunit": "^10.5.35", "roave/security-advisories": "dev-latest", - "spatie/symfony-ignition-bundle": "^1.1", + "spatie/symfony-ignition-bundle": "^1.1.0", "squizlabs/php_codesniffer": "^3.10.3", - "symfony/browser-kit": "7.1.*", - "symfony/css-selector": "7.1.*", - "symfony/debug-bundle": "7.1.*", - "symfony/maker-bundle": "^1.61", - "symfony/phpunit-bridge": "^7.1", - "symfony/stopwatch": "7.1.*", - "symfony/web-profiler-bundle": "7.1.*", - "thecodingmachine/phpstan-safe-rule": "^1.2", + "symfony/browser-kit": "^7.1.1", + "symfony/css-selector": "^7.1.1", + "symfony/debug-bundle": "^7.1.1", + "symfony/maker-bundle": "^1.61.0", + "symfony/phpunit-bridge": "^7.1.4", + "symfony/stopwatch": "^7.1.1", + "symfony/web-profiler-bundle": "^7.1.4", + "thecodingmachine/phpstan-safe-rule": "^1.2.0", "vimeo/psalm": "^5.26.1" }, "config": { @@ -65,7 +67,9 @@ }, "autoload": { "psr-4": { - "App\\": "src/" + "App\\": "src/", + "TbClient\\": "../tbclient.protobuf/tbm_php/TbClient/", + "GPBMetadata\\": "../tbclient.protobuf/tbm_php/GPBMetadata/" } }, "autoload-dev": { @@ -76,12 +80,26 @@ "replace": { "symfony/polyfill-ctype": "*", "symfony/polyfill-iconv": "*", + "symfony/polyfill-intl-grapheme": "*", + "symfony/polyfill-intl-idn": "*", + "symfony/polyfill-intl-normalizer": "*", + "symfony/polyfill-mbstring": "*", "symfony/polyfill-php72": "*", "symfony/polyfill-php73": "*", "symfony/polyfill-php74": "*", "symfony/polyfill-php80": "*", "symfony/polyfill-php81": "*", - "symfony/polyfill-php82": "*" + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*" + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "7.1.*" + } }, "scripts": { "auto-scripts": { @@ -94,14 +112,5 @@ "post-update-cmd": [ "@auto-scripts" ] - }, - "conflict": { - "symfony/symfony": "*" - }, - "extra": { - "symfony": { - "allow-contrib": false, - "require": "7.1.*" - } } } diff --git a/symfony/composer.lock b/symfony/composer.lock index 34e856a8..3c24e5c7 100644 --- a/symfony/composer.lock +++ b/symfony/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": "4dfce564f2913d295355f360809b15a9", + "content-hash": "4c6032e867fbb268e38cacb1ca37c068", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -3818,321 +3818,6 @@ ], "time": "2024-09-21T06:09:21+00:00" }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/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-intl-normalizer", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/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-mbstring", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/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": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "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 backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php83/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/property-access", "version": "v7.1.4", @@ -12027,89 +11712,6 @@ ], "time": "2024-08-13T14:28:19+00:00" }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "symfony/polyfill-intl-normalizer": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/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/process", "version": "v7.1.5", @@ -12602,9 +12204,11 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.2", + "php": "^8.3", "ext-ctype": "*", - "ext-iconv": "*" + "ext-iconv": "*", + "ext-intl": "*", + "ext-mbstring": "*" }, "platform-dev": [], "plugin-api-version": "2.6.0" From 9b9b4b9fd1bcab887086a1396fdaa99251248c33 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 1 Oct 2024 15:51:37 +0000 Subject: [PATCH 19/61] + `App\Entity\BlobResourceGetter` like `App\Eloquent\ModelAttributeMaker` in `be` @ symfony --- symfony/src/Entity/BlobResourceGetter.php | 34 +++++++++++++++++++ .../src/Entity/Post/Content/PostContent.php | 9 +++-- symfony/src/Entity/Post/Reply.php | 9 +++-- symfony/src/Entity/Post/Thread.php | 17 ++++++---- 4 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 symfony/src/Entity/BlobResourceGetter.php diff --git a/symfony/src/Entity/BlobResourceGetter.php b/symfony/src/Entity/BlobResourceGetter.php new file mode 100644 index 00000000..6dec55f6 --- /dev/null +++ b/symfony/src/Entity/BlobResourceGetter.php @@ -0,0 +1,34 @@ + $protoBufClass + */ + public static function protoBuf($value, string $protoBufClass): ?\stdClass + { + if ($value === null) { + return null; + } + $protoBuf = new $protoBufClass(); + $protoBuf->mergeFromString(self::resource($value)); + return \Safe\json_decode($protoBuf->serializeToJsonString()); + } + + /** + * @param resource|null $value + */ + public static function resource($value): ?string + { + if ($value === null) { + return null; + } + rewind($value); + return stream_get_contents($value); + } +} diff --git a/symfony/src/Entity/Post/Content/PostContent.php b/symfony/src/Entity/Post/Content/PostContent.php index 9398bb29..f3ebc7a2 100644 --- a/symfony/src/Entity/Post/Content/PostContent.php +++ b/symfony/src/Entity/Post/Content/PostContent.php @@ -2,15 +2,18 @@ namespace App\Entity\Post\Content; +use App\Entity\BlobResourceGetter; use Doctrine\ORM\Mapping as ORM; +use TbClient\Wrapper\PostContentWrapper; #[ORM\MappedSuperclass] abstract class PostContent { - #[ORM\Column] private ?string $protoBufBytes; + /** @type resource|null */ + #[ORM\Column] private $protoBufBytes; - public function getProtoBufBytes(): ?string + public function getProtoBufBytes(): ?\stdClass { - return $this->protoBufBytes; + return BlobResourceGetter::protoBuf($this->protoBufBytes, PostContentWrapper::class); } } diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php index f3b8f178..20f135c0 100644 --- a/symfony/src/Entity/Post/Reply.php +++ b/symfony/src/Entity/Post/Reply.php @@ -2,8 +2,10 @@ namespace App\Entity\Post; +use App\Entity\BlobResourceGetter; use App\Repository\Post\ReplyRepository; use Doctrine\ORM\Mapping as ORM; +use TbClient\Post\Common\Lbs; #[ORM\Entity(repositoryClass: ReplyRepository::class)] class Reply extends Post @@ -13,7 +15,8 @@ class Reply extends Post #[ORM\Column] private int $floor; #[ORM\Column] private ?int $subReplyCount; #[ORM\Column] private ?int $isFold; - #[ORM\Column] private ?string $geolocation; + /** @type resource|null */ + #[ORM\Column] private $geolocation; #[ORM\Column] private ?int $signatureId; public function getTid(): int @@ -41,9 +44,9 @@ public function getIsFold(): ?int return $this->isFold; } - public function getGeolocation(): ?string + public function getGeolocation(): ?\stdClass { - return $this->geolocation; + return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } public function getSignatureId(): ?int diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index 15283282..1b0f7124 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -2,8 +2,11 @@ namespace App\Entity\Post; +use App\Entity\BlobResourceGetter; use App\Repository\Post\ThreadRepository; use Doctrine\ORM\Mapping as ORM; +use TbClient\Post\Common\Lbs; +use TbClient\Post\Common\Zan; #[ORM\Entity(repositoryClass: ThreadRepository::class)] class Thread extends Post @@ -18,8 +21,10 @@ class Thread extends Post #[ORM\Column] private ?int $replyCount; #[ORM\Column] private ?int $viewCount; #[ORM\Column] private ?int $shareCount; - #[ORM\Column] private ?string $zan; - #[ORM\Column] private ?string $geolocation; + /** @type resource|null */ + #[ORM\Column] private $zan; + /** @type resource|null */ + #[ORM\Column] private $geolocation; #[ORM\Column] private ?string $authorPhoneType; public function getTid(): int @@ -72,14 +77,14 @@ public function getShareCount(): ?int return $this->shareCount; } - public function getZan(): ?string + public function getZan(): ?\stdClass { - return $this->zan; + return BlobResourceGetter::protoBuf($this->zan, Zan::class); } - public function getGeolocation(): ?string + public function getGeolocation(): ?\stdClass { - return $this->geolocation; + return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } public function getAuthorPhoneType(): ?string From 4a304f5413a1f5c024a802764c2c4b5da43c4e6e Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 4 Oct 2024 06:06:50 +0000 Subject: [PATCH 20/61] * add `?? 0` for some props like `App\Eloquent\NullableNumericAttributeCast` in `be` @ symfony --- symfony/src/Entity/Post/Post.php | 8 ++++---- symfony/src/Entity/Post/Reply.php | 4 ++-- symfony/src/Entity/Post/Thread.php | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/symfony/src/Entity/Post/Post.php b/symfony/src/Entity/Post/Post.php index 1b9ccdd4..11f5d23c 100644 --- a/symfony/src/Entity/Post/Post.php +++ b/symfony/src/Entity/Post/Post.php @@ -29,13 +29,13 @@ public function getLastSeenAt(): ?int return $this->lastSeenAt; } - public function getAgreeCount(): ?int + public function getAgreeCount(): int { - return $this->agreeCount; + return $this->agreeCount ?? 0; } - public function getDisagreeCount(): ?int + public function getDisagreeCount(): int { - return $this->disagreeCount; + return $this->disagreeCount ?? 0; } } diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php index 20f135c0..312eaaea 100644 --- a/symfony/src/Entity/Post/Reply.php +++ b/symfony/src/Entity/Post/Reply.php @@ -34,9 +34,9 @@ public function getFloor(): int return $this->floor; } - public function getSubReplyCount(): ?int + public function getSubReplyCount(): int { - return $this->subReplyCount; + return $this->subReplyCount ?? 0; } public function getIsFold(): ?int diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index 1b0f7124..3b575f37 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -62,19 +62,19 @@ public function getLatestReplyPostedAt(): int return $this->latestReplyPostedAt; } - public function getReplyCount(): ?int + public function getReplyCount(): int { - return $this->replyCount; + return $this->replyCount ?? 0; } - public function getViewCount(): ?int + public function getViewCount(): int { - return $this->viewCount; + return $this->viewCount ?? 0; } - public function getShareCount(): ?int + public function getShareCount(): int { - return $this->shareCount; + return $this->shareCount ?? 0; } public function getZan(): ?\stdClass From fdd71451dffeac510b18d676ac86b6aeb6eac0b9 Mon Sep 17 00:00:00 2001 From: n0099 Date: Fri, 4 Oct 2024 06:52:27 +0000 Subject: [PATCH 21/61] + entity classes `BilibiliVote`, `Forum`, `LatestReplier` & `User` and their repositories @ symfony --- symfony/src/Entity/BilibiliVote.php | 60 ++++++++++++++++ symfony/src/Entity/Forum.php | 30 ++++++++ symfony/src/Entity/LatestReplier.php | 37 ++++++++++ symfony/src/Entity/User.php | 69 +++++++++++++++++++ .../src/Repository/BilibiliVoteRepository.php | 15 ++++ symfony/src/Repository/ForumRepository.php | 15 ++++ .../Repository/LatestReplierRepository.php | 15 ++++ symfony/src/Repository/UserRepository.php | 15 ++++ 8 files changed, 256 insertions(+) create mode 100644 symfony/src/Entity/BilibiliVote.php create mode 100644 symfony/src/Entity/Forum.php create mode 100644 symfony/src/Entity/LatestReplier.php create mode 100644 symfony/src/Entity/User.php create mode 100644 symfony/src/Repository/BilibiliVoteRepository.php create mode 100644 symfony/src/Repository/ForumRepository.php create mode 100644 symfony/src/Repository/LatestReplierRepository.php create mode 100644 symfony/src/Repository/UserRepository.php diff --git a/symfony/src/Entity/BilibiliVote.php b/symfony/src/Entity/BilibiliVote.php new file mode 100644 index 00000000..561e65ed --- /dev/null +++ b/symfony/src/Entity/BilibiliVote.php @@ -0,0 +1,60 @@ +pid; + } + + public function getAuthorUid(): int + { + return $this->authorUid; + } + + public function getAuthorExpGrade(): ?int + { + return $this->authorExpGrade; + } + + public function isValid(): bool + { + return $this->isValid; + } + + public function getVoteBy(): ?string + { + return $this->voteBy; + } + + public function getVoteFor(): ?string + { + return $this->voteFor; + } + + public function getReplyContent(): array + { + return $this->replyContent; + } + + public function getPostTime(): \DateTimeImmutable + { + return $this->postTime; + } +} diff --git a/symfony/src/Entity/Forum.php b/symfony/src/Entity/Forum.php new file mode 100644 index 00000000..2d2b9f59 --- /dev/null +++ b/symfony/src/Entity/Forum.php @@ -0,0 +1,30 @@ +fid; + } + + public function getName(): string + { + return $this->name; + } + + public function isCrawling(): bool + { + return $this->isCrawling; + } +} diff --git a/symfony/src/Entity/LatestReplier.php b/symfony/src/Entity/LatestReplier.php new file mode 100644 index 00000000..1f6e5362 --- /dev/null +++ b/symfony/src/Entity/LatestReplier.php @@ -0,0 +1,37 @@ +id; + } + + public function getUid(): ?int + { + return $this->uid; + } + + public function getName(): ?string + { + return $this->name; + } + + public function getDisplayName(): ?string + { + return BlobResourceGetter::resource($this->displayName); + } +} diff --git a/symfony/src/Entity/User.php b/symfony/src/Entity/User.php new file mode 100644 index 00000000..ed500caa --- /dev/null +++ b/symfony/src/Entity/User.php @@ -0,0 +1,69 @@ +uid; + } + + public function getName(): ?string + { + return $this->name; + } + + public function getDisplayName(): ?string + { + return BlobResourceGetter::resource($this->displayName); + } + + public function getPortrait(): string + { + return $this->portrait; + } + + public function getPortraitUpdatedAt(): ?int + { + return $this->portraitUpdatedAt; + } + + public function getGender(): ?int + { + return $this->gender; + } + + public function getFansNickname(): ?string + { + return $this->fansNickname; + } + + public function getIcon(): ?\stdClass + { + return BlobResourceGetter::protoBuf($this->icon, Icon::class); + } + + public function getIpGeolocation(): string + { + return $this->ipGeolocation; + } +} diff --git a/symfony/src/Repository/BilibiliVoteRepository.php b/symfony/src/Repository/BilibiliVoteRepository.php new file mode 100644 index 00000000..46e464e4 --- /dev/null +++ b/symfony/src/Repository/BilibiliVoteRepository.php @@ -0,0 +1,15 @@ + Date: Fri, 4 Oct 2024 07:19:13 +0000 Subject: [PATCH 22/61] + entity classes AuthorExpGrade` & `ForumModerator` and their repositories @ symfony --- .../src/Entity/Revision/AuthorExpGrade.php | 42 +++++++++++++++++++ .../src/Entity/Revision/ForumModerator.php | 36 ++++++++++++++++ .../Revision/AuthorExpGradeRepository.php | 15 +++++++ .../Revision/ForumModeratorRepository.php | 15 +++++++ 4 files changed, 108 insertions(+) create mode 100644 symfony/src/Entity/Revision/AuthorExpGrade.php create mode 100644 symfony/src/Entity/Revision/ForumModerator.php create mode 100644 symfony/src/Repository/Revision/AuthorExpGradeRepository.php create mode 100644 symfony/src/Repository/Revision/ForumModeratorRepository.php diff --git a/symfony/src/Entity/Revision/AuthorExpGrade.php b/symfony/src/Entity/Revision/AuthorExpGrade.php new file mode 100644 index 00000000..c7248513 --- /dev/null +++ b/symfony/src/Entity/Revision/AuthorExpGrade.php @@ -0,0 +1,42 @@ +discoveredAt; + } + + public function getFid(): int + { + return $this->fid; + } + + public function getUid(): int + { + return $this->uid; + } + + public function getTriggeredBy(): string + { + return $this->triggeredBy; + } + + public function getAuthorExpGrade(): int + { + return $this->authorExpGrade; + } +} diff --git a/symfony/src/Entity/Revision/ForumModerator.php b/symfony/src/Entity/Revision/ForumModerator.php new file mode 100644 index 00000000..ea19065d --- /dev/null +++ b/symfony/src/Entity/Revision/ForumModerator.php @@ -0,0 +1,36 @@ +discoveredAt; + } + + public function getFid(): int + { + return $this->fid; + } + + public function getPortrait(): string + { + return $this->portrait; + } + + public function getModeratorTypes(): string + { + return $this->moderatorTypes; + } +} diff --git a/symfony/src/Repository/Revision/AuthorExpGradeRepository.php b/symfony/src/Repository/Revision/AuthorExpGradeRepository.php new file mode 100644 index 00000000..b62f6271 --- /dev/null +++ b/symfony/src/Repository/Revision/AuthorExpGradeRepository.php @@ -0,0 +1,15 @@ + Date: Sat, 5 Oct 2024 16:13:46 +0000 Subject: [PATCH 23/61] $ mv {be,symfony}/public/react-json-view --- {be => symfony}/public/react-json-view/react-dom.js | 0 {be => symfony}/public/react-json-view/react-json-view.js | 0 {be => symfony}/public/react-json-view/react.js | 0 {be => symfony}/public/react-json-view/scheduler.js | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {be => symfony}/public/react-json-view/react-dom.js (100%) rename {be => symfony}/public/react-json-view/react-json-view.js (100%) rename {be => symfony}/public/react-json-view/react.js (100%) rename {be => symfony}/public/react-json-view/scheduler.js (100%) diff --git a/be/public/react-json-view/react-dom.js b/symfony/public/react-json-view/react-dom.js similarity index 100% rename from be/public/react-json-view/react-dom.js rename to symfony/public/react-json-view/react-dom.js diff --git a/be/public/react-json-view/react-json-view.js b/symfony/public/react-json-view/react-json-view.js similarity index 100% rename from be/public/react-json-view/react-json-view.js rename to symfony/public/react-json-view/react-json-view.js diff --git a/be/public/react-json-view/react.js b/symfony/public/react-json-view/react.js similarity index 100% rename from be/public/react-json-view/react.js rename to symfony/public/react-json-view/react.js diff --git a/be/public/react-json-view/scheduler.js b/symfony/public/react-json-view/scheduler.js similarity index 100% rename from be/public/react-json-view/scheduler.js rename to symfony/public/react-json-view/scheduler.js From 5a0416d2d660f7a6ffeaed5e96f7ed466fe93d09 Mon Sep 17 00:00:00 2001 From: n0099 Date: Sat, 5 Oct 2024 16:17:26 +0000 Subject: [PATCH 24/61] + `App\Controller\AssetController` like `Route::get('/assets/{filename}', ...)` in `be/routes/web.php` + `PrettyJsonResponse` & `ShowReactJsonView` like `App\Http\Middleware\DumpJsonResponse` in `be` + `SerializeToJson` for allowing controller methods to return an array instead of instance of class `Response` directly like laravel @ `App\EventListener` + var `ASSETS_BASE_URL` for config `framework.assets.base_urls` in `config/framework.yaml` @ .env @ symfony --- symfony/.env | 2 + symfony/config/packages/framework.yaml | 4 ++ symfony/src/Controller/AssetController.php | 37 +++++++++++++ .../src/EventListener/PrettyJsonResponse.php | 20 +++++++ symfony/src/EventListener/SerializeToJson.php | 21 ++++++++ .../src/EventListener/ShowReactJsonView.php | 53 +++++++++++++++++++ 6 files changed, 137 insertions(+) create mode 100644 symfony/src/Controller/AssetController.php create mode 100644 symfony/src/EventListener/PrettyJsonResponse.php create mode 100644 symfony/src/EventListener/SerializeToJson.php create mode 100644 symfony/src/EventListener/ShowReactJsonView.php diff --git a/symfony/.env b/symfony/.env index 3dcc9f90..f6b4a514 100644 --- a/symfony/.env +++ b/symfony/.env @@ -14,6 +14,8 @@ # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). # https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration +ASSETS_BASE_URL= + ###> symfony/framework-bundle ### APP_ENV=dev APP_SECRET= diff --git a/symfony/config/packages/framework.yaml b/symfony/config/packages/framework.yaml index 877eb25d..8ac12321 100644 --- a/symfony/config/packages/framework.yaml +++ b/symfony/config/packages/framework.yaml @@ -9,6 +9,10 @@ framework: #esi: true #fragments: true + assets: + base_urls: + - '%env(ASSETS_BASE_URL)%' + when@test: framework: test: true diff --git a/symfony/src/Controller/AssetController.php b/symfony/src/Controller/AssetController.php new file mode 100644 index 00000000..95cd88a7 --- /dev/null +++ b/symfony/src/Controller/AssetController.php @@ -0,0 +1,37 @@ + /** @lang JSRegexp */'(react(|-dom|-json-view)|scheduler)\.js' + ])] + public function getAsset(string $filename) : Response + { + return new Response( + content: preg_replace_callback_array([ + '#/npm/(?\w+)@(\d+\.?){3}/\+esm#' => + fn(array $m) => $this->assets->getUrl("assets/{$m['filename']}.js"), + '@^//# sourceMappingURL=.+$@m' => + static fn() => '', + ], $this->filesystem->readFile( + $this->parameterBag->get('kernel.project_dir') . "/public/react-json-view/$filename" + )), + headers: ['Content-Type' => 'text/javascript'] + ); + } +} diff --git a/symfony/src/EventListener/PrettyJsonResponse.php b/symfony/src/EventListener/PrettyJsonResponse.php new file mode 100644 index 00000000..36892d0f --- /dev/null +++ b/symfony/src/EventListener/PrettyJsonResponse.php @@ -0,0 +1,20 @@ +getResponse(); + if ($response instanceof JsonResponse) { + $response->setEncodingOptions(JSON_PRETTY_PRINT); + } + } +} diff --git a/symfony/src/EventListener/SerializeToJson.php b/symfony/src/EventListener/SerializeToJson.php new file mode 100644 index 00000000..534d2b11 --- /dev/null +++ b/symfony/src/EventListener/SerializeToJson.php @@ -0,0 +1,21 @@ +setResponse(JsonResponse::fromJsonString( + $this->serializer->serialize($event->getControllerResult(), 'json') + )); + } +} diff --git a/symfony/src/EventListener/ShowReactJsonView.php b/symfony/src/EventListener/ShowReactJsonView.php new file mode 100644 index 00000000..7d993b47 --- /dev/null +++ b/symfony/src/EventListener/ShowReactJsonView.php @@ -0,0 +1,53 @@ +getRequest(); + $response = $event->getResponse(); + if (!$response instanceof JsonResponse + || !in_array('text/html', $request->getAcceptableContentTypes(), true)) { + return; + } + $json = $response->getContent(); + $jsonLength = mb_strlen($json); + $assetsUrl = collect(['react-json-view', 'react', 'react-dom']) + ->mapWithKeys(fn($asset) => [$asset => $this->assets->getUrl("/assets/$asset.js")]); + $event->setResponse(new Response(<< + + $jsonLength bytes of json response for route {$request->getPathInfo()} + + +

$jsonLength bytes

+
+ + + + + HTML)); + } +} From feccb70b30136af0464f5bf179966da89372c168 Mon Sep 17 00:00:00 2001 From: n0099 Date: Sat, 5 Oct 2024 17:06:43 +0000 Subject: [PATCH 25/61] $ composer remove doctrine/dbal phpdocumentor/reflection-docblock phpstan/phpdoc-parser symfony/{browser-kit,console,css-selector,property-{access,info},stopwatch} $ composer require --dev phpstan/phpstan-symfony psalm/plugin-symfony @ symfony --- symfony/composer.json | 11 +- symfony/composer.lock | 1431 +++++++++++++++-------------------------- 2 files changed, 530 insertions(+), 912 deletions(-) diff --git a/symfony/composer.json b/symfony/composer.json index 555aadde..737cf1ba 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -9,23 +9,17 @@ "ext-iconv": "*", "ext-intl": "*", "ext-mbstring": "*", - "doctrine/dbal": "^3.9.1", "doctrine/doctrine-bundle": "^2.13.0", "doctrine/orm": "^3.2.2", "google/protobuf": "^4.28.2", "google/recaptcha": "^1.3.0", "illuminate/collections": "^11.26.0", - "phpdocumentor/reflection-docblock": "^5.4.1", - "phpstan/phpdoc-parser": "^1.32.0", "spatie/laravel-collection-macros": "^7.14.1", "spatie/regex": "^3.1.1", "symfony/asset": "^7.1.1", - "symfony/console": "^7.1.5", "symfony/dotenv": "^7.1.5", "symfony/flex": "^2.4.6", "symfony/framework-bundle": "^7.1.5", - "symfony/property-access": "^7.1.4", - "symfony/property-info": "^7.1.3", "symfony/runtime": "^7.1.1", "symfony/serializer": "^7.1.5", "symfony/twig-bundle": "^7.1.5", @@ -41,16 +35,15 @@ "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan-deprecation-rules": "^1.2.1", "phpstan/phpstan-strict-rules": "^1.6.1", + "phpstan/phpstan-symfony": "^1.4", "phpunit/phpunit": "^10.5.35", + "psalm/plugin-symfony": "^5.2", "roave/security-advisories": "dev-latest", "spatie/symfony-ignition-bundle": "^1.1.0", "squizlabs/php_codesniffer": "^3.10.3", - "symfony/browser-kit": "^7.1.1", - "symfony/css-selector": "^7.1.1", "symfony/debug-bundle": "^7.1.1", "symfony/maker-bundle": "^1.61.0", "symfony/phpunit-bridge": "^7.1.4", - "symfony/stopwatch": "^7.1.1", "symfony/web-profiler-bundle": "^7.1.4", "thecodingmachine/phpstan-safe-rule": "^1.2.0", "vimeo/psalm": "^5.26.1" diff --git a/symfony/composer.lock b/symfony/composer.lock index 3c24e5c7..35ce6663 100644 --- a/symfony/composer.lock +++ b/symfony/composer.lock @@ -4,30 +4,30 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4c6032e867fbb268e38cacb1ca37c068", + "content-hash": "1602939f6ab11bd9d6743adedf2bf8cc", "packages": [ { "name": "carbonphp/carbon-doctrine-types", - "version": "2.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", - "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^8.1" }, "conflict": { - "doctrine/dbal": "<3.7.0 || >=4.0.0" + "doctrine/dbal": "<4.0.0 || >=5.0.0" }, "require-dev": { - "doctrine/dbal": "^3.7.0", + "doctrine/dbal": "^4.0.0", "nesbot/carbon": "^2.71.0 || ^3.0.0", "phpunit/phpunit": "^10.3" }, @@ -57,7 +57,7 @@ ], "support": { "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" }, "funding": [ { @@ -73,7 +73,7 @@ "type": "tidelift" } ], - "time": "2023-12-11T17:09:12+00:00" + "time": "2024-02-09T16:56:22+00:00" }, { "name": "doctrine/cache", @@ -256,47 +256,42 @@ }, { "name": "doctrine/dbal", - "version": "3.9.1", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7" + "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", - "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/7a8252418689feb860ea8dfeab66d64a56a64df8", + "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8", "shasum": "" }, "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", + "php": "^8.1", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, "require-dev": { "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", + "jetbrains/phpstorm-stubs": "2023.2", "phpstan/phpstan": "1.12.0", + "phpstan/phpstan-phpunit": "1.4.0", "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "9.6.20", - "psalm/plugin-phpunit": "0.18.4", + "phpunit/phpunit": "10.5.30", + "psalm/plugin-phpunit": "0.19.0", "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.10.2", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0", - "vimeo/psalm": "4.30.0" + "symfony/cache": "^6.3.8|^7.0", + "symfony/console": "^5.4|^6.3|^7.0", + "vimeo/psalm": "5.25.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "autoload": { "psr-4": { @@ -349,7 +344,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.9.1" + "source": "https://github.com/doctrine/dbal/tree/4.1.1" }, "funding": [ { @@ -365,7 +360,7 @@ "type": "tidelift" } ], - "time": "2024-09-01T13:49:23+00:00" + "time": "2024-09-03T08:58:39+00:00" }, { "name": "doctrine/deprecations", @@ -1050,16 +1045,16 @@ }, { "name": "doctrine/sql-formatter", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "7f83911cc5eba870de7ebb11283972483f7e2891" + "reference": "16ca9e39877369d664f06dacde468548298bdc40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/7f83911cc5eba870de7ebb11283972483f7e2891", - "reference": "7f83911cc5eba870de7ebb11283972483f7e2891", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/16ca9e39877369d664f06dacde468548298bdc40", + "reference": "16ca9e39877369d664f06dacde468548298bdc40", "shasum": "" }, "require": { @@ -1067,6 +1062,7 @@ }, "require-dev": { "doctrine/coding-standard": "^12", + "ergebnis/phpunit-slow-test-detector": "^2.14", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^10.5", "vimeo/psalm": "^5.24" @@ -1099,9 +1095,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.4.1" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.0" }, - "time": "2024-08-05T20:32:22+00:00" + "time": "2024-09-11T07:29:40+00:00" }, { "name": "google/protobuf", @@ -1576,228 +1572,6 @@ ], "time": "2024-08-19T06:22:39+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.4.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", - "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", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.5", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^5.13" - }, - "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.4.1" - }, - "time": "2024-05-21T05:55:05+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "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.8.2" - }, - "time": "2024-02-23T11:10:43+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.32.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", - "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "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/1.32.0" - }, - "time": "2024-09-26T07:23:32+00:00" - }, { "name": "psr/cache", "version": "3.0.0", @@ -3819,30 +3593,40 @@ "time": "2024-09-21T06:09:21+00:00" }, { - "name": "symfony/property-access", + "name": "symfony/routing", "version": "v7.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/property-access.git", - "reference": "6c709f97103355016e5782d0622437ae381012ad" + "url": "https://github.com/symfony/routing.git", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/6c709f97103355016e5782d0622437ae381012ad", - "reference": "6c709f97103355016e5782d0622437ae381012ad", + "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/property-info": "^6.4|^7.0" + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "symfony/cache": "^6.4|^7.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", "autoload": { "psr-4": { - "Symfony\\Component\\PropertyAccess\\": "" + "Symfony\\Component\\Routing\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3862,177 +3646,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides functions to read and write from/to an object or array using a simple string notation", - "homepage": "https://symfony.com", - "keywords": [ - "access", - "array", - "extraction", - "index", - "injection", - "object", - "property", - "property-path", - "reflection" - ], - "support": { - "source": "https://github.com/symfony/property-access/tree/v7.1.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-08-30T16:12:47+00:00" - }, - { - "name": "symfony/property-info", - "version": "v7.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/property-info.git", - "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", - "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/string": "^6.4|^7.0", - "symfony/type-info": "^7.1" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<5.2", - "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<6.4", - "symfony/serializer": "<6.4" - }, - "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", - "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\PropertyInfo\\": "" - }, - "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": "Extracts information about PHP class' properties using metadata of popular sources", - "homepage": "https://symfony.com", - "keywords": [ - "doctrine", - "phpdoc", - "property", - "symfony", - "type", - "validator" - ], - "support": { - "source": "https://github.com/symfony/property-info/tree/v7.1.3" - }, - "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-07-26T07:36:36+00:00" - }, - { - "name": "symfony/routing", - "version": "v7.1.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" - }, - "require-dev": { - "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", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "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": "Maps an HTTP request to a set of configuration variables", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", @@ -4772,88 +4386,6 @@ ], "time": "2024-09-08T12:32:26+00:00" }, - { - "name": "symfony/type-info", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/type-info.git", - "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/9f6094aa900d2c06bd61576a6f279d4ac441515f", - "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/container": "^1.1|^2.0" - }, - "conflict": { - "phpstan/phpdoc-parser": "<1.0", - "symfony/dependency-injection": "<6.4", - "symfony/property-info": "<6.4" - }, - "require-dev": { - "phpstan/phpdoc-parser": "^1.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\TypeInfo\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "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": "Extracts PHP types information.", - "homepage": "https://symfony.com", - "keywords": [ - "PHPStan", - "phpdoc", - "symfony", - "type" - ], - "support": { - "source": "https://github.com/symfony/type-info/tree/v7.1.5" - }, - "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-19T21:48:23+00:00" - }, { "name": "symfony/var-dumper", "version": "v7.1.5", @@ -5375,41 +4907,48 @@ } ], "time": "2022-03-08T17:03:00+00:00" - }, + } + ], + "packages-dev": [ { - "name": "webmozart/assert", - "version": "1.11.0", + "name": "amphp/amp", + "version": "v2.6.4", "source": { "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "url": "https://github.com/amphp/amp.git", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", "shasum": "" }, "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^8.5.13" + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "react/promise": "^2", + "vimeo/psalm": "^3.12" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-master": "2.x-dev" } }, "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], "psr-4": { - "Webmozart\\Assert\\": "src/" + "Amp\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", @@ -5418,85 +4957,20 @@ ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.4", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", - "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "react/promise": "^2", - "vimeo/psalm": "^3.12" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], "description": "A non-blocking concurrency framework for PHP applications.", @@ -6813,73 +6287,6 @@ }, "time": "2024-09-24T17:22:50+00:00" }, - { - "name": "masterminds/html5", - "version": "2.9.0", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Masterminds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ], - "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" - }, - "time": "2024-03-31T07:05:07+00:00" - }, { "name": "microsoft/tolerant-php-parser", "version": "v0.1.2", @@ -7431,6 +6838,181 @@ }, "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.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "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", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "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.4.1" + }, + "time": "2024-05-21T05:55:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "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.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, { "name": "phpmd/phpmd", "version": "2.15.0", @@ -7562,6 +7144,53 @@ }, "time": "2024-09-04T20:21:43+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.32.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "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/1.32.0" + }, + "time": "2024-09-26T07:23:32+00:00" + }, { "name": "phpstan/phpstan", "version": "1.12.5", @@ -7716,6 +7345,78 @@ }, "time": "2024-09-20T14:04:44+00:00" }, + { + "name": "phpstan/phpstan-symfony", + "version": "1.4.10", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-symfony.git", + "reference": "f7d5782044bedf93aeb3f38e09c91148ee90e5a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/f7d5782044bedf93aeb3f38e09c91148ee90e5a1", + "reference": "f7d5782044bedf93aeb3f38e09c91148ee90e5a1", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.12" + }, + "conflict": { + "symfony/framework-bundle": "<3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^8.5.29 || ^9.5", + "psr/container": "1.0 || 1.1.1", + "symfony/config": "^5.4 || ^6.1", + "symfony/console": "^5.4 || ^6.1", + "symfony/dependency-injection": "^5.4 || ^6.1", + "symfony/form": "^5.4 || ^6.1", + "symfony/framework-bundle": "^5.4 || ^6.1", + "symfony/http-foundation": "^5.4 || ^6.1", + "symfony/messenger": "^5.4", + "symfony/polyfill-php80": "^1.24", + "symfony/serializer": "^5.4", + "symfony/service-contracts": "^2.2.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukáš Unger", + "email": "looky.msc@gmail.com", + "homepage": "https://lookyman.net" + } + ], + "description": "Symfony Framework extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-symfony/issues", + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.10" + }, + "time": "2024-09-26T18:14:50+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "10.1.16", @@ -8122,21 +7823,86 @@ "security": "https://github.com/sebastianbergmann/phpunit/security/policy", "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.35" }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, + "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-09-19T10:52:21+00:00" + }, + { + "name": "psalm/plugin-symfony", + "version": "v5.2.5", + "source": { + "type": "git", + "url": "https://github.com/psalm/psalm-plugin-symfony.git", + "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/psalm/psalm-plugin-symfony/zipball/fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", + "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": "^8.1", + "symfony/framework-bundle": "^5.0 || ^6.0 || ^7.0", + "vimeo/psalm": "^5.16" + }, + "require-dev": { + "doctrine/annotations": "^1.8|^2", + "doctrine/orm": "^2.9", + "phpunit/phpunit": "~7.5 || ~9.5", + "symfony/cache-contracts": "^1.0 || ^2.0", + "symfony/console": "*", + "symfony/form": "^5.0 || ^6.0 || ^7.0", + "symfony/messenger": "^5.0 || ^6.0 || ^7.0", + "symfony/security-core": "*", + "symfony/serializer": "^5.0 || ^6.0 || ^7.0", + "symfony/validator": "*", + "twig/twig": "^2.10 || ^3.0", + "weirdan/codeception-psalm-module": "dev-master" + }, + "suggest": { + "weirdan/doctrine-psalm-plugin": "If Doctrine is used, it is recommended install this plugin" + }, + "type": "psalm-plugin", + "extra": { + "psalm": { + "pluginClass": "Psalm\\SymfonyPsalmPlugin\\Plugin" + } + }, + "autoload": { + "psr-4": { + "Psalm\\SymfonyPsalmPlugin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "name": "Farhad Safarov", + "email": "farhad.safarov@gmail.com" } ], - "time": "2024-09-19T10:52:21+00:00" + "description": "Psalm Plugin for Symfony", + "support": { + "issues": "https://github.com/psalm/psalm-plugin-symfony/issues", + "source": "https://github.com/psalm/psalm-plugin-symfony/tree/v5.2.5" + }, + "time": "2024-07-03T11:57:02+00:00" }, { "name": "react/cache", @@ -8674,12 +8440,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "6f63660a573ec1e6d48d54ff7c44dfb1e303f30d" + "reference": "c90faeb954dbf0e3bb0657496199afeb99e2d4dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/6f63660a573ec1e6d48d54ff7c44dfb1e303f30d", - "reference": "6f63660a573ec1e6d48d54ff7c44dfb1e303f30d", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c90faeb954dbf0e3bb0657496199afeb99e2d4dd", + "reference": "c90faeb954dbf0e3bb0657496199afeb99e2d4dd", "shasum": "" }, "conflict": { @@ -8780,7 +8546,7 @@ "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", - "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/contao": "<=5.4.1", "contao/core": "<3.5.39", "contao/core-bundle": "<4.13.49|>=5,<5.3.15|>=5.4,<5.4.3", "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", @@ -8803,6 +8569,7 @@ "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", "desperado/xml-bundle": "<=0.1.7", + "dev-lancer/minecraft-motd-parser": "<=1.0.5", "devgroup/dotplant": "<2020.09.14-dev", "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", "doctrine/annotations": "<1.2.7", @@ -8817,9 +8584,9 @@ "dolibarr/dolibarr": "<19.0.2", "dompdf/dompdf": "<2.0.4", "doublethreedigital/guest-entries": "<3.1.2", - "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<=11.0.4", - "drupal/core-recommended": ">=8,<=11.0.4", - "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<=11.0.4", + "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.3.6|>=11,<11.0.5", + "drupal/core-recommended": ">=8,<10.3.6|>=11,<11.0.5", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<10.3.6|>=11,<11.0.5", "duncanmcclean/guest-entries": "<3.1.2", "dweeves/magmi": "<=0.7.24", "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", @@ -9083,7 +8850,7 @@ "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", - "october/october": "<=3.4.4", + "october/october": "<=3.6.4", "october/rain": "<1.0.472|>=1.1,<1.1.2", "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", "omeka/omeka-s": "<4.0.3", @@ -9263,7 +9030,7 @@ "subhh/libconnect": "<7.0.8|>=8,<8.1", "sukohi/surpass": "<1", "sulu/form-bundle": ">=2,<2.5.3", - "sulu/sulu": "<1.6.44|>=2,<2.4.17|>=2.5,<2.5.13", + "sulu/sulu": "<1.6.44|>=2,<2.6.5", "sumocoders/framework-user-bundle": "<1.4", "superbig/craft-audit": "<3.0.2", "swag/paypal": "<5.4.4", @@ -9335,7 +9102,7 @@ "topthink/thinkphp": "<=3.2.3", "torrentpier/torrentpier": "<=2.4.3", "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", - "tribalsystems/zenario": "<9.5.60602", + "tribalsystems/zenario": "<=9.7.61188", "truckersmp/phpwhois": "<=4.3.1", "ttskch/pagination-service-provider": "<1", "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", @@ -9494,7 +9261,7 @@ "type": "tidelift" } ], - "time": "2024-09-30T18:06:02+00:00" + "time": "2024-10-04T19:04:42+00:00" }, { "name": "sabre/event", @@ -11113,139 +10880,6 @@ ], "time": "2024-09-18T10:38:58+00:00" }, - { - "name": "symfony/browser-kit", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "9c13742e3175b5815e272b981876ae329bec2040" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/9c13742e3175b5815e272b981876ae329bec2040", - "reference": "9c13742e3175b5815e272b981876ae329bec2040", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/dom-crawler": "^6.4|^7.0" - }, - "require-dev": { - "symfony/css-selector": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "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": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.1.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-05-31T14:57:53+00:00" - }, - { - "name": "symfony/css-selector", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "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": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.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-05-31T14:57:53+00:00" - }, { "name": "symfony/debug-bundle", "version": "v7.1.1", @@ -11320,73 +10954,6 @@ ], "time": "2024-05-31T14:55:39+00:00" }, - { - "name": "symfony/dom-crawler", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b92af238457a7cdd2738f941cd525d76313e8283" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b92af238457a7cdd2738f941cd525d76313e8283", - "reference": "b92af238457a7cdd2738f941cd525d76313e8283", - "shasum": "" - }, - "require": { - "masterminds/html5": "^2.6", - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "symfony/css-selector": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases DOM navigation for HTML and XML documents", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.1.5" - }, - "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-15T06:48:17+00:00" - }, { "name": "symfony/maker-bundle", "version": "v1.61.0", @@ -12194,6 +11761,64 @@ "source": "https://github.com/vimeo/psalm" }, "time": "2024-09-08T18:53:08+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" } ], "aliases": [], From 3be6b04cfdda4565d340acc8019211e73f67e3af Mon Sep 17 00:00:00 2001 From: n0099 Date: Sat, 5 Oct 2024 18:23:24 +0000 Subject: [PATCH 26/61] * replace the default normalizer for serializer `ObjectNormalizer` that requires `symfony/property-access` which has been removed in feccb70b30136af0464f5bf179966da89372c168 with `GetSetMethodNormalizer` @ config/services.yaml * now return the parsed protoBuf message directly without converting it to `stdClass` with `json_(de|en)code()` @ `BlobResourceGetter->protoBuf()` * replace `resource|null` with `?resource` in phpdoc typing @ `App\Entity` @ symfony --- symfony/config/services.yaml | 4 ++++ symfony/src/Entity/BlobResourceGetter.php | 12 +++++++----- symfony/src/Entity/LatestReplier.php | 2 +- symfony/src/Entity/Post/Content/PostContent.php | 4 ++-- symfony/src/Entity/Post/Reply.php | 4 ++-- symfony/src/Entity/Post/Thread.php | 8 ++++---- symfony/src/Entity/User.php | 6 +++--- 7 files changed, 23 insertions(+), 17 deletions(-) diff --git a/symfony/config/services.yaml b/symfony/config/services.yaml index b107f6f0..fb242485 100644 --- a/symfony/config/services.yaml +++ b/symfony/config/services.yaml @@ -23,3 +23,7 @@ services: # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + + get_set_method_normalizer: + class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer + tags: [serializer.normalizer] diff --git a/symfony/src/Entity/BlobResourceGetter.php b/symfony/src/Entity/BlobResourceGetter.php index 6dec55f6..e4b927d4 100644 --- a/symfony/src/Entity/BlobResourceGetter.php +++ b/symfony/src/Entity/BlobResourceGetter.php @@ -7,21 +7,23 @@ class BlobResourceGetter { /** - * @param resource|null $value - * @param class-string $protoBufClass + * @param ?resource $value + * @param class-string $protoBufClass + * @template T extends Message + * @return ?T */ - public static function protoBuf($value, string $protoBufClass): ?\stdClass + public static function protoBuf($value, string $protoBufClass): ?Message { if ($value === null) { return null; } $protoBuf = new $protoBufClass(); $protoBuf->mergeFromString(self::resource($value)); - return \Safe\json_decode($protoBuf->serializeToJsonString()); + return $protoBuf; } /** - * @param resource|null $value + * @param ?resource $value */ public static function resource($value): ?string { diff --git a/symfony/src/Entity/LatestReplier.php b/symfony/src/Entity/LatestReplier.php index 1f6e5362..55bd0dab 100644 --- a/symfony/src/Entity/LatestReplier.php +++ b/symfony/src/Entity/LatestReplier.php @@ -12,7 +12,7 @@ class LatestReplier extends TimestampedEntity #[ORM\Column, ORM\Id] private int $id; #[ORM\Column] private ?int $uid; #[ORM\Column] private ?string $name; - /** @type resource|null */ + /** @type ?resource */ #[ORM\Column] private $displayName; public function getId(): int diff --git a/symfony/src/Entity/Post/Content/PostContent.php b/symfony/src/Entity/Post/Content/PostContent.php index f3ebc7a2..1cbb057d 100644 --- a/symfony/src/Entity/Post/Content/PostContent.php +++ b/symfony/src/Entity/Post/Content/PostContent.php @@ -9,10 +9,10 @@ #[ORM\MappedSuperclass] abstract class PostContent { - /** @type resource|null */ + /** @type ?resource */ #[ORM\Column] private $protoBufBytes; - public function getProtoBufBytes(): ?\stdClass + public function getProtoBufBytes(): ?PostContentWrapper { return BlobResourceGetter::protoBuf($this->protoBufBytes, PostContentWrapper::class); } diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php index 312eaaea..750172ee 100644 --- a/symfony/src/Entity/Post/Reply.php +++ b/symfony/src/Entity/Post/Reply.php @@ -15,7 +15,7 @@ class Reply extends Post #[ORM\Column] private int $floor; #[ORM\Column] private ?int $subReplyCount; #[ORM\Column] private ?int $isFold; - /** @type resource|null */ + /** @type ?resource */ #[ORM\Column] private $geolocation; #[ORM\Column] private ?int $signatureId; @@ -44,7 +44,7 @@ public function getIsFold(): ?int return $this->isFold; } - public function getGeolocation(): ?\stdClass + public function getGeolocation(): ?Lbs { return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index 3b575f37..70941e6d 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -21,9 +21,9 @@ class Thread extends Post #[ORM\Column] private ?int $replyCount; #[ORM\Column] private ?int $viewCount; #[ORM\Column] private ?int $shareCount; - /** @type resource|null */ + /** @type ?resource */ #[ORM\Column] private $zan; - /** @type resource|null */ + /** @type ?resource */ #[ORM\Column] private $geolocation; #[ORM\Column] private ?string $authorPhoneType; @@ -77,12 +77,12 @@ public function getShareCount(): int return $this->shareCount ?? 0; } - public function getZan(): ?\stdClass + public function getZan(): ?Zan { return BlobResourceGetter::protoBuf($this->zan, Zan::class); } - public function getGeolocation(): ?\stdClass + public function getGeolocation(): ?Lbs { return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } diff --git a/symfony/src/Entity/User.php b/symfony/src/Entity/User.php index ed500caa..6fac4103 100644 --- a/symfony/src/Entity/User.php +++ b/symfony/src/Entity/User.php @@ -12,13 +12,13 @@ class User extends TimestampedEntity { #[ORM\Column, ORM\Id] private int $uid; #[ORM\Column] private ?string $name; - /** @type resource|null */ + /** @type ?resource */ #[ORM\Column] private $displayName; #[ORM\Column] private string $portrait; #[ORM\Column] private ?int $portraitUpdatedAt; #[ORM\Column] private ?int $gender; #[ORM\Column] private ?string $fansNickname; - /** @type resource|null */ + /** @type ?resource */ #[ORM\Column] private $icon; #[ORM\Column] private string $ipGeolocation; @@ -57,7 +57,7 @@ public function getFansNickname(): ?string return $this->fansNickname; } - public function getIcon(): ?\stdClass + public function getIcon(): ?Icon { return BlobResourceGetter::protoBuf($this->icon, Icon::class); } From 49cfae0ffa8abf3a02d4483cba94589ee70fb1d2 Mon Sep 17 00:00:00 2001 From: n0099 Date: Sun, 6 Oct 2024 00:58:02 +0000 Subject: [PATCH 27/61] $ composer require symfony/validator $ composer bump @ symfony --- symfony/composer.json | 5 +- symfony/composer.lock | 99 +++++++++++++++++++++++++- symfony/config/packages/validator.yaml | 11 +++ symfony/symfony.lock | 12 ++++ 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 symfony/config/packages/validator.yaml diff --git a/symfony/composer.json b/symfony/composer.json index 737cf1ba..402a8790 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -23,6 +23,7 @@ "symfony/runtime": "^7.1.1", "symfony/serializer": "^7.1.5", "symfony/twig-bundle": "^7.1.5", + "symfony/validator": "7.1.*", "symfony/yaml": "^7.1.5", "thecodingmachine/safe": "^2.5.0" }, @@ -35,9 +36,9 @@ "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan-deprecation-rules": "^1.2.1", "phpstan/phpstan-strict-rules": "^1.6.1", - "phpstan/phpstan-symfony": "^1.4", + "phpstan/phpstan-symfony": "^1.4.10", "phpunit/phpunit": "^10.5.35", - "psalm/plugin-symfony": "^5.2", + "psalm/plugin-symfony": "^5.2.5", "roave/security-advisories": "dev-latest", "spatie/symfony-ignition-bundle": "^1.1.0", "squizlabs/php_codesniffer": "^3.10.3", diff --git a/symfony/composer.lock b/symfony/composer.lock index 35ce6663..6054793a 100644 --- a/symfony/composer.lock +++ b/symfony/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": "1602939f6ab11bd9d6743adedf2bf8cc", + "content-hash": "ec354b2363ef2bdfa015b2927b3a5679", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -4386,6 +4386,103 @@ ], "time": "2024-09-08T12:32:26+00:00" }, + { + "name": "symfony/validator", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "e57592782dc2a86997477f28164c51af53512ad8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/e57592782dc2a86997477f28164c51af53512ad8", + "reference": "e57592782dc2a86997477f28164c51af53512ad8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/type-info": "^7.1", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] + }, + "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 validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v7.1.5" + }, + "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-20T08:28:38+00:00" + }, { "name": "symfony/var-dumper", "version": "v7.1.5", diff --git a/symfony/config/packages/validator.yaml b/symfony/config/packages/validator.yaml new file mode 100644 index 00000000..dd47a6ad --- /dev/null +++ b/symfony/config/packages/validator.yaml @@ -0,0 +1,11 @@ +framework: + validation: + # Enables validator auto-mapping support. + # For instance, basic validation constraints will be inferred from Doctrine's metadata. + #auto_mapping: + # App\Entity\: [] + +when@test: + framework: + validation: + not_compromised_password: false diff --git a/symfony/symfony.lock b/symfony/symfony.lock index edf3d3e6..198d1df1 100644 --- a/symfony/symfony.lock +++ b/symfony/symfony.lock @@ -205,6 +205,18 @@ "./templates/base.html.twig" ] }, + "symfony/validator": { + "version": "7.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.0", + "ref": "8c1c4e28d26a124b0bb273f537ca8ce443472bfd" + }, + "files": [ + "./config/packages/validator.yaml" + ] + }, "symfony/web-profiler-bundle": { "version": "7.1", "recipe": { From 7b94b658348e51af9ae22e22f1247046ab71adc5 Mon Sep 17 00:00:00 2001 From: n0099 Date: Sun, 6 Oct 2024 01:47:05 +0000 Subject: [PATCH 28/61] + `App\Helper` like its nameshake in `be` * fix referring `App\Entity\LatestReplier` @ `App\Repository\ForumRepository` * replace `ParameterBagInterface->get()` with `AbstractController->getParameter()` @ `App\Controller\AssetController` * lower priority to prevent dysfunction `#[Symfony\Bridge\Twig\Attribute\Template]` on controller routes that returning non `Response` @ `App\EventListener\SerializeToJson` * rename var `ASSETS_BASE_URL` to `APP_BASE_URL_ASSETS` + `APP_BASE_URL_FE` for `parameters.app.base_url.fe` in `config/services.yaml` @ .env @ symfony --- symfony/.env | 3 +- symfony/config/packages/framework.yaml | 2 +- symfony/config/services.yaml | 1 + symfony/src/Controller/AssetController.php | 3 +- symfony/src/EventListener/SerializeToJson.php | 2 +- symfony/src/Helper.php | 98 +++++++++++++++++++ symfony/src/Repository/ForumRepository.php | 4 +- 7 files changed, 106 insertions(+), 7 deletions(-) create mode 100644 symfony/src/Helper.php diff --git a/symfony/.env b/symfony/.env index f6b4a514..97473132 100644 --- a/symfony/.env +++ b/symfony/.env @@ -14,7 +14,8 @@ # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). # https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration -ASSETS_BASE_URL= +APP_BASE_URL_ASSETS= +APP_BASE_URL_FE= ###> symfony/framework-bundle ### APP_ENV=dev diff --git a/symfony/config/packages/framework.yaml b/symfony/config/packages/framework.yaml index 8ac12321..70c89a50 100644 --- a/symfony/config/packages/framework.yaml +++ b/symfony/config/packages/framework.yaml @@ -11,7 +11,7 @@ framework: assets: base_urls: - - '%env(ASSETS_BASE_URL)%' + - '%env(APP_BASE_URL_ASSETS)%' when@test: framework: diff --git a/symfony/config/services.yaml b/symfony/config/services.yaml index fb242485..99e1a240 100644 --- a/symfony/config/services.yaml +++ b/symfony/config/services.yaml @@ -4,6 +4,7 @@ # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: + app.base_url.fe: '%env(APP_BASE_URL_FE)%' google_recaptcha_site_key: '%env(GOOGLE_RECAPTCHA_SITE_KEY)%' services: diff --git a/symfony/src/Controller/AssetController.php b/symfony/src/Controller/AssetController.php index 95cd88a7..fd4bd680 100644 --- a/symfony/src/Controller/AssetController.php +++ b/symfony/src/Controller/AssetController.php @@ -12,7 +12,6 @@ class AssetController extends AbstractController { public function __construct( - private readonly ParameterBagInterface $parameterBag, private readonly Filesystem $filesystem, private readonly Packages $assets, ) {} @@ -29,7 +28,7 @@ public function getAsset(string $filename) : Response '@^//# sourceMappingURL=.+$@m' => static fn() => '', ], $this->filesystem->readFile( - $this->parameterBag->get('kernel.project_dir') . "/public/react-json-view/$filename" + $this->getParameter('kernel.project_dir') . "/public/react-json-view/$filename" )), headers: ['Content-Type' => 'text/javascript'] ); diff --git a/symfony/src/EventListener/SerializeToJson.php b/symfony/src/EventListener/SerializeToJson.php index 534d2b11..cef9e266 100644 --- a/symfony/src/EventListener/SerializeToJson.php +++ b/symfony/src/EventListener/SerializeToJson.php @@ -7,7 +7,7 @@ use Symfony\Component\HttpKernel\Event\ViewEvent; use Symfony\Component\Serializer\SerializerInterface; -#[AsEventListener] +#[AsEventListener(priority: -129)] // https://github.com/symfony/twig-bridge/blob/d63fde6a6142ffbab5fe6ee252b668b9485bfc0d/EventListener/TemplateAttributeListener.php#L66 readonly class SerializeToJson { public function __construct(private SerializerInterface $serializer) {} diff --git a/symfony/src/Helper.php b/symfony/src/Helper.php new file mode 100644 index 00000000..f4c90614 --- /dev/null +++ b/symfony/src/Helper.php @@ -0,0 +1,98 @@ + 'threads', + 'reply' => 'replies', + 'subReply' => 'subReplies', + ]; + + public const array POST_TYPE_PLURAL_TO_SINGULAR = [ + 'threads' => 'thread', + 'replies' => 'reply', + 'subReplies' => 'subReply', + ]; + + public const array POST_ID_TO_TYPE_PLURAL = [ + 'tid' => 'threads', + 'pid' => 'replies', + 'spid' => 'subReplies', + ]; + + public const array POST_ID_TO_TYPE = [ + 'tid' => 'thread', + 'pid' => 'reply', + 'spid' => 'subReply', + ]; + + public const array POST_TYPE_TO_ID = [ + 'thread' => 'tid', + 'reply' => 'pid', + 'subReply' => 'spid', + ]; + + public static function abortAPIIf(int $errorCode, bool $condition): void + { + if ($condition) { + self::abortAPI($errorCode); + } + } + + public static function abortAPIIfNot(int $errorCode, bool $condition): void + { + if (!$condition) { + self::abortAPI($errorCode); + } + } + + public const array ERROR_STATUS_CODE_INFO = [ + // httpStatusCode => [ errorCode => errorInfo ] + 400 => [ + // 40000 => App\Exceptions\Handler::convertValidationExceptionToResponse() + 40001 => '帖子查询类型必须为索引或搜索查询', + 40002 => '搜索查询必须指定查询贴吧', + 40003 => '部分查询参数与查询帖子类型要求不匹配', + 40004 => '排序方式与查询帖子类型要求不匹配', + 40005 => '提供了多个唯一查询参数', + ], + 401 => [ + 40101 => 'Google reCAPTCHA 验证未通过 请刷新页面/更换设备/网络环境后重试', + ], + 404 => [ + 40401 => '帖子查询结果为空', + 40402 => '用户查询结果为空', + 40403 => '吧帖量统计查询结果为空', + 40406 => '指定查询的贴吧不存在', + ], + 500 => [ + 50001 => '数据库中存在多个贴吧表存储了该 ID 的帖子', + ], + ]; + + public static function abortAPI(int $errorCode): never + { + $statusCode = 0; + $errorInfo = null; + foreach (self::ERROR_STATUS_CODE_INFO as $infoStatusCode => $infoErrorInfo) { + if (\array_key_exists($errorCode, $infoErrorInfo)) { + $statusCode = $infoStatusCode; + $errorInfo = $infoErrorInfo[$errorCode]; + } + } + if ($errorInfo === null) { + throw new \InvalidArgumentException('Given error code doesn\'t existed'); + } + throw new HttpException($statusCode, \Safe\json_encode(compact('errorCode', 'errorInfo'))); + } +} diff --git a/symfony/src/Repository/ForumRepository.php b/symfony/src/Repository/ForumRepository.php index 3c512337..8e4bb30a 100644 --- a/symfony/src/Repository/ForumRepository.php +++ b/symfony/src/Repository/ForumRepository.php @@ -2,7 +2,7 @@ namespace App\Repository; -use App\Entity\LatestReplier; +use App\Entity\Forum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -10,6 +10,6 @@ class ForumRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { - parent::__construct($registry, LatestReplier::class); + parent::__construct($registry, Forum::class); } } From 7c51c8610a089a0b57bf2c68201f25a027b628b5 Mon Sep 17 00:00:00 2001 From: n0099 Date: Sun, 6 Oct 2024 01:51:50 +0000 Subject: [PATCH 29/61] + `App\Controller\SitemapController` + `templates/sitemaps/{forum,thread}s.xml.twig` like `resources/views/sitemaps/{forum,thread}s.blade.php` in `be` + `App\Validator` to throw `ValidationFailedException`: https://stackoverflow.com/questions/47875979/constraintviolationlistinterface-to-exception-in-symfony/76004283#76004283 + methods `getOrderedForumsId()` & `isForumExists()` for `App\Controller\SitemapController` @ `ForumRepository` + methods `getThreadsIdByChunks()` & `getThreadsIdAfter()` for `App\Controller\SitemapController` @ `ThreadRepository` @ `App\Repository` @ symfony --- symfony/src/Controller/SitemapController.php | 73 +++++++++++++++++++ symfony/src/Repository/ForumRepository.php | 16 ++++ .../src/Repository/Post/ThreadRepository.php | 23 ++++++ symfony/src/Validator.php | 20 +++++ symfony/templates/sitemaps/forums.xml.twig | 18 +++++ symfony/templates/sitemaps/threads.xml.twig | 11 +++ 6 files changed, 161 insertions(+) create mode 100644 symfony/src/Controller/SitemapController.php create mode 100644 symfony/src/Validator.php create mode 100644 symfony/templates/sitemaps/forums.xml.twig create mode 100644 symfony/templates/sitemaps/threads.xml.twig diff --git a/symfony/src/Controller/SitemapController.php b/symfony/src/Controller/SitemapController.php new file mode 100644 index 00000000..d83ad7f2 --- /dev/null +++ b/symfony/src/Controller/SitemapController.php @@ -0,0 +1,73 @@ +forumRepository->getOrderedForumsId()) + ->mapWithKeys(fn(int $fid) => [ + $fid => $this->postRepositoryFactory->newThread($fid)->getThreadsIdByChunks(self::$maxUrls), + ]) + ->toArray(); + + return $this->cache->get( + '/sitemaps/forums', + function (ItemInterface $item) use ($threadsIdKeyByFid) { + $item->expiresAfter(86400); + return $this->renderXml( + 'sitemaps/forums.xml.twig', + ['threads_id_key_by_fid' => $threadsIdKeyByFid], + ); + }); + } + + #[Route('/sitemaps/forums/{fid}/threads', requirements: ['fid' => /** @lang JSRegexp */'\d+'])] + public function threads(Request $request, Validator $validator, int $fid): Response + { + $cursor = $request->query->get('cursor') ?? 0; + $validator($cursor, new Assert\Type('digit')); + Helper::abortAPIIfNot(40406, $this->forumRepository->isForumExists($fid)); + + return $this->cache->get( + "/sitemaps/forums/$fid/threads?cursor=$cursor", + function (ItemInterface $item) use ($fid, $cursor) { + $item->expiresAfter(86400); + return $this->renderXml( + 'sitemaps/threads.xml.twig', + [ + 'threads_id' => + $this->postRepositoryFactory->newThread($fid)->getThreadsIdAfter($cursor, self::$maxUrls), + 'base_url_fe' => $this->getParameter('app.base_url.fe') + ] + ); + }); + } + + private function renderXml(string $view, array $parameters): Response + { + return $this->render($view, $parameters, new Response(headers: ['Content-Type' => 'text/xml'])); + } +} diff --git a/symfony/src/Repository/ForumRepository.php b/symfony/src/Repository/ForumRepository.php index 8e4bb30a..8dcbb1db 100644 --- a/symfony/src/Repository/ForumRepository.php +++ b/symfony/src/Repository/ForumRepository.php @@ -4,6 +4,7 @@ use App\Entity\Forum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\ORM\AbstractQuery; use Doctrine\Persistence\ManagerRegistry; class ForumRepository extends ServiceEntityRepository @@ -12,4 +13,19 @@ public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Forum::class); } + + public function getOrderedForumsId(): array + { + return $this->getEntityManager() + ->createQuery(/** @lang DQL */'SELECT t.fid FROM App\Entity\Forum t ORDER BY t.fid') + ->getSingleColumnResult(); + } + + public function isForumExists(int $fid): bool + { + return $this->getEntityManager() + ->createQuery(/** @lang DQL */'SELECT 1 FROM App\Entity\Forum t WHERE t.fid = :fid') + ->setParameter('fid', $fid) + ->getOneOrNullResult(AbstractQuery::HYDRATE_SINGLE_SCALAR) === 1; + } } diff --git a/symfony/src/Repository/Post/ThreadRepository.php b/symfony/src/Repository/Post/ThreadRepository.php index a9fe1fd7..207f33b2 100644 --- a/symfony/src/Repository/Post/ThreadRepository.php +++ b/symfony/src/Repository/Post/ThreadRepository.php @@ -17,4 +17,27 @@ public function __construct(ManagerRegistry $registry, EntityManagerInterface $e { parent::__construct($registry, $entityManager, Thread::class, 'thread', $fid); } + + public function getThreadsIdByChunks(int $chunkSize): array + { + // https://github.com/doctrine/orm/issues/3542 + // https://github.com/doctrine/dbal/issues/5018#issuecomment-2395177479 + $entityManager = $this->getEntityManager(); + $connection = $entityManager->getConnection(); + $tableName = $connection->quoteIdentifier($entityManager->getClassMetadata(Thread::class)->getTableName()); + $statement = $connection->prepare(<<<"SQL" + SELECT tid FROM ( + SELECT tid, ROW_NUMBER() OVER (ORDER BY tid) rn FROM $tableName + ) t WHERE rn % :chunkSize = 0 + SQL); + $statement->bindValue('chunkSize', $chunkSize); + return $statement->executeQuery()->fetchFirstColumn(); + } + + public function getThreadsIdAfter(int $after, int $limit): array + { + return $this->getEntityManager()->createQuery(<<<'DQL' + SELECT t.tid FROM App\Entity\Post\Thread t WHERE t.tid > :after ORDER BY t.tid + DQL)->setMaxResults($limit)->setParameters(compact('after'))->getSingleColumnResult(); + } } diff --git a/symfony/src/Validator.php b/symfony/src/Validator.php new file mode 100644 index 00000000..77b210f3 --- /dev/null +++ b/symfony/src/Validator.php @@ -0,0 +1,20 @@ +validator->validate($value, $constraints); + if ($errors->count() !== 0) { + throw new ValidationFailedException(null, $errors); + } + } +} diff --git a/symfony/templates/sitemaps/forums.xml.twig b/symfony/templates/sitemaps/forums.xml.twig new file mode 100644 index 00000000..3db264ba --- /dev/null +++ b/symfony/templates/sitemaps/forums.xml.twig @@ -0,0 +1,18 @@ + + + {% for fid, tids in threads_id_key_by_fid %} + {% set threads_sitemap_path = + app.request.schemeAndHttpHost ~ app.request.baseUrl ~ "/sitemaps/forums/#{fid}/threads" %} + + {{ threads_sitemap_path }} + + {% for tid in tids %} + + {{ threads_sitemap_path }}?cursor={{ tid }} + + {% endfor %} + {% endfor %} + diff --git a/symfony/templates/sitemaps/threads.xml.twig b/symfony/templates/sitemaps/threads.xml.twig new file mode 100644 index 00000000..61a4fe0a --- /dev/null +++ b/symfony/templates/sitemaps/threads.xml.twig @@ -0,0 +1,11 @@ + + + {% for tid in threads_id %} + + {{ base_url_fe }}/posts/tid/{{ tid }} + + {% endfor %} + From e880e9cd26fba5c740461cd82049f05b78c4bdbd Mon Sep 17 00:00:00 2001 From: n0099 Date: Sun, 6 Oct 2024 01:53:45 +0000 Subject: [PATCH 30/61] * tweak whitespace control for twig templates following https://symfony.com/blog/better-white-space-control-in-twig-templates @ symfony --- symfony/templates/sitemaps/forums.xml.twig | 10 +++++----- symfony/templates/sitemaps/threads.xml.twig | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/symfony/templates/sitemaps/forums.xml.twig b/symfony/templates/sitemaps/forums.xml.twig index 3db264ba..1e99136c 100644 --- a/symfony/templates/sitemaps/forums.xml.twig +++ b/symfony/templates/sitemaps/forums.xml.twig @@ -3,16 +3,16 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - {% for fid, tids in threads_id_key_by_fid %} + {%- for fid, tids in threads_id_key_by_fid %} {% set threads_sitemap_path = - app.request.schemeAndHttpHost ~ app.request.baseUrl ~ "/sitemaps/forums/#{fid}/threads" %} + app.request.schemeAndHttpHost ~ app.request.baseUrl ~ "/sitemaps/forums/#{fid}/threads" ~%} {{ threads_sitemap_path }} - {% for tid in tids %} + {%- for tid in tids ~%} {{ threads_sitemap_path }}?cursor={{ tid }} - {% endfor %} - {% endfor %} + {%- endfor %} + {% endfor ~%} diff --git a/symfony/templates/sitemaps/threads.xml.twig b/symfony/templates/sitemaps/threads.xml.twig index 61a4fe0a..1d83c851 100644 --- a/symfony/templates/sitemaps/threads.xml.twig +++ b/symfony/templates/sitemaps/threads.xml.twig @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - {% for tid in threads_id %} + {%- for tid in threads_id ~%} {{ base_url_fe }}/posts/tid/{{ tid }} - {% endfor %} + {%- endfor ~%} From e6148a923467571e3d95517b237a9c6772c8698c Mon Sep 17 00:00:00 2001 From: n0099 Date: Sun, 6 Oct 2024 19:17:00 +0000 Subject: [PATCH 31/61] + `App\EventListener\ExceptionToJsonResponse` to serialize `HttpException` or `ValidationFailedException` into `JsonResponse` like `App\Exceptions\Handler->convertValidationExceptionToResponse()` in `be` * now will derived classes of `HttpException` with `Exception->code` @ `App\Helper->abortApi()` * passing the testing value to the `ValidationFailedException` to be thrown @ `App\Validator->__invoke()` @ symfony --- symfony/src/Controller/AssetController.php | 1 - .../EventListener/ExceptionToJsonResponse.php | 33 +++++++++++++++++++ symfony/src/Helper.php | 3 +- symfony/src/Validator.php | 2 +- 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 symfony/src/EventListener/ExceptionToJsonResponse.php diff --git a/symfony/src/Controller/AssetController.php b/symfony/src/Controller/AssetController.php index fd4bd680..15d21b6d 100644 --- a/symfony/src/Controller/AssetController.php +++ b/symfony/src/Controller/AssetController.php @@ -4,7 +4,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Asset\Packages; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; diff --git a/symfony/src/EventListener/ExceptionToJsonResponse.php b/symfony/src/EventListener/ExceptionToJsonResponse.php new file mode 100644 index 00000000..b1a5e7b8 --- /dev/null +++ b/symfony/src/EventListener/ExceptionToJsonResponse.php @@ -0,0 +1,33 @@ +getThrowable(); + if ($exception instanceof HttpException + && collect(Helper::ERROR_STATUS_CODE_INFO) + ->flatMap(static fn(array $codes) => array_keys($codes)) + ->contains($exception->getCode())) { + $event->setResponse(JsonResponse::fromJsonString($exception->getMessage())); + } elseif ($exception instanceof ValidationFailedException) { + $event->setResponse(JsonResponse::fromJsonString( + // https://github.com/symfony/serializer/blob/7.1/Normalizer/ConstraintViolationListNormalizer.php + $this->serializer->serialize($exception->getViolations(), 'json') + )); + } + } +} diff --git a/symfony/src/Helper.php b/symfony/src/Helper.php index f4c90614..acc8a6a0 100644 --- a/symfony/src/Helper.php +++ b/symfony/src/Helper.php @@ -93,6 +93,7 @@ public static function abortAPI(int $errorCode): never if ($errorInfo === null) { throw new \InvalidArgumentException('Given error code doesn\'t existed'); } - throw new HttpException($statusCode, \Safe\json_encode(compact('errorCode', 'errorInfo'))); + $json = \Safe\json_encode(compact('errorCode', 'errorInfo')); + throw HttpException::fromStatusCode($statusCode, $json, code: $errorCode); } } diff --git a/symfony/src/Validator.php b/symfony/src/Validator.php index 77b210f3..98db5858 100644 --- a/symfony/src/Validator.php +++ b/symfony/src/Validator.php @@ -14,7 +14,7 @@ public function __invoke($value, Constraint|array|null $constraints): void { $errors = $this->validator->validate($value, $constraints); if ($errors->count() !== 0) { - throw new ValidationFailedException(null, $errors); + throw new ValidationFailedException($value, $errors); } } } From a61242825404f7029aa0a2fa3c11569dfe9afe2b Mon Sep 17 00:00:00 2001 From: n0099 Date: Sun, 6 Oct 2024 21:03:27 +0000 Subject: [PATCH 32/61] $ rm Entity/BilibiliVote.php Repository/BilibiliVoteRepository.php $ composer remove google/recaptcha @ symfony --- symfony/.env | 7 -- symfony/composer.json | 1 - symfony/composer.lock | 64 ++----------------- symfony/config/packages/google_recaptcha.yaml | 21 ------ symfony/config/services.yaml | 1 - symfony/src/Entity/BilibiliVote.php | 60 ----------------- .../src/Repository/BilibiliVoteRepository.php | 15 ----- symfony/symfony.lock | 12 ---- 8 files changed, 6 insertions(+), 175 deletions(-) delete mode 100644 symfony/config/packages/google_recaptcha.yaml delete mode 100644 symfony/src/Entity/BilibiliVote.php delete mode 100644 symfony/src/Repository/BilibiliVoteRepository.php diff --git a/symfony/.env b/symfony/.env index 97473132..7e7d60f3 100644 --- a/symfony/.env +++ b/symfony/.env @@ -31,10 +31,3 @@ APP_SECRET= # DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4" DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8" ###< doctrine/doctrine-bundle ### - -###> google/recaptcha ### -# To use Google Recaptcha, you must register a site on Recaptcha's admin panel: -# https://www.google.com/recaptcha/admin -GOOGLE_RECAPTCHA_SITE_KEY= -GOOGLE_RECAPTCHA_SECRET= -###< google/recaptcha ### diff --git a/symfony/composer.json b/symfony/composer.json index 402a8790..52ae19ec 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -12,7 +12,6 @@ "doctrine/doctrine-bundle": "^2.13.0", "doctrine/orm": "^3.2.2", "google/protobuf": "^4.28.2", - "google/recaptcha": "^1.3.0", "illuminate/collections": "^11.26.0", "spatie/laravel-collection-macros": "^7.14.1", "spatie/regex": "^3.1.1", diff --git a/symfony/composer.lock b/symfony/composer.lock index 6054793a..1f8bba2f 100644 --- a/symfony/composer.lock +++ b/symfony/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": "ec354b2363ef2bdfa015b2927b3a5679", + "content-hash": "b2a907d2473aed8de4c8fc3ee5e622a7", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -1143,58 +1143,6 @@ }, "time": "2024-09-18T20:56:15+00:00" }, - { - "name": "google/recaptcha", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/google/recaptcha.git", - "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/google/recaptcha/zipball/d59a801e98a4e9174814a6d71bbc268dff1202df", - "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df", - "shasum": "" - }, - "require": { - "php": ">=8" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.14", - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^10" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "ReCaptcha\\": "src/ReCaptcha" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", - "homepage": "https://www.google.com/recaptcha/", - "keywords": [ - "Abuse", - "captcha", - "recaptcha", - "spam" - ], - "support": { - "forum": "https://groups.google.com/forum/#!forum/recaptcha", - "issues": "https://github.com/google/recaptcha/issues", - "source": "https://github.com/google/recaptcha" - }, - "time": "2023-02-18T17:41:46+00:00" - }, { "name": "illuminate/collections", "version": "v11.26.0", @@ -7290,16 +7238,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.5", + "version": "1.12.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17" + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", - "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae", + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae", "shasum": "" }, "require": { @@ -7344,7 +7292,7 @@ "type": "github" } ], - "time": "2024-09-26T12:45:22+00:00" + "time": "2024-10-06T15:03:59+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", diff --git a/symfony/config/packages/google_recaptcha.yaml b/symfony/config/packages/google_recaptcha.yaml deleted file mode 100644 index 8670b13e..00000000 --- a/symfony/config/packages/google_recaptcha.yaml +++ /dev/null @@ -1,21 +0,0 @@ -services: - - # Inject this service in your controllers/services to verify a submitted captcha. - ReCaptcha\ReCaptcha: - arguments: - $secret: '%env(GOOGLE_RECAPTCHA_SECRET)%' - $requestMethod: '@ReCaptcha\RequestMethod' - - # Curl is set here as default transport to communicate with Google servers. - # If you do not have php-curl extension, you can change for a socket or a plain POST request. - # Check out the repository for all other request methods: - # https://github.com/google/recaptcha/tree/master/src/ReCaptcha/RequestMethod - ReCaptcha\RequestMethod: '@ReCaptcha\RequestMethod\CurlPost' - ReCaptcha\RequestMethod\CurlPost: null - ReCaptcha\RequestMethod\Curl: null - -# Uncomment this line if you want to inject the site key to all your Twig templates. -# You can also inject the "google_recaptcha_site_key" container parameter to your controllers. -#twig: -# globals: -# google_recaptcha_site_key: '%google_recaptcha_site_key%' diff --git a/symfony/config/services.yaml b/symfony/config/services.yaml index 99e1a240..d83fb7aa 100644 --- a/symfony/config/services.yaml +++ b/symfony/config/services.yaml @@ -5,7 +5,6 @@ # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: app.base_url.fe: '%env(APP_BASE_URL_FE)%' - google_recaptcha_site_key: '%env(GOOGLE_RECAPTCHA_SITE_KEY)%' services: # default configuration for services in *this* file diff --git a/symfony/src/Entity/BilibiliVote.php b/symfony/src/Entity/BilibiliVote.php deleted file mode 100644 index 561e65ed..00000000 --- a/symfony/src/Entity/BilibiliVote.php +++ /dev/null @@ -1,60 +0,0 @@ -pid; - } - - public function getAuthorUid(): int - { - return $this->authorUid; - } - - public function getAuthorExpGrade(): ?int - { - return $this->authorExpGrade; - } - - public function isValid(): bool - { - return $this->isValid; - } - - public function getVoteBy(): ?string - { - return $this->voteBy; - } - - public function getVoteFor(): ?string - { - return $this->voteFor; - } - - public function getReplyContent(): array - { - return $this->replyContent; - } - - public function getPostTime(): \DateTimeImmutable - { - return $this->postTime; - } -} diff --git a/symfony/src/Repository/BilibiliVoteRepository.php b/symfony/src/Repository/BilibiliVoteRepository.php deleted file mode 100644 index 46e464e4..00000000 --- a/symfony/src/Repository/BilibiliVoteRepository.php +++ /dev/null @@ -1,15 +0,0 @@ - Date: Sun, 6 Oct 2024 23:59:01 +0000 Subject: [PATCH 33/61] + class `ParamsValidator` and replace laravel validator rules in `validateParamsValue()` with symfony validator constraints + classes `QueryParams?` copied from its namesake classes in `be` @ `App\PostsQuery` + classes `App\Validator\DateTimeRange(Validator)?` for `App\PostsQuery\ParamsValidator` * move class `App\Validator` into namespace `App\Validator` and rename `__invoke()` to `validate()` @ symfony --- symfony/src/Controller/SitemapController.php | 4 +- symfony/src/PostsQuery/ParamsValidator.php | 154 ++++++++++++++++++ symfony/src/PostsQuery/QueryParam.php | 38 +++++ symfony/src/PostsQuery/QueryParams.php | 128 +++++++++++++++ symfony/src/Validator/DateTimeRange.php | 11 ++ .../src/Validator/DateTimeRangeValidator.php | 38 +++++ symfony/src/{ => Validator}/Validator.php | 4 +- 7 files changed, 373 insertions(+), 4 deletions(-) create mode 100644 symfony/src/PostsQuery/ParamsValidator.php create mode 100644 symfony/src/PostsQuery/QueryParam.php create mode 100644 symfony/src/PostsQuery/QueryParams.php create mode 100644 symfony/src/Validator/DateTimeRange.php create mode 100644 symfony/src/Validator/DateTimeRangeValidator.php rename symfony/src/{ => Validator}/Validator.php (84%) diff --git a/symfony/src/Controller/SitemapController.php b/symfony/src/Controller/SitemapController.php index d83ad7f2..5721993b 100644 --- a/symfony/src/Controller/SitemapController.php +++ b/symfony/src/Controller/SitemapController.php @@ -5,7 +5,7 @@ use App\Helper; use App\Repository\ForumRepository; use App\Repository\Post\PostRepositoryFactory; -use App\Validator; +use App\Validator\Validator; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -48,7 +48,7 @@ function (ItemInterface $item) use ($threadsIdKeyByFid) { public function threads(Request $request, Validator $validator, int $fid): Response { $cursor = $request->query->get('cursor') ?? 0; - $validator($cursor, new Assert\Type('digit')); + $validator->validate($cursor, new Assert\Type('digit')); Helper::abortAPIIfNot(40406, $this->forumRepository->isForumExists($fid)); return $this->cache->get( diff --git a/symfony/src/PostsQuery/ParamsValidator.php b/symfony/src/PostsQuery/ParamsValidator.php new file mode 100644 index 00000000..942fcdcc --- /dev/null +++ b/symfony/src/PostsQuery/ParamsValidator.php @@ -0,0 +1,154 @@ +validateParamsValue($params); + $this->params = new QueryParams($params); + $this->validate40001(); + $this->validate40005(); + } + + public function addDefaultParamsThenValidate(bool $shouldSkip40003): void + { + $this->params->addDefaultValueOnParams(); + $this->params->addDefaultValueOnUniqueParams(); + // sort here to prevent further sort while validating + $sortedPostTypes = collect($this->params->getUniqueParamValue('postTypes'))->sort()->values()->all(); + $this->params->setUniqueParamValue('postTypes', $sortedPostTypes); + $currentPostTypes = (array) $this->params->getUniqueParamValue('postTypes'); + if (!$shouldSkip40003) { + $this->validate40003($currentPostTypes); + } + $this->validate40004($currentPostTypes); + } + + private function validateParamsValue(array $params): void + { + $paramsPossibleValue = [ + 'userGender' => [0, 1, 2], + 'userManagerType' => ['NULL', 'manager', 'assist', 'voiceadmin'], + ]; + // note here we haven't validated that is every sub param have a corresponding main param yet + $this->validator->validate($params, new Assert\Collection([ + 'fid' => new Assert\Type('digit'), + 'postTypes' => new Assert\Collection([new Assert\Choice(Helper::POST_TYPES)]), + 'orderBy' => new Assert\Collection([new Assert\Choice([...Helper::POST_ID, 'postedAt'])]), + 'direction' => new Assert\Choice(['ASC', 'DESC']), + 'tid' => new Assert\Type('digit'), + 'pid' => new Assert\Type('digit'), + 'spid' => new Assert\Type('digit'), + 'postedAt' => new DateTimeRange(), + 'latestReplyPostedAt' => new DateTimeRange(), + 'threadViewCount' => new Assert\Type('digit'), + 'threadShareCount' => new Assert\Type('digit'), + 'threadReplyCount' => new Assert\Type('digit'), + 'replySubReplyCount' => new Assert\Type('digit'), + 'threadProperties' => new Assert\Collection([new Assert\Choice(['good', 'sticky'])]), + 'authorUid' => new Assert\Type('digit'), + 'authorExpGrade' => new Assert\Type('digit'), + 'authorGender' => new Assert\Choice($paramsPossibleValue['userGender']), + 'authorManagerType' => new Assert\Choice($paramsPossibleValue['userManagerType']), + 'latestReplierUid' => new Assert\Type('digit'), + 'latestReplierGender' => new Assert\Choice($paramsPossibleValue['userGender']), + + 'not' => new Assert\Type('boolean'), + // sub param of tid, pid, spid + // threadViewCount, threadShareCount, threadReplyCount, replySubReplyCount + // authorUid, authorExpGrade, latestReplierUid + 'range' => new Assert\Choice(['<', '=', '>', 'IN', 'BETWEEN']), + // sub param of threadTitle, postContent + // authorName, authorDisplayName + // latestReplierName, latestReplierDisplayName + 'matchBy' => new Assert\Choice(['implicit', 'explicit', 'regex']), + 'spaceSplit' => new Assert\Type('boolean'), + ])); + } + + private function validate40001(): void + { + // only fill postTypes and/or orderBy uniqueParam doesn't query anything + Helper::abortAPIIf(40001, $this->params->count() === \count($this->params->pick('postTypes', 'orderBy'))); + } + + private function validate40005(): void + { + foreach (self::UNIQUE_PARAMS_NAME as $uniqueParamName) { // is all unique param only appeared once + Helper::abortAPIIf(40005, \count($this->params->pick($uniqueParamName)) > 1); + } + } + + private static function isRequiredPostTypes(array $current, array $required): bool + { + /** @var 'SUB' | 'All' $coverage */ + /** @var array $postTypes */ + [$coverage, $postTypes] = $required; + $postTypes = Arr::sort($postTypes); + return match ($coverage) { + 'SUB' => array_diff($current, $postTypes) === [], + 'ALL' => $current === $postTypes, + default => throw new \Exception(), + }; + } + + public const array REQUIRED_POST_TYPES_KEY_BY_PARAM_NAME = [ + 'pid' => ['SUB', ['reply', 'subReply']], + 'spid' => ['ALL', ['subReply']], + 'latestReplyPostedAt' => ['ALL', ['thread']], + 'threadTitle' => ['ALL', ['thread']], + 'postContent' => ['SUB', ['reply', 'subReply']], + 'threadViewCount' => ['ALL', ['thread']], + 'threadShareCount' => ['ALL', ['thread']], + 'threadReplyCount' => ['ALL', ['thread']], + 'replySubReplyCount' => ['ALL', ['reply']], + 'threadProperties' => ['ALL', ['thread']], + 'authorExpGrade' => ['SUB', ['reply', 'subReply']], + 'latestReplierUid' => ['ALL', ['thread']], + 'latestReplierName' => ['ALL', ['thread']], + 'latestReplierDisplayName' => ['ALL', ['thread']], + 'latestReplierGender' => ['ALL', ['thread']], + ]; + + private function validate40003(array $currentPostTypes): void + { + foreach (self::REQUIRED_POST_TYPES_KEY_BY_PARAM_NAME as $paramName => $requiredPostTypes) { + if ($this->params->pick($paramName) !== []) { + Helper::abortAPIIfNot(40003, self::isRequiredPostTypes($currentPostTypes, $requiredPostTypes)); + } + } + } + + public const array REQUIRED_POST_TYPES_KEY_BY_ORDER_BY_VALUE = [ + 'pid' => ['SUB', ['reply', 'subReply']], + 'spid' => ['SUB', ['subReply']], + ]; + + private function validate40004(array $currentPostTypes): void + { + $currentOrderBy = (string) $this->params->getUniqueParamValue('orderBy'); + if (\array_key_exists($currentOrderBy, self::REQUIRED_POST_TYPES_KEY_BY_ORDER_BY_VALUE)) { + Helper::abortAPIIfNot( + 40004, + self::isRequiredPostTypes( + $currentPostTypes, + self::REQUIRED_POST_TYPES_KEY_BY_ORDER_BY_VALUE[$currentOrderBy], + ), + ); + } + } +} diff --git a/symfony/src/PostsQuery/QueryParam.php b/symfony/src/PostsQuery/QueryParam.php new file mode 100644 index 00000000..f88a9d26 --- /dev/null +++ b/symfony/src/PostsQuery/QueryParam.php @@ -0,0 +1,38 @@ +name = (string) array_keys($param)[0]; + if (is_numeric($this->name)) { + throw new \InvalidArgumentException(); + } + $this->value = $param[$this->name]; + array_shift($param); + $this->subParams = $param; + } + + public function getAllSub(): array + { + return $this->subParams; + } + + public function getSub(string $name) + { + return $this->subParams[$name] ?? null; + } + + public function setSub(string $name, array|string|int $value): void + { + $this->subParams[$name] = $value; + } +} diff --git a/symfony/src/PostsQuery/QueryParams.php b/symfony/src/PostsQuery/QueryParams.php new file mode 100644 index 00000000..e8ef918b --- /dev/null +++ b/symfony/src/PostsQuery/QueryParams.php @@ -0,0 +1,128 @@ +params = array_map(static fn(array $p) => new QueryParam($p), $params); + } + + /** @psalm-return int<0, max> */ + public function count(): int + { + return count($this->params); + } + + /** + * @return QueryParam[] + * @psalm-return list + */ + public function pick(string ...$names): array + { + // array_values() will reset keys + return array_values(array_filter( + $this->params, + static fn($p): bool => \in_array($p->name, $names, true), + )); + } + + /** + * @return QueryParam[] + * @psalm-return list + */ + public function omit(string ...$names): array + { + return array_values(array_filter( + $this->params, + static fn($p): bool => !\in_array($p->name, $names, true), + )); + } + + public function getUniqueParamValue(string $name): mixed + { + return $this->pick($name)[0]->value ?? null; + } + + public function setUniqueParamValue(string $name, mixed $value): void + { + $this->params[$this->getParamsIndexByName($name)[0]]->value = $value; + } + + /** @return int[] */ + protected function getParamsIndexByName(string $name): array + { + return array_keys(array_filter($this->params, static fn($p) => $p->name === $name)); + } + + /** @SuppressWarnings(PHPMD.ElseExpression) */ + public function addDefaultValueOnUniqueParams(): void + { + $uniqueParamsDefaultValue = [ + 'postTypes' => ['value' => Helper::POST_TYPES], + 'orderBy' => ['value' => 'default', 'subParam' => ['direction' => 'ASC']], + ]; + foreach ($uniqueParamsDefaultValue as $name => $value) { + // add unique params with default value when it's not presented in $this->params + $paramFilledWithDefaults = new QueryParam([ + $name => $this->getUniqueParamValue($name) ?? $value['value'], + ...($this->pick($name)[0]->subParam ?? $value['subParam'] ?? []), + ]); + $paramsIndex = $this->getParamsIndexByName($name); + if ($paramsIndex === []) { + $this->params[] = $paramFilledWithDefaults; + } else { + $this->params[$paramsIndex[0]] = $paramFilledWithDefaults; + } + } + } + + public const array PARAM_DEFAULT_VALUE_KEY_BY_TYPE = [ + 'numeric' => ['range' => '='], + 'text' => ['matchBy' => 'explicit', 'spaceSplit' => false], + ]; + + public const array PARAM_NAME_KEY_BY_TYPE = [ + 'numeric' => [ + 'tid', + 'pid', + 'spid', + 'threadViewCount', + 'threadShareCount', + 'threadReplyCount', + 'replySubReplyCount', + 'authorUid', + 'authorExpGrade', + 'latestReplierUid', + ], + 'text' => [ + 'threadTitle', + 'postContent', + 'authorName', + 'authorDisplayName', + 'latestReplierName', + 'latestReplierDisplayName', + ], + ]; + + public function addDefaultValueOnParams(): void + { + $subParamsDefaultValue = collect(self::PARAM_NAME_KEY_BY_TYPE) + ->mapWithKeys(static fn(array $names, string $type) => + array_fill_keys($names, self::PARAM_DEFAULT_VALUE_KEY_BY_TYPE[$type])); + foreach ($this->params as $param) { // set sub params with default value + foreach ($subParamsDefaultValue->get($param->name, []) as $name => $value) { + if ($param->getSub($name) === null) { + $param->setSub($name, $value); + } + } + } + } +} diff --git a/symfony/src/Validator/DateTimeRange.php b/symfony/src/Validator/DateTimeRange.php new file mode 100644 index 00000000..c6d9b2bd --- /dev/null +++ b/symfony/src/Validator/DateTimeRange.php @@ -0,0 +1,11 @@ +context->getValidator()->validate($values, new Assert\Count(2)); + $errors->addAll($this->context->getValidator()->validate( + $values[0], + [new Assert\DateTime(), new Assert\LessThanOrEqual($values[1])], + )); + $errors->addAll($this->context->getValidator()->validate( + $values[1], + [new Assert\DateTime(), new Assert\GreaterThanOrEqual($values[0])], + )); + + if ($errors->count() !== 0) { + $this->context->buildViolation($constraint->message) + ->setParameter('{{ value }}', $value) + ->addViolation(); + } + } +} diff --git a/symfony/src/Validator.php b/symfony/src/Validator/Validator.php similarity index 84% rename from symfony/src/Validator.php rename to symfony/src/Validator/Validator.php index 98db5858..2a7629da 100644 --- a/symfony/src/Validator.php +++ b/symfony/src/Validator/Validator.php @@ -1,6 +1,6 @@ validator->validate($value, $constraints); if ($errors->count() !== 0) { From 3efff82ae14feaf9ce33d68e127564b47b315c77 Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 7 Oct 2024 00:26:34 +0000 Subject: [PATCH 34/61] + `App\PostsQuery\CursorCodec` like its namesake class in `be` + `App\Repository\Post\PostRepositoryFactory->newForumPosts()` like `App\Eloquent\Model\Post\PostFactory->getPostModelsByFid()` in `be` @ symfony --- symfony/src/PostsQuery/CursorCodec.php | 111 ++++++++++++++++++ .../src/Repository/Post/PostRepository.php | 2 +- .../Repository/Post/PostRepositoryFactory.php | 13 ++ 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 symfony/src/PostsQuery/CursorCodec.php diff --git a/symfony/src/PostsQuery/CursorCodec.php b/symfony/src/PostsQuery/CursorCodec.php new file mode 100644 index 00000000..68d637dc --- /dev/null +++ b/symfony/src/PostsQuery/CursorCodec.php @@ -0,0 +1,111 @@ + $postsKeyByTypePluralName */ + public function encodeNextCursor(Collection $postsKeyByTypePluralName, string $orderByField): string + { + $encodedCursorsKeyByPostType = $postsKeyByTypePluralName + ->mapWithKeys(static fn(Collection $posts, string $type) => [ + Helper::POST_TYPE_PLURAL_TO_SINGULAR[$type] => $posts->last(), // null when no posts + ]) // [singularPostTypeName => lastPostInResult] + ->filter() // remove post types that have no posts + ->map(function (Post $post, string $typePluralName) use ($orderByField) { + $postIDFieldName = Helper::POST_TYPE_TO_ID[$typePluralName]; + return [ + $post->{"get$postIDFieldName"}(), + $post->{"get$orderByField"}(), + ]; + }) + ->map(static fn(array $cursors) => collect($cursors) + ->map(static function (int|string $cursor): string { + if ($cursor === 0) { // quick exit to keep 0 as is + // to prevent packed 0 with the default format 'P' after 0x00 trimming is an empty string + // that will be confused with post types without a cursor that is a blank encoded cursor ',,' + return '0'; + } + $prefix = match (true) { + \is_int($cursor) && $cursor < 0 => '-', + \is_string($cursor) => 'S', + default => '', + }; + + $value = \is_int($cursor) + // remove trailing 0x00 for an unsigned int or 0xFF for a signed negative int + ? rtrim(pack('P', $cursor), $cursor >= 0 ? "\x00" : "\xFF") + : ($prefix === 'S' + // keep string as is since encoded string will always longer than the original string + ? $cursor + : throw new \RuntimeException('Invalid cursor value')); + if ($prefix !== 'S') { + // https://en.wikipedia.org/wiki/Base64#URL_applications + $value = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($value)); + } + + return $prefix . ($prefix === '' ? '' : ':') . $value; + }) + ->join(',')); + return collect(Helper::POST_TYPES) + // merge cursors into flipped Helper::POST_TYPES with the same post type key + // value of keys that non exists in $encodedCursorsKeyByPostType will remain as int + ->flip()->merge($encodedCursorsKeyByPostType) + // if the flipped value is a default int key there's no posts of this type + // (type key not exists in $postsKeyByTypePluralName) + // so we just return an empty ',' as placeholder + ->map(static fn(string|int $cursor) => \is_int($cursor) ? ',' : $cursor) + ->join(','); + } + + /** @psalm-return Collection<'reply'|'subReply'|'thread', array> */ + public function decodeCursor(string $encodedCursors, string $orderByField): Collection + { + return collect(Helper::POST_TYPES) + ->combine(Str::of($encodedCursors) + ->explode(',') + ->map(static function (string $encodedCursor): int|string|null { + /** + * @var string $cursor + * @var string $prefix + */ + [$prefix, $cursor] = array_pad(explode(':', $encodedCursor), 2, null); + if ($cursor === null) { // no prefix being provided means the value of cursor is a positive int + $cursor = $prefix; + $prefix = ''; + } + return $cursor === '0' ? 0 : match ($prefix) { // keep 0 as is + 'S' => $cursor, // string literal is not base64 encoded + default => ((array) ( + unpack( + format: 'P', + string: str_pad( // re-add removed trailing 0x00 or 0xFF + base64_decode( + // https://en.wikipedia.org/wiki/Base64#URL_applications + str_replace(['-', '_'], ['+', '/'], $cursor), + ), + length: 8, + pad_string: $prefix === '-' ? "\xFF" : "\x00", + ), + ) + ))[1], // the returned array of unpack() will starts index from 1 + }; + }) + ->chunk(2) // split six values into three post type pairs + ->map(static fn(Collection $i) => $i->values())) // reorder keys after chunk + ->mapWithKeys(fn(Collection $cursors, string $postType) => + [$postType => + $cursors->mapWithKeys(fn(int|string|null $cursor, int $index) => + [$index === 0 ? Helper::POST_TYPE_TO_ID[$postType] : $orderByField => $cursor]), + ]) + // filter out cursors with all fields value being null, their encoded cursor is ',,' + ->reject(static fn(Collection $cursors) => + $cursors->every(static fn(int|string|null $cursor) => $cursor === null)) + ->map(static fn(Collection $cursors) => $cursors->all()); + } +} diff --git a/symfony/src/Repository/Post/PostRepository.php b/symfony/src/Repository/Post/PostRepository.php index c71559d4..75775d8d 100644 --- a/symfony/src/Repository/Post/PostRepository.php +++ b/symfony/src/Repository/Post/PostRepository.php @@ -2,7 +2,7 @@ namespace App\Repository\Post; -use App\Eloquent\Model\Post\Post; +use App\Entity\Post\Post; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; diff --git a/symfony/src/Repository/Post/PostRepositoryFactory.php b/symfony/src/Repository/Post/PostRepositoryFactory.php index 78847d2a..5ae4c5a2 100644 --- a/symfony/src/Repository/Post/PostRepositoryFactory.php +++ b/symfony/src/Repository/Post/PostRepositoryFactory.php @@ -2,6 +2,8 @@ namespace App\Repository\Post; +use App\Entity\Post as Entity; +use App\Helper; use App\Repository\Post\Content\ReplyContentRepository; use App\Repository\Post\Content\SubReplyContentRepository; use Doctrine\ORM\EntityManagerInterface; @@ -38,4 +40,15 @@ public function newSubReplyContent(int $fid): SubReplyContentRepository { return new SubReplyContentRepository($this->registry, $this->entityManager, $fid); } + + /** + * @return array{thread: Entity\Thread, reply: Entity\Reply, subReply: Entity\SubReply} + */ + public function newForumPosts(int $fid): array + { + return array_combine( + Helper::POST_TYPES, + [$this->newThread($fid), $this->newReply($fid), $this->newSubReply($fid)], + ); + } } From 95e4c72b809c0dc41e2070242d3decda6c2a5d29 Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 7 Oct 2024 00:41:50 +0000 Subject: [PATCH 35/61] $ composer require symfony/stopwatch # partial revert feccb70b30136af0464f5bf179966da89372c168 @ symfony --- symfony/composer.json | 1 + symfony/composer.lock | 126 +++++++++++++++++++++--------------------- 2 files changed, 64 insertions(+), 63 deletions(-) diff --git a/symfony/composer.json b/symfony/composer.json index 52ae19ec..38666f53 100644 --- a/symfony/composer.json +++ b/symfony/composer.json @@ -21,6 +21,7 @@ "symfony/framework-bundle": "^7.1.5", "symfony/runtime": "^7.1.1", "symfony/serializer": "^7.1.5", + "symfony/stopwatch": "7.1.*", "symfony/twig-bundle": "^7.1.5", "symfony/validator": "7.1.*", "symfony/yaml": "^7.1.5", diff --git a/symfony/composer.lock b/symfony/composer.lock index 1f8bba2f..26d82c14 100644 --- a/symfony/composer.lock +++ b/symfony/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": "b2a907d2473aed8de4c8fc3ee5e622a7", + "content-hash": "7bd0c37ead23d109b01b471c0691e248", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -3882,6 +3882,68 @@ ], "time": "2024-04-18T09:32:20+00:00" }, + { + "name": "symfony/stopwatch", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.1.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-05-31T14:57:53+00:00" + }, { "name": "symfony/string", "version": "v7.1.5", @@ -11385,68 +11447,6 @@ ], "time": "2024-09-19T21:48:23+00:00" }, - { - "name": "symfony/stopwatch", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "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 a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.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-05-31T14:57:53+00:00" - }, { "name": "symfony/web-profiler-bundle", "version": "v7.1.4", From 872e0e6d2ed116220fd3fc6b3fbabbdea0b16738 Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 7 Oct 2024 16:08:16 +0000 Subject: [PATCH 36/61] $ cp {be/app/Http/Controllers,symfony/src/Controller}/PostsQuery.php $ cp {be/app/Http/Controllers,symfony/src/Controller}/UsersQuery.php $ cp {be/app/Http,symfony/src}/PostsQuery/IndexQuery.php $ cp {be/app/Http,symfony/src}/PostsQuery/SearchQuery.php $ cp {be/app/Http,symfony/src}/PostsQuery/BaseQuery.php --- symfony/src/Controller/PostsQuery.php | 95 +++++++ symfony/src/Controller/UsersQuery.php | 48 ++++ symfony/src/PostsQuery/BaseQuery.php | 344 +++++++++++++++++++++++++ symfony/src/PostsQuery/IndexQuery.php | 107 ++++++++ symfony/src/PostsQuery/SearchQuery.php | 163 ++++++++++++ 5 files changed, 757 insertions(+) create mode 100644 symfony/src/Controller/PostsQuery.php create mode 100644 symfony/src/Controller/UsersQuery.php create mode 100644 symfony/src/PostsQuery/BaseQuery.php create mode 100644 symfony/src/PostsQuery/IndexQuery.php create mode 100644 symfony/src/PostsQuery/SearchQuery.php diff --git a/symfony/src/Controller/PostsQuery.php b/symfony/src/Controller/PostsQuery.php new file mode 100644 index 00000000..b5766616 --- /dev/null +++ b/symfony/src/Controller/PostsQuery.php @@ -0,0 +1,95 @@ +app->makeWith(ParamsValidator::class, ['params' => \Safe\json_decode( + $request->validate([ + 'cursor' => [ // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data + // (,|$)|,){5,6} means allow at most 5~6 parts of base64 segment or empty string to exist + 'regex:/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/', + ], + 'query' => 'json|required', + ])['query'], + assoc: true, + )]); + $params = $validator->params; + + $postIDParams = $params->pick(...Helper::POST_ID); + $isQueryByPostID = + // is there no other params except unique params and post ID params + \count($params->omit(...ParamsValidator::UNIQUE_PARAMS_NAME, ...Helper::POST_ID)) === 0 + // is there only one post ID param + && \count($postIDParams) === 1 + // is all post ID params doesn't own any sub param + && array_filter($postIDParams, static fn($p) => $p->getAllSub() !== []) === []; + $isFidParamNull = $params->getUniqueParamValue('fid') === null; + // is the fid param exists and there's no other params except unique params + $isQueryByFid = !$isFidParamNull && \count($params->omit(...ParamsValidator::UNIQUE_PARAMS_NAME)) === 0; + $isIndexQuery = $isQueryByPostID || $isQueryByFid; + $isSearchQuery = !$isIndexQuery; + Helper::abortAPIIf(40002, $isSearchQuery && $isFidParamNull); + + $validator->addDefaultParamsThenValidate(shouldSkip40003: $isIndexQuery); + + $queryClass = $isIndexQuery ? IndexQuery::class : SearchQuery::class; + $this->debugbar->startMeasure('$queryClass->query()'); + $query = (new $queryClass())->query($params, $request->get('cursor')); + $this->debugbar->stopMeasure('$queryClass->query()'); + $this->debugbar->startMeasure('fillWithParentPost'); + $result = $query->fillWithParentPost(); + $this->debugbar->stopMeasure('fillWithParentPost'); + + $this->debugbar->startMeasure('queryUsers'); + $latestRepliersId = $result['threads']->pluck('latestReplierId'); + $latestRepliers = LatestReplier::query()->whereIn('id', $latestRepliersId) + ->whereNotNull('uid')->selectPublicFields()->get() + ->concat(LatestReplier::query()->whereIn('id', $latestRepliersId) + ->whereNull('uid')->selectPublicFields() + ->addSelect(['name', 'displayName'])->get()); + $whereCurrentFid = static fn(HasOne $q): HasOne => $q->where('fid', $result['fid']); + $users = User::query()->whereIn( + 'uid', + collect($result) + ->only(Helper::POST_TYPES_PLURAL) + ->flatMap(static fn(Collection $posts) => $posts->pluck('authorUid')) + ->concat($latestRepliers->pluck('uid')) + ->filter()->unique(), // remove NULLs + )->with(['currentForumModerator' => $whereCurrentFid, 'currentAuthorExpGrade' => $whereCurrentFid]) + ->selectPublicFields()->get(); + $this->debugbar->stopMeasure('queryUsers'); + + return [ + 'type' => $isIndexQuery ? 'index' : 'search', + 'pages' => [ + ...$query->getResultPages(), + ...Arr::except($result, ['fid', ...Helper::POST_TYPES_PLURAL]), + ], + 'forum' => Forum::fid($result['fid'])->selectPublicFields()->first(), + 'threads' => $query->reOrderNestedPosts($query->nestPostsWithParent(...$result)), + 'users' => $users, + 'latestRepliers' => $latestRepliers, + ]; + } +} diff --git a/symfony/src/Controller/UsersQuery.php b/symfony/src/Controller/UsersQuery.php new file mode 100644 index 00000000..fb3f34aa --- /dev/null +++ b/symfony/src/Controller/UsersQuery.php @@ -0,0 +1,48 @@ +validate([ + 'uid' => 'integer', + 'name' => 'string', + 'displayName' => 'string', + 'gender' => 'string|in:0,1,2,NULL', + ]); + Helper::abortAPIIf(40402, empty($queryParams)); + + $queryBuilder = User::query(); + + $nullableParams = ['name', 'displayName', 'gender']; + foreach ($nullableParams as $nullableParamName) { + if (\array_key_exists($nullableParamName, $queryParams) && $queryParams[$nullableParamName] === 'NULL') { + $queryBuilder = $queryBuilder->whereNull($nullableParamName); + unset($queryParams[$nullableParamName]); + } + } + + $queriedInfo = $queryBuilder + ->where($queryParams) + ->orderBy('id', 'DESC') + ->selectPublicFields() + ->simplePaginate($this->perPageItems); + Helper::abortAPIIf(40402, $queriedInfo->isEmpty()); + + return [ + 'pages' => [ + 'firstItem' => $queriedInfo->firstItem(), + 'itemCount' => $queriedInfo->count(), + 'currentPage' => $queriedInfo->currentPage(), + ], + 'users' => $queriedInfo->toArray()['data'], + ]; + } +} diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php new file mode 100644 index 00000000..c6cd7e6e --- /dev/null +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -0,0 +1,344 @@ +, + * replies: ?Collection, + * subReplies: ?Collection + * } + */ + protected array $queryResult; + + private array $queryResultPages; + + protected string $orderByField; + + protected bool $orderByDesc; + + abstract public function query(QueryParams $params, ?string $cursor): self; + + public function __construct( + private readonly LaravelDebugbar $debugbar, + private readonly CursorCodec $cursorCodec, + private readonly int $perPageItems = 50, + ) {} + + public function getResultPages(): array + { + return $this->queryResultPages; + } + + /** + * @param int $fid + * @param Collection> $queries key by post type + * @param string|null $cursorParamValue + * @param string|null $queryByPostIDParamName + * @return void + */ + protected function setResult( + int $fid, + Collection $queries, + ?string $cursorParamValue, + ?string $queryByPostIDParamName = null, + ): void { + $this->debugbar->startMeasure('setResult'); + + $addOrderByForBuilder = fn(Builder $qb, string $postType): Builder => $qb + // we don't have to select the post ID + // since it's already selected by invokes of Post::scopeSelectCurrentAndParentPostID() + ->addSelect($this->orderByField) + ->orderBy($this->orderByField, $this->orderByDesc === true ? 'DESC' : 'ASC') + // cursor paginator requires values of orderBy column are unique + // if not it should fall back to other unique field (here is the post ID primary key) + // https://use-the-index-luke.com/no-offset + // https://mysql.rjweb.org/doc.php/pagination + // https://medium.com/swlh/how-to-implement-cursor-pagination-like-a-pro-513140b65f32 + // https://slack.engineering/evolving-api-pagination-at-slack/ + ->orderBy(Helper::POST_TYPE_TO_ID[$postType]); + + $queriesWithOrderBy = $queries->map($addOrderByForBuilder); + $cursorsKeyByPostType = null; + if ($cursorParamValue !== null) { + $cursorsKeyByPostType = $this->cursorCodec->decodeCursor($cursorParamValue, $this->orderByField); + // remove queries for post types with encoded cursor ',,' + $queriesWithOrderBy = $queriesWithOrderBy->intersectByKeys($cursorsKeyByPostType); + } + $this->debugbar->startMeasure('initPaginators'); + /** @var Collection $paginators key by post type */ + $paginators = $queriesWithOrderBy->map(fn(Builder $qb, string $type) => + $qb->cursorPaginate($this->perPageItems, cursor: $cursorsKeyByPostType[$type] ?? null)); + $this->debugbar->stopMeasure('initPaginators'); + + /** @var Collection $postsKeyByTypePluralName */ + $postsKeyByTypePluralName = $paginators + // cast paginator with queried posts to Collection + ->map(static fn(CursorPaginator $paginator) => $paginator->collect()) + ->mapWithKeys(static fn(Collection $posts, string $type) => + [Helper::POST_TYPE_TO_PLURAL[$type] => $posts]); + Helper::abortAPIIf(40401, $postsKeyByTypePluralName->every(static fn(Collection $i) => $i->isEmpty())); + $this->queryResult = ['fid' => $fid, ...$postsKeyByTypePluralName]; + + $hasMore = self::unionPageStats( + $paginators, + 'hasMorePages', + static fn(Collection $v) => $v->filter()->count() !== 0, // Collection->filter() will remove false values + ); + $this->queryResultPages = [ + 'currentCursor' => $cursorParamValue ?? '', + 'nextCursor' => $hasMore + ? $this->cursorCodec->encodeNextCursor( + $queryByPostIDParamName === null + ? $postsKeyByTypePluralName + : $postsKeyByTypePluralName->except([Helper::POST_ID_TO_TYPE_PLURAL[$queryByPostIDParamName]]), + $this->orderByField, + ) + : null, + ]; + + $this->debugbar->stopMeasure('setResult'); + } + + /** + * Union builders pagination $unionMethodName data by $unionStatement + * + * @param Collection $paginators key by post type + * @param string $unionMethodName + * @param Closure $unionCallback (Collection): TReturn + * @template TReturn + * @return TReturn returned by $unionCallback() + */ + private static function unionPageStats( + Collection $paginators, + string $unionMethodName, + Closure $unionCallback, + ): mixed { + // Collection::filter() will remove falsy values + $unionValues = $paginators->map(static fn(CursorPaginator $p) => $p->$unionMethodName()); + return $unionCallback($unionValues->isEmpty() ? collect(0) : $unionValues); // prevent empty array + } + + /** + * @return array{ + * fid: int, + * threads: Collection, + * replies: Collection, + * subReplies: Collection, + * matchQueryPostCount: array{thread: int, reply: int, subReply: int}, + * notMatchQueryParentPostCount: array{thread: int, reply: int}, + * } + */ + public function fillWithParentPost(): array + { + $result = $this->queryResult; + /** @var Collection $tids */ + /** @var Collection $pids */ + /** @var Collection $spids */ + /** @var Collection $replies */ + /** @var Collection $subReplies */ + [[, $tids], [$replies, $pids], [$subReplies, $spids]] = array_map( + /** + * @param string $postIDName + * @return array{0: Collection, 1: Collection} + */ + static function (string $postIDName) use ($result): array { + $postTypePluralName = Helper::POST_ID_TO_TYPE_PLURAL[$postIDName]; + return \array_key_exists($postTypePluralName, $result) + ? [$result[$postTypePluralName], $result[$postTypePluralName]->pluck($postIDName)] + : [collect(), collect()]; + }, + Helper::POST_ID, + ); + + /** @var int $fid */ + $fid = $result['fid']; + $postModels = PostFactory::getPostModelsByFid($fid); + + $this->debugbar->startMeasure('fillWithThreadsFields'); + /** @var Collection $parentThreadsID parent tid of all replies and their sub replies */ + $parentThreadsID = $replies->pluck('tid')->concat($subReplies->pluck('tid'))->unique(); + /** @var Collection $threads */ + $threads = $postModels['thread'] + // from the original $this->queryResult, see Post::scopeSelectCurrentAndParentPostID() + ->tid($parentThreadsID->concat($tids)) + ->selectPublicFields()->get() + ->map(static fn(Thread $thread) => // mark threads that exists in the original $this->queryResult + $thread->setAttribute('isMatchQuery', $tids->contains($thread->tid))); + $this->debugbar->stopMeasure('fillWithThreadsFields'); + + $this->debugbar->startMeasure('fillWithRepliesFields'); + /** @var Collection $parentRepliesID parent pid of all sub replies */ + $parentRepliesID = $subReplies->pluck('pid')->unique(); + $replies = $postModels['reply'] + // from the original $this->queryResult, see Post::scopeSelectCurrentAndParentPostID() + ->pid($parentRepliesID->concat($pids)) + ->selectPublicFields()->with('contentProtoBuf')->get() + ->map(static fn(Reply $r) => // mark replies that exists in the original $this->queryResult + $r->setAttribute('isMatchQuery', $pids->contains($r->pid))); + $this->debugbar->stopMeasure('fillWithRepliesFields'); + + $this->debugbar->startMeasure('fillWithSubRepliesFields'); + $subReplies = $postModels['subReply']->spid($spids) + ->selectPublicFields()->with('contentProtoBuf')->get(); + $this->debugbar->stopMeasure('fillWithSubRepliesFields'); + + $this->debugbar->startMeasure('parsePostContentProtoBufBytes'); + $replies->concat($subReplies)->each(function ($post) { + $post->content = $post->contentProtoBuf?->protoBufBytes?->value; + unset($post->contentProtoBuf); + }); + $this->debugbar->stopMeasure('parsePostContentProtoBufBytes'); + + return [ + 'fid' => $fid, + 'matchQueryPostCount' => collect(Helper::POST_TYPES) + ->combine([$tids, $pids, $spids]) + ->map(static fn(Collection $ids, string $type) => $ids->count()), + 'notMatchQueryParentPostCount' => [ + 'thread' => $parentThreadsID->diff($tids)->count(), + 'reply' => $parentRepliesID->diff($pids)->count(), + ], + ...array_combine(Helper::POST_TYPES_PLURAL, [$threads, $replies, $subReplies]), + ]; + } + + /** + * @param Collection $threads + * @param Collection $replies + * @param Collection $subReplies + * @phpcs:ignore Generic.Files.LineLength.TooLong + * @return Collection>>>>> + * @SuppressWarnings(PHPMD.CamelCaseParameterName) + */ + public function nestPostsWithParent( + Collection $threads, + Collection $replies, + Collection $subReplies, + ...$_, + ): Collection { + $this->debugbar->startMeasure('nestPostsWithParent'); + + $replies = $replies->groupBy('tid'); + $subReplies = $subReplies->groupBy('pid'); + $ret = $threads + ->map(fn(Thread $thread) => [ + ...$thread->toArray(), + 'replies' => $replies + ->get($thread->tid, collect()) + ->map(fn(Reply $reply) => [ + ...$reply->toArray(), + 'subReplies' => $subReplies->get($reply->pid, collect()), + ]), + ]) + ->recursive(); + + $this->debugbar->stopMeasure('nestPostsWithParent'); + return $ret; + } + + /** + * @phpcs:ignore Generic.Files.LineLength.TooLong + * @param Collection>>>>> $nestedPosts + * @return list>>>>> + */ + public function reOrderNestedPosts(Collection $nestedPosts, bool $shouldRemoveSortingKey = true): array + { + $this->debugbar->startMeasure('reOrderNestedPosts'); + + /** + * @param Collection>>> $curPost + * @param string $childPostTypePluralName + * @return Collection>>> + */ + $setSortingKeyFromCurrentAndChildPosts = function ( + Collection $curPost, + string $childPostTypePluralName, + ): Collection { + /** @var Collection> $childPosts sorted child posts */ + $childPosts = $curPost[$childPostTypePluralName]; + $curPost[$childPostTypePluralName] = $childPosts->values(); // reset keys + + // use the topmost value between sorting key or value of orderBy field within its child posts + $curAndChildSortingKeys = collect([ + // value of orderBy field in the first sorted child post that isMatchQuery after previous sorting + $childPosts + // sub replies won't have isMatchQuery + ->filter(static fn(Collection $p) => ($p['isMatchQuery'] ?? true) === true) + // if no child posts matching the query, use null as the sorting key + ->first()[$this->orderByField] ?? null, + // sorting key from the first sorted child posts + // not requiring isMatchQuery since a child post without isMatchQuery + // might have its own child posts with isMatchQuery + // and its sortingKey would be selected from its own child posts + $childPosts->first()['sortingKey'] ?? null, + ]); + if ($curPost['isMatchQuery'] === true) { + // also try to use the value of orderBy field in current post + $curAndChildSortingKeys->push($curPost[$this->orderByField]); + } + + // Collection->filter() will remove falsy values like null + $curAndChildSortingKeys = $curAndChildSortingKeys->filter()->sort(); + $curPost['sortingKey'] = $this->orderByDesc + ? $curAndChildSortingKeys->last() + : $curAndChildSortingKeys->first(); + + return $curPost; + }; + $sortBySortingKey = fn(Collection $posts): Collection => $posts + ->sortBy(fn(Collection $i) => $i['sortingKey'], descending: $this->orderByDesc); + $removeSortingKey = $shouldRemoveSortingKey + ? /** @psalm-return Collection */ + static fn(Collection $posts): Collection => $posts + ->map(fn(Collection $i) => $i->except('sortingKey')) + : static fn($i) => $i; + $ret = $removeSortingKey($sortBySortingKey( + $nestedPosts->map( + /** + * @param Collection{replies: Collection} $thread + * @return Collection{replies: Collection} + */ + function (Collection $thread) use ( + $sortBySortingKey, + $removeSortingKey, + $setSortingKeyFromCurrentAndChildPosts + ) { + $thread['replies'] = $sortBySortingKey($thread['replies']->map( + /** + * @param Collection{subReplies: Collection} $reply + * @return Collection{subReplies: Collection} + */ + function (Collection $reply) use ($setSortingKeyFromCurrentAndChildPosts) { + $reply['subReplies'] = $reply['subReplies']->sortBy( + fn(Collection $subReplies) => $subReplies[$this->orderByField], + descending: $this->orderByDesc, + ); + return $setSortingKeyFromCurrentAndChildPosts($reply, 'subReplies'); + }, + )); + $setSortingKeyFromCurrentAndChildPosts($thread, 'replies'); + $thread['replies'] = $removeSortingKey($thread['replies']); + return $thread; + }, + ), + ))->values()->toArray(); + + $this->debugbar->stopMeasure('reOrderNestedPosts'); + return $ret; + } +} diff --git a/symfony/src/PostsQuery/IndexQuery.php b/symfony/src/PostsQuery/IndexQuery.php new file mode 100644 index 00000000..9c807026 --- /dev/null +++ b/symfony/src/PostsQuery/IndexQuery.php @@ -0,0 +1,107 @@ + $flatParams key by param name */ + $flatParams = array_reduce( + $params->pick(...ParamsValidator::UNIQUE_PARAMS_NAME, ...Helper::POST_ID), + static fn(array $accParams, QueryParam $param) => + [...$accParams, $param->name => $param->value, ...$param->getAllSub()], + [], + ); // flatten unique query params + /** @var Collection $postIDParam key by post ID name, should contains only one param */ + $postIDParam = collect($flatParams)->only(Helper::POST_ID); + $postIDParamName = $postIDParam->keys()->first(); + $postIDParamValue = $postIDParam->first(); + $hasPostIDParam = $postIDParam->count() === 1; + /** @var array $postTypes */ + $postTypes = $flatParams['postTypes']; + + /** + * @param int $fid + * @return Collection key by post type + */ + $getQueryBuilders = static fn(int $fid): Collection => + collect(PostFactory::getPostModelsByFid($fid)) + ->only($postTypes) + ->transform(static fn(Post $model, string $type) => $model->selectCurrentAndParentPostID()); + $getFidByPostIDParam = static function (string $postIDName, int $postID): int { + $counts = Forum::get('fid') + ->pluck('fid') + ->map(static fn(int $fid) => + PostFactory::getPostModelsByFid($fid)[Helper::POST_ID_TO_TYPE[$postIDName]] + ->selectRaw("{$fid} AS fid, COUNT(*) AS count") + ->where($postIDName, $postID)) + ->reduce(/** @return BuilderContract|EloquentBuilder|QueryBuilder */ + static fn( + ?BuilderContract $acc, + EloquentBuilder|QueryBuilder $cur, + ): EloquentBuilder|QueryBuilder|BuilderContract => + $acc === null ? $cur : $acc->union($cur), + ) + ->get() + ->where('count', '!=', 0); + Helper::abortAPIIf(50001, $counts->count() > 1); + Helper::abortAPIIf(40401, $counts->count() === 0); + return $counts->pluck('fid')->first(); + }; + + if (\array_key_exists('fid', $flatParams)) { + /** @var int $fid */ $fid = $flatParams['fid']; + if (Forum::fid($fid)->exists()) { + /** @var Collection> $queries key by post type */ + $queries = $getQueryBuilders($fid); + } elseif ($hasPostIDParam) { // query by post ID and fid, but the provided fid is invalid + $fid = $getFidByPostIDParam($postIDParamName, $postIDParamValue); + $queries = $getQueryBuilders($fid); + } else { + Helper::abortAPI(40406); + } + } elseif ($hasPostIDParam) { // query by post ID only + $fid = $getFidByPostIDParam($postIDParamName, $postIDParamValue); + $queries = $getQueryBuilders($fid); + } else { + Helper::abortAPI(40001); + } + + if ($hasPostIDParam) { + $queries = $queries + ->only(\array_slice( + Helper::POST_TYPES, // only query post types that own the querying post ID param + array_search($postIDParamName, Helper::POST_ID, true), + )) + ->map(static fn(EloquentBuilder $qb, string $type) => + $qb->where($postIDParamName, $postIDParamValue)); + } + + if (array_diff($postTypes, Helper::POST_TYPES) !== []) { + $queries = $queries->only($postTypes); + } + + if ($flatParams['orderBy'] === 'default') { + $this->orderByField = 'postedAt'; // order by postedAt to prevent posts out of order when order by post ID + if (\array_key_exists('fid', $flatParams) && $postIDParam->count() === 0) { // query by fid only + $this->orderByDesc = true; + } elseif ($hasPostIDParam) { // query by post ID (with or without fid) + $this->orderByDesc = false; + } + } + + $this->setResult($fid, $queries, $cursor, $hasPostIDParam ? $postIDParamName : null); + return $this; + } +} diff --git a/symfony/src/PostsQuery/SearchQuery.php b/symfony/src/PostsQuery/SearchQuery.php new file mode 100644 index 00000000..658c4df2 --- /dev/null +++ b/symfony/src/PostsQuery/SearchQuery.php @@ -0,0 +1,163 @@ +getUniqueParamValue('fid'); + /** @var array>> $cachedUserQuery key by param name */ + $cachedUserQuery = []; + /** @var Collection> $queries key by post type */ + $queries = collect(PostFactory::getPostModelsByFid($fid)) + ->only($params->getUniqueParamValue('postTypes')) + ->map(function (Post $postModel) use ($params, &$cachedUserQuery): Builder { + $postQuery = $postModel->newQuery(); + foreach ($params->omit() as $param) { // omit nothing to get all params + // even when $cachedUserQuery[$param->name] is null + // it will still pass as a reference to the array item + // that is null at this point, but will be later updated by ref + $postQuery = self::applyQueryParamsOnQuery( + $postQuery, + $param, + $cachedUserQuery[$param->name], + ); + } + return $postQuery->selectCurrentAndParentPostID(); + }); + + $orderByParam = $params->pick('orderBy')[0]; + $this->orderByField = $orderByParam->value; + $this->orderByDesc = $orderByParam->getSub('direction'); + if ($this->orderByField === 'default') { + $this->orderByField = 'postedAt'; + $this->orderByDesc = true; + } + + $this->setResult($fid, $queries, $cursor); + return $this; + } + + /** + * Apply conditions of query params on a query builder that created from posts model + */ + private static function applyQueryParamsOnQuery( + Builder $query, + QueryParam $param, + ?Collection &$outCachedUserQueryResult, + ): Builder { + $name = $param->name; + $value = $param->value; + $sub = $param->getAllSub(); + $sub['not'] ??= false; + $not = $sub['not'] ? 'Not' : ''; + $inverseNot = $sub['not'] ? '' : 'Not'; + + $fieldNameOfNumericParams = [ + 'threadViewCount' => 'viewCount', + 'threadShareCount' => 'shareCount', + 'threadReplyCount' => 'replyCount', + 'replySubReplyCount' => 'subReplyCount', + ][$name] ?? $name; + $inverseRangeOfNumericParams = [ + '<' => '>=', + '=' => '!=', + '>' => '<=', + ][$sub['range'] ?? null] ?? null; + + $userTypeOfUserParams = str_starts_with($name, 'author') ? 'author' : 'latestReplier'; + $fieldNameOfUserNameParams = str_ends_with($name, 'DisplayName') ? 'displayName' : 'name'; + $getAndCacheUserQuery = + static function (BuilderContract $newQueryWhenCacheMiss) use (&$outCachedUserQueryResult): Collection { + // $outCachedUserQueryResult === null means it's the first call + $outCachedUserQueryResult ??= $newQueryWhenCacheMiss->get(); + return $outCachedUserQueryResult; + }; + + return match ($name) { + // numeric + 'tid', 'pid', 'spid', + 'authorUid', 'authorExpGrade', 'latestReplierUid', + 'threadViewCount', 'threadShareCount', 'threadReplyCount', 'replySubReplyCount' => + $sub['range'] === 'IN' || $sub['range'] === 'BETWEEN' + ? $query->{"where$not{$sub['range']}"}($fieldNameOfNumericParams, explode(',', $value)) + : $query->where( + $fieldNameOfNumericParams, + $sub['not'] ? $inverseRangeOfNumericParams : $sub['range'], + $value, + ), + // textMatch + 'threadTitle', 'postContent' => + self::applyTextMatchParamOnQuery($query, $name === 'threadTitle' ? 'title' : 'content', $value, $sub), + // dateTimeRange + 'postedAt', 'latestReplyPostedAt' => + $query->{"where{$not}Between"}($name, explode(',', $value)), + // array + 'threadProperties' => static function () use ($sub, $inverseNot, $value, $query) { + foreach ($value as $threadProperty) { + match ($threadProperty) { + 'good' => $query->where('isGood', !$sub['not']), + 'sticky' => $query->{"where{$inverseNot}null"}('stickyType'), + }; + } + return $query; + }, + 'authorName', 'latestReplierName', 'authorDisplayName', 'latestReplierDisplayName' => + $query->{"where{$not}In"}( + "{$userTypeOfUserParams}Uid", + $getAndCacheUserQuery(self::applyTextMatchParamOnQuery( + User::select('uid'), + $fieldNameOfUserNameParams, + $value, + $sub, + )) + ), + 'authorGender', 'latestReplierGender' => + $query->{"where{$not}In"}( + "{$userTypeOfUserParams}Uid", + $getAndCacheUserQuery(User::select('uid')->where('gender', $value)) + ), + 'authorManagerType' => + $value === 'NULL' + ? $query->{"where{$not}null"}('authorManagerType') + : $query->where('authorManagerType', $sub['not'] ? '!=' : '=', $value), + default => $query, + }; + } + + /** @psalm-param array $subParams */ + private static function applyTextMatchParamOnQuery( + BuilderContract $query, + string $field, + string $value, + array $subParams, + ): BuilderContract { + $not = $subParams['not'] === true ? 'Not' : ''; + if ($subParams['matchBy'] === 'regex') { + return $query->where($field, "$not REGEXP", $value); + } + return $query->where(static function (Builder $subQuery) use ($subParams, $field, $not, $value) { + // not (A or B) <=> not A and not B, following https://en.wikipedia.org/wiki/De_Morgan%27s_laws + $isOrWhere = $not === 'Not' ? '' : 'or'; + $addMatchKeyword = static fn(string $keyword) => + $subQuery->{"{$isOrWhere}Where"}( + $field, + trim("$not LIKE"), + $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword + ); + // split multiple search keyword by space char when $subParams['spaceSplit'] == true + foreach ($subParams['spaceSplit'] ? explode(' ', $value) : [$value] as $keyword) { + $addMatchKeyword($keyword); + } + }); + } +} From a9c16f0e6dfccf906125107fa4389387139fded1 Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 7 Oct 2024 16:27:29 +0000 Subject: [PATCH 37/61] + `selectCurrentAndParentPostID()` & abstract `getTableNameSuffix()` like their namesake methods from `App\Eloquent\Model\Post\Post` in `be` - param `$tableNameSuffix` in ctor in favor of `getTableNameSuffix()` that implemented by derived classes @ `PostRepository` + `new()` to replace usages of `newForumPosts()[...]` * fix referencing entity classes in the return type phpdoc @ `newForumPosts()` @ `PostRepositoryFactory` @ `App\Repository\Post` + prop `isMatchQuery` and its getter and fluent setter @ `App\Entity\Post\Post` @ symfony --- symfony/src/Entity/Post/Post.php | 12 ++++++++++++ .../Post/Content/ReplyContentRepository.php | 7 ++++++- .../Post/Content/SubReplyContentRepository.php | 7 ++++++- symfony/src/Repository/Post/PostRepository.php | 18 ++++++++++++++++-- .../Repository/Post/PostRepositoryFactory.php | 12 ++++++++++-- .../src/Repository/Post/ReplyRepository.php | 7 ++++++- .../src/Repository/Post/SubReplyRepository.php | 7 ++++++- .../src/Repository/Post/ThreadRepository.php | 7 ++++++- 8 files changed, 68 insertions(+), 9 deletions(-) diff --git a/symfony/src/Entity/Post/Post.php b/symfony/src/Entity/Post/Post.php index 11f5d23c..e3e9ddeb 100644 --- a/symfony/src/Entity/Post/Post.php +++ b/symfony/src/Entity/Post/Post.php @@ -13,6 +13,7 @@ abstract class Post extends TimestampedEntity #[ORM\Column] private ?int $lastSeenAt; #[ORM\Column] private ?int $agreeCount; #[ORM\Column] private ?int $disagreeCount; + private bool $isMatchQuery; public function getAuthorUid(): int { @@ -38,4 +39,15 @@ public function getDisagreeCount(): int { return $this->disagreeCount ?? 0; } + + public function isMatchQuery(): bool + { + return $this->isMatchQuery; + } + + public function setIsMatchQuery(bool $isMatchQuery): static + { + $this->isMatchQuery = $isMatchQuery; + return $this; + } } diff --git a/symfony/src/Repository/Post/Content/ReplyContentRepository.php b/symfony/src/Repository/Post/Content/ReplyContentRepository.php index 8aef0404..b73941ee 100644 --- a/symfony/src/Repository/Post/Content/ReplyContentRepository.php +++ b/symfony/src/Repository/Post/Content/ReplyContentRepository.php @@ -16,6 +16,11 @@ class ReplyContentRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) { - parent::__construct($registry, $entityManager, ReplyContent::class, 'reply_content', $fid); + parent::__construct($registry, $entityManager, ReplyContent::class, $fid); + } + + protected function getTableNameSuffix(): string + { + return 'reply_content'; } } diff --git a/symfony/src/Repository/Post/Content/SubReplyContentRepository.php b/symfony/src/Repository/Post/Content/SubReplyContentRepository.php index f3f4c16a..ad804160 100644 --- a/symfony/src/Repository/Post/Content/SubReplyContentRepository.php +++ b/symfony/src/Repository/Post/Content/SubReplyContentRepository.php @@ -16,6 +16,11 @@ class SubReplyContentRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) { - parent::__construct($registry, $entityManager, SubReplyContent::class, 'subReply_content', $fid); + parent::__construct($registry, $entityManager, SubReplyContent::class, $fid); + } + + protected function getTableNameSuffix(): string + { + return 'subReply_content'; } } diff --git a/symfony/src/Repository/Post/PostRepository.php b/symfony/src/Repository/Post/PostRepository.php index 75775d8d..b7f6b8ec 100644 --- a/symfony/src/Repository/Post/PostRepository.php +++ b/symfony/src/Repository/Post/PostRepository.php @@ -3,8 +3,10 @@ namespace App\Repository\Post; use App\Entity\Post\Post; +use App\Helper; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; /** @@ -13,6 +15,8 @@ */ abstract class PostRepository extends ServiceEntityRepository { + abstract protected function getTableNameSuffix(): string; + /** * @param class-string $postClass */ @@ -20,10 +24,20 @@ public function __construct( ManagerRegistry $registry, EntityManagerInterface $entityManager, string $postClass, - string $tableNameSuffix, int $fid, ) { parent::__construct($registry, $postClass); - $entityManager->getClassMetadata($postClass)->setPrimaryTable(['name' => "tbmc_f{$fid}_{$tableNameSuffix}"]); + $entityManager->getClassMetadata($postClass)->setPrimaryTable([ + 'name' => "tbmc_f{$fid}_" . $this->getTableNameSuffix() + ]); + } + + public function selectCurrentAndParentPostID(): QueryBuilder + { + return $this->createQueryBuilder('t')->addSelect(collect(Helper::POST_TYPE_TO_ID) + ->slice(0, array_search($this->getTableNameSuffix(), Helper::POST_TYPES, true) + 1) + ->values() + ->map(static fn(string $postIDField) => "t.$postIDField") + ->all()); } } diff --git a/symfony/src/Repository/Post/PostRepositoryFactory.php b/symfony/src/Repository/Post/PostRepositoryFactory.php index 5ae4c5a2..bb2cddca 100644 --- a/symfony/src/Repository/Post/PostRepositoryFactory.php +++ b/symfony/src/Repository/Post/PostRepositoryFactory.php @@ -2,7 +2,6 @@ namespace App\Repository\Post; -use App\Entity\Post as Entity; use App\Helper; use App\Repository\Post\Content\ReplyContentRepository; use App\Repository\Post\Content\SubReplyContentRepository; @@ -42,7 +41,7 @@ public function newSubReplyContent(int $fid): SubReplyContentRepository } /** - * @return array{thread: Entity\Thread, reply: Entity\Reply, subReply: Entity\SubReply} + * @return array{thread: ThreadRepository, reply: ReplyRepository, subReply: SubReplyRepository} */ public function newForumPosts(int $fid): array { @@ -51,4 +50,13 @@ public function newForumPosts(int $fid): array [$this->newThread($fid), $this->newReply($fid), $this->newSubReply($fid)], ); } + + public function new(int $fid, string $postType): PostRepository + { + return match ($postType) { + 'thread' => $this->newThread($fid), + 'reply' => $this->newReply($fid), + 'subReply' => $this->newSubReply($fid), + }; + } } diff --git a/symfony/src/Repository/Post/ReplyRepository.php b/symfony/src/Repository/Post/ReplyRepository.php index fc5530fd..75b2f55d 100644 --- a/symfony/src/Repository/Post/ReplyRepository.php +++ b/symfony/src/Repository/Post/ReplyRepository.php @@ -15,6 +15,11 @@ class ReplyRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) { - parent::__construct($registry, $entityManager, Reply::class, 'reply', $fid); + parent::__construct($registry, $entityManager, Reply::class, $fid); + } + + protected function getTableNameSuffix(): string + { + return 'reply'; } } diff --git a/symfony/src/Repository/Post/SubReplyRepository.php b/symfony/src/Repository/Post/SubReplyRepository.php index a3df9230..4c9716e4 100644 --- a/symfony/src/Repository/Post/SubReplyRepository.php +++ b/symfony/src/Repository/Post/SubReplyRepository.php @@ -15,6 +15,11 @@ class SubReplyRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) { - parent::__construct($registry, $entityManager, SubReply::class, 'subReply', $fid); + parent::__construct($registry, $entityManager, SubReply::class, $fid); + } + + protected function getTableNameSuffix(): string + { + return 'subRreply'; } } diff --git a/symfony/src/Repository/Post/ThreadRepository.php b/symfony/src/Repository/Post/ThreadRepository.php index 207f33b2..a57d630f 100644 --- a/symfony/src/Repository/Post/ThreadRepository.php +++ b/symfony/src/Repository/Post/ThreadRepository.php @@ -15,7 +15,12 @@ class ThreadRepository extends PostRepository { public function __construct(ManagerRegistry $registry, EntityManagerInterface $entityManager, int $fid) { - parent::__construct($registry, $entityManager, Thread::class, 'thread', $fid); + parent::__construct($registry, $entityManager, Thread::class, $fid); + } + + protected function getTableNameSuffix(): string + { + return 'thread'; } public function getThreadsIdByChunks(int $chunkSize): array From 9a3b1fa85cf7425e22a81dfaeaa77c011cf2e695 Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 7 Oct 2024 16:28:43 +0000 Subject: [PATCH 38/61] * migrate files that copied from `be` in 872e0e6d2ed116220fd3fc6b3fbabbdea0b16738 from laravel eloquent to doctrine @ symfony --- symfony/src/Controller/PostsQuery.php | 105 +++++++------ symfony/src/Controller/UsersQuery.php | 75 ++++++---- symfony/src/PostsQuery/BaseQuery.php | 158 ++++++++++---------- symfony/src/PostsQuery/IndexQuery.php | 63 ++++---- symfony/src/PostsQuery/ParamsValidator.php | 1 - symfony/src/PostsQuery/SearchQuery.php | 165 ++++++++++++--------- 6 files changed, 311 insertions(+), 256 deletions(-) diff --git a/symfony/src/Controller/PostsQuery.php b/symfony/src/Controller/PostsQuery.php index b5766616..6f25b06d 100644 --- a/symfony/src/Controller/PostsQuery.php +++ b/symfony/src/Controller/PostsQuery.php @@ -1,39 +1,42 @@ app->makeWith(ParamsValidator::class, ['params' => \Safe\json_decode( - $request->validate([ - 'cursor' => [ // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data - // (,|$)|,){5,6} means allow at most 5~6 parts of base64 segment or empty string to exist - 'regex:/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/', - ], - 'query' => 'json|required', - ])['query'], - assoc: true, - )]); + $this->validator->validate($parameterBag->all(), new Assert\Collection([ + 'cursor' => new Assert\Regex( // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data + // (,|$)|,){5,6} means allow at most 5~6 parts of base64 segment or empty string to exist + '/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/' + ), + 'query' => new Assert\Json(), + ])); + $validator = new ParamsValidator($this->validator, \Safe\json_decode($parameterBag->get('query'), true)); $params = $validator->params; $postIDParams = $params->pick(...Helper::POST_ID); @@ -54,31 +57,37 @@ public function query(\Illuminate\Http\Request $request): array $validator->addDefaultParamsThenValidate(shouldSkip40003: $isIndexQuery); $queryClass = $isIndexQuery ? IndexQuery::class : SearchQuery::class; - $this->debugbar->startMeasure('$queryClass->query()'); - $query = (new $queryClass())->query($params, $request->get('cursor')); - $this->debugbar->stopMeasure('$queryClass->query()'); - $this->debugbar->startMeasure('fillWithParentPost'); + $this->stopwatch->start('$queryClass->query()'); + $query = (new $queryClass())->query($params, $this->getParameter('cursor')); + $this->stopwatch->stop('$queryClass->query()'); + $this->stopwatch->start('fillWithParentPost'); $result = $query->fillWithParentPost(); - $this->debugbar->stopMeasure('fillWithParentPost'); + $this->stopwatch->stop('fillWithParentPost'); - $this->debugbar->startMeasure('queryUsers'); + $this->stopwatch->start('queryUsers'); $latestRepliersId = $result['threads']->pluck('latestReplierId'); - $latestRepliers = LatestReplier::query()->whereIn('id', $latestRepliersId) - ->whereNotNull('uid')->selectPublicFields()->get() - ->concat(LatestReplier::query()->whereIn('id', $latestRepliersId) - ->whereNull('uid')->selectPublicFields() - ->addSelect(['name', 'displayName'])->get()); - $whereCurrentFid = static fn(HasOne $q): HasOne => $q->where('fid', $result['fid']); - $users = User::query()->whereIn( - 'uid', - collect($result) - ->only(Helper::POST_TYPES_PLURAL) - ->flatMap(static fn(Collection $posts) => $posts->pluck('authorUid')) - ->concat($latestRepliers->pluck('uid')) - ->filter()->unique(), // remove NULLs - )->with(['currentForumModerator' => $whereCurrentFid, 'currentAuthorExpGrade' => $whereCurrentFid]) - ->selectPublicFields()->get(); - $this->debugbar->stopMeasure('queryUsers'); + $latestRepliers = collect() + ->concat($this->latestReplierRepository->createQueryBuilder('t') + ->where('t.id IN (?ids)')->setParameter('ids', $latestRepliersId) + ->where('t.uid IS NOT NULL') + ->getQuery()->getResult()) + ->concat($this->latestReplierRepository->createQueryBuilder('t') + ->where('t.id IN (?ids)')->setParameter('ids', $latestRepliersId) + ->where('t.uid IS NULL') + ->addSelect('name', 'displayName') + ->getQuery()->getResult()); + $users = $this->userRepository->createQueryBuilder('t') + ->where('t.uid IN (:uids)') + ->setParameter( + 'uids', + collect($result) + ->only(Helper::POST_TYPES_PLURAL) + ->flatMap(static fn(Collection $posts) => $posts->pluck('authorUid')) + ->concat($latestRepliers->pluck('uid')) + ->filter()->unique()->toArray() // remove NULLs + ) + ->getQuery()->getResult(); + $this->stopwatch->stop('queryUsers'); return [ 'type' => $isIndexQuery ? 'index' : 'search', @@ -86,7 +95,9 @@ public function query(\Illuminate\Http\Request $request): array ...$query->getResultPages(), ...Arr::except($result, ['fid', ...Helper::POST_TYPES_PLURAL]), ], - 'forum' => Forum::fid($result['fid'])->selectPublicFields()->first(), + 'forum' => $this->forumRepository->createQueryBuilder('t') + ->where('t.fid = :fid')->setParameter('fid', $result['fid']) + ->setMaxResults(1)->getQuery()->getResult(), 'threads' => $query->reOrderNestedPosts($query->nestPostsWithParent(...$result)), 'users' => $users, 'latestRepliers' => $latestRepliers, diff --git a/symfony/src/Controller/UsersQuery.php b/symfony/src/Controller/UsersQuery.php index fb3f34aa..55b7eac5 100644 --- a/symfony/src/Controller/UsersQuery.php +++ b/symfony/src/Controller/UsersQuery.php @@ -1,48 +1,65 @@ validate([ - 'uid' => 'integer', - 'name' => 'string', - 'displayName' => 'string', - 'gender' => 'string|in:0,1,2,NULL', - ]); - Helper::abortAPIIf(40402, empty($queryParams)); + $queryParams = \Safe\json_decode($this->getParameter('query')); + $paramConstraints = [ + 'uid' => new Assert\Type('digit'), + 'name' => new Assert\Type('string'), + 'displayName' => new Assert\Type('string'), + 'gender' => new Assert\Choice(['0', '1', '2', 'NULL']), + ]; + $this->validator->validate($queryParams, new Assert\Collection($paramConstraints)); - $queryBuilder = User::query(); + $queriedUsers = collect(collect($queryParams) + ->reduce( + function (QueryBuilder $acc, $paramValue, string $paramName) use ($paramConstraints): QueryBuilder { + if (!array_key_exists($paramName, $paramConstraints)) { + throw new \InvalidArgumentException(); + } + return $paramValue === 'NULL' + && in_array($paramName, ['name', 'displayName', 'gender'], true) + ? $acc->andWhere("t.$paramName IS NULL") + : $acc->andWhere("t.$paramName = :paramValue") + ->setParameter('paramValue', $paramValue); + }, + $this->userRepository->createQueryBuilder('t') + ) + ?->orderBy('t.id', 'DESC') + ->setMaxResults($this->perPageItems + 1) + ->getQuery()->getResult()); + Helper::abortAPIIf(40402, $queriedUsers->isEmpty()); - $nullableParams = ['name', 'displayName', 'gender']; - foreach ($nullableParams as $nullableParamName) { - if (\array_key_exists($nullableParamName, $queryParams) && $queryParams[$nullableParamName] === 'NULL') { - $queryBuilder = $queryBuilder->whereNull($nullableParamName); - unset($queryParams[$nullableParamName]); - } + $hasMorePages = false; + if ($queriedUsers->count() === $this->perPageItems + 1) { + $queriedUsers->pop(); + $hasMorePages = true; } - $queriedInfo = $queryBuilder - ->where($queryParams) - ->orderBy('id', 'DESC') - ->selectPublicFields() - ->simplePaginate($this->perPageItems); - Helper::abortAPIIf(40402, $queriedInfo->isEmpty()); - return [ 'pages' => [ - 'firstItem' => $queriedInfo->firstItem(), - 'itemCount' => $queriedInfo->count(), - 'currentPage' => $queriedInfo->currentPage(), + 'itemCount' => $queriedUsers->count(), + 'hasMore' => $hasMorePages, ], - 'users' => $queriedInfo->toArray()['data'], + 'users' => $queriedUsers->all(), ]; } } diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index c6cd7e6e..9adad103 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -1,18 +1,17 @@ > $queries key by post type + * @param Collection $queries key by post type * @param string|null $cursorParamValue * @param string|null $queryByPostIDParamName * @return void @@ -57,11 +58,11 @@ protected function setResult( ?string $cursorParamValue, ?string $queryByPostIDParamName = null, ): void { - $this->debugbar->startMeasure('setResult'); + $this->stopwatch->start('setResult'); - $addOrderByForBuilder = fn(Builder $qb, string $postType): Builder => $qb + $addOrderByForBuilder = fn(QueryBuilder $qb, string $postType): QueryBuilder => $qb // we don't have to select the post ID - // since it's already selected by invokes of Post::scopeSelectCurrentAndParentPostID() + // since it's already selected by invokes of PostRepository->selectCurrentAndParentPostID() ->addSelect($this->orderByField) ->orderBy($this->orderByField, $this->orderByDesc === true ? 'DESC' : 'ASC') // cursor paginator requires values of orderBy column are unique @@ -79,29 +80,38 @@ protected function setResult( // remove queries for post types with encoded cursor ',,' $queriesWithOrderBy = $queriesWithOrderBy->intersectByKeys($cursorsKeyByPostType); } - $this->debugbar->startMeasure('initPaginators'); - /** @var Collection $paginators key by post type */ - $paginators = $queriesWithOrderBy->map(fn(Builder $qb, string $type) => - $qb->cursorPaginate($this->perPageItems, cursor: $cursorsKeyByPostType[$type] ?? null)); - $this->debugbar->stopMeasure('initPaginators'); + $this->stopwatch->start('initPaginators'); + /** @var Collection $paginators key by post type */ + $paginators = $queriesWithOrderBy->map(function (QueryBuilder $qb, string $type) use ($cursorsKeyByPostType) { + $cursors = $cursorsKeyByPostType[$type]; + if ($cursors === null) { + return $qb; + } + return collect($cursors)->reduce( + static fn(QueryBuilder $acc, $cursorValue, string $cursorField): QueryBuilder => + $acc->andWhere("t.$cursorField > :cursorValue")->setParameter('cursorValue', $cursorValue), + $qb + )?->setMaxResults($this->perPageItems + 1); + }); + $this->stopwatch->stop('initPaginators'); + $hasMorePages = false; /** @var Collection $postsKeyByTypePluralName */ $postsKeyByTypePluralName = $paginators - // cast paginator with queried posts to Collection - ->map(static fn(CursorPaginator $paginator) => $paginator->collect()) - ->mapWithKeys(static fn(Collection $posts, string $type) => - [Helper::POST_TYPE_TO_PLURAL[$type] => $posts]); + ->mapWithKeys(function (QueryBuilder $paginator, string $postType) use (&$hasMorePages) { + $posts = collect($paginator->getQuery()->getResult()); + if ($posts->count() === $this->perPageItems + 1) { + $posts->pop(); + $hasMorePages = true; + } + return [Helper::POST_TYPE_TO_PLURAL[$postType] => $posts]; + }); Helper::abortAPIIf(40401, $postsKeyByTypePluralName->every(static fn(Collection $i) => $i->isEmpty())); $this->queryResult = ['fid' => $fid, ...$postsKeyByTypePluralName]; - $hasMore = self::unionPageStats( - $paginators, - 'hasMorePages', - static fn(Collection $v) => $v->filter()->count() !== 0, // Collection->filter() will remove false values - ); $this->queryResultPages = [ 'currentCursor' => $cursorParamValue ?? '', - 'nextCursor' => $hasMore + 'nextCursor' => $hasMorePages ? $this->cursorCodec->encodeNextCursor( $queryByPostIDParamName === null ? $postsKeyByTypePluralName @@ -111,26 +121,7 @@ protected function setResult( : null, ]; - $this->debugbar->stopMeasure('setResult'); - } - - /** - * Union builders pagination $unionMethodName data by $unionStatement - * - * @param Collection $paginators key by post type - * @param string $unionMethodName - * @param Closure $unionCallback (Collection): TReturn - * @template TReturn - * @return TReturn returned by $unionCallback() - */ - private static function unionPageStats( - Collection $paginators, - string $unionMethodName, - Closure $unionCallback, - ): mixed { - // Collection::filter() will remove falsy values - $unionValues = $paginators->map(static fn(CursorPaginator $p) => $p->$unionMethodName()); - return $unionCallback($unionValues->isEmpty() ? collect(0) : $unionValues); // prevent empty array + $this->stopwatch->stop('setResult'); } /** @@ -167,42 +158,47 @@ static function (string $postIDName) use ($result): array { /** @var int $fid */ $fid = $result['fid']; - $postModels = PostFactory::getPostModelsByFid($fid); + $postModels = $this->postRepositoryFactory->newForumPosts($fid); - $this->debugbar->startMeasure('fillWithThreadsFields'); + $this->stopwatch->start('fillWithThreadsFields'); /** @var Collection $parentThreadsID parent tid of all replies and their sub replies */ $parentThreadsID = $replies->pluck('tid')->concat($subReplies->pluck('tid'))->unique(); /** @var Collection $threads */ - $threads = $postModels['thread'] - // from the original $this->queryResult, see Post::scopeSelectCurrentAndParentPostID() - ->tid($parentThreadsID->concat($tids)) - ->selectPublicFields()->get() - ->map(static fn(Thread $thread) => // mark threads that exists in the original $this->queryResult - $thread->setAttribute('isMatchQuery', $tids->contains($thread->tid))); - $this->debugbar->stopMeasure('fillWithThreadsFields'); + $threads = array_map( + static fn(Thread $thread) => + $thread->setIsMatchQuery($tids->contains($thread->getTid())), + $postModels['thread']->createQueryBuilder('t') + ->where('t.tid IN (:tids)')->setParameter('tids', $parentThreadsID->concat($tids)->toArray()) + ->getQuery()->getResult() + ); + $this->stopwatch->stop('fillWithThreadsFields'); - $this->debugbar->startMeasure('fillWithRepliesFields'); + $this->stopwatch->start('fillWithRepliesFields'); /** @var Collection $parentRepliesID parent pid of all sub replies */ $parentRepliesID = $subReplies->pluck('pid')->unique(); - $replies = $postModels['reply'] - // from the original $this->queryResult, see Post::scopeSelectCurrentAndParentPostID() - ->pid($parentRepliesID->concat($pids)) - ->selectPublicFields()->with('contentProtoBuf')->get() - ->map(static fn(Reply $r) => // mark replies that exists in the original $this->queryResult - $r->setAttribute('isMatchQuery', $pids->contains($r->pid))); - $this->debugbar->stopMeasure('fillWithRepliesFields'); + $replies = array_map( + static fn(Reply $reply) => + $reply->setIsMatchQuery($pids->contains($reply->getPid())), + $postModels['reply']->createQueryBuilder('t') + ->where('t.pid IN (:pids)')->setParameter('pids', $parentRepliesID->concat($pids)->toArray()) + ->getQuery()->getResult() + ); + $this->stopwatch->stop('fillWithRepliesFields'); - $this->debugbar->startMeasure('fillWithSubRepliesFields'); - $subReplies = $postModels['subReply']->spid($spids) - ->selectPublicFields()->with('contentProtoBuf')->get(); - $this->debugbar->stopMeasure('fillWithSubRepliesFields'); + $this->stopwatch->start('fillWithSubRepliesFields'); + $subReplies = $postModels['subReply']->createQueryBuilder('t') + ->where('t.spid IN (:spids)')->setParameter('spids', $spids->toArray()) + ->getQuery()->getResult(); + $this->stopwatch->stop('fillWithSubRepliesFields'); - $this->debugbar->startMeasure('parsePostContentProtoBufBytes'); + /* + $this->stopwatch->start('parsePostContentProtoBufBytes'); $replies->concat($subReplies)->each(function ($post) { $post->content = $post->contentProtoBuf?->protoBufBytes?->value; unset($post->contentProtoBuf); }); - $this->debugbar->stopMeasure('parsePostContentProtoBufBytes'); + $this->stopwatch->stop('parsePostContentProtoBufBytes'); + */ return [ 'fid' => $fid, @@ -231,23 +227,23 @@ public function nestPostsWithParent( Collection $subReplies, ...$_, ): Collection { - $this->debugbar->startMeasure('nestPostsWithParent'); + $this->stopwatch->start('nestPostsWithParent'); $replies = $replies->groupBy('tid'); $subReplies = $subReplies->groupBy('pid'); $ret = $threads ->map(fn(Thread $thread) => [ - ...$thread->toArray(), + ...$this->serializer->normalize($thread), 'replies' => $replies - ->get($thread->tid, collect()) + ->get($thread->getTid(), collect()) ->map(fn(Reply $reply) => [ - ...$reply->toArray(), - 'subReplies' => $subReplies->get($reply->pid, collect()), + ...$this->serializer->normalize($reply), + 'subReplies' => $subReplies->get($reply->getPid(), collect()), ]), ]) ->recursive(); - $this->debugbar->stopMeasure('nestPostsWithParent'); + $this->stopwatch->stop('nestPostsWithParent'); return $ret; } @@ -258,7 +254,7 @@ public function nestPostsWithParent( */ public function reOrderNestedPosts(Collection $nestedPosts, bool $shouldRemoveSortingKey = true): array { - $this->debugbar->startMeasure('reOrderNestedPosts'); + $this->stopwatch->start('reOrderNestedPosts'); /** * @param Collection>>> $curPost @@ -338,7 +334,7 @@ function (Collection $reply) use ($setSortingKeyFromCurrentAndChildPosts) { ), ))->values()->toArray(); - $this->debugbar->stopMeasure('reOrderNestedPosts'); + $this->stopwatch->stop('reOrderNestedPosts'); return $ret; } } diff --git a/symfony/src/PostsQuery/IndexQuery.php b/symfony/src/PostsQuery/IndexQuery.php index 9c807026..49aaefa8 100644 --- a/symfony/src/PostsQuery/IndexQuery.php +++ b/symfony/src/PostsQuery/IndexQuery.php @@ -1,18 +1,28 @@ key by post type + * @return Collection key by post type */ $getQueryBuilders = static fn(int $fid): Collection => - collect(PostFactory::getPostModelsByFid($fid)) + collect($this->postRepositoryFactory->newForumPosts($fid)) ->only($postTypes) - ->transform(static fn(Post $model, string $type) => $model->selectCurrentAndParentPostID()); - $getFidByPostIDParam = static function (string $postIDName, int $postID): int { - $counts = Forum::get('fid') - ->pluck('fid') - ->map(static fn(int $fid) => - PostFactory::getPostModelsByFid($fid)[Helper::POST_ID_TO_TYPE[$postIDName]] - ->selectRaw("{$fid} AS fid, COUNT(*) AS count") - ->where($postIDName, $postID)) - ->reduce(/** @return BuilderContract|EloquentBuilder|QueryBuilder */ - static fn( - ?BuilderContract $acc, - EloquentBuilder|QueryBuilder $cur, - ): EloquentBuilder|QueryBuilder|BuilderContract => - $acc === null ? $cur : $acc->union($cur), - ) - ->get() + ->transform(static fn(PostRepository $repository) => $repository->selectCurrentAndParentPostID()); + $getFidByPostIDParam = function (string $postIDName, int $postID): int { + $counts = collect($this->forumRepository->getOrderedForumsId()) + ->map(fn(int $fid) => $this->postRepositoryFactory + ->new($fid, Helper::POST_ID_TO_TYPE[$postIDName]) + ->createQueryBuilder('t') + ->select("$fid AS fid", 'COUNT(t) AS count') + ->where("t.$postIDName = :postID") + ->setParameter('postID', $postID) + ->getQuery()->getResult()) ->where('count', '!=', 0); Helper::abortAPIIf(50001, $counts->count() > 1); Helper::abortAPIIf(40401, $counts->count() === 0); @@ -62,8 +66,8 @@ public function query(QueryParams $params, ?string $cursor): self if (\array_key_exists('fid', $flatParams)) { /** @var int $fid */ $fid = $flatParams['fid']; - if (Forum::fid($fid)->exists()) { - /** @var Collection> $queries key by post type */ + if ($this->forumRepository->isForumExists($fid)) { + /** @var Collection $queries key by post type */ $queries = $getQueryBuilders($fid); } elseif ($hasPostIDParam) { // query by post ID and fid, but the provided fid is invalid $fid = $getFidByPostIDParam($postIDParamName, $postIDParamValue); @@ -84,8 +88,9 @@ public function query(QueryParams $params, ?string $cursor): self Helper::POST_TYPES, // only query post types that own the querying post ID param array_search($postIDParamName, Helper::POST_ID, true), )) - ->map(static fn(EloquentBuilder $qb, string $type) => - $qb->where($postIDParamName, $postIDParamValue)); + ->map(static fn(QueryBuilder $qb, string $type) => + $qb->where("t.$postIDParamName = :postIDParamValue") + ->setParameter('postIDParamValue', $postIDParamValue)); } if (array_diff($postTypes, Helper::POST_TYPES) !== []) { diff --git a/symfony/src/PostsQuery/ParamsValidator.php b/symfony/src/PostsQuery/ParamsValidator.php index 942fcdcc..9e8ac5bb 100644 --- a/symfony/src/PostsQuery/ParamsValidator.php +++ b/symfony/src/PostsQuery/ParamsValidator.php @@ -14,7 +14,6 @@ class ParamsValidator public QueryParams $params; - /** @param array[] $params */ public function __construct(private readonly Validator $validator, array $params) { diff --git a/symfony/src/PostsQuery/SearchQuery.php b/symfony/src/PostsQuery/SearchQuery.php index 658c4df2..a999bce2 100644 --- a/symfony/src/PostsQuery/SearchQuery.php +++ b/symfony/src/PostsQuery/SearchQuery.php @@ -1,38 +1,49 @@ getUniqueParamValue('fid'); - /** @var array>> $cachedUserQuery key by param name */ - $cachedUserQuery = []; - /** @var Collection> $queries key by post type */ - $queries = collect(PostFactory::getPostModelsByFid($fid)) + /** @var array $cachedUserQueryResult key by param name */ + $cachedUserQueryResult = []; + /** @var Collection $queries key by post type */ + $queries = collect($this->postRepositoryFactory->newForumPosts($fid)) ->only($params->getUniqueParamValue('postTypes')) - ->map(function (Post $postModel) use ($params, &$cachedUserQuery): Builder { - $postQuery = $postModel->newQuery(); + ->map(function (PostRepository $repository) use ($params, &$cachedUserQueryResult): QueryBuilder { + $postQuery = $repository->selectCurrentAndParentPostID(); foreach ($params->omit() as $param) { // omit nothing to get all params - // even when $cachedUserQuery[$param->name] is null + // even when $cachedUserQueryResult[$param->name] is null // it will still pass as a reference to the array item // that is null at this point, but will be later updated by ref $postQuery = self::applyQueryParamsOnQuery( $postQuery, $param, - $cachedUserQuery[$param->name], + $cachedUserQueryResult[$param->name], ); } - return $postQuery->selectCurrentAndParentPostID(); + return $postQuery; }); $orderByParam = $params->pick('orderBy')[0]; @@ -48,19 +59,19 @@ public function query(QueryParams $params, ?string $cursor): self } /** - * Apply conditions of query params on a query builder that created from posts model + * Apply conditions of query params on a query builder that created from posts query builder */ - private static function applyQueryParamsOnQuery( - Builder $query, + private function applyQueryParamsOnQuery( + QueryBuilder $query, QueryParam $param, - ?Collection &$outCachedUserQueryResult, - ): Builder { + ?array &$outCachedUserQueryResult, + ): QueryBuilder { $name = $param->name; $value = $param->value; $sub = $param->getAllSub(); $sub['not'] ??= false; - $not = $sub['not'] ? 'Not' : ''; - $inverseNot = $sub['not'] ? '' : 'Not'; + $not = $sub['not'] ? 'NOT' : ''; + $notBoolStr = $sub['not'] ? 'true' : 'false'; $fieldNameOfNumericParams = [ 'threadViewCount' => 'viewCount', @@ -68,96 +79,112 @@ private static function applyQueryParamsOnQuery( 'threadReplyCount' => 'replyCount', 'replySubReplyCount' => 'subReplyCount', ][$name] ?? $name; - $inverseRangeOfNumericParams = [ + $inverseRanges = [ '<' => '>=', '=' => '!=', '>' => '<=', - ][$sub['range'] ?? null] ?? null; + ]; + if (!array_key_exists($sub['range'], $inverseRanges)) { + throw new \InvalidArgumentException(); + } + $inverseRangeOfNumericParams = $inverseRanges[$sub['range'] ?? null] ?? null; $userTypeOfUserParams = str_starts_with($name, 'author') ? 'author' : 'latestReplier'; $fieldNameOfUserNameParams = str_ends_with($name, 'DisplayName') ? 'displayName' : 'name'; $getAndCacheUserQuery = - static function (BuilderContract $newQueryWhenCacheMiss) use (&$outCachedUserQueryResult): Collection { + static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryResult): Collection { // $outCachedUserQueryResult === null means it's the first call - $outCachedUserQueryResult ??= $newQueryWhenCacheMiss->get(); + $outCachedUserQueryResult ??= $newQueryWhenCacheMiss->getQuery()->getResult(); return $outCachedUserQueryResult; }; + $whereBetween = static function (string $field) use ($query, $not, $value) { + $values = explode(',', $value); + return $query->where("t.$field $not BETWEEN ?0 AND ?1") + ->setParameter(0, $values[0]) + ->setParameter(1, $values[1]); + }; return match ($name) { // numeric 'tid', 'pid', 'spid', 'authorUid', 'authorExpGrade', 'latestReplierUid', 'threadViewCount', 'threadShareCount', 'threadReplyCount', 'replySubReplyCount' => - $sub['range'] === 'IN' || $sub['range'] === 'BETWEEN' - ? $query->{"where$not{$sub['range']}"}($fieldNameOfNumericParams, explode(',', $value)) - : $query->where( - $fieldNameOfNumericParams, - $sub['not'] ? $inverseRangeOfNumericParams : $sub['range'], - $value, - ), + match ($sub['range']) { + 'IN' => $query->where("t.$fieldNameOfNumericParams $not IN (:values)") + ->setParameter('values', explode(',', $value)), + 'BETWEEN' => $whereBetween($fieldNameOfNumericParams), + default => $query->where( + "t.$fieldNameOfNumericParams " + . ($sub['not'] ? $inverseRangeOfNumericParams : $sub['range']) + . " :value" + )->setParameter('value', $value), + }, // textMatch 'threadTitle', 'postContent' => self::applyTextMatchParamOnQuery($query, $name === 'threadTitle' ? 'title' : 'content', $value, $sub), // dateTimeRange 'postedAt', 'latestReplyPostedAt' => - $query->{"where{$not}Between"}($name, explode(',', $value)), + $whereBetween($name), // array - 'threadProperties' => static function () use ($sub, $inverseNot, $value, $query) { + 'threadProperties' => static function () use ($not, $notBoolStr, $value, $query) { foreach ($value as $threadProperty) { match ($threadProperty) { - 'good' => $query->where('isGood', !$sub['not']), - 'sticky' => $query->{"where{$inverseNot}null"}('stickyType'), + 'good' => $query->where("t.isGood = $notBoolStr"), + 'sticky' => $query->where("t.stickyType IS $not NULL"), }; } return $query; }, 'authorName', 'latestReplierName', 'authorDisplayName', 'latestReplierDisplayName' => - $query->{"where{$not}In"}( - "{$userTypeOfUserParams}Uid", - $getAndCacheUserQuery(self::applyTextMatchParamOnQuery( - User::select('uid'), - $fieldNameOfUserNameParams, - $value, - $sub, - )) - ), + $query->where("t.{$userTypeOfUserParams}Uid $not IN (:uids)") + ->setParameter( + 'uids', + $getAndCacheUserQuery(self::applyTextMatchParamOnQuery( + $this->userRepository->createQueryBuilder('t')->select('t.uid'), + $fieldNameOfUserNameParams, + $value, + $sub, + )) + ), 'authorGender', 'latestReplierGender' => - $query->{"where{$not}In"}( - "{$userTypeOfUserParams}Uid", - $getAndCacheUserQuery(User::select('uid')->where('gender', $value)) - ), + $query->where("t.{$userTypeOfUserParams}Uid $not IN (:uids)") + ->setParameter( + 'uids', + $getAndCacheUserQuery($this->userRepository->createQueryBuilder('t') + ->select('t.uid') + ->where('t.gender = :value')->setParameter('value', $value)) + ), 'authorManagerType' => $value === 'NULL' - ? $query->{"where{$not}null"}('authorManagerType') - : $query->where('authorManagerType', $sub['not'] ? '!=' : '=', $value), + ? $query->where("t.authorManagerType IS $not NULL") + : $query->where('t.authorManagerType ' . ($sub['not'] ? '!=' : '=') . ' :value') + ->setParameter('value', $value), default => $query, }; } /** @psalm-param array $subParams */ private static function applyTextMatchParamOnQuery( - BuilderContract $query, + QueryBuilder $query, string $field, string $value, array $subParams, - ): BuilderContract { - $not = $subParams['not'] === true ? 'Not' : ''; + ): QueryBuilder { + $not = $subParams['not'] === true ? 'NOT' : ''; if ($subParams['matchBy'] === 'regex') { - return $query->where($field, "$not REGEXP", $value); + return $query->where("t.$field $not REGEXP :value")->setParameter('value', $value); } - return $query->where(static function (Builder $subQuery) use ($subParams, $field, $not, $value) { - // not (A or B) <=> not A and not B, following https://en.wikipedia.org/wiki/De_Morgan%27s_laws - $isOrWhere = $not === 'Not' ? '' : 'or'; - $addMatchKeyword = static fn(string $keyword) => - $subQuery->{"{$isOrWhere}Where"}( - $field, - trim("$not LIKE"), - $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword - ); - // split multiple search keyword by space char when $subParams['spaceSplit'] == true - foreach ($subParams['spaceSplit'] ? explode(' ', $value) : [$value] as $keyword) { - $addMatchKeyword($keyword); + + // split multiple search keyword by space char when $subParams['spaceSplit'] == true + foreach ($subParams['spaceSplit'] ? explode(' ', $value) : [$value] as $keyword) { + if ($not === 'NOT') { + $query = $query->andWhere("t.$field NOT LIKE :keyword"); + } else { // not (A or B) <=> not A and not B, following https://en.wikipedia.org/wiki/De_Morgan%27s_laws + $query = $query->orWhere("t.$field LIKE :keyword"); } - }); + $keyword = $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword; + $query = $query->setParameter('keyword', $keyword); + } + return $query; } } From 39d0f002ae40bfe45f96fa3ca1e706b47b837498 Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 7 Oct 2024 16:35:50 +0000 Subject: [PATCH 39/61] + `ForumsController` like route `/forums` in `be` + `getOrderedForums()` @ App\Repository\ForumRepository * add `#[Route(...)]` for `(Post|User)sController->query()` @ `App\Controller` * mv Controller/Posts{Query,Controller}.php * mv Controller/Users{Query,Controller}.php @ symfony --- symfony/src/Controller/ForumsController.php | 18 ++++++++++++++++++ .../{PostsQuery.php => PostsController.php} | 4 +++- .../{UsersQuery.php => UsersController.php} | 6 ++++-- symfony/src/Repository/ForumRepository.php | 7 +++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 symfony/src/Controller/ForumsController.php rename symfony/src/Controller/{PostsQuery.php => PostsController.php} (97%) rename symfony/src/Controller/{UsersQuery.php => UsersController.php} (95%) diff --git a/symfony/src/Controller/ForumsController.php b/symfony/src/Controller/ForumsController.php new file mode 100644 index 00000000..b16ccdb6 --- /dev/null +++ b/symfony/src/Controller/ForumsController.php @@ -0,0 +1,18 @@ +repository->getOrderedForums(); + } +} diff --git a/symfony/src/Controller/PostsQuery.php b/symfony/src/Controller/PostsController.php similarity index 97% rename from symfony/src/Controller/PostsQuery.php rename to symfony/src/Controller/PostsController.php index 6f25b06d..4e5dc9aa 100644 --- a/symfony/src/Controller/PostsQuery.php +++ b/symfony/src/Controller/PostsController.php @@ -14,10 +14,11 @@ use Illuminate\Support\Collection; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\ParameterBag; +use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Component\Validator\Constraints as Assert; -class PostsQuery extends AbstractController +class PostsController extends AbstractController { public function __construct( private readonly Stopwatch $stopwatch, @@ -27,6 +28,7 @@ public function __construct( private readonly LatestReplierRepository $latestReplierRepository, ) {} + #[Route('/posts')] public function query(ParameterBag $parameterBag): array { $this->validator->validate($parameterBag->all(), new Assert\Collection([ diff --git a/symfony/src/Controller/UsersQuery.php b/symfony/src/Controller/UsersController.php similarity index 95% rename from symfony/src/Controller/UsersQuery.php rename to symfony/src/Controller/UsersController.php index 55b7eac5..4fd0a688 100644 --- a/symfony/src/Controller/UsersQuery.php +++ b/symfony/src/Controller/UsersController.php @@ -7,9 +7,10 @@ use App\Validator\Validator; use Doctrine\ORM\QueryBuilder; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Validator\Constraints as Assert; -class UsersQuery extends AbstractController +class UsersController extends AbstractController { private int $perPageItems = 200; @@ -17,7 +18,8 @@ public function __construct( private readonly Validator $validator, private readonly UserRepository $userRepository, ) {} - + + #[Route('/users')] public function query(): array { $queryParams = \Safe\json_decode($this->getParameter('query')); diff --git a/symfony/src/Repository/ForumRepository.php b/symfony/src/Repository/ForumRepository.php index 8dcbb1db..e8f9fd33 100644 --- a/symfony/src/Repository/ForumRepository.php +++ b/symfony/src/Repository/ForumRepository.php @@ -14,6 +14,13 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Forum::class); } + public function getOrderedForums(): array + { + return $this->getEntityManager() + ->createQuery(/** @lang DQL */'SELECT t FROM App\Entity\Forum t ORDER BY t.fid') + ->getArrayResult(); + } + public function getOrderedForumsId(): array { return $this->getEntityManager() From c79a749ae7c367ff1b931cf3129a5e0c766808dc Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 7 Oct 2024 23:47:00 +0000 Subject: [PATCH 40/61] + `hasQueryResultMorePages()` to reuse between `setResult()` & `UsersController->query()` @ `BaseQuery` * fix validator not allowing optional params @ `ParamsValidator` & `(Post|User)sController` * replace injected `ParameterBag` with `Request->query` @ `PostsController->query()` * fix query params should come from all query string instead of json decoded query string `?query=` like `PostsController->query()` * fix only the value of the last query param will be used for all binding params in the prepared sql when giving multiple query params @ `UsersController->query()` @ `App\PostsQuery` @ symfony --- symfony/src/Controller/PostsController.php | 14 +++---- symfony/src/Controller/UsersController.php | 43 +++++++++++----------- symfony/src/PostsQuery/BaseQuery.php | 33 +++++++++++------ symfony/src/PostsQuery/ParamsValidator.php | 2 +- 4 files changed, 50 insertions(+), 42 deletions(-) diff --git a/symfony/src/Controller/PostsController.php b/symfony/src/Controller/PostsController.php index 4e5dc9aa..15b49074 100644 --- a/symfony/src/Controller/PostsController.php +++ b/symfony/src/Controller/PostsController.php @@ -13,7 +13,7 @@ use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\HttpFoundation\ParameterBag; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Component\Validator\Constraints as Assert; @@ -29,16 +29,16 @@ public function __construct( ) {} #[Route('/posts')] - public function query(ParameterBag $parameterBag): array + public function query(Request $request): array { - $this->validator->validate($parameterBag->all(), new Assert\Collection([ - 'cursor' => new Assert\Regex( // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data + $this->validator->validate($request->query->all(), new Assert\Collection([ + 'cursor' => new Assert\Optional(new Assert\Regex( // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data // (,|$)|,){5,6} means allow at most 5~6 parts of base64 segment or empty string to exist '/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/' - ), - 'query' => new Assert\Json(), + )), + 'query' => new Assert\Required(new Assert\Json()), ])); - $validator = new ParamsValidator($this->validator, \Safe\json_decode($parameterBag->get('query'), true)); + $validator = new ParamsValidator($this->validator, \Safe\json_decode($request->query->get('query'), true)); $params = $validator->params; $postIDParams = $params->pick(...Helper::POST_ID); diff --git a/symfony/src/Controller/UsersController.php b/symfony/src/Controller/UsersController.php index 4fd0a688..45cc5aed 100644 --- a/symfony/src/Controller/UsersController.php +++ b/symfony/src/Controller/UsersController.php @@ -3,10 +3,12 @@ namespace App\Controller; use App\Helper; +use App\PostsQuery\BaseQuery; use App\Repository\UserRepository; use App\Validator\Validator; use Doctrine\ORM\QueryBuilder; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Validator\Constraints as Assert; @@ -20,48 +22,45 @@ public function __construct( ) {} #[Route('/users')] - public function query(): array + public function query(Request $request): array { - $queryParams = \Safe\json_decode($this->getParameter('query')); + $queryParams = $request->query->all(); $paramConstraints = [ 'uid' => new Assert\Type('digit'), 'name' => new Assert\Type('string'), 'displayName' => new Assert\Type('string'), 'gender' => new Assert\Choice(['0', '1', '2', 'NULL']), ]; - $this->validator->validate($queryParams, new Assert\Collection($paramConstraints)); + $this->validator->validate($queryParams, new Assert\Collection($paramConstraints, allowMissingFields: true)); - $queriedUsers = collect(collect($queryParams) + $queries = collect($queryParams) ->reduce( - function (QueryBuilder $acc, $paramValue, string $paramName) use ($paramConstraints): QueryBuilder { + function (array $acc, $paramValue, string $paramName) use ($paramConstraints): array { + /** @var array{int, QueryBuilder} $acc */ + [$paramIndex, $queryBuilder] = $acc; if (!array_key_exists($paramName, $paramConstraints)) { throw new \InvalidArgumentException(); } - return $paramValue === 'NULL' + return [$paramIndex + 1, $paramValue === 'NULL' && in_array($paramName, ['name', 'displayName', 'gender'], true) - ? $acc->andWhere("t.$paramName IS NULL") - : $acc->andWhere("t.$paramName = :paramValue") - ->setParameter('paramValue', $paramValue); + ? $queryBuilder->andWhere("t.$paramName IS NULL") + : $queryBuilder->andWhere("t.$paramName = ?$paramIndex") + ->setParameter($paramIndex, $paramValue)]; }, - $this->userRepository->createQueryBuilder('t') - ) - ?->orderBy('t.id', 'DESC') - ->setMaxResults($this->perPageItems + 1) - ->getQuery()->getResult()); - Helper::abortAPIIf(40402, $queriedUsers->isEmpty()); + [0, $this->userRepository->createQueryBuilder('t')] + )[1]->orderBy('t.uid', 'DESC'); - $hasMorePages = false; - if ($queriedUsers->count() === $this->perPageItems + 1) { - $queriedUsers->pop(); - $hasMorePages = true; - } + ['result' => $result, 'hasMorePages' => $hasMorePages] = + BaseQuery::hasQueryResultMorePages($queries, $this->perPageItems); + $resultCount = count($result); + Helper::abortAPIIf(40402, $resultCount === 0); return [ 'pages' => [ - 'itemCount' => $queriedUsers->count(), + 'itemCount' => $resultCount, 'hasMore' => $hasMorePages, ], - 'users' => $queriedUsers->all(), + 'users' => $result, ]; } } diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index 9adad103..b2fbf12c 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -91,27 +91,23 @@ protected function setResult( static fn(QueryBuilder $acc, $cursorValue, string $cursorField): QueryBuilder => $acc->andWhere("t.$cursorField > :cursorValue")->setParameter('cursorValue', $cursorValue), $qb - )?->setMaxResults($this->perPageItems + 1); + ); }); $this->stopwatch->stop('initPaginators'); - $hasMorePages = false; + $resultsAndHasMorePages = $paginators->map(static fn(QueryBuilder $paginator) => + self::hasQueryResultMorePages($paginator, $this->perPageItems)); /** @var Collection $postsKeyByTypePluralName */ - $postsKeyByTypePluralName = $paginators - ->mapWithKeys(function (QueryBuilder $paginator, string $postType) use (&$hasMorePages) { - $posts = collect($paginator->getQuery()->getResult()); - if ($posts->count() === $this->perPageItems + 1) { - $posts->pop(); - $hasMorePages = true; - } - return [Helper::POST_TYPE_TO_PLURAL[$postType] => $posts]; - }); + $postsKeyByTypePluralName = $resultsAndHasMorePages + ->mapWithKeys(fn(array $resultAndHasMorePages, string $postType) => + [Helper::POST_TYPE_TO_PLURAL[$postType] => $resultAndHasMorePages['result']]); Helper::abortAPIIf(40401, $postsKeyByTypePluralName->every(static fn(Collection $i) => $i->isEmpty())); $this->queryResult = ['fid' => $fid, ...$postsKeyByTypePluralName]; $this->queryResultPages = [ 'currentCursor' => $cursorParamValue ?? '', - 'nextCursor' => $hasMorePages + 'nextCursor' => $resultsAndHasMorePages->pluck('hasMorePages') + ->filter()->isNotEmpty() // filter() remove falsy ? $this->cursorCodec->encodeNextCursor( $queryByPostIDParamName === null ? $postsKeyByTypePluralName @@ -124,6 +120,19 @@ protected function setResult( $this->stopwatch->stop('setResult'); } + /** + * @return array{result: Collection, hasMorePages: bool} + */ + public static function hasQueryResultMorePages(QueryBuilder $query, int $limit): array + { + $results = collect($query->setMaxResults($limit + 1)->getQuery()->getResult()); + if ($results->count() === $limit + 1) { + $results->pop(); + $hasMorePages = true; + } + return ['result' => $results, 'hasMorePages' => $hasMorePages ?? false]; + } + /** * @return array{ * fid: int, diff --git a/symfony/src/PostsQuery/ParamsValidator.php b/symfony/src/PostsQuery/ParamsValidator.php index 9e8ac5bb..6373e676 100644 --- a/symfony/src/PostsQuery/ParamsValidator.php +++ b/symfony/src/PostsQuery/ParamsValidator.php @@ -76,7 +76,7 @@ private function validateParamsValue(array $params): void // latestReplierName, latestReplierDisplayName 'matchBy' => new Assert\Choice(['implicit', 'explicit', 'regex']), 'spaceSplit' => new Assert\Type('boolean'), - ])); + ], allowMissingFields: true)); } private function validate40001(): void From 8483414df4f3d3c477b2b76ad2ff77c9a6adcdc1 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 03:16:02 +0000 Subject: [PATCH 41/61] * fix not accepting int typed value for numeric params: https://www.php.net/manual/en/function.ctype-digit.php#108712 * rename `params` in method name and param to `param` @ `validateParamValue()` * replace public prop `$params` with getter and fluent setter contain the param `$params` in ctor @ `ParamsValidator` * now not being fluent method @ `BaseQuery->query()` @ `App\PostsQuery` * replace `new ParamsValidator()` & `new $queryClass()` with services locator * fix misusing `AbstractController->getParameter()` for getting the value of query string `?cursor=` @ `App\Controller\PostsController` * fix unquoted table name will become lowercase ing Postgres @ `PostRepository->__construct()` * fix typo in table name @ `SubReplyRepository->getTableNameSuffix()` @ `App\Repository\Post` @ symfony --- symfony/src/Controller/PostsController.php | 18 ++++++-- symfony/src/PostsQuery/BaseQuery.php | 2 +- symfony/src/PostsQuery/IndexQuery.php | 3 +- symfony/src/PostsQuery/ParamsValidator.php | 43 ++++++++++++------- symfony/src/PostsQuery/SearchQuery.php | 3 +- .../src/Repository/Post/PostRepository.php | 2 +- .../Repository/Post/SubReplyRepository.php | 2 +- 7 files changed, 46 insertions(+), 27 deletions(-) diff --git a/symfony/src/Controller/PostsController.php b/symfony/src/Controller/PostsController.php index 15b49074..6066ca76 100644 --- a/symfony/src/Controller/PostsController.php +++ b/symfony/src/Controller/PostsController.php @@ -3,6 +3,7 @@ namespace App\Controller; use App\Helper; +use App\PostsQuery\BaseQuery; use App\PostsQuery\IndexQuery; use App\PostsQuery\ParamsValidator; use App\PostsQuery\SearchQuery; @@ -12,7 +13,9 @@ use App\Validator\Validator; use Illuminate\Support\Arr; use Illuminate\Support\Collection; +use Psr\Container\ContainerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\DependencyInjection\Attribute\AutowireLocator; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Stopwatch\Stopwatch; @@ -26,6 +29,12 @@ public function __construct( private readonly ForumRepository $forumRepository, private readonly UserRepository $userRepository, private readonly LatestReplierRepository $latestReplierRepository, + #[AutowireLocator([ + ParamsValidator::class, + IndexQuery::class, + SearchQuery::class, + ])] + private readonly ContainerInterface $locator, ) {} #[Route('/posts')] @@ -38,8 +47,8 @@ public function query(Request $request): array )), 'query' => new Assert\Required(new Assert\Json()), ])); - $validator = new ParamsValidator($this->validator, \Safe\json_decode($request->query->get('query'), true)); - $params = $validator->params; + $validator = $this->locator->get(ParamsValidator::class); + $params = $validator->setParams(\Safe\json_decode($request->query->get('query'), true))->getParams(); $postIDParams = $params->pick(...Helper::POST_ID); $isQueryByPostID = @@ -58,9 +67,10 @@ public function query(Request $request): array $validator->addDefaultParamsThenValidate(shouldSkip40003: $isIndexQuery); - $queryClass = $isIndexQuery ? IndexQuery::class : SearchQuery::class; $this->stopwatch->start('$queryClass->query()'); - $query = (new $queryClass())->query($params, $this->getParameter('cursor')); + /** @var BaseQuery $query */ + $query = $this->locator->get($isIndexQuery ? IndexQuery::class : SearchQuery::class); + $query->query($params, $request->query->get('cursor')); $this->stopwatch->stop('$queryClass->query()'); $this->stopwatch->start('fillWithParentPost'); $result = $query->fillWithParentPost(); diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index b2fbf12c..686f5895 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -30,7 +30,7 @@ abstract class BaseQuery protected bool $orderByDesc; - abstract public function query(QueryParams $params, ?string $cursor): self; + abstract public function query(QueryParams $params, ?string $cursor): void; public function __construct( private readonly SerializerInterface $serializer, diff --git a/symfony/src/PostsQuery/IndexQuery.php b/symfony/src/PostsQuery/IndexQuery.php index 49aaefa8..b07a3154 100644 --- a/symfony/src/PostsQuery/IndexQuery.php +++ b/symfony/src/PostsQuery/IndexQuery.php @@ -24,7 +24,7 @@ public function __construct( } /** @SuppressWarnings(PHPMD.ElseExpression) */ - public function query(QueryParams $params, ?string $cursor): self + public function query(QueryParams $params, ?string $cursor): void { /** @var array $flatParams key by param name */ $flatParams = array_reduce( @@ -107,6 +107,5 @@ public function query(QueryParams $params, ?string $cursor): self } $this->setResult($fid, $queries, $cursor, $hasPostIDParam ? $postIDParamName : null); - return $this; } } diff --git a/symfony/src/PostsQuery/ParamsValidator.php b/symfony/src/PostsQuery/ParamsValidator.php index 6373e676..549fd8e4 100644 --- a/symfony/src/PostsQuery/ParamsValidator.php +++ b/symfony/src/PostsQuery/ParamsValidator.php @@ -12,15 +12,23 @@ class ParamsValidator { public const array UNIQUE_PARAMS_NAME = ['fid', 'postTypes', 'orderBy']; - public QueryParams $params; + private QueryParams $params; + + public function __construct(private readonly Validator $validator) {} + + public function getParams(): QueryParams + { + return $this->params; + } /** @param array[] $params */ - public function __construct(private readonly Validator $validator, array $params) + public function setParams(array $params): static { - $this->validateParamsValue($params); + array_map($this->validateParamValue(...), $params); $this->params = new QueryParams($params); $this->validate40001(); $this->validate40005(); + return $this; } public function addDefaultParamsThenValidate(bool $shouldSkip40003): void @@ -37,33 +45,36 @@ public function addDefaultParamsThenValidate(bool $shouldSkip40003): void $this->validate40004($currentPostTypes); } - private function validateParamsValue(array $params): void + private function validateParamValue(array $param): void { $paramsPossibleValue = [ 'userGender' => [0, 1, 2], 'userManagerType' => ['NULL', 'manager', 'assist', 'voiceadmin'], ]; + $numericParams = collect([ + 'fid', + 'tid', + 'pid', + 'spid', + 'threadViewCount', + 'threadShareCount', + 'threadReplyCount', + 'replySubReplyCount', + 'authorUid', + 'authorExpGrade', + 'latestReplierUid', + ])->mapWithKeys(fn(string $paramName) => [$paramName => new Assert\Type(['digit', 'int'])]); // note here we haven't validated that is every sub param have a corresponding main param yet - $this->validator->validate($params, new Assert\Collection([ - 'fid' => new Assert\Type('digit'), + $this->validator->validate($param, new Assert\Collection([ + ...$numericParams, 'postTypes' => new Assert\Collection([new Assert\Choice(Helper::POST_TYPES)]), 'orderBy' => new Assert\Collection([new Assert\Choice([...Helper::POST_ID, 'postedAt'])]), 'direction' => new Assert\Choice(['ASC', 'DESC']), - 'tid' => new Assert\Type('digit'), - 'pid' => new Assert\Type('digit'), - 'spid' => new Assert\Type('digit'), 'postedAt' => new DateTimeRange(), 'latestReplyPostedAt' => new DateTimeRange(), - 'threadViewCount' => new Assert\Type('digit'), - 'threadShareCount' => new Assert\Type('digit'), - 'threadReplyCount' => new Assert\Type('digit'), - 'replySubReplyCount' => new Assert\Type('digit'), 'threadProperties' => new Assert\Collection([new Assert\Choice(['good', 'sticky'])]), - 'authorUid' => new Assert\Type('digit'), - 'authorExpGrade' => new Assert\Type('digit'), 'authorGender' => new Assert\Choice($paramsPossibleValue['userGender']), 'authorManagerType' => new Assert\Choice($paramsPossibleValue['userManagerType']), - 'latestReplierUid' => new Assert\Type('digit'), 'latestReplierGender' => new Assert\Choice($paramsPossibleValue['userGender']), 'not' => new Assert\Type('boolean'), diff --git a/symfony/src/PostsQuery/SearchQuery.php b/symfony/src/PostsQuery/SearchQuery.php index a999bce2..050c7dab 100644 --- a/symfony/src/PostsQuery/SearchQuery.php +++ b/symfony/src/PostsQuery/SearchQuery.php @@ -22,7 +22,7 @@ public function __construct( parent::__construct($serializer, $stopwatch, $cursorCodec, $postRepositoryFactory); } - public function query(QueryParams $params, ?string $cursor): self + public function query(QueryParams $params, ?string $cursor): void { /** @var int $fid */ $fid = $params->getUniqueParamValue('fid'); @@ -55,7 +55,6 @@ public function query(QueryParams $params, ?string $cursor): self } $this->setResult($fid, $queries, $cursor); - return $this; } /** diff --git a/symfony/src/Repository/Post/PostRepository.php b/symfony/src/Repository/Post/PostRepository.php index b7f6b8ec..769ab777 100644 --- a/symfony/src/Repository/Post/PostRepository.php +++ b/symfony/src/Repository/Post/PostRepository.php @@ -28,7 +28,7 @@ public function __construct( ) { parent::__construct($registry, $postClass); $entityManager->getClassMetadata($postClass)->setPrimaryTable([ - 'name' => "tbmc_f{$fid}_" . $this->getTableNameSuffix() + 'name' => "\"tbmc_f{$fid}_" . $this->getTableNameSuffix() . '"' ]); } diff --git a/symfony/src/Repository/Post/SubReplyRepository.php b/symfony/src/Repository/Post/SubReplyRepository.php index 4c9716e4..2b461b36 100644 --- a/symfony/src/Repository/Post/SubReplyRepository.php +++ b/symfony/src/Repository/Post/SubReplyRepository.php @@ -20,6 +20,6 @@ public function __construct(ManagerRegistry $registry, EntityManagerInterface $e protected function getTableNameSuffix(): string { - return 'subRreply'; + return 'subReply'; } } From 32fbf136dece796a8501064c4a7bf26d637a1a72 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 15:57:14 +0000 Subject: [PATCH 42/61] * fix `QueryBuilder->orderBy()` will override previous orders @ `$orderedQueries()` * inline `$addOrderByForBuilder()` into its only usage in `$queriesWithOrderBy` and rename it to `$orderedQueries` * fix missing entity name alias `t` for fields * fix `$this` cannot be used inside `static` closure @ `$resultsAndHasMorePages()` @ `setResult()` * cast `$threads`, `$replies` & `$subReplies` from `array` to `Collection` * set `Post->isMatchQuery = true` @ `$subReplies` @ `fillWithParentPost()` * fix not grouping `$replies` & `$subReplies` by their parent post id * fix not normalize entities of `SubReply` to array @ `nestPostsWithParent()` * mark prop `$queryResult` as `private` as not used by derived classes @ `BaseQuery` * fix an extra nesting array for a single row returned @ `$getFidByPostIDParam()` * fix `$this` cannot be used inside `static` closure @ `$getQueryBuilders()` @ `IndexQuery->query()` @ `App\PostsQuery` * fix `QueryBuilder->where()` will override previous predicates * fix using positional dql param instead of named * fix missing entity name alias `t` for fields @ `App\Controller\PostsController->query()` * fix `QueryBuilder->addSelect()` without any previous `->select()` will also selecting all entity fields @ `App\Repository\Post\PostRepository->selectCurrentAndParentPostID()` * rename method `isMatchQuery()` to `getIsMatchQuery()` for `Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer` @ `App\Entity\Post\Post` + overriding `boot()` to register laravel collection marcos like `Spatie\CollectionMacros\CollectionMacroServiceProvider->register()` @ `App\Kernel` @ symfony --- symfony/src/Controller/PostsController.php | 10 +-- symfony/src/Entity/Post/Post.php | 2 +- symfony/src/Kernel.php | 12 ++++ symfony/src/PostsQuery/BaseQuery.php | 63 +++++++++---------- symfony/src/PostsQuery/IndexQuery.php | 4 +- .../src/Repository/Post/PostRepository.php | 2 +- 6 files changed, 51 insertions(+), 42 deletions(-) diff --git a/symfony/src/Controller/PostsController.php b/symfony/src/Controller/PostsController.php index 6066ca76..4ea1cb33 100644 --- a/symfony/src/Controller/PostsController.php +++ b/symfony/src/Controller/PostsController.php @@ -80,13 +80,13 @@ public function query(Request $request): array $latestRepliersId = $result['threads']->pluck('latestReplierId'); $latestRepliers = collect() ->concat($this->latestReplierRepository->createQueryBuilder('t') - ->where('t.id IN (?ids)')->setParameter('ids', $latestRepliersId) - ->where('t.uid IS NOT NULL') + ->where('t.id IN (:ids)')->setParameter('ids', $latestRepliersId) + ->andWhere('t.uid IS NOT NULL') ->getQuery()->getResult()) ->concat($this->latestReplierRepository->createQueryBuilder('t') - ->where('t.id IN (?ids)')->setParameter('ids', $latestRepliersId) - ->where('t.uid IS NULL') - ->addSelect('name', 'displayName') + ->where('t.id IN (:ids)')->setParameter('ids', $latestRepliersId) + ->andWhere('t.uid IS NULL') + ->addSelect('t.name', 't.displayName') ->getQuery()->getResult()); $users = $this->userRepository->createQueryBuilder('t') ->where('t.uid IN (:uids)') diff --git a/symfony/src/Entity/Post/Post.php b/symfony/src/Entity/Post/Post.php index e3e9ddeb..1fe0fbe2 100644 --- a/symfony/src/Entity/Post/Post.php +++ b/symfony/src/Entity/Post/Post.php @@ -40,7 +40,7 @@ public function getDisagreeCount(): int return $this->disagreeCount ?? 0; } - public function isMatchQuery(): bool + public function getIsMatchQuery(): bool { return $this->isMatchQuery; } diff --git a/symfony/src/Kernel.php b/symfony/src/Kernel.php index 779cd1f2..ac0e3319 100644 --- a/symfony/src/Kernel.php +++ b/symfony/src/Kernel.php @@ -2,10 +2,22 @@ namespace App; +use Illuminate\Support\Collection; +use Spatie\CollectionMacros\Macros\Recursive; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\HttpKernel\Kernel as BaseKernel; class Kernel extends BaseKernel { use MicroKernelTrait; + + public function boot(): void + { + parent::boot(); + /** @see CollectionMacroServiceProvider::register() */ + collect([ + 'recursive' => Recursive::class, + ])->reject(fn ($class, $macro) => Collection::hasMacro($macro)) + ->each(fn ($class, $macro) => Collection::macro($macro, (new $class())())); + } } diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index 686f5895..3a812d47 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -22,7 +22,7 @@ abstract class BaseQuery * subReplies: ?Collection * } */ - protected array $queryResult; + private array $queryResult; private array $queryResultPages; @@ -60,30 +60,28 @@ protected function setResult( ): void { $this->stopwatch->start('setResult'); - $addOrderByForBuilder = fn(QueryBuilder $qb, string $postType): QueryBuilder => $qb + $orderedQueries = $queries->map(fn(QueryBuilder $qb, string $postType): QueryBuilder => $qb // we don't have to select the post ID // since it's already selected by invokes of PostRepository->selectCurrentAndParentPostID() - ->addSelect($this->orderByField) - ->orderBy($this->orderByField, $this->orderByDesc === true ? 'DESC' : 'ASC') + ->addSelect("t.$this->orderByField") + ->addOrderBy("t.$this->orderByField", $this->orderByDesc === true ? 'DESC' : 'ASC') // cursor paginator requires values of orderBy column are unique // if not it should fall back to other unique field (here is the post ID primary key) // https://use-the-index-luke.com/no-offset // https://mysql.rjweb.org/doc.php/pagination // https://medium.com/swlh/how-to-implement-cursor-pagination-like-a-pro-513140b65f32 // https://slack.engineering/evolving-api-pagination-at-slack/ - ->orderBy(Helper::POST_TYPE_TO_ID[$postType]); - - $queriesWithOrderBy = $queries->map($addOrderByForBuilder); + ->addOrderBy('t.' . Helper::POST_TYPE_TO_ID[$postType])); $cursorsKeyByPostType = null; if ($cursorParamValue !== null) { $cursorsKeyByPostType = $this->cursorCodec->decodeCursor($cursorParamValue, $this->orderByField); // remove queries for post types with encoded cursor ',,' - $queriesWithOrderBy = $queriesWithOrderBy->intersectByKeys($cursorsKeyByPostType); + $orderedQueries = $orderedQueries->intersectByKeys($cursorsKeyByPostType); } $this->stopwatch->start('initPaginators'); /** @var Collection $paginators key by post type */ - $paginators = $queriesWithOrderBy->map(function (QueryBuilder $qb, string $type) use ($cursorsKeyByPostType) { - $cursors = $cursorsKeyByPostType[$type]; + $paginators = $orderedQueries->map(function (QueryBuilder $qb, string $type) use ($cursorsKeyByPostType) { + $cursors = $cursorsKeyByPostType?->get($type); if ($cursors === null) { return $qb; } @@ -95,7 +93,7 @@ protected function setResult( }); $this->stopwatch->stop('initPaginators'); - $resultsAndHasMorePages = $paginators->map(static fn(QueryBuilder $paginator) => + $resultsAndHasMorePages = $paginators->map(fn(QueryBuilder $paginator) => self::hasQueryResultMorePages($paginator, $this->perPageItems)); /** @var Collection $postsKeyByTypePluralName */ $postsKeyByTypePluralName = $resultsAndHasMorePages @@ -173,31 +171,31 @@ static function (string $postIDName) use ($result): array { /** @var Collection $parentThreadsID parent tid of all replies and their sub replies */ $parentThreadsID = $replies->pluck('tid')->concat($subReplies->pluck('tid'))->unique(); /** @var Collection $threads */ - $threads = array_map( - static fn(Thread $thread) => - $thread->setIsMatchQuery($tids->contains($thread->getTid())), - $postModels['thread']->createQueryBuilder('t') - ->where('t.tid IN (:tids)')->setParameter('tids', $parentThreadsID->concat($tids)->toArray()) - ->getQuery()->getResult() - ); + $threads = collect($postModels['thread']->createQueryBuilder('t') + ->where('t.tid IN (:tids)') + ->setParameter('tids', $parentThreadsID->concat($tids)->toArray()) + ->getQuery()->getResult()) + ->map(static fn(Thread $thread) => + $thread->setIsMatchQuery($tids->contains($thread->getTid()))); $this->stopwatch->stop('fillWithThreadsFields'); $this->stopwatch->start('fillWithRepliesFields'); /** @var Collection $parentRepliesID parent pid of all sub replies */ $parentRepliesID = $subReplies->pluck('pid')->unique(); - $replies = array_map( - static fn(Reply $reply) => - $reply->setIsMatchQuery($pids->contains($reply->getPid())), - $postModels['reply']->createQueryBuilder('t') - ->where('t.pid IN (:pids)')->setParameter('pids', $parentRepliesID->concat($pids)->toArray()) - ->getQuery()->getResult() - ); + $replies = collect($postModels['reply']->createQueryBuilder('t') + ->where('t.pid IN (:pids)') + ->setParameter('pids', $parentRepliesID->concat($pids)->toArray()) + ->getQuery()->getResult() + )->map(static fn(Reply $reply) => + $reply->setIsMatchQuery($pids->contains($reply->getPid()))); $this->stopwatch->stop('fillWithRepliesFields'); $this->stopwatch->start('fillWithSubRepliesFields'); - $subReplies = $postModels['subReply']->createQueryBuilder('t') + $subReplies = collect($postModels['subReply']->createQueryBuilder('t') ->where('t.spid IN (:spids)')->setParameter('spids', $spids->toArray()) - ->getQuery()->getResult(); + ->getQuery()->getResult()) + ->map(static fn(SubReply $subReply) => + $subReply->setIsMatchQuery(true)); $this->stopwatch->stop('fillWithSubRepliesFields'); /* @@ -238,8 +236,8 @@ public function nestPostsWithParent( ): Collection { $this->stopwatch->start('nestPostsWithParent'); - $replies = $replies->groupBy('tid'); - $subReplies = $subReplies->groupBy('pid'); + $replies = $replies->groupBy(fn(Reply $reply) => $reply->getTid()); + $subReplies = $subReplies->groupBy(fn(SubReply $subReply) => $subReply->getPid()); $ret = $threads ->map(fn(Thread $thread) => [ ...$this->serializer->normalize($thread), @@ -247,7 +245,7 @@ public function nestPostsWithParent( ->get($thread->getTid(), collect()) ->map(fn(Reply $reply) => [ ...$this->serializer->normalize($reply), - 'subReplies' => $subReplies->get($reply->getPid(), collect()), + 'subReplies' => $this->serializer->normalize($subReplies->get($reply->getPid(), collect())), ]), ]) ->recursive(); @@ -282,8 +280,7 @@ public function reOrderNestedPosts(Collection $nestedPosts, bool $shouldRemoveSo $curAndChildSortingKeys = collect([ // value of orderBy field in the first sorted child post that isMatchQuery after previous sorting $childPosts - // sub replies won't have isMatchQuery - ->filter(static fn(Collection $p) => ($p['isMatchQuery'] ?? true) === true) + ->filter(static fn(Collection $p) => $p['isMatchQuery'] === true) // if no child posts matching the query, use null as the sorting key ->first()[$this->orderByField] ?? null, // sorting key from the first sorted child posts @@ -330,7 +327,7 @@ function (Collection $thread) use ( */ function (Collection $reply) use ($setSortingKeyFromCurrentAndChildPosts) { $reply['subReplies'] = $reply['subReplies']->sortBy( - fn(Collection $subReplies) => $subReplies[$this->orderByField], + fn(Collection $subReplies) => $subReplies->get($this->orderByField), descending: $this->orderByDesc, ); return $setSortingKeyFromCurrentAndChildPosts($reply, 'subReplies'); diff --git a/symfony/src/PostsQuery/IndexQuery.php b/symfony/src/PostsQuery/IndexQuery.php index b07a3154..0b0ab9d5 100644 --- a/symfony/src/PostsQuery/IndexQuery.php +++ b/symfony/src/PostsQuery/IndexQuery.php @@ -45,7 +45,7 @@ public function query(QueryParams $params, ?string $cursor): void * @param int $fid * @return Collection key by post type */ - $getQueryBuilders = static fn(int $fid): Collection => + $getQueryBuilders = fn(int $fid): Collection => collect($this->postRepositoryFactory->newForumPosts($fid)) ->only($postTypes) ->transform(static fn(PostRepository $repository) => $repository->selectCurrentAndParentPostID()); @@ -57,7 +57,7 @@ public function query(QueryParams $params, ?string $cursor): void ->select("$fid AS fid", 'COUNT(t) AS count') ->where("t.$postIDName = :postID") ->setParameter('postID', $postID) - ->getQuery()->getResult()) + ->getQuery()->getSingleResult()) ->where('count', '!=', 0); Helper::abortAPIIf(50001, $counts->count() > 1); Helper::abortAPIIf(40401, $counts->count() === 0); diff --git a/symfony/src/Repository/Post/PostRepository.php b/symfony/src/Repository/Post/PostRepository.php index 769ab777..32cc6c71 100644 --- a/symfony/src/Repository/Post/PostRepository.php +++ b/symfony/src/Repository/Post/PostRepository.php @@ -34,7 +34,7 @@ public function __construct( public function selectCurrentAndParentPostID(): QueryBuilder { - return $this->createQueryBuilder('t')->addSelect(collect(Helper::POST_TYPE_TO_ID) + return $this->createQueryBuilder('t')->select(collect(Helper::POST_TYPE_TO_ID) ->slice(0, array_search($this->getTableNameSuffix(), Helper::POST_TYPES, true) + 1) ->values() ->map(static fn(string $postIDField) => "t.$postIDField") From 338d4a2e1e0fc970e3f5c4d74f2837e6a09bfb85 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 20:06:09 +0000 Subject: [PATCH 43/61] + props `$current(ForumModerator|AuthorExpGrade)` and their g/setter @ `App\Entity\User` + `getLatestOfUsers()` @ ForumModeratorRepository + `getLatestOfUsers()` @ AuthorExpGradeRepository @ `App\Repository\Revision` + dto `ForumModerator` & AuthorExpGrade @ `App\DTO\User` * add auto mapping for `App\DTO` @ config/packges/doctrine.yaml @ symfony --- symfony/config/packages/doctrine.yaml | 6 ++++ symfony/src/DTO/User/AuthorExpGrade.php | 32 +++++++++++++++++++ symfony/src/DTO/User/ForumModerator.php | 32 +++++++++++++++++++ symfony/src/Entity/User.php | 24 ++++++++++++++ .../Revision/AuthorExpGradeRepository.php | 24 ++++++++++++++ .../Revision/ForumModeratorRepository.php | 24 ++++++++++++++ 6 files changed, 142 insertions(+) create mode 100644 symfony/src/DTO/User/AuthorExpGrade.php create mode 100644 symfony/src/DTO/User/ForumModerator.php diff --git a/symfony/config/packages/doctrine.yaml b/symfony/config/packages/doctrine.yaml index 96344f11..1071d75b 100644 --- a/symfony/config/packages/doctrine.yaml +++ b/symfony/config/packages/doctrine.yaml @@ -23,6 +23,12 @@ doctrine: dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App + DTO: + type: attribute + is_bundle: false + dir: '%kernel.project_dir%/src/DTO' + prefix: 'App\DTO' + alias: DTO controller_resolver: auto_mapping: false diff --git a/symfony/src/DTO/User/AuthorExpGrade.php b/symfony/src/DTO/User/AuthorExpGrade.php new file mode 100644 index 00000000..baa6e1ba --- /dev/null +++ b/symfony/src/DTO/User/AuthorExpGrade.php @@ -0,0 +1,32 @@ +uid; + } + + public function getDiscoveredAt(): int + { + return $this->discoveredAt; + } + + public function getAuthorExpGrade(): int + { + return $this->authorExpGrade; + } +} diff --git a/symfony/src/DTO/User/ForumModerator.php b/symfony/src/DTO/User/ForumModerator.php new file mode 100644 index 00000000..9de86254 --- /dev/null +++ b/symfony/src/DTO/User/ForumModerator.php @@ -0,0 +1,32 @@ +portrait; + } + + public function getDiscoveredAt(): int + { + return $this->discoveredAt; + } + + public function getModeratorTypes(): string + { + return $this->moderatorTypes; + } +} diff --git a/symfony/src/Entity/User.php b/symfony/src/Entity/User.php index 6fac4103..58014ee6 100644 --- a/symfony/src/Entity/User.php +++ b/symfony/src/Entity/User.php @@ -2,6 +2,8 @@ namespace App\Entity; +use App\DTO\User\AuthorExpGrade; +use App\DTO\User\ForumModerator; use App\Repository\UserRepository; use Doctrine\ORM\Mapping as ORM; use TbClient\UserDeps\Icon; @@ -21,6 +23,8 @@ class User extends TimestampedEntity /** @type ?resource */ #[ORM\Column] private $icon; #[ORM\Column] private string $ipGeolocation; + private ?ForumModerator $currentForumModerator; + private ?AuthorExpGrade $currentAuthorExpGrade; public function getUid(): ?int { @@ -66,4 +70,24 @@ public function getIpGeolocation(): string { return $this->ipGeolocation; } + + public function getCurrentForumModerator(): ?ForumModerator + { + return $this->currentForumModerator; + } + + public function setCurrentForumModerator(?ForumModerator $currentForumModerator): void + { + $this->currentForumModerator = $currentForumModerator; + } + + public function getCurrentAuthorExpGrade(): ?AuthorExpGrade + { + return $this->currentAuthorExpGrade; + } + + public function setCurrentAuthorExpGrade(?AuthorExpGrade $currentAuthorExpGrade): void + { + $this->currentAuthorExpGrade = $currentAuthorExpGrade; + } } diff --git a/symfony/src/Repository/Revision/AuthorExpGradeRepository.php b/symfony/src/Repository/Revision/AuthorExpGradeRepository.php index b62f6271..d01a568f 100644 --- a/symfony/src/Repository/Revision/AuthorExpGradeRepository.php +++ b/symfony/src/Repository/Revision/AuthorExpGradeRepository.php @@ -2,8 +2,10 @@ namespace App\Repository\Revision; +use App\DTO\User\AuthorExpGrade as AuthorExpGradeDTO; use App\Entity\Revision\AuthorExpGrade; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\Persistence\ManagerRegistry; class AuthorExpGradeRepository extends ServiceEntityRepository @@ -12,4 +14,26 @@ public function __construct(ManagerRegistry $registry) { parent::__construct($registry, AuthorExpGrade::class); } + + public function getLatestOfUsers(int $fid, \ArrayAccess $usersId) + { + $entityManager = $this->getEntityManager(); + $tableName = $entityManager->getClassMetadata(AuthorExpGrade::class)->getTableName(); + + // ResultSetMappingBuilder->addRootEntityFromClassMetadata() won't work due to case-sensitive quoting + $rsm = new ResultSetMapping(); + $rsm->addEntityResult(AuthorExpGradeDTO::class, 't'); + $rsm->addFieldResult('t', 'uid', 'uid'); + $rsm->addFieldResult('t', 'discoveredAt', 'discoveredAt'); + $rsm->addFieldResult('t', 'authorExpGrade', 'authorExpGrade'); + + return $entityManager->createNativeQuery(<<<"SQL" + SELECT uid, "discoveredAt", "authorExpGrade" FROM ( + SELECT uid, "discoveredAt", "authorExpGrade", + ROW_NUMBER() OVER (PARTITION BY uid ORDER BY "discoveredAt" DESC) AS rn + FROM $tableName WHERE fid = :fid AND uid IN (:usersId) + ) t WHERE t.rn = 1 + SQL, $rsm) + ->setParameters(compact('fid', 'usersId'))->getResult(); + } } diff --git a/symfony/src/Repository/Revision/ForumModeratorRepository.php b/symfony/src/Repository/Revision/ForumModeratorRepository.php index 093b73a2..438234e4 100644 --- a/symfony/src/Repository/Revision/ForumModeratorRepository.php +++ b/symfony/src/Repository/Revision/ForumModeratorRepository.php @@ -2,8 +2,10 @@ namespace App\Repository\Revision; +use App\DTO\User\ForumModerator as ForumModeratorDTO; use App\Entity\Revision\ForumModerator; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\Persistence\ManagerRegistry; class ForumModeratorRepository extends ServiceEntityRepository @@ -12,4 +14,26 @@ public function __construct(ManagerRegistry $registry) { parent::__construct($registry, ForumModerator::class); } + + public function getLatestOfUsers(int $fid, \ArrayAccess $portraits) + { + $entityManager = $this->getEntityManager(); + $tableName = $entityManager->getClassMetadata(ForumModerator::class)->getTableName(); + + // ResultSetMappingBuilder->addRootEntityFromClassMetadata() won't work due to case-sensitive quoting + $rsm = new ResultSetMapping(); + $rsm->addEntityResult(ForumModeratorDTO::class, 't'); + $rsm->addFieldResult('t', 'portrait', 'portrait'); + $rsm->addFieldResult('t', 'discoveredAt', 'discoveredAt'); + $rsm->addFieldResult('t', 'moderatorTypes', 'moderatorTypes'); + + return $entityManager->createNativeQuery(<<<"SQL" + SELECT portrait, "discoveredAt", "moderatorTypes" FROM ( + SELECT portrait, "discoveredAt", "moderatorTypes", + ROW_NUMBER() OVER (PARTITION BY portrait ORDER BY "discoveredAt" DESC) AS rn + FROM $tableName WHERE fid = :fid AND portrait IN (:portraits) + ) t WHERE t.rn = 1 + SQL, $rsm) + ->setParameters(compact('fid', 'portraits'))->getResult(); + } } From 8de7b4de5c6758e14c17865357b55f2ea881fce3 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 20:21:47 +0000 Subject: [PATCH 44/61] * manually query `PostContent` entities for reply and sub replies and store them with `PostWithContent->setContent()`, not using one-to-one association due to relying on `PostRepository->getTableNameSuffix()` to set table name prefix * replace `Collection->map()` with `->each()` when its closure returns `void` * remove unnecessary invokes to `Collection->toArray()` @ `App\PostsQuery\BaseQuery->fillWithParentPost()` + abstract class `PostWithContent` to let entity classes `(Sub)?Reply` inherits it * replace fluent setter `setIsMatchQuery()` with an normal setter @ `Post` @ `App\Entity\Post` @ symfony --- symfony/src/Entity/Post/Post.php | 3 +- symfony/src/Entity/Post/PostWithContent.php | 20 ++++++++++++ symfony/src/Entity/Post/Reply.php | 2 +- symfony/src/Entity/Post/SubReply.php | 2 +- symfony/src/PostsQuery/BaseQuery.php | 34 +++++++++++++-------- 5 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 symfony/src/Entity/Post/PostWithContent.php diff --git a/symfony/src/Entity/Post/Post.php b/symfony/src/Entity/Post/Post.php index 1fe0fbe2..31774642 100644 --- a/symfony/src/Entity/Post/Post.php +++ b/symfony/src/Entity/Post/Post.php @@ -45,9 +45,8 @@ public function getIsMatchQuery(): bool return $this->isMatchQuery; } - public function setIsMatchQuery(bool $isMatchQuery): static + public function setIsMatchQuery(bool $isMatchQuery): void { $this->isMatchQuery = $isMatchQuery; - return $this; } } diff --git a/symfony/src/Entity/Post/PostWithContent.php b/symfony/src/Entity/Post/PostWithContent.php new file mode 100644 index 00000000..a2459cd0 --- /dev/null +++ b/symfony/src/Entity/Post/PostWithContent.php @@ -0,0 +1,20 @@ +content; + } + + public function setContent(PostContentWrapper $content): void + { + $this->content = $content; + } +} diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php index 750172ee..49eb8575 100644 --- a/symfony/src/Entity/Post/Reply.php +++ b/symfony/src/Entity/Post/Reply.php @@ -8,7 +8,7 @@ use TbClient\Post\Common\Lbs; #[ORM\Entity(repositoryClass: ReplyRepository::class)] -class Reply extends Post +class Reply extends PostWithContent { #[ORM\Column] private int $tid; #[ORM\Column, ORM\Id] private int $pid; diff --git a/symfony/src/Entity/Post/SubReply.php b/symfony/src/Entity/Post/SubReply.php index 0155a939..3798f40a 100644 --- a/symfony/src/Entity/Post/SubReply.php +++ b/symfony/src/Entity/Post/SubReply.php @@ -6,7 +6,7 @@ use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: SubReplyRepository::class)] -class SubReply extends Post +class SubReply extends PostWithContent { #[ORM\Column] private int $tid; #[ORM\Column] private int $pid; diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index 3a812d47..c6183d4b 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -2,6 +2,8 @@ namespace App\PostsQuery; +use App\Entity\Post\Content\ReplyContent; +use App\Entity\Post\Content\SubReplyContent; use App\Entity\Post\Post; use App\Entity\Post\Reply; use App\Entity\Post\SubReply; @@ -173,9 +175,9 @@ static function (string $postIDName) use ($result): array { /** @var Collection $threads */ $threads = collect($postModels['thread']->createQueryBuilder('t') ->where('t.tid IN (:tids)') - ->setParameter('tids', $parentThreadsID->concat($tids)->toArray()) + ->setParameter('tids', $parentThreadsID->concat($tids)) ->getQuery()->getResult()) - ->map(static fn(Thread $thread) => + ->each(static fn(Thread $thread) => $thread->setIsMatchQuery($tids->contains($thread->getTid()))); $this->stopwatch->stop('fillWithThreadsFields'); @@ -184,28 +186,34 @@ static function (string $postIDName) use ($result): array { $parentRepliesID = $subReplies->pluck('pid')->unique(); $replies = collect($postModels['reply']->createQueryBuilder('t') ->where('t.pid IN (:pids)') - ->setParameter('pids', $parentRepliesID->concat($pids)->toArray()) - ->getQuery()->getResult() - )->map(static fn(Reply $reply) => + ->setParameter('pids', $parentRepliesID->concat($pids)) + ->getQuery()->getResult()) + ->each(static fn(Reply $reply) => $reply->setIsMatchQuery($pids->contains($reply->getPid()))); $this->stopwatch->stop('fillWithRepliesFields'); $this->stopwatch->start('fillWithSubRepliesFields'); $subReplies = collect($postModels['subReply']->createQueryBuilder('t') - ->where('t.spid IN (:spids)')->setParameter('spids', $spids->toArray()) + ->where('t.spid IN (:spids)')->setParameter('spids', $spids) ->getQuery()->getResult()) - ->map(static fn(SubReply $subReply) => + ->each(static fn(SubReply $subReply) => $subReply->setIsMatchQuery(true)); $this->stopwatch->stop('fillWithSubRepliesFields'); - /* $this->stopwatch->start('parsePostContentProtoBufBytes'); - $replies->concat($subReplies)->each(function ($post) { - $post->content = $post->contentProtoBuf?->protoBufBytes?->value; - unset($post->contentProtoBuf); - }); + // not using one-to-one association due to relying on PostRepository->getTableNameSuffix() + $replyContents = collect($this->postRepositoryFactory->newReplyContent($fid)->createQueryBuilder('t') + ->where('t.pid IN (:pids)')->setParameter('pids', $pids) + ->getQuery()->getResult()) + ->mapWithKeys(fn(ReplyContent $content) => [$content->getPid() => $content->getProtoBufBytes()]); + $replies->each(fn(Reply $reply) => $reply->setContent($replyContents->get($reply->getPid()))); + + $subReplyContents = collect($this->postRepositoryFactory->newSubReplyContent($fid)->createQueryBuilder('t') + ->where('t.spid IN (:spids)')->setParameter('spids', $spids) + ->getQuery()->getResult()) + ->mapWithKeys(fn(SubReplyContent $content) => [$content->getSpid() => $content->getProtoBufBytes()]); + $subReplies->each(fn(SubReply $subReply) => $subReply->setContent($subReplyContents->get($subReply->getSpid()))); $this->stopwatch->stop('parsePostContentProtoBufBytes'); - */ return [ 'fid' => $fid, From 7521aa40f2e8b1dada4fd0a7b1fdc8eda7449542 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 20:34:43 +0000 Subject: [PATCH 45/61] * manually query partial projected DTO of entities `AuthorExpGrade` & `ForumModerator` of queried users and store them in the user entity like the one-to-one relationship based `App\Eloquent\Model\User->current(ForumModerator|AuthorExpGrade)()` in `be` * fix trying to directly access prop `Thread->latestReplierId` * fix selecting all fields for `uid IS NOT NULL` @ `App\Controller\PostsController->query()` + missing field `latestReplierId` and its getter @ `App\Entity\Post\Thread` * fix regression of double quoting the table name being interpolated into raw SQL since 8483414df4f3d3c477b2b76ad2ff77c9a6adcdc1 @ `App\Repository\Post\ThreadRepository->getThreadsIdByChunks()` @ symfony --- symfony/src/Controller/PostsController.php | 45 +++++++++++++------ symfony/src/Entity/Post/Thread.php | 6 +++ .../src/Repository/Post/ThreadRepository.php | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/symfony/src/Controller/PostsController.php b/symfony/src/Controller/PostsController.php index 4ea1cb33..e3f55843 100644 --- a/symfony/src/Controller/PostsController.php +++ b/symfony/src/Controller/PostsController.php @@ -2,6 +2,11 @@ namespace App\Controller; +use App\DTO\User\AuthorExpGrade; +use App\DTO\User\ForumModerator; +use App\Entity\Post\Post; +use App\Entity\Post\Thread; +use App\Entity\User; use App\Helper; use App\PostsQuery\BaseQuery; use App\PostsQuery\IndexQuery; @@ -9,6 +14,8 @@ use App\PostsQuery\SearchQuery; use App\Repository\ForumRepository; use App\Repository\LatestReplierRepository; +use App\Repository\Revision\AuthorExpGradeRepository; +use App\Repository\Revision\ForumModeratorRepository; use App\Repository\UserRepository; use App\Validator\Validator; use Illuminate\Support\Arr; @@ -29,6 +36,8 @@ public function __construct( private readonly ForumRepository $forumRepository, private readonly UserRepository $userRepository, private readonly LatestReplierRepository $latestReplierRepository, + private readonly ForumModeratorRepository $forumModeratorRepository, + private readonly AuthorExpGradeRepository $authorExpGradeRepository, #[AutowireLocator([ ParamsValidator::class, IndexQuery::class, @@ -77,30 +86,40 @@ public function query(Request $request): array $this->stopwatch->stop('fillWithParentPost'); $this->stopwatch->start('queryUsers'); - $latestRepliersId = $result['threads']->pluck('latestReplierId'); + $latestRepliersId = $result['threads']->map(fn(Thread $thread) => $thread->getLatestReplierId()); $latestRepliers = collect() ->concat($this->latestReplierRepository->createQueryBuilder('t') ->where('t.id IN (:ids)')->setParameter('ids', $latestRepliersId) ->andWhere('t.uid IS NOT NULL') + ->select('t.id', 't.uid', 't.createdAt', 't.updatedAt') // removeSelect('t.name', 't.displayName') ->getQuery()->getResult()) ->concat($this->latestReplierRepository->createQueryBuilder('t') ->where('t.id IN (:ids)')->setParameter('ids', $latestRepliersId) ->andWhere('t.uid IS NULL') - ->addSelect('t.name', 't.displayName') ->getQuery()->getResult()); - $users = $this->userRepository->createQueryBuilder('t') + $uids = collect($result) + ->only(Helper::POST_TYPES_PLURAL) + ->flatMap(static fn(Collection $posts) => $posts->map(fn(Post $post) => $post->getAuthorUid())) + ->concat($latestRepliers->pluck('uid')) + ->filter()->unique(); // remove NULLs + $users = collect($this->userRepository->createQueryBuilder('t') ->where('t.uid IN (:uids)') - ->setParameter( - 'uids', - collect($result) - ->only(Helper::POST_TYPES_PLURAL) - ->flatMap(static fn(Collection $posts) => $posts->pluck('authorUid')) - ->concat($latestRepliers->pluck('uid')) - ->filter()->unique()->toArray() // remove NULLs - ) - ->getQuery()->getResult(); + ->setParameter('uids', $uids) + ->getQuery()->getResult()); $this->stopwatch->stop('queryUsers'); + $this->stopwatch->start('queryUserRelated'); + $fid = $result['fid']; + $authorExpGrades = collect($this->authorExpGradeRepository->getLatestOfUsers($fid, $uids)) + ->keyBy(fn(AuthorExpGrade $authorExpGrade) => $authorExpGrade->getUid()); + $users->each(fn (User $user) => $user->setCurrentAuthorExpGrade($authorExpGrades[$user->getUid()])); + + $forumModerators = collect($this->forumModeratorRepository + ->getLatestOfUsers($fid, $users->map(fn(User $user) => $user->getPortrait()))) + ->keyBy(fn(ForumModerator $forumModerator) => $forumModerator->getPortrait()); + $users->each(fn (User $user) => $user->setCurrentForumModerator($forumModerators->get($user->getPortrait()))); + $this->stopwatch->stop('queryUserRelated'); + return [ 'type' => $isIndexQuery ? 'index' : 'search', 'pages' => [ @@ -108,7 +127,7 @@ public function query(Request $request): array ...Arr::except($result, ['fid', ...Helper::POST_TYPES_PLURAL]), ], 'forum' => $this->forumRepository->createQueryBuilder('t') - ->where('t.fid = :fid')->setParameter('fid', $result['fid']) + ->where('t.fid = :fid')->setParameter('fid', $fid) ->setMaxResults(1)->getQuery()->getResult(), 'threads' => $query->reOrderNestedPosts($query->nestPostsWithParent(...$result)), 'users' => $users, diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index 70941e6d..a2ebcacb 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -18,6 +18,7 @@ class Thread extends Post #[ORM\Column] private ?int $isGood; #[ORM\Column] private string $title; #[ORM\Column] private int $latestReplyPostedAt; + #[ORM\Column] private ?int $latestReplierId; #[ORM\Column] private ?int $replyCount; #[ORM\Column] private ?int $viewCount; #[ORM\Column] private ?int $shareCount; @@ -62,6 +63,11 @@ public function getLatestReplyPostedAt(): int return $this->latestReplyPostedAt; } + public function getLatestReplierId(): ?int + { + return $this->latestReplierId; + } + public function getReplyCount(): int { return $this->replyCount ?? 0; diff --git a/symfony/src/Repository/Post/ThreadRepository.php b/symfony/src/Repository/Post/ThreadRepository.php index a57d630f..17dde90c 100644 --- a/symfony/src/Repository/Post/ThreadRepository.php +++ b/symfony/src/Repository/Post/ThreadRepository.php @@ -29,7 +29,7 @@ public function getThreadsIdByChunks(int $chunkSize): array // https://github.com/doctrine/dbal/issues/5018#issuecomment-2395177479 $entityManager = $this->getEntityManager(); $connection = $entityManager->getConnection(); - $tableName = $connection->quoteIdentifier($entityManager->getClassMetadata(Thread::class)->getTableName()); + $tableName = $entityManager->getClassMetadata(Thread::class)->getTableName(); $statement = $connection->prepare(<<<"SQL" SELECT tid FROM ( SELECT tid, ROW_NUMBER() OVER (ORDER BY tid) rn FROM $tableName From cc7ec13ca8441f9e0b02944815e1d8f9ecb97654 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 20:51:14 +0000 Subject: [PATCH 46/61] * partial revert 3be6b04cfdda4565d340acc8019211e73f67e3af to remove fields with default value @ `BlobResourceGetter`, also affects all its usages * replace the type of prop `$content` from `PostContentWrapper` to `array` @ `Post\PostWithContent->getContent()` @ `App\Entity` @ symfony --- symfony/src/Entity/BlobResourceGetter.php | 8 ++++---- symfony/src/Entity/Post/Content/PostContent.php | 2 +- symfony/src/Entity/Post/PostWithContent.php | 8 +++----- symfony/src/Entity/Post/Reply.php | 2 +- symfony/src/Entity/Post/Thread.php | 4 ++-- symfony/src/Entity/User.php | 2 +- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/symfony/src/Entity/BlobResourceGetter.php b/symfony/src/Entity/BlobResourceGetter.php index e4b927d4..3c895a16 100644 --- a/symfony/src/Entity/BlobResourceGetter.php +++ b/symfony/src/Entity/BlobResourceGetter.php @@ -9,17 +9,17 @@ class BlobResourceGetter /** * @param ?resource $value * @param class-string $protoBufClass - * @template T extends Message - * @return ?T + * @template T of Message */ - public static function protoBuf($value, string $protoBufClass): ?Message + public static function protoBuf($value, string $protoBufClass): ?array { if ($value === null) { return null; } $protoBuf = new $protoBufClass(); $protoBuf->mergeFromString(self::resource($value)); - return $protoBuf; + // Message->serializeToJsonString() will remove fields with default value + return \Safe\json_decode($protoBuf->serializeToJsonString(), assoc: true); } /** diff --git a/symfony/src/Entity/Post/Content/PostContent.php b/symfony/src/Entity/Post/Content/PostContent.php index 1cbb057d..0bd2fdcb 100644 --- a/symfony/src/Entity/Post/Content/PostContent.php +++ b/symfony/src/Entity/Post/Content/PostContent.php @@ -12,7 +12,7 @@ abstract class PostContent /** @type ?resource */ #[ORM\Column] private $protoBufBytes; - public function getProtoBufBytes(): ?PostContentWrapper + public function getProtoBufBytes(): ?array { return BlobResourceGetter::protoBuf($this->protoBufBytes, PostContentWrapper::class); } diff --git a/symfony/src/Entity/Post/PostWithContent.php b/symfony/src/Entity/Post/PostWithContent.php index a2459cd0..cb3e9ddd 100644 --- a/symfony/src/Entity/Post/PostWithContent.php +++ b/symfony/src/Entity/Post/PostWithContent.php @@ -2,18 +2,16 @@ namespace App\Entity\Post; -use TbClient\Wrapper\PostContentWrapper; - abstract class PostWithContent extends Post { - private PostContentWrapper $content; + private ?array $content; - public function getContent(): PostContentWrapper + public function getContent(): ?array { return $this->content; } - public function setContent(PostContentWrapper $content): void + public function setContent(?array $content): void { $this->content = $content; } diff --git a/symfony/src/Entity/Post/Reply.php b/symfony/src/Entity/Post/Reply.php index 49eb8575..5a24a532 100644 --- a/symfony/src/Entity/Post/Reply.php +++ b/symfony/src/Entity/Post/Reply.php @@ -44,7 +44,7 @@ public function getIsFold(): ?int return $this->isFold; } - public function getGeolocation(): ?Lbs + public function getGeolocation(): ?array { return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } diff --git a/symfony/src/Entity/Post/Thread.php b/symfony/src/Entity/Post/Thread.php index a2ebcacb..ecd4167b 100644 --- a/symfony/src/Entity/Post/Thread.php +++ b/symfony/src/Entity/Post/Thread.php @@ -83,12 +83,12 @@ public function getShareCount(): int return $this->shareCount ?? 0; } - public function getZan(): ?Zan + public function getZan(): ?array { return BlobResourceGetter::protoBuf($this->zan, Zan::class); } - public function getGeolocation(): ?Lbs + public function getGeolocation(): ?array { return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } diff --git a/symfony/src/Entity/User.php b/symfony/src/Entity/User.php index 58014ee6..d738962f 100644 --- a/symfony/src/Entity/User.php +++ b/symfony/src/Entity/User.php @@ -61,7 +61,7 @@ public function getFansNickname(): ?string return $this->fansNickname; } - public function getIcon(): ?Icon + public function getIcon(): ?array { return BlobResourceGetter::protoBuf($this->icon, Icon::class); } From eb0f3e82e60015482c1d54cac6f2feca67179ab6 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 23:33:06 +0000 Subject: [PATCH 47/61] * partial revert 32fbf136dece796a8501064c4a7bf26d637a1a72 @ `reOrderNestedPosts()` * partial revert 32fbf136dece796a8501064c4a7bf26d637a1a72 @ `fillWithParentPost()` @ `App\PostsQuery\BaseQuery` * fix passing the protobuf class inside `RepeatedField` @ `getIcon()` * fix the type of field `ipGeolocation` is not nullable @ `User` + `protoBufWrapper()` @ `BlobResourceGetter` + override `(g|s)etIsMatchQuery()` to make it always be `true` @ `Post\SubReply` @ `App\Entity` * fix nesting the only forum and selecting all its fields including surrogate PK `id` in the returned response @ `PostsController->query()` * add prefix `/api` for route `/{post,user,forum}s` like `be/routes/api.php` @ `App\Controller` * fix pretty JSON response for `ShowReactJsonView` @ `App\EventListener\PrettyJsonResponse` @ symfony --- symfony/src/Controller/ForumsController.php | 2 +- symfony/src/Controller/PostsController.php | 5 +++-- symfony/src/Controller/UsersController.php | 2 +- symfony/src/Entity/BlobResourceGetter.php | 11 +++++++++++ symfony/src/Entity/Post/Content/PostContent.php | 4 ++-- symfony/src/Entity/Post/SubReply.php | 11 +++++++++++ symfony/src/Entity/User.php | 8 ++++---- symfony/src/EventListener/PrettyJsonResponse.php | 2 +- symfony/src/PostsQuery/BaseQuery.php | 12 +++++------- symfony/src/PostsQuery/IndexQuery.php | 2 +- 10 files changed, 40 insertions(+), 19 deletions(-) diff --git a/symfony/src/Controller/ForumsController.php b/symfony/src/Controller/ForumsController.php index b16ccdb6..e4ef9f7e 100644 --- a/symfony/src/Controller/ForumsController.php +++ b/symfony/src/Controller/ForumsController.php @@ -10,7 +10,7 @@ class ForumsController extends AbstractController { public function __construct(private readonly ForumRepository $repository,) {} - #[Route('/forums')] + #[Route('/api/forums')] public function query(): array { return $this->repository->getOrderedForums(); diff --git a/symfony/src/Controller/PostsController.php b/symfony/src/Controller/PostsController.php index e3f55843..edd7a811 100644 --- a/symfony/src/Controller/PostsController.php +++ b/symfony/src/Controller/PostsController.php @@ -46,7 +46,7 @@ public function __construct( private readonly ContainerInterface $locator, ) {} - #[Route('/posts')] + #[Route('/api/posts')] public function query(Request $request): array { $this->validator->validate($request->query->all(), new Assert\Collection([ @@ -128,7 +128,8 @@ public function query(Request $request): array ], 'forum' => $this->forumRepository->createQueryBuilder('t') ->where('t.fid = :fid')->setParameter('fid', $fid) - ->setMaxResults(1)->getQuery()->getResult(), + ->select('t.fid', 't.name')->setMaxResults(1) + ->getQuery()->getSingleResult(), 'threads' => $query->reOrderNestedPosts($query->nestPostsWithParent(...$result)), 'users' => $users, 'latestRepliers' => $latestRepliers, diff --git a/symfony/src/Controller/UsersController.php b/symfony/src/Controller/UsersController.php index 45cc5aed..100a3e42 100644 --- a/symfony/src/Controller/UsersController.php +++ b/symfony/src/Controller/UsersController.php @@ -21,7 +21,7 @@ public function __construct( private readonly UserRepository $userRepository, ) {} - #[Route('/users')] + #[Route('/api/users')] public function query(Request $request): array { $queryParams = $request->query->all(); diff --git a/symfony/src/Entity/BlobResourceGetter.php b/symfony/src/Entity/BlobResourceGetter.php index 3c895a16..7eece02b 100644 --- a/symfony/src/Entity/BlobResourceGetter.php +++ b/symfony/src/Entity/BlobResourceGetter.php @@ -6,6 +6,17 @@ class BlobResourceGetter { + /** + * @param ?resource $value + * @param class-string $protoBufClass + * @template T of Message + */ + public static function protoBufWrapper($value, string $protoBufClass): ?array + { + $protoBuf = self::protoBuf($value, $protoBufClass); + return $protoBuf === null ? null : $protoBuf['value']; + } + /** * @param ?resource $value * @param class-string $protoBufClass diff --git a/symfony/src/Entity/Post/Content/PostContent.php b/symfony/src/Entity/Post/Content/PostContent.php index 0bd2fdcb..490a7ce5 100644 --- a/symfony/src/Entity/Post/Content/PostContent.php +++ b/symfony/src/Entity/Post/Content/PostContent.php @@ -12,8 +12,8 @@ abstract class PostContent /** @type ?resource */ #[ORM\Column] private $protoBufBytes; - public function getProtoBufBytes(): ?array + public function getContent(): ?array { - return BlobResourceGetter::protoBuf($this->protoBufBytes, PostContentWrapper::class); + return BlobResourceGetter::protoBufWrapper($this->protoBufBytes, PostContentWrapper::class); } } diff --git a/symfony/src/Entity/Post/SubReply.php b/symfony/src/Entity/Post/SubReply.php index 3798f40a..646676b0 100644 --- a/symfony/src/Entity/Post/SubReply.php +++ b/symfony/src/Entity/Post/SubReply.php @@ -4,6 +4,7 @@ use App\Repository\Post\SubReplyRepository; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Attribute\Ignore; #[ORM\Entity(repositoryClass: SubReplyRepository::class)] class SubReply extends PostWithContent @@ -26,4 +27,14 @@ public function getSpid(): int { return $this->spid; } + + #[Ignore] + public function getIsMatchQuery(): bool + { + return true; + } + + public function setIsMatchQuery(bool $isMatchQuery): void + { + } } diff --git a/symfony/src/Entity/User.php b/symfony/src/Entity/User.php index d738962f..48a27173 100644 --- a/symfony/src/Entity/User.php +++ b/symfony/src/Entity/User.php @@ -6,7 +6,7 @@ use App\DTO\User\ForumModerator; use App\Repository\UserRepository; use Doctrine\ORM\Mapping as ORM; -use TbClient\UserDeps\Icon; +use TbClient\Wrapper\UserIconWrapper; #[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\Table(name: '"tbmc_user"')] @@ -22,7 +22,7 @@ class User extends TimestampedEntity #[ORM\Column] private ?string $fansNickname; /** @type ?resource */ #[ORM\Column] private $icon; - #[ORM\Column] private string $ipGeolocation; + #[ORM\Column] private ?string $ipGeolocation; private ?ForumModerator $currentForumModerator; private ?AuthorExpGrade $currentAuthorExpGrade; @@ -63,10 +63,10 @@ public function getFansNickname(): ?string public function getIcon(): ?array { - return BlobResourceGetter::protoBuf($this->icon, Icon::class); + return BlobResourceGetter::protoBufWrapper($this->icon, UserIconWrapper::class); } - public function getIpGeolocation(): string + public function getIpGeolocation(): ?string { return $this->ipGeolocation; } diff --git a/symfony/src/EventListener/PrettyJsonResponse.php b/symfony/src/EventListener/PrettyJsonResponse.php index 36892d0f..259bd205 100644 --- a/symfony/src/EventListener/PrettyJsonResponse.php +++ b/symfony/src/EventListener/PrettyJsonResponse.php @@ -6,7 +6,7 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Event\ResponseEvent; -#[AsEventListener] +#[AsEventListener(priority: -1)] /** should be lower than @see ShowReactJsonView */ class PrettyJsonResponse { public function __invoke(ResponseEvent $event): void diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index c6183d4b..e6a34b94 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -195,9 +195,7 @@ static function (string $postIDName) use ($result): array { $this->stopwatch->start('fillWithSubRepliesFields'); $subReplies = collect($postModels['subReply']->createQueryBuilder('t') ->where('t.spid IN (:spids)')->setParameter('spids', $spids) - ->getQuery()->getResult()) - ->each(static fn(SubReply $subReply) => - $subReply->setIsMatchQuery(true)); + ->getQuery()->getResult()); $this->stopwatch->stop('fillWithSubRepliesFields'); $this->stopwatch->start('parsePostContentProtoBufBytes'); @@ -205,13 +203,13 @@ static function (string $postIDName) use ($result): array { $replyContents = collect($this->postRepositoryFactory->newReplyContent($fid)->createQueryBuilder('t') ->where('t.pid IN (:pids)')->setParameter('pids', $pids) ->getQuery()->getResult()) - ->mapWithKeys(fn(ReplyContent $content) => [$content->getPid() => $content->getProtoBufBytes()]); + ->mapWithKeys(fn(ReplyContent $content) => [$content->getPid() => $content->getContent()]); $replies->each(fn(Reply $reply) => $reply->setContent($replyContents->get($reply->getPid()))); $subReplyContents = collect($this->postRepositoryFactory->newSubReplyContent($fid)->createQueryBuilder('t') ->where('t.spid IN (:spids)')->setParameter('spids', $spids) ->getQuery()->getResult()) - ->mapWithKeys(fn(SubReplyContent $content) => [$content->getSpid() => $content->getProtoBufBytes()]); + ->mapWithKeys(fn(SubReplyContent $content) => [$content->getSpid() => $content->getContent()]); $subReplies->each(fn(SubReply $subReply) => $subReply->setContent($subReplyContents->get($subReply->getSpid()))); $this->stopwatch->stop('parsePostContentProtoBufBytes'); @@ -287,8 +285,8 @@ public function reOrderNestedPosts(Collection $nestedPosts, bool $shouldRemoveSo // use the topmost value between sorting key or value of orderBy field within its child posts $curAndChildSortingKeys = collect([ // value of orderBy field in the first sorted child post that isMatchQuery after previous sorting - $childPosts - ->filter(static fn(Collection $p) => $p['isMatchQuery'] === true) + $childPosts // sub replies won't have isMatchQuery + ->filter(static fn(Collection $p) => ($p['isMatchQuery'] ?? true) === true) // if no child posts matching the query, use null as the sorting key ->first()[$this->orderByField] ?? null, // sorting key from the first sorted child posts diff --git a/symfony/src/PostsQuery/IndexQuery.php b/symfony/src/PostsQuery/IndexQuery.php index 0b0ab9d5..ea8a7211 100644 --- a/symfony/src/PostsQuery/IndexQuery.php +++ b/symfony/src/PostsQuery/IndexQuery.php @@ -88,7 +88,7 @@ public function query(QueryParams $params, ?string $cursor): void Helper::POST_TYPES, // only query post types that own the querying post ID param array_search($postIDParamName, Helper::POST_ID, true), )) - ->map(static fn(QueryBuilder $qb, string $type) => + ->each(static fn(QueryBuilder $qb, string $type) => $qb->where("t.$postIDParamName = :postIDParamValue") ->setParameter('postIDParamValue', $postIDParamValue)); } From 52e4e481813d8649783279f186ba24ddec825464 Mon Sep 17 00:00:00 2001 From: n0099 Date: Tue, 8 Oct 2024 23:45:12 +0000 Subject: [PATCH 48/61] * fix appending AND predicate for each cursor without parenthesis * fix hardcoded `>` operator regardless of the querying order by direction * no longer returning the `QueryBuilder` by its fluent method as it's not immutable @ `$paginators()` * type `$postsKeyByTypePluralName` with `CursorCodec->PostsKeyByTypePluralName` @ `setResult()` * fix not querying reply content with `Reply->isMatchQuery === false` @ `fillWithParentPost()` @ `BaseQuery` * fix posts now will be an array that normalized from entity object * typing param `$postsKeyByTypePluralName` @ `encodeNextCursor()` * fix not removing cursors with all their field value is empty string or `0` @ `decodeCursor()` @ `CursorCodec` @ `App\PostsQuery` @ symfony --- symfony/src/PostsQuery/BaseQuery.php | 27 +++++++++++++++----------- symfony/src/PostsQuery/CursorCodec.php | 21 ++++++++++---------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index e6a34b94..630e1f04 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -10,11 +10,13 @@ use App\Entity\Post\Thread; use App\Helper; use App\Repository\Post\PostRepositoryFactory; +use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Illuminate\Support\Collection; use Symfony\Component\Serializer\SerializerInterface; use Symfony\Component\Stopwatch\Stopwatch; +/** @psalm-import-type PostsKeyByTypePluralName from CursorCodec */ abstract class BaseQuery { /** @type array{ @@ -82,22 +84,25 @@ protected function setResult( } $this->stopwatch->start('initPaginators'); /** @var Collection $paginators key by post type */ - $paginators = $orderedQueries->map(function (QueryBuilder $qb, string $type) use ($cursorsKeyByPostType) { + $paginators = $orderedQueries->each(function (QueryBuilder $qb, string $type) use ($cursorsKeyByPostType) { $cursors = $cursorsKeyByPostType?->get($type); if ($cursors === null) { - return $qb; + return; } - return collect($cursors)->reduce( - static fn(QueryBuilder $acc, $cursorValue, string $cursorField): QueryBuilder => - $acc->andWhere("t.$cursorField > :cursorValue")->setParameter('cursorValue', $cursorValue), - $qb - ); + $cursors = collect($cursors); + $comparisons = $cursors->keys()->map( + fn(string $fieldName): Expr\Comparison => $this->orderByDesc + ? $qb->expr()->lt("t.$fieldName", ":cursor_$fieldName") + : $qb->expr()->gt("t.$fieldName", ":cursor_$fieldName")); + $qb->andWhere($qb->expr()->orX(...$comparisons)); + $cursors->mapWithKeys(fn($fieldValue, string $fieldName) => + $qb->setParameter("cursor_$fieldName", $fieldValue)); // prevent overwriting existing param }); $this->stopwatch->stop('initPaginators'); $resultsAndHasMorePages = $paginators->map(fn(QueryBuilder $paginator) => self::hasQueryResultMorePages($paginator, $this->perPageItems)); - /** @var Collection $postsKeyByTypePluralName */ + /** @var PostsKeyByTypePluralName $postsKeyByTypePluralName */ $postsKeyByTypePluralName = $resultsAndHasMorePages ->mapWithKeys(fn(array $resultAndHasMorePages, string $postType) => [Helper::POST_TYPE_TO_PLURAL[$postType] => $resultAndHasMorePages['result']]); @@ -184,9 +189,9 @@ static function (string $postIDName) use ($result): array { $this->stopwatch->start('fillWithRepliesFields'); /** @var Collection $parentRepliesID parent pid of all sub replies */ $parentRepliesID = $subReplies->pluck('pid')->unique(); + $allRepliesId = $parentRepliesID->concat($pids); $replies = collect($postModels['reply']->createQueryBuilder('t') - ->where('t.pid IN (:pids)') - ->setParameter('pids', $parentRepliesID->concat($pids)) + ->where('t.pid IN (:pids)')->setParameter('pids', $allRepliesId) ->getQuery()->getResult()) ->each(static fn(Reply $reply) => $reply->setIsMatchQuery($pids->contains($reply->getPid()))); @@ -201,7 +206,7 @@ static function (string $postIDName) use ($result): array { $this->stopwatch->start('parsePostContentProtoBufBytes'); // not using one-to-one association due to relying on PostRepository->getTableNameSuffix() $replyContents = collect($this->postRepositoryFactory->newReplyContent($fid)->createQueryBuilder('t') - ->where('t.pid IN (:pids)')->setParameter('pids', $pids) + ->where('t.pid IN (:pids)')->setParameter('pids', $allRepliesId) ->getQuery()->getResult()) ->mapWithKeys(fn(ReplyContent $content) => [$content->getPid() => $content->getContent()]); $replies->each(fn(Reply $reply) => $reply->setContent($replyContents->get($reply->getPid()))); diff --git a/symfony/src/PostsQuery/CursorCodec.php b/symfony/src/PostsQuery/CursorCodec.php index 68d637dc..d9f42c16 100644 --- a/symfony/src/PostsQuery/CursorCodec.php +++ b/symfony/src/PostsQuery/CursorCodec.php @@ -2,14 +2,18 @@ namespace App\PostsQuery; -use App\Entity\Post\Post; use App\Helper; use Illuminate\Support\Collection; use Illuminate\Support\Str; +/** @psalm-type PostsKeyByTypePluralName = Collection{ + * threads: Collection, + * replies: Collection, + * subReplies: Collection, + * } */ class CursorCodec { - /** @param Collection $postsKeyByTypePluralName */ + /** @param PostsKeyByTypePluralName $postsKeyByTypePluralName */ public function encodeNextCursor(Collection $postsKeyByTypePluralName, string $orderByField): string { $encodedCursorsKeyByPostType = $postsKeyByTypePluralName @@ -17,13 +21,8 @@ public function encodeNextCursor(Collection $postsKeyByTypePluralName, string $o Helper::POST_TYPE_PLURAL_TO_SINGULAR[$type] => $posts->last(), // null when no posts ]) // [singularPostTypeName => lastPostInResult] ->filter() // remove post types that have no posts - ->map(function (Post $post, string $typePluralName) use ($orderByField) { - $postIDFieldName = Helper::POST_TYPE_TO_ID[$typePluralName]; - return [ - $post->{"get$postIDFieldName"}(), - $post->{"get$orderByField"}(), - ]; - }) + ->map(fn(array $post, string $typePluralName) => + [$post[Helper::POST_TYPE_TO_ID[$typePluralName]], $post[$orderByField]]) ->map(static fn(array $cursors) => collect($cursors) ->map(static function (int|string $cursor): string { if ($cursor === 0) { // quick exit to keep 0 as is @@ -103,9 +102,9 @@ public function decodeCursor(string $encodedCursors, string $orderByField): Coll $cursors->mapWithKeys(fn(int|string|null $cursor, int $index) => [$index === 0 ? Helper::POST_TYPE_TO_ID[$postType] : $orderByField => $cursor]), ]) - // filter out cursors with all fields value being null, their encoded cursor is ',,' + // filter out cursors with all fields value being null, '' or 0 with their encoded cursor ',,' ->reject(static fn(Collection $cursors) => - $cursors->every(static fn(int|string|null $cursor) => $cursor === null)) + $cursors->every(static fn(int|string|null $cursor) => empty($cursor))) ->map(static fn(Collection $cursors) => $cursors->all()); } } From 6b40d87efe0eeb860892f4516ecb016d2f51e866 Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 00:25:15 +0000 Subject: [PATCH 49/61] * fix overwriting existing SQL param with the same name by distinguishing them with `$paramIndex` * fix `QueryBuilder->where()` will override previous predicates like 32fbf136dece796a8501064c4a7bf26d637a1a72 * fix false positive about `InvalidArgumentException` when sub param `range` doesn't exists @ `App\PostsQuery\SearchQuery->applyQueryParamsOnQuery()` @ symfony --- symfony/src/PostsQuery/SearchQuery.php | 67 ++++++++++++++------------ 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/symfony/src/PostsQuery/SearchQuery.php b/symfony/src/PostsQuery/SearchQuery.php index 050c7dab..00b5f458 100644 --- a/symfony/src/PostsQuery/SearchQuery.php +++ b/symfony/src/PostsQuery/SearchQuery.php @@ -33,13 +33,14 @@ public function query(QueryParams $params, ?string $cursor): void ->only($params->getUniqueParamValue('postTypes')) ->map(function (PostRepository $repository) use ($params, &$cachedUserQueryResult): QueryBuilder { $postQuery = $repository->selectCurrentAndParentPostID(); - foreach ($params->omit() as $param) { // omit nothing to get all params + foreach ($params->omit() as $paramIndex => $param) { // omit nothing to get all params // even when $cachedUserQueryResult[$param->name] is null // it will still pass as a reference to the array item // that is null at this point, but will be later updated by ref $postQuery = self::applyQueryParamsOnQuery( $postQuery, $param, + $paramIndex, $cachedUserQueryResult[$param->name], ); } @@ -63,8 +64,10 @@ public function query(QueryParams $params, ?string $cursor): void private function applyQueryParamsOnQuery( QueryBuilder $query, QueryParam $param, + int $paramIndex, ?array &$outCachedUserQueryResult, ): QueryBuilder { + $sqlParamName = "param$paramIndex"; $name = $param->name; $value = $param->value; $sub = $param->getAllSub(); @@ -83,7 +86,7 @@ private function applyQueryParamsOnQuery( '=' => '!=', '>' => '<=', ]; - if (!array_key_exists($sub['range'], $inverseRanges)) { + if (array_key_exists('range', $sub) && !array_key_exists($sub['range'], $inverseRanges)) { throw new \InvalidArgumentException(); } $inverseRangeOfNumericParams = $inverseRanges[$sub['range'] ?? null] ?? null; @@ -97,11 +100,11 @@ static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryR return $outCachedUserQueryResult; }; - $whereBetween = static function (string $field) use ($query, $not, $value) { + $whereBetween = static function (string $field) use ($query, $not, $value, $sqlParamName) { $values = explode(',', $value); - return $query->where("t.$field $not BETWEEN ?0 AND ?1") - ->setParameter(0, $values[0]) - ->setParameter(1, $values[1]); + return $query->andWhere("t.$field $not BETWEEN :{$sqlParamName}_0 AND :{$sqlParamName}_1") + ->setParameter("{$sqlParamName}_0", $values[0]) + ->setParameter("{$sqlParamName}_1", $values[1]); }; return match ($name) { // numeric @@ -109,55 +112,56 @@ static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryR 'authorUid', 'authorExpGrade', 'latestReplierUid', 'threadViewCount', 'threadShareCount', 'threadReplyCount', 'replySubReplyCount' => match ($sub['range']) { - 'IN' => $query->where("t.$fieldNameOfNumericParams $not IN (:values)") - ->setParameter('values', explode(',', $value)), + 'IN' => $query->andWhere("t.$fieldNameOfNumericParams $not IN (:$sqlParamName)") + ->setParameter($sqlParamName, explode(',', $value)), 'BETWEEN' => $whereBetween($fieldNameOfNumericParams), - default => $query->where( + default => $query->andWhere( "t.$fieldNameOfNumericParams " . ($sub['not'] ? $inverseRangeOfNumericParams : $sub['range']) - . " :value" - )->setParameter('value', $value), + . " :$sqlParamName" + )->setParameter($sqlParamName, $value), }, // textMatch 'threadTitle', 'postContent' => - self::applyTextMatchParamOnQuery($query, $name === 'threadTitle' ? 'title' : 'content', $value, $sub), + self::applyTextMatchParamOnQuery($query, $name === 'threadTitle' ? 'title' : 'content', $value, $sub, $sqlParamName), // dateTimeRange - 'postedAt', 'latestReplyPostedAt' => - $whereBetween($name), + 'postedAt', 'latestReplyPostedAt' => $whereBetween($name), // array 'threadProperties' => static function () use ($not, $notBoolStr, $value, $query) { foreach ($value as $threadProperty) { match ($threadProperty) { - 'good' => $query->where("t.isGood = $notBoolStr"), - 'sticky' => $query->where("t.stickyType IS $not NULL"), + 'good' => $query->andWhere("t.isGood = $notBoolStr"), + 'sticky' => $query->andWhere("t.stickyType IS $not NULL"), }; } return $query; }, 'authorName', 'latestReplierName', 'authorDisplayName', 'latestReplierDisplayName' => - $query->where("t.{$userTypeOfUserParams}Uid $not IN (:uids)") + $query->andWhere("t.{$userTypeOfUserParams}Uid $not IN (:$sqlParamName)") ->setParameter( - 'uids', + $sqlParamName, $getAndCacheUserQuery(self::applyTextMatchParamOnQuery( $this->userRepository->createQueryBuilder('t')->select('t.uid'), $fieldNameOfUserNameParams, $value, $sub, + $sqlParamName, )) ), 'authorGender', 'latestReplierGender' => - $query->where("t.{$userTypeOfUserParams}Uid $not IN (:uids)") + $query->andWhere("t.{$userTypeOfUserParams}Uid $not IN (:$sqlParamName)") ->setParameter( - 'uids', + $sqlParamName, $getAndCacheUserQuery($this->userRepository->createQueryBuilder('t') ->select('t.uid') - ->where('t.gender = :value')->setParameter('value', $value)) + ->andWhere("t.gender = :{$sqlParamName}_gender") + ->setParameter("{$sqlParamName}_gender", $value)) ), 'authorManagerType' => $value === 'NULL' - ? $query->where("t.authorManagerType IS $not NULL") - : $query->where('t.authorManagerType ' . ($sub['not'] ? '!=' : '=') . ' :value') - ->setParameter('value', $value), + ? $query->andWhere("t.authorManagerType IS $not NULL") + : $query->andWhere('t.authorManagerType ' . ($sub['not'] ? '!=' : '=') . " :$sqlParamName") + ->setParameter($sqlParamName, $value), default => $query, }; } @@ -168,21 +172,24 @@ private static function applyTextMatchParamOnQuery( string $field, string $value, array $subParams, + string $sqlParamName, ): QueryBuilder { $not = $subParams['not'] === true ? 'NOT' : ''; if ($subParams['matchBy'] === 'regex') { - return $query->where("t.$field $not REGEXP :value")->setParameter('value', $value); + return $query->andWhere("t.$field $not REGEXP :$sqlParamName")->setParameter($sqlParamName, $value); } // split multiple search keyword by space char when $subParams['spaceSplit'] == true - foreach ($subParams['spaceSplit'] ? explode(' ', $value) : [$value] as $keyword) { + foreach ($subParams['spaceSplit'] ? explode(' ', $value) : [$value] as $keywordIndex => $keyword) { if ($not === 'NOT') { - $query = $query->andWhere("t.$field NOT LIKE :keyword"); + $query = $query->andWhere("t.$field NOT LIKE :{$sqlParamName}_$keywordIndex"); } else { // not (A or B) <=> not A and not B, following https://en.wikipedia.org/wiki/De_Morgan%27s_laws - $query = $query->orWhere("t.$field LIKE :keyword"); + $query = $query->orWhere("t.$field LIKE :{$sqlParamName}_$keywordIndex"); } - $keyword = $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword; - $query = $query->setParameter('keyword', $keyword); + $query = $query->setParameter( + "{$sqlParamName}_$keywordIndex", + $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword + ); } return $query; } From 0302713d570b05bc0d2be37fe183eca2cf478cfc Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 01:30:22 +0000 Subject: [PATCH 50/61] * migrate config files of php-cs-fixer, pint, phpmd, phpstan, psalm, phan, phpunit & infection from `be` to `symfony` --- be/.php-cs-fixer.php | 10 --------- be/phpstan.neon | 5 ----- be/phpunit.xml | 36 --------------------------------- be/pint.json | 3 --- symfony/.php-cs-fixer.dist.php | 13 +++++------- {be => symfony}/.phpcs.xml | 4 +--- {be => symfony}/infection.json5 | 4 ++-- {be => symfony}/phan.php | 6 +++--- {be => symfony}/phpmd.xml | 2 +- symfony/phpstan.dist.neon | 2 +- symfony/phpunit.xml.dist | 25 +++++++++-------------- symfony/pint.json | 4 ++++ {be => symfony}/psalm.xml | 8 ++++---- 13 files changed, 30 insertions(+), 92 deletions(-) delete mode 100644 be/.php-cs-fixer.php delete mode 100644 be/phpstan.neon delete mode 100644 be/phpunit.xml delete mode 100644 be/pint.json rename {be => symfony}/.phpcs.xml (74%) rename {be => symfony}/infection.json5 (58%) rename {be => symfony}/phan.php (98%) rename {be => symfony}/phpmd.xml (95%) create mode 100644 symfony/pint.json rename {be => symfony}/psalm.xml (77%) diff --git a/be/.php-cs-fixer.php b/be/.php-cs-fixer.php deleted file mode 100644 index 29412c81..00000000 --- a/be/.php-cs-fixer.php +++ /dev/null @@ -1,10 +0,0 @@ -setRules([ - '@PER-CS2.0' => true, - ]) - ->setFinder((new PhpCsFixer\Finder()) - ->in(__DIR__) - ->ignoreVCSIgnored(true) - ->ignoreDotFiles(false)); diff --git a/be/phpstan.neon b/be/phpstan.neon deleted file mode 100644 index 30ae4333..00000000 --- a/be/phpstan.neon +++ /dev/null @@ -1,5 +0,0 @@ -parameters: - paths: - - app/ - level: 9 - ignoreErrors: diff --git a/be/phpunit.xml b/be/phpunit.xml deleted file mode 100644 index 259d7dc8..00000000 --- a/be/phpunit.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - tests/Unit - - - tests/Feature - - - - - app - - - - - - - - - - - - - - - - - diff --git a/be/pint.json b/be/pint.json deleted file mode 100644 index f9ec3564..00000000 --- a/be/pint.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "preset": "per" -} diff --git a/symfony/.php-cs-fixer.dist.php b/symfony/.php-cs-fixer.dist.php index 3788194c..29412c81 100644 --- a/symfony/.php-cs-fixer.dist.php +++ b/symfony/.php-cs-fixer.dist.php @@ -1,13 +1,10 @@ in(__DIR__) - ->exclude('var') -; - return (new PhpCsFixer\Config()) ->setRules([ - '@Symfony' => true, + '@PER-CS2.0' => true, ]) - ->setFinder($finder) -; + ->setFinder((new PhpCsFixer\Finder()) + ->in(__DIR__) + ->ignoreVCSIgnored(true) + ->ignoreDotFiles(false)); diff --git a/be/.phpcs.xml b/symfony/.phpcs.xml similarity index 74% rename from be/.phpcs.xml rename to symfony/.phpcs.xml index 38497734..0df55239 100644 --- a/be/.phpcs.xml +++ b/symfony/.phpcs.xml @@ -6,9 +6,7 @@ - *.blade.php - _ide_helper*.php vendor/* - bootstrap/cache/* + var/* diff --git a/be/infection.json5 b/symfony/infection.json5 similarity index 58% rename from be/infection.json5 rename to symfony/infection.json5 index 60c964d9..9eac8e1e 100644 --- a/be/infection.json5 +++ b/symfony/infection.json5 @@ -2,12 +2,12 @@ "$schema": "vendor/infection/infection/resources/schema.json", "source": { "directories": ["."], - "excludes": ["vendor", "tests", ".phpstorm.meta.php", "/_ide_helper.*.php/", "bootstrap/cache/*"] + "excludes": ["vendor", "tests", "var"] }, "mutators": { "@default": true, "MethodCallRemoval": { - "ignoreSourceCodeByRegex": ['\\$this->debugbar.*'] + "ignoreSourceCodeByRegex": ['\\$this->stopwatch.*'] } }, "timeout": 60, diff --git a/be/phan.php b/symfony/phan.php similarity index 98% rename from be/phan.php rename to symfony/phan.php index 61678a7e..9b7493f6 100644 --- a/be/phan.php +++ b/symfony/phan.php @@ -272,14 +272,14 @@ // directories/files, unanalyzable files, or files that // can't be removed for whatever reason. // (e.g. `'@Test\.php$@'`, or `'@vendor/.*/(tests|Tests)/@'`) - 'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/|_ide_helper.*\.php@', + 'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@', // A list of files that will be excluded from parsing and analysis // and will not be read at all. // // This is useful for excluding hopelessly unanalyzable // files that can't be removed for whatever reason. - 'exclude_file_list' => ['.phpstorm.meta.php'], + 'exclude_file_list' => [], // A directory list that defines files that will be excluded // from static analysis, but whose class and method @@ -292,7 +292,7 @@ // party code, directories containing that code // should be added to the `directory_list` as well as // to `exclude_analysis_directory_list`. - 'exclude_analysis_directory_list' => ['vendor/'], + 'exclude_analysis_directory_list' => ['vendor/', 'var/'], // Enable this to enable checks of require/include statements referring to valid paths. // The settings `include_paths` and `warn_about_relative_include_statement` affect the checks. diff --git a/be/phpmd.xml b/symfony/phpmd.xml similarity index 95% rename from be/phpmd.xml rename to symfony/phpmd.xml index a1aab6cd..192f1c9a 100644 --- a/be/phpmd.xml +++ b/symfony/phpmd.xml @@ -6,7 +6,7 @@ xsi:noNamespaceSchemaLocation="http://phpmd.org/xml/ruleset_xml_schema_1.0.0.xsd"> vendor - _ide_helper*.php + var diff --git a/symfony/phpstan.dist.neon b/symfony/phpstan.dist.neon index e0de575f..f2aca079 100644 --- a/symfony/phpstan.dist.neon +++ b/symfony/phpstan.dist.neon @@ -1,5 +1,5 @@ parameters: - level: 6 + level: 9 paths: - bin/ - config/ diff --git a/symfony/phpunit.xml.dist b/symfony/phpunit.xml.dist index c76a655a..c62fc09c 100644 --- a/symfony/phpunit.xml.dist +++ b/symfony/phpunit.xml.dist @@ -1,12 +1,11 @@ - - - - + @@ -16,23 +15,17 @@ - tests - - + src - - - - diff --git a/symfony/pint.json b/symfony/pint.json new file mode 100644 index 00000000..efa48330 --- /dev/null +++ b/symfony/pint.json @@ -0,0 +1,4 @@ +{ + "preset": "per", + "exclude": ["var"] +} diff --git a/be/psalm.xml b/symfony/psalm.xml similarity index 77% rename from be/psalm.xml rename to symfony/psalm.xml index afd79183..32ec5f49 100644 --- a/be/psalm.xml +++ b/symfony/psalm.xml @@ -1,20 +1,20 @@ - + + - + From b7264822e8d5e253f029303b47b68abebe1fa896 Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 01:43:04 +0000 Subject: [PATCH 51/61] * move phpunit tests from `be` to `symfony` --- .../tests}/Eloquent/Model/Post/PostFactoryTest.php | 2 +- .../tests}/Eloquent/ModelAttributeMakerTest.php | 2 +- .../Feature/App => symfony/tests}/Exceptions/HandlerTest.php | 4 ++-- {be/tests/Feature/App => symfony/tests}/HelperTest.php | 2 +- .../tests}/Http/Middleware/DumpJsonResponseTest.php | 2 +- .../App => symfony/tests}/Http/PostsQuery/BaseQueryTest.php | 2 +- .../App => symfony/tests}/Http/PostsQuery/CursorCodecTest.php | 2 +- .../tests}/Http/PostsQuery/ParamsValidatorTest.php | 2 +- .../App => symfony/tests}/Http/PostsQuery/QueryParamTest.php | 2 +- .../App => symfony/tests}/Http/PostsQuery/QueryParamsTest.php | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) rename {be/tests/Feature/App => symfony/tests}/Eloquent/Model/Post/PostFactoryTest.php (96%) rename {be/tests/Feature/App => symfony/tests}/Eloquent/ModelAttributeMakerTest.php (97%) rename {be/tests/Feature/App => symfony/tests}/Exceptions/HandlerTest.php (97%) rename {be/tests/Feature/App => symfony/tests}/HelperTest.php (99%) rename {be/tests/Feature/App => symfony/tests}/Http/Middleware/DumpJsonResponseTest.php (97%) rename {be/tests/Feature/App => symfony/tests}/Http/PostsQuery/BaseQueryTest.php (99%) rename {be/tests/Feature/App => symfony/tests}/Http/PostsQuery/CursorCodecTest.php (98%) rename {be/tests/Feature/App => symfony/tests}/Http/PostsQuery/ParamsValidatorTest.php (98%) rename {be/tests/Unit/App => symfony/tests}/Http/PostsQuery/QueryParamTest.php (96%) rename {be/tests/Unit/App => symfony/tests}/Http/PostsQuery/QueryParamsTest.php (98%) diff --git a/be/tests/Feature/App/Eloquent/Model/Post/PostFactoryTest.php b/symfony/tests/Eloquent/Model/Post/PostFactoryTest.php similarity index 96% rename from be/tests/Feature/App/Eloquent/Model/Post/PostFactoryTest.php rename to symfony/tests/Eloquent/Model/Post/PostFactoryTest.php index 2760215f..f375610a 100644 --- a/be/tests/Feature/App/Eloquent/Model/Post/PostFactoryTest.php +++ b/symfony/tests/Eloquent/Model/Post/PostFactoryTest.php @@ -1,6 +1,6 @@ Date: Wed, 9 Oct 2024 12:49:25 +0000 Subject: [PATCH 52/61] * move phpunit test files to match with current namespace hierarchy * rename phpunit test classes to match with current systems under test * replace all references to `Tests\TestCase` in `be` with `Symfony\Bundle\FrameworkBundle\Test\KernelTestCase` @ `App\Tests` @ symfony --- .../BlobResourceGetterTest.php} | 11 +++++------ .../ExceptionToJsonResponseTest.php} | 9 +++------ .../ShowReactJsonViewTest.php} | 14 +++++--------- symfony/tests/HelperTest.php | 3 +-- .../{Http => }/PostsQuery/BaseQueryTest.php | 19 +++++++++---------- .../{Http => }/PostsQuery/CursorCodecTest.php | 17 ++++++++--------- .../PostsQuery/ParamsValidatorTest.php | 11 ++++------- .../{Http => }/PostsQuery/QueryParamTest.php | 4 ++-- .../{Http => }/PostsQuery/QueryParamsTest.php | 6 +++--- .../Post/PostRepositoryFactoryTest.php} | 14 ++++++-------- 10 files changed, 46 insertions(+), 62 deletions(-) rename symfony/tests/{Eloquent/ModelAttributeMakerTest.php => Entity/BlobResourceGetterTest.php} (87%) rename symfony/tests/{Exceptions/HandlerTest.php => EventListener/ExceptionToJsonResponseTest.php} (89%) rename symfony/tests/{Http/Middleware/DumpJsonResponseTest.php => EventListener/ShowReactJsonViewTest.php} (82%) rename symfony/tests/{Http => }/PostsQuery/BaseQueryTest.php (96%) rename symfony/tests/{Http => }/PostsQuery/CursorCodecTest.php (87%) rename symfony/tests/{Http => }/PostsQuery/ParamsValidatorTest.php (93%) rename symfony/tests/{Http => }/PostsQuery/QueryParamTest.php (94%) rename symfony/tests/{Http => }/PostsQuery/QueryParamsTest.php (96%) rename symfony/tests/{Eloquent/Model/Post/PostFactoryTest.php => Repository/Post/PostRepositoryFactoryTest.php} (79%) diff --git a/symfony/tests/Eloquent/ModelAttributeMakerTest.php b/symfony/tests/Entity/BlobResourceGetterTest.php similarity index 87% rename from symfony/tests/Eloquent/ModelAttributeMakerTest.php rename to symfony/tests/Entity/BlobResourceGetterTest.php index bd1d331f..b79a5831 100644 --- a/symfony/tests/Eloquent/ModelAttributeMakerTest.php +++ b/symfony/tests/Entity/BlobResourceGetterTest.php @@ -1,16 +1,15 @@ Date: Wed, 9 Oct 2024 18:05:39 +0000 Subject: [PATCH 53/61] * replace dependency `SerializerInterface $serializer` with `NormalizerInterface $normalizer` for its only usages in `nestPostsWithParent()` @ `App\PostsQuery\BaseQuery->__construct()`, also affect all its derived classes * convert param values to `DateTimeImmutable` to allow constraint `LessThanOrEqual` be able to compare them @ `App\Validator\DateTimeRangeValidator->validate()` * wrap violations in root level key `errorInfo` and assign `errorCode=40000` to match with behavior in `be` @ `App\EventListener\ExceptionToJsonResponse->__invoke()` * fix not accepting stringify int for param `userGender` and missing string typed constraint for text params @ `App\PostsQuery\ParamsValidator->validateParamValue()` * mark param `$fid` as private prop and add getter for it @ `App\Repository\Post\PostRepository->__construct()` @ symfony --- .../EventListener/ExceptionToJsonResponse.php | 5 +++- symfony/src/Helper.php | 2 +- symfony/src/PostsQuery/BaseQuery.php | 10 +++---- symfony/src/PostsQuery/IndexQuery.php | 10 +++---- symfony/src/PostsQuery/ParamsValidator.php | 26 +++++++------------ symfony/src/PostsQuery/SearchQuery.php | 10 +++---- .../src/Repository/Post/PostRepository.php | 15 +++++++---- .../src/Validator/DateTimeRangeValidator.php | 6 ++--- 8 files changed, 42 insertions(+), 42 deletions(-) diff --git a/symfony/src/EventListener/ExceptionToJsonResponse.php b/symfony/src/EventListener/ExceptionToJsonResponse.php index b1a5e7b8..f0d7d2e3 100644 --- a/symfony/src/EventListener/ExceptionToJsonResponse.php +++ b/symfony/src/EventListener/ExceptionToJsonResponse.php @@ -26,7 +26,10 @@ public function __invoke(ExceptionEvent $event): void } elseif ($exception instanceof ValidationFailedException) { $event->setResponse(JsonResponse::fromJsonString( // https://github.com/symfony/serializer/blob/7.1/Normalizer/ConstraintViolationListNormalizer.php - $this->serializer->serialize($exception->getViolations(), 'json') + $this->serializer->serialize([ + 'errorCode' => 40000, + 'errorInfo' => $exception->getViolations() + ], 'json') )); } } diff --git a/symfony/src/Helper.php b/symfony/src/Helper.php index acc8a6a0..f48fc1bc 100644 --- a/symfony/src/Helper.php +++ b/symfony/src/Helper.php @@ -94,6 +94,6 @@ public static function abortAPI(int $errorCode): never throw new \InvalidArgumentException('Given error code doesn\'t existed'); } $json = \Safe\json_encode(compact('errorCode', 'errorInfo')); - throw HttpException::fromStatusCode($statusCode, $json, code: $errorCode); + throw HttpException::fromStatusCode($statusCode, message: $json, code: $errorCode); } } diff --git a/symfony/src/PostsQuery/BaseQuery.php b/symfony/src/PostsQuery/BaseQuery.php index 630e1f04..b71805c0 100644 --- a/symfony/src/PostsQuery/BaseQuery.php +++ b/symfony/src/PostsQuery/BaseQuery.php @@ -13,7 +13,7 @@ use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Illuminate\Support\Collection; -use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Stopwatch\Stopwatch; /** @psalm-import-type PostsKeyByTypePluralName from CursorCodec */ @@ -37,7 +37,7 @@ abstract class BaseQuery abstract public function query(QueryParams $params, ?string $cursor): void; public function __construct( - private readonly SerializerInterface $serializer, + private readonly NormalizerInterface $normalizer, private readonly Stopwatch $stopwatch, private readonly CursorCodec $cursorCodec, private readonly PostRepositoryFactory $postRepositoryFactory, @@ -251,12 +251,12 @@ public function nestPostsWithParent( $subReplies = $subReplies->groupBy(fn(SubReply $subReply) => $subReply->getPid()); $ret = $threads ->map(fn(Thread $thread) => [ - ...$this->serializer->normalize($thread), + ...$this->normalizer->normalize($thread), 'replies' => $replies ->get($thread->getTid(), collect()) ->map(fn(Reply $reply) => [ - ...$this->serializer->normalize($reply), - 'subReplies' => $this->serializer->normalize($subReplies->get($reply->getPid(), collect())), + ...$this->normalizer->normalize($reply), + 'subReplies' => $this->normalizer->normalize($subReplies->get($reply->getPid(), collect())), ]), ]) ->recursive(); diff --git a/symfony/src/PostsQuery/IndexQuery.php b/symfony/src/PostsQuery/IndexQuery.php index ea8a7211..3a4f092a 100644 --- a/symfony/src/PostsQuery/IndexQuery.php +++ b/symfony/src/PostsQuery/IndexQuery.php @@ -8,19 +8,19 @@ use App\Helper; use Doctrine\ORM\QueryBuilder; use Illuminate\Support\Collection; -use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Stopwatch\Stopwatch; class IndexQuery extends BaseQuery { public function __construct( - private readonly SerializerInterface $serializer, - private readonly Stopwatch $stopwatch, - private readonly CursorCodec $cursorCodec, + NormalizerInterface $normalizer, + Stopwatch $stopwatch, + CursorCodec $cursorCodec, private readonly PostRepositoryFactory $postRepositoryFactory, private readonly ForumRepository $forumRepository ) { - parent::__construct($serializer, $stopwatch, $cursorCodec, $postRepositoryFactory); + parent::__construct($normalizer, $stopwatch, $cursorCodec, $postRepositoryFactory); } /** @SuppressWarnings(PHPMD.ElseExpression) */ diff --git a/symfony/src/PostsQuery/ParamsValidator.php b/symfony/src/PostsQuery/ParamsValidator.php index 549fd8e4..65d5dba6 100644 --- a/symfony/src/PostsQuery/ParamsValidator.php +++ b/symfony/src/PostsQuery/ParamsValidator.php @@ -48,31 +48,23 @@ public function addDefaultParamsThenValidate(bool $shouldSkip40003): void private function validateParamValue(array $param): void { $paramsPossibleValue = [ - 'userGender' => [0, 1, 2], + 'userGender' => ['0', '1', '2'], 'userManagerType' => ['NULL', 'manager', 'assist', 'voiceadmin'], ]; - $numericParams = collect([ - 'fid', - 'tid', - 'pid', - 'spid', - 'threadViewCount', - 'threadShareCount', - 'threadReplyCount', - 'replySubReplyCount', - 'authorUid', - 'authorExpGrade', - 'latestReplierUid', - ])->mapWithKeys(fn(string $paramName) => [$paramName => new Assert\Type(['digit', 'int'])]); + $numericParams = collect(QueryParams::PARAM_NAME_KEY_BY_TYPE['numeric'])->push('fid') + ->mapWithKeys(fn(string $paramName) => [$paramName => new Assert\Type(['digit', 'int'])]); + $textParams = collect(QueryParams::PARAM_NAME_KEY_BY_TYPE['text']) + ->mapWithKeys(fn(string $paramName) => [$paramName => new Assert\Type('string')]); // note here we haven't validated that is every sub param have a corresponding main param yet $this->validator->validate($param, new Assert\Collection([ ...$numericParams, - 'postTypes' => new Assert\Collection([new Assert\Choice(Helper::POST_TYPES)]), - 'orderBy' => new Assert\Collection([new Assert\Choice([...Helper::POST_ID, 'postedAt'])]), + ...$textParams, + 'postTypes' => new Assert\All([new Assert\Choice(Helper::POST_TYPES)]), + 'orderBy' => new Assert\Choice([...Helper::POST_ID, 'postedAt']), 'direction' => new Assert\Choice(['ASC', 'DESC']), 'postedAt' => new DateTimeRange(), 'latestReplyPostedAt' => new DateTimeRange(), - 'threadProperties' => new Assert\Collection([new Assert\Choice(['good', 'sticky'])]), + 'threadProperties' => new Assert\All([new Assert\Choice(['good', 'sticky'])]), 'authorGender' => new Assert\Choice($paramsPossibleValue['userGender']), 'authorManagerType' => new Assert\Choice($paramsPossibleValue['userManagerType']), 'latestReplierGender' => new Assert\Choice($paramsPossibleValue['userGender']), diff --git a/symfony/src/PostsQuery/SearchQuery.php b/symfony/src/PostsQuery/SearchQuery.php index 00b5f458..afc39169 100644 --- a/symfony/src/PostsQuery/SearchQuery.php +++ b/symfony/src/PostsQuery/SearchQuery.php @@ -7,19 +7,19 @@ use App\Repository\UserRepository; use Doctrine\ORM\QueryBuilder; use Illuminate\Support\Collection; -use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Stopwatch\Stopwatch; class SearchQuery extends BaseQuery { public function __construct( - private readonly SerializerInterface $serializer, - private readonly Stopwatch $stopwatch, - private readonly CursorCodec $cursorCodec, + NormalizerInterface $normalizer, + Stopwatch $stopwatch, + CursorCodec $cursorCodec, private readonly PostRepositoryFactory $postRepositoryFactory, private readonly UserRepository $userRepository ) { - parent::__construct($serializer, $stopwatch, $cursorCodec, $postRepositoryFactory); + parent::__construct($normalizer, $stopwatch, $cursorCodec, $postRepositoryFactory); } public function query(QueryParams $params, ?string $cursor): void diff --git a/symfony/src/Repository/Post/PostRepository.php b/symfony/src/Repository/Post/PostRepository.php index 32cc6c71..b46947cb 100644 --- a/symfony/src/Repository/Post/PostRepository.php +++ b/symfony/src/Repository/Post/PostRepository.php @@ -18,20 +18,25 @@ abstract class PostRepository extends ServiceEntityRepository abstract protected function getTableNameSuffix(): string; /** - * @param class-string $postClass + * @param class-string $postRepositoryClass */ public function __construct( ManagerRegistry $registry, EntityManagerInterface $entityManager, - string $postClass, - int $fid, + string $postRepositoryClass, + private readonly int $fid, ) { - parent::__construct($registry, $postClass); - $entityManager->getClassMetadata($postClass)->setPrimaryTable([ + parent::__construct($registry, $postRepositoryClass); + $entityManager->getClassMetadata($postRepositoryClass)->setPrimaryTable([ 'name' => "\"tbmc_f{$fid}_" . $this->getTableNameSuffix() . '"' ]); } + public function getFid(): int + { + return $this->fid; + } + public function selectCurrentAndParentPostID(): QueryBuilder { return $this->createQueryBuilder('t')->select(collect(Helper::POST_TYPE_TO_ID) diff --git a/symfony/src/Validator/DateTimeRangeValidator.php b/symfony/src/Validator/DateTimeRangeValidator.php index 7a06d571..567e83e5 100644 --- a/symfony/src/Validator/DateTimeRangeValidator.php +++ b/symfony/src/Validator/DateTimeRangeValidator.php @@ -18,15 +18,15 @@ public function validate(mixed $value, Constraint $constraint): void return; } - $values = explode(',', $value); + $values = array_map(fn(string $value) => new \DateTimeImmutable($value), explode(',', $value)); $errors = $this->context->getValidator()->validate($values, new Assert\Count(2)); $errors->addAll($this->context->getValidator()->validate( $values[0], - [new Assert\DateTime(), new Assert\LessThanOrEqual($values[1])], + new Assert\LessThanOrEqual($values[1]), )); $errors->addAll($this->context->getValidator()->validate( $values[1], - [new Assert\DateTime(), new Assert\GreaterThanOrEqual($values[0])], + new Assert\GreaterThanOrEqual($values[0]), )); if ($errors->count() !== 0) { From af67ff20c7e5d713dd0d3c9435da92494926e192 Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 18:14:51 +0000 Subject: [PATCH 54/61] * migrate phpunit tests to use `Symfony\Bundle\FrameworkBundle\Test\KernelTestCase` for dependency injection + `EventListener\PrettyJsonResponse` for testing `App\EventListener\PrettyJsonResponse` that splited from `EventListener\ShowReactJsonViewTest\testHandle()` * rename methods to match with current methods of the system under test @ `Entity\BlobResourceGetterTest` & `EventListener\ExceptionToJsonResponseTest` * update expected data to match with behavior changed in 52e4e481813d8649783279f186ba24ddec825464 @ `PostsQuery\CursorCodecTest->provideDecodeCursor()` - `testXmlResponse()` and its data provider as `Helper::xmlResponse()` is not migrated in 7b94b658348e51af9ae22e22f1247046ab71adc5 @ `HelperTest` @ `App\Tests` @ symfony --- symfony/config/bundles.php | 2 +- .../tests/Entity/BlobResourceGetterTest.php | 47 ++++++------- .../ExceptionToJsonResponseTest.php | 62 +++++++++-------- .../EventListener/PrettyJsonResponseTest.php | 41 ++++++++++++ .../EventListener/ShowReactJsonViewTest.php | 67 +++++++++++-------- symfony/tests/HelperTest.php | 26 ++----- symfony/tests/PostsQuery/BaseQueryTest.php | 13 ++-- symfony/tests/PostsQuery/CursorCodecTest.php | 41 +++++------- .../tests/PostsQuery/ParamsValidatorTest.php | 23 ++++--- .../Post/PostRepositoryFactoryTest.php | 32 +++++---- 10 files changed, 198 insertions(+), 156 deletions(-) create mode 100644 symfony/tests/EventListener/PrettyJsonResponseTest.php diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php index 9d76ab6f..0f8a0442 100644 --- a/symfony/config/bundles.php +++ b/symfony/config/bundles.php @@ -7,5 +7,5 @@ Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], - Spatie\SymfonyIgnitionBundle\IgnitionBundle::class => ['dev' => true], + Spatie\SymfonyIgnitionBundle\IgnitionBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/symfony/tests/Entity/BlobResourceGetterTest.php b/symfony/tests/Entity/BlobResourceGetterTest.php index b79a5831..18d04ae2 100644 --- a/symfony/tests/Entity/BlobResourceGetterTest.php +++ b/symfony/tests/Entity/BlobResourceGetterTest.php @@ -5,51 +5,48 @@ use App\Entity\BlobResourceGetter; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use PHPUnit\Framework\TestCase; use TbClient\Wrapper\PostContentWrapper; #[CoversClass(BlobResourceGetter::class)] -class BlobResourceGetterTest extends KernelTestCase +class BlobResourceGetterTest extends TestCase { - public static function resourceAttributeGetter(Attribute $attribute, string $fileContent, $expected): void + /** @return resource */ + public static function makeStreamResource(string $data) { - $getter = $attribute->get; - self::assertNull($getter(null)); - - $fileStream = \Safe\tmpfile(); - \Safe\fwrite($fileStream, $fileContent); - \Safe\rewind($fileStream); - self::assertEquals($expected, $getter($fileStream)); + $stream = \Safe\tmpfile(); + \Safe\fwrite($stream, $data); + \Safe\rewind($stream); + return $stream; } - #[DataProvider('provideMakeProtoBufAttribute')] - public function testMakeProtoBufAttribute(string $jsonString): void + #[DataProvider('provideProtoBuf')] + public function testProtoBuf(string $jsonString): void { - $attribute = ModelAttributeMaker::makeProtoBufAttribute(PostContentWrapper::class); - self::assertTrue($attribute->withCaching); + $protoBufClass = PostContentWrapper::class; + self::assertNull(BlobResourceGetter::protoBuf(null, $protoBufClass)); $contentProtoBuf = new PostContentWrapper(); $contentProtoBuf->mergeFromJsonString($jsonString); - self::resourceAttributeGetter( - $attribute, - $contentProtoBuf->serializeToString(), - \Safe\json_decode($jsonString), + $resource = self::makeStreamResource($contentProtoBuf->serializeToString()); + self::assertEquals( + \Safe\json_decode($jsonString, assoc: true), + BlobResourceGetter::protoBuf($resource, $protoBufClass), ); } - public static function provideMakeProtoBufAttribute(): array + public static function provideProtoBuf(): array { return [['{ "value": [{ "text": "test" }] }']]; } - #[DataProvider('provideMakeResourceAttribute')] - public function testMakeResourceAttribute(string $data): void + #[DataProvider('provideResource')] + public function testResource(string $data): void { - $attribute = ModelAttributeMaker::makeResourceAttribute(); - self::assertTrue($attribute->withCaching); - self::resourceAttributeGetter($attribute, $data, $data); + self::assertNull(BlobResourceGetter::resource(null)); + self::assertEquals($data, BlobResourceGetter::resource(self::makeStreamResource($data))); } - public static function provideMakeResourceAttribute(): array + public static function provideResource(): array { return [['test']]; } diff --git a/symfony/tests/EventListener/ExceptionToJsonResponseTest.php b/symfony/tests/EventListener/ExceptionToJsonResponseTest.php index 1cdbf16c..467c240c 100644 --- a/symfony/tests/EventListener/ExceptionToJsonResponseTest.php +++ b/symfony/tests/EventListener/ExceptionToJsonResponseTest.php @@ -2,48 +2,54 @@ namespace App\Tests\EventListener; -use App\Exceptions\Handler; +use App\EventListener\ExceptionToJsonResponse; +use App\Validator\Validator; use PHPUnit\Framework\Attributes\CoversClass; -use ReflectionMethod; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; -use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\Exception\HttpException; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\Validator\Constraints as Assert; +use Symfony\Component\Validator\Exception\ValidationFailedException; -#[CoversClass(Handler::class)] +#[CoversClass(ExceptionToJsonResponse::class)] class ExceptionToJsonResponseTest extends KernelTestCase { - private Handler $sut; - private Factory $validatorFactory; - private ReflectionMethod $convertValidationExceptionToResponse; + private ExceptionToJsonResponse $sut; + private Validator $validator; protected function setUp(): void { parent::setUp(); - $this->sut = new Handler(Container::getInstance()); - $this->validatorFactory = app(Factory::class); - $this->convertValidationExceptionToResponse = new ReflectionMethod( - Handler::class, - 'convertValidationExceptionToResponse', - ); + self::bootKernel(); + $container = static::getContainer(); + $this->sut = $container->get(ExceptionToJsonResponse::class); + $this->validator = $container->get(Validator::class); } - private function invokeConvertValidationExceptionToResponse(ValidationException $exception): Response + public function testHttpException(): void { - return $this->convertValidationExceptionToResponse->invoke($this->sut, $exception, null); - } - - public function testNotConvertValidationExceptionToResponse(): void - { - $exception = new ValidationException($this->validatorFactory->make([], []), new Response('test')); - $response = $this->invokeConvertValidationExceptionToResponse($exception); - self::assertEquals('test', $response->getContent()); + $event = new ExceptionEvent( + self::$kernel, + new Request(), + HttpKernelInterface::MAIN_REQUEST, + new HttpException(400, message: 'test', code: 40001) + ); + ($this->sut)($event); + self::assertEquals('test', $event->getResponse()->getContent()); } - public function testConvertValidationExceptionToResponse(): void + public function testValidationFailedException(): void { - $exception = new ValidationException($this->validatorFactory->make(['test' => 'int'], ['test' => 'int'])); - $response = $this->invokeConvertValidationExceptionToResponse($exception); - $responseJSON = \Safe\json_decode($response->getContent()); - self::assertEquals(40000, $responseJSON->errorCode); - self::assertEquals('The test field must be an integer.', $responseJSON->errorInfo->test[0]); + try { + $this->validator->validate('1', new Assert\Type('int')); + } catch (ValidationFailedException $e) { + $event = new ExceptionEvent(self::$kernel, new Request(), HttpKernelInterface::MAIN_REQUEST, $e); + ($this->sut)($event); + $responseJSON = \Safe\json_decode($event->getResponse()->getContent()); + self::assertEquals(40000, $responseJSON->errorCode); + self::assertEquals('This value should be of type int.', $responseJSON->errorInfo->detail); + } } } diff --git a/symfony/tests/EventListener/PrettyJsonResponseTest.php b/symfony/tests/EventListener/PrettyJsonResponseTest.php new file mode 100644 index 00000000..3dd19be1 --- /dev/null +++ b/symfony/tests/EventListener/PrettyJsonResponseTest.php @@ -0,0 +1,41 @@ +sut = $container->get(PrettyJsonResponse::class); + } + + public function test(): void + { + $event = new ResponseEvent( + self::$kernel, + new Request(server: ['HTTP_ACCEPT' => 'application/json']), + HttpKernelInterface::MAIN_REQUEST, + JsonResponse::fromJsonString(\Safe\json_encode(['test' => 'test'])) + ); + ($this->sut)($event); + self::assertEquals(<<<'JSON' + { + "test": "test" + } + JSON, $event->getResponse()->getContent()); + } +} diff --git a/symfony/tests/EventListener/ShowReactJsonViewTest.php b/symfony/tests/EventListener/ShowReactJsonViewTest.php index 4d8cf5f4..d263c99f 100644 --- a/symfony/tests/EventListener/ShowReactJsonViewTest.php +++ b/symfony/tests/EventListener/ShowReactJsonViewTest.php @@ -5,48 +5,61 @@ use App\EventListener\ShowReactJsonView; use PHPUnit\Framework\Attributes\CoversClass; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\HttpKernelInterface; #[CoversClass(ShowReactJsonView::class)] class ShowReactJsonViewTest extends KernelTestCase { + private ShowReactJsonView $sut; + protected function setUp(): void { parent::setUp(); - app(UrlGenerator::class)->forceRootUrl('http://localhost'); + self::bootKernel(); + $container = static::getContainer(); + $this->sut = $container->get(ShowReactJsonView::class); } protected function tearDown(): void { - app(UrlGenerator::class)->forceRootUrl(Config::get('app.url')); parent::tearDown(); } - public function testHandle(): void + public function test(): void { - $next = static fn() => JsonResponse::fromJsonString(\Safe\json_encode(['test' => 'test'])); - $sut = new DumpJsonResponse(); - self::assertEquals(<<handle(Request::create('', server: ['HTTP_ACCEPT' => 'application/json']), $next)->getContent()); - - self::assertEquals(<<15 bytes -
- - - HTML, ($sut)->handle(Request::create(''), $next)->getContent()); + const root = createRoot(document.getElementById('root')); + root.render(createElement(ReactJsonView.default, { src: {"test":"test"}, quotesOnKeys: false })); + + + + + HTML, $event->getResponse()->getContent()); } } diff --git a/symfony/tests/HelperTest.php b/symfony/tests/HelperTest.php index 876d2b7e..ac16eeb5 100644 --- a/symfony/tests/HelperTest.php +++ b/symfony/tests/HelperTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use Symfony\Component\String\UnicodeString; +use Symfony\Component\HttpKernel\Exception\HttpException; #[CoversClass(Helper::class)] class HelperTest extends TestCase @@ -15,12 +15,11 @@ public static function assertAbort(int $statusCode, int $errorCode, string $erro { try { $callback(); - } catch (HttpResponseException $e) { - $response = $e->getResponse(); - self::assertEquals($statusCode, $response->getStatusCode()); - $responseContent = \Safe\json_decode($response->getContent()); - self::assertEquals($errorCode, $responseContent->errorCode); - self::assertEquals($errorInfo, $responseContent->errorInfo); + } catch (HttpException $e) { + self::assertEquals($statusCode, $e->getStatusCode()); + $json = \Safe\json_decode($e->getMessage()); + self::assertEquals($errorCode, $json->errorCode); + self::assertEquals($errorInfo, $json->errorInfo); } } @@ -64,17 +63,4 @@ public static function provideAbortAPIWithNonExistsCode(): array { return [[collect(Helper::ERROR_STATUS_CODE_INFO)->max(static fn(array $i) => max(array_keys($i))) + 1]]; } - - #[DataProvider('provideXmlResponse')] - public function testXmlResponse(string|\Stringable $xml): void - { - $response = Helper::xmlResponse($xml); - self::assertEquals('' . "\n$xml", $response->getContent()); - self::assertEquals('text/xml', $response->headers->get('Content-Type')); - } - - public static function provideXmlResponse(): array - { - return [[''], [new UnicodeString('')]]; - } } diff --git a/symfony/tests/PostsQuery/BaseQueryTest.php b/symfony/tests/PostsQuery/BaseQueryTest.php index 2ef80196..44092cac 100644 --- a/symfony/tests/PostsQuery/BaseQueryTest.php +++ b/symfony/tests/PostsQuery/BaseQueryTest.php @@ -7,7 +7,7 @@ use App\Entity\Post\SubReply; use App\Entity\Post\Thread; use App\PostsQuery\BaseQuery; -use App\PostsQuery\CursorCodec; +use App\PostsQuery\IndexQuery; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; @@ -20,11 +20,10 @@ class BaseQueryTest extends KernelTestCase protected function setUp(): void { parent::setUp(); - $this->sut = $this->getMockBuilder(BaseQuery::class) - ->setConstructorArgs([$this->createMock(LaravelDebugbar::class), new CursorCodec()]) - ->getMockForAbstractClass(); - (new \ReflectionProperty(BaseQuery::class, 'orderByField')) - ->setValue($this->sut, 'postedAt'); + self::bootKernel(); + $container = self::getContainer(); + $this->sut = $container->get(IndexQuery::class); + (new \ReflectionProperty(BaseQuery::class, 'orderByField'))->setValue($this->sut, 'postedAt'); } public function testPerPageItemsDefaultValue(): void @@ -34,7 +33,6 @@ public function testPerPageItemsDefaultValue(): void } #[DataProvider('provideReOrderNestedPostsData')] - /** @backupStaticAttributes enabled */ public function testReOrderNestedPosts( array $input, bool $orderByDesc, @@ -221,7 +219,6 @@ public static function provideReOrderNestedPostsData(): array } #[DataProvider('provideNestPostsWithParent')] - /** @backupStaticAttributes enabled */ public function testNestPostsWithParent(array $input, array $expected): void { self::assertEquals( diff --git a/symfony/tests/PostsQuery/CursorCodecTest.php b/symfony/tests/PostsQuery/CursorCodecTest.php index 5c674c18..d2ca8251 100644 --- a/symfony/tests/PostsQuery/CursorCodecTest.php +++ b/symfony/tests/PostsQuery/CursorCodecTest.php @@ -2,17 +2,14 @@ namespace App\Tests\PostsQuery; -use App\Entity\Post\Post; -use App\Entity\Post\Reply; -use App\Entity\Post\SubReply; -use App\Entity\Post\Thread; use App\PostsQuery\CursorCodec; +use Illuminate\Support\Collection; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use PHPUnit\Framework\TestCase; #[CoversClass(CursorCodec::class)] -class CursorCodecTest extends KernelTestCase +class CursorCodecTest extends TestCase { private CursorCodec $sut; @@ -23,25 +20,21 @@ protected function setUp(): void } #[DataProvider('provideEncodeNextCursor')] - public function testEncodeNextCursor(string $cursor, array $input): void + public function testEncodeNextCursor(string $cursor, Collection $input): void { - self::assertEquals($cursor, $this->sut->encodeNextCursor(collect($input)->recursive(maxDepth: 0), 'postedAt')); + self::assertEquals($cursor, $this->sut->encodeNextCursor($input, 'postedAt')); } public static function provideEncodeNextCursor(): array { - (new \ReflectionClass(Post::class))->setStaticPropertyValue('unguarded', true); - $ret = [[ + return [[ 'AQ,0,Ag,-:____fw,Aw,S:test', - [ - 'threads' => [new Thread(['tid' => 1, 'postedAt' => 0])], - 'replies' => [new Reply(['pid' => 2, 'postedAt' => -2147483649])], - 'subReplies' => [new SubReply(['spid' => 3, 'postedAt' => 'test'])], - ], + collect([ + 'threads' => collect([['tid' => 1, 'postedAt' => 0]]), + 'replies' => collect([['pid' => 2, 'postedAt' => -2147483649]]), + 'subReplies' => collect([['spid' => 3, 'postedAt' => 'test']]), + ]), ]]; - // https://github.com/sebastianbergmann/phpunit/issues/5103 - (new \ReflectionClass(Post::class))->setStaticPropertyValue('unguarded', false); - return $ret; } #[DataProvider('provideDecodeCursor')] @@ -55,17 +48,13 @@ public static function provideDecodeCursor(): array return [[ 'AQ,0,Ag,-:____fw,Aw,S:test', [ - 'thread' => new Cursor(['tid' => 1, 'postedAt' => 0]), - 'reply' => new Cursor(['pid' => 2, 'postedAt' => -2147483649]), - 'subReply' => new Cursor(['spid' => 3, 'postedAt' => 'test']), + 'thread' => ['tid' => 1, 'postedAt' => 0], + 'reply' => ['pid' => 2, 'postedAt' => -2147483649], + 'subReply' => ['spid' => 3, 'postedAt' => 'test'], ], ], [ ',,,,0,0', - [ - 'thread' => new Cursor(['tid' => 0, 'postedAt' => 0]), - 'reply' => new Cursor(['pid' => 0, 'postedAt' => 0]), - 'subReply' => new Cursor(['spid' => 0, 'postedAt' => 0]), - ], + [], ]]; } } diff --git a/symfony/tests/PostsQuery/ParamsValidatorTest.php b/symfony/tests/PostsQuery/ParamsValidatorTest.php index 23ed4db7..bbfa544d 100644 --- a/symfony/tests/PostsQuery/ParamsValidatorTest.php +++ b/symfony/tests/PostsQuery/ParamsValidatorTest.php @@ -8,13 +8,15 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\Component\HttpKernel\Exception\HttpException; +use Symfony\Component\Validator\Exception\ValidationFailedException; #[CoversClass(ParamsValidator::class)] class ParamsValidatorTest extends KernelTestCase { public static function newParamsValidator(array $rawParams): ParamsValidator { - return new ParamsValidator(app(Factory::class), $rawParams); + return static::getContainer()->get(ParamsValidator::class)->setParams($rawParams); } #[DataProvider('provideValidate40001')] @@ -26,8 +28,8 @@ public function testValidate(int $errorCode, array $params): void try { $sut = self::newParamsValidator($params); $sut->addDefaultParamsThenValidate(shouldSkip40003: false); - } catch (HttpResponseException $e) { - self::assertEquals($errorCode, \Safe\json_decode($e->getResponse()->getContent())->errorCode); + } catch (HttpException $e) { + self::assertEquals($errorCode, \Safe\json_decode($e->getMessage())->errorCode); } } @@ -80,11 +82,14 @@ public static function provideValidate40004(): array #[DataProvider('providerDateRangeParamValueOrder')] public function testDateRangeParamValueOrder(array $params): void { - $this->assertThrows( - fn() => self::newParamsValidator($params), - ValidationException::class, - 'The 0 field must be a date before or equal to 1.', - ); + $this->expectException(ValidationFailedException::class); + $paramName = array_key_first($params[0]); + $paramValue = $params[0][$paramName]; + $this->expectExceptionMessage(<<<"MSG" + Array[$paramName]: + The value "$paramValue" is not valid. + MSG); + self::newParamsValidator($params); } public static function providerDateRangeParamValueOrder(): array @@ -98,7 +103,7 @@ public function testPostTypesParamValueOrder(array $orderedPostTypes, $shuffledP { $sut = self::newParamsValidator([['postTypes' => $shuffledPostTypes], ['tid' => 0]]); $sut->addDefaultParamsThenValidate(shouldSkip40003: true); - self::assertEquals($orderedPostTypes, $sut->params->getUniqueParamValue('postTypes')); + self::assertEquals($orderedPostTypes, $sut->getParams()->getUniqueParamValue('postTypes')); } public static function providePostTypesParamValueOrder(): array diff --git a/symfony/tests/Repository/Post/PostRepositoryFactoryTest.php b/symfony/tests/Repository/Post/PostRepositoryFactoryTest.php index dc415c03..b29b68fc 100644 --- a/symfony/tests/Repository/Post/PostRepositoryFactoryTest.php +++ b/symfony/tests/Repository/Post/PostRepositoryFactoryTest.php @@ -2,29 +2,37 @@ namespace App\Tests\Repository\Post; -use App\Entity\Post\Post; +use App\Repository\Post\PostRepository; use App\Repository\Post\PostRepositoryFactory; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; -use ReflectionProperty; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; #[CoversClass(PostRepositoryFactory::class)] -#[CoversClass(Post::class)] +#[CoversClass(PostRepository::class)] class PostRepositoryFactoryTest extends KernelTestCase { + private PostRepositoryFactory $sut; + + protected function setUp(): void + { + parent::setUp(); + self::bootKernel(); + $container = static::getContainer(); + $this->sut = $container->get(PostRepositoryFactory::class); + } + #[DataProvider('providePostModelFid')] public function testPostModelFid(int $fid): void { - $prop = new ReflectionProperty(ModelWithTableNameSplitByFid::class, 'fid'); - self::assertEquals($fid, $prop->getValue(PostFactory::newThread($fid))); - self::assertEquals($fid, $prop->getValue(PostFactory::newReply($fid))); - self::assertEquals($fid, $prop->getValue(PostFactory::newReplyContent($fid))); - self::assertEquals($fid, $prop->getValue(PostFactory::newSubReply($fid))); - self::assertEquals($fid, $prop->getValue(PostFactory::newSubReplyContent($fid))); - self::assertEquals($fid, $prop->getValue(PostFactory::getPostModelsByFid($fid)['thread'])); - self::assertEquals($fid, $prop->getValue(PostFactory::getPostModelsByFid($fid)['reply'])); - self::assertEquals($fid, $prop->getValue(PostFactory::getPostModelsByFid($fid)['subReply'])); + self::assertEquals($fid, $this->sut->newThread($fid)->getFid()); + self::assertEquals($fid, $this->sut->newReply($fid)->getFid()); + self::assertEquals($fid, $this->sut->newReplyContent($fid)->getFid()); + self::assertEquals($fid, $this->sut->newSubReply($fid)->getFid()); + self::assertEquals($fid, $this->sut->newSubReplyContent($fid)->getFid()); + self::assertEquals($fid, $this->sut->newForumPosts($fid)['thread']->getFid()); + self::assertEquals($fid, $this->sut->newForumPosts($fid)['reply']->getFid()); + self::assertEquals($fid, $this->sut->newForumPosts($fid)['subReply']->getFid()); } public static function providePostModelFid(): array From b531590299076757fd605cef1fc98b016b2e4a63 Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 18:19:47 +0000 Subject: [PATCH 55/61] $ rm -r be && mv symfony be --- be/.editorconfig | 18 - {symfony => be}/.env | 0 be/.env.example | 25 - {symfony => be}/.env.test | 0 be/.gitattributes | 11 - be/.gitignore | 54 +- {symfony => be}/.php-cs-fixer.dist.php | 0 {symfony => be}/.phpcs.xml | 0 .../Commands/BatchTableSQLGenerator.php | 53 - .../Console/Commands/GenerateBilibiliVote.php | 74 - be/app/Console/Kernel.php | 27 - be/app/Eloquent/Model/BilibiliVote.php | 10 - be/app/Eloquent/Model/Forum.php | 41 - be/app/Eloquent/Model/LatestReplier.php | 33 - .../Model/Post/Content/PostContent.php | 17 - .../Model/Post/Content/ReplyContent.php | 22 - .../Model/Post/Content/SubReplyContent.php | 22 - be/app/Eloquent/Model/Post/Post.php | 73 - be/app/Eloquent/Model/Post/PostFactory.php | 46 - be/app/Eloquent/Model/Post/Reply.php | 71 - be/app/Eloquent/Model/Post/SubReply.php | 61 - be/app/Eloquent/Model/Post/Thread.php | 70 - .../Model/Revision/AuthorExpGrade.php | 26 - .../Model/Revision/ForumModerator.php | 25 - be/app/Eloquent/Model/User.php | 81 - be/app/Eloquent/ModelAttributeMaker.php | 39 - be/app/Eloquent/ModelHasPublicField.php | 24 - .../Eloquent/ModelWithTableNameSplitByFid.php | 40 - .../Eloquent/NullableBooleanAttributeCast.php | 20 - .../Eloquent/NullableNumericAttributeCast.php | 19 - be/app/Exceptions/Handler.php | 21 - be/app/Helper.php | 103 - be/app/Http/BilibiliVoteQuery.php | 221 - be/app/Http/Controllers/Controller.php | 8 - be/app/Http/Controllers/PostsQuery.php | 95 - be/app/Http/Controllers/ThreadsSitemap.php | 35 - be/app/Http/Controllers/UsersQuery.php | 48 - be/app/Http/Middleware/DumpJsonResponse.php | 45 - be/app/Http/Middleware/ReCAPTCHACheck.php | 27 - be/app/Http/PostsQuery/BaseQuery.php | 344 - be/app/Http/PostsQuery/CursorCodec.php | 109 - be/app/Http/PostsQuery/IndexQuery.php | 107 - be/app/Http/PostsQuery/ParamsValidator.php | 159 - be/app/Http/PostsQuery/QueryParam.php | 38 - be/app/Http/PostsQuery/QueryParams.php | 128 - be/app/Http/PostsQuery/SearchQuery.php | 163 - be/app/Providers/AppServiceProvider.php | 25 - be/artisan | 15 - {symfony => be}/bin/console | 0 {symfony => be}/bin/phpunit | 0 be/bootstrap/app.php | 21 - be/bootstrap/cache/.gitignore | 2 - be/bootstrap/providers.php | 5 - be/composer.json | 122 +- be/composer.lock | 6694 ++++----- be/config/app.php | 128 - be/config/auth.php | 115 - {symfony => be}/config/bundles.php | 0 be/config/cache.php | 107 - be/config/database.php | 170 - be/config/filesystems.php | 76 - be/config/logging.php | 132 - be/config/mail.php | 116 - {symfony => be}/config/packages/cache.yaml | 0 {symfony => be}/config/packages/debug.yaml | 0 {symfony => be}/config/packages/doctrine.yaml | 0 .../config/packages/framework.yaml | 0 {symfony => be}/config/packages/ignition.yaml | 0 {symfony => be}/config/packages/routing.yaml | 0 .../config/packages/translation.yaml | 0 {symfony => be}/config/packages/twig.yaml | 0 .../config/packages/validator.yaml | 0 .../config/packages/web_profiler.yaml | 0 {symfony => be}/config/preload.php | 0 be/config/queue.php | 112 - {symfony => be}/config/routes.yaml | 0 {symfony => be}/config/routes/framework.yaml | 0 .../config/routes/web_profiler.yaml | 0 be/config/services.php | 42 - {symfony => be}/config/services.yaml | 0 be/config/session.php | 217 - {symfony => be}/infection.json5 | 0 {symfony => be}/phan.php | 0 {symfony => be}/phpcs.xml.dist | 0 {symfony => be}/phpmd.xml | 0 {symfony => be}/phpstan.dist.neon | 0 {symfony => be}/phpunit.xml.dist | 0 {symfony => be}/pint.json | 0 {symfony => be}/psalm.xml | 0 be/public/index.php | 19 +- .../public/react-json-view/react-dom.js | 0 .../public/react-json-view/react-json-view.js | 0 .../public/react-json-view/react.js | 0 .../public/react-json-view/scheduler.js | 0 be/resources/views/sitemaps/forums.blade.php | 16 - be/resources/views/sitemaps/threads.blade.php | 10 - be/routes/api.php | 11 - be/routes/web.php | 27 - .../src/Controller/AssetController.php | 0 .../src/Controller/ForumsController.php | 0 .../src/Controller/PostsController.php | 0 .../src/Controller/SitemapController.php | 0 .../src/Controller/UsersController.php | 0 .../src/DTO/User/AuthorExpGrade.php | 0 .../src/DTO/User/ForumModerator.php | 0 .../src/Doctrine/AlwaysQuoteStrategy.php | 0 .../src/Entity/BlobResourceGetter.php | 0 {symfony => be}/src/Entity/Forum.php | 0 {symfony => be}/src/Entity/LatestReplier.php | 0 .../src/Entity/Post/Content/PostContent.php | 0 .../src/Entity/Post/Content/ReplyContent.php | 0 .../Entity/Post/Content/SubReplyContent.php | 0 {symfony => be}/src/Entity/Post/Post.php | 0 .../src/Entity/Post/PostWithContent.php | 0 {symfony => be}/src/Entity/Post/Reply.php | 0 {symfony => be}/src/Entity/Post/SubReply.php | 0 {symfony => be}/src/Entity/Post/Thread.php | 0 .../src/Entity/Revision/AuthorExpGrade.php | 0 .../src/Entity/Revision/ForumModerator.php | 0 .../src/Entity/TimestampedEntity.php | 0 {symfony => be}/src/Entity/User.php | 0 .../EventListener/ExceptionToJsonResponse.php | 0 .../src/EventListener/PrettyJsonResponse.php | 0 .../src/EventListener/SerializeToJson.php | 0 .../src/EventListener/ShowReactJsonView.php | 0 {symfony => be}/src/Helper.php | 0 {symfony => be}/src/Kernel.php | 0 {symfony => be}/src/PostsQuery/BaseQuery.php | 0 .../src/PostsQuery/CursorCodec.php | 0 {symfony => be}/src/PostsQuery/IndexQuery.php | 0 .../src/PostsQuery/ParamsValidator.php | 0 {symfony => be}/src/PostsQuery/QueryParam.php | 0 .../src/PostsQuery/QueryParams.php | 0 .../src/PostsQuery/SearchQuery.php | 0 .../src/Repository/ForumRepository.php | 0 .../Repository/LatestReplierRepository.php | 0 .../Post/Content/ReplyContentRepository.php | 0 .../Content/SubReplyContentRepository.php | 0 .../src/Repository/Post/PostRepository.php | 0 .../Repository/Post/PostRepositoryFactory.php | 0 .../src/Repository/Post/ReplyRepository.php | 0 .../Repository/Post/SubReplyRepository.php | 0 .../src/Repository/Post/ThreadRepository.php | 0 .../Revision/AuthorExpGradeRepository.php | 0 .../Revision/ForumModeratorRepository.php | 0 .../src/Repository/UserRepository.php | 0 .../src/Validator/DateTimeRange.php | 0 .../src/Validator/DateTimeRangeValidator.php | 0 {symfony => be}/src/Validator/Validator.php | 0 be/storage/app/.gitignore | 3 - be/storage/app/public/.gitignore | 2 - be/storage/debugbar/.gitignore | 2 - be/storage/framework/.gitignore | 9 - be/storage/framework/cache/.gitignore | 3 - be/storage/framework/cache/data/.gitignore | 2 - be/storage/framework/sessions/.gitignore | 2 - be/storage/framework/testing/.gitignore | 2 - be/storage/framework/views/.gitignore | 2 - be/storage/logs/.gitignore | 2 - {symfony => be}/symfony.lock | 0 .../templates/sitemaps/forums.xml.twig | 0 .../templates/sitemaps/threads.xml.twig | 0 .../tests/Entity/BlobResourceGetterTest.php | 0 .../ExceptionToJsonResponseTest.php | 0 .../EventListener/PrettyJsonResponseTest.php | 0 .../EventListener/ShowReactJsonViewTest.php | 0 {symfony => be}/tests/HelperTest.php | 0 .../tests/PostsQuery/BaseQueryTest.php | 0 .../tests/PostsQuery/CursorCodecTest.php | 0 .../tests/PostsQuery/ParamsValidatorTest.php | 0 .../tests/PostsQuery/QueryParamTest.php | 0 .../tests/PostsQuery/QueryParamsTest.php | 0 .../Post/PostRepositoryFactoryTest.php | 0 be/tests/TestCase.php | 6 - {symfony => be}/tests/bootstrap.php | 0 symfony/.gitignore | 34 - symfony/composer.json | 110 - symfony/composer.lock | 11885 ---------------- symfony/public/index.php | 9 - 179 files changed, 2741 insertions(+), 20167 deletions(-) delete mode 100644 be/.editorconfig rename {symfony => be}/.env (100%) delete mode 100644 be/.env.example rename {symfony => be}/.env.test (100%) delete mode 100644 be/.gitattributes rename {symfony => be}/.php-cs-fixer.dist.php (100%) rename {symfony => be}/.phpcs.xml (100%) delete mode 100644 be/app/Console/Commands/BatchTableSQLGenerator.php delete mode 100644 be/app/Console/Commands/GenerateBilibiliVote.php delete mode 100644 be/app/Console/Kernel.php delete mode 100644 be/app/Eloquent/Model/BilibiliVote.php delete mode 100644 be/app/Eloquent/Model/Forum.php delete mode 100644 be/app/Eloquent/Model/LatestReplier.php delete mode 100644 be/app/Eloquent/Model/Post/Content/PostContent.php delete mode 100644 be/app/Eloquent/Model/Post/Content/ReplyContent.php delete mode 100644 be/app/Eloquent/Model/Post/Content/SubReplyContent.php delete mode 100644 be/app/Eloquent/Model/Post/Post.php delete mode 100644 be/app/Eloquent/Model/Post/PostFactory.php delete mode 100644 be/app/Eloquent/Model/Post/Reply.php delete mode 100644 be/app/Eloquent/Model/Post/SubReply.php delete mode 100644 be/app/Eloquent/Model/Post/Thread.php delete mode 100644 be/app/Eloquent/Model/Revision/AuthorExpGrade.php delete mode 100644 be/app/Eloquent/Model/Revision/ForumModerator.php delete mode 100644 be/app/Eloquent/Model/User.php delete mode 100644 be/app/Eloquent/ModelAttributeMaker.php delete mode 100644 be/app/Eloquent/ModelHasPublicField.php delete mode 100644 be/app/Eloquent/ModelWithTableNameSplitByFid.php delete mode 100644 be/app/Eloquent/NullableBooleanAttributeCast.php delete mode 100644 be/app/Eloquent/NullableNumericAttributeCast.php delete mode 100644 be/app/Exceptions/Handler.php delete mode 100644 be/app/Helper.php delete mode 100644 be/app/Http/BilibiliVoteQuery.php delete mode 100644 be/app/Http/Controllers/Controller.php delete mode 100644 be/app/Http/Controllers/PostsQuery.php delete mode 100644 be/app/Http/Controllers/ThreadsSitemap.php delete mode 100644 be/app/Http/Controllers/UsersQuery.php delete mode 100644 be/app/Http/Middleware/DumpJsonResponse.php delete mode 100644 be/app/Http/Middleware/ReCAPTCHACheck.php delete mode 100644 be/app/Http/PostsQuery/BaseQuery.php delete mode 100644 be/app/Http/PostsQuery/CursorCodec.php delete mode 100644 be/app/Http/PostsQuery/IndexQuery.php delete mode 100644 be/app/Http/PostsQuery/ParamsValidator.php delete mode 100644 be/app/Http/PostsQuery/QueryParam.php delete mode 100644 be/app/Http/PostsQuery/QueryParams.php delete mode 100644 be/app/Http/PostsQuery/SearchQuery.php delete mode 100644 be/app/Providers/AppServiceProvider.php delete mode 100755 be/artisan rename {symfony => be}/bin/console (100%) rename {symfony => be}/bin/phpunit (100%) delete mode 100644 be/bootstrap/app.php delete mode 100644 be/bootstrap/cache/.gitignore delete mode 100644 be/bootstrap/providers.php delete mode 100644 be/config/app.php delete mode 100644 be/config/auth.php rename {symfony => be}/config/bundles.php (100%) delete mode 100644 be/config/cache.php delete mode 100644 be/config/database.php delete mode 100644 be/config/filesystems.php delete mode 100644 be/config/logging.php delete mode 100644 be/config/mail.php rename {symfony => be}/config/packages/cache.yaml (100%) rename {symfony => be}/config/packages/debug.yaml (100%) rename {symfony => be}/config/packages/doctrine.yaml (100%) rename {symfony => be}/config/packages/framework.yaml (100%) rename {symfony => be}/config/packages/ignition.yaml (100%) rename {symfony => be}/config/packages/routing.yaml (100%) rename {symfony => be}/config/packages/translation.yaml (100%) rename {symfony => be}/config/packages/twig.yaml (100%) rename {symfony => be}/config/packages/validator.yaml (100%) rename {symfony => be}/config/packages/web_profiler.yaml (100%) rename {symfony => be}/config/preload.php (100%) delete mode 100644 be/config/queue.php rename {symfony => be}/config/routes.yaml (100%) rename {symfony => be}/config/routes/framework.yaml (100%) rename {symfony => be}/config/routes/web_profiler.yaml (100%) delete mode 100644 be/config/services.php rename {symfony => be}/config/services.yaml (100%) delete mode 100644 be/config/session.php rename {symfony => be}/infection.json5 (100%) rename {symfony => be}/phan.php (100%) rename {symfony => be}/phpcs.xml.dist (100%) rename {symfony => be}/phpmd.xml (100%) rename {symfony => be}/phpstan.dist.neon (100%) rename {symfony => be}/phpunit.xml.dist (100%) rename {symfony => be}/pint.json (100%) rename {symfony => be}/psalm.xml (100%) rename {symfony => be}/public/react-json-view/react-dom.js (100%) rename {symfony => be}/public/react-json-view/react-json-view.js (100%) rename {symfony => be}/public/react-json-view/react.js (100%) rename {symfony => be}/public/react-json-view/scheduler.js (100%) delete mode 100644 be/resources/views/sitemaps/forums.blade.php delete mode 100644 be/resources/views/sitemaps/threads.blade.php delete mode 100644 be/routes/api.php delete mode 100644 be/routes/web.php rename {symfony => be}/src/Controller/AssetController.php (100%) rename {symfony => be}/src/Controller/ForumsController.php (100%) rename {symfony => be}/src/Controller/PostsController.php (100%) rename {symfony => be}/src/Controller/SitemapController.php (100%) rename {symfony => be}/src/Controller/UsersController.php (100%) rename {symfony => be}/src/DTO/User/AuthorExpGrade.php (100%) rename {symfony => be}/src/DTO/User/ForumModerator.php (100%) rename {symfony => be}/src/Doctrine/AlwaysQuoteStrategy.php (100%) rename {symfony => be}/src/Entity/BlobResourceGetter.php (100%) rename {symfony => be}/src/Entity/Forum.php (100%) rename {symfony => be}/src/Entity/LatestReplier.php (100%) rename {symfony => be}/src/Entity/Post/Content/PostContent.php (100%) rename {symfony => be}/src/Entity/Post/Content/ReplyContent.php (100%) rename {symfony => be}/src/Entity/Post/Content/SubReplyContent.php (100%) rename {symfony => be}/src/Entity/Post/Post.php (100%) rename {symfony => be}/src/Entity/Post/PostWithContent.php (100%) rename {symfony => be}/src/Entity/Post/Reply.php (100%) rename {symfony => be}/src/Entity/Post/SubReply.php (100%) rename {symfony => be}/src/Entity/Post/Thread.php (100%) rename {symfony => be}/src/Entity/Revision/AuthorExpGrade.php (100%) rename {symfony => be}/src/Entity/Revision/ForumModerator.php (100%) rename {symfony => be}/src/Entity/TimestampedEntity.php (100%) rename {symfony => be}/src/Entity/User.php (100%) rename {symfony => be}/src/EventListener/ExceptionToJsonResponse.php (100%) rename {symfony => be}/src/EventListener/PrettyJsonResponse.php (100%) rename {symfony => be}/src/EventListener/SerializeToJson.php (100%) rename {symfony => be}/src/EventListener/ShowReactJsonView.php (100%) rename {symfony => be}/src/Helper.php (100%) rename {symfony => be}/src/Kernel.php (100%) rename {symfony => be}/src/PostsQuery/BaseQuery.php (100%) rename {symfony => be}/src/PostsQuery/CursorCodec.php (100%) rename {symfony => be}/src/PostsQuery/IndexQuery.php (100%) rename {symfony => be}/src/PostsQuery/ParamsValidator.php (100%) rename {symfony => be}/src/PostsQuery/QueryParam.php (100%) rename {symfony => be}/src/PostsQuery/QueryParams.php (100%) rename {symfony => be}/src/PostsQuery/SearchQuery.php (100%) rename {symfony => be}/src/Repository/ForumRepository.php (100%) rename {symfony => be}/src/Repository/LatestReplierRepository.php (100%) rename {symfony => be}/src/Repository/Post/Content/ReplyContentRepository.php (100%) rename {symfony => be}/src/Repository/Post/Content/SubReplyContentRepository.php (100%) rename {symfony => be}/src/Repository/Post/PostRepository.php (100%) rename {symfony => be}/src/Repository/Post/PostRepositoryFactory.php (100%) rename {symfony => be}/src/Repository/Post/ReplyRepository.php (100%) rename {symfony => be}/src/Repository/Post/SubReplyRepository.php (100%) rename {symfony => be}/src/Repository/Post/ThreadRepository.php (100%) rename {symfony => be}/src/Repository/Revision/AuthorExpGradeRepository.php (100%) rename {symfony => be}/src/Repository/Revision/ForumModeratorRepository.php (100%) rename {symfony => be}/src/Repository/UserRepository.php (100%) rename {symfony => be}/src/Validator/DateTimeRange.php (100%) rename {symfony => be}/src/Validator/DateTimeRangeValidator.php (100%) rename {symfony => be}/src/Validator/Validator.php (100%) delete mode 100644 be/storage/app/.gitignore delete mode 100644 be/storage/app/public/.gitignore delete mode 100644 be/storage/debugbar/.gitignore delete mode 100644 be/storage/framework/.gitignore delete mode 100644 be/storage/framework/cache/.gitignore delete mode 100644 be/storage/framework/cache/data/.gitignore delete mode 100644 be/storage/framework/sessions/.gitignore delete mode 100644 be/storage/framework/testing/.gitignore delete mode 100644 be/storage/framework/views/.gitignore delete mode 100644 be/storage/logs/.gitignore rename {symfony => be}/symfony.lock (100%) rename {symfony => be}/templates/sitemaps/forums.xml.twig (100%) rename {symfony => be}/templates/sitemaps/threads.xml.twig (100%) rename {symfony => be}/tests/Entity/BlobResourceGetterTest.php (100%) rename {symfony => be}/tests/EventListener/ExceptionToJsonResponseTest.php (100%) rename {symfony => be}/tests/EventListener/PrettyJsonResponseTest.php (100%) rename {symfony => be}/tests/EventListener/ShowReactJsonViewTest.php (100%) rename {symfony => be}/tests/HelperTest.php (100%) rename {symfony => be}/tests/PostsQuery/BaseQueryTest.php (100%) rename {symfony => be}/tests/PostsQuery/CursorCodecTest.php (100%) rename {symfony => be}/tests/PostsQuery/ParamsValidatorTest.php (100%) rename {symfony => be}/tests/PostsQuery/QueryParamTest.php (100%) rename {symfony => be}/tests/PostsQuery/QueryParamsTest.php (100%) rename {symfony => be}/tests/Repository/Post/PostRepositoryFactoryTest.php (100%) delete mode 100644 be/tests/TestCase.php rename {symfony => be}/tests/bootstrap.php (100%) delete mode 100644 symfony/.gitignore delete mode 100644 symfony/composer.json delete mode 100644 symfony/composer.lock delete mode 100644 symfony/public/index.php diff --git a/be/.editorconfig b/be/.editorconfig deleted file mode 100644 index 8f0de65c..00000000 --- a/be/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 4 -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -trim_trailing_whitespace = false - -[*.{yml,yaml}] -indent_size = 2 - -[docker-compose.yml] -indent_size = 4 diff --git a/symfony/.env b/be/.env similarity index 100% rename from symfony/.env rename to be/.env diff --git a/be/.env.example b/be/.env.example deleted file mode 100644 index 199e27be..00000000 --- a/be/.env.example +++ /dev/null @@ -1,25 +0,0 @@ -APP_NAME=open-tbm -APP_ENV=production -APP_KEY= -APP_DEBUG=false -APP_TIMEZONE=UTC -APP_URL=http://localhost/be -APP_FE_URL=http://localhost - -LOG_CHANNEL=stack -LOG_STACK=single -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=pgsql -# https://github.com/laravel/framework/issues/3987 -DB_HOST=/var/run/postgresql -DB_PORT=5432 -DB_SEARCH_PATH= -DB_DATABASE= -DB_USERNAME= -DB_PASSWORD= - -CACHE_STORE=file - -RECAPTCHA_SECRET= diff --git a/symfony/.env.test b/be/.env.test similarity index 100% rename from symfony/.env.test rename to be/.env.test diff --git a/be/.gitattributes b/be/.gitattributes deleted file mode 100644 index fcb21d39..00000000 --- a/be/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -* text=auto eol=lf - -*.blade.php diff=html -*.css diff=css -*.html diff=html -*.md diff=markdown -*.php diff=php - -/.github export-ignore -CHANGELOG.md export-ignore -.styleci.yml export-ignore diff --git a/be/.gitignore b/be/.gitignore index 2bf9dc32..c7f01f7b 100644 --- a/be/.gitignore +++ b/be/.gitignore @@ -1,24 +1,34 @@ -.phpstorm.meta.php -_ide_helper*.php -# https://github.com/laravel/laravel/blob/master/.gitignore -/.phpunit.cache -/node_modules -/public/build -/public/hot -/public/storage -/storage/*.key -/vendor -.env -.env.backup -.env.production -.phpactor.json +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> symfony/phpunit-bridge ### +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### + +###> phpunit/phpunit ### +/phpunit.xml .phpunit.result.cache -Homestead.json -Homestead.yaml -auth.json -npm-debug.log -yarn-error.log -/.fleet -/.idea -/.vscode +###< phpunit/phpunit ### + +###> phpstan/phpstan ### +phpstan.neon +###< phpstan/phpstan ### + +###> friendsofphp/php-cs-fixer ### +/.php-cs-fixer.php +/.php-cs-fixer.cache +###< friendsofphp/php-cs-fixer ### + +###> squizlabs/php_codesniffer ### +/.phpcs-cache +/phpcs.xml +###< squizlabs/php_codesniffer ### diff --git a/symfony/.php-cs-fixer.dist.php b/be/.php-cs-fixer.dist.php similarity index 100% rename from symfony/.php-cs-fixer.dist.php rename to be/.php-cs-fixer.dist.php diff --git a/symfony/.phpcs.xml b/be/.phpcs.xml similarity index 100% rename from symfony/.phpcs.xml rename to be/.phpcs.xml diff --git a/be/app/Console/Commands/BatchTableSQLGenerator.php b/be/app/Console/Commands/BatchTableSQLGenerator.php deleted file mode 100644 index 3dc667fd..00000000 --- a/be/app/Console/Commands/BatchTableSQLGenerator.php +++ /dev/null @@ -1,53 +0,0 @@ -ask('请输入需替换表名SQL 不支持多行文本 - 占位符: - {fid} => 吧ID - {t_thread} => 主题帖表 - {t_reply} => 回复帖表 - {t_subReply} => 楼中楼表'); - $placeholders = [ - '{fid}' => '{fid}', - '{t_thread}' => 'tbmc_f{fid}_thread', - '{t_reply}' => 'tbmc_f{fid}_reply', - '{t_subReply}' => 'tbmc_f{fid}_subReply', - ]; - $outputSQLs = []; - foreach (Forum::select('fid')->get() as $forum) { - $placeholdersName = array_keys($placeholders); - $replacedPlaceholders = str_replace('{fid}', $forum->fid, array_values($placeholders)); - $replacedInput = str_replace($placeholdersName, $replacedPlaceholders, $input); - $outputSQLs[] = $replacedInput; - $this->warn($replacedInput); - } - if ($this->confirm('是否执行上述SQL?')) { - foreach ($outputSQLs as $outputSQL) { - try { - $affectedRows = $this->db->statement($outputSQL); - $this->info($outputSQL . ' 影响行数:' . $affectedRows ?? 0); - } catch (\Exception $e) { - $this->error($e->getMessage()); - } - } - } - } -} diff --git a/be/app/Console/Commands/GenerateBilibiliVote.php b/be/app/Console/Commands/GenerateBilibiliVote.php deleted file mode 100644 index 84558008..00000000 --- a/be/app/Console/Commands/GenerateBilibiliVote.php +++ /dev/null @@ -1,74 +0,0 @@ -whereBetween('postTime', [$voteStartTime, $voteEndTime]) - // set a lower chunk size to minimize influence of ignoring previous valid vote - ->chunk(10, static function (Collection $voteReplies) use ($voteResult) { - $voteResults = []; - $candidateIDRange = range(1, 1056); - $votersPreviousValidVoteCount = $voteResult::select('authorUid') - ->selectRaw('COUNT(*)') - ->whereIn('authorUid', $voteReplies->pluck('authorUid')) - ->where('isValid', true) - ->groupBy('authorUid') - ->get(); - // $votersUsername = User::uid($voteReplies->pluck('authorUid'))->select('uid', 'name')->get(); - foreach ($voteReplies as $voteReply) { - $voterUid = $voteReply['authorUid']; - $voteRegex = Regex::match( - '/"text":"(.*?)投(.*?)号候选人/', - \Safe\json_encode($voteReply['content']) ?? '', - ); - $voteBy = $voteRegex->groupOr(1, ''); - $voteFor = trim($voteRegex->groupOr(2, '')); - $isVoteValid = $voteRegex->hasMatch() - && $voteReply['authorExpGrade'] >= 4 - // && $voteBy === ($votersUsername->where('uid', $voterUid)->first()['name'] ?? null) - && \in_array((int) $voteFor, $candidateIDRange, true) - && $votersPreviousValidVoteCount->where('authorUid', $voterUid)->first() === null; - $voteResults[] = [ - 'pid' => $voteReply['pid'], - 'authorUid' => $voteReply['authorUid'], - 'authorExpGrade' => $voteReply['authorExpGrade'], - 'isValid' => $isVoteValid, - 'voteBy' => self::nullableValidate($voteBy), - 'voteFor' => self::nullableValidate($voteFor), - 'replyContent' => $voteReply['content'], - 'postTime' => $voteReply['postTime'], - ]; - } - // never update isValid field to prevent covering wrong value - $voteResult->chunkInsertOnDuplicate($voteResults, ['authorExpGrade'], 2000); - }); - } - - public static function nullableValidate(string $value, bool $isJson = false): ?string - { - if ($value === '""' || $value === '[]' || blank($value)) { - return null; - } - return $isJson ? \Safe\json_encode($value) : $value; - } -} diff --git a/be/app/Console/Kernel.php b/be/app/Console/Kernel.php deleted file mode 100644 index 4c1dd5ab..00000000 --- a/be/app/Console/Kernel.php +++ /dev/null @@ -1,27 +0,0 @@ -command('inspire')->hourly(); - } - - /** - * Register the commands for the application. - */ - protected function commands(): void - { - $this->load(__DIR__ . '/Commands'); - - require base_path('routes/console.php'); - } -} diff --git a/be/app/Eloquent/Model/BilibiliVote.php b/be/app/Eloquent/Model/BilibiliVote.php deleted file mode 100644 index 1f1f77b7..00000000 --- a/be/app/Eloquent/Model/BilibiliVote.php +++ /dev/null @@ -1,10 +0,0 @@ -publicFields = ['fid', 'name']; - } - - public function scopeIsCrawling(Builder $query, bool $isCrawling): Builder - { - return $query->where('isCrawling', $isCrawling); - } - - public function scopeFid(Builder $query, int $fid): Builder - { - return $query->where('fid', $fid); - } - - public static function getName(int $fid): Collection - { - return self::where('fid', $fid)->value('name'); - } - - public static function getFid(string $forumName): Collection - { - return self::where('name', $forumName)->value('fid'); - } -} diff --git a/be/app/Eloquent/Model/LatestReplier.php b/be/app/Eloquent/Model/LatestReplier.php deleted file mode 100644 index fbd3a870..00000000 --- a/be/app/Eloquent/Model/LatestReplier.php +++ /dev/null @@ -1,33 +0,0 @@ -publicFields = [ - 'id', - 'uid', - 'createdAt', - 'updatedAt', - ]; - } - - protected function displayName(): Attribute - { - return ModelAttributeMaker::makeResourceAttribute(); - } -} diff --git a/be/app/Eloquent/Model/Post/Content/PostContent.php b/be/app/Eloquent/Model/Post/Content/PostContent.php deleted file mode 100644 index 7d8297e9..00000000 --- a/be/app/Eloquent/Model/Post/Content/PostContent.php +++ /dev/null @@ -1,17 +0,0 @@ -publicFields = ['pid', 'protoBufBytes']; - } - - public function scopePid(Builder $query, Collection|array|int $pid): Builder - { - return $this->scopeIDType($query, 'pid', $pid); - } -} diff --git a/be/app/Eloquent/Model/Post/Content/SubReplyContent.php b/be/app/Eloquent/Model/Post/Content/SubReplyContent.php deleted file mode 100644 index 85a3a863..00000000 --- a/be/app/Eloquent/Model/Post/Content/SubReplyContent.php +++ /dev/null @@ -1,22 +0,0 @@ -publicFields = ['spid', 'protoBufBytes']; - } - - public function scopeSpid(Builder $query, Collection|array|int $spid): Builder - { - return $this->scopeIDType($query, 'spid', $spid); - } -} diff --git a/be/app/Eloquent/Model/Post/Post.php b/be/app/Eloquent/Model/Post/Post.php deleted file mode 100644 index f74592ce..00000000 --- a/be/app/Eloquent/Model/Post/Post.php +++ /dev/null @@ -1,73 +0,0 @@ - 'thread', - Reply::class => 'reply', - ReplyContent::class => 'reply_content', - SubReply::class => 'subReply', - SubReplyContent::class => 'subReply_content', - ]; - - protected function getTableNameSuffix(): string - { - return self::MODEL_CLASS_TO_TABLE_NAME_SUFFIX[$this::class]; - } - - protected function getTableNameWithFid(int $fid): string - { - return "tbmc_f{$fid}_" . $this->getTableNameSuffix(); - } - - public function scopeSelectCurrentAndParentPostID(Builder $query): Builder - { - // only fetch current post ID and its parent posts ID when we can fetch all fields - // since BaseQuery::fillWithParentPost() will query detailed value of other fields - return $query->addSelect(array_values(\array_slice( - Helper::POST_TYPE_TO_ID, - 0, - array_search($this->getTableNameSuffix(), Helper::POST_TYPES, true) + 1, - ))); - } - - public function scopeTid(Builder $query, Collection|array|int $tid): Builder - { - return $this->scopeIDType($query, 'tid', $tid); - } - - /** - * @param Builder $query - * @param string $postIDName - * @param Collection|list|int $postID - * @return Builder - */ - protected function scopeIDType(Builder $query, string $postIDName, Collection|array|int $postID): Builder - { - if (\is_int($postID)) { - return $query->where($postIDName, $postID); - } - if (\is_array($postID) || $postID instanceof Collection) { - return $query->whereIn($postIDName, $postID); - } - throw new \InvalidArgumentException("$postIDName must be int or array"); - } -} diff --git a/be/app/Eloquent/Model/Post/PostFactory.php b/be/app/Eloquent/Model/Post/PostFactory.php deleted file mode 100644 index 5a209d5f..00000000 --- a/be/app/Eloquent/Model/Post/PostFactory.php +++ /dev/null @@ -1,46 +0,0 @@ -setFid($fid); - } - - public static function newReply(int $fid): Reply - { - return (new Reply())->setFid($fid); - } - - public static function newReplyContent(int $fid): ReplyContent - { - return (new ReplyContent())->setFid($fid); - } - - public static function newSubReply(int $fid): SubReply - { - return (new SubReply())->setFid($fid); - } - - public static function newSubReplyContent(int $fid): SubReplyContent - { - return (new SubReplyContent())->setFid($fid); - } - - /** - * @return array{thread: Thread, reply: Reply, subReply: SubReply} - */ - public static function getPostModelsByFid(int $fid): array - { - return array_combine( - Helper::POST_TYPES, - [self::newThread($fid), self::newReply($fid), self::newSubReply($fid)], - ); - } -} diff --git a/be/app/Eloquent/Model/Post/Reply.php b/be/app/Eloquent/Model/Post/Reply.php deleted file mode 100644 index 180da91e..00000000 --- a/be/app/Eloquent/Model/Post/Reply.php +++ /dev/null @@ -1,71 +0,0 @@ - NullableNumericAttributeCast::class, - 'agreeCount' => NullableNumericAttributeCast::class, - 'disagreeCount' => NullableNumericAttributeCast::class, - ]; - - public function __construct(array $attributes = []) - { - parent::__construct($attributes); - $this->publicFields = [ - 'tid', - 'pid', - 'floor', - 'authorUid', - 'subReplyCount', - 'postedAt', - 'isFold', - 'agreeCount', - 'disagreeCount', - 'geolocation', - 'signatureId', - ...parent::TIMESTAMP_FIELDS, - ]; - } - - protected function geolocation(): Attribute - { - return ModelAttributeMaker::makeProtoBufAttribute(Lbs::class); - } - - /** @psalm-return BelongsTo */ - public function thread(): BelongsTo - { - return $this->belongsTo(Thread::class, 'tid', 'tid'); - } - - /** @psalm-return HasMany */ - public function subReplies(): HasMany - { - return $this->hasMany(SubReply::class, 'pid', 'pid'); - } - - public function contentProtoBuf(): HasOne - { - return $this->hasOne(ReplyContent::class, 'pid', 'pid')->selectPublicFields(); - } - - public function scopePid(Builder $query, Collection|array|int $pid): Builder - { - return $this->scopeIDType($query, 'pid', $pid); - } -} diff --git a/be/app/Eloquent/Model/Post/SubReply.php b/be/app/Eloquent/Model/Post/SubReply.php deleted file mode 100644 index 65b02ad1..00000000 --- a/be/app/Eloquent/Model/Post/SubReply.php +++ /dev/null @@ -1,61 +0,0 @@ - NullableNumericAttributeCast::class, - 'disagreeCount' => NullableNumericAttributeCast::class, - ]; - - public function __construct(array $attributes = []) - { - parent::__construct($attributes); - $this->publicFields = [ - ...Helper::POST_ID, - 'authorUid', - 'postedAt', - 'agreeCount', - 'disagreeCount', - ...parent::TIMESTAMP_FIELDS, - ]; - } - - /** @psalm-return BelongsTo */ - public function thread(): BelongsTo - { - return $this->belongsTo(Thread::class, 'tid', 'tid'); - } - - /** @psalm-return BelongsTo */ - public function reply(): BelongsTo - { - return $this->belongsTo(Reply::class, 'pid', 'pid'); - } - - public function scopePid(Builder $query, Collection|array|int $pid): Builder - { - return $this->scopeIDType($query, 'pid', $pid); - } - - public function contentProtoBuf(): HasOne - { - return $this->hasOne(SubReplyContent::class, 'spid', 'spid')->selectPublicFields(); - } - - public function scopeSpid(Builder $query, Collection|array|int $spid): Builder - { - return $this->scopeIDType($query, 'spid', $spid); - } -} diff --git a/be/app/Eloquent/Model/Post/Thread.php b/be/app/Eloquent/Model/Post/Thread.php deleted file mode 100644 index ecccc085..00000000 --- a/be/app/Eloquent/Model/Post/Thread.php +++ /dev/null @@ -1,70 +0,0 @@ - NullableNumericAttributeCast::class, - 'viewCount' => NullableNumericAttributeCast::class, - 'shareCount' => NullableNumericAttributeCast::class, - 'agreeCount' => NullableNumericAttributeCast::class, - 'disagreeCount' => NullableNumericAttributeCast::class, - ]; - - public function __construct(array $attributes = []) - { - parent::__construct($attributes); - $this->publicFields = [ - 'tid', - 'threadType', - 'stickyType', - 'topicType', - 'isGood', - 'title', - 'authorUid', - 'postedAt', - 'latestReplyPostedAt', - 'latestReplierId', - 'replyCount', - 'viewCount', - 'shareCount', - 'agreeCount', - 'disagreeCount', - 'zan', - 'geolocation', - 'authorPhoneType', - ...parent::TIMESTAMP_FIELDS, - ]; - } - - protected function zan(): Attribute - { - return ModelAttributeMaker::makeProtoBufAttribute(Zan::class); - } - - protected function geolocation(): Attribute - { - return ModelAttributeMaker::makeProtoBufAttribute(Lbs::class); - } - - /** @psalm-return HasMany */ - public function replies(): HasMany - { - return $this->hasMany(Reply::class, 'tid', 'tid'); - } -} diff --git a/be/app/Eloquent/Model/Revision/AuthorExpGrade.php b/be/app/Eloquent/Model/Revision/AuthorExpGrade.php deleted file mode 100644 index 28ba3c3e..00000000 --- a/be/app/Eloquent/Model/Revision/AuthorExpGrade.php +++ /dev/null @@ -1,26 +0,0 @@ -publicFields = [ - 'discoveredAt', - 'fid', - 'uid', - 'authorExpGrade', - ]; - } -} diff --git a/be/app/Eloquent/Model/Revision/ForumModerator.php b/be/app/Eloquent/Model/Revision/ForumModerator.php deleted file mode 100644 index f9da369d..00000000 --- a/be/app/Eloquent/Model/Revision/ForumModerator.php +++ /dev/null @@ -1,25 +0,0 @@ -publicFields = [ - 'discoveredAt', - 'portrait', - 'moderatorTypes', - ]; - } -} diff --git a/be/app/Eloquent/Model/User.php b/be/app/Eloquent/Model/User.php deleted file mode 100644 index 10180066..00000000 --- a/be/app/Eloquent/Model/User.php +++ /dev/null @@ -1,81 +0,0 @@ -publicFields = [ - 'uid', - 'name', - 'displayName', - 'portrait', - 'portraitUpdatedAt', - 'gender', - 'fansNickname', - 'icon', - 'ipGeolocation', - 'createdAt', - 'updatedAt', - ]; - } - - protected function displayName(): Attribute - { - return ModelAttributeMaker::makeResourceAttribute(); - } - - protected function icon(): Attribute - { - return ModelAttributeMaker::makeProtoBufAttribute(UserIconWrapper::class); - } - - /** - * @param Builder $query - * @param Collection|list|int $uid - * @return Builder - */ - public function scopeUid(Builder $query, Collection|array|int $uid): Builder - { - if (\is_int($uid)) { - return $query->where('uid', $uid); - } - if (\is_array($uid) || $uid instanceof Collection) { - return $query->whereIn('uid', $uid); - } - throw new \InvalidArgumentException('Uid must be int or array'); - } - - public function currentForumModerator(): HasOne - { - return $this // https://laracasts.com/discuss/channels/eloquent/eager-loading-constraints-with-limit-clauses - ->hasOne(ForumModerator::class, 'portrait', 'portrait') - ->orderBy('discoveredAt', 'DESC')->selectPublicFields(); - } - - public function currentAuthorExpGrade(): HasOne - { - return $this // https://laracasts.com/discuss/channels/eloquent/eager-loading-constraints-with-limit-clauses - ->hasOne(AuthorExpGrade::class, 'uid', 'uid') - ->orderBy('discoveredAt', 'DESC')->selectPublicFields(); - } -} diff --git a/be/app/Eloquent/ModelAttributeMaker.php b/be/app/Eloquent/ModelAttributeMaker.php deleted file mode 100644 index 235bbd67..00000000 --- a/be/app/Eloquent/ModelAttributeMaker.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ - public static function makeProtoBufAttribute(string $protoBufClass): Attribute - { - return Attribute::get(/** @param resource|null $value */ - static function ($value) use ($protoBufClass): ?\stdClass { - if ($value === null) { - return null; - } - /** @var Message $proto */ - $proto = new $protoBufClass(); - $proto->mergeFromString(stream_get_contents($value)); - return \Safe\json_decode($proto->serializeToJsonString()); - }, - )->shouldCache(); - } - - /** @return Attribute */ - public static function makeResourceAttribute(): Attribute - { - return Attribute::get(/** - * @param resource|null $value - * @return string - */ - static fn($value) => $value === null ? null : stream_get_contents($value), - )->shouldCache(); - } -} diff --git a/be/app/Eloquent/ModelHasPublicField.php b/be/app/Eloquent/ModelHasPublicField.php deleted file mode 100644 index 4409309e..00000000 --- a/be/app/Eloquent/ModelHasPublicField.php +++ /dev/null @@ -1,24 +0,0 @@ - */ - protected array $publicFields = []; - - /** @var list */ - protected array $hiddenFields = []; - - /** - * @param Builder $query - * @return Builder - */ - public function scopeSelectPublicFields(Builder $query): Builder - { - return $query->select(array_diff($this->publicFields, $this->hiddenFields)); - } -} diff --git a/be/app/Eloquent/ModelWithTableNameSplitByFid.php b/be/app/Eloquent/ModelWithTableNameSplitByFid.php deleted file mode 100644 index 75e71cf9..00000000 --- a/be/app/Eloquent/ModelWithTableNameSplitByFid.php +++ /dev/null @@ -1,40 +0,0 @@ -fid = $fid; - $this->setTable($this->getTableNameWithFid($fid)); - return $this; - } - - abstract protected function getTableNameWithFid(int $fid): string; - - /** - * Override the parent relation instance method for passing valid fid to new related model - * @param class-string $class - */ - protected function newRelatedInstance($class) - { - return tap((new $class())->setFid($this->fid), function ($instance) { - if (!$instance->getConnectionName()) { - $instance->setConnection($this->connection); - } - }); - } - - /** - * Override the parent newInstance method for passing valid fid to model's query builder - */ - public function newInstance($attributes = [], $exists = false): static - { - return parent::newInstance($attributes, $exists)->setFid($this->fid); - } -} diff --git a/be/app/Eloquent/NullableBooleanAttributeCast.php b/be/app/Eloquent/NullableBooleanAttributeCast.php deleted file mode 100644 index f6c082e8..00000000 --- a/be/app/Eloquent/NullableBooleanAttributeCast.php +++ /dev/null @@ -1,20 +0,0 @@ -response ?? response()->json([ - 'errorCode' => 40000, - 'errorInfo' => $e->validator->getMessageBag()->getMessages(), - ], 400); - } -} diff --git a/be/app/Helper.php b/be/app/Helper.php deleted file mode 100644 index 14c7f886..00000000 --- a/be/app/Helper.php +++ /dev/null @@ -1,103 +0,0 @@ - 'threads', - 'reply' => 'replies', - 'subReply' => 'subReplies', - ]; - - public const array POST_TYPE_PLURAL_TO_SINGULAR = [ - 'threads' => 'thread', - 'replies' => 'reply', - 'subReplies' => 'subReply', - ]; - - public const array POST_ID_TO_TYPE_PLURAL = [ - 'tid' => 'threads', - 'pid' => 'replies', - 'spid' => 'subReplies', - ]; - - public const array POST_ID_TO_TYPE = [ - 'tid' => 'thread', - 'pid' => 'reply', - 'spid' => 'subReply', - ]; - - public const array POST_TYPE_TO_ID = [ - 'thread' => 'tid', - 'reply' => 'pid', - 'subReply' => 'spid', - ]; - - public static function abortAPIIf(int $errorCode, bool $condition): void - { - if ($condition) { - self::abortAPI($errorCode); - } - } - - public static function abortAPIIfNot(int $errorCode, bool $condition): void - { - if (!$condition) { - self::abortAPI($errorCode); - } - } - - public const array ERROR_STATUS_CODE_INFO = [ - // httpStatusCode => [ errorCode => errorInfo ] - 400 => [ - // 40000 => App\Exceptions\Handler::convertValidationExceptionToResponse() - 40001 => '帖子查询类型必须为索引或搜索查询', - 40002 => '搜索查询必须指定查询贴吧', - 40003 => '部分查询参数与查询帖子类型要求不匹配', - 40004 => '排序方式与查询帖子类型要求不匹配', - 40005 => '提供了多个唯一查询参数', - ], - 401 => [ - 40101 => 'Google reCAPTCHA 验证未通过 请刷新页面/更换设备/网络环境后重试', - ], - 404 => [ - 40401 => '帖子查询结果为空', - 40402 => '用户查询结果为空', - 40403 => '吧帖量统计查询结果为空', - 40406 => '指定查询的贴吧不存在', - ], - 500 => [ - 50001 => '数据库中存在多个贴吧表存储了该 ID 的帖子', - ], - ]; - - public static function abortAPI(int $errorCode): never - { - $statusCode = 0; - $errorInfo = null; - foreach (self::ERROR_STATUS_CODE_INFO as $infoStatusCode => $infoErrorInfo) { - if (\array_key_exists($errorCode, $infoErrorInfo)) { - $statusCode = $infoStatusCode; - $errorInfo = $infoErrorInfo[$errorCode]; - } - } - if ($errorInfo === null) { - throw new \InvalidArgumentException('Given error code doesn\'t existed'); - } - response()->json(compact('errorCode', 'errorInfo'), $statusCode)->throwResponse(); - } - - public static function xmlResponse(string|\Stringable $xml): \Illuminate\Http\Response - { - // https://laracasts.com/discuss/channels/laravel/syntax-error-unexpected-identifier-version-1 - return response('' . "\n$xml") - ->withHeaders(['Content-Type' => 'text/xml']); - } -} diff --git a/be/app/Http/BilibiliVoteQuery.php b/be/app/Http/BilibiliVoteQuery.php deleted file mode 100644 index eede6b8a..00000000 --- a/be/app/Http/BilibiliVoteQuery.php +++ /dev/null @@ -1,221 +0,0 @@ -db->query()->select('voteFor')->fromSub( - BilibiliVote::select('voteFor') - ->selectRaw('COUNT(*) AS count') - ->where('isValid', true) - ->groupBy('voteFor') - ->orderBy('count', 'DESC') - ->limit($candidateCount), - 'T', - ); - } - - /** - * Return every candidate valid and invalid votes count - */ - public static function allCandidatesVoteCount(Request $request): string - { - /* - * select `isValid`, `voteFor`, COUNT(*) AS count - * from `tbm_bilibiliVote` - * group by `isValid`, `voteFor` - * order by `voteFor` asc - */ - return self::normalizeVoteFor(BilibiliVote::select(['isValid', 'voteFor']) - ->selectRaw('COUNT(*) AS count') - ->groupBy('isValid', 'voteFor') - ->orderBy('voteFor', 'ASC') - ->get()) - ->values() - ->toJson(); - } - - /** - * @return string[] - * @psalm-return array{minute: string, hour: string, day: string, week: string, month: string, year: string} - */ - public static function rawSqlGroupByTimeGranularity( - string $fieldName, - array $timeGranularity = ['minute', 'hour', 'day', 'week', 'month', 'year'], - ): array { - return Arr::only([ - 'minute' => "DATE_FORMAT($fieldName, \"%Y-%m-%d %H:%i\") AS time", - 'hour' => "DATE_FORMAT($fieldName, \"%Y-%m-%d %H:00\") AS time", - 'day' => "DATE($fieldName) AS time", - 'week' => "DATE_FORMAT($fieldName, \"%Y年第%u周\") AS time", - 'month' => "DATE_FORMAT($fieldName, \"%Y-%m\") AS time", - 'year' => "DATE_FORMAT($fieldName, \"%Y年\") AS time", - ], $timeGranularity); - } - - /** - * Return all valid and invalid votes count, group by given time range - */ - public static function allVoteCountsGroupByTime(Request $request): string - { - /* - * select DATE_FORMAT(postTime, "%Y-%m-%d %H:%i|00") AS time, isValid, COUNT(*) AS count - * from `tbm_bilibiliVote` - * group by `time`, `isValid` - * order by `time` asc - */ - $groupByTimeGranularity = self::rawSqlGroupByTimeGranularity('postTime', ['minute', 'hour']); - $request->validate([ - 'timeGranularity' => ['required', Rule::in(array_keys($groupByTimeGranularity))], - ]); - return BilibiliVote::selectRaw($groupByTimeGranularity[$request->query()['timeGranularity']]) - ->selectRaw('isValid, COUNT(*) AS count') - ->groupBy('time', 'isValid') - ->orderBy('time', 'ASC') - ->get()->toJson(); - } - - /** - * Return votes count and average voters' exp grade of top 50 candidates - */ - public function top50CandidatesVoteCount(Request $request): string - { - /* - * select `isValid`, `voteFor`, COUNT(*) AS count, AVG(authorExpGrade) AS voterAvgGrade - * from `tbm_bilibiliVote` - * where `voteFor` in getTopVotesCandidatesSQL(50) - * group by `isValid`, `voteFor` - * order by `voteFor` asc - */ - return self::normalizeVoteFor(BilibiliVote::select(['isValid', 'voteFor']) - ->selectRaw('COUNT(*) AS count, AVG(authorExpGrade) AS voterAvgGrade') - ->whereIn('voteFor', $this->getCandidatesWithMostVotes(50)) - ->groupBy('isValid', 'voteFor') - ->orderBy('voteFor', 'ASC') - ->get()) - ->map(static function ($i) { - $i['voterAvgGrade'] = (float) $i['voterAvgGrade']; - return $i; - }) - ->toJson(); - } - - /** - * Return votes count of top 5 candidates, group by given time range - */ - public function top5CandidatesVoteCountGroupByTime(Request $request): string - { - /* - * select DATE_FORMAT(postTime, "%Y-%m-%d %H:%i|00") AS time, `isValid`, `voteFor`, COUNT(*) AS count - * from `tbm_bilibiliVote` - * where `voteFor` in getTopVotesCandidatesSQL(5) - * group by `time`, `isValid`, `voteFor` - * order by `time` asc - */ - $groupBytimeGranularity = self::rawSqlGroupByTimeGranularity('postTime', ['minute', 'hour']); - $request->validate([ - 'timeGranularity' => ['required', Rule::in(array_keys($groupBytimeGranularity))], - ]); - return self::normalizeVoteFor(BilibiliVote::selectRaw( - $groupBytimeGranularity[$request->query()['timeGranularity']], - ) - ->addSelect(['isValid', 'voteFor']) - ->selectRaw('COUNT(*) AS count') - ->whereIn('voteFor', $this->getCandidatesWithMostVotes(5)) - ->groupBy('time', 'isValid', 'voteFor') - ->orderBy('time', 'ASC') - ->get()) - ->toJson(); - } - - /** - * Return every 5-min sum of cumulative votes count, group by candidates and validate - */ - public function top10CandidatesTimeline(Request $request): string - { - /* - * select CAST(timeGranularityRawSQL.endTime AS UNSIGNED) AS endTime, - * isValid, voteFor, CAST(SUM(timeGroups.count) AS UNSIGNED) AS count - * from ( - * select FLOOR(UNIX_TIMESTAMP(postTime)/300)*300 as endTime, - * isValid, voteFor, COUNT(*) as count - * from `tbm_bilibiliVote` - * where `voteFor` in getTopVotesCandidatesSQL(10) - * group by `endTime`, `isValid`, `voteFor` - * ) as `timeGroups` - * inner join ( - * select "1552192500" as endTime union - * ...every +300... union - * select "1552276800" as endTime - * ) AS timeGranularityRawSQL - * on `timeGroups`.`endTime` < `timeGranularityRawSQL`.`endTime` - * group by `endTime`, `isValid`, `voteFor` - * order by `endTime` asc - */ - $voteStartTime = '2019-03-10T12:35:00'; // exactly 2019-03-10T12:38:17 - $voteEndTime = '2019-03-11T12:00:00'; - $timeGranularity = 5 * 60; // 5 mins - $timeGranularityRawSQL = []; - for ($time = strtotime($voteStartTime); $time <= strtotime($voteEndTime); $time += $timeGranularity) { - $timeGranularityRawSQL[] = "SELECT '$time' AS endTime"; - } - $timeGranularityRawSQL = implode(' UNION ', $timeGranularityRawSQL); - return self::normalizeVoteFor($this->db->query() - ->selectRaw('CAST(timeGranularityRawSQL.endTime AS UNSIGNED) AS endTime, - isValid, voteFor, CAST(SUM(timeGroups.count) AS UNSIGNED) AS count') - ->fromSub(BilibiliVote::selectRaw( - "FLOOR(UNIX_TIMESTAMP(postTime)/$timeGranularity)*$timeGranularity as endTime, - isValid, voteFor, COUNT(*) as count", - ) - ->whereIn('voteFor', $this->getCandidatesWithMostVotes(10)) - ->groupBy('endTime', 'isValid', 'voteFor'), 'timeGroups') - ->join( - $this->db->raw("($timeGranularityRawSQL) AS timeGranularityRawSQL"), - 'timeGroups.endTime', - '<', - 'timeGranularityRawSQL.endTime', - ) // cumulative - ->groupBy('endTime', 'isValid', 'voteFor') - ->orderBy('endTime', 'ASC') - ->orderBy('voteFor', 'ASC') - ->get() - ->map(static fn($i) => (array) $i)) - ->toJson(); - } - - private static function normalizeVoteFor(Collection $collection): Collection - { - return $collection - ->filter(static fn($i) => Regex::match('/^(0|[1-9][0-9]*)$/', $i['voteFor'] ?? '')->hasMatch()) - ->map(static function ($i) { - $i['voteFor'] = (int) $i['voteFor']; - return $i; - }) - ->filter(static fn($i) => $i['voteFor'] >= 1 && $i['voteFor'] <= 1056); - } -} diff --git a/be/app/Http/Controllers/Controller.php b/be/app/Http/Controllers/Controller.php deleted file mode 100644 index 8677cd5c..00000000 --- a/be/app/Http/Controllers/Controller.php +++ /dev/null @@ -1,8 +0,0 @@ -app->makeWith(ParamsValidator::class, ['params' => \Safe\json_decode( - $request->validate([ - 'cursor' => [ // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data - // (,|$)|,){5,6} means allow at most 5~6 parts of base64 segment or empty string to exist - 'regex:/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/', - ], - 'query' => 'json|required', - ])['query'], - assoc: true, - )]); - $params = $validator->params; - - $postIDParams = $params->pick(...Helper::POST_ID); - $isQueryByPostID = - // is there no other params except unique params and post ID params - \count($params->omit(...ParamsValidator::UNIQUE_PARAMS_NAME, ...Helper::POST_ID)) === 0 - // is there only one post ID param - && \count($postIDParams) === 1 - // is all post ID params doesn't own any sub param - && array_filter($postIDParams, static fn($p) => $p->getAllSub() !== []) === []; - $isFidParamNull = $params->getUniqueParamValue('fid') === null; - // is the fid param exists and there's no other params except unique params - $isQueryByFid = !$isFidParamNull && \count($params->omit(...ParamsValidator::UNIQUE_PARAMS_NAME)) === 0; - $isIndexQuery = $isQueryByPostID || $isQueryByFid; - $isSearchQuery = !$isIndexQuery; - Helper::abortAPIIf(40002, $isSearchQuery && $isFidParamNull); - - $validator->addDefaultParamsThenValidate(shouldSkip40003: $isIndexQuery); - - $queryClass = $isIndexQuery ? IndexQuery::class : SearchQuery::class; - $this->debugbar->startMeasure('$queryClass->query()'); - $query = (new $queryClass())->query($params, $request->get('cursor')); - $this->debugbar->stopMeasure('$queryClass->query()'); - $this->debugbar->startMeasure('fillWithParentPost'); - $result = $query->fillWithParentPost(); - $this->debugbar->stopMeasure('fillWithParentPost'); - - $this->debugbar->startMeasure('queryUsers'); - $latestRepliersId = $result['threads']->pluck('latestReplierId'); - $latestRepliers = LatestReplier::query()->whereIn('id', $latestRepliersId) - ->whereNotNull('uid')->selectPublicFields()->get() - ->concat(LatestReplier::query()->whereIn('id', $latestRepliersId) - ->whereNull('uid')->selectPublicFields() - ->addSelect(['name', 'displayName'])->get()); - $whereCurrentFid = static fn(HasOne $q): HasOne => $q->where('fid', $result['fid']); - $users = User::query()->whereIn( - 'uid', - collect($result) - ->only(Helper::POST_TYPES_PLURAL) - ->flatMap(static fn(Collection $posts) => $posts->pluck('authorUid')) - ->concat($latestRepliers->pluck('uid')) - ->filter()->unique(), // remove NULLs - )->with(['currentForumModerator' => $whereCurrentFid, 'currentAuthorExpGrade' => $whereCurrentFid]) - ->selectPublicFields()->get(); - $this->debugbar->stopMeasure('queryUsers'); - - return [ - 'type' => $isIndexQuery ? 'index' : 'search', - 'pages' => [ - ...$query->getResultPages(), - ...Arr::except($result, ['fid', ...Helper::POST_TYPES_PLURAL]), - ], - 'forum' => Forum::fid($result['fid'])->selectPublicFields()->first(), - 'threads' => $query->reOrderNestedPosts($query->nestPostsWithParent(...$result)), - 'users' => $users, - 'latestRepliers' => $latestRepliers, - ]; - } -} diff --git a/be/app/Http/Controllers/ThreadsSitemap.php b/be/app/Http/Controllers/ThreadsSitemap.php deleted file mode 100644 index 590c6001..00000000 --- a/be/app/Http/Controllers/ThreadsSitemap.php +++ /dev/null @@ -1,35 +0,0 @@ - $cursor] = $request->validate([ - 'cursor' => 'integer', - ]) + ['cursor' => 0]; - Helper::abortAPIIfNot(40406, Forum::fid($fid)->exists()); - - return $this->cache->remember( - "/sitemaps/forums/$fid/threads?cursor=$cursor", - 86400, - static fn() => Helper::xmlResponse(view('sitemaps.threads', [ - 'tids' => PostFactory::newThread($fid) - ->where('tid', '>', $cursor)->limit(self::$maxUrls) - ->orderBy('tid')->pluck('tid'), - ])), - ); - } -} diff --git a/be/app/Http/Controllers/UsersQuery.php b/be/app/Http/Controllers/UsersQuery.php deleted file mode 100644 index fb3f34aa..00000000 --- a/be/app/Http/Controllers/UsersQuery.php +++ /dev/null @@ -1,48 +0,0 @@ -validate([ - 'uid' => 'integer', - 'name' => 'string', - 'displayName' => 'string', - 'gender' => 'string|in:0,1,2,NULL', - ]); - Helper::abortAPIIf(40402, empty($queryParams)); - - $queryBuilder = User::query(); - - $nullableParams = ['name', 'displayName', 'gender']; - foreach ($nullableParams as $nullableParamName) { - if (\array_key_exists($nullableParamName, $queryParams) && $queryParams[$nullableParamName] === 'NULL') { - $queryBuilder = $queryBuilder->whereNull($nullableParamName); - unset($queryParams[$nullableParamName]); - } - } - - $queriedInfo = $queryBuilder - ->where($queryParams) - ->orderBy('id', 'DESC') - ->selectPublicFields() - ->simplePaginate($this->perPageItems); - Helper::abortAPIIf(40402, $queriedInfo->isEmpty()); - - return [ - 'pages' => [ - 'firstItem' => $queriedInfo->firstItem(), - 'itemCount' => $queriedInfo->count(), - 'currentPage' => $queriedInfo->currentPage(), - ], - 'users' => $queriedInfo->toArray()['data'], - ]; - } -} diff --git a/be/app/Http/Middleware/DumpJsonResponse.php b/be/app/Http/Middleware/DumpJsonResponse.php deleted file mode 100644 index 8880820c..00000000 --- a/be/app/Http/Middleware/DumpJsonResponse.php +++ /dev/null @@ -1,45 +0,0 @@ -accepts('text/html')) { - $json = $response->content(); - $jsonLength = mb_strlen($json); - $assetsUrl = collect(['react-json-view', 'react', 'react-dom']) - ->mapWithKeys(fn($asset) => [$asset => url("/assets/$asset.js")]); - return response(<<$jsonLength bytes -
- - - HTML); - } - // https://github.com/laravel/framework/issues/3929#issuecomment-935123918 - $response->setEncodingOptions(JSON_PRETTY_PRINT); - } - - return $response; - } -} diff --git a/be/app/Http/Middleware/ReCAPTCHACheck.php b/be/app/Http/Middleware/ReCAPTCHACheck.php deleted file mode 100644 index 6a808a09..00000000 --- a/be/app/Http/Middleware/ReCAPTCHACheck.php +++ /dev/null @@ -1,27 +0,0 @@ -input('reCAPTCHA'); - $isReCAPTCHAValid = \is_string($requestReCAPTCHA) - && $reCAPTCHA->verify($requestReCAPTCHA, $request->ip())->isSuccess(); - Helper::abortAPIIfNot(40101, $isReCAPTCHAValid); - } - - return $next($request); - } -} diff --git a/be/app/Http/PostsQuery/BaseQuery.php b/be/app/Http/PostsQuery/BaseQuery.php deleted file mode 100644 index c6cd7e6e..00000000 --- a/be/app/Http/PostsQuery/BaseQuery.php +++ /dev/null @@ -1,344 +0,0 @@ -, - * replies: ?Collection, - * subReplies: ?Collection - * } - */ - protected array $queryResult; - - private array $queryResultPages; - - protected string $orderByField; - - protected bool $orderByDesc; - - abstract public function query(QueryParams $params, ?string $cursor): self; - - public function __construct( - private readonly LaravelDebugbar $debugbar, - private readonly CursorCodec $cursorCodec, - private readonly int $perPageItems = 50, - ) {} - - public function getResultPages(): array - { - return $this->queryResultPages; - } - - /** - * @param int $fid - * @param Collection> $queries key by post type - * @param string|null $cursorParamValue - * @param string|null $queryByPostIDParamName - * @return void - */ - protected function setResult( - int $fid, - Collection $queries, - ?string $cursorParamValue, - ?string $queryByPostIDParamName = null, - ): void { - $this->debugbar->startMeasure('setResult'); - - $addOrderByForBuilder = fn(Builder $qb, string $postType): Builder => $qb - // we don't have to select the post ID - // since it's already selected by invokes of Post::scopeSelectCurrentAndParentPostID() - ->addSelect($this->orderByField) - ->orderBy($this->orderByField, $this->orderByDesc === true ? 'DESC' : 'ASC') - // cursor paginator requires values of orderBy column are unique - // if not it should fall back to other unique field (here is the post ID primary key) - // https://use-the-index-luke.com/no-offset - // https://mysql.rjweb.org/doc.php/pagination - // https://medium.com/swlh/how-to-implement-cursor-pagination-like-a-pro-513140b65f32 - // https://slack.engineering/evolving-api-pagination-at-slack/ - ->orderBy(Helper::POST_TYPE_TO_ID[$postType]); - - $queriesWithOrderBy = $queries->map($addOrderByForBuilder); - $cursorsKeyByPostType = null; - if ($cursorParamValue !== null) { - $cursorsKeyByPostType = $this->cursorCodec->decodeCursor($cursorParamValue, $this->orderByField); - // remove queries for post types with encoded cursor ',,' - $queriesWithOrderBy = $queriesWithOrderBy->intersectByKeys($cursorsKeyByPostType); - } - $this->debugbar->startMeasure('initPaginators'); - /** @var Collection $paginators key by post type */ - $paginators = $queriesWithOrderBy->map(fn(Builder $qb, string $type) => - $qb->cursorPaginate($this->perPageItems, cursor: $cursorsKeyByPostType[$type] ?? null)); - $this->debugbar->stopMeasure('initPaginators'); - - /** @var Collection $postsKeyByTypePluralName */ - $postsKeyByTypePluralName = $paginators - // cast paginator with queried posts to Collection - ->map(static fn(CursorPaginator $paginator) => $paginator->collect()) - ->mapWithKeys(static fn(Collection $posts, string $type) => - [Helper::POST_TYPE_TO_PLURAL[$type] => $posts]); - Helper::abortAPIIf(40401, $postsKeyByTypePluralName->every(static fn(Collection $i) => $i->isEmpty())); - $this->queryResult = ['fid' => $fid, ...$postsKeyByTypePluralName]; - - $hasMore = self::unionPageStats( - $paginators, - 'hasMorePages', - static fn(Collection $v) => $v->filter()->count() !== 0, // Collection->filter() will remove false values - ); - $this->queryResultPages = [ - 'currentCursor' => $cursorParamValue ?? '', - 'nextCursor' => $hasMore - ? $this->cursorCodec->encodeNextCursor( - $queryByPostIDParamName === null - ? $postsKeyByTypePluralName - : $postsKeyByTypePluralName->except([Helper::POST_ID_TO_TYPE_PLURAL[$queryByPostIDParamName]]), - $this->orderByField, - ) - : null, - ]; - - $this->debugbar->stopMeasure('setResult'); - } - - /** - * Union builders pagination $unionMethodName data by $unionStatement - * - * @param Collection $paginators key by post type - * @param string $unionMethodName - * @param Closure $unionCallback (Collection): TReturn - * @template TReturn - * @return TReturn returned by $unionCallback() - */ - private static function unionPageStats( - Collection $paginators, - string $unionMethodName, - Closure $unionCallback, - ): mixed { - // Collection::filter() will remove falsy values - $unionValues = $paginators->map(static fn(CursorPaginator $p) => $p->$unionMethodName()); - return $unionCallback($unionValues->isEmpty() ? collect(0) : $unionValues); // prevent empty array - } - - /** - * @return array{ - * fid: int, - * threads: Collection, - * replies: Collection, - * subReplies: Collection, - * matchQueryPostCount: array{thread: int, reply: int, subReply: int}, - * notMatchQueryParentPostCount: array{thread: int, reply: int}, - * } - */ - public function fillWithParentPost(): array - { - $result = $this->queryResult; - /** @var Collection $tids */ - /** @var Collection $pids */ - /** @var Collection $spids */ - /** @var Collection $replies */ - /** @var Collection $subReplies */ - [[, $tids], [$replies, $pids], [$subReplies, $spids]] = array_map( - /** - * @param string $postIDName - * @return array{0: Collection, 1: Collection} - */ - static function (string $postIDName) use ($result): array { - $postTypePluralName = Helper::POST_ID_TO_TYPE_PLURAL[$postIDName]; - return \array_key_exists($postTypePluralName, $result) - ? [$result[$postTypePluralName], $result[$postTypePluralName]->pluck($postIDName)] - : [collect(), collect()]; - }, - Helper::POST_ID, - ); - - /** @var int $fid */ - $fid = $result['fid']; - $postModels = PostFactory::getPostModelsByFid($fid); - - $this->debugbar->startMeasure('fillWithThreadsFields'); - /** @var Collection $parentThreadsID parent tid of all replies and their sub replies */ - $parentThreadsID = $replies->pluck('tid')->concat($subReplies->pluck('tid'))->unique(); - /** @var Collection $threads */ - $threads = $postModels['thread'] - // from the original $this->queryResult, see Post::scopeSelectCurrentAndParentPostID() - ->tid($parentThreadsID->concat($tids)) - ->selectPublicFields()->get() - ->map(static fn(Thread $thread) => // mark threads that exists in the original $this->queryResult - $thread->setAttribute('isMatchQuery', $tids->contains($thread->tid))); - $this->debugbar->stopMeasure('fillWithThreadsFields'); - - $this->debugbar->startMeasure('fillWithRepliesFields'); - /** @var Collection $parentRepliesID parent pid of all sub replies */ - $parentRepliesID = $subReplies->pluck('pid')->unique(); - $replies = $postModels['reply'] - // from the original $this->queryResult, see Post::scopeSelectCurrentAndParentPostID() - ->pid($parentRepliesID->concat($pids)) - ->selectPublicFields()->with('contentProtoBuf')->get() - ->map(static fn(Reply $r) => // mark replies that exists in the original $this->queryResult - $r->setAttribute('isMatchQuery', $pids->contains($r->pid))); - $this->debugbar->stopMeasure('fillWithRepliesFields'); - - $this->debugbar->startMeasure('fillWithSubRepliesFields'); - $subReplies = $postModels['subReply']->spid($spids) - ->selectPublicFields()->with('contentProtoBuf')->get(); - $this->debugbar->stopMeasure('fillWithSubRepliesFields'); - - $this->debugbar->startMeasure('parsePostContentProtoBufBytes'); - $replies->concat($subReplies)->each(function ($post) { - $post->content = $post->contentProtoBuf?->protoBufBytes?->value; - unset($post->contentProtoBuf); - }); - $this->debugbar->stopMeasure('parsePostContentProtoBufBytes'); - - return [ - 'fid' => $fid, - 'matchQueryPostCount' => collect(Helper::POST_TYPES) - ->combine([$tids, $pids, $spids]) - ->map(static fn(Collection $ids, string $type) => $ids->count()), - 'notMatchQueryParentPostCount' => [ - 'thread' => $parentThreadsID->diff($tids)->count(), - 'reply' => $parentRepliesID->diff($pids)->count(), - ], - ...array_combine(Helper::POST_TYPES_PLURAL, [$threads, $replies, $subReplies]), - ]; - } - - /** - * @param Collection $threads - * @param Collection $replies - * @param Collection $subReplies - * @phpcs:ignore Generic.Files.LineLength.TooLong - * @return Collection>>>>> - * @SuppressWarnings(PHPMD.CamelCaseParameterName) - */ - public function nestPostsWithParent( - Collection $threads, - Collection $replies, - Collection $subReplies, - ...$_, - ): Collection { - $this->debugbar->startMeasure('nestPostsWithParent'); - - $replies = $replies->groupBy('tid'); - $subReplies = $subReplies->groupBy('pid'); - $ret = $threads - ->map(fn(Thread $thread) => [ - ...$thread->toArray(), - 'replies' => $replies - ->get($thread->tid, collect()) - ->map(fn(Reply $reply) => [ - ...$reply->toArray(), - 'subReplies' => $subReplies->get($reply->pid, collect()), - ]), - ]) - ->recursive(); - - $this->debugbar->stopMeasure('nestPostsWithParent'); - return $ret; - } - - /** - * @phpcs:ignore Generic.Files.LineLength.TooLong - * @param Collection>>>>> $nestedPosts - * @return list>>>>> - */ - public function reOrderNestedPosts(Collection $nestedPosts, bool $shouldRemoveSortingKey = true): array - { - $this->debugbar->startMeasure('reOrderNestedPosts'); - - /** - * @param Collection>>> $curPost - * @param string $childPostTypePluralName - * @return Collection>>> - */ - $setSortingKeyFromCurrentAndChildPosts = function ( - Collection $curPost, - string $childPostTypePluralName, - ): Collection { - /** @var Collection> $childPosts sorted child posts */ - $childPosts = $curPost[$childPostTypePluralName]; - $curPost[$childPostTypePluralName] = $childPosts->values(); // reset keys - - // use the topmost value between sorting key or value of orderBy field within its child posts - $curAndChildSortingKeys = collect([ - // value of orderBy field in the first sorted child post that isMatchQuery after previous sorting - $childPosts - // sub replies won't have isMatchQuery - ->filter(static fn(Collection $p) => ($p['isMatchQuery'] ?? true) === true) - // if no child posts matching the query, use null as the sorting key - ->first()[$this->orderByField] ?? null, - // sorting key from the first sorted child posts - // not requiring isMatchQuery since a child post without isMatchQuery - // might have its own child posts with isMatchQuery - // and its sortingKey would be selected from its own child posts - $childPosts->first()['sortingKey'] ?? null, - ]); - if ($curPost['isMatchQuery'] === true) { - // also try to use the value of orderBy field in current post - $curAndChildSortingKeys->push($curPost[$this->orderByField]); - } - - // Collection->filter() will remove falsy values like null - $curAndChildSortingKeys = $curAndChildSortingKeys->filter()->sort(); - $curPost['sortingKey'] = $this->orderByDesc - ? $curAndChildSortingKeys->last() - : $curAndChildSortingKeys->first(); - - return $curPost; - }; - $sortBySortingKey = fn(Collection $posts): Collection => $posts - ->sortBy(fn(Collection $i) => $i['sortingKey'], descending: $this->orderByDesc); - $removeSortingKey = $shouldRemoveSortingKey - ? /** @psalm-return Collection */ - static fn(Collection $posts): Collection => $posts - ->map(fn(Collection $i) => $i->except('sortingKey')) - : static fn($i) => $i; - $ret = $removeSortingKey($sortBySortingKey( - $nestedPosts->map( - /** - * @param Collection{replies: Collection} $thread - * @return Collection{replies: Collection} - */ - function (Collection $thread) use ( - $sortBySortingKey, - $removeSortingKey, - $setSortingKeyFromCurrentAndChildPosts - ) { - $thread['replies'] = $sortBySortingKey($thread['replies']->map( - /** - * @param Collection{subReplies: Collection} $reply - * @return Collection{subReplies: Collection} - */ - function (Collection $reply) use ($setSortingKeyFromCurrentAndChildPosts) { - $reply['subReplies'] = $reply['subReplies']->sortBy( - fn(Collection $subReplies) => $subReplies[$this->orderByField], - descending: $this->orderByDesc, - ); - return $setSortingKeyFromCurrentAndChildPosts($reply, 'subReplies'); - }, - )); - $setSortingKeyFromCurrentAndChildPosts($thread, 'replies'); - $thread['replies'] = $removeSortingKey($thread['replies']); - return $thread; - }, - ), - ))->values()->toArray(); - - $this->debugbar->stopMeasure('reOrderNestedPosts'); - return $ret; - } -} diff --git a/be/app/Http/PostsQuery/CursorCodec.php b/be/app/Http/PostsQuery/CursorCodec.php deleted file mode 100644 index 40784685..00000000 --- a/be/app/Http/PostsQuery/CursorCodec.php +++ /dev/null @@ -1,109 +0,0 @@ - $postsKeyByTypePluralName */ - public function encodeNextCursor(Collection $postsKeyByTypePluralName, string $orderByField): string - { - $encodedCursorsKeyByPostType = $postsKeyByTypePluralName - ->mapWithKeys(static fn(Collection $posts, string $type) => [ - Helper::POST_TYPE_PLURAL_TO_SINGULAR[$type] => $posts->last(), // null when no posts - ]) // [singularPostTypeName => lastPostInResult] - ->filter() // remove post types that have no posts - ->map(fn(Post $post, string $typePluralName) => [ // [postID, orderByField] - $post->getAttribute(Helper::POST_TYPE_TO_ID[$typePluralName]), - $post->getAttribute($orderByField), - ]) - ->map(static fn(array $cursors) => collect($cursors) - ->map(static function (int|string $cursor): string { - if ($cursor === 0) { // quick exit to keep 0 as is - // to prevent packed 0 with the default format 'P' after 0x00 trimming is an empty string - // that will be confused with post types without a cursor that is a blank encoded cursor ',,' - return '0'; - } - $prefix = match (true) { - \is_int($cursor) && $cursor < 0 => '-', - \is_string($cursor) => 'S', - default => '', - }; - - $value = \is_int($cursor) - // remove trailing 0x00 for an unsigned int or 0xFF for a signed negative int - ? rtrim(pack('P', $cursor), $cursor >= 0 ? "\x00" : "\xFF") - : ($prefix === 'S' - // keep string as is since encoded string will always longer than the original string - ? $cursor - : throw new \RuntimeException('Invalid cursor value')); - if ($prefix !== 'S') { - // https://en.wikipedia.org/wiki/Base64#URL_applications - $value = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($value)); - } - - return $prefix . ($prefix === '' ? '' : ':') . $value; - }) - ->join(',')); - return collect(Helper::POST_TYPES) - // merge cursors into flipped Helper::POST_TYPES with the same post type key - // value of keys that non exists in $encodedCursorsKeyByPostType will remain as int - ->flip()->merge($encodedCursorsKeyByPostType) - // if the flipped value is a default int key there's no posts of this type - // (type key not exists in $postsKeyByTypePluralName) - // so we just return an empty ',' as placeholder - ->map(static fn(string|int $cursor) => \is_int($cursor) ? ',' : $cursor) - ->join(','); - } - - /** @psalm-return Collection<'reply'|'subReply'|'thread', Cursor> */ - public function decodeCursor(string $encodedCursors, string $orderByField): Collection - { - return collect(Helper::POST_TYPES) - ->combine(Str::of($encodedCursors) - ->explode(',') - ->map(static function (string $encodedCursor): int|string|null { - /** - * @var string $cursor - * @var string $prefix - */ - [$prefix, $cursor] = array_pad(explode(':', $encodedCursor), 2, null); - if ($cursor === null) { // no prefix being provided means the value of cursor is a positive int - $cursor = $prefix; - $prefix = ''; - } - return $cursor === '0' ? 0 : match ($prefix) { // keep 0 as is - 'S' => $cursor, // string literal is not base64 encoded - default => ((array) ( - unpack( - format: 'P', - string: str_pad( // re-add removed trailing 0x00 or 0xFF - base64_decode( - // https://en.wikipedia.org/wiki/Base64#URL_applications - str_replace(['-', '_'], ['+', '/'], $cursor), - ), - length: 8, - pad_string: $prefix === '-' ? "\xFF" : "\x00", - ), - ) - ))[1], // the returned array of unpack() will starts index from 1 - }; - }) - ->chunk(2) // split six values into three post type pairs - ->map(static fn(Collection $i) => $i->values())) // reorder keys after chunk - ->mapWithKeys(fn(Collection $cursors, string $postType) => - [$postType => - $cursors->mapWithKeys(fn(int|string|null $cursor, int $index) => - [$index === 0 ? Helper::POST_TYPE_TO_ID[$postType] : $orderByField => $cursor]), - ]) - // filter out cursors with all fields value being null, their encoded cursor is ',,' - ->reject(static fn(Collection $cursors) => - $cursors->every(static fn(int|string|null $cursor) => $cursor === null)) - ->map(static fn(Collection $cursors) => new Cursor($cursors->all())); - } -} diff --git a/be/app/Http/PostsQuery/IndexQuery.php b/be/app/Http/PostsQuery/IndexQuery.php deleted file mode 100644 index 9c807026..00000000 --- a/be/app/Http/PostsQuery/IndexQuery.php +++ /dev/null @@ -1,107 +0,0 @@ - $flatParams key by param name */ - $flatParams = array_reduce( - $params->pick(...ParamsValidator::UNIQUE_PARAMS_NAME, ...Helper::POST_ID), - static fn(array $accParams, QueryParam $param) => - [...$accParams, $param->name => $param->value, ...$param->getAllSub()], - [], - ); // flatten unique query params - /** @var Collection $postIDParam key by post ID name, should contains only one param */ - $postIDParam = collect($flatParams)->only(Helper::POST_ID); - $postIDParamName = $postIDParam->keys()->first(); - $postIDParamValue = $postIDParam->first(); - $hasPostIDParam = $postIDParam->count() === 1; - /** @var array $postTypes */ - $postTypes = $flatParams['postTypes']; - - /** - * @param int $fid - * @return Collection key by post type - */ - $getQueryBuilders = static fn(int $fid): Collection => - collect(PostFactory::getPostModelsByFid($fid)) - ->only($postTypes) - ->transform(static fn(Post $model, string $type) => $model->selectCurrentAndParentPostID()); - $getFidByPostIDParam = static function (string $postIDName, int $postID): int { - $counts = Forum::get('fid') - ->pluck('fid') - ->map(static fn(int $fid) => - PostFactory::getPostModelsByFid($fid)[Helper::POST_ID_TO_TYPE[$postIDName]] - ->selectRaw("{$fid} AS fid, COUNT(*) AS count") - ->where($postIDName, $postID)) - ->reduce(/** @return BuilderContract|EloquentBuilder|QueryBuilder */ - static fn( - ?BuilderContract $acc, - EloquentBuilder|QueryBuilder $cur, - ): EloquentBuilder|QueryBuilder|BuilderContract => - $acc === null ? $cur : $acc->union($cur), - ) - ->get() - ->where('count', '!=', 0); - Helper::abortAPIIf(50001, $counts->count() > 1); - Helper::abortAPIIf(40401, $counts->count() === 0); - return $counts->pluck('fid')->first(); - }; - - if (\array_key_exists('fid', $flatParams)) { - /** @var int $fid */ $fid = $flatParams['fid']; - if (Forum::fid($fid)->exists()) { - /** @var Collection> $queries key by post type */ - $queries = $getQueryBuilders($fid); - } elseif ($hasPostIDParam) { // query by post ID and fid, but the provided fid is invalid - $fid = $getFidByPostIDParam($postIDParamName, $postIDParamValue); - $queries = $getQueryBuilders($fid); - } else { - Helper::abortAPI(40406); - } - } elseif ($hasPostIDParam) { // query by post ID only - $fid = $getFidByPostIDParam($postIDParamName, $postIDParamValue); - $queries = $getQueryBuilders($fid); - } else { - Helper::abortAPI(40001); - } - - if ($hasPostIDParam) { - $queries = $queries - ->only(\array_slice( - Helper::POST_TYPES, // only query post types that own the querying post ID param - array_search($postIDParamName, Helper::POST_ID, true), - )) - ->map(static fn(EloquentBuilder $qb, string $type) => - $qb->where($postIDParamName, $postIDParamValue)); - } - - if (array_diff($postTypes, Helper::POST_TYPES) !== []) { - $queries = $queries->only($postTypes); - } - - if ($flatParams['orderBy'] === 'default') { - $this->orderByField = 'postedAt'; // order by postedAt to prevent posts out of order when order by post ID - if (\array_key_exists('fid', $flatParams) && $postIDParam->count() === 0) { // query by fid only - $this->orderByDesc = true; - } elseif ($hasPostIDParam) { // query by post ID (with or without fid) - $this->orderByDesc = false; - } - } - - $this->setResult($fid, $queries, $cursor, $hasPostIDParam ? $postIDParamName : null); - return $this; - } -} diff --git a/be/app/Http/PostsQuery/ParamsValidator.php b/be/app/Http/PostsQuery/ParamsValidator.php deleted file mode 100644 index 28c41b37..00000000 --- a/be/app/Http/PostsQuery/ParamsValidator.php +++ /dev/null @@ -1,159 +0,0 @@ -validateParamsValue($params); - $this->params = new QueryParams($params); - $this->validate40001(); - $this->validate40005(); - } - - public function addDefaultParamsThenValidate(bool $shouldSkip40003): void - { - $this->params->addDefaultValueOnParams(); - $this->params->addDefaultValueOnUniqueParams(); - // sort here to prevent further sort while validating - $sortedPostTypes = collect($this->params->getUniqueParamValue('postTypes'))->sort()->values()->all(); - $this->params->setUniqueParamValue('postTypes', $sortedPostTypes); - $currentPostTypes = (array) $this->params->getUniqueParamValue('postTypes'); - if (!$shouldSkip40003) { - $this->validate40003($currentPostTypes); - } - $this->validate40004($currentPostTypes); - } - - private function validateParamsValue(array $params): void - { - $paramsPossibleValue = [ - 'userGender' => [0, 1, 2], - 'userManagerType' => ['NULL', 'manager', 'assist', 'voiceadmin'], - ]; - $dateRangeValidator = function ($_, string $value): void { - $this->validator->make( - explode(',', $value), - ['0' => 'date|before_or_equal:1', '1' => 'date|after_or_equal:0'], - )->validate(); - }; - // note here we haven't validated that is every sub param have a corresponding main param yet - $this->validator->make($params, [ - '*.fid' => 'integer', - '*.postTypes' => 'array|in:thread,reply,subReply', - '*.orderBy' => 'string|in:postedAt,tid,pid,spid', - '*.direction' => 'in:ASC,DESC', - '*.tid' => 'integer', - '*.pid' => 'integer', - '*.spid' => 'integer', - '*.postedAt' => $dateRangeValidator, - '*.latestReplyPostedAt' => $dateRangeValidator, - '*.threadViewCount' => 'integer', - '*.threadShareCount' => 'integer', - '*.threadReplyCount' => 'integer', - '*.replySubReplyCount' => 'integer', - '*.threadProperties' => 'array|in:good,sticky', - '*.authorUid' => 'integer', - '*.authorExpGrade' => 'integer', - '*.authorGender' => Rule::in($paramsPossibleValue['userGender']), - '*.authorManagerType' => Rule::in($paramsPossibleValue['userManagerType']), - '*.latestReplierUid' => 'integer', - '*.latestReplierGender' => Rule::in($paramsPossibleValue['userGender']), - - '*.not' => 'boolean', - // sub param of tid, pid, spid - // threadViewCount, threadShareCount, threadReplyCount, replySubReplyCount - // authorUid, authorExpGrade, latestReplierUid - '*.range' => 'in:<,=,>,IN,BETWEEN', - // sub param of threadTitle, postContent - // authorName, authorDisplayName - // latestReplierName, latestReplierDisplayName - '*.matchBy' => 'in:implicit,explicit,regex', - '*.spaceSplit' => 'boolean', - ])->validate(); - } - - private function validate40001(): void - { - // only fill postTypes and/or orderBy uniqueParam doesn't query anything - Helper::abortAPIIf(40001, $this->params->count() === \count($this->params->pick('postTypes', 'orderBy'))); - } - - private function validate40005(): void - { - foreach (self::UNIQUE_PARAMS_NAME as $uniqueParamName) { // is all unique param only appeared once - Helper::abortAPIIf(40005, \count($this->params->pick($uniqueParamName)) > 1); - } - } - - private static function isRequiredPostTypes(array $current, array $required): bool - { - /** @var 'SUB' | 'All' $coverage */ - /** @var array $postTypes */ - [$coverage, $postTypes] = $required; - $postTypes = Arr::sort($postTypes); - return match ($coverage) { - 'SUB' => array_diff($current, $postTypes) === [], - 'ALL' => $current === $postTypes, - default => throw new \Exception(), - }; - } - - public const array REQUIRED_POST_TYPES_KEY_BY_PARAM_NAME = [ - 'pid' => ['SUB', ['reply', 'subReply']], - 'spid' => ['ALL', ['subReply']], - 'latestReplyPostedAt' => ['ALL', ['thread']], - 'threadTitle' => ['ALL', ['thread']], - 'postContent' => ['SUB', ['reply', 'subReply']], - 'threadViewCount' => ['ALL', ['thread']], - 'threadShareCount' => ['ALL', ['thread']], - 'threadReplyCount' => ['ALL', ['thread']], - 'replySubReplyCount' => ['ALL', ['reply']], - 'threadProperties' => ['ALL', ['thread']], - 'authorExpGrade' => ['SUB', ['reply', 'subReply']], - 'latestReplierUid' => ['ALL', ['thread']], - 'latestReplierName' => ['ALL', ['thread']], - 'latestReplierDisplayName' => ['ALL', ['thread']], - 'latestReplierGender' => ['ALL', ['thread']], - ]; - - private function validate40003(array $currentPostTypes): void - { - foreach (self::REQUIRED_POST_TYPES_KEY_BY_PARAM_NAME as $paramName => $requiredPostTypes) { - if ($this->params->pick($paramName) !== []) { - Helper::abortAPIIfNot(40003, self::isRequiredPostTypes($currentPostTypes, $requiredPostTypes)); - } - } - } - - public const array REQUIRED_POST_TYPES_KEY_BY_ORDER_BY_VALUE = [ - 'pid' => ['SUB', ['reply', 'subReply']], - 'spid' => ['SUB', ['subReply']], - ]; - - private function validate40004(array $currentPostTypes): void - { - $currentOrderBy = (string) $this->params->getUniqueParamValue('orderBy'); - if (\array_key_exists($currentOrderBy, self::REQUIRED_POST_TYPES_KEY_BY_ORDER_BY_VALUE)) { - Helper::abortAPIIfNot( - 40004, - self::isRequiredPostTypes( - $currentPostTypes, - self::REQUIRED_POST_TYPES_KEY_BY_ORDER_BY_VALUE[$currentOrderBy], - ), - ); - } - } -} diff --git a/be/app/Http/PostsQuery/QueryParam.php b/be/app/Http/PostsQuery/QueryParam.php deleted file mode 100644 index 302a9032..00000000 --- a/be/app/Http/PostsQuery/QueryParam.php +++ /dev/null @@ -1,38 +0,0 @@ -name = (string) array_keys($param)[0]; - if (is_numeric($this->name)) { - throw new \InvalidArgumentException(); - } - $this->value = $param[$this->name]; - array_shift($param); - $this->subParams = $param; - } - - public function getAllSub(): array - { - return $this->subParams; - } - - public function getSub(string $name) - { - return $this->subParams[$name] ?? null; - } - - public function setSub(string $name, array|string|int $value): void - { - $this->subParams[$name] = $value; - } -} diff --git a/be/app/Http/PostsQuery/QueryParams.php b/be/app/Http/PostsQuery/QueryParams.php deleted file mode 100644 index fc25f3a3..00000000 --- a/be/app/Http/PostsQuery/QueryParams.php +++ /dev/null @@ -1,128 +0,0 @@ -params = array_map(static fn(array $p) => new QueryParam($p), $params); - } - - /** @psalm-return int<0, max> */ - public function count(): int - { - return count($this->params); - } - - /** - * @return QueryParam[] - * @psalm-return list - */ - public function pick(string ...$names): array - { - // array_values() will reset keys - return array_values(array_filter( - $this->params, - static fn($p): bool => \in_array($p->name, $names, true), - )); - } - - /** - * @return QueryParam[] - * @psalm-return list - */ - public function omit(string ...$names): array - { - return array_values(array_filter( - $this->params, - static fn($p): bool => !\in_array($p->name, $names, true), - )); - } - - public function getUniqueParamValue(string $name): mixed - { - return $this->pick($name)[0]->value ?? null; - } - - public function setUniqueParamValue(string $name, mixed $value): void - { - $this->params[$this->getParamsIndexByName($name)[0]]->value = $value; - } - - /** @return int[] */ - protected function getParamsIndexByName(string $name): array - { - return array_keys(array_filter($this->params, static fn($p) => $p->name === $name)); - } - - /** @SuppressWarnings(PHPMD.ElseExpression) */ - public function addDefaultValueOnUniqueParams(): void - { - $uniqueParamsDefaultValue = [ - 'postTypes' => ['value' => Helper::POST_TYPES], - 'orderBy' => ['value' => 'default', 'subParam' => ['direction' => 'ASC']], - ]; - foreach ($uniqueParamsDefaultValue as $name => $value) { - // add unique params with default value when it's not presented in $this->params - $paramFilledWithDefaults = new QueryParam([ - $name => $this->getUniqueParamValue($name) ?? $value['value'], - ...($this->pick($name)[0]->subParam ?? $value['subParam'] ?? []), - ]); - $paramsIndex = $this->getParamsIndexByName($name); - if ($paramsIndex === []) { - $this->params[] = $paramFilledWithDefaults; - } else { - $this->params[$paramsIndex[0]] = $paramFilledWithDefaults; - } - } - } - - public const array PARAM_DEFAULT_VALUE_KEY_BY_TYPE = [ - 'numeric' => ['range' => '='], - 'text' => ['matchBy' => 'explicit', 'spaceSplit' => false], - ]; - - public const array PARAM_NAME_KEY_BY_TYPE = [ - 'numeric' => [ - 'tid', - 'pid', - 'spid', - 'threadViewCount', - 'threadShareCount', - 'threadReplyCount', - 'replySubReplyCount', - 'authorUid', - 'authorExpGrade', - 'latestReplierUid', - ], - 'text' => [ - 'threadTitle', - 'postContent', - 'authorName', - 'authorDisplayName', - 'latestReplierName', - 'latestReplierDisplayName', - ], - ]; - - public function addDefaultValueOnParams(): void - { - $subParamsDefaultValue = collect(self::PARAM_NAME_KEY_BY_TYPE) - ->mapWithKeys(static fn(array $names, string $type) => - array_fill_keys($names, self::PARAM_DEFAULT_VALUE_KEY_BY_TYPE[$type])); - foreach ($this->params as $param) { // set sub params with default value - foreach ($subParamsDefaultValue->get($param->name, []) as $name => $value) { - if ($param->getSub($name) === null) { - $param->setSub($name, $value); - } - } - } - } -} diff --git a/be/app/Http/PostsQuery/SearchQuery.php b/be/app/Http/PostsQuery/SearchQuery.php deleted file mode 100644 index 658c4df2..00000000 --- a/be/app/Http/PostsQuery/SearchQuery.php +++ /dev/null @@ -1,163 +0,0 @@ -getUniqueParamValue('fid'); - /** @var array>> $cachedUserQuery key by param name */ - $cachedUserQuery = []; - /** @var Collection> $queries key by post type */ - $queries = collect(PostFactory::getPostModelsByFid($fid)) - ->only($params->getUniqueParamValue('postTypes')) - ->map(function (Post $postModel) use ($params, &$cachedUserQuery): Builder { - $postQuery = $postModel->newQuery(); - foreach ($params->omit() as $param) { // omit nothing to get all params - // even when $cachedUserQuery[$param->name] is null - // it will still pass as a reference to the array item - // that is null at this point, but will be later updated by ref - $postQuery = self::applyQueryParamsOnQuery( - $postQuery, - $param, - $cachedUserQuery[$param->name], - ); - } - return $postQuery->selectCurrentAndParentPostID(); - }); - - $orderByParam = $params->pick('orderBy')[0]; - $this->orderByField = $orderByParam->value; - $this->orderByDesc = $orderByParam->getSub('direction'); - if ($this->orderByField === 'default') { - $this->orderByField = 'postedAt'; - $this->orderByDesc = true; - } - - $this->setResult($fid, $queries, $cursor); - return $this; - } - - /** - * Apply conditions of query params on a query builder that created from posts model - */ - private static function applyQueryParamsOnQuery( - Builder $query, - QueryParam $param, - ?Collection &$outCachedUserQueryResult, - ): Builder { - $name = $param->name; - $value = $param->value; - $sub = $param->getAllSub(); - $sub['not'] ??= false; - $not = $sub['not'] ? 'Not' : ''; - $inverseNot = $sub['not'] ? '' : 'Not'; - - $fieldNameOfNumericParams = [ - 'threadViewCount' => 'viewCount', - 'threadShareCount' => 'shareCount', - 'threadReplyCount' => 'replyCount', - 'replySubReplyCount' => 'subReplyCount', - ][$name] ?? $name; - $inverseRangeOfNumericParams = [ - '<' => '>=', - '=' => '!=', - '>' => '<=', - ][$sub['range'] ?? null] ?? null; - - $userTypeOfUserParams = str_starts_with($name, 'author') ? 'author' : 'latestReplier'; - $fieldNameOfUserNameParams = str_ends_with($name, 'DisplayName') ? 'displayName' : 'name'; - $getAndCacheUserQuery = - static function (BuilderContract $newQueryWhenCacheMiss) use (&$outCachedUserQueryResult): Collection { - // $outCachedUserQueryResult === null means it's the first call - $outCachedUserQueryResult ??= $newQueryWhenCacheMiss->get(); - return $outCachedUserQueryResult; - }; - - return match ($name) { - // numeric - 'tid', 'pid', 'spid', - 'authorUid', 'authorExpGrade', 'latestReplierUid', - 'threadViewCount', 'threadShareCount', 'threadReplyCount', 'replySubReplyCount' => - $sub['range'] === 'IN' || $sub['range'] === 'BETWEEN' - ? $query->{"where$not{$sub['range']}"}($fieldNameOfNumericParams, explode(',', $value)) - : $query->where( - $fieldNameOfNumericParams, - $sub['not'] ? $inverseRangeOfNumericParams : $sub['range'], - $value, - ), - // textMatch - 'threadTitle', 'postContent' => - self::applyTextMatchParamOnQuery($query, $name === 'threadTitle' ? 'title' : 'content', $value, $sub), - // dateTimeRange - 'postedAt', 'latestReplyPostedAt' => - $query->{"where{$not}Between"}($name, explode(',', $value)), - // array - 'threadProperties' => static function () use ($sub, $inverseNot, $value, $query) { - foreach ($value as $threadProperty) { - match ($threadProperty) { - 'good' => $query->where('isGood', !$sub['not']), - 'sticky' => $query->{"where{$inverseNot}null"}('stickyType'), - }; - } - return $query; - }, - 'authorName', 'latestReplierName', 'authorDisplayName', 'latestReplierDisplayName' => - $query->{"where{$not}In"}( - "{$userTypeOfUserParams}Uid", - $getAndCacheUserQuery(self::applyTextMatchParamOnQuery( - User::select('uid'), - $fieldNameOfUserNameParams, - $value, - $sub, - )) - ), - 'authorGender', 'latestReplierGender' => - $query->{"where{$not}In"}( - "{$userTypeOfUserParams}Uid", - $getAndCacheUserQuery(User::select('uid')->where('gender', $value)) - ), - 'authorManagerType' => - $value === 'NULL' - ? $query->{"where{$not}null"}('authorManagerType') - : $query->where('authorManagerType', $sub['not'] ? '!=' : '=', $value), - default => $query, - }; - } - - /** @psalm-param array $subParams */ - private static function applyTextMatchParamOnQuery( - BuilderContract $query, - string $field, - string $value, - array $subParams, - ): BuilderContract { - $not = $subParams['not'] === true ? 'Not' : ''; - if ($subParams['matchBy'] === 'regex') { - return $query->where($field, "$not REGEXP", $value); - } - return $query->where(static function (Builder $subQuery) use ($subParams, $field, $not, $value) { - // not (A or B) <=> not A and not B, following https://en.wikipedia.org/wiki/De_Morgan%27s_laws - $isOrWhere = $not === 'Not' ? '' : 'or'; - $addMatchKeyword = static fn(string $keyword) => - $subQuery->{"{$isOrWhere}Where"}( - $field, - trim("$not LIKE"), - $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword - ); - // split multiple search keyword by space char when $subParams['spaceSplit'] == true - foreach ($subParams['spaceSplit'] ? explode(' ', $value) : [$value] as $keyword) { - $addMatchKeyword($keyword); - } - }); - } -} diff --git a/be/app/Providers/AppServiceProvider.php b/be/app/Providers/AppServiceProvider.php deleted file mode 100644 index 27e46270..00000000 --- a/be/app/Providers/AppServiceProvider.php +++ /dev/null @@ -1,25 +0,0 @@ -handleCommand(new ArgvInput); - -exit($status); diff --git a/symfony/bin/console b/be/bin/console similarity index 100% rename from symfony/bin/console rename to be/bin/console diff --git a/symfony/bin/phpunit b/be/bin/phpunit similarity index 100% rename from symfony/bin/phpunit rename to be/bin/phpunit diff --git a/be/bootstrap/app.php b/be/bootstrap/app.php deleted file mode 100644 index 2516b14f..00000000 --- a/be/bootstrap/app.php +++ /dev/null @@ -1,21 +0,0 @@ -withRouting( - web: __DIR__ . '/../routes/web.php', - api: __DIR__ . '/../routes/api.php', - health: '/up', - ) - ->withMiddleware(function (Middleware $middleware) { - $middleware->appendToGroup('api', [\App\Http\Middleware\DumpJsonResponse::class]); - }) - ->withSingletons([ - Illuminate\Contracts\Debug\ExceptionHandler::class => App\Exceptions\Handler::class, - ]) - ->withExceptions(function (Exceptions $exceptions) { - // - })->create(); diff --git a/be/bootstrap/cache/.gitignore b/be/bootstrap/cache/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/bootstrap/cache/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/be/bootstrap/providers.php b/be/bootstrap/providers.php deleted file mode 100644 index 38b258d1..00000000 --- a/be/bootstrap/providers.php +++ /dev/null @@ -1,5 +0,0 @@ -2.2,<2.4" }, "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" + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, "autoload": { "psr-4": { - "Dflydev\\DotAccessData\\": "src/" + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" } }, "notification-url": "https://packagist.org/downloads/", @@ -176,69 +115,89 @@ ], "authors": [ { - "name": "Dragonfly Development Inc.", - "email": "info@dflydev.com", - "homepage": "http://dflydev.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "name": "Carlos Frutos", - "email": "carlos@kiwing.it", - "homepage": "https://github.com/cfrutos" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" }, { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com" + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Given a deep data structure, access data by dot notation.", - "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", "keywords": [ - "access", - "data", - "dot", - "notation" + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" ], "support": { - "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" }, - "time": "2024-07-08T12:26:09+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%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" }, { - "name": "doctrine/inflector", - "version": "2.0.10", + "name": "doctrine/collections", + "version": "2.2.2", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + "url": "https://github.com/doctrine/collections.git", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "doctrine/deprecations": "^1", + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^11.0", + "doctrine/coding-standard": "^12", + "ext-json": "*", "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" + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Common\\Collections\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -267,23 +226,17 @@ "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", + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" + "array", + "collections", + "iterators", + "php" ], "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -295,40 +248,54 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", "type": "tidelift" } ], - "time": "2024-02-18T20:23:39+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { - "name": "doctrine/lexer", - "version": "3.0.1", + "name": "doctrine/dbal", + "version": "4.1.1", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + "url": "https://github.com/doctrine/dbal.git", + "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/7a8252418689feb860ea8dfeab66d64a56a64df8", + "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8", "shasum": "" }, "require": { - "php": "^8.1" + "doctrine/deprecations": "^0.5.3|^1", + "php": "^8.1", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "1.12.0", + "phpstan/phpstan-phpunit": "1.4.0", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "10.5.30", + "psalm/plugin-phpunit": "0.19.0", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^6.3.8|^7.0", + "symfony/console": "^5.4|^6.3|^7.0", + "vimeo/psalm": "5.25.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" + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "Doctrine\\DBAL\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -345,22 +312,39 @@ "email": "roman@code-factory.org" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.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", + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.1" + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/4.1.1" }, "funding": [ { @@ -372,108 +356,127 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", "type": "tidelift" } ], - "time": "2024-02-05T11:56:58+00:00" + "time": "2024-09-03T08:58:39+00:00" }, { - "name": "dragonmantank/cron-expression", - "version": "v3.3.3", + "name": "doctrine/deprecations", + "version": "1.1.3", "source": { "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { - "php": "^7.2|^8.0", - "webmozart/assert": "^1.0" - }, - "replace": { - "mtdowling/cron-expression": "^1.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-webmozart-assert": "^1.0", - "phpunit/phpunit": "^7.0|^8.0|^9.0" + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "type": "library", "autoload": { "psr-4": { - "Cron\\": "src/Cron/" + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], + "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/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "funding": [ - { - "url": "https://github.com/dragonmantank", - "type": "github" - } - ], - "time": "2023-08-10T19:36:49+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { - "name": "egulias/email-validator", - "version": "4.0.2", + "name": "doctrine/doctrine-bundle", + "version": "2.13.0", "source": { "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", "shasum": "" }, "require": { - "doctrine/lexer": "^2.0 || ^3.0", - "php": ">=8.1", - "symfony/polyfill-intl-idn": "^1.26" + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/persistence": "^2.2 || ^3", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.4 || ^8.0", + "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/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" + }, + "conflict": { + "doctrine/annotations": ">=3.0", + "doctrine/orm": "<2.17 || >=4.0", + "twig/twig": "<1.34 || >=2.0 <2.4" }, "require-dev": { - "phpunit/phpunit": "^10.2", - "vimeo/psalm": "^5.12" + "doctrine/annotations": "^1 || ^2", + "doctrine/coding-standard": "^12", + "doctrine/deprecations": "^1.0", + "doctrine/orm": "^2.17 || ^3.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^5", + "psr/log": "^1.1.4 || ^2.0 || ^3.0", + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^5.15" }, "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." }, + "type": "symfony-bundle", "autoload": { "psr-4": { - "Egulias\\EmailValidator\\": "src" + "Doctrine\\Bundle\\DoctrineBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -482,62 +485,80 @@ ], "authors": [ { - "name": "Eduardo Gulias Davis" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org/" } ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", + "description": "Symfony DoctrineBundle", + "homepage": "https://www.doctrine-project.org", "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" + "database", + "dbal", + "orm", + "persistence" ], "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.0" }, "funding": [ { - "url": "https://github.com/egulias", - "type": "github" + "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%2Fdoctrine-bundle", + "type": "tidelift" } ], - "time": "2023-10-06T06:47:41+00:00" + "time": "2024-09-01T09:46:40+00:00" }, { - "name": "fruitcake/php-cors", - "version": "v1.3.0", + "name": "doctrine/event-manager", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/fruitcake/php-cors.git", - "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", - "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", "shasum": "" }, "require": { - "php": "^7.4|^8.0", - "symfony/http-foundation": "^4.4|^5.4|^6|^7" + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^9", - "squizlabs/php_codesniffer": "^3.5" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, "autoload": { "psr-4": { - "Fruitcake\\Cors\\": "src/" + "Doctrine\\Common\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -546,158 +567,248 @@ ], "authors": [ { - "name": "Fruitcake", - "homepage": "https://fruitcake.nl" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" }, { - "name": "Barryvdh", - "email": "barryvdh@gmail.com" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", - "homepage": "https://github.com/fruitcake/php-cors", + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", "keywords": [ - "cors", - "laravel", - "symfony" + "event", + "event dispatcher", + "event manager", + "event system", + "events" ], "support": { - "issues": "https://github.com/fruitcake/php-cors/issues", - "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" }, "funding": [ { - "url": "https://fruitcake.nl", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2023-10-12T05:21:21+00:00" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2024-05-22T20:47:39+00:00" }, { - "name": "google/protobuf", - "version": "v4.28.2", + "name": "doctrine/inflector", + "version": "2.0.10", "source": { "type": "git", - "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e" + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/96021a9a8a5aa7770427b1e7ef1b2e543792684e", - "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": ">=5.0.0" - }, - "suggest": { - "ext-bcmath": "Need to support JSON deserialization" + "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": { - "Google\\Protobuf\\": "src/Google/Protobuf", - "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "description": "proto library for PHP", - "homepage": "https://developers.google.com/protocol-buffers/", + "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": [ - "proto" + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.28.2" + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" }, - "time": "2024-09-18T20:56:15+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%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" }, { - "name": "google/recaptcha", - "version": "1.3.0", + "name": "doctrine/instantiator", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/google/recaptcha.git", - "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/google/recaptcha/zipball/d59a801e98a4e9174814a6d71bbc268dff1202df", - "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": ">=8" + "php": "^8.1" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.14", - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^10" + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, "autoload": { "psr-4": { - "ReCaptcha\\": "src/ReCaptcha" + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", - "homepage": "https://www.google.com/recaptcha/", + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ - "Abuse", - "captcha", - "recaptcha", - "spam" + "constructor", + "instantiate" ], "support": { - "forum": "https://groups.google.com/forum/#!forum/recaptcha", - "issues": "https://github.com/google/recaptcha/issues", - "source": "https://github.com/google/recaptcha" + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, - "time": "2023-02-18T17:41:46+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%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" }, { - "name": "graham-campbell/result-type", - "version": "v1.1.3", + "name": "doctrine/lexer", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3" + "php": "^8.1" }, "require-dev": { - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" }, "type": "library", "autoload": { "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -706,86 +817,95 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "An Implementation Of The Result Type", + "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": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" + "annotations", + "docblock", + "lexer", + "parser", + "php" ], "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" + "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/graham-campbell/result-type", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", "type": "tidelift" } ], - "time": "2024-07-20T21:45:45+00:00" + "time": "2024-02-05T11:56:58+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "name": "doctrine/orm", + "version": "3.2.2", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "url": "https://github.com/doctrine/orm.git", + "reference": "831a1eb7d260925528cdbb49cc1866c0357cf147" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/doctrine/orm/zipball/831a1eb7d260925528cdbb49cc1866c0357cf147", + "reference": "831a1eb7d260925528cdbb49cc1866c0357cf147", "shasum": "" }, "require": { - "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" + "composer-runtime-api": "^2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1", + "ext-ctype": "*", + "php": "^8.1", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.3.9 || ^7.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" + "doctrine/coding-standard": "^12.0", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "1.11.1", + "phpunit/phpunit": "^10.4.0", + "psr/log": "^1 || ^2 || ^3", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^5.4 || ^6.2 || ^7.0", + "vimeo/psalm": "5.24.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" + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "GuzzleHttp\\": "src/" + "Doctrine\\ORM\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -794,104 +914,74 @@ ], "authors": [ { - "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": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" }, { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "Guzzle is a PHP HTTP client library", + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" + "database", + "orm" ], "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/3.2.2" }, - "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" + "time": "2024-08-23T10:03:52+00:00" }, { - "name": "guzzlehttp/promises", - "version": "2.0.3", + "name": "doctrine/persistence", + "version": "3.3.3", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "url": "https://github.com/doctrine/persistence.git", + "reference": "b337726451f5d530df338fc7f68dee8781b49779" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", + "reference": "b337726451f5d530df338fc7f68dee8781b49779", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "doctrine/coding-standard": "^12", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.11.1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.24.0" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" + "Doctrine\\Persistence\\": "src/Persistence" } }, "notification-url": "https://packagist.org/downloads/", @@ -900,92 +990,90 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" }, { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" }, { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "Guzzle promises library", + "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": [ - "promise" + "mapper", + "object", + "odm", + "orm", + "persistence" ], "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.3.3" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" }, { - "url": "https://github.com/Nyholm", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-06-20T10:14:30+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.7.0", + "name": "doctrine/sql-formatter", + "version": "1.5.0", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "16ca9e39877369d664f06dacde468548298bdc40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/16ca9e39877369d664f06dacde468548298bdc40", + "reference": "16ca9e39877369d664f06dacde468548298bdc40", "shasum": "" }, "require": { - "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" + "php": "^8.1" }, "require-dev": { - "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" + "doctrine/coding-standard": "^12", + "ergebnis/phpunit-slow-test-detector": "^2.14", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, + "bin": [ + "bin/sql-formatter" + ], "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" + "Doctrine\\SqlFormatter\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -994,319 +1082,89 @@ ], "authors": [ { - "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": "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" + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "https://jeremydorn.com/" } ], - "description": "PSR-7 message implementation that also provides common utility methods", + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" + "highlight", + "sql" ], "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.0" }, - "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" + "time": "2024-09-11T07:29:40+00:00" }, { - "name": "guzzlehttp/uri-template", - "version": "v1.0.3", + "name": "google/protobuf", + "version": "v4.28.2", "source": { "type": "git", - "url": "https://github.com/guzzle/uri-template.git", - "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", - "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/96021a9a8a5aa7770427b1e7ef1b2e543792684e", + "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-php80": "^1.24" + "php": ">=7.0.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", - "uri-template/tests": "1.0.0" + "phpunit/phpunit": ">=5.0.0" }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" }, + "type": "library", "autoload": { "psr-4": { - "GuzzleHttp\\UriTemplate\\": "src" + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "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": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - } + "BSD-3-Clause" ], - "description": "A polyfill class for uri_template of PHP", + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", "keywords": [ - "guzzlehttp", - "uri-template" + "proto" ], "support": { - "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.28.2" }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", - "type": "tidelift" - } - ], - "time": "2023-12-03T19:50:20+00:00" + "time": "2024-09-18T20:56:15+00:00" }, { - "name": "laravel/framework", - "version": "v11.23.5", + "name": "illuminate/collections", + "version": "v11.26.0", "source": { "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "16b31ab0e1dad5cb2ed6dcc1818c02f02fc48453" + "url": "https://github.com/illuminate/collections.git", + "reference": "4d333ea19a27230b424b9af56f34cd658b5bbce2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/16b31ab0e1dad5cb2ed6dcc1818c02f02fc48453", - "reference": "16b31ab0e1dad5cb2ed6dcc1818c02f02fc48453", + "url": "https://api.github.com/repos/illuminate/collections/zipball/4d333ea19a27230b424b9af56f34cd658b5bbce2", + "reference": "4d333ea19a27230b424b9af56f34cd658b5bbce2", "shasum": "" }, "require": { - "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.3.2", - "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", - "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.18", - "laravel/serializable-closure": "^1.3", - "league/commonmark": "^2.2.1", - "league/flysystem": "^3.8.0", - "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.72.2|^3.0", - "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", - "symfony/error-handler": "^7.0", - "symfony/finder": "^7.0", - "symfony/http-foundation": "^7.0", - "symfony/http-kernel": "^7.0", - "symfony/mailer": "^7.0", - "symfony/mime": "^7.0", - "symfony/polyfill-php83": "^1.28", - "symfony/process": "^7.0", - "symfony/routing": "^7.0", - "symfony/uid": "^7.0", - "symfony/var-dumper": "^7.0", - "tijsverkoyen/css-to-inline-styles": "^2.2.5", - "vlucas/phpdotenv": "^5.4.1", - "voku/portable-ascii": "^2.0" - }, - "conflict": { - "mockery/mockery": "1.6.8", - "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.235.5", - "ext-gmp": "*", - "fakerphp/faker": "^1.23", - "league/flysystem-aws-s3-v3": "^3.0", - "league/flysystem-ftp": "^3.0", - "league/flysystem-path-prefixing": "^3.3", - "league/flysystem-read-only": "^3.3", - "league/flysystem-sftp-v3": "^3.0", - "mockery/mockery": "^1.6", - "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^9.4.0", - "pda/pheanstalk": "^5.0", - "phpstan/phpstan": "^1.11.5", - "phpunit/phpunit": "^10.5|^11.0", - "predis/predis": "^2.0.2", - "resend/resend-php": "^0.10.0", - "symfony/cache": "^7.0", - "symfony/http-client": "^7.0", - "symfony/psr-http-message-bridge": "^7.0" + "illuminate/conditionable": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "php": "^8.2" }, "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.235.5).", - "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.0).", - "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", - "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", - "league/flysystem-read-only": "Required to use read-only disks (^3.3)", - "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", - "mockery/mockery": "Required to use mocking (^1.6).", - "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", - "predis/predis": "Required to use the predis connector (^2.0.2).", - "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)." + "symfony/var-dumper": "Required to use the dump method (^7.0)." }, "type": "library", "extra": { @@ -1316,20 +1174,10 @@ }, "autoload": { "files": [ - "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/helpers.php" + "helpers.php" ], "psr-4": { - "Illuminate\\": "src/Illuminate/", - "Illuminate\\Support\\": [ - "src/Illuminate/Macroable/", - "src/Illuminate/Collections/", - "src/Illuminate/Conditionable/" - ] + "Illuminate\\Support\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1342,109 +1190,88 @@ "email": "taylor@laravel.com" } ], - "description": "The Laravel Framework.", + "description": "The Illuminate Collections package.", "homepage": "https://laravel.com", - "keywords": [ - "framework", - "laravel" - ], "support": { "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-09-13T13:36:30+00:00" + "time": "2024-09-27T14:54:48+00:00" }, { - "name": "laravel/prompts", - "version": "v0.1.25", + "name": "illuminate/conditionable", + "version": "v11.26.0", "source": { "type": "git", - "url": "https://github.com/laravel/prompts.git", - "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" + "url": "https://github.com/illuminate/conditionable.git", + "reference": "362dd761b9920367bca1427a902158225e9e3a23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", - "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/362dd761b9920367bca1427a902158225e9e3a23", + "reference": "362dd761b9920367bca1427a902158225e9e3a23", "shasum": "" }, "require": { - "ext-mbstring": "*", - "illuminate/collections": "^10.0|^11.0", - "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": { - "mockery/mockery": "^1.5", - "pestphp/pest": "^2.3", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-mockery": "^1.1" - }, - "suggest": { - "ext-pcntl": "Required for the spinner to be animated." + "php": "^8.0.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "0.1.x-dev" + "dev-master": "11.x-dev" } }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Laravel\\Prompts\\": "src/" + "Illuminate\\Support\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Add beautiful and user-friendly forms to your command-line applications.", + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", "support": { - "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.25" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "time": "2024-08-12T22:06:33+00:00" + "time": "2024-06-28T20:10:30+00:00" }, { - "name": "laravel/serializable-closure", - "version": "v1.3.4", + "name": "illuminate/contracts", + "version": "v11.26.0", "source": { "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81" + "url": "https://github.com/illuminate/contracts.git", + "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/56312862af937bd6da8e6dc8bbd88188dfb478f8", + "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8", "shasum": "" }, "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "illuminate/support": "^8.0|^9.0|^10.0|^11.0", - "nesbot/carbon": "^2.61|^3.0", - "pestphp/pest": "^1.21.3", - "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "11.x-dev" } }, "autoload": { "psr-4": { - "Laravel\\SerializableClosure\\": "src/" + "Illuminate\\Contracts\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1455,538 +1282,175 @@ { "name": "Taylor Otwell", "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "nuno@laravel.com" } ], - "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", - "keywords": [ - "closure", - "laravel", - "serializable" - ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", "support": { - "issues": "https://github.com/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "time": "2024-08-02T07:48:17+00:00" + "time": "2024-09-22T15:08:08+00:00" }, { - "name": "league/commonmark", - "version": "2.5.3", + "name": "illuminate/macroable", + "version": "v11.26.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "b650144166dfa7703e62a22e493b853b58d874b0" + "url": "https://github.com/illuminate/macroable.git", + "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0", - "reference": "b650144166dfa7703e62a22e493b853b58d874b0", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", "shasum": "" }, "require": { - "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": { - "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/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" + "php": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.6-dev" + "dev-master": "11.x-dev" } }, "autoload": { "psr-4": { - "League\\CommonMark\\": "src" + "Illuminate\\Support\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", "support": { - "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" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/commonmark", - "type": "tidelift" - } - ], - "time": "2024-08-16T11:46:16+00:00" + "time": "2024-06-28T20:10:30+00:00" }, { - "name": "league/config", - "version": "v1.2.0", + "name": "illuminate/support", + "version": "v11.26.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/config.git", - "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + "url": "https://github.com/illuminate/support.git", + "reference": "0431fbb96752bb8a13136a53e4be345fdc8484c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", - "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "url": "https://api.github.com/repos/illuminate/support/zipball/0431fbb96752bb8a13136a53e4be345fdc8484c2", + "reference": "0431fbb96752bb8a13136a53e4be345fdc8484c2", "shasum": "" }, "require": { - "dflydev/dot-access-data": "^3.0.1", - "nette/schema": "^1.2", - "php": "^7.4 || ^8.0" + "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.0", + "php": "^8.2", + "voku/portable-ascii": "^2.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" + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "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.0.2).", + "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.4.1)." }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.2-dev" + "dev-master": "11.x-dev" } }, "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], "psr-4": { - "League\\Config\\": "src" + "Illuminate\\Support\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Define configuration arrays with strict schemas and access values with dot notation", - "homepage": "https://config.thephpleague.com", - "keywords": [ - "array", - "config", - "configuration", - "dot", - "dot-access", - "nested", - "schema" - ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", "support": { - "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" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - } - ], - "time": "2022-12-11T20:36:23+00:00" + "time": "2024-09-30T14:29:28+00:00" }, { - "name": "league/flysystem", - "version": "3.28.0", + "name": "nesbot/carbon", + "version": "3.8.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", "shasum": "" }, "require": { - "league/flysystem-local": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" + "carbonphp/carbon-doctrine-types": "*", + "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" }, - "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" + "provide": { + "psr/clock-implementation": "1.0" }, "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": { - "psr-4": { - "League\\Flysystem\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "File storage abstraction for PHP", - "keywords": [ - "WebDAV", - "aws", - "cloud", - "file", - "files", - "filesystem", - "filesystems", - "ftp", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" - }, - "time": "2024-05-22T10:09:12+00:00" - }, - { - "name": "league/flysystem-local", - "version": "3.28.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "league/flysystem": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\Local\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Local filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "file", - "files", - "filesystem", - "local" - ], - "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" - }, - "time": "2024-05-06T20:05:52+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" - }, - "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": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2024-09-21T08:32:55+00:00" - }, - { - "name": "monolog/monolog", - "version": "3.7.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2.0", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.5.17", - "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.7.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2024-06-28T09:40:51+00:00" - }, - { - "name": "nesbot/carbon", - "version": "3.8.0", - "source": { - "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", - "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", - "shasum": "" - }, - "require": { - "carbonphp/carbon-doctrine-types": "*", - "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": { - "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" + "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" @@ -2057,200 +1521,31 @@ "time": "2024-08-19T06:22:39+00:00" }, { - "name": "nette/schema", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", - "shasum": "" - }, - "require": { - "nette/utils": "^4.0", - "php": "8.1 - 8.3" - }, - "require-dev": { - "nette/tester": "^2.4", - "phpstan/phpstan-nette": "^1.0", - "tracy/tracy": "^2.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", - "keywords": [ - "config", - "nette" - ], - "support": { - "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.0" - }, - "time": "2023-12-11T11:54:22+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": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "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": "nunomaduro/termwind", - "version": "v2.1.0", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "e5f21eade88689536c0cdad4c3cd75f3ed26e01a" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/e5f21eade88689536c0cdad4c3cd75f3ed26e01a", - "reference": "e5f21eade88689536c0cdad4c3cd75f3ed26e01a", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": "^8.2", - "symfony/console": "^7.0.4" - }, - "require-dev": { - "ergebnis/phpstan-rules": "^2.2.0", - "illuminate/console": "^11.1.1", - "laravel/pint": "^1.15.0", - "mockery/mockery": "^1.6.11", - "pestphp/pest": "^2.34.6", - "phpstan/phpstan": "^1.10.66", - "phpstan/phpstan-strict-rules": "^1.5.2", - "symfony/var-dumper": "^7.0.4", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" + "php": ">=8.0.0" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] - }, "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "files": [ - "src/Functions.php" - ], "psr-4": { - "Termwind\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2259,113 +1554,20 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Its like Tailwind CSS, but for the console.", - "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" - ], - "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.1.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://github.com/xiCO2k", - "type": "github" - } - ], - "time": "2024-09-05T15:25:50+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "1.9.3", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "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": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "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" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Option Type for PHP", + "description": "Common interface for caching libraries", "keywords": [ - "language", - "option", - "php", - "type" + "cache", + "psr", + "psr-6" ], "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2024-07-20T21:41:07+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/clock", @@ -2518,166 +1720,6 @@ }, "time": "2019-01-08T18:20:26+00:00" }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "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": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, { "name": "psr/log", "version": "3.0.2", @@ -2721,288 +1763,63 @@ "keywords": [ "log", "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" - }, - "time": "2024-09-11T13:17:53+00:00" - }, - { - "name": "psr/simple-cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" - }, - "time": "2021-10-29T13:26:27+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "ramsey/collection", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "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": { - "captainhook": { - "force-install": true - }, - "ramsey/conventional-commits": { - "configFile": "conventional-commits.json" - } - }, - "autoload": { - "psr-4": { - "Ramsey\\Collection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - } - ], - "description": "A PHP library for representing and manipulating collections.", - "keywords": [ - "array", - "collection", - "hash", - "map", - "queue", - "set" - ], - "support": { - "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } + "psr-3" ], - "time": "2022-12-31T21:50:55+00:00" + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "ramsey/uuid", - "version": "4.7.6", + "name": "psr/simple-cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "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": { - "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-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." + "php": ">=8.0.0" }, "type": "library", "extra": { - "captainhook": { - "force-install": true + "branch-alias": { + "dev-master": "3.0.x-dev" } }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Ramsey\\Uuid\\": "src/" + "Psr\\SimpleCache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", "keywords": [ - "guid", - "identifier", - "uuid" + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" ], "support": { - "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { "name": "spatie/laravel-collection-macros", @@ -3146,6 +1963,248 @@ ], "time": "2021-11-30T21:13:59+00:00" }, + { + "name": "symfony/asset", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/8970de4a0cedd34e097c0f5c502a614780b9ca43", + "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "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": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v7.1.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-05-31T14:57:53+00:00" + }, + { + "name": "symfony/cache", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/86e5296b10e4dec8c8441056ca606aedb8a3be0a", + "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v7.1.5" + }, + "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-17T09:16:35+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "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\\Cache\\": "" + } + }, + "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 caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, { "name": "symfony/clock", "version": "v7.1.1", @@ -3220,6 +2279,81 @@ ], "time": "2024-05-31T14:57:53+00:00" }, + { + "name": "symfony/config", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v7.1.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-05-31T14:57:53+00:00" + }, { "name": "symfony/console", "version": "v7.1.5", @@ -3314,26 +2448,45 @@ "time": "2024-09-20T08:28:38+00:00" }, { - "name": "symfony/css-selector", - "version": "v7.1.1", + "name": "symfony/dependency-injection", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "38465f925ec4e0707b090e9147c65869837d639d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/38465f925ec4e0707b090e9147c65869837d639d", + "reference": "38465f925ec4e0707b090e9147c65869837d639d", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.5", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\CssSelector\\": "" + "Symfony\\Component\\DependencyInjection\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3349,18 +2502,81 @@ "email": "fabien@symfony.com" }, { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "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": "Converts CSS selectors to XPath expressions", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -3376,38 +2592,148 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "2568d0adaa5b0018b07beaa90363b880a43cc957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/2568d0adaa5b0018b07beaa90363b880a43cc957", + "reference": "2568d0adaa5b0018b07beaa90363b880a43cc957", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^2", + "doctrine/persistence": "^3.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.15", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/form": "<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", + "symfony/messenger": "<6.4", + "symfony/property-info": "<6.4", + "symfony/security-bundle": "<6.4", + "symfony/security-core": "<6.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^3.6|^4", + "doctrine/orm": "^2.15|^3", + "psr/log": "^1|^2|^3", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/doctrine-messenger": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4.6|^7.0.6", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "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 integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.5" + }, + "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-08T12:32:26+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "name": "symfony/dotenv", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "url": "https://github.com/symfony/dotenv.git", + "reference": "6d966200b399fa59759286f3fc7c919f0677c449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/6d966200b399fa59759286f3fc7c919f0677c449", + "reference": "6d966200b399fa59759286f3fc7c919f0677c449", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "conflict": { + "symfony/console": "<6.4", + "symfony/process": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" }, + "type": "library", "autoload": { - "files": [ - "function.php" + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3416,18 +2742,23 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A generic function and convention to trigger deprecation notices", + "description": "Registers environment variables from a .env file", "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/dotenv/tree/v7.1.5" }, "funding": [ { @@ -3443,7 +2774,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-17T09:16:35+00:00" }, { "name": "symfony/error-handler", @@ -3675,222 +3006,33 @@ } ], "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/finder", - "version": "v7.1.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", - "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "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": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.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-08-13T14:28:19+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", - "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4" - }, - "require-dev": { - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4|^7.0", - "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": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "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": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" - }, - "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-20T08:28:38+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", - "shasum": "" - }, - "require": { - "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.0.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "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.0.4" + }, + { + "name": "symfony/filesystem", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" + "Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3910,10 +3052,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a structured process for converting a Request into a Response", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" + "source": "https://github.com/symfony/filesystem/tree/v7.1.5" }, "funding": [ { @@ -3929,48 +3071,32 @@ "type": "tidelift" } ], - "time": "2024-09-21T06:09:21+00:00" + "time": "2024-09-17T09:16:35+00:00" }, { - "name": "symfony/mailer", - "version": "v7.1.5", + "name": "symfony/finder", + "version": "v7.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b" + "url": "https://github.com/symfony/finder.git", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b", - "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b", + "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", "shasum": "" }, "require": { - "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": "^6.4|^7.0", - "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" + "php": ">=8.2" }, "require-dev": { - "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" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mailer\\": "" + "Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3990,10 +3116,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Helps sending emails", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.5" + "source": "https://github.com/symfony/finder/tree/v7.1.4" }, "funding": [ { @@ -4009,52 +3135,41 @@ "type": "tidelift" } ], - "time": "2024-09-08T12:32:26+00:00" + "time": "2024-08-13T14:28:19+00:00" }, { - "name": "symfony/mime", - "version": "v7.1.5", + "name": "symfony/flex", + "version": "v2.4.6", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" + "url": "https://github.com/symfony/flex.git", + "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", + "url": "https://api.github.com/repos/symfony/flex/zipball/4dc11919791f81d087a12db2ab4c7e044431ef6b", + "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b", "shasum": "" }, "require": { - "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" + "composer-plugin-api": "^2.1", + "php": ">=8.0" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1|^4", - "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^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" + "composer/composer": "^2.1", + "symfony/dotenv": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Flex\\Flex" }, - "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Flex\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4063,21 +3178,13 @@ "authors": [ { "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "email": "fabien.potencier@gmail.com" } ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], + "description": "Composer plugin for Symfony", "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.5" + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v2.4.6" }, "funding": [ { @@ -4093,45 +3200,119 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-04-27T10:22:22+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "name": "symfony/framework-bundle", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "8a792de86230c13a9de7750c0c8b23cc083183d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/8a792de86230c13a9de7750c0c8b23cc083183d4", + "reference": "8a792de86230c13a9de7750c0c8b23cc083183d4", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "provide": { - "ext-ctype": "*" + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^7.1.5", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/filesystem": "^7.1", + "symfony/finder": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^6.4|^7.0" }, - "suggest": { - "ext-ctype": "For best performance" + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<6.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", + "symfony/dom-crawler": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<6.4", + "symfony/serializer": "<6.4", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<6.4", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/mailer": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/scheduler": "^6.4.4|^7.0.4", + "symfony/security-bundle": "^6.4|^7.0", + "symfony/semaphore": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, + "type": "symfony-bundle", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4139,24 +3320,18 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/framework-bundle/tree/v7.1.5" }, "funding": [ { @@ -4172,42 +3347,49 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-20T13:35:23+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "name": "symfony/http-foundation", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" }, - "suggest": { - "ext-intl": "For best performance" + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "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": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4215,26 +3397,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 grapheme_* functions", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" }, "funding": [ { @@ -4250,43 +3424,86 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "name": "symfony/http-kernel", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", "shasum": "" }, - "require": { - "php": ">=7.2", - "symfony/polyfill-intl-normalizer": "^1.10" + "require": { + "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.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "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.0.4" }, "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4294,30 +3511,18 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" }, "funding": [ { @@ -4333,44 +3538,46 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-21T06:09:21+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "name": "symfony/routing", + "version": "v7.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/symfony/routing.git", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "ext-intl": "For best performance" + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "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", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Component\\Routing\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4379,26 +3586,24 @@ ], "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": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" + "router", + "routing", + "uri", + "url" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/routing/tree/v7.1.4" }, "funding": [ { @@ -4414,45 +3619,48 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-08-29T08:16:25+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "name": "symfony/runtime", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "url": "https://github.com/symfony/runtime.git", + "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/runtime/zipball/ea34522c447dd91a2b31cb330ee4540a56ba53f6", + "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6", "shasum": "" }, "require": { - "php": ">=7.2" + "composer-plugin-api": "^1.0|^2.0", + "php": ">=8.2" }, - "provide": { - "ext-mbstring": "*" + "conflict": { + "symfony/dotenv": "<6.4" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "composer/composer": "^2.6", + "symfony/console": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, - "type": "library", + "type": "composer-plugin", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4468,17 +3676,13 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Enables decoupling PHP applications from global state", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "runtime" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/runtime/tree/v7.1.1" }, "funding": [ { @@ -4494,41 +3698,70 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-05-31T14:55:39+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "name": "symfony/serializer", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/symfony/serializer.git", + "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/serializer/zipball/71d6e1f70f00752d1469d0f5e83b0a51716f288b", + "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8" }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/type-info": "<7.1.5", + "symfony/uid": "<6.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.1.5", + "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", + "symfony/yaml": "^6.4|^7.0" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Component\\Serializer\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4537,28 +3770,18 @@ ], "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/serializer/tree/v7.1.5" }, "funding": [ { @@ -4574,41 +3797,46 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-20T12:13:15+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "name": "symfony/service-contracts", + "version": "v3.5.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Contracts\\Service\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4625,16 +3853,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -4650,45 +3880,34 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { - "name": "symfony/polyfill-uuid", - "version": "v1.31.0", + "name": "symfony/stopwatch", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "provide": { - "ext-uuid": "*" - }, - "suggest": { - "ext-uuid": "For best performance" + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Uuid\\": "" - } + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4696,24 +3915,18 @@ ], "authors": [ { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for uuid functions", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "uuid" - ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + "source": "https://github.com/symfony/stopwatch/tree/v7.1.1" }, "funding": [ { @@ -4729,29 +3942,47 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { - "name": "symfony/process", + "name": "symfony/string", "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "5c03ee6369281177f07f7c68252a280beccba847" + "url": "https://github.com/symfony/string.git", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", - "reference": "5c03ee6369281177f07f7c68252a280beccba847", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", "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": { + "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", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Component\\String\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4763,18 +3994,26 @@ ], "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": "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": { - "source": "https://github.com/symfony/process/tree/v7.1.5" + "source": "https://github.com/symfony/string/tree/v7.1.5" }, "funding": [ { @@ -4790,43 +4029,62 @@ "type": "tidelift" } ], - "time": "2024-09-19T21:48:23+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { - "name": "symfony/routing", - "version": "v7.1.4", + "name": "symfony/translation", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" + "url": "https://github.com/symfony/translation.git", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" }, "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" + }, "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/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^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": { + "files": [ + "Resources/functions.php" + ], "psr-4": { - "Symfony\\Component\\Routing\\": "" + "Symfony\\Component\\Translation\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4846,16 +4104,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Maps an HTTP request to a set of configuration variables", + "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.4" + "source": "https://github.com/symfony/translation/tree/v7.1.5" }, "funding": [ { @@ -4871,29 +4123,24 @@ "type": "tidelift" } ], - "time": "2024-08-29T08:16:25+00:00" + "time": "2024-09-16T06:30:38+00:00" }, { - "name": "symfony/service-contracts", + "name": "symfony/translation-contracts", "version": "v3.5.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "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.1" }, "type": "library", "extra": { @@ -4907,7 +4154,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" + "Symfony\\Contracts\\Translation\\": "" }, "exclude-from-classmap": [ "/Test/" @@ -4927,7 +4174,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Generic abstractions related to translation", "homepage": "https://symfony.com", "keywords": [ "abstractions", @@ -4938,7 +4185,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -4957,44 +4204,74 @@ "time": "2024-04-18T09:32:20+00:00" }, { - "name": "symfony/string", + "name": "symfony/twig-bridge", "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e997e5025b53c0f7b17632802daefdd6a04540ae", + "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae", "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" + "symfony/translation-contracts": "^2.5|^3", + "twig/twig": "^3.9" }, "conflict": { - "symfony/translation-contracts": "<2.5" + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<6.4", + "symfony/form": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/mime": "<6.4", + "symfony/serializer": "<6.4", + "symfony/translation": "<6.4", + "symfony/workflow": "<6.4" }, "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/mime": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" }, - "type": "library", + "type": "symfony-bridge", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" + "Symfony\\Bridge\\Twig\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5006,26 +4283,102 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v7.1.5" + }, + "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-15T06:48:17+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", + "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "php": ">=8.2", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "conflict": { + "symfony/framework-bundle": "<6.4", + "symfony/translation": "<6.4" + }, + "require-dev": { + "symfony/asset": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "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 a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/string/tree/v7.1.5" + "source": "https://github.com/symfony/twig-bundle/tree/v7.1.5" }, "funding": [ { @@ -5041,65 +4394,68 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-09-08T12:32:26+00:00" }, { - "name": "symfony/translation", + "name": "symfony/validator", "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" + "url": "https://github.com/symfony/validator.git", + "reference": "e57592782dc2a86997477f28164c51af53512ad8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "url": "https://api.github.com/repos/symfony/validator/zipball/e57592782dc2a86997477f28164c51af53512ad8", + "reference": "e57592782dc2a86997477f28164c51af53512ad8", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" }, "conflict": { - "symfony/config": "<6.4", - "symfony/console": "<6.4", + "doctrine/lexer": "<1.1", "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", "symfony/yaml": "<6.4" }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "psr/log": "^1|^2|^3", + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.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/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/type-info": "^7.1", "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\Translation\\": "" + "Symfony\\Component\\Validator\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/Resources/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5116,10 +4472,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools to internationalize your application", + "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.5" + "source": "https://github.com/symfony/validator/tree/v7.1.5" }, "funding": [ { @@ -5135,41 +4491,50 @@ "type": "tidelift" } ], - "time": "2024-09-16T06:30:38+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.5.0", + "name": "symfony/var-dumper", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "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.0.4" }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", "autoload": { + "files": [ + "Resources/functions/dump.php" + ], "psr-4": { - "Symfony\\Contracts\\Translation\\": "" + "Symfony\\Component\\VarDumper\\": "" }, "exclude-from-classmap": [ - "/Test/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5186,18 +4551,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to translation", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "debug", + "dump" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" }, "funding": [ { @@ -5213,33 +4574,34 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-16T10:07:02+00:00" }, { - "name": "symfony/uid", - "version": "v7.1.5", + "name": "symfony/var-exporter", + "version": "v7.1.2", "source": { "type": "git", - "url": "https://github.com/symfony/uid.git", - "reference": "8c7bb8acb933964055215d89f9a9871df0239317" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317", - "reference": "8c7bb8acb933964055215d89f9a9871df0239317", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-uuid": "^1.15" + "php": ">=8.2" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Uid\\": "" + "Symfony\\Component\\VarExporter\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5250,10 +4612,6 @@ "MIT" ], "authors": [ - { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -5263,15 +4621,20 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an object-oriented API to generate and represent UIDs", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", "homepage": "https://symfony.com", "keywords": [ - "UID", - "ulid", - "uuid" + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.5" + "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" }, "funding": [ { @@ -5287,47 +4650,39 @@ "type": "tidelift" } ], - "time": "2024-09-17T09:16:35+00:00" + "time": "2024-06-28T08:00:31+00:00" }, { - "name": "symfony/var-dumper", + "name": "symfony/yaml", "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d" + "url": "https://github.com/symfony/yaml.git", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<6.4" }, "require-dev": { - "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.0.4" + "symfony/console": "^6.4|^7.0" }, "bin": [ - "Resources/bin/var-dump-server" + "Resources/bin/yaml-lint" ], "type": "library", "autoload": { - "files": [ - "Resources/functions/dump.php" - ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5339,22 +4694,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": "Provides mechanisms for walking through any arbitrary PHP variable", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" + "source": "https://github.com/symfony/yaml/tree/v7.1.5" }, "funding": [ { @@ -5370,7 +4721,7 @@ "type": "tidelift" } ], - "time": "2024-09-16T10:07:02+00:00" + "time": "2024-09-17T12:49:58+00:00" }, { "name": "thecodingmachine/safe", @@ -5512,37 +4863,40 @@ "time": "2023-04-05T11:54:14+00:00" }, { - "name": "tijsverkoyen/css-to-inline-styles", - "version": "v2.2.7", + "name": "twig/twig", + "version": "v3.14.0", "source": { "type": "git", - "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + "url": "https://github.com/twigphp/Twig.git", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", - "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { - "TijsVerkoyen\\CssToInlineStyles\\": "src" + "Twig\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5551,102 +4905,41 @@ ], "authors": [ { - "name": "Tijs Verkoyen", - "email": "css_to_inline_styles@verkoyen.eu", - "role": "Developer" - } - ], - "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": { - "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" - }, - "time": "2023-12-08T13:03:43+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "v5.6.1", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.3", - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3", - "symfony/polyfill-ctype": "^1.24", - "symfony/polyfill-mbstring": "^1.24", - "symfony/polyfill-php80": "^1.24" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-filter": "*", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator." - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" }, - "branch-alias": { - "dev-master": "5.6-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "Twig Team", + "role": "Contributors" }, { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", "keywords": [ - "dotenv", - "env", - "environment" + "templating" ], "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.14.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "url": "https://tidelift.com/funding/github/packagist/twig/twig", "type": "tidelift" } ], - "time": "2024-07-20T21:52:34+00:00" + "time": "2024-09-09T17:55:12+00:00" }, { "name": "voku/portable-ascii", @@ -5666,96 +4959,15 @@ "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": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" - } - ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], - "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" - }, - "funding": [ - { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", - "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", - "type": "tidelift" - } - ], - "time": "2022-03-08T17:03:00+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" }, + "type": "library", "autoload": { "psr-4": { - "Webmozart\\Assert\\": "src/" + "voku\\": "src/voku/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5764,21 +4976,44 @@ ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" } ], - "description": "Assertions to validate method input/output with nice error messages.", + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", "keywords": [ - "assert", - "check", - "validate" + "ascii", + "clean", + "php" ], "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" }, - "time": "2022-06-03T18:03:27+00:00" + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "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", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" } ], "packages-dev": [ @@ -5942,236 +5177,6 @@ ], "time": "2024-04-13T18:00:56+00:00" }, - { - "name": "barryvdh/laravel-debugbar", - "version": "v3.14.0", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "16a13cc5221aee90ae20aa59083ced2211e714eb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/16a13cc5221aee90ae20aa59083ced2211e714eb", - "reference": "16a13cc5221aee90ae20aa59083ced2211e714eb", - "shasum": "" - }, - "require": { - "illuminate/routing": "^9|^10|^11", - "illuminate/session": "^9|^10|^11", - "illuminate/support": "^9|^10|^11", - "maximebf/debugbar": "~1.23.0", - "php": "^8.0", - "symfony/finder": "^6|^7" - }, - "require-dev": { - "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^5|^6|^7|^8|^9", - "phpunit/phpunit": "^9.6|^10.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.14-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" - ], - "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" - } - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Barryvdh\\Debugbar\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "PHP Debugbar integration for Laravel", - "keywords": [ - "debug", - "debugbar", - "laravel", - "profiler", - "webprofiler" - ], - "support": { - "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.0" - }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2024-09-20T12:16:37+00:00" - }, - { - "name": "barryvdh/laravel-ide-helper", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "591e7d665fbab8a3b682e451641706341573eb80" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/591e7d665fbab8a3b682e451641706341573eb80", - "reference": "591e7d665fbab8a3b682e451641706341573eb80", - "shasum": "" - }, - "require": { - "barryvdh/reflection-docblock": "^2.1.1", - "composer/class-map-generator": "^1.0", - "ext-json": "*", - "illuminate/console": "^10 || ^11", - "illuminate/database": "^10.38 || ^11", - "illuminate/filesystem": "^10 || ^11", - "illuminate/support": "^10 || ^11", - "nikic/php-parser": "^4.18 || ^5", - "php": "^8.1", - "phpdocumentor/type-resolver": "^1.1.0" - }, - "require-dev": { - "ext-pdo_sqlite": "*", - "friendsofphp/php-cs-fixer": "^3", - "illuminate/config": "^9 || ^10 || ^11", - "illuminate/view": "^9 || ^10 || ^11", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^8 || ^9", - "phpunit/phpunit": "^10.5", - "spatie/phpunit-snapshot-assertions": "^4 || ^5", - "vimeo/psalm": "^5.4" - }, - "suggest": { - "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10|^11)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\LaravelIdeHelper\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", - "keywords": [ - "autocomplete", - "codeintel", - "helper", - "ide", - "laravel", - "netbeans", - "phpdoc", - "phpstorm", - "sublime" - ], - "support": { - "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.1.0" - }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2024-07-12T14:20:51+00:00" - }, - { - "name": "barryvdh/reflection-docblock", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/e6811e927f0ecc37cc4deaa6627033150343e597", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.14|^9" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Barryvdh": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.1" - }, - "time": "2023-06-14T05:06:27+00:00" - }, { "name": "clue/ndjson-react", "version": "v1.3.0", @@ -6309,96 +5314,23 @@ }, "funding": [ { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" - } - ], - "time": "2022-12-27T16:44:40+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.3.4", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", - "shasum": "" - }, - "require": { - "composer/pcre": "^2.1 || ^3.1", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.3.4" - }, - "funding": [ + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, { - "url": "https://packagist.com", + "url": "https://www.paypal.me/colinpodell/10.00", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/colinodell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "url": "https://www.patreon.com/colinodell", + "type": "patreon" } ], - "time": "2024-06-12T14:13:04+00:00" + "time": "2022-12-27T16:44:40+00:00" }, { "name": "composer/pcre", @@ -6663,53 +5595,6 @@ }, "time": "2019-12-04T15:06:13+00:00" }, - { - "name": "doctrine/deprecations", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "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.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, { "name": "evenement/evenement", "version": "v3.0.2", @@ -6804,16 +5689,16 @@ }, { "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", + "version": "v1.5.3", "source": { "type": "git", "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "shasum": "" }, "require": { @@ -6854,9 +5739,9 @@ ], "support": { "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "time": "2022-03-02T22:36:06+00:00" + "time": "2024-04-30T00:40:11+00:00" }, { "name": "fidry/cpu-core-counter", @@ -6919,77 +5804,6 @@ ], "time": "2024-08-06T10:04:20+00:00" }, - { - "name": "filp/whoops", - "version": "2.15.4", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^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.15.4" - }, - "funding": [ - { - "url": "https://github.com/denis-sokolov", - "type": "github" - } - ], - "time": "2023-11-03T12:00:00+00:00" - }, { "name": "friendsofphp/php-cs-fixer", "version": "v3.64.0", @@ -7093,6 +5907,54 @@ ], "time": "2024-08-30T23:09:38+00:00" }, + { + "name": "illuminate/pipeline", + "version": "v11.26.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/ca9266eecf659f7e60c06758969b2ae3918ea3da", + "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-06-28T20:10:30+00:00" + }, { "name": "infection/abstract-testframework-adapter", "version": "0.5.0", @@ -7466,120 +6328,18 @@ }, "time": "2024-07-06T21:00:26+00:00" }, - { - "name": "larastan/larastan", - "version": "v2.9.8", - "source": { - "type": "git", - "url": "https://github.com/larastan/larastan.git", - "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/340badd89b0eb5bddbc503a4829c08cf9a2819d7", - "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", - "php": "^8.0.2", - "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.11.2" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0", - "nikic/php-parser": "^4.19.1", - "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", - "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.3", - "phpunit/phpunit": "^9.6.13 || ^10.5.16" - }, - "suggest": { - "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" - }, - "type": "phpstan-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "psr-4": { - "Larastan\\Larastan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Can Vural", - "email": "can9119@gmail.com" - }, - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", - "keywords": [ - "PHPStan", - "code analyse", - "code analysis", - "larastan", - "laravel", - "package", - "php", - "static analysis" - ], - "support": { - "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.8" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/canvural", - "type": "github" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2024-07-06T17:46:02+00:00" - }, { "name": "laravel/pint", - "version": "v1.17.3", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "9d77be916e145864f10788bb94531d03e1f7b482" + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/9d77be916e145864f10788bb94531d03e1f7b482", - "reference": "9d77be916e145864f10788bb94531d03e1f7b482", + "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", "shasum": "" }, "require": { @@ -7601,78 +6361,12 @@ "bin": [ "builds/pint" ], - "type": "project", - "autoload": { - "psr-4": { - "App\\": "app/", - "Database\\Seeders\\": "database/seeders/", - "Database\\Factories\\": "database/factories/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "An opinionated code formatter for PHP.", - "homepage": "https://laravel.com", - "keywords": [ - "format", - "formatter", - "lint", - "linter", - "php" - ], - "support": { - "issues": "https://github.com/laravel/pint/issues", - "source": "https://github.com/laravel/pint" - }, - "time": "2024-09-03T15:00:28+00:00" - }, - { - "name": "maximebf/debugbar", - "version": "v1.23.2", - "source": { - "type": "git", - "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "689720d724c771ac4add859056744b7b3f2406da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/689720d724c771ac4add859056744b7b3f2406da", - "reference": "689720d724c771ac4add859056744b7b3f2406da", - "shasum": "" - }, - "require": { - "php": "^7.2|^8", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4|^5|^6|^7" - }, - "require-dev": { - "dbrekelmans/bdi": "^1", - "phpunit/phpunit": "^8|^9", - "symfony/panther": "^1|^2.1", - "twig/twig": "^1.38|^2.7|^3.0" - }, - "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.23-dev" - } - }, + "type": "project", "autoload": { "psr-4": { - "DebugBar\\": "src/DebugBar/" + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7681,26 +6375,24 @@ ], "authors": [ { - "name": "Maxime Bouroumeau-Fuseau", - "email": "maxime.bouroumeau@gmail.com", - "homepage": "http://maximebf.com" - }, - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Debug bar in the browser for php application", - "homepage": "https://github.com/maximebf/php-debugbar", + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", "keywords": [ - "debug", - "debugbar" + "format", + "formatter", + "lint", + "linter", + "php" ], "support": { - "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.2" + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" }, - "time": "2024-09-16T11:23:09+00:00" + "time": "2024-09-24T17:22:50+00:00" }, { "name": "microsoft/tolerant-php-parser", @@ -7860,16 +6552,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.19.2", + "version": "v4.19.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ed4c8949a32986043e977dbe14776c14d644c45" + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45", - "reference": "0ed4c8949a32986043e977dbe14776c14d644c45", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", "shasum": "" }, "require": { @@ -7878,7 +6570,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -7910,106 +6602,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2" - }, - "time": "2024-09-17T19:36:00+00:00" - }, - { - "name": "nunomaduro/collision", - "version": "v8.4.0", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/e7d1aa8ed753f63fa816932bbc89678238843b4a", - "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a", - "shasum": "" - }, - "require": { - "filp/whoops": "^2.15.4", - "nunomaduro/termwind": "^2.0.1", - "php": "^8.2.0", - "symfony/console": "^7.1.3" - }, - "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.19.0", - "laravel/pint": "^1.17.1", - "laravel/sail": "^1.31.0", - "laravel/sanctum": "^4.0.2", - "laravel/tinker": "^2.9.0", - "orchestra/testbench-core": "^9.2.3", - "pestphp/pest": "^2.35.0 || ^3.0.0", - "sebastian/environment": "^6.1.0 || ^7.0.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" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" }, - "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-08-03T15:32:23+00:00" + "time": "2024-09-29T15:01:53+00:00" }, { "name": "ondram/ci-detector", @@ -8089,96 +6684,6 @@ }, "time": "2024-03-12T13:22:30+00:00" }, - { - "name": "orchestra/testbench-core", - "version": "v9.5.0", - "source": { - "type": "git", - "url": "https://github.com/orchestral/testbench-core.git", - "reference": "4880c3f840cac2b9c0a26d46e927d1994aabc69f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/4880c3f840cac2b9c0a26d46e927d1994aabc69f", - "reference": "4880c3f840cac2b9c0a26d46e927d1994aabc69f", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "php": "^8.2", - "symfony/polyfill-php83": "^1.28" - }, - "conflict": { - "brianium/paratest": "<7.3.0 || >=8.0.0", - "laravel/framework": "<11.11.0 || >=12.0.0", - "laravel/serializable-closure": "<1.3.0 || >=2.0.0", - "nunomaduro/collision": "<8.0.0 || >=9.0.0", - "phpunit/phpunit": "<10.5.0 || 11.0.0 || >=11.4.0" - }, - "require-dev": { - "fakerphp/faker": "^1.23", - "laravel/framework": "^11.11", - "laravel/pint": "^1.17", - "mockery/mockery": "^1.6", - "phpstan/phpstan": "^1.11", - "phpunit/phpunit": "^10.5 || ^11.0.1", - "spatie/laravel-ray": "^1.35", - "symfony/process": "^7.0", - "symfony/yaml": "^7.0", - "vlucas/phpdotenv": "^5.4.1" - }, - "suggest": { - "brianium/paratest": "Allow using parallel tresting (^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.11).", - "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": "2024-09-23T13:18:23+00:00" - }, { "name": "pdepend/pdepend", "version": "2.16.2", @@ -8698,93 +7203,6 @@ ], "time": "2023-12-11T08:22:20+00:00" }, - { - "name": "phpmyadmin/sql-parser", - "version": "5.10.0", - "source": { - "type": "git", - "url": "https://github.com/phpmyadmin/sql-parser.git", - "reference": "91d980ab76c3f152481e367f62b921adc38af451" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/91d980ab76c3f152481e367f62b921adc38af451", - "reference": "91d980ab76c3f152481e367f62b921adc38af451", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "phpmyadmin/motranslator": "<3.0" - }, - "require-dev": { - "phpbench/phpbench": "^1.1", - "phpmyadmin/coding-standard": "^3.0", - "phpmyadmin/motranslator": "^4.0 || ^5.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.9.12", - "phpstan/phpstan-phpunit": "^1.3.3", - "phpunit/phpunit": "^8.5 || ^9.6", - "psalm/plugin-phpunit": "^0.16.1", - "vimeo/psalm": "^4.11", - "zumba/json-serializer": "~3.0.2" - }, - "suggest": { - "ext-mbstring": "For best performance", - "phpmyadmin/motranslator": "Translate messages to your favorite locale" - }, - "bin": [ - "bin/highlight-query", - "bin/lint-query", - "bin/sql-parser", - "bin/tokenize-query" - ], - "type": "library", - "autoload": { - "psr-4": { - "PhpMyAdmin\\SqlParser\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "The phpMyAdmin Team", - "email": "developers@phpmyadmin.net", - "homepage": "https://www.phpmyadmin.net/team/" - } - ], - "description": "A validating SQL lexer and parser with a focus on MySQL dialect.", - "homepage": "https://github.com/phpmyadmin/sql-parser", - "keywords": [ - "analysis", - "lexer", - "parser", - "query linter", - "sql", - "sql lexer", - "sql linter", - "sql parser", - "sql syntax highlighter", - "sql tokenizer" - ], - "support": { - "issues": "https://github.com/phpmyadmin/sql-parser/issues", - "source": "https://github.com/phpmyadmin/sql-parser" - }, - "funding": [ - { - "url": "https://www.phpmyadmin.net/donate/", - "type": "other" - } - ], - "time": "2024-08-29T20:56:34+00:00" - }, { "name": "phpstan/extension-installer", "version": "1.4.3", @@ -8835,16 +7253,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.31.0", + "version": "1.32.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "249f15fb843bf240cf058372dad29e100cee6c17" + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/249f15fb843bf240cf058372dad29e100cee6c17", - "reference": "249f15fb843bf240cf058372dad29e100cee6c17", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", "shasum": "" }, "require": { @@ -8876,22 +7294,22 @@ "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/1.31.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0" }, - "time": "2024-09-22T11:32:18+00:00" + "time": "2024-09-26T07:23:32+00:00" }, { "name": "phpstan/phpstan", - "version": "1.12.4", + "version": "1.12.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "ffa517cb918591b93acc9b95c0bebdcd0e4538bd" + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ffa517cb918591b93acc9b95c0bebdcd0e4538bd", - "reference": "ffa517cb918591b93acc9b95c0bebdcd0e4538bd", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae", + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae", "shasum": "" }, "require": { @@ -8936,7 +7354,7 @@ "type": "github" } ], - "time": "2024-09-19T07:58:01+00:00" + "time": "2024-10-06T15:03:59+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -9034,6 +7452,78 @@ }, "time": "2024-09-20T14:04:44+00:00" }, + { + "name": "phpstan/phpstan-symfony", + "version": "1.4.10", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-symfony.git", + "reference": "f7d5782044bedf93aeb3f38e09c91148ee90e5a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/f7d5782044bedf93aeb3f38e09c91148ee90e5a1", + "reference": "f7d5782044bedf93aeb3f38e09c91148ee90e5a1", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.12" + }, + "conflict": { + "symfony/framework-bundle": "<3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^8.5.29 || ^9.5", + "psr/container": "1.0 || 1.1.1", + "symfony/config": "^5.4 || ^6.1", + "symfony/console": "^5.4 || ^6.1", + "symfony/dependency-injection": "^5.4 || ^6.1", + "symfony/form": "^5.4 || ^6.1", + "symfony/framework-bundle": "^5.4 || ^6.1", + "symfony/http-foundation": "^5.4 || ^6.1", + "symfony/messenger": "^5.4", + "symfony/polyfill-php80": "^1.24", + "symfony/serializer": "^5.4", + "symfony/service-contracts": "^2.2.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukáš Unger", + "email": "looky.msc@gmail.com", + "homepage": "https://lookyman.net" + } + ], + "description": "Symfony Framework extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-symfony/issues", + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.10" + }, + "time": "2024-09-26T18:14:50+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "10.1.16", @@ -9457,57 +7947,51 @@ "time": "2024-09-19T10:52:21+00:00" }, { - "name": "psalm/plugin-laravel", - "version": "v2.11.0", + "name": "psalm/plugin-symfony", + "version": "v5.2.5", "source": { "type": "git", - "url": "https://github.com/psalm/psalm-plugin-laravel.git", - "reference": "ffd51399b672959331ed3ef4eaae13984474e2f0" + "url": "https://github.com/psalm/psalm-plugin-symfony.git", + "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-laravel/zipball/ffd51399b672959331ed3ef4eaae13984474e2f0", - "reference": "ffd51399b672959331ed3ef4eaae13984474e2f0", + "url": "https://api.github.com/repos/psalm/psalm-plugin-symfony/zipball/fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", + "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", "shasum": "" }, "require": { - "barryvdh/laravel-ide-helper": "^2.13 || ^3.0", "ext-simplexml": "*", - "illuminate/config": "^10.48 || ^11.0", - "illuminate/container": "^10.48 || ^11.0", - "illuminate/contracts": "^10.48 || ^11.0", - "illuminate/database": "^10.48 || ^11.0", - "illuminate/events": "^10.48 || ^11.0", - "illuminate/http": "^10.48 || ^11.0", - "illuminate/routing": "^10.48 || ^11.0", - "illuminate/support": "^10.48 || ^11.0", - "illuminate/view": "^10.48 || ^11.0", - "nikic/php-parser": "^4.18 || ^5.0", - "orchestra/testbench-core": "^8.22 || ^9.0", "php": "^8.1", - "symfony/console": "^6.0 || ^7.0", - "symfony/finder": "^6.0 || ^7.0", - "vimeo/psalm": "^5.20" + "symfony/framework-bundle": "^5.0 || ^6.0 || ^7.0", + "vimeo/psalm": "^5.16" + }, + "require-dev": { + "doctrine/annotations": "^1.8|^2", + "doctrine/orm": "^2.9", + "phpunit/phpunit": "~7.5 || ~9.5", + "symfony/cache-contracts": "^1.0 || ^2.0", + "symfony/console": "*", + "symfony/form": "^5.0 || ^6.0 || ^7.0", + "symfony/messenger": "^5.0 || ^6.0 || ^7.0", + "symfony/security-core": "*", + "symfony/serializer": "^5.0 || ^6.0 || ^7.0", + "symfony/validator": "*", + "twig/twig": "^2.10 || ^3.0", + "weirdan/codeception-psalm-module": "dev-master" }, - "require-dev": { - "laravel/framework": "^10.48 || ^11.0", - "phpunit/phpunit": "^10.5 || ^11.0", - "phpyh/psalm-tester": "^0.1.0", - "ramsey/collection": "^1.3", - "rector/rector": "^1.0", - "slevomat/coding-standard": "^8.8", - "squizlabs/php_codesniffer": "*", - "symfony/http-foundation": "^6.0 || ^7.0" + "suggest": { + "weirdan/doctrine-psalm-plugin": "If Doctrine is used, it is recommended install this plugin" }, "type": "psalm-plugin", "extra": { "psalm": { - "pluginClass": "Psalm\\LaravelPlugin\\Plugin" + "pluginClass": "Psalm\\SymfonyPsalmPlugin\\Plugin" } }, "autoload": { "psr-4": { - "Psalm\\LaravelPlugin\\": "src" + "Psalm\\SymfonyPsalmPlugin\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -9516,17 +8000,16 @@ ], "authors": [ { - "name": "Matthew Brown", - "email": "github@muglug.com" + "name": "Farhad Safarov", + "email": "farhad.safarov@gmail.com" } ], - "description": "Psalm plugin for Laravel", - "homepage": "https://github.com/psalm/psalm-plugin-laravel", + "description": "Psalm Plugin for Symfony", "support": { - "issues": "https://github.com/psalm/psalm-plugin-laravel/issues", - "source": "https://github.com/psalm/psalm-plugin-laravel/tree/v2.11.0" + "issues": "https://github.com/psalm/psalm-plugin-symfony/issues", + "source": "https://github.com/psalm/psalm-plugin-symfony/tree/v5.2.5" }, - "time": "2024-03-19T21:40:03+00:00" + "time": "2024-07-03T11:57:02+00:00" }, { "name": "react/cache", @@ -10064,12 +8547,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "4d2e39c44028ba729fe50efdf731d3d2ede4046b" + "reference": "c90faeb954dbf0e3bb0657496199afeb99e2d4dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/4d2e39c44028ba729fe50efdf731d3d2ede4046b", - "reference": "4d2e39c44028ba729fe50efdf731d3d2ede4046b", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c90faeb954dbf0e3bb0657496199afeb99e2d4dd", + "reference": "c90faeb954dbf0e3bb0657496199afeb99e2d4dd", "shasum": "" }, "conflict": { @@ -10080,7 +8563,7 @@ "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.04.6", "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", - "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9", + "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9|==2024.04.1", "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", "airesvsg/acf-to-rest-api": "<=3.1", @@ -10170,7 +8653,7 @@ "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", - "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/contao": "<=5.4.1", "contao/core": "<3.5.39", "contao/core-bundle": "<4.13.49|>=5,<5.3.15|>=5.4,<5.4.3", "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", @@ -10193,6 +8676,7 @@ "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", "desperado/xml-bundle": "<=0.1.7", + "dev-lancer/minecraft-motd-parser": "<=1.0.5", "devgroup/dotplant": "<2020.09.14-dev", "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", "doctrine/annotations": "<1.2.7", @@ -10207,9 +8691,9 @@ "dolibarr/dolibarr": "<19.0.2", "dompdf/dompdf": "<2.0.4", "doublethreedigital/guest-entries": "<3.1.2", - "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<=11.0.4", - "drupal/core-recommended": ">=8,<=11.0.4", - "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<=11.0.4", + "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.3.6|>=11,<11.0.5", + "drupal/core-recommended": ">=8,<10.3.6|>=11,<11.0.5", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<10.3.6|>=11,<11.0.5", "duncanmcclean/guest-entries": "<3.1.2", "dweeves/magmi": "<=0.7.24", "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", @@ -10252,6 +8736,8 @@ "feehi/cms": "<=2.1.1", "feehi/feehicms": "<=2.1.1", "fenom/fenom": "<=2.12.1", + "filament/infolists": ">=3,<3.2.115", + "filament/tables": ">=3,<3.2.115", "filegator/filegator": "<7.8", "filp/whoops": "<2.1.13", "fineuploader/php-traditional-server": "<=1.2.2", @@ -10409,7 +8895,7 @@ "magneto/core": "<1.9.4.4-dev", "maikuolan/phpmussel": ">=1,<1.6", "mainwp/mainwp": "<=4.4.3.3", - "mantisbt/mantisbt": "<2.26.2", + "mantisbt/mantisbt": "<=2.26.3", "marcwillmann/turn": "<0.3.3", "matyhtf/framework": "<3.0.6", "mautic/core": "<4.4.13|>=5,<5.1.1", @@ -10471,7 +8957,7 @@ "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", - "october/october": "<=3.4.4", + "october/october": "<=3.6.4", "october/rain": "<1.0.472|>=1.1,<1.1.2", "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", "omeka/omeka-s": "<4.0.3", @@ -10643,6 +9129,7 @@ "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<24.05.1", + "starcitizentools/citizen-skin": ">=2.6.3,<2.31", "statamic/cms": "<4.46|>=5.3,<5.6.2", "stormpath/sdk": "<9.9.99", "studio-42/elfinder": "<=2.1.64", @@ -10650,7 +9137,7 @@ "subhh/libconnect": "<7.0.8|>=8,<8.1", "sukohi/surpass": "<1", "sulu/form-bundle": ">=2,<2.5.3", - "sulu/sulu": "<1.6.44|>=2,<2.4.17|>=2.5,<2.5.13", + "sulu/sulu": "<1.6.44|>=2,<2.6.5", "sumocoders/framework-user-bundle": "<1.4", "superbig/craft-audit": "<3.0.2", "swag/paypal": "<5.4.4", @@ -10722,7 +9209,7 @@ "topthink/thinkphp": "<=3.2.3", "torrentpier/torrentpier": "<=2.4.3", "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", - "tribalsystems/zenario": "<9.5.60602", + "tribalsystems/zenario": "<=9.7.61188", "truckersmp/phpwhois": "<=4.3.1", "ttskch/pagination-service-provider": "<1", "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", @@ -10881,7 +9368,7 @@ "type": "tidelift" } ], - "time": "2024-09-23T20:04:53+00:00" + "time": "2024-10-04T19:04:42+00:00" }, { "name": "sabre/event", @@ -12352,61 +10839,38 @@ "time": "2024-06-12T14:55:22+00:00" }, { - "name": "spatie/laravel-ignition", - "version": "2.8.0", + "name": "spatie/symfony-ignition-bundle", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "3c067b75bfb50574db8f7e2c3978c65eed71126c" + "url": "https://github.com/spatie/symfony-ignition-bundle.git", + "reference": "b3dd2bbb318d7642ecc6ee7e051b748d68dffb89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/3c067b75bfb50574db8f7e2c3978c65eed71126c", - "reference": "3c067b75bfb50574db8f7e2c3978c65eed71126c", + "url": "https://api.github.com/repos/spatie/symfony-ignition-bundle/zipball/b3dd2bbb318d7642ecc6ee7e051b748d68dffb89", + "reference": "b3dd2bbb318d7642ecc6ee7e051b748d68dffb89", "shasum": "" }, "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "illuminate/support": "^10.0|^11.0", "php": "^8.1", - "spatie/ignition": "^1.15", - "symfony/console": "^6.2.3|^7.0", - "symfony/var-dumper": "^6.2.3|^7.0" + "spatie/ignition": "^1.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.3 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "livewire/livewire": "^2.11|^3.3.5", - "mockery/mockery": "^1.5.1", - "openai-php/client": "^0.8.1", - "orchestra/testbench": "8.22.3|^9.0", - "pestphp/pest": "^2.34", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan-deprecation-rules": "^1.1.1", - "phpstan/phpstan-phpunit": "^1.3.16", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\LaravelIgnition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" - } - } + "phpunit/phpunit": "^9.5", + "symfony/dom-crawler": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0" }, + "type": "symfony-bundle", "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Spatie\\LaravelIgnition\\": "src" + "Spatie\\SymfonyIgnitionBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -12415,24 +10879,25 @@ ], "authors": [ { - "name": "Spatie", - "email": "info@spatie.be", + "name": "Andrew MacRobert", + "email": "andrew.macrobert@gmail.com", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", "role": "Developer" } ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://flareapp.io/ignition", + "description": "A beautiful error page for Symfony apps", + "homepage": "https://github.com/spatie/symfony-ignition-bundle", "keywords": [ - "error", - "flare", - "laravel", - "page" + "spatie", + "symfony-ignition-bundle" ], "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/laravel-ignition/issues", - "source": "https://github.com/spatie/laravel-ignition" + "issues": "https://github.com/spatie/symfony-ignition-bundle/issues", + "source": "https://github.com/spatie/symfony-ignition-bundle/tree/1.1.0" }, "funding": [ { @@ -12440,7 +10905,7 @@ "type": "github" } ], - "time": "2024-06-12T15:01:18+00:00" + "time": "2023-12-16T17:16:54+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -12523,40 +10988,39 @@ "time": "2024-09-18T10:38:58+00:00" }, { - "name": "symfony/config", + "name": "symfony/debug-bundle", "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" + "url": "https://github.com/symfony/debug-bundle.git", + "reference": "aa024d28ce7ce0c6a16ee57c066838bece92893f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", - "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/aa024d28ce7ce0c6a16ee57c066838bece92893f", + "reference": "aa024d28ce7ce0c6a16ee57c066838bece92893f", "shasum": "" }, "require": { + "ext-xml": "*", "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^7.1", - "symfony/polyfill-ctype": "~1.8" + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "conflict": { - "symfony/finder": "<6.4", - "symfony/service-contracts": "<2.5" + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4" }, "require-dev": { - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" + "symfony/config": "^6.4|^7.0", + "symfony/web-profiler-bundle": "^6.4|^7.0" }, - "type": "library", + "type": "symfony-bundle", "autoload": { "psr-4": { - "Symfony\\Component\\Config\\": "" + "Symfony\\Bundle\\DebugBundle\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -12576,10 +11040,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.1.1" + "source": "https://github.com/symfony/debug-bundle/tree/v7.1.1" }, "funding": [ { @@ -12595,71 +11059,83 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-05-31T14:55:39+00:00" }, { - "name": "symfony/dependency-injection", - "version": "v7.1.5", + "name": "symfony/maker-bundle", + "version": "v1.61.0", "source": { "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "38465f925ec4e0707b090e9147c65869837d639d" + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/38465f925ec4e0707b090e9147c65869837d639d", - "reference": "38465f925ec4e0707b090e9147c65869837d639d", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" + "doctrine/inflector": "^2.0", + "nikic/php-parser": "^4.18|^5.0", + "php": ">=8.1", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.2|^3", + "symfony/filesystem": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" }, "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.4", - "symfony/finder": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" + "doctrine/doctrine-bundle": "<2.10", + "doctrine/orm": "<2.15" }, "require-dev": { - "symfony/config": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "composer/semver": "^3.0", + "doctrine/doctrine-bundle": "^2.5.0", + "doctrine/orm": "^2.15|^3", + "symfony/http-client": "^6.4|^7.0", + "symfony/phpunit-bridge": "^6.4.1|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.0|^4.x-dev" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } }, - "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Bundle\\MakerBundle\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "keywords": [ + "code generator", + "dev", + "generator", + "scaffold", + "scaffolding" + ], "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.1.5" + "issues": "https://github.com/symfony/maker-bundle/issues", + "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" }, "funding": [ { @@ -12675,34 +11151,48 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-08-29T22:50:23+00:00" }, { - "name": "symfony/filesystem", + "name": "symfony/mime", "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" + "url": "https://github.com/symfony/mime.git", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", - "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", + "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "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": { - "symfony/process": "^6.4|^7.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", "autoload": { "psr-4": { - "Symfony\\Component\\Filesystem\\": "" + "Symfony\\Component\\Mime\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -12722,10 +11212,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides basic utilities for the filesystem", + "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.5" + "source": "https://github.com/symfony/mime/tree/v7.1.5" }, "funding": [ { @@ -12741,7 +11235,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T09:16:35+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/options-resolver", @@ -12811,27 +11305,38 @@ "time": "2024-05-31T14:57:53+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.31.0", + "name": "symfony/phpunit-bridge", + "version": "v7.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.2.5" }, - "type": "library", + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { @@ -12839,10 +11344,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Bridge\\PhpUnit\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -12859,16 +11365,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.4" }, "funding": [ { @@ -12884,30 +11384,29 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-08-13T14:28:19+00:00" }, { - "name": "symfony/stopwatch", - "version": "v7.1.1", + "name": "symfony/process", + "version": "v7.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + "url": "https://github.com/symfony/process.git", + "reference": "5c03ee6369281177f07f7c68252a280beccba847" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", + "reference": "5c03ee6369281177f07f7c68252a280beccba847", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" + "php": ">=8.2" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -12927,10 +11426,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.1" + "source": "https://github.com/symfony/process/tree/v7.1.5" }, "funding": [ { @@ -12946,34 +11445,46 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-19T21:48:23+00:00" }, { - "name": "symfony/var-exporter", - "version": "v7.1.2", + "name": "symfony/web-profiler-bundle", + "version": "v7.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3cfc775277a8f2dacdd0f72d196bc87b272a763f", + "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/config": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "twig/twig": "^3.10" + }, + "conflict": { + "symfony/form": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" }, - "type": "library", + "type": "symfony-bundle", "autoload": { "psr-4": { - "Symfony\\Component\\VarExporter\\": "" + "Symfony\\Bundle\\WebProfilerBundle\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -12985,28 +11496,21 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "description": "Provides a development tool that gives detailed information about the execution of any request", "homepage": "https://symfony.com", "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" + "dev" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.4" }, "funding": [ { @@ -13022,7 +11526,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T08:00:31+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "thecodingmachine/phpstan-safe-rule", @@ -13302,6 +11806,64 @@ "source": "https://github.com/vimeo/psalm" }, "time": "2024-09-08T18:53:08+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" } ], "aliases": [], @@ -13312,7 +11874,11 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.3" + "php": "^8.3", + "ext-ctype": "*", + "ext-iconv": "*", + "ext-intl": "*", + "ext-mbstring": "*" }, "platform-dev": [], "plugin-api-version": "2.6.0" diff --git a/be/config/app.php b/be/config/app.php deleted file mode 100644 index 7f91e350..00000000 --- a/be/config/app.php +++ /dev/null @@ -1,128 +0,0 @@ - env('APP_NAME', 'Laravel'), - - /* - |-------------------------------------------------------------------------- - | Application Environment - |-------------------------------------------------------------------------- - | - | This value determines the "environment" your application is currently - | running in. This may determine how you prefer to configure various - | services the application utilizes. Set this in your ".env" file. - | - */ - - 'env' => env('APP_ENV', 'production'), - - /* - |-------------------------------------------------------------------------- - | Application Debug Mode - |-------------------------------------------------------------------------- - | - | When your application is in debug mode, detailed error messages with - | stack traces will be shown on every error that occurs within your - | application. If disabled, a simple generic error page is shown. - | - */ - - 'debug' => (bool) env('APP_DEBUG', false), - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | the application so that it's available within Artisan commands. - | - */ - - 'url' => env('APP_URL', 'http://localhost'), - - 'fe_url' => env('APP_FE_URL', 'http://localhost'), - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. The timezone - | is set to "UTC" by default as it is suitable for most use cases. - | - */ - - 'timezone' => env('APP_TIMEZONE', 'UTC'), - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by Laravel's translation / localization methods. This option can be - | set to any locale for which you plan to have translation strings. - | - */ - - 'locale' => env('APP_LOCALE', 'en'), - - 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), - - 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is utilized by Laravel's encryption services and should be set - | to a random, 32 character string to ensure that all encrypted values - | are secure. You should do this prior to deploying the application. - | - */ - - 'cipher' => 'AES-256-CBC', - - 'key' => env('APP_KEY'), - - 'previous_keys' => [ - ...array_filter( - explode(',', env('APP_PREVIOUS_KEYS', '')), - ), - ], - - /* - |-------------------------------------------------------------------------- - | Maintenance Mode Driver - |-------------------------------------------------------------------------- - | - | These configuration options determine the driver used to determine and - | manage Laravel's "maintenance mode" status. The "cache" driver will - | allow maintenance mode to be controlled across multiple machines. - | - | Supported drivers: "file", "cache" - | - */ - - 'maintenance' => [ - 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), - 'store' => env('APP_MAINTENANCE_STORE', 'database'), - ], - -]; diff --git a/be/config/auth.php b/be/config/auth.php deleted file mode 100644 index 0ba5d5d8..00000000 --- a/be/config/auth.php +++ /dev/null @@ -1,115 +0,0 @@ - [ - 'guard' => env('AUTH_GUARD', 'web'), - 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), - ], - - /* - |-------------------------------------------------------------------------- - | Authentication Guards - |-------------------------------------------------------------------------- - | - | Next, you may define every authentication guard for your application. - | Of course, a great default configuration has been defined for you - | which utilizes session storage plus the Eloquent user provider. - | - | All authentication guards have a user provider, which defines how the - | users are actually retrieved out of your database or other storage - | system used by the application. Typically, Eloquent is utilized. - | - | Supported: "session" - | - */ - - 'guards' => [ - 'web' => [ - 'driver' => 'session', - 'provider' => 'users', - ], - ], - - /* - |-------------------------------------------------------------------------- - | User Providers - |-------------------------------------------------------------------------- - | - | All authentication guards have a user provider, which defines how the - | users are actually retrieved out of your database or other storage - | system used by the application. Typically, Eloquent is utilized. - | - | If you have multiple user tables or models you may configure multiple - | providers to represent the model / table. These providers may then - | be assigned to any extra authentication guards you have defined. - | - | Supported: "database", "eloquent" - | - */ - - 'providers' => [ - 'users' => [ - 'driver' => 'eloquent', - 'model' => env('AUTH_MODEL', App\Models\User::class), - ], - - // 'users' => [ - // 'driver' => 'database', - // 'table' => 'users', - // ], - ], - - /* - |-------------------------------------------------------------------------- - | Resetting Passwords - |-------------------------------------------------------------------------- - | - | These configuration options specify the behavior of Laravel's password - | reset functionality, including the table utilized for token storage - | and the user provider that is invoked to actually retrieve users. - | - | The expiry time is the number of minutes that each reset token will be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - | The throttle setting is the number of seconds a user must wait before - | generating more password reset tokens. This prevents the user from - | quickly generating a very large amount of password reset tokens. - | - */ - - 'passwords' => [ - 'users' => [ - 'provider' => 'users', - 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), - 'expire' => 60, - 'throttle' => 60, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Password Confirmation Timeout - |-------------------------------------------------------------------------- - | - | Here you may define the amount of seconds before a password confirmation - | window expires and users are asked to re-enter their password via the - | confirmation screen. By default, the timeout lasts for three hours. - | - */ - - 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), - -]; diff --git a/symfony/config/bundles.php b/be/config/bundles.php similarity index 100% rename from symfony/config/bundles.php rename to be/config/bundles.php diff --git a/be/config/cache.php b/be/config/cache.php deleted file mode 100644 index be32d9f6..00000000 --- a/be/config/cache.php +++ /dev/null @@ -1,107 +0,0 @@ - env('CACHE_STORE', 'database'), - - /* - |-------------------------------------------------------------------------- - | Cache Stores - |-------------------------------------------------------------------------- - | - | Here you may define all of the cache "stores" for your application as - | well as their drivers. You may even define multiple stores for the - | same cache driver to group types of items stored in your caches. - | - | Supported drivers: "array", "database", "file", "memcached", - | "redis", "dynamodb", "octane", "null" - | - */ - - 'stores' => [ - - 'array' => [ - 'driver' => 'array', - 'serialize' => false, - ], - - 'database' => [ - 'driver' => 'database', - 'table' => env('DB_CACHE_TABLE', 'cache'), - 'connection' => env('DB_CACHE_CONNECTION'), - 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), - ], - - 'file' => [ - 'driver' => 'file', - 'path' => storage_path('framework/cache/data'), - 'lock_path' => storage_path('framework/cache/data'), - ], - - 'memcached' => [ - 'driver' => 'memcached', - 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), - 'sasl' => [ - env('MEMCACHED_USERNAME'), - env('MEMCACHED_PASSWORD'), - ], - 'options' => [ - // Memcached::OPT_CONNECT_TIMEOUT => 2000, - ], - 'servers' => [ - [ - 'host' => env('MEMCACHED_HOST', '127.0.0.1'), - 'port' => env('MEMCACHED_PORT', 11211), - 'weight' => 100, - ], - ], - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), - 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), - ], - - 'dynamodb' => [ - 'driver' => 'dynamodb', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), - 'endpoint' => env('DYNAMODB_ENDPOINT'), - ], - - 'octane' => [ - 'driver' => 'octane', - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing the APC, database, memcached, Redis, and DynamoDB cache - | stores, there might be other applications using the same cache. For - | that reason, you may prefix every cache key to avoid collisions. - | - */ - - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'), - -]; diff --git a/be/config/database.php b/be/config/database.php deleted file mode 100644 index a3ba8b8b..00000000 --- a/be/config/database.php +++ /dev/null @@ -1,170 +0,0 @@ - env('DB_CONNECTION', 'sqlite'), - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Below are all of the database connections defined for your application. - | An example configuration is provided for each database system which - | is supported by Laravel. You're free to add / remove connections. - | - */ - - 'connections' => [ - - 'sqlite' => [ - 'driver' => 'sqlite', - 'url' => env('DB_URL'), - 'database' => env('DB_DATABASE', database_path('database.sqlite')), - 'prefix' => '', - 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), - ], - - 'mysql' => [ - 'driver' => 'mysql', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'mariadb' => [ - 'driver' => 'mariadb', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'pgsql' => [ - 'driver' => 'pgsql', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => env('DB_CHARSET', 'utf8'), - 'prefix' => '', - 'prefix_indexes' => true, - 'search_path' => env('DB_SEARCH_PATH', 'public'), - 'sslmode' => 'prefer', - ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => env('DB_CHARSET', 'utf8'), - 'prefix' => '', - 'prefix_indexes' => true, - // 'encrypt' => env('DB_ENCRYPT', 'yes'), - // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run on the database. - | - */ - - 'migrations' => [ - 'table' => 'migrations', - 'update_date_on_publish' => true, - ], - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer body of commands than a typical key-value system - | such as Memcached. You may define your connection settings here. - | - */ - - 'redis' => [ - - 'client' => env('REDIS_CLIENT', 'phpredis'), - - 'options' => [ - 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'), - ], - - 'default' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), - ], - - 'cache' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), - ], - - ], - -]; diff --git a/be/config/filesystems.php b/be/config/filesystems.php deleted file mode 100644 index 40b7e787..00000000 --- a/be/config/filesystems.php +++ /dev/null @@ -1,76 +0,0 @@ - env('FILESYSTEM_DISK', 'local'), - - /* - |-------------------------------------------------------------------------- - | Filesystem Disks - |-------------------------------------------------------------------------- - | - | Below you may configure as many filesystem disks as necessary, and you - | may even configure multiple disks for the same driver. Examples for - | most supported storage drivers are configured here for reference. - | - | Supported Drivers: "local", "ftp", "sftp", "s3" - | - */ - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path('app'), - 'throw' => false, - ], - - 'public' => [ - 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL') . '/storage', - 'visibility' => 'public', - 'throw' => false, - ], - - 's3' => [ - 'driver' => 's3', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION'), - 'bucket' => env('AWS_BUCKET'), - 'url' => env('AWS_URL'), - 'endpoint' => env('AWS_ENDPOINT'), - 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), - 'throw' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Symbolic Links - |-------------------------------------------------------------------------- - | - | Here you may configure the symbolic links that will be created when the - | `storage:link` Artisan command is executed. The array keys should be - | the locations of the links and the values should be their targets. - | - */ - - 'links' => [ - public_path('storage') => storage_path('app/public'), - ], - -]; diff --git a/be/config/logging.php b/be/config/logging.php deleted file mode 100644 index 2272196e..00000000 --- a/be/config/logging.php +++ /dev/null @@ -1,132 +0,0 @@ - env('LOG_CHANNEL', 'stack'), - - /* - |-------------------------------------------------------------------------- - | Deprecations Log Channel - |-------------------------------------------------------------------------- - | - | This option controls the log channel that should be used to log warnings - | regarding deprecated PHP and library features. This allows you to get - | your application ready for upcoming major versions of dependencies. - | - */ - - 'deprecations' => [ - 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), - 'trace' => env('LOG_DEPRECATIONS_TRACE', false), - ], - - /* - |-------------------------------------------------------------------------- - | Log Channels - |-------------------------------------------------------------------------- - | - | Here you may configure the log channels for your application. Laravel - | utilizes the Monolog PHP logging library, which includes a variety - | of powerful log handlers and formatters that you're free to use. - | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", "custom", "stack" - | - */ - - 'channels' => [ - - 'stack' => [ - 'driver' => 'stack', - 'channels' => explode(',', env('LOG_STACK', 'single')), - 'ignore_exceptions' => false, - ], - - 'single' => [ - 'driver' => 'single', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - 'replace_placeholders' => true, - ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - 'days' => env('LOG_DAILY_DAYS', 14), - 'replace_placeholders' => true, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), - 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), - 'level' => env('LOG_LEVEL', 'critical'), - 'replace_placeholders' => true, - ], - - 'papertrail' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), - 'handler_with' => [ - 'host' => env('PAPERTRAIL_URL'), - 'port' => env('PAPERTRAIL_PORT'), - 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), - ], - 'processors' => [PsrLogMessageProcessor::class], - ], - - 'stderr' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => StreamHandler::class, - 'formatter' => env('LOG_STDERR_FORMATTER'), - 'with' => [ - 'stream' => 'php://stderr', - ], - 'processors' => [PsrLogMessageProcessor::class], - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => env('LOG_LEVEL', 'debug'), - 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), - 'replace_placeholders' => true, - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => env('LOG_LEVEL', 'debug'), - 'replace_placeholders' => true, - ], - - 'null' => [ - 'driver' => 'monolog', - 'handler' => NullHandler::class, - ], - - 'emergency' => [ - 'path' => storage_path('logs/laravel.log'), - ], - - ], - -]; diff --git a/be/config/mail.php b/be/config/mail.php deleted file mode 100644 index df13d3df..00000000 --- a/be/config/mail.php +++ /dev/null @@ -1,116 +0,0 @@ - env('MAIL_MAILER', 'log'), - - /* - |-------------------------------------------------------------------------- - | Mailer Configurations - |-------------------------------------------------------------------------- - | - | Here you may configure all of the mailers used by your application plus - | their respective settings. Several examples have been configured for - | you and you are free to add your own as your application requires. - | - | Laravel supports a variety of mail "transport" drivers that can be used - | when delivering an email. You may specify which one you're using for - | your mailers below. You may also add additional mailers if needed. - | - | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", - | "postmark", "resend", "log", "array", - | "failover", "roundrobin" - | - */ - - 'mailers' => [ - - 'smtp' => [ - 'transport' => 'smtp', - 'url' => env('MAIL_URL'), - 'host' => env('MAIL_HOST', '127.0.0.1'), - 'port' => env('MAIL_PORT', 2525), - 'encryption' => env('MAIL_ENCRYPTION', 'tls'), - 'username' => env('MAIL_USERNAME'), - 'password' => env('MAIL_PASSWORD'), - 'timeout' => null, - 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), - ], - - 'ses' => [ - 'transport' => 'ses', - ], - - 'postmark' => [ - 'transport' => 'postmark', - // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), - // 'client' => [ - // 'timeout' => 5, - // ], - ], - - 'resend' => [ - 'transport' => 'resend', - ], - - 'sendmail' => [ - 'transport' => 'sendmail', - 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), - ], - - 'log' => [ - 'transport' => 'log', - 'channel' => env('MAIL_LOG_CHANNEL'), - ], - - 'array' => [ - 'transport' => 'array', - ], - - 'failover' => [ - 'transport' => 'failover', - 'mailers' => [ - 'smtp', - 'log', - ], - ], - - 'roundrobin' => [ - 'transport' => 'roundrobin', - 'mailers' => [ - 'ses', - 'postmark', - ], - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all emails sent by your application to be sent from - | the same address. Here you may specify a name and address that is - | used globally for all emails that are sent by your application. - | - */ - - 'from' => [ - 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), - 'name' => env('MAIL_FROM_NAME', 'Example'), - ], - -]; diff --git a/symfony/config/packages/cache.yaml b/be/config/packages/cache.yaml similarity index 100% rename from symfony/config/packages/cache.yaml rename to be/config/packages/cache.yaml diff --git a/symfony/config/packages/debug.yaml b/be/config/packages/debug.yaml similarity index 100% rename from symfony/config/packages/debug.yaml rename to be/config/packages/debug.yaml diff --git a/symfony/config/packages/doctrine.yaml b/be/config/packages/doctrine.yaml similarity index 100% rename from symfony/config/packages/doctrine.yaml rename to be/config/packages/doctrine.yaml diff --git a/symfony/config/packages/framework.yaml b/be/config/packages/framework.yaml similarity index 100% rename from symfony/config/packages/framework.yaml rename to be/config/packages/framework.yaml diff --git a/symfony/config/packages/ignition.yaml b/be/config/packages/ignition.yaml similarity index 100% rename from symfony/config/packages/ignition.yaml rename to be/config/packages/ignition.yaml diff --git a/symfony/config/packages/routing.yaml b/be/config/packages/routing.yaml similarity index 100% rename from symfony/config/packages/routing.yaml rename to be/config/packages/routing.yaml diff --git a/symfony/config/packages/translation.yaml b/be/config/packages/translation.yaml similarity index 100% rename from symfony/config/packages/translation.yaml rename to be/config/packages/translation.yaml diff --git a/symfony/config/packages/twig.yaml b/be/config/packages/twig.yaml similarity index 100% rename from symfony/config/packages/twig.yaml rename to be/config/packages/twig.yaml diff --git a/symfony/config/packages/validator.yaml b/be/config/packages/validator.yaml similarity index 100% rename from symfony/config/packages/validator.yaml rename to be/config/packages/validator.yaml diff --git a/symfony/config/packages/web_profiler.yaml b/be/config/packages/web_profiler.yaml similarity index 100% rename from symfony/config/packages/web_profiler.yaml rename to be/config/packages/web_profiler.yaml diff --git a/symfony/config/preload.php b/be/config/preload.php similarity index 100% rename from symfony/config/preload.php rename to be/config/preload.php diff --git a/be/config/queue.php b/be/config/queue.php deleted file mode 100644 index 116bd8d0..00000000 --- a/be/config/queue.php +++ /dev/null @@ -1,112 +0,0 @@ - env('QUEUE_CONNECTION', 'database'), - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection options for every queue backend - | used by your application. An example configuration is provided for - | each backend supported by Laravel. You're also free to add more. - | - | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" - | - */ - - 'connections' => [ - - 'sync' => [ - 'driver' => 'sync', - ], - - 'database' => [ - 'driver' => 'database', - 'connection' => env('DB_QUEUE_CONNECTION'), - 'table' => env('DB_QUEUE_TABLE', 'jobs'), - 'queue' => env('DB_QUEUE', 'default'), - 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), - 'after_commit' => false, - ], - - 'beanstalkd' => [ - 'driver' => 'beanstalkd', - 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), - 'queue' => env('BEANSTALKD_QUEUE', 'default'), - 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), - 'block_for' => 0, - 'after_commit' => false, - ], - - 'sqs' => [ - 'driver' => 'sqs', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), - 'queue' => env('SQS_QUEUE', 'default'), - 'suffix' => env('SQS_SUFFIX'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'after_commit' => false, - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), - 'queue' => env('REDIS_QUEUE', 'default'), - 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), - 'block_for' => null, - 'after_commit' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Job Batching - |-------------------------------------------------------------------------- - | - | The following options configure the database and table that store job - | batching information. These options can be updated to any database - | connection and table which has been defined by your application. - | - */ - - 'batching' => [ - 'database' => env('DB_CONNECTION', 'sqlite'), - 'table' => 'job_batches', - ], - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control how and where failed jobs are stored. Laravel ships with - | support for storing failed jobs in a simple file or in a database. - | - | Supported drivers: "database-uuids", "dynamodb", "file", "null" - | - */ - - 'failed' => [ - 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), - 'database' => env('DB_CONNECTION', 'sqlite'), - 'table' => 'failed_jobs', - ], - -]; diff --git a/symfony/config/routes.yaml b/be/config/routes.yaml similarity index 100% rename from symfony/config/routes.yaml rename to be/config/routes.yaml diff --git a/symfony/config/routes/framework.yaml b/be/config/routes/framework.yaml similarity index 100% rename from symfony/config/routes/framework.yaml rename to be/config/routes/framework.yaml diff --git a/symfony/config/routes/web_profiler.yaml b/be/config/routes/web_profiler.yaml similarity index 100% rename from symfony/config/routes/web_profiler.yaml rename to be/config/routes/web_profiler.yaml diff --git a/be/config/services.php b/be/config/services.php deleted file mode 100644 index 0d680dfa..00000000 --- a/be/config/services.php +++ /dev/null @@ -1,42 +0,0 @@ - [ - 'token' => env('POSTMARK_TOKEN'), - ], - - 'ses' => [ - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - ], - - 'resend' => [ - 'key' => env('RESEND_KEY'), - ], - - 'slack' => [ - 'notifications' => [ - 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), - 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), - ], - ], - - 'recaptcha' => [ - 'secret' => env('RECAPTCHA_SECRET'), - ], - -]; diff --git a/symfony/config/services.yaml b/be/config/services.yaml similarity index 100% rename from symfony/config/services.yaml rename to be/config/services.yaml diff --git a/be/config/session.php b/be/config/session.php deleted file mode 100644 index 1ace1f19..00000000 --- a/be/config/session.php +++ /dev/null @@ -1,217 +0,0 @@ - env('SESSION_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to expire immediately when the browser is closed then you may - | indicate that via the expire_on_close configuration option. - | - */ - - 'lifetime' => env('SESSION_LIFETIME', 120), - - 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), - - /* - |-------------------------------------------------------------------------- - | Session Encryption - |-------------------------------------------------------------------------- - | - | This option allows you to easily specify that all of your session data - | should be encrypted before it's stored. All encryption is performed - | automatically by Laravel and you may use the session like normal. - | - */ - - 'encrypt' => env('SESSION_ENCRYPT', false), - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When utilizing the "file" session driver, the session files are placed - | on disk. The default storage location is defined here; however, you - | are free to provide another location where they should be stored. - | - */ - - 'files' => storage_path('framework/sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => env('SESSION_CONNECTION'), - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table to - | be used to store sessions. Of course, a sensible default is defined - | for you; however, you're welcome to change this to another table. - | - */ - - 'table' => env('SESSION_TABLE', 'sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Cache Store - |-------------------------------------------------------------------------- - | - | When using one of the framework's cache driven session backends, you may - | define the cache store which should be used to store the session data - | between requests. This must match one of your defined cache stores. - | - | Affects: "apc", "dynamodb", "memcached", "redis" - | - */ - - 'store' => env('SESSION_STORE'), - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => [2, 100], - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the session cookie that is created by - | the framework. Typically, you should not need to change this value - | since doing so does not grant a meaningful security improvement. - | - */ - - 'cookie' => env( - 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_') . '_session', - ), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application, but you're free to change this when necessary. - | - */ - - 'path' => env('SESSION_PATH', '/'), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | This value determines the domain and subdomains the session cookie is - | available to. By default, the cookie will be available to the root - | domain and all subdomains. Typically, this shouldn't be changed. - | - */ - - 'domain' => env('SESSION_DOMAIN'), - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you when it can't be done securely. - | - */ - - 'secure' => env('SESSION_SECURE_COOKIE'), - - /* - |-------------------------------------------------------------------------- - | HTTP Access Only - |-------------------------------------------------------------------------- - | - | Setting this value to true will prevent JavaScript from accessing the - | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. It's unlikely you should disable this option. - | - */ - - 'http_only' => env('SESSION_HTTP_ONLY', true), - - /* - |-------------------------------------------------------------------------- - | Same-Site Cookies - |-------------------------------------------------------------------------- - | - | This option determines how your cookies behave when cross-site requests - | take place, and can be used to mitigate CSRF attacks. By default, we - | will set this value to "lax" to permit secure cross-site requests. - | - | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value - | - | Supported: "lax", "strict", "none", null - | - */ - - 'same_site' => env('SESSION_SAME_SITE', 'lax'), - - /* - |-------------------------------------------------------------------------- - | Partitioned Cookies - |-------------------------------------------------------------------------- - | - | Setting this value to true will tie the cookie to the top-level site for - | a cross-site context. Partitioned cookies are accepted by the browser - | when flagged "secure" and the Same-Site attribute is set to "none". - | - */ - - 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), - -]; diff --git a/symfony/infection.json5 b/be/infection.json5 similarity index 100% rename from symfony/infection.json5 rename to be/infection.json5 diff --git a/symfony/phan.php b/be/phan.php similarity index 100% rename from symfony/phan.php rename to be/phan.php diff --git a/symfony/phpcs.xml.dist b/be/phpcs.xml.dist similarity index 100% rename from symfony/phpcs.xml.dist rename to be/phpcs.xml.dist diff --git a/symfony/phpmd.xml b/be/phpmd.xml similarity index 100% rename from symfony/phpmd.xml rename to be/phpmd.xml diff --git a/symfony/phpstan.dist.neon b/be/phpstan.dist.neon similarity index 100% rename from symfony/phpstan.dist.neon rename to be/phpstan.dist.neon diff --git a/symfony/phpunit.xml.dist b/be/phpunit.xml.dist similarity index 100% rename from symfony/phpunit.xml.dist rename to be/phpunit.xml.dist diff --git a/symfony/pint.json b/be/pint.json similarity index 100% rename from symfony/pint.json rename to be/pint.json diff --git a/symfony/psalm.xml b/be/psalm.xml similarity index 100% rename from symfony/psalm.xml rename to be/psalm.xml diff --git a/be/public/index.php b/be/public/index.php index 831686dc..9982c218 100644 --- a/be/public/index.php +++ b/be/public/index.php @@ -1,18 +1,9 @@ handleRequest(Request::capture()); +return function (array $context) { + return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); +}; diff --git a/symfony/public/react-json-view/react-dom.js b/be/public/react-json-view/react-dom.js similarity index 100% rename from symfony/public/react-json-view/react-dom.js rename to be/public/react-json-view/react-dom.js diff --git a/symfony/public/react-json-view/react-json-view.js b/be/public/react-json-view/react-json-view.js similarity index 100% rename from symfony/public/react-json-view/react-json-view.js rename to be/public/react-json-view/react-json-view.js diff --git a/symfony/public/react-json-view/react.js b/be/public/react-json-view/react.js similarity index 100% rename from symfony/public/react-json-view/react.js rename to be/public/react-json-view/react.js diff --git a/symfony/public/react-json-view/scheduler.js b/be/public/react-json-view/scheduler.js similarity index 100% rename from symfony/public/react-json-view/scheduler.js rename to be/public/react-json-view/scheduler.js diff --git a/be/resources/views/sitemaps/forums.blade.php b/be/resources/views/sitemaps/forums.blade.php deleted file mode 100644 index 42c6d203..00000000 --- a/be/resources/views/sitemaps/forums.blade.php +++ /dev/null @@ -1,16 +0,0 @@ - - @foreach ($tidsKeyByFid as $fid => $tids) - @php($forumSitemapPath = config('app.url') . "/sitemaps/forums/$fid/threads") - - {{ $forumSitemapPath }} - - @foreach ($tids as $tid) - - {{ $forumSitemapPath }}?cursor={{ $tid }} - - @endforeach - @endforeach - diff --git a/be/resources/views/sitemaps/threads.blade.php b/be/resources/views/sitemaps/threads.blade.php deleted file mode 100644 index e0fc3a97..00000000 --- a/be/resources/views/sitemaps/threads.blade.php +++ /dev/null @@ -1,10 +0,0 @@ - - @foreach ($tids as $tid) - - {{ config('app.fe_url') }}/posts/tid/{{ $tid }} - - @endforeach - diff --git a/be/routes/api.php b/be/routes/api.php deleted file mode 100644 index 33167e55..00000000 --- a/be/routes/api.php +++ /dev/null @@ -1,11 +0,0 @@ - \App\Eloquent\Model\Forum::all()); -Route::middleware(ReCAPTCHACheck::class)->group(static function () { - Route::get('/posts', [Controllers\PostsQuery::class, 'query']); - Route::get('/users', [Controllers\UsersQuery::class, 'query']); -}); diff --git a/be/routes/web.php b/be/routes/web.php deleted file mode 100644 index 06e85cdb..00000000 --- a/be/routes/web.php +++ /dev/null @@ -1,27 +0,0 @@ - Cache::remember( - '/sitemaps/forums', - 86400, - static fn() => Helper::xmlResponse(view('sitemaps.forums', [ - 'tidsKeyByFid' => Forum::orderBy('fid')->get('fid')->pluck('fid')->mapWithKeys(fn(int $fid) => [ - $fid => DB::query() - ->fromSub(PostFactory::newThread($fid) - ->selectRaw('ROW_NUMBER() OVER (ORDER BY tid) AS rn, tid'), 't') - ->whereRaw('rn % ' . Controllers\ThreadsSitemap::$maxUrls . ' = 0') - ->pluck('tid'), - ])])), -)); -Route::get('/sitemaps/forums/{fid}/threads', [Controllers\ThreadsSitemap::class, 'query']); - -Route::get('/assets/{filename}', static fn(string $filename) => - response(preg_replace_callback_array([ - '#/npm/(?\w+)@(\d+\.?){3}/\+esm#' => static fn(array $m) => url("assets/{$m['filename']}.js"), - '@^//# sourceMappingURL=.+$@m' => static fn() => '', - ], File::get(public_path("react-json-view/$filename")))) - ->header('Content-Type', 'text/javascript')); diff --git a/symfony/src/Controller/AssetController.php b/be/src/Controller/AssetController.php similarity index 100% rename from symfony/src/Controller/AssetController.php rename to be/src/Controller/AssetController.php diff --git a/symfony/src/Controller/ForumsController.php b/be/src/Controller/ForumsController.php similarity index 100% rename from symfony/src/Controller/ForumsController.php rename to be/src/Controller/ForumsController.php diff --git a/symfony/src/Controller/PostsController.php b/be/src/Controller/PostsController.php similarity index 100% rename from symfony/src/Controller/PostsController.php rename to be/src/Controller/PostsController.php diff --git a/symfony/src/Controller/SitemapController.php b/be/src/Controller/SitemapController.php similarity index 100% rename from symfony/src/Controller/SitemapController.php rename to be/src/Controller/SitemapController.php diff --git a/symfony/src/Controller/UsersController.php b/be/src/Controller/UsersController.php similarity index 100% rename from symfony/src/Controller/UsersController.php rename to be/src/Controller/UsersController.php diff --git a/symfony/src/DTO/User/AuthorExpGrade.php b/be/src/DTO/User/AuthorExpGrade.php similarity index 100% rename from symfony/src/DTO/User/AuthorExpGrade.php rename to be/src/DTO/User/AuthorExpGrade.php diff --git a/symfony/src/DTO/User/ForumModerator.php b/be/src/DTO/User/ForumModerator.php similarity index 100% rename from symfony/src/DTO/User/ForumModerator.php rename to be/src/DTO/User/ForumModerator.php diff --git a/symfony/src/Doctrine/AlwaysQuoteStrategy.php b/be/src/Doctrine/AlwaysQuoteStrategy.php similarity index 100% rename from symfony/src/Doctrine/AlwaysQuoteStrategy.php rename to be/src/Doctrine/AlwaysQuoteStrategy.php diff --git a/symfony/src/Entity/BlobResourceGetter.php b/be/src/Entity/BlobResourceGetter.php similarity index 100% rename from symfony/src/Entity/BlobResourceGetter.php rename to be/src/Entity/BlobResourceGetter.php diff --git a/symfony/src/Entity/Forum.php b/be/src/Entity/Forum.php similarity index 100% rename from symfony/src/Entity/Forum.php rename to be/src/Entity/Forum.php diff --git a/symfony/src/Entity/LatestReplier.php b/be/src/Entity/LatestReplier.php similarity index 100% rename from symfony/src/Entity/LatestReplier.php rename to be/src/Entity/LatestReplier.php diff --git a/symfony/src/Entity/Post/Content/PostContent.php b/be/src/Entity/Post/Content/PostContent.php similarity index 100% rename from symfony/src/Entity/Post/Content/PostContent.php rename to be/src/Entity/Post/Content/PostContent.php diff --git a/symfony/src/Entity/Post/Content/ReplyContent.php b/be/src/Entity/Post/Content/ReplyContent.php similarity index 100% rename from symfony/src/Entity/Post/Content/ReplyContent.php rename to be/src/Entity/Post/Content/ReplyContent.php diff --git a/symfony/src/Entity/Post/Content/SubReplyContent.php b/be/src/Entity/Post/Content/SubReplyContent.php similarity index 100% rename from symfony/src/Entity/Post/Content/SubReplyContent.php rename to be/src/Entity/Post/Content/SubReplyContent.php diff --git a/symfony/src/Entity/Post/Post.php b/be/src/Entity/Post/Post.php similarity index 100% rename from symfony/src/Entity/Post/Post.php rename to be/src/Entity/Post/Post.php diff --git a/symfony/src/Entity/Post/PostWithContent.php b/be/src/Entity/Post/PostWithContent.php similarity index 100% rename from symfony/src/Entity/Post/PostWithContent.php rename to be/src/Entity/Post/PostWithContent.php diff --git a/symfony/src/Entity/Post/Reply.php b/be/src/Entity/Post/Reply.php similarity index 100% rename from symfony/src/Entity/Post/Reply.php rename to be/src/Entity/Post/Reply.php diff --git a/symfony/src/Entity/Post/SubReply.php b/be/src/Entity/Post/SubReply.php similarity index 100% rename from symfony/src/Entity/Post/SubReply.php rename to be/src/Entity/Post/SubReply.php diff --git a/symfony/src/Entity/Post/Thread.php b/be/src/Entity/Post/Thread.php similarity index 100% rename from symfony/src/Entity/Post/Thread.php rename to be/src/Entity/Post/Thread.php diff --git a/symfony/src/Entity/Revision/AuthorExpGrade.php b/be/src/Entity/Revision/AuthorExpGrade.php similarity index 100% rename from symfony/src/Entity/Revision/AuthorExpGrade.php rename to be/src/Entity/Revision/AuthorExpGrade.php diff --git a/symfony/src/Entity/Revision/ForumModerator.php b/be/src/Entity/Revision/ForumModerator.php similarity index 100% rename from symfony/src/Entity/Revision/ForumModerator.php rename to be/src/Entity/Revision/ForumModerator.php diff --git a/symfony/src/Entity/TimestampedEntity.php b/be/src/Entity/TimestampedEntity.php similarity index 100% rename from symfony/src/Entity/TimestampedEntity.php rename to be/src/Entity/TimestampedEntity.php diff --git a/symfony/src/Entity/User.php b/be/src/Entity/User.php similarity index 100% rename from symfony/src/Entity/User.php rename to be/src/Entity/User.php diff --git a/symfony/src/EventListener/ExceptionToJsonResponse.php b/be/src/EventListener/ExceptionToJsonResponse.php similarity index 100% rename from symfony/src/EventListener/ExceptionToJsonResponse.php rename to be/src/EventListener/ExceptionToJsonResponse.php diff --git a/symfony/src/EventListener/PrettyJsonResponse.php b/be/src/EventListener/PrettyJsonResponse.php similarity index 100% rename from symfony/src/EventListener/PrettyJsonResponse.php rename to be/src/EventListener/PrettyJsonResponse.php diff --git a/symfony/src/EventListener/SerializeToJson.php b/be/src/EventListener/SerializeToJson.php similarity index 100% rename from symfony/src/EventListener/SerializeToJson.php rename to be/src/EventListener/SerializeToJson.php diff --git a/symfony/src/EventListener/ShowReactJsonView.php b/be/src/EventListener/ShowReactJsonView.php similarity index 100% rename from symfony/src/EventListener/ShowReactJsonView.php rename to be/src/EventListener/ShowReactJsonView.php diff --git a/symfony/src/Helper.php b/be/src/Helper.php similarity index 100% rename from symfony/src/Helper.php rename to be/src/Helper.php diff --git a/symfony/src/Kernel.php b/be/src/Kernel.php similarity index 100% rename from symfony/src/Kernel.php rename to be/src/Kernel.php diff --git a/symfony/src/PostsQuery/BaseQuery.php b/be/src/PostsQuery/BaseQuery.php similarity index 100% rename from symfony/src/PostsQuery/BaseQuery.php rename to be/src/PostsQuery/BaseQuery.php diff --git a/symfony/src/PostsQuery/CursorCodec.php b/be/src/PostsQuery/CursorCodec.php similarity index 100% rename from symfony/src/PostsQuery/CursorCodec.php rename to be/src/PostsQuery/CursorCodec.php diff --git a/symfony/src/PostsQuery/IndexQuery.php b/be/src/PostsQuery/IndexQuery.php similarity index 100% rename from symfony/src/PostsQuery/IndexQuery.php rename to be/src/PostsQuery/IndexQuery.php diff --git a/symfony/src/PostsQuery/ParamsValidator.php b/be/src/PostsQuery/ParamsValidator.php similarity index 100% rename from symfony/src/PostsQuery/ParamsValidator.php rename to be/src/PostsQuery/ParamsValidator.php diff --git a/symfony/src/PostsQuery/QueryParam.php b/be/src/PostsQuery/QueryParam.php similarity index 100% rename from symfony/src/PostsQuery/QueryParam.php rename to be/src/PostsQuery/QueryParam.php diff --git a/symfony/src/PostsQuery/QueryParams.php b/be/src/PostsQuery/QueryParams.php similarity index 100% rename from symfony/src/PostsQuery/QueryParams.php rename to be/src/PostsQuery/QueryParams.php diff --git a/symfony/src/PostsQuery/SearchQuery.php b/be/src/PostsQuery/SearchQuery.php similarity index 100% rename from symfony/src/PostsQuery/SearchQuery.php rename to be/src/PostsQuery/SearchQuery.php diff --git a/symfony/src/Repository/ForumRepository.php b/be/src/Repository/ForumRepository.php similarity index 100% rename from symfony/src/Repository/ForumRepository.php rename to be/src/Repository/ForumRepository.php diff --git a/symfony/src/Repository/LatestReplierRepository.php b/be/src/Repository/LatestReplierRepository.php similarity index 100% rename from symfony/src/Repository/LatestReplierRepository.php rename to be/src/Repository/LatestReplierRepository.php diff --git a/symfony/src/Repository/Post/Content/ReplyContentRepository.php b/be/src/Repository/Post/Content/ReplyContentRepository.php similarity index 100% rename from symfony/src/Repository/Post/Content/ReplyContentRepository.php rename to be/src/Repository/Post/Content/ReplyContentRepository.php diff --git a/symfony/src/Repository/Post/Content/SubReplyContentRepository.php b/be/src/Repository/Post/Content/SubReplyContentRepository.php similarity index 100% rename from symfony/src/Repository/Post/Content/SubReplyContentRepository.php rename to be/src/Repository/Post/Content/SubReplyContentRepository.php diff --git a/symfony/src/Repository/Post/PostRepository.php b/be/src/Repository/Post/PostRepository.php similarity index 100% rename from symfony/src/Repository/Post/PostRepository.php rename to be/src/Repository/Post/PostRepository.php diff --git a/symfony/src/Repository/Post/PostRepositoryFactory.php b/be/src/Repository/Post/PostRepositoryFactory.php similarity index 100% rename from symfony/src/Repository/Post/PostRepositoryFactory.php rename to be/src/Repository/Post/PostRepositoryFactory.php diff --git a/symfony/src/Repository/Post/ReplyRepository.php b/be/src/Repository/Post/ReplyRepository.php similarity index 100% rename from symfony/src/Repository/Post/ReplyRepository.php rename to be/src/Repository/Post/ReplyRepository.php diff --git a/symfony/src/Repository/Post/SubReplyRepository.php b/be/src/Repository/Post/SubReplyRepository.php similarity index 100% rename from symfony/src/Repository/Post/SubReplyRepository.php rename to be/src/Repository/Post/SubReplyRepository.php diff --git a/symfony/src/Repository/Post/ThreadRepository.php b/be/src/Repository/Post/ThreadRepository.php similarity index 100% rename from symfony/src/Repository/Post/ThreadRepository.php rename to be/src/Repository/Post/ThreadRepository.php diff --git a/symfony/src/Repository/Revision/AuthorExpGradeRepository.php b/be/src/Repository/Revision/AuthorExpGradeRepository.php similarity index 100% rename from symfony/src/Repository/Revision/AuthorExpGradeRepository.php rename to be/src/Repository/Revision/AuthorExpGradeRepository.php diff --git a/symfony/src/Repository/Revision/ForumModeratorRepository.php b/be/src/Repository/Revision/ForumModeratorRepository.php similarity index 100% rename from symfony/src/Repository/Revision/ForumModeratorRepository.php rename to be/src/Repository/Revision/ForumModeratorRepository.php diff --git a/symfony/src/Repository/UserRepository.php b/be/src/Repository/UserRepository.php similarity index 100% rename from symfony/src/Repository/UserRepository.php rename to be/src/Repository/UserRepository.php diff --git a/symfony/src/Validator/DateTimeRange.php b/be/src/Validator/DateTimeRange.php similarity index 100% rename from symfony/src/Validator/DateTimeRange.php rename to be/src/Validator/DateTimeRange.php diff --git a/symfony/src/Validator/DateTimeRangeValidator.php b/be/src/Validator/DateTimeRangeValidator.php similarity index 100% rename from symfony/src/Validator/DateTimeRangeValidator.php rename to be/src/Validator/DateTimeRangeValidator.php diff --git a/symfony/src/Validator/Validator.php b/be/src/Validator/Validator.php similarity index 100% rename from symfony/src/Validator/Validator.php rename to be/src/Validator/Validator.php diff --git a/be/storage/app/.gitignore b/be/storage/app/.gitignore deleted file mode 100644 index 8f4803c0..00000000 --- a/be/storage/app/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!public/ -!.gitignore diff --git a/be/storage/app/public/.gitignore b/be/storage/app/public/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/storage/app/public/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/be/storage/debugbar/.gitignore b/be/storage/debugbar/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/storage/debugbar/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/be/storage/framework/.gitignore b/be/storage/framework/.gitignore deleted file mode 100644 index 05c4471f..00000000 --- a/be/storage/framework/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -compiled.php -config.php -down -events.scanned.php -maintenance.php -routes.php -routes.scanned.php -schedule-* -services.json diff --git a/be/storage/framework/cache/.gitignore b/be/storage/framework/cache/.gitignore deleted file mode 100644 index 01e4a6cd..00000000 --- a/be/storage/framework/cache/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!data/ -!.gitignore diff --git a/be/storage/framework/cache/data/.gitignore b/be/storage/framework/cache/data/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/storage/framework/cache/data/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/be/storage/framework/sessions/.gitignore b/be/storage/framework/sessions/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/storage/framework/sessions/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/be/storage/framework/testing/.gitignore b/be/storage/framework/testing/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/storage/framework/testing/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/be/storage/framework/views/.gitignore b/be/storage/framework/views/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/storage/framework/views/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/be/storage/logs/.gitignore b/be/storage/logs/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/be/storage/logs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/symfony/symfony.lock b/be/symfony.lock similarity index 100% rename from symfony/symfony.lock rename to be/symfony.lock diff --git a/symfony/templates/sitemaps/forums.xml.twig b/be/templates/sitemaps/forums.xml.twig similarity index 100% rename from symfony/templates/sitemaps/forums.xml.twig rename to be/templates/sitemaps/forums.xml.twig diff --git a/symfony/templates/sitemaps/threads.xml.twig b/be/templates/sitemaps/threads.xml.twig similarity index 100% rename from symfony/templates/sitemaps/threads.xml.twig rename to be/templates/sitemaps/threads.xml.twig diff --git a/symfony/tests/Entity/BlobResourceGetterTest.php b/be/tests/Entity/BlobResourceGetterTest.php similarity index 100% rename from symfony/tests/Entity/BlobResourceGetterTest.php rename to be/tests/Entity/BlobResourceGetterTest.php diff --git a/symfony/tests/EventListener/ExceptionToJsonResponseTest.php b/be/tests/EventListener/ExceptionToJsonResponseTest.php similarity index 100% rename from symfony/tests/EventListener/ExceptionToJsonResponseTest.php rename to be/tests/EventListener/ExceptionToJsonResponseTest.php diff --git a/symfony/tests/EventListener/PrettyJsonResponseTest.php b/be/tests/EventListener/PrettyJsonResponseTest.php similarity index 100% rename from symfony/tests/EventListener/PrettyJsonResponseTest.php rename to be/tests/EventListener/PrettyJsonResponseTest.php diff --git a/symfony/tests/EventListener/ShowReactJsonViewTest.php b/be/tests/EventListener/ShowReactJsonViewTest.php similarity index 100% rename from symfony/tests/EventListener/ShowReactJsonViewTest.php rename to be/tests/EventListener/ShowReactJsonViewTest.php diff --git a/symfony/tests/HelperTest.php b/be/tests/HelperTest.php similarity index 100% rename from symfony/tests/HelperTest.php rename to be/tests/HelperTest.php diff --git a/symfony/tests/PostsQuery/BaseQueryTest.php b/be/tests/PostsQuery/BaseQueryTest.php similarity index 100% rename from symfony/tests/PostsQuery/BaseQueryTest.php rename to be/tests/PostsQuery/BaseQueryTest.php diff --git a/symfony/tests/PostsQuery/CursorCodecTest.php b/be/tests/PostsQuery/CursorCodecTest.php similarity index 100% rename from symfony/tests/PostsQuery/CursorCodecTest.php rename to be/tests/PostsQuery/CursorCodecTest.php diff --git a/symfony/tests/PostsQuery/ParamsValidatorTest.php b/be/tests/PostsQuery/ParamsValidatorTest.php similarity index 100% rename from symfony/tests/PostsQuery/ParamsValidatorTest.php rename to be/tests/PostsQuery/ParamsValidatorTest.php diff --git a/symfony/tests/PostsQuery/QueryParamTest.php b/be/tests/PostsQuery/QueryParamTest.php similarity index 100% rename from symfony/tests/PostsQuery/QueryParamTest.php rename to be/tests/PostsQuery/QueryParamTest.php diff --git a/symfony/tests/PostsQuery/QueryParamsTest.php b/be/tests/PostsQuery/QueryParamsTest.php similarity index 100% rename from symfony/tests/PostsQuery/QueryParamsTest.php rename to be/tests/PostsQuery/QueryParamsTest.php diff --git a/symfony/tests/Repository/Post/PostRepositoryFactoryTest.php b/be/tests/Repository/Post/PostRepositoryFactoryTest.php similarity index 100% rename from symfony/tests/Repository/Post/PostRepositoryFactoryTest.php rename to be/tests/Repository/Post/PostRepositoryFactoryTest.php diff --git a/be/tests/TestCase.php b/be/tests/TestCase.php deleted file mode 100644 index 84a73f44..00000000 --- a/be/tests/TestCase.php +++ /dev/null @@ -1,6 +0,0 @@ - symfony/framework-bundle ### -/.env.local -/.env.local.php -/.env.*.local -/config/secrets/prod/prod.decrypt.private.php -/public/bundles/ -/var/ -/vendor/ -###< symfony/framework-bundle ### - -###> symfony/phpunit-bridge ### -.phpunit.result.cache -/phpunit.xml -###< symfony/phpunit-bridge ### - -###> phpunit/phpunit ### -/phpunit.xml -.phpunit.result.cache -###< phpunit/phpunit ### - -###> phpstan/phpstan ### -phpstan.neon -###< phpstan/phpstan ### - -###> friendsofphp/php-cs-fixer ### -/.php-cs-fixer.php -/.php-cs-fixer.cache -###< friendsofphp/php-cs-fixer ### - -###> squizlabs/php_codesniffer ### -/.phpcs-cache -/phpcs.xml -###< squizlabs/php_codesniffer ### diff --git a/symfony/composer.json b/symfony/composer.json deleted file mode 100644 index 38666f53..00000000 --- a/symfony/composer.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "type": "project", - "license": "proprietary", - "minimum-stability": "stable", - "prefer-stable": true, - "require": { - "php": "^8.3", - "ext-ctype": "*", - "ext-iconv": "*", - "ext-intl": "*", - "ext-mbstring": "*", - "doctrine/doctrine-bundle": "^2.13.0", - "doctrine/orm": "^3.2.2", - "google/protobuf": "^4.28.2", - "illuminate/collections": "^11.26.0", - "spatie/laravel-collection-macros": "^7.14.1", - "spatie/regex": "^3.1.1", - "symfony/asset": "^7.1.1", - "symfony/dotenv": "^7.1.5", - "symfony/flex": "^2.4.6", - "symfony/framework-bundle": "^7.1.5", - "symfony/runtime": "^7.1.1", - "symfony/serializer": "^7.1.5", - "symfony/stopwatch": "7.1.*", - "symfony/twig-bundle": "^7.1.5", - "symfony/validator": "7.1.*", - "symfony/yaml": "^7.1.5", - "thecodingmachine/safe": "^2.5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.64.0", - "infection/infection": "^0.27.11", - "laravel/pint": "^1.18.1", - "phan/phan": "^5.4.5", - "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-strict-rules": "^1.6.1", - "phpstan/phpstan-symfony": "^1.4.10", - "phpunit/phpunit": "^10.5.35", - "psalm/plugin-symfony": "^5.2.5", - "roave/security-advisories": "dev-latest", - "spatie/symfony-ignition-bundle": "^1.1.0", - "squizlabs/php_codesniffer": "^3.10.3", - "symfony/debug-bundle": "^7.1.1", - "symfony/maker-bundle": "^1.61.0", - "symfony/phpunit-bridge": "^7.1.4", - "symfony/web-profiler-bundle": "^7.1.4", - "thecodingmachine/phpstan-safe-rule": "^1.2.0", - "vimeo/psalm": "^5.26.1" - }, - "config": { - "allow-plugins": { - "php-http/discovery": true, - "symfony/flex": true, - "symfony/runtime": true, - "infection/extension-installer": true, - "phpstan/extension-installer": true - }, - "sort-packages": true - }, - "autoload": { - "psr-4": { - "App\\": "src/", - "TbClient\\": "../tbclient.protobuf/tbm_php/TbClient/", - "GPBMetadata\\": "../tbclient.protobuf/tbm_php/GPBMetadata/" - } - }, - "autoload-dev": { - "psr-4": { - "App\\Tests\\": "tests/" - } - }, - "replace": { - "symfony/polyfill-ctype": "*", - "symfony/polyfill-iconv": "*", - "symfony/polyfill-intl-grapheme": "*", - "symfony/polyfill-intl-idn": "*", - "symfony/polyfill-intl-normalizer": "*", - "symfony/polyfill-mbstring": "*", - "symfony/polyfill-php72": "*", - "symfony/polyfill-php73": "*", - "symfony/polyfill-php74": "*", - "symfony/polyfill-php80": "*", - "symfony/polyfill-php81": "*", - "symfony/polyfill-php82": "*", - "symfony/polyfill-php83": "*" - }, - "conflict": { - "symfony/symfony": "*" - }, - "extra": { - "symfony": { - "allow-contrib": false, - "require": "7.1.*" - } - }, - "scripts": { - "auto-scripts": { - "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd" - }, - "post-install-cmd": [ - "@auto-scripts" - ], - "post-update-cmd": [ - "@auto-scripts" - ] - } -} diff --git a/symfony/composer.lock b/symfony/composer.lock deleted file mode 100644 index 26d82c14..00000000 --- a/symfony/composer.lock +++ /dev/null @@ -1,11885 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "7bd0c37ead23d109b01b471c0691e248", - "packages": [ - { - "name": "carbonphp/carbon-doctrine-types", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/dbal": "<4.0.0 || >=5.0.0" - }, - "require-dev": { - "doctrine/dbal": "^4.0.0", - "nesbot/carbon": "^2.71.0 || ^3.0.0", - "phpunit/phpunit": "^10.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "KyleKatarn", - "email": "kylekatarnls@gmail.com" - } - ], - "description": "Types to use Carbon in Doctrine", - "keywords": [ - "carbon", - "date", - "datetime", - "doctrine", - "time" - ], - "support": { - "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/kylekatarnls", - "type": "github" - }, - { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", - "type": "tidelift" - } - ], - "time": "2024-02-09T16:56:22+00:00" - }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "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 Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.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%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" - }, - { - "name": "doctrine/collections", - "version": "2.2.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", - "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1", - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "ext-json": "*", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "src" - } - }, - "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 Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.2.2" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", - "type": "tidelift" - } - ], - "time": "2024-04-18T06:56:21+00:00" - }, - { - "name": "doctrine/dbal", - "version": "4.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/7a8252418689feb860ea8dfeab66d64a56a64df8", - "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^0.5.3|^1", - "php": "^8.1", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "12.0.0", - "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "1.12.0", - "phpstan/phpstan-phpunit": "1.4.0", - "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "10.5.30", - "psalm/plugin-phpunit": "0.19.0", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.10.2", - "symfony/cache": "^6.3.8|^7.0", - "symfony/console": "^5.4|^6.3|^7.0", - "vimeo/psalm": "5.25.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "src" - } - }, - "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" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.1.1" - }, - "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%2Fdbal", - "type": "tidelift" - } - ], - "time": "2024-09-03T08:58:39+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "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.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, - { - "name": "doctrine/doctrine-bundle", - "version": "2.13.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", - "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^3.7.0 || ^4.0", - "doctrine/persistence": "^2.2 || ^3", - "doctrine/sql-formatter": "^1.0.1", - "php": "^7.4 || ^8.0", - "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/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" - }, - "conflict": { - "doctrine/annotations": ">=3.0", - "doctrine/orm": "<2.17 || >=4.0", - "twig/twig": "<1.34 || >=2.0 <2.4" - }, - "require-dev": { - "doctrine/annotations": "^1 || ^2", - "doctrine/coding-standard": "^12", - "doctrine/deprecations": "^1.0", - "doctrine/orm": "^2.17 || ^3.0", - "friendsofphp/proxy-manager-lts": "^1.0", - "phpunit/phpunit": "^9.5.26", - "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^5", - "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^6.1 || ^7.0", - "symfony/property-info": "^5.4 || ^6.0 || ^7.0", - "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", - "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", - "symfony/string": "^5.4 || ^6.0 || ^7.0", - "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", - "symfony/validator": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", - "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0", - "twig/twig": "^1.34 || ^2.12 || ^3.0", - "vimeo/psalm": "^5.15" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "ext-pdo": "*", - "symfony/web-profiler-bundle": "To use the data collector." - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, - { - "name": "Doctrine Project", - "homepage": "https://www.doctrine-project.org/" - } - ], - "description": "Symfony DoctrineBundle", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.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%2Fdoctrine-bundle", - "type": "tidelift" - } - ], - "time": "2024-09-01T09:46:40+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } - }, - "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" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" - }, - "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%2Fevent-manager", - "type": "tidelift" - } - ], - "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/instantiator", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:23:10+00:00" - }, - { - "name": "doctrine/lexer", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.21" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" - } - }, - "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": "Johannes Schmitt", - "email": "schmittjoh@gmail.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/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.1" - }, - "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": "doctrine/orm", - "version": "3.2.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/orm.git", - "reference": "831a1eb7d260925528cdbb49cc1866c0357cf147" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/831a1eb7d260925528cdbb49cc1866c0357cf147", - "reference": "831a1eb7d260925528cdbb49cc1866c0357cf147", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/collections": "^2.2", - "doctrine/dbal": "^3.8.2 || ^4", - "doctrine/deprecations": "^0.5.3 || ^1", - "doctrine/event-manager": "^1.2 || ^2", - "doctrine/inflector": "^1.4 || ^2.0", - "doctrine/instantiator": "^1.3 || ^2", - "doctrine/lexer": "^3", - "doctrine/persistence": "^3.3.1", - "ext-ctype": "*", - "php": "^8.1", - "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^6.3.9 || ^7.0" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0", - "phpbench/phpbench": "^1.0", - "phpstan/phpstan": "1.11.1", - "phpunit/phpunit": "^10.4.0", - "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^5.4 || ^6.2 || ^7.0", - "vimeo/psalm": "5.24.0" - }, - "suggest": { - "ext-dom": "Provides support for XSD validation for XML mapping files", - "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\ORM\\": "src" - } - }, - "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": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "https://www.doctrine-project.org/projects/orm.html", - "keywords": [ - "database", - "orm" - ], - "support": { - "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.2.2" - }, - "time": "2024-08-23T10:03:52+00:00" - }, - { - "name": "doctrine/persistence", - "version": "3.3.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/persistence.git", - "reference": "b337726451f5d530df338fc7f68dee8781b49779" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", - "reference": "b337726451f5d530df338fc7f68dee8781b49779", - "shasum": "" - }, - "require": { - "doctrine/event-manager": "^1 || ^2", - "php": "^7.2 || ^8.0", - "psr/cache": "^1.0 || ^2.0 || ^3.0" - }, - "conflict": { - "doctrine/common": "<2.10" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "doctrine/common": "^3.0", - "phpstan/phpstan": "1.11.1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.24.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Persistence\\": "src/Persistence" - } - }, - "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" - }, - { - "name": "Marco Pivetta", - "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" - ], - "support": { - "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.3.3" - }, - "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-06-20T10:14:30+00:00" - }, - { - "name": "doctrine/sql-formatter", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "16ca9e39877369d664f06dacde468548298bdc40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/16ca9e39877369d664f06dacde468548298bdc40", - "reference": "16ca9e39877369d664f06dacde468548298bdc40", - "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", - "vimeo/psalm": "^5.24" - }, - "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.0" - }, - "time": "2024-09-11T07:29:40+00:00" - }, - { - "name": "google/protobuf", - "version": "v4.28.2", - "source": { - "type": "git", - "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/96021a9a8a5aa7770427b1e7ef1b2e543792684e", - "reference": "96021a9a8a5aa7770427b1e7ef1b2e543792684e", - "shasum": "" - }, - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "phpunit/phpunit": ">=5.0.0" - }, - "suggest": { - "ext-bcmath": "Need to support JSON deserialization" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Protobuf\\": "src/Google/Protobuf", - "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "proto library for PHP", - "homepage": "https://developers.google.com/protocol-buffers/", - "keywords": [ - "proto" - ], - "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.28.2" - }, - "time": "2024-09-18T20:56:15+00:00" - }, - { - "name": "illuminate/collections", - "version": "v11.26.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/collections.git", - "reference": "4d333ea19a27230b424b9af56f34cd658b5bbce2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/4d333ea19a27230b424b9af56f34cd658b5bbce2", - "reference": "4d333ea19a27230b424b9af56f34cd658b5bbce2", - "shasum": "" - }, - "require": { - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "php": "^8.2" - }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "files": [ - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Collections package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-09-27T14:54:48+00:00" - }, - { - "name": "illuminate/conditionable", - "version": "v11.26.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/conditionable.git", - "reference": "362dd761b9920367bca1427a902158225e9e3a23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/362dd761b9920367bca1427a902158225e9e3a23", - "reference": "362dd761b9920367bca1427a902158225e9e3a23", - "shasum": "" - }, - "require": { - "php": "^8.0.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Conditionable package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-06-28T20:10:30+00:00" - }, - { - "name": "illuminate/contracts", - "version": "v11.26.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/56312862af937bd6da8e6dc8bbd88188dfb478f8", - "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8", - "shasum": "" - }, - "require": { - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/simple-cache": "^1.0|^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Contracts\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-09-22T15:08:08+00:00" - }, - { - "name": "illuminate/macroable", - "version": "v11.26.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/macroable.git", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "shasum": "" - }, - "require": { - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Macroable package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-06-28T20:10:30+00:00" - }, - { - "name": "illuminate/support", - "version": "v11.26.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "0431fbb96752bb8a13136a53e4be345fdc8484c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/0431fbb96752bb8a13136a53e4be345fdc8484c2", - "reference": "0431fbb96752bb8a13136a53e4be345fdc8484c2", - "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.0", - "php": "^8.2", - "voku/portable-ascii": "^2.0" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" - }, - "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.0.2).", - "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.4.1)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-09-30T14:29:28+00:00" - }, - { - "name": "nesbot/carbon", - "version": "3.8.0", - "source": { - "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", - "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", - "shasum": "" - }, - "require": { - "carbonphp/carbon-doctrine-types": "*", - "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": { - "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": { - "branch-alias": { - "dev-master": "3.x-dev", - "dev-2.x": "2.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "psr-4": { - "Carbon\\": "src/Carbon/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "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": [ - "date", - "datetime", - "time" - ], - "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" - }, - "funding": [ - { - "url": "https://github.com/sponsors/kylekatarnls", - "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": "2024-08-19T06:22:39+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, - { - "name": "psr/clock", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" - }, - "time": "2022-11-25T14:36:26+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "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" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/log", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" - }, - "time": "2024-09-11T13:17:53+00:00" - }, - { - "name": "psr/simple-cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" - }, - "time": "2021-10-29T13:26:27+00:00" - }, - { - "name": "spatie/laravel-collection-macros", - "version": "7.14.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-collection-macros.git", - "reference": "17dca9472ed115e270190ce2a21874673a99280c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-collection-macros/zipball/17dca9472ed115e270190ce2a21874673a99280c", - "reference": "17dca9472ed115e270190ce2a21874673a99280c", - "shasum": "" - }, - "require": { - "illuminate/support": "^10.0|^11.0", - "php": "^8.2" - }, - "require-dev": { - "amphp/parallel": "^1.4.3|^2.2", - "amphp/parallel-functions": "^1.1.0|^2.0", - "mockery/mockery": "^1.6.2", - "orchestra/testbench": "^8.5.9|^9.0", - "pestphp/pest": "^2.0", - "phpunit/phpunit": "10.2.2|^10.5", - "spatie/laravel-ray": "^1.32.5", - "symfony/stopwatch": "^6.3|^7.0" - }, - "suggest": { - "amphp/parallel-functions": "Required when using the parallel*-macros." - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\CollectionMacros\\CollectionMacroServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Spatie\\CollectionMacros\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://github.com/freekmurze", - "role": "Developer" - }, - { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://github.com/sebastiandedeyne", - "role": "Developer" - } - ], - "description": "A set of useful Laravel collection macros", - "homepage": "https://github.com/spatie/laravel-collection-macros", - "keywords": [ - "laravel-collection-macros", - "spatie" - ], - "support": { - "source": "https://github.com/spatie/laravel-collection-macros/tree/7.14.1" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-07-02T13:39:03+00:00" - }, - { - "name": "spatie/regex", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/regex.git", - "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/regex/zipball/d543de2019a0068e7b80da0ba24f1c51c7469303", - "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303", - "shasum": "" - }, - "require": { - "php": "^8.0|^8.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Regex\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A sane interface for php's built in preg_* functions", - "homepage": "https://github.com/spatie/regex", - "keywords": [ - "expression", - "expressions", - "regex", - "regular", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/regex/issues", - "source": "https://github.com/spatie/regex/tree/3.1.1" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2021-11-30T21:13:59+00:00" - }, - { - "name": "symfony/asset", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/asset.git", - "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/8970de4a0cedd34e097c0f5c502a614780b9ca43", - "reference": "8970de4a0cedd34e097c0f5c502a614780b9ca43", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "conflict": { - "symfony/http-foundation": "<6.4" - }, - "require-dev": { - "symfony/http-client": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Asset\\": "" - }, - "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": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/asset/tree/v7.1.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-05-31T14:57:53+00:00" - }, - { - "name": "symfony/cache", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/86e5296b10e4dec8c8441056ca606aedb8a3be0a", - "reference": "86e5296b10e4dec8c8441056ca606aedb8a3be0a", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/cache": "^2.0|^3.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.4|^7.0" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/dependency-injection": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/var-dumper": "<6.4" - }, - "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/filesystem": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "classmap": [ - "Traits/ValueWrapper.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v7.1.5" - }, - "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-17T09:16:35+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", - "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/cache": "^3.0" - }, - "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\\Cache\\": "" - } - }, - "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 caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.5.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-04-18T09:32:20+00:00" - }, - { - "name": "symfony/clock", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/now.php" - ], - "psr-4": { - "Symfony\\Component\\Clock\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Decouples applications from the system clock", - "homepage": "https://symfony.com", - "keywords": [ - "clock", - "psr20", - "time" - ], - "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.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-05-31T14:57:53+00:00" - }, - { - "name": "symfony/config", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", - "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^7.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v7.1.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-05-31T14:57:53+00:00" - }, - { - "name": "symfony/console", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee", - "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee", - "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" - }, - "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": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v7.1.5" - }, - "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-20T08:28:38+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "38465f925ec4e0707b090e9147c65869837d639d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/38465f925ec4e0707b090e9147c65869837d639d", - "reference": "38465f925ec4e0707b090e9147c65869837d639d", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.4", - "symfony/finder": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.1.5" - }, - "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-20T08:28:38+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.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-04-18T09:32:20+00:00" - }, - { - "name": "symfony/doctrine-bridge", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "2568d0adaa5b0018b07beaa90363b880a43cc957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/2568d0adaa5b0018b07beaa90363b880a43cc957", - "reference": "2568d0adaa5b0018b07beaa90363b880a43cc957", - "shasum": "" - }, - "require": { - "doctrine/event-manager": "^2", - "doctrine/persistence": "^3.1", - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "doctrine/lexer": "<1.1", - "doctrine/orm": "<2.15", - "symfony/cache": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/form": "<6.4.6|>=7,<7.0.6", - "symfony/http-foundation": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/lock": "<6.4", - "symfony/messenger": "<6.4", - "symfony/property-info": "<6.4", - "symfony/security-bundle": "<6.4", - "symfony/security-core": "<6.4", - "symfony/validator": "<6.4" - }, - "require-dev": { - "doctrine/collections": "^1.0|^2.0", - "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "^3.6|^4", - "doctrine/orm": "^2.15|^3", - "psr/log": "^1|^2|^3", - "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/doctrine-messenger": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/form": "^6.4.6|^7.0.6", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/type-info": "^7.1", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Doctrine\\": "" - }, - "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 integration for Doctrine with various Symfony components", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.5" - }, - "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-08T12:32:26+00:00" - }, - { - "name": "symfony/dotenv", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/dotenv.git", - "reference": "6d966200b399fa59759286f3fc7c919f0677c449" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/6d966200b399fa59759286f3fc7c919f0677c449", - "reference": "6d966200b399fa59759286f3fc7c919f0677c449", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "conflict": { - "symfony/console": "<6.4", - "symfony/process": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Dotenv\\": "" - }, - "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": "Registers environment variables from a .env file", - "homepage": "https://symfony.com", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.1.5" - }, - "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-17T09:16:35+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v7.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "432bb369952795c61ca1def65e078c4a80dad13c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", - "reference": "432bb369952795c61ca1def65e078c4a80dad13c", - "shasum": "" - }, - "require": { - "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": { - "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": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "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 manage errors and ease debugging PHP code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.3" - }, - "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-07-26T13:02:51+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "shasum": "" - }, - "require": { - "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": { - "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": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "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 that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.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-05-31T14:57:53+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" - }, - "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\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.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-04-18T09:32:20+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", - "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "require-dev": { - "symfony/process": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "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 basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.5" - }, - "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-17T09:16:35+00:00" - }, - { - "name": "symfony/finder", - "version": "v7.1.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", - "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "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": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.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-08-13T14:28:19+00:00" - }, - { - "name": "symfony/flex", - "version": "v2.4.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/flex.git", - "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/4dc11919791f81d087a12db2ab4c7e044431ef6b", - "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.1", - "php": ">=8.0" - }, - "require-dev": { - "composer/composer": "^2.1", - "symfony/dotenv": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Symfony\\Flex\\Flex" - }, - "autoload": { - "psr-4": { - "Symfony\\Flex\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien.potencier@gmail.com" - } - ], - "description": "Composer plugin for Symfony", - "support": { - "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.4.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-27T10:22:22+00:00" - }, - { - "name": "symfony/framework-bundle", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "8a792de86230c13a9de7750c0c8b23cc083183d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/8a792de86230c13a9de7750c0c8b23cc083183d4", - "reference": "8a792de86230c13a9de7750c0c8b23cc083183d4", - "shasum": "" - }, - "require": { - "composer-runtime-api": ">=2.1", - "ext-xml": "*", - "php": ">=8.2", - "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^7.1.5", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/filesystem": "^7.1", - "symfony/finder": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^6.4|^7.0" - }, - "conflict": { - "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/asset": "<6.4", - "symfony/asset-mapper": "<6.4", - "symfony/clock": "<6.4", - "symfony/console": "<6.4", - "symfony/dom-crawler": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/form": "<6.4", - "symfony/http-client": "<6.4", - "symfony/lock": "<6.4", - "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4", - "symfony/mime": "<6.4", - "symfony/property-access": "<6.4", - "symfony/property-info": "<6.4", - "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", - "symfony/security-core": "<6.4", - "symfony/security-csrf": "<6.4", - "symfony/serializer": "<6.4", - "symfony/stopwatch": "<6.4", - "symfony/translation": "<6.4", - "symfony/twig-bridge": "<6.4", - "symfony/twig-bundle": "<6.4", - "symfony/validator": "<6.4", - "symfony/web-profiler-bundle": "<6.4", - "symfony/workflow": "<6.4" - }, - "require-dev": { - "doctrine/persistence": "^1.3|^2|^3", - "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "seld/jsonlint": "^1.10", - "symfony/asset": "^6.4|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/clock": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/dotenv": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/mailer": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/notifier": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/scheduler": "^6.4.4|^7.0.4", - "symfony/security-bundle": "^6.4|^7.0", - "symfony/semaphore": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/string": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/twig-bundle": "^6.4|^7.0", - "symfony/type-info": "^7.1", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.0.4" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "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 a tight integration between Symfony components and the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.1.5" - }, - "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-20T13:35:23+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", - "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4" - }, - "require-dev": { - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4|^7.0", - "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": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "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": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" - }, - "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-20T08:28:38+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", - "shasum": "" - }, - "require": { - "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.0.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "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.0.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "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 a structured process for converting a Request into a Response", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" - }, - "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-21T06:09:21+00:00" - }, - { - "name": "symfony/routing", - "version": "v7.1.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" - }, - "require-dev": { - "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", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "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": "Maps an HTTP request to a set of configuration variables", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.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-08-29T08:16:25+00:00" - }, - { - "name": "symfony/runtime", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/runtime.git", - "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/ea34522c447dd91a2b31cb330ee4540a56ba53f6", - "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": ">=8.2" - }, - "conflict": { - "symfony/dotenv": "<6.4" - }, - "require-dev": { - "composer/composer": "^2.6", - "symfony/console": "^6.4|^7.0", - "symfony/dotenv": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Runtime\\": "", - "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Enables decoupling PHP applications from global state", - "homepage": "https://symfony.com", - "keywords": [ - "runtime" - ], - "support": { - "source": "https://github.com/symfony/runtime/tree/v7.1.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-05-31T14:55:39+00:00" - }, - { - "name": "symfony/serializer", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/serializer.git", - "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/71d6e1f70f00752d1469d0f5e83b0a51716f288b", - "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<6.4", - "symfony/property-access": "<6.4", - "symfony/property-info": "<6.4", - "symfony/type-info": "<7.1.5", - "symfony/uid": "<6.4", - "symfony/validator": "<6.4", - "symfony/yaml": "<6.4" - }, - "require-dev": { - "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", - "phpstan/phpdoc-parser": "^1.0", - "seld/jsonlint": "^1.10", - "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/filesystem": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1.5", - "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", - "symfony/yaml": "^6.4|^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/v7.1.5" - }, - "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-20T12:13:15+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "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\\": "" - }, - "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 writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.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-04-18T09:32:20+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "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 a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.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-05-31T14:57:53+00:00" - }, - { - "name": "symfony/string", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", - "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" - }, - "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" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "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": { - "source": "https://github.com/symfony/string/tree/v7.1.5" - }, - "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-20T08:28:38+00:00" - }, - { - "name": "symfony/translation", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "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" - }, - "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": { - "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/v7.1.5" - }, - "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-16T06:30:38+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "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\\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.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-04-18T09:32:20+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e997e5025b53c0f7b17632802daefdd6a04540ae", - "reference": "e997e5025b53c0f7b17632802daefdd6a04540ae", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.9" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<6.4", - "symfony/form": "<6.4", - "symfony/http-foundation": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.4", - "symfony/serializer": "<6.4", - "symfony/translation": "<6.4", - "symfony/workflow": "<6.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3|^4", - "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^6.4|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/emoji": "^7.1", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^6.4|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "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 integration for Twig with various Symfony components", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.1.5" - }, - "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-15T06:48:17+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", - "reference": "4e6afd0dc8396f16861b682f3b854ff6e24bfb7e", - "shasum": "" - }, - "require": { - "composer-runtime-api": ">=2.1", - "php": ">=8.2", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", - "twig/twig": "^3.0.4" - }, - "conflict": { - "symfony/framework-bundle": "<6.4", - "symfony/translation": "<6.4" - }, - "require-dev": { - "symfony/asset": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "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 a tight integration of Twig into the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v7.1.5" - }, - "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-08T12:32:26+00:00" - }, - { - "name": "symfony/validator", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/validator.git", - "reference": "e57592782dc2a86997477f28164c51af53512ad8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/e57592782dc2a86997477f28164c51af53512ad8", - "reference": "e57592782dc2a86997477f28164c51af53512ad8", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php83": "^1.27", - "symfony/translation-contracts": "^2.5|^3" - }, - "conflict": { - "doctrine/lexer": "<1.1", - "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<7.0", - "symfony/expression-language": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/intl": "<6.4", - "symfony/property-info": "<6.4", - "symfony/translation": "<6.4.3|>=7.0,<7.0.3", - "symfony/yaml": "<6.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3|^4", - "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/translation": "^6.4.3|^7.0.3", - "symfony/type-info": "^7.1", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Validator\\": "" - }, - "exclude-from-classmap": [ - "/Tests/", - "/Resources/bin/" - ] - }, - "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 validate values", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/validator/tree/v7.1.5" - }, - "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-20T08:28:38+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "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.0.4" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" - }, - "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-16T10:07:02+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v7.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-28T08:00:31+00:00" - }, - { - "name": "symfony/yaml", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "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\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.5" - }, - "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-17T12:49:58+00:00" - }, - { - "name": "thecodingmachine/safe", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", - "lib/special_cases.php", - "deprecated/mysqli.php", - "generated/apache.php", - "generated/apcu.php", - "generated/array.php", - "generated/bzip2.php", - "generated/calendar.php", - "generated/classobj.php", - "generated/com.php", - "generated/cubrid.php", - "generated/curl.php", - "generated/datetime.php", - "generated/dir.php", - "generated/eio.php", - "generated/errorfunc.php", - "generated/exec.php", - "generated/fileinfo.php", - "generated/filesystem.php", - "generated/filter.php", - "generated/fpm.php", - "generated/ftp.php", - "generated/funchand.php", - "generated/gettext.php", - "generated/gmp.php", - "generated/gnupg.php", - "generated/hash.php", - "generated/ibase.php", - "generated/ibmDb2.php", - "generated/iconv.php", - "generated/image.php", - "generated/imap.php", - "generated/info.php", - "generated/inotify.php", - "generated/json.php", - "generated/ldap.php", - "generated/libxml.php", - "generated/lzf.php", - "generated/mailparse.php", - "generated/mbstring.php", - "generated/misc.php", - "generated/mysql.php", - "generated/network.php", - "generated/oci8.php", - "generated/opcache.php", - "generated/openssl.php", - "generated/outcontrol.php", - "generated/pcntl.php", - "generated/pcre.php", - "generated/pgsql.php", - "generated/posix.php", - "generated/ps.php", - "generated/pspell.php", - "generated/readline.php", - "generated/rpminfo.php", - "generated/rrd.php", - "generated/sem.php", - "generated/session.php", - "generated/shmop.php", - "generated/sockets.php", - "generated/sodium.php", - "generated/solr.php", - "generated/spl.php", - "generated/sqlsrv.php", - "generated/ssdeep.php", - "generated/ssh2.php", - "generated/stream.php", - "generated/strings.php", - "generated/swoole.php", - "generated/uodbc.php", - "generated/uopz.php", - "generated/url.php", - "generated/var.php", - "generated/xdiff.php", - "generated/xml.php", - "generated/xmlrpc.php", - "generated/yaml.php", - "generated/yaz.php", - "generated/zip.php", - "generated/zlib.php" - ], - "classmap": [ - "lib/DateTime.php", - "lib/DateTimeImmutable.php", - "lib/Exceptions/", - "deprecated/Exceptions/", - "generated/Exceptions/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHP core functions that throw exceptions instead of returning FALSE on error", - "support": { - "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" - }, - "time": "2023-04-05T11:54:14+00:00" - }, - { - "name": "twig/twig", - "version": "v3.14.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", - "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php81": "^1.29" - }, - "require-dev": { - "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/Resources/core.php", - "src/Resources/debug.php", - "src/Resources/escaper.php", - "src/Resources/string_loader.php" - ], - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.14.0" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2024-09-09T17:55:12+00:00" - }, - { - "name": "voku/portable-ascii", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "b56450eed252f6801410d810c8e1727224ae0743" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", - "reference": "b56450eed252f6801410d810c8e1727224ae0743", - "shasum": "" - }, - "require": { - "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": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" - } - ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], - "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" - }, - "funding": [ - { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", - "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", - "type": "tidelift" - } - ], - "time": "2022-03-08T17:03:00+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.4", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", - "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "react/promise": "^2", - "vimeo/psalm": "^3.12" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.4" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T18:52:26+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", - "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "type": "library", - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Amp\\ByteStream\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "https://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-04-13T18:00:56+00:00" - }, - { - "name": "clue/ndjson-react", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/clue/reactphp-ndjson.git", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/stream": "^1.2" - }, - "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": "colinodell/json5", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/colinodell/json5.git", - "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/colinodell/json5/zipball/15b063f8cb5e6deb15f0cd39123264ec0d19c710", - "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^7.1.3|^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" - }, - "require-dev": { - "mikehaertl/php-shellcommand": "^1.2.5", - "phpstan/phpstan": "^1.4", - "scrutinizer/ocular": "^1.6", - "squizlabs/php_codesniffer": "^2.3 || ^3.0", - "symfony/finder": "^4.4|^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0" - }, - "bin": [ - "bin/json5" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "files": [ - "src/global.php" - ], - "psr-4": { - "ColinODell\\Json5\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Developer" - } - ], - "description": "UTF-8 compatible JSON5 parser for PHP", - "homepage": "https://github.com/colinodell/json5", - "keywords": [ - "JSON5", - "json", - "json5_decode", - "json_decode" - ], - "support": { - "issues": "https://github.com/colinodell/json5/issues", - "source": "https://github.com/colinodell/json5/tree/v2.3.0" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" - } - ], - "time": "2022-12-27T16:44:40+00:00" - }, - { - "name": "composer/pcre", - "version": "3.3.1", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<1.11.10" - }, - "require-dev": { - "phpstan/phpstan": "^1.11.10", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8 || ^9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.1" - }, - "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-08-27T18:44:43+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": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+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": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "time": "2021-06-11T22:34:44+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.3", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" - }, - "time": "2024-04-30T00:40:11+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": "friendsofphp/php-cs-fixer", - "version": "v3.64.0", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "58dd9c931c785a79739310aef5178928305ffa67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", - "reference": "58dd9c931c785a79739310aef5178928305ffa67", - "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.0", - "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 || ^2.3", - "infection/infection": "^0.29.5", - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^2.1", - "mikey179/vfsstream": "^1.6.11", - "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.19 || ^10.5.21 || ^11.2", - "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.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.64.0" - }, - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2024-08-30T23:09:38+00:00" - }, - { - "name": "illuminate/pipeline", - "version": "v11.26.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/pipeline.git", - "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/pipeline/zipball/ca9266eecf659f7e60c06758969b2ae3918ea3da", - "reference": "ca9266eecf659f7e60c06758969b2ae3918ea3da", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Pipeline\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Pipeline package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-06-28T20:10:30+00:00" - }, - { - "name": "infection/abstract-testframework-adapter", - "version": "0.5.0", - "source": { - "type": "git", - "url": "https://github.com/infection/abstract-testframework-adapter.git", - "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", - "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^2.17", - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Infection\\AbstractTestFramework\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" - } - ], - "description": "Abstract Test Framework Adapter for Infection", - "support": { - "issues": "https://github.com/infection/abstract-testframework-adapter/issues", - "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" - }, - "funding": [ - { - "url": "https://github.com/infection", - "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" - } - ], - "time": "2021-08-17T18:49:12+00:00" - }, - { - "name": "infection/extension-installer", - "version": "0.1.2", - "source": { - "type": "git", - "url": "https://github.com/infection/extension-installer.git", - "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", - "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1 || ^2.0" - }, - "require-dev": { - "composer/composer": "^1.9 || ^2.0", - "friendsofphp/php-cs-fixer": "^2.18, <2.19", - "infection/infection": "^0.15.2", - "php-coveralls/php-coveralls": "^2.4", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.10", - "phpstan/phpstan-phpunit": "^0.12.6", - "phpstan/phpstan-strict-rules": "^0.12.2", - "phpstan/phpstan-webmozart-assert": "^0.12.2", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.8" - }, - "type": "composer-plugin", - "extra": { - "class": "Infection\\ExtensionInstaller\\Plugin" - }, - "autoload": { - "psr-4": { - "Infection\\ExtensionInstaller\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" - } - ], - "description": "Infection Extension Installer", - "support": { - "issues": "https://github.com/infection/extension-installer/issues", - "source": "https://github.com/infection/extension-installer/tree/0.1.2" - }, - "funding": [ - { - "url": "https://github.com/infection", - "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" - } - ], - "time": "2021-10-20T22:08:34+00:00" - }, - { - "name": "infection/include-interceptor", - "version": "0.2.5", - "source": { - "type": "git", - "url": "https://github.com/infection/include-interceptor.git", - "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", - "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", - "shasum": "" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "infection/infection": "^0.15.0", - "phan/phan": "^2.4 || ^3", - "php-coveralls/php-coveralls": "^2.2", - "phpstan/phpstan": "^0.12.8", - "phpunit/phpunit": "^8.5", - "vimeo/psalm": "^3.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Infection\\StreamWrapper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com" - } - ], - "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", - "support": { - "issues": "https://github.com/infection/include-interceptor/issues", - "source": "https://github.com/infection/include-interceptor/tree/0.2.5" - }, - "funding": [ - { - "url": "https://github.com/infection", - "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" - } - ], - "time": "2021-08-09T10:03:57+00:00" - }, - { - "name": "infection/infection", - "version": "0.27.11", - "source": { - "type": "git", - "url": "https://github.com/infection/infection.git", - "reference": "6d55979c457eef2a5d0d80446c67ca533f201961" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/infection/infection/zipball/6d55979c457eef2a5d0d80446c67ca533f201961", - "reference": "6d55979c457eef2a5d0d80446c67ca533f201961", - "shasum": "" - }, - "require": { - "colinodell/json5": "^2.2", - "composer-runtime-api": "^2.0", - "composer/xdebug-handler": "^2.0 || ^3.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "fidry/cpu-core-counter": "^0.4.0 || ^0.5.0 || ^1.0", - "infection/abstract-testframework-adapter": "^0.5.0", - "infection/extension-installer": "^0.1.0", - "infection/include-interceptor": "^0.2.5", - "justinrainbow/json-schema": "^5.2.10", - "nikic/php-parser": "^4.15.1", - "ondram/ci-detector": "^4.1.0", - "php": "^8.1", - "sanmai/later": "^0.1.1", - "sanmai/pipeline": "^5.1 || ^6", - "sebastian/diff": "^3.0.2 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "thecodingmachine/safe": "^2.1.2", - "webmozart/assert": "^1.11" - }, - "conflict": { - "antecedent/patchwork": "<2.1.25", - "dg/bypass-finals": "<1.4.1", - "phpunit/php-code-coverage": ">9,<9.1.4 || >9.2.17,<9.2.21" - }, - "require-dev": { - "brianium/paratest": "^6.11", - "ext-simplexml": "*", - "fidry/makefile": "^1.0", - "helmich/phpunit-json-assert": "^3.0", - "phpspec/prophecy": "^1.15", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "^1.10.15", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpstan/phpstan-strict-rules": "^1.1.0", - "phpstan/phpstan-webmozart-assert": "^1.0.2", - "phpunit/phpunit": "^9.6", - "rector/rector": "^0.16.0", - "sidz/phpstan-rules": "^0.4.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0", - "thecodingmachine/phpstan-safe-rule": "^1.2.0" - }, - "bin": [ - "bin/infection" - ], - "type": "library", - "autoload": { - "psr-4": { - "Infection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Maks Rafalko", - "email": "maks.rafalko@gmail.com", - "homepage": "https://twitter.com/maks_rafalko" - }, - { - "name": "Oleg Zhulnev", - "homepage": "https://github.com/sidz" - }, - { - "name": "Gert de Pagter", - "homepage": "https://github.com/BackEndTea" - }, - { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com", - "homepage": "https://twitter.com/tfidry" - }, - { - "name": "Alexey Kopytko", - "email": "alexey@kopytko.com", - "homepage": "https://www.alexeykopytko.com" - }, - { - "name": "Andreas Möller", - "email": "am@localheinz.com", - "homepage": "https://localheinz.com" - } - ], - "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", - "keywords": [ - "coverage", - "mutant", - "mutation framework", - "mutation testing", - "testing", - "unit testing" - ], - "support": { - "issues": "https://github.com/infection/infection/issues", - "source": "https://github.com/infection/infection/tree/0.27.11" - }, - "funding": [ - { - "url": "https://github.com/infection", - "type": "github" - }, - { - "url": "https://opencollective.com/infection", - "type": "open_collective" - } - ], - "time": "2024-03-20T07:48:57+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "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/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" - }, - "time": "2024-07-06T21:00:26+00:00" - }, - { - "name": "laravel/pint", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/laravel/pint.git", - "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", - "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "ext-tokenizer": "*", - "ext-xml": "*", - "php": "^8.1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.64.0", - "illuminate/view": "^10.48.20", - "larastan/larastan": "^2.9.8", - "laravel-zero/framework": "^10.4.0", - "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.35.1" - }, - "bin": [ - "builds/pint" - ], - "type": "project", - "autoload": { - "psr-4": { - "App\\": "app/", - "Database\\Seeders\\": "database/seeders/", - "Database\\Factories\\": "database/factories/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "An opinionated code formatter for PHP.", - "homepage": "https://laravel.com", - "keywords": [ - "format", - "formatter", - "lint", - "linter", - "php" - ], - "support": { - "issues": "https://github.com/laravel/pint/issues", - "source": "https://github.com/laravel/pint" - }, - "time": "2024-09-24T17:22:50+00:00" - }, - { - "name": "microsoft/tolerant-php-parser", - "version": "v0.1.2", - "source": { - "type": "git", - "url": "https://github.com/microsoft/tolerant-php-parser.git", - "reference": "3eccfd273323aaf69513e2f1c888393f5947804b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/3eccfd273323aaf69513e2f1c888393f5947804b", - "reference": "3eccfd273323aaf69513e2f1c888393f5947804b", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.15" - }, - "type": "library", - "autoload": { - "psr-4": { - "Microsoft\\PhpParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Lourens", - "email": "roblou@microsoft.com" - } - ], - "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios", - "support": { - "issues": "https://github.com/microsoft/tolerant-php-parser/issues", - "source": "https://github.com/microsoft/tolerant-php-parser/tree/v0.1.2" - }, - "time": "2022-10-05T17:30:19+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.12.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "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.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-06-12T14:39:25+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.5.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" - }, - "time": "2024-09-08T10:13:13+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.19.4", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", - "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.1" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-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/v4.19.4" - }, - "time": "2024-09-29T15:01:53+00:00" - }, - { - "name": "ondram/ci-detector", - "version": "4.2.0", - "source": { - "type": "git", - "url": "https://github.com/OndraM/ci-detector.git", - "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", - "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.13.2", - "lmc/coding-standard": "^3.0.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "^1.2.0", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpunit/phpunit": "^9.6.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "OndraM\\CiDetector\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ondřej Machulda", - "email": "ondrej.machulda@gmail.com" - } - ], - "description": "Detect continuous integration environment and provide unified access to properties of current build", - "keywords": [ - "CircleCI", - "Codeship", - "Wercker", - "adapter", - "appveyor", - "aws", - "aws codebuild", - "azure", - "azure devops", - "azure pipelines", - "bamboo", - "bitbucket", - "buddy", - "ci-info", - "codebuild", - "continuous integration", - "continuousphp", - "devops", - "drone", - "github", - "gitlab", - "interface", - "jenkins", - "pipelines", - "sourcehut", - "teamcity", - "travis" - ], - "support": { - "issues": "https://github.com/OndraM/ci-detector/issues", - "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" - }, - "time": "2024-03-12T13:22:30+00:00" - }, - { - "name": "pdepend/pdepend", - "version": "2.16.2", - "source": { - "type": "git", - "url": "https://github.com/pdepend/pdepend.git", - "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", - "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", - "shasum": "" - }, - "require": { - "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", - "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", - "symfony/polyfill-mbstring": "^1.19" - }, - "require-dev": { - "easy-doc/easy-doc": "0.0.0|^1.2.3", - "gregwar/rst": "^1.0", - "squizlabs/php_codesniffer": "^2.0.0" - }, - "bin": [ - "src/bin/pdepend" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "PDepend\\": "src/main/php/PDepend" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Official version of pdepend to be handled with Composer", - "keywords": [ - "PHP Depend", - "PHP_Depend", - "dev", - "pdepend" - ], - "support": { - "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.16.2" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", - "type": "tidelift" - } - ], - "time": "2023-12-17T18:09:59+00:00" - }, - { - "name": "phan/phan", - "version": "5.4.5", - "source": { - "type": "git", - "url": "https://github.com/phan/phan.git", - "reference": "2b15302175931a0629a85c57d0c1f91d68b26a4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phan/phan/zipball/2b15302175931a0629a85c57d0c1f91d68b26a4d", - "reference": "2b15302175931a0629a85c57d0c1f91d68b26a4d", - "shasum": "" - }, - "require": { - "composer/semver": "^1.4|^2.0|^3.0", - "composer/xdebug-handler": "^2.0|^3.0", - "ext-filter": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.4", - "microsoft/tolerant-php-parser": "0.1.2", - "netresearch/jsonmapper": "^1.6.0|^2.0|^3.0|^4.0", - "php": "^7.2.0|^8.0.0", - "sabre/event": "^5.1.3", - "symfony/console": "^3.2|^4.0|^5.0|^6.0|^7.0", - "symfony/polyfill-mbstring": "^1.11.0", - "symfony/polyfill-php80": "^1.20.0", - "tysonandre/var_representation_polyfill": "^0.0.2|^0.1.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.0" - }, - "suggest": { - "ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is needed, 1.0.16+ is recommended.", - "ext-iconv": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8", - "ext-igbinary": "Improves performance of polyfill when ext-ast is unavailable", - "ext-mbstring": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8", - "ext-tokenizer": "Needed for fallback/polyfill parser support and file/line-based suppressions.", - "ext-var_representation": "Suggested for converting values to strings in issue messages" - }, - "bin": [ - "phan", - "phan_client", - "tocheckstyle" - ], - "type": "project", - "autoload": { - "psr-4": { - "Phan\\": "src/Phan" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tyson Andre" - }, - { - "name": "Rasmus Lerdorf" - }, - { - "name": "Andrew S. Morrison" - } - ], - "description": "A static analyzer for PHP", - "keywords": [ - "analyzer", - "php", - "static", - "static analysis" - ], - "support": { - "issues": "https://github.com/phan/phan/issues", - "source": "https://github.com/phan/phan/tree/5.4.5" - }, - "time": "2024-08-13T21:41:35+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.4.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", - "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", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.5", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^5.13" - }, - "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.4.1" - }, - "time": "2024-05-21T05:55:05+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "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.8.2" - }, - "time": "2024-02-23T11:10:43+00:00" - }, - { - "name": "phpmd/phpmd", - "version": "2.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpmd/phpmd.git", - "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", - "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", - "shasum": "" - }, - "require": { - "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", - "ext-xml": "*", - "pdepend/pdepend": "^2.16.1", - "php": ">=5.3.9" - }, - "require-dev": { - "easy-doc/easy-doc": "0.0.0 || ^1.3.2", - "ext-json": "*", - "ext-simplexml": "*", - "gregwar/rst": "^1.0", - "mikey179/vfsstream": "^1.6.8", - "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" - }, - "bin": [ - "src/bin/phpmd" - ], - "type": "library", - "autoload": { - "psr-0": { - "PHPMD\\": "src/main/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Manuel Pichler", - "email": "github@manuel-pichler.de", - "homepage": "https://github.com/manuelpichler", - "role": "Project Founder" - }, - { - "name": "Marc Würth", - "email": "ravage@bluewin.ch", - "homepage": "https://github.com/ravage84", - "role": "Project Maintainer" - }, - { - "name": "Other contributors", - "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", - "role": "Contributors" - } - ], - "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", - "homepage": "https://phpmd.org/", - "keywords": [ - "dev", - "mess detection", - "mess detector", - "pdepend", - "phpmd", - "pmd" - ], - "support": { - "irc": "irc://irc.freenode.org/phpmd", - "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.15.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", - "type": "tidelift" - } - ], - "time": "2023-12-11T08:22:20+00:00" - }, - { - "name": "phpstan/extension-installer", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/phpstan/extension-installer.git", - "reference": "85e90b3942d06b2326fba0403ec24fe912372936" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", - "reference": "85e90b3942d06b2326fba0403ec24fe912372936", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.0", - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.0 || ^2.0" - }, - "require-dev": { - "composer/composer": "^2.0", - "php-parallel-lint/php-parallel-lint": "^1.2.0", - "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" - }, - "type": "composer-plugin", - "extra": { - "class": "PHPStan\\ExtensionInstaller\\Plugin" - }, - "autoload": { - "psr-4": { - "PHPStan\\ExtensionInstaller\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Composer plugin for automatic installation of PHPStan extensions", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpstan/extension-installer/issues", - "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" - }, - "time": "2024-09-04T20:21:43+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.32.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", - "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "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/1.32.0" - }, - "time": "2024-09-26T07:23:32+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "1.12.6", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae", - "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "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-10-06T15:03:59+00:00" - }, - { - "name": "phpstan/phpstan-deprecation-rules", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82", - "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.12" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", - "support": { - "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.1" - }, - "time": "2024-09-11T15:52:35+00:00" - }, - { - "name": "phpstan/phpstan-strict-rules", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "daeec748b53de80a97498462513066834ec28f8b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/daeec748b53de80a97498462513066834ec28f8b", - "reference": "daeec748b53de80a97498462513066834ec28f8b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.12.4" - }, - "require-dev": { - "nikic/php-parser": "^4.13.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Extra strict and opinionated rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.6.1" - }, - "time": "2024-09-20T14:04:44+00:00" - }, - { - "name": "phpstan/phpstan-symfony", - "version": "1.4.10", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "f7d5782044bedf93aeb3f38e09c91148ee90e5a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/f7d5782044bedf93aeb3f38e09c91148ee90e5a1", - "reference": "f7d5782044bedf93aeb3f38e09c91148ee90e5a1", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.12" - }, - "conflict": { - "symfony/framework-bundle": "<3.0" - }, - "require-dev": { - "nikic/php-parser": "^4.13.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^1.3.11", - "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^8.5.29 || ^9.5", - "psr/container": "1.0 || 1.1.1", - "symfony/config": "^5.4 || ^6.1", - "symfony/console": "^5.4 || ^6.1", - "symfony/dependency-injection": "^5.4 || ^6.1", - "symfony/form": "^5.4 || ^6.1", - "symfony/framework-bundle": "^5.4 || ^6.1", - "symfony/http-foundation": "^5.4 || ^6.1", - "symfony/messenger": "^5.4", - "symfony/polyfill-php80": "^1.24", - "symfony/serializer": "^5.4", - "symfony/service-contracts": "^2.2.0" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lukáš Unger", - "email": "looky.msc@gmail.com", - "homepage": "https://lookyman.net" - } - ], - "description": "Symfony Framework extensions and rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.10" - }, - "time": "2024-09-26T18:14:50+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.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/10.1.16" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-22T04:31:57+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.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": "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/4.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T06:24:48+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "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": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:56:09+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.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": "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/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T14:07:24+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.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", - "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", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:57:52+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "10.5.35", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7ac8b4e63f456046dcb4c9787da9382831a1874b", - "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.2", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.2", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.0", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.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/10.5.35" - }, - "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-09-19T10:52:21+00:00" - }, - { - "name": "psalm/plugin-symfony", - "version": "v5.2.5", - "source": { - "type": "git", - "url": "https://github.com/psalm/psalm-plugin-symfony.git", - "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-symfony/zipball/fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", - "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "php": "^8.1", - "symfony/framework-bundle": "^5.0 || ^6.0 || ^7.0", - "vimeo/psalm": "^5.16" - }, - "require-dev": { - "doctrine/annotations": "^1.8|^2", - "doctrine/orm": "^2.9", - "phpunit/phpunit": "~7.5 || ~9.5", - "symfony/cache-contracts": "^1.0 || ^2.0", - "symfony/console": "*", - "symfony/form": "^5.0 || ^6.0 || ^7.0", - "symfony/messenger": "^5.0 || ^6.0 || ^7.0", - "symfony/security-core": "*", - "symfony/serializer": "^5.0 || ^6.0 || ^7.0", - "symfony/validator": "*", - "twig/twig": "^2.10 || ^3.0", - "weirdan/codeception-psalm-module": "dev-master" - }, - "suggest": { - "weirdan/doctrine-psalm-plugin": "If Doctrine is used, it is recommended install this plugin" - }, - "type": "psalm-plugin", - "extra": { - "psalm": { - "pluginClass": "Psalm\\SymfonyPsalmPlugin\\Plugin" - } - }, - "autoload": { - "psr-4": { - "Psalm\\SymfonyPsalmPlugin\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Farhad Safarov", - "email": "farhad.safarov@gmail.com" - } - ], - "description": "Psalm Plugin for Symfony", - "support": { - "issues": "https://github.com/psalm/psalm-plugin-symfony/issues", - "source": "https://github.com/psalm/psalm-plugin-symfony/tree/v5.2.5" - }, - "time": "2024-07-03T11:57:02+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.5", - "source": { - "type": "git", - "url": "https://github.com/reactphp/child-process.git", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/event-loop": "^1.2", - "react/stream": "^1.2" - }, - "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" - }, - "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.5" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-09-16T13:41:56+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": "roave/security-advisories", - "version": "dev-latest", - "source": { - "type": "git", - "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "c90faeb954dbf0e3bb0657496199afeb99e2d4dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c90faeb954dbf0e3bb0657496199afeb99e2d4dd", - "reference": "c90faeb954dbf0e3bb0657496199afeb99e2d4dd", - "shasum": "" - }, - "conflict": { - "3f/pygmentize": "<1.2", - "admidio/admidio": "<4.3.10", - "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", - "aheinze/cockpit": "<2.2", - "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.04.6", - "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", - "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", - "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9|==2024.04.1", - "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", - "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", - "airesvsg/acf-to-rest-api": "<=3.1", - "akaunting/akaunting": "<2.1.13", - "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<1.5", - "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", - "amazing/media2click": ">=1,<1.3.3", - "amphp/artax": "<1.0.6|>=2,<2.0.6", - "amphp/http": "<=1.7.2|>=2,<=2.1", - "amphp/http-client": ">=4,<4.4", - "anchorcms/anchor-cms": "<=0.12.7", - "andreapollastri/cipi": "<=3.1.15", - "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", - "apache-solr-for-typo3/solr": "<2.8.3", - "apereo/phpcas": "<1.6", - "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", - "appwrite/server-ce": "<=1.2.1", - "arc/web": "<3", - "area17/twill": "<1.2.5|>=2,<2.5.3", - "artesaos/seotools": "<0.17.2", - "asymmetricrypt/asymmetricrypt": "<9.9.99", - "athlon1600/php-proxy": "<=5.1", - "athlon1600/php-proxy-app": "<=3", - "austintoddj/canvas": "<=3.4.2", - "auth0/wordpress": "<=4.6", - "automad/automad": "<2.0.0.0-alpha5", - "automattic/jetpack": "<9.8", - "awesome-support/awesome-support": "<=6.0.7", - "aws/aws-sdk-php": "<3.288.1", - "azuracast/azuracast": "<0.18.3", - "backdrop/backdrop": "<1.27.3|>=1.28,<1.28.2", - "backpack/crud": "<3.4.9", - "bacula-web/bacula-web": "<8.0.0.0-RC2-dev", - "badaso/core": "<2.7", - "bagisto/bagisto": "<2.1", - "barrelstrength/sprout-base-email": "<1.2.7", - "barrelstrength/sprout-forms": "<3.9", - "barryvdh/laravel-translation-manager": "<0.6.2", - "barzahlen/barzahlen-php": "<2.0.1", - "baserproject/basercms": "<5.0.9", - "bassjobsen/bootstrap-3-typeahead": ">4.0.2", - "bbpress/bbpress": "<2.6.5", - "bcosca/fatfree": "<3.7.2", - "bedita/bedita": "<4", - "bigfork/silverstripe-form-capture": ">=3,<3.1.1", - "billz/raspap-webgui": "<=3.1.4", - "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", - "blueimp/jquery-file-upload": "==6.4.4", - "bmarshall511/wordpress_zero_spam": "<5.2.13", - "bolt/bolt": "<3.7.2", - "bolt/core": "<=4.2", - "born05/craft-twofactorauthentication": "<3.3.4", - "bottelet/flarepoint": "<2.2.1", - "bref/bref": "<2.1.17", - "brightlocal/phpwhois": "<=4.2.5", - "brotkrueml/codehighlight": "<2.7", - "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", - "brotkrueml/typo3-matomo-integration": "<1.3.2", - "buddypress/buddypress": "<7.2.1", - "bugsnag/bugsnag-laravel": ">=2,<2.0.2", - "bytefury/crater": "<6.0.2", - "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", - "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", - "cardgate/magento2": "<2.0.33", - "cardgate/woocommerce": "<=3.1.15", - "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<=2.1.6", - "catfan/medoo": "<1.7.5", - "causal/oidc": "<2.1", - "cecil/cecil": "<7.47.1", - "centreon/centreon": "<22.10.15", - "cesnet/simplesamlphp-module-proxystatistics": "<3.1", - "chriskacerguis/codeigniter-restserver": "<=2.7.1", - "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", - "ckeditor/ckeditor": "<4.24", - "cockpit-hq/cockpit": "<2.7|==2.7", - "codeception/codeception": "<3.1.3|>=4,<4.1.22", - "codeigniter/framework": "<3.1.9", - "codeigniter4/framework": "<4.4.7", - "codeigniter4/shield": "<1.0.0.0-beta8", - "codiad/codiad": "<=2.8.4", - "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", - "concrete5/concrete5": "<9.3.4", - "concrete5/core": "<8.5.8|>=9,<9.1", - "contao-components/mediaelement": ">=2.14.2,<2.21.1", - "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", - "contao/contao": "<=5.4.1", - "contao/core": "<3.5.39", - "contao/core-bundle": "<4.13.49|>=5,<5.3.15|>=5.4,<5.4.3", - "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", - "contao/managed-edition": "<=1.5", - "corveda/phpsandbox": "<1.3.5", - "cosenary/instagram": "<=2.3", - "craftcms/cms": "<4.6.2|>=5,<=5.2.2", - "croogo/croogo": "<4", - "cuyz/valinor": "<0.12", - "czim/file-handling": "<1.5|>=2,<2.3", - "czproject/git-php": "<4.0.3", - "damienharper/auditor-bundle": "<5.2.6", - "dapphp/securimage": "<3.6.6", - "darylldoyle/safe-svg": "<1.9.10", - "datadog/dd-trace": ">=0.30,<0.30.2", - "datatables/datatables": "<1.10.10", - "david-garcia/phpwhois": "<=4.3.1", - "dbrisinajumi/d2files": "<1", - "dcat/laravel-admin": "<=2.1.3", - "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", - "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", - "desperado/xml-bundle": "<=0.1.7", - "dev-lancer/minecraft-motd-parser": "<=1.0.5", - "devgroup/dotplant": "<2020.09.14-dev", - "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", - "doctrine/annotations": "<1.2.7", - "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": "<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", - "doctrine/doctrine-bundle": "<1.5.2", - "doctrine/doctrine-module": "<0.7.2", - "doctrine/mongodb-odm": "<1.0.2", - "doctrine/mongodb-odm-bundle": "<3.0.1", - "doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<19.0.2", - "dompdf/dompdf": "<2.0.4", - "doublethreedigital/guest-entries": "<3.1.2", - "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.3.6|>=11,<11.0.5", - "drupal/core-recommended": ">=8,<10.3.6|>=11,<11.0.5", - "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<10.3.6|>=11,<11.0.5", - "duncanmcclean/guest-entries": "<3.1.2", - "dweeves/magmi": "<=0.7.24", - "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", - "ecodev/newsletter": "<=4", - "ectouch/ectouch": "<=2.7.2", - "egroupware/egroupware": "<23.1.20240624", - "elefant/cms": "<2.0.7", - "elgg/elgg": "<3.3.24|>=4,<4.0.5", - "elijaa/phpmemcacheadmin": "<=1.3", - "encore/laravel-admin": "<=1.8.19", - "endroid/qr-code-bundle": "<3.4.2", - "enhavo/enhavo-app": "<=0.13.1", - "enshrined/svg-sanitize": "<0.15", - "erusev/parsedown": "<1.7.2", - "ether/logs": "<3.0.4", - "evolutioncms/evolution": "<=3.2.3", - "exceedone/exment": "<4.4.3|>=5,<5.0.3", - "exceedone/laravel-admin": "<2.2.3|==3", - "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", - "ezsystems/ez-support-tools": ">=2.2,<2.2.3", - "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", - "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", - "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26|>=3.3,<3.3.39", - "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", - "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.35", - "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", - "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev|>=3.3,<3.3.40", - "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", - "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", - "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", - "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", - "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", - "facturascripts/facturascripts": "<=2022.08", - "fastly/magento2": "<1.2.26", - "feehi/cms": "<=2.1.1", - "feehi/feehicms": "<=2.1.1", - "fenom/fenom": "<=2.12.1", - "filament/infolists": ">=3,<3.2.115", - "filament/tables": ">=3,<3.2.115", - "filegator/filegator": "<7.8", - "filp/whoops": "<2.1.13", - "fineuploader/php-traditional-server": "<=1.2.2", - "firebase/php-jwt": "<6", - "fisharebest/webtrees": "<=2.1.18", - "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", - "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", - "flarum/core": "<1.8.5", - "flarum/flarum": "<0.1.0.0-beta8", - "flarum/framework": "<1.8.5", - "flarum/mentions": "<1.6.3", - "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", - "flarum/tags": "<=0.1.0.0-beta13", - "floriangaerber/magnesium": "<0.3.1", - "fluidtypo3/vhs": "<5.1.1", - "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", - "fof/upload": "<1.2.3", - "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", - "fooman/tcpdf": "<6.2.22", - "forkcms/forkcms": "<5.11.1", - "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<=11.5.1", - "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", - "friendsofsymfony/oauth2-php": "<1.3", - "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", - "friendsofsymfony/user-bundle": ">=1,<1.3.5", - "friendsofsymfony1/swiftmailer": ">=4,<5.4.13|>=6,<6.2.5", - "friendsofsymfony1/symfony1": ">=1.1,<1.5.19", - "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", - "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", - "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.3", - "froxlor/froxlor": "<=2.2.0.0-RC3", - "frozennode/administrator": "<=5.0.12", - "fuel/core": "<1.8.1", - "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", - "gaoming13/wechat-php-sdk": "<=1.10.2", - "genix/cms": "<=1.1.11", - "getformwork/formwork": "<1.13.1|==2.0.0.0-beta1", - "getgrav/grav": "<1.7.46", - "getkirby/cms": "<=3.6.6.5|>=3.7,<=3.7.5.4|>=3.8,<=3.8.4.3|>=3.9,<=3.9.8.1|>=3.10,<=3.10.1|>=4,<=4.3", - "getkirby/kirby": "<=2.5.12", - "getkirby/panel": "<2.5.14", - "getkirby/starterkit": "<=3.7.0.2", - "gilacms/gila": "<=1.15.4", - "gleez/cms": "<=1.3|==2", - "globalpayments/php-sdk": "<2", - "gogentooss/samlbase": "<1.2.7", - "google/protobuf": "<3.15", - "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", - "gree/jose": "<2.2.1", - "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<6.1.17", - "gugoan/economizzer": "<=0.9.0.0-beta1", - "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", - "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", - "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", - "harvesthq/chosen": "<1.8.7", - "helloxz/imgurl": "<=2.31", - "hhxsv5/laravel-s": "<3.7.36", - "hillelcoren/invoice-ninja": "<5.3.35", - "himiklab/yii2-jqgrid-widget": "<1.0.8", - "hjue/justwriting": "<=1", - "hov/jobfair": "<1.0.13|>=2,<2.0.2", - "httpsoft/http-message": "<1.0.12", - "hyn/multi-tenant": ">=5.6,<5.7.2", - "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6.0.0-beta1,<4.6.9", - "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.6|>=4.6,<4.6.2", - "ibexa/fieldtype-richtext": ">=4.6,<4.6.10", - "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", - "ibexa/post-install": "<=1.0.4", - "ibexa/solr": ">=4.5,<4.5.4", - "ibexa/user": ">=4,<4.4.3", - "icecoder/icecoder": "<=8.1", - "idno/known": "<=1.3.1", - "ilicmiljan/secure-props": ">=1.2,<1.2.2", - "illuminate/auth": "<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", - "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", - "imdbphp/imdbphp": "<=5.1.1", - "impresscms/impresscms": "<=1.4.5", - "impresspages/impresspages": "<=1.0.12", - "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.3", - "in2code/ipandlanguageredirect": "<5.1.2", - "in2code/lux": "<17.6.1|>=18,<24.0.2", - "in2code/powermail": "<7.5.1|>=8,<8.5.1|>=9,<10.9.1|>=11,<12.4.1", - "innologi/typo3-appointments": "<2.0.6", - "intelliants/subrion": "<4.2.2", - "inter-mediator/inter-mediator": "==5.5", - "ipl/web": "<0.10.1", - "islandora/islandora": ">=2,<2.4.1", - "ivankristianto/phpwhois": "<=4.3", - "jackalope/jackalope-doctrine-dbal": "<1.7.4", - "james-heinrich/getid3": "<1.9.21", - "james-heinrich/phpthumb": "<1.7.12", - "jasig/phpcas": "<1.3.3", - "jcbrand/converse.js": "<3.3.3", - "johnbillion/wp-crontrol": "<1.16.2", - "joomla/application": "<1.0.13", - "joomla/archive": "<1.1.12|>=2,<2.0.1", - "joomla/filesystem": "<1.6.2|>=2,<2.0.1", - "joomla/filter": "<1.4.4|>=2,<2.0.1", - "joomla/framework": "<1.5.7|>=2.5.4,<=3.8.12", - "joomla/input": ">=2,<2.0.2", - "joomla/joomla-cms": ">=2.5,<3.9.12", - "joomla/session": "<1.3.1", - "joyqi/hyper-down": "<=2.4.27", - "jsdecena/laracom": "<2.0.9", - "jsmitty12/phpwhois": "<5.1", - "juzaweb/cms": "<=3.4", - "jweiland/events2": "<8.3.8|>=9,<9.0.6", - "kazist/phpwhois": "<=4.2.6", - "kelvinmo/simplexrd": "<3.1.1", - "kevinpapst/kimai2": "<1.16.7", - "khodakhah/nodcms": "<=3", - "kimai/kimai": "<=2.20.1", - "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", - "klaviyo/magento2-extension": ">=1,<3", - "knplabs/knp-snappy": "<=1.4.2", - "kohana/core": "<3.3.3", - "krayin/laravel-crm": "<1.2.2", - "kreait/firebase-php": ">=3.2,<3.8.1", - "kumbiaphp/kumbiapp": "<=1.1.1", - "la-haute-societe/tcpdf": "<6.2.22", - "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", - "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", - "laminas/laminas-http": "<2.14.2", - "laravel/fortify": "<1.11.1", - "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", - "laravel/laravel": ">=5.4,<5.4.22", - "laravel/socialite": ">=1,<2.0.10", - "latte/latte": "<2.10.8", - "lavalite/cms": "<=9|==10.1", - "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", - "league/commonmark": "<0.18.3", - "league/flysystem": "<1.1.4|>=2,<2.1.1", - "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", - "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "libreform/libreform": ">=2,<=2.0.8", - "librenms/librenms": "<2017.08.18", - "liftkit/database": "<2.13.2", - "lightsaml/lightsaml": "<1.3.5", - "limesurvey/limesurvey": "<3.27.19", - "livehelperchat/livehelperchat": "<=3.91", - "livewire/livewire": ">2.2.4,<2.2.6|>=3.3.5,<3.4.9", - "lms/routes": "<2.1.1", - "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", - "luyadev/yii-helpers": "<1.2.1", - "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch9|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch7|==2.4.7|>=2.4.7.0-patch1,<2.4.7.0-patch2", - "magento/core": "<=1.9.4.5", - "magento/magento1ce": "<1.9.4.3-dev", - "magento/magento1ee": ">=1,<1.14.4.3-dev", - "magento/product-community-edition": "<2.4.4.0-patch9|>=2.4.5,<2.4.5.0-patch8|>=2.4.6,<2.4.6.0-patch6|>=2.4.7,<2.4.7.0-patch1", - "magneto/core": "<1.9.4.4-dev", - "maikuolan/phpmussel": ">=1,<1.6", - "mainwp/mainwp": "<=4.4.3.3", - "mantisbt/mantisbt": "<=2.26.3", - "marcwillmann/turn": "<0.3.3", - "matyhtf/framework": "<3.0.6", - "mautic/core": "<4.4.13|>=5,<5.1.1", - "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", - "mdanter/ecc": "<2", - "mediawiki/core": "<1.36.2", - "mediawiki/matomo": "<2.4.3", - "mediawiki/semantic-media-wiki": "<4.0.2", - "melisplatform/melis-asset-manager": "<5.0.1", - "melisplatform/melis-cms": "<5.0.1", - "melisplatform/melis-front": "<5.0.1", - "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", - "mgallegos/laravel-jqgrid": "<=1.3", - "microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2,<2.0.1", - "microsoft/microsoft-graph-beta": "<2.0.1", - "microsoft/microsoft-graph-core": "<2.0.2", - "microweber/microweber": "<=2.0.16", - "mikehaertl/php-shellcommand": "<1.6.1", - "miniorange/miniorange-saml": "<1.4.3", - "mittwald/typo3_forum": "<1.2.1", - "mobiledetect/mobiledetectlib": "<2.8.32", - "modx/revolution": "<=2.8.3.0-patch", - "mojo42/jirafeau": "<4.4", - "mongodb/mongodb": ">=1,<1.9.2", - "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.3.5|>=4.4.0.0-beta,<4.4.1", - "mos/cimage": "<0.7.19", - "movim/moxl": ">=0.8,<=0.10", - "movingbytes/social-network": "<=1.2.1", - "mpdf/mpdf": "<=7.1.7", - "munkireport/comment": "<4.1", - "munkireport/managedinstalls": "<2.6", - "munkireport/munki_facts": "<1.5", - "munkireport/munkireport": ">=2.5.3,<5.6.3", - "munkireport/reportdata": "<3.5", - "munkireport/softwareupdate": "<1.6", - "mustache/mustache": ">=2,<2.14.1", - "namshi/jose": "<2.2", - "nategood/httpful": "<1", - "neoan3-apps/template": "<1.1.1", - "neorazorx/facturascripts": "<2022.04", - "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", - "neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9", - "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", - "neos/swiftmailer": "<5.4.5", - "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", - "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", - "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", - "nilsteampassnet/teampass": "<3.0.10", - "nonfiction/nterchange": "<4.1.1", - "notrinos/notrinos-erp": "<=0.7", - "noumo/easyii": "<=0.9", - "novaksolutions/infusionsoft-php-sdk": "<1", - "nukeviet/nukeviet": "<4.5.02", - "nyholm/psr7": "<1.6.1", - "nystudio107/craft-seomatic": "<3.4.12", - "nzedb/nzedb": "<0.8", - "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "october/backend": "<1.1.2", - "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", - "october/october": "<=3.6.4", - "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", - "omeka/omeka-s": "<4.0.3", - "onelogin/php-saml": "<2.10.4", - "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", - "open-web-analytics/open-web-analytics": "<1.7.4", - "opencart/opencart": ">=0", - "openid/php-openid": "<2.3", - "openmage/magento-lts": "<20.10.1", - "opensolutions/vimbadmin": "<=3.0.15", - "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", - "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", - "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", - "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", - "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", - "oro/crm-call-bundle": ">=4.2,<=4.2.5|>=5,<5.0.4|>=5.1,<5.1.1", - "oro/customer-portal": ">=4.1,<=4.1.13|>=4.2,<=4.2.10|>=5,<=5.0.11|>=5.1,<=5.1.3", - "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<=5.0.12|>=5.1,<=5.1.3", - "oveleon/contao-cookiebar": "<1.16.3|>=2,<2.1.3", - "oxid-esales/oxideshop-ce": "<4.5", - "oxid-esales/paymorrow-module": ">=1,<1.0.2|>=2,<2.0.1", - "packbackbooks/lti-1-3-php-library": "<5", - "padraic/humbug_get_contents": "<1.1.2", - "pagarme/pagarme-php": "<3", - "pagekit/pagekit": "<=1.0.18", - "paragonie/ecc": "<2.0.1", - "paragonie/random_compat": "<2", - "passbolt/passbolt_api": "<4.6.2", - "paypal/adaptivepayments-sdk-php": "<=3.9.2", - "paypal/invoice-sdk-php": "<=3.9", - "paypal/merchant-sdk-php": "<3.12", - "paypal/permissions-sdk-php": "<=3.9.1", - "pear/archive_tar": "<1.4.14", - "pear/auth": "<1.2.4", - "pear/crypt_gpg": "<1.6.7", - "pear/pear": "<=1.10.1", - "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", - "personnummer/personnummer": "<3.0.2", - "phanan/koel": "<5.1.4", - "phenx/php-svg-lib": "<0.5.2", - "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", - "php-mod/curl": "<2.3.2", - "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", - "phpems/phpems": ">=6,<=6.1.3", - "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", - "phpmailer/phpmailer": "<6.5", - "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<5.2.1", - "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5", - "phpoffice/common": "<0.2.9", - "phpoffice/phpexcel": "<1.8", - "phpoffice/phpspreadsheet": "<1.29.1|>=2,<2.1.1|>=2.2,<2.2.1", - "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", - "phpservermon/phpservermon": "<3.6", - "phpsysinfo/phpsysinfo": "<3.4.3", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", - "phpwhois/phpwhois": "<=4.2.5", - "phpxmlrpc/extras": "<0.6.1", - "phpxmlrpc/phpxmlrpc": "<4.9.2", - "pi/pi": "<=2.5", - "pimcore/admin-ui-classic-bundle": "<1.5.4", - "pimcore/customer-management-framework-bundle": "<4.0.6", - "pimcore/data-hub": "<1.2.4", - "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", - "pimcore/demo": "<10.3", - "pimcore/ecommerce-framework-bundle": "<1.0.10", - "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<11.2.4", - "pixelfed/pixelfed": "<0.11.11", - "plotly/plotly.js": "<2.25.2", - "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": "<5.11.2", - "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", - "pressbooks/pressbooks": "<5.18", - "prestashop/autoupgrade": ">=4,<4.10.1", - "prestashop/blockreassurance": "<=5.1.3", - "prestashop/blockwishlist": ">=2,<2.1.1", - "prestashop/contactform": ">=1.0.1,<4.3", - "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": "<8.1.6", - "prestashop/productcomments": "<5.0.2", - "prestashop/ps_emailsubscription": "<2.6.1", - "prestashop/ps_facetedsearch": "<3.4.1", - "prestashop/ps_linklist": "<3.1", - "privatebin/privatebin": "<1.4|>=1.5,<1.7.4", - "processwire/processwire": "<=3.0.229", - "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", - "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<1.11.6", - "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", - "ptrofimov/beanstalk_console": "<1.7.14", - "pubnub/pubnub": "<6.1", - "pusher/pusher-php-server": "<2.2.1", - "pwweb/laravel-core": "<=0.3.6.0-beta", - "pxlrbt/filament-excel": "<1.1.14|>=2.0.0.0-alpha,<2.3.3", - "pyrocms/pyrocms": "<=3.9.1", - "qcubed/qcubed": "<=3.1.1", - "quickapps/cms": "<=2.0.0.0-beta2", - "rainlab/blog-plugin": "<1.4.1", - "rainlab/debugbar-plugin": "<3.1", - "rainlab/user-plugin": "<=1.4.5", - "rankmath/seo-by-rank-math": "<=1.0.95", - "rap2hpoutre/laravel-log-viewer": "<0.13", - "react/http": ">=0.7,<1.9", - "really-simple-plugins/complianz-gdpr": "<6.4.2", - "redaxo/source": "<=5.15.1", - "remdex/livehelperchat": "<4.29", - "reportico-web/reportico": "<=8.1", - "rhukster/dom-sanitizer": "<1.0.7", - "rmccue/requests": ">=1.6,<1.8", - "robrichards/xmlseclibs": ">=1,<3.0.4", - "roots/soil": "<4.1", - "rudloff/alltube": "<3.0.3", - "s-cart/core": "<6.9", - "s-cart/s-cart": "<6.9", - "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", - "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", - "scheb/two-factor-bundle": "<3.26|>=4,<4.11", - "sensiolabs/connect": "<4.2.3", - "serluck/phpwhois": "<=4.2.6", - "sfroemken/url_redirect": "<=1.2.1", - "sheng/yiicms": "<=1.2", - "shopware/core": "<=6.5.8.12|>=6.6,<=6.6.5", - "shopware/platform": "<=6.5.8.12|>=6.6,<=6.6.5", - "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.7.17", - "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", - "shopxo/shopxo": "<=6.1", - "showdoc/showdoc": "<2.10.4", - "silverstripe-australia/advancedreports": ">=1,<=2", - "silverstripe/admin": "<1.13.19|>=2,<2.1.8", - "silverstripe/assets": ">=1,<1.11.1", - "silverstripe/cms": "<4.11.3", - "silverstripe/comments": ">=1.3,<3.1.1", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<5.2.16", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", - "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", - "silverstripe/recipe-cms": ">=4.5,<4.5.3", - "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", - "silverstripe/reports": "<5.2.3", - "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4|>=2.1,<2.1.2", - "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", - "silverstripe/subsites": ">=2,<2.6.1", - "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", - "silverstripe/userforms": "<3|>=5,<5.4.2", - "silverstripe/versioned-admin": ">=1,<1.11.1", - "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4|==5.0.0.0-alpha12", - "simplesamlphp/simplesamlphp": "<1.18.6", - "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", - "simplesamlphp/simplesamlphp-module-openid": "<1", - "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", - "simplesamlphp/xml-security": "==1.6.11", - "simplito/elliptic-php": "<1.0.6", - "sitegeist/fluid-components": "<3.5", - "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", - "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", - "slim/slim": "<2.6", - "slub/slub-events": "<3.0.3", - "smarty/smarty": "<4.5.3|>=5,<5.1.1", - "snipe/snipe-it": "<6.4.2", - "socalnick/scn-social-auth": "<1.15.2", - "socialiteproviders/steam": "<1.1", - "spatie/browsershot": "<3.57.4", - "spatie/image-optimizer": "<1.7.3", - "spipu/html2pdf": "<5.2.8", - "spoon/library": "<1.4.1", - "spoonity/tcpdf": "<6.2.22", - "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<24.05.1", - "starcitizentools/citizen-skin": ">=2.6.3,<2.31", - "statamic/cms": "<4.46|>=5.3,<5.6.2", - "stormpath/sdk": "<9.9.99", - "studio-42/elfinder": "<=2.1.64", - "studiomitte/friendlycaptcha": "<0.1.4", - "subhh/libconnect": "<7.0.8|>=8,<8.1", - "sukohi/surpass": "<1", - "sulu/form-bundle": ">=2,<2.5.3", - "sulu/sulu": "<1.6.44|>=2,<2.6.5", - "sumocoders/framework-user-bundle": "<1.4", - "superbig/craft-audit": "<3.0.2", - "swag/paypal": "<5.4.4", - "swiftmailer/swiftmailer": "<6.2.5", - "swiftyedit/swiftyedit": "<1.2", - "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", - "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/grid-bundle": "<1.10.1", - "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", - "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.12.19|>=1.13.0.0-alpha1,<1.13.4", - "symbiote/silverstripe-multivaluefield": ">=3,<3.1", - "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", - "symbiote/silverstripe-seed": "<6.0.3", - "symbiote/silverstripe-versionedfiles": "<=2.0.3", - "symfont/process": ">=0", - "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", - "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<5.3.15|>=5.4.3,<5.4.4|>=6.0.3,<6.0.4", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", - "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", - "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", - "symfony/mime": ">=4.3,<4.3.8", - "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/polyfill": ">=1,<1.10", - "symfony/polyfill-php55": ">=1,<1.10", - "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", - "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2|>=5.4,<5.4.31|>=6,<6.3.8", - "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", - "symfony/symfony": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", - "symfony/translation": ">=2,<2.0.17", - "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", - "symfony/ux-autocomplete": "<2.11.2", - "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", - "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", - "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", - "symfony/webhook": ">=6.3,<6.3.8", - "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7|>=2.2.0.0-beta1,<2.2.0.0-beta2", - "symphonycms/symphony-2": "<2.6.4", - "t3/dce": "<0.11.5|>=2.2,<2.6.2", - "t3g/svg-sanitizer": "<1.0.3", - "t3s/content-consent": "<1.0.3|>=2,<2.0.2", - "tastyigniter/tastyigniter": "<3.3", - "tcg/voyager": "<=1.4", - "tecnickcom/tcpdf": "<=6.7.4", - "terminal42/contao-tablelookupwizard": "<3.3.5", - "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1,<2.1.3", - "theonedemon/phpwhois": "<=4.2.5", - "thinkcmf/thinkcmf": "<6.0.8", - "thorsten/phpmyfaq": "<3.2.2", - "tikiwiki/tiki-manager": "<=17.1", - "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", - "tinymce/tinymce": "<7.2", - "tinymighty/wiki-seo": "<1.2.2", - "titon/framework": "<9.9.99", - "tobiasbg/tablepress": "<=2.0.0.0-RC1", - "topthink/framework": "<6.0.17|>=6.1,<=8.0.4", - "topthink/think": "<=6.1.1", - "topthink/thinkphp": "<=3.2.3", - "torrentpier/torrentpier": "<=2.4.3", - "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", - "tribalsystems/zenario": "<=9.7.61188", - "truckersmp/phpwhois": "<=4.3.1", - "ttskch/pagination-service-provider": "<1", - "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", - "twig/twig": "<1.44.8|>=2,<2.16.1|>=3,<3.11.1|>=3.12,<3.14", - "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", - "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": "<=8.7.56|>=9,<=9.5.47|>=10,<=10.4.44|>=11,<=11.5.36|>=12,<=12.4.14|>=13,<=13.1", - "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", - "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1", - "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5", - "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8", - "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", - "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", - "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", - "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", - "ua-parser/uap-php": "<3.8", - "uasoft-indonesia/badaso": "<=2.9.7", - "unisharp/laravel-filemanager": "<2.6.4", - "userfrosting/userfrosting": ">=0.3.1,<4.6.3", - "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", - "uvdesk/community-skeleton": "<=1.1.1", - "uvdesk/core-framework": "<=1.1.1", - "vanilla/safecurl": "<0.9.2", - "verbb/comments": "<1.5.5", - "verbb/formie": "<2.1.6", - "verbb/image-resizer": "<2.0.9", - "verbb/knock-knock": "<1.2.8", - "verot/class.upload.php": "<=2.1.6", - "villagedefrance/opencart-overclocked": "<=1.11.1", - "vova07/yii2-fileapi-widget": "<0.1.9", - "vrana/adminer": "<4.8.1", - "vufind/vufind": ">=2,<9.1.1", - "waldhacker/hcaptcha": "<2.1.2", - "wallabag/tcpdf": "<6.2.22", - "wallabag/wallabag": "<2.6.7", - "wanglelecc/laracms": "<=1.0.3", - "web-auth/webauthn-framework": ">=3.3,<3.3.4|>=4.5,<4.9", - "web-auth/webauthn-lib": ">=4.5,<4.9", - "web-feet/coastercms": "==5.5", - "webbuilders-group/silverstripe-kapost-bridge": "<0.4", - "webcoast/deferred-image-processing": "<1.0.2", - "webklex/laravel-imap": "<5.3", - "webklex/php-imap": "<5.3", - "webpa/webpa": "<3.1.2", - "wikibase/wikibase": "<=1.39.3", - "wikimedia/parsoid": "<0.12.2", - "willdurand/js-translation-bundle": "<2.1.1", - "winter/wn-backend-module": "<1.2.4", - "winter/wn-dusk-plugin": "<2.1", - "winter/wn-system-module": "<1.2.4", - "wintercms/winter": "<=1.2.3", - "wireui/wireui": "<1.19.3|>=2,<2.1.3", - "woocommerce/woocommerce": "<6.6|>=8.8,<8.8.5|>=8.9,<8.9.3", - "wp-cli/wp-cli": ">=0.12,<2.5", - "wp-graphql/wp-graphql": "<=1.14.5", - "wp-premium/gravityforms": "<2.4.21", - "wpanel/wpanel4-cms": "<=4.3.1", - "wpcloud/wp-stateless": "<3.2", - "wpglobus/wpglobus": "<=1.9.6", - "wwbn/avideo": "<14.3", - "xataface/xataface": "<3", - "xpressengine/xpressengine": "<3.0.15", - "yab/quarx": "<2.4.5", - "yeswiki/yeswiki": "<4.1", - "yetiforce/yetiforce-crm": "<=6.4", - "yidashi/yii2cmf": "<=2", - "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": "<1.1.29", - "yiisoft/yii2": "<2.0.49.4-dev", - "yiisoft/yii2-authclient": "<2.2.15", - "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.43", - "yiisoft/yii2-elasticsearch": "<2.0.5", - "yiisoft/yii2-gii": "<=2.2.4", - "yiisoft/yii2-jui": "<2.0.4", - "yiisoft/yii2-redis": "<2.0.8", - "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", - "yoast-seo-for-typo3/yoast_seo": "<7.2.3", - "yourls/yourls": "<=1.8.2", - "yuan1994/tpadmin": "<=1.3.12", - "zencart/zencart": "<=1.5.7.0-beta", - "zendesk/zendesk_api_client_php": "<2.2.11", - "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", - "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-db": "<2.2.10|>=2.3,<2.3.5", - "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": "<1.8.4", - "zendframework/zend-feed": "<2.10.3", - "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": "<2.8.1", - "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", - "zendframework/zend-mail": "<2.4.11|>=2.5,<2.7.2", - "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-session": ">=2,<2.2.9|>=2.3,<2.3.4", - "zendframework/zend-validator": ">=2.3,<2.3.6", - "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<=3", - "zendframework/zendframework1": "<1.12.20", - "zendframework/zendopenid": "<2.0.2", - "zendframework/zendrest": "<2.0.2", - "zendframework/zendservice-amazon": "<2.0.3", - "zendframework/zendservice-api": "<1", - "zendframework/zendservice-audioscrobbler": "<2.0.2", - "zendframework/zendservice-nirvanix": "<2.0.2", - "zendframework/zendservice-slideshare": "<2.0.2", - "zendframework/zendservice-technorati": "<2.0.2", - "zendframework/zendservice-windowsazure": "<2.0.2", - "zendframework/zendxml": ">=1,<1.0.1", - "zenstruck/collection": "<0.2.1", - "zetacomponents/mail": "<1.8.2", - "zf-commons/zfc-user": "<1.2.2", - "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2", - "zoujingli/thinkadmin": "<=6.1.53" - }, - "default-branch": true, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "role": "maintainer" - }, - { - "name": "Ilya Tribusean", - "email": "slash3b@gmail.com", - "role": "maintainer" - } - ], - "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "keywords": [ - "dev" - ], - "support": { - "issues": "https://github.com/Roave/SecurityAdvisories/issues", - "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", - "type": "tidelift" - } - ], - "time": "2024-10-04T19:04:42+00:00" - }, - { - "name": "sabre/event", - "version": "5.1.7", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/event.git", - "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/86d57e305c272898ba3c28e9bd3d65d5464587c2", - "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1||^3.63", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" - }, - "type": "library", - "autoload": { - "files": [ - "lib/coroutine.php", - "lib/Loop/functions.php", - "lib/Promise/functions.php" - ], - "psr-4": { - "Sabre\\Event\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "sabre/event is a library for lightweight event-based programming", - "homepage": "http://sabre.io/event/", - "keywords": [ - "EventEmitter", - "async", - "coroutine", - "eventloop", - "events", - "hooks", - "plugin", - "promise", - "reactor", - "signal" - ], - "support": { - "forum": "https://groups.google.com/group/sabredav-discuss", - "issues": "https://github.com/sabre-io/event/issues", - "source": "https://github.com/fruux/sabre-event" - }, - "time": "2024-08-27T11:23:05+00:00" - }, - { - "name": "sanmai/later", - "version": "0.1.4", - "source": { - "type": "git", - "url": "https://github.com/sanmai/later.git", - "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sanmai/later/zipball/e24c4304a4b1349c2a83151a692cec0c10579f60", - "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^3.35.1", - "infection/infection": ">=0.27.6", - "phan/phan": ">=2", - "php-coveralls/php-coveralls": "^2.0", - "phpstan/phpstan": ">=1.4.5", - "phpunit/phpunit": ">=9.5 <10", - "vimeo/psalm": ">=2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.1.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Later\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Alexey Kopytko", - "email": "alexey@kopytko.com" - } - ], - "description": "Later: deferred wrapper object", - "support": { - "issues": "https://github.com/sanmai/later/issues", - "source": "https://github.com/sanmai/later/tree/0.1.4" - }, - "funding": [ - { - "url": "https://github.com/sanmai", - "type": "github" - } - ], - "time": "2023-10-24T00:25:28+00:00" - }, - { - "name": "sanmai/pipeline", - "version": "v6.11", - "source": { - "type": "git", - "url": "https://github.com/sanmai/pipeline.git", - "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sanmai/pipeline/zipball/a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", - "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^3.17", - "infection/infection": ">=0.10.5", - "league/pipeline": "^0.3 || ^1.0", - "phan/phan": ">=1.1", - "php-coveralls/php-coveralls": "^2.4.1", - "phpstan/phpstan": ">=0.10", - "phpunit/phpunit": ">=9.4", - "vimeo/psalm": ">=2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v6.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Pipeline\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Alexey Kopytko", - "email": "alexey@kopytko.com" - } - ], - "description": "General-purpose collections pipeline", - "support": { - "issues": "https://github.com/sanmai/pipeline/issues", - "source": "https://github.com/sanmai/pipeline/tree/v6.11" - }, - "funding": [ - { - "url": "https://github.com/sanmai", - "type": "github" - } - ], - "time": "2024-06-15T03:11:19+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.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/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.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", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.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" - } - ], - "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", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:59:15+00:00" - }, - { - "name": "sebastian/comparator", - "version": "5.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", - "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.4" - }, - "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" - }, - { - "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/5.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-12T06:03:08+00:00" - }, - { - "name": "sebastian/complexity", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.2-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/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:37:17+00:00" - }, - { - "name": "sebastian/diff", - "version": "5.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "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" - }, - { - "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/5.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:15:17+00:00" - }, - { - "name": "sebastian/environment", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "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" - } - ], - "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/6.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-23T08:47:14+00:00" - }, - { - "name": "sebastian/exporter", - "version": "5.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "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" - }, - { - "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/5.1.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:17:12+00:00" - }, - { - "name": "sebastian/global-state", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.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": "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/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:19:19+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.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/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:38:20+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.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" - } - ], - "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", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:08:32+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.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" - } - ], - "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", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:06:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.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" - }, - { - "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", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:05:40+00:00" - }, - { - "name": "sebastian/type", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.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": "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", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:10:45+00:00" - }, - { - "name": "sebastian/version", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "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 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", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "spatie/array-to-xml", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/array-to-xml.git", - "reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/f56b220fe2db1ade4c88098d83413ebdfc3bf876", - "reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": "^8.0" - }, - "require-dev": { - "mockery/mockery": "^1.2", - "pestphp/pest": "^1.21", - "spatie/pest-plugin-snapshots": "^1.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Spatie\\ArrayToXml\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://freek.dev", - "role": "Developer" - } - ], - "description": "Convert an array to xml", - "homepage": "https://github.com/spatie/array-to-xml", - "keywords": [ - "array", - "convert", - "xml" - ], - "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.3.0" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-05-01T10:20:27+00:00" - }, - { - "name": "spatie/backtrace", - "version": "1.6.2", - "source": { - "type": "git", - "url": "https://github.com/spatie/backtrace.git", - "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9", - "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "ext-json": "*", - "laravel/serializable-closure": "^1.3", - "phpunit/phpunit": "^9.3", - "spatie/phpunit-snapshot-assertions": "^4.2", - "symfony/var-dumper": "^5.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Backtrace\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van de Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A better backtrace", - "homepage": "https://github.com/spatie/backtrace", - "keywords": [ - "Backtrace", - "spatie" - ], - "support": { - "source": "https://github.com/spatie/backtrace/tree/1.6.2" - }, - "funding": [ - { - "url": "https://github.com/sponsors/spatie", - "type": "github" - }, - { - "url": "https://spatie.be/open-source/support-us", - "type": "other" - } - ], - "time": "2024-07-22T08:21:24+00:00" - }, - { - "name": "spatie/error-solutions", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/error-solutions.git", - "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/ae7393122eda72eed7cc4f176d1e96ea444f2d67", - "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "illuminate/broadcasting": "^10.0|^11.0", - "illuminate/cache": "^10.0|^11.0", - "illuminate/support": "^10.0|^11.0", - "livewire/livewire": "^2.11|^3.3.5", - "openai-php/client": "^0.10.1", - "orchestra/testbench": "^7.0|8.22.3|^9.0", - "pestphp/pest": "^2.20", - "phpstan/phpstan": "^1.11", - "psr/simple-cache": "^3.0", - "psr/simple-cache-implementation": "^3.0", - "spatie/ray": "^1.28", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Ignition\\": "legacy/ignition", - "Spatie\\ErrorSolutions\\": "src", - "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ruben Van Assche", - "email": "ruben@spatie.be", - "role": "Developer" - } - ], - "description": "This is my package error-solutions", - "homepage": "https://github.com/spatie/error-solutions", - "keywords": [ - "error-solutions", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.1.1" - }, - "funding": [ - { - "url": "https://github.com/Spatie", - "type": "github" - } - ], - "time": "2024-07-25T11:06:04+00:00" - }, - { - "name": "spatie/flare-client-php", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/flare-client-php.git", - "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", - "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", - "shasum": "" - }, - "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", - "php": "^8.0", - "spatie/backtrace": "^1.6.1", - "symfony/http-foundation": "^5.2|^6.0|^7.0", - "symfony/mime": "^5.2|^6.0|^7.0", - "symfony/process": "^5.2|^6.0|^7.0", - "symfony/var-dumper": "^5.2|^6.0|^7.0" - }, - "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.5.0", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/pest-plugin-snapshots": "^1.0|^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.3.x-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\FlareClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/spatie/flare-client-php", - "keywords": [ - "exception", - "flare", - "reporting", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.8.0" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-08-01T08:27:26+00:00" - }, - { - "name": "spatie/ignition", - "version": "1.15.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/ignition.git", - "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/e3a68e137371e1eb9edc7f78ffa733f3b98991d2", - "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.0", - "spatie/error-solutions": "^1.0", - "spatie/flare-client-php": "^1.7", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "require-dev": { - "illuminate/cache": "^9.52|^10.0|^11.0", - "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "psr/simple-cache-implementation": "*", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Spatie\\Ignition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for PHP applications.", - "homepage": "https://flareapp.io/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/ignition/issues", - "source": "https://github.com/spatie/ignition" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-06-12T14:55:22+00:00" - }, - { - "name": "spatie/symfony-ignition-bundle", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/symfony-ignition-bundle.git", - "reference": "b3dd2bbb318d7642ecc6ee7e051b748d68dffb89" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/symfony-ignition-bundle/zipball/b3dd2bbb318d7642ecc6ee7e051b748d68dffb89", - "reference": "b3dd2bbb318d7642ecc6ee7e051b748d68dffb89", - "shasum": "" - }, - "require": { - "php": "^8.1", - "spatie/ignition": "^1.0", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.3 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", - "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5", - "symfony/dom-crawler": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Spatie\\SymfonyIgnitionBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Andrew MacRobert", - "email": "andrew.macrobert@gmail.com", - "role": "Developer" - }, - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for Symfony apps", - "homepage": "https://github.com/spatie/symfony-ignition-bundle", - "keywords": [ - "spatie", - "symfony-ignition-bundle" - ], - "support": { - "issues": "https://github.com/spatie/symfony-ignition-bundle/issues", - "source": "https://github.com/spatie/symfony-ignition-bundle/tree/1.1.0" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2023-12-16T17:16:54+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.10.3", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", - "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - } - ], - "time": "2024-09-18T10:38:58+00:00" - }, - { - "name": "symfony/debug-bundle", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug-bundle.git", - "reference": "aa024d28ce7ce0c6a16ee57c066838bece92893f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/aa024d28ce7ce0c6a16ee57c066838bece92893f", - "reference": "aa024d28ce7ce0c6a16ee57c066838bece92893f", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "php": ">=8.2", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4" - }, - "require-dev": { - "symfony/config": "^6.4|^7.0", - "symfony/web-profiler-bundle": "^6.4|^7.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\DebugBundle\\": "" - }, - "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 a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v7.1.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-05-31T14:55:39+00:00" - }, - { - "name": "symfony/maker-bundle", - "version": "v1.61.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/maker-bundle.git", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^2.0", - "nikic/php-parser": "^4.18|^5.0", - "php": ">=8.1", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/deprecation-contracts": "^2.2|^3", - "symfony/filesystem": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0" - }, - "conflict": { - "doctrine/doctrine-bundle": "<2.10", - "doctrine/orm": "<2.15" - }, - "require-dev": { - "composer/semver": "^3.0", - "doctrine/doctrine-bundle": "^2.5.0", - "doctrine/orm": "^2.15|^3", - "symfony/http-client": "^6.4|^7.0", - "symfony/phpunit-bridge": "^6.4.1|^7.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.0|^4.x-dev" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\MakerBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", - "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", - "keywords": [ - "code generator", - "dev", - "generator", - "scaffold", - "scaffolding" - ], - "support": { - "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.61.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-08-29T22:50:23+00:00" - }, - { - "name": "symfony/mime", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", - "shasum": "" - }, - "require": { - "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": { - "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", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.5" - }, - "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-20T08:28:38+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v7.1.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "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 an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.1.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-05-31T14:57:53+00:00" - }, - { - "name": "symfony/phpunit-bridge", - "version": "v7.1.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c", - "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.4|^7.0", - "symfony/polyfill-php81": "^1.27" - }, - "bin": [ - "bin/simple-phpunit" - ], - "type": "symfony-bridge", - "extra": { - "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/", - "/bin/" - ] - }, - "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": "Provides utilities for PHPUnit, especially user deprecation notices management", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.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-08-13T14:28:19+00:00" - }, - { - "name": "symfony/process", - "version": "v7.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "5c03ee6369281177f07f7c68252a280beccba847" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", - "reference": "5c03ee6369281177f07f7c68252a280beccba847", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "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": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v7.1.5" - }, - "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-19T21:48:23+00:00" - }, - { - "name": "symfony/web-profiler-bundle", - "version": "v7.1.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3cfc775277a8f2dacdd0f72d196bc87b272a763f", - "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/config": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", - "symfony/twig-bundle": "^6.4|^7.0", - "twig/twig": "^3.10" - }, - "conflict": { - "symfony/form": "<6.4", - "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4" - }, - "require-dev": { - "symfony/browser-kit": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" - }, - "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 a development tool that gives detailed information about the execution of any request", - "homepage": "https://symfony.com", - "keywords": [ - "dev" - ], - "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.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-08-12T09:59:40+00:00" - }, - { - "name": "thecodingmachine/phpstan-safe-rule", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/phpstan-safe-rule.git", - "reference": "8a7b88e0d54f209a488095085f183e9174c40e1e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/8a7b88e0d54f209a488095085f183e9174c40e1e", - "reference": "8a7b88e0d54f209a488095085f183e9174c40e1e", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "phpstan/phpstan": "^1.0", - "thecodingmachine/safe": "^1.0 || ^2.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^7.5.2 || ^8.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "type": "phpstan-extension", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, - "phpstan": { - "includes": [ - "phpstan-safe-rule.neon" - ] - } - }, - "autoload": { - "psr-4": { - "TheCodingMachine\\Safe\\PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "David Négrier", - "email": "d.negrier@thecodingmachine.com" - } - ], - "description": "A PHPStan rule to detect safety issues. Must be used in conjunction with thecodingmachine/safe", - "support": { - "issues": "https://github.com/thecodingmachine/phpstan-safe-rule/issues", - "source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.2.0" - }, - "time": "2022-01-17T10:12:29+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:36:25+00:00" - }, - { - "name": "tysonandre/var_representation_polyfill", - "version": "0.1.3", - "source": { - "type": "git", - "url": "https://github.com/TysonAndre/var_representation_polyfill.git", - "reference": "e9116c2c352bb0835ca428b442dde7767c11ad32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/e9116c2c352bb0835ca428b442dde7767c11ad32", - "reference": "e9116c2c352bb0835ca428b442dde7767c11ad32", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.2.0|^8.0.0" - }, - "provide": { - "ext-var_representation": "*" - }, - "require-dev": { - "phan/phan": "^5.4.1", - "phpunit/phpunit": "^8.5.0" - }, - "suggest": { - "ext-var_representation": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.1.3-dev" - } - }, - "autoload": { - "files": [ - "src/var_representation.php" - ], - "psr-4": { - "VarRepresentation\\": "src/VarRepresentation" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tyson Andre" - } - ], - "description": "Polyfill for var_representation: convert a variable to a string in a way that fixes the shortcomings of var_export", - "keywords": [ - "var_export", - "var_representation" - ], - "support": { - "issues": "https://github.com/TysonAndre/var_representation_polyfill/issues", - "source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.1.3" - }, - "time": "2022-08-31T12:59:22+00:00" - }, - { - "name": "vimeo/psalm", - "version": "5.26.1", - "source": { - "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", - "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer-runtime-api": "^2", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^2.0 || ^3.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-ctype": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.1", - "felixfbecker/language-server-protocol": "^1.5.2", - "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.17", - "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0", - "spatie/array-to-xml": "^2.17.0 || ^3.0", - "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" - }, - "conflict": { - "nikic/php-parser": "4.17.0" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "amphp/phpunit-util": "^2.0", - "bamarni/composer-bin-plugin": "^1.4", - "brianium/paratest": "^6.9", - "ext-curl": "*", - "mockery/mockery": "^1.5", - "nunomaduro/mock-final-classes": "^1.1", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpdoc-parser": "^1.6", - "phpunit/phpunit": "^9.6", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.6", - "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" - }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "project", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev", - "dev-4.x": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psalm\\": "src/Psalm/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php", - "static analysis" - ], - "support": { - "docs": "https://psalm.dev/docs", - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm" - }, - "time": "2024-09-08T18:53:08+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "roave/security-advisories": 20 - }, - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": "^8.3", - "ext-ctype": "*", - "ext-iconv": "*", - "ext-intl": "*", - "ext-mbstring": "*" - }, - "platform-dev": [], - "plugin-api-version": "2.6.0" -} diff --git a/symfony/public/index.php b/symfony/public/index.php deleted file mode 100644 index 9982c218..00000000 --- a/symfony/public/index.php +++ /dev/null @@ -1,9 +0,0 @@ - Date: Wed, 9 Oct 2024 18:38:03 +0000 Subject: [PATCH 56/61] $ ./vendor/bin/pint @ be --- be/config/preload.php | 4 ++-- be/public/index.php | 2 +- be/src/Controller/AssetController.php | 8 ++++---- be/src/Controller/ForumsController.php | 2 +- be/src/Controller/PostsController.php | 6 +++--- be/src/Controller/SitemapController.php | 12 +++++++----- be/src/Controller/UsersController.php | 2 +- be/src/DTO/User/AuthorExpGrade.php | 15 ++++++++++----- be/src/DTO/User/ForumModerator.php | 15 ++++++++++----- be/src/Entity/Forum.php | 4 +++- be/src/Entity/LatestReplier.php | 4 +++- be/src/Entity/Post/Content/PostContent.php | 4 +++- be/src/Entity/Post/Content/ReplyContent.php | 4 +++- be/src/Entity/Post/Content/SubReplyContent.php | 4 +++- be/src/Entity/Post/Post.php | 4 +++- be/src/Entity/Post/Reply.php | 4 +++- be/src/Entity/Post/SubReply.php | 8 ++++---- be/src/Entity/Post/Thread.php | 4 +++- be/src/Entity/Revision/AuthorExpGrade.php | 4 +++- be/src/Entity/Revision/ForumModerator.php | 4 +++- be/src/Entity/TimestampedEntity.php | 4 +++- be/src/Entity/User.php | 4 +++- be/src/EventListener/ExceptionToJsonResponse.php | 4 ++-- be/src/EventListener/SerializeToJson.php | 2 +- be/src/Kernel.php | 4 ++-- be/src/PostsQuery/BaseQuery.php | 3 ++- be/src/PostsQuery/IndexQuery.php | 2 +- be/src/PostsQuery/SearchQuery.php | 10 +++++----- be/src/Repository/Post/PostRepository.php | 6 ++++-- .../Revision/ForumModeratorRepository.php | 2 +- .../EventListener/ExceptionToJsonResponseTest.php | 2 +- be/tests/EventListener/PrettyJsonResponseTest.php | 2 +- be/tests/EventListener/ShowReactJsonViewTest.php | 2 +- .../Repository/Post/PostRepositoryFactoryTest.php | 2 +- be/tests/bootstrap.php | 4 ++-- 35 files changed, 103 insertions(+), 64 deletions(-) diff --git a/be/config/preload.php b/be/config/preload.php index 5ebcdb21..db377232 100644 --- a/be/config/preload.php +++ b/be/config/preload.php @@ -1,5 +1,5 @@ /** @lang JSRegexp */'(react(|-dom|-json-view)|scheduler)\.js' + 'filename' => /** @lang JSRegexp */'(react(|-dom|-json-view)|scheduler)\.js', ])] - public function getAsset(string $filename) : Response + public function getAsset(string $filename): Response { return new Response( content: preg_replace_callback_array([ @@ -27,9 +27,9 @@ public function getAsset(string $filename) : Response '@^//# sourceMappingURL=.+$@m' => static fn() => '', ], $this->filesystem->readFile( - $this->getParameter('kernel.project_dir') . "/public/react-json-view/$filename" + $this->getParameter('kernel.project_dir') . "/public/react-json-view/$filename", )), - headers: ['Content-Type' => 'text/javascript'] + headers: ['Content-Type' => 'text/javascript'], ); } } diff --git a/be/src/Controller/ForumsController.php b/be/src/Controller/ForumsController.php index e4ef9f7e..810ea1bb 100644 --- a/be/src/Controller/ForumsController.php +++ b/be/src/Controller/ForumsController.php @@ -8,7 +8,7 @@ class ForumsController extends AbstractController { - public function __construct(private readonly ForumRepository $repository,) {} + public function __construct(private readonly ForumRepository $repository) {} #[Route('/api/forums')] public function query(): array diff --git a/be/src/Controller/PostsController.php b/be/src/Controller/PostsController.php index edd7a811..1c32f3b1 100644 --- a/be/src/Controller/PostsController.php +++ b/be/src/Controller/PostsController.php @@ -52,7 +52,7 @@ public function query(Request $request): array $this->validator->validate($request->query->all(), new Assert\Collection([ 'cursor' => new Assert\Optional(new Assert\Regex( // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data // (,|$)|,){5,6} means allow at most 5~6 parts of base64 segment or empty string to exist - '/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/' + '/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/', )), 'query' => new Assert\Required(new Assert\Json()), ])); @@ -112,12 +112,12 @@ public function query(Request $request): array $fid = $result['fid']; $authorExpGrades = collect($this->authorExpGradeRepository->getLatestOfUsers($fid, $uids)) ->keyBy(fn(AuthorExpGrade $authorExpGrade) => $authorExpGrade->getUid()); - $users->each(fn (User $user) => $user->setCurrentAuthorExpGrade($authorExpGrades[$user->getUid()])); + $users->each(fn(User $user) => $user->setCurrentAuthorExpGrade($authorExpGrades[$user->getUid()])); $forumModerators = collect($this->forumModeratorRepository ->getLatestOfUsers($fid, $users->map(fn(User $user) => $user->getPortrait()))) ->keyBy(fn(ForumModerator $forumModerator) => $forumModerator->getPortrait()); - $users->each(fn (User $user) => $user->setCurrentForumModerator($forumModerators->get($user->getPortrait()))); + $users->each(fn(User $user) => $user->setCurrentForumModerator($forumModerators->get($user->getPortrait()))); $this->stopwatch->stop('queryUserRelated'); return [ diff --git a/be/src/Controller/SitemapController.php b/be/src/Controller/SitemapController.php index 5721993b..a697c16e 100644 --- a/be/src/Controller/SitemapController.php +++ b/be/src/Controller/SitemapController.php @@ -21,7 +21,7 @@ class SitemapController extends AbstractController public function __construct( private readonly CacheInterface $cache, private readonly ForumRepository $forumRepository, - private readonly PostRepositoryFactory $postRepositoryFactory + private readonly PostRepositoryFactory $postRepositoryFactory, ) {} #[Route('/sitemaps/forums')] @@ -41,7 +41,8 @@ function (ItemInterface $item) use ($threadsIdKeyByFid) { 'sitemaps/forums.xml.twig', ['threads_id_key_by_fid' => $threadsIdKeyByFid], ); - }); + }, + ); } #[Route('/sitemaps/forums/{fid}/threads', requirements: ['fid' => /** @lang JSRegexp */'\d+'])] @@ -60,10 +61,11 @@ function (ItemInterface $item) use ($fid, $cursor) { [ 'threads_id' => $this->postRepositoryFactory->newThread($fid)->getThreadsIdAfter($cursor, self::$maxUrls), - 'base_url_fe' => $this->getParameter('app.base_url.fe') - ] + 'base_url_fe' => $this->getParameter('app.base_url.fe'), + ], ); - }); + }, + ); } private function renderXml(string $view, array $parameters): Response diff --git a/be/src/Controller/UsersController.php b/be/src/Controller/UsersController.php index 100a3e42..b95622f2 100644 --- a/be/src/Controller/UsersController.php +++ b/be/src/Controller/UsersController.php @@ -47,7 +47,7 @@ function (array $acc, $paramValue, string $paramName) use ($paramConstraints): a : $queryBuilder->andWhere("t.$paramName = ?$paramIndex") ->setParameter($paramIndex, $paramValue)]; }, - [0, $this->userRepository->createQueryBuilder('t')] + [0, $this->userRepository->createQueryBuilder('t')], )[1]->orderBy('t.uid', 'DESC'); ['result' => $result, 'hasMorePages' => $hasMorePages] = diff --git a/be/src/DTO/User/AuthorExpGrade.php b/be/src/DTO/User/AuthorExpGrade.php index baa6e1ba..5b7544b7 100644 --- a/be/src/DTO/User/AuthorExpGrade.php +++ b/be/src/DTO/User/AuthorExpGrade.php @@ -1,4 +1,6 @@ -serializer->serialize([ 'errorCode' => 40000, - 'errorInfo' => $exception->getViolations() - ], 'json') + 'errorInfo' => $exception->getViolations(), + ], 'json'), )); } } diff --git a/be/src/EventListener/SerializeToJson.php b/be/src/EventListener/SerializeToJson.php index cef9e266..014615e8 100644 --- a/be/src/EventListener/SerializeToJson.php +++ b/be/src/EventListener/SerializeToJson.php @@ -15,7 +15,7 @@ public function __construct(private SerializerInterface $serializer) {} public function __invoke(ViewEvent $event): void { $event->setResponse(JsonResponse::fromJsonString( - $this->serializer->serialize($event->getControllerResult(), 'json') + $this->serializer->serialize($event->getControllerResult(), 'json'), )); } } diff --git a/be/src/Kernel.php b/be/src/Kernel.php index ac0e3319..e5f57f31 100644 --- a/be/src/Kernel.php +++ b/be/src/Kernel.php @@ -17,7 +17,7 @@ public function boot(): void /** @see CollectionMacroServiceProvider::register() */ collect([ 'recursive' => Recursive::class, - ])->reject(fn ($class, $macro) => Collection::hasMacro($macro)) - ->each(fn ($class, $macro) => Collection::macro($macro, (new $class())())); + ])->reject(fn($class, $macro) => Collection::hasMacro($macro)) + ->each(fn($class, $macro) => Collection::macro($macro, (new $class())())); } } diff --git a/be/src/PostsQuery/BaseQuery.php b/be/src/PostsQuery/BaseQuery.php index b71805c0..2c7ecb19 100644 --- a/be/src/PostsQuery/BaseQuery.php +++ b/be/src/PostsQuery/BaseQuery.php @@ -93,7 +93,8 @@ protected function setResult( $comparisons = $cursors->keys()->map( fn(string $fieldName): Expr\Comparison => $this->orderByDesc ? $qb->expr()->lt("t.$fieldName", ":cursor_$fieldName") - : $qb->expr()->gt("t.$fieldName", ":cursor_$fieldName")); + : $qb->expr()->gt("t.$fieldName", ":cursor_$fieldName"), + ); $qb->andWhere($qb->expr()->orX(...$comparisons)); $cursors->mapWithKeys(fn($fieldValue, string $fieldName) => $qb->setParameter("cursor_$fieldName", $fieldValue)); // prevent overwriting existing param diff --git a/be/src/PostsQuery/IndexQuery.php b/be/src/PostsQuery/IndexQuery.php index 3a4f092a..265f31d1 100644 --- a/be/src/PostsQuery/IndexQuery.php +++ b/be/src/PostsQuery/IndexQuery.php @@ -18,7 +18,7 @@ public function __construct( Stopwatch $stopwatch, CursorCodec $cursorCodec, private readonly PostRepositoryFactory $postRepositoryFactory, - private readonly ForumRepository $forumRepository + private readonly ForumRepository $forumRepository, ) { parent::__construct($normalizer, $stopwatch, $cursorCodec, $postRepositoryFactory); } diff --git a/be/src/PostsQuery/SearchQuery.php b/be/src/PostsQuery/SearchQuery.php index afc39169..b5734a0b 100644 --- a/be/src/PostsQuery/SearchQuery.php +++ b/be/src/PostsQuery/SearchQuery.php @@ -17,7 +17,7 @@ public function __construct( Stopwatch $stopwatch, CursorCodec $cursorCodec, private readonly PostRepositoryFactory $postRepositoryFactory, - private readonly UserRepository $userRepository + private readonly UserRepository $userRepository, ) { parent::__construct($normalizer, $stopwatch, $cursorCodec, $postRepositoryFactory); } @@ -118,7 +118,7 @@ static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryR default => $query->andWhere( "t.$fieldNameOfNumericParams " . ($sub['not'] ? $inverseRangeOfNumericParams : $sub['range']) - . " :$sqlParamName" + . " :$sqlParamName", )->setParameter($sqlParamName, $value), }, // textMatch @@ -146,7 +146,7 @@ static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryR $value, $sub, $sqlParamName, - )) + )), ), 'authorGender', 'latestReplierGender' => $query->andWhere("t.{$userTypeOfUserParams}Uid $not IN (:$sqlParamName)") @@ -155,7 +155,7 @@ static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryR $getAndCacheUserQuery($this->userRepository->createQueryBuilder('t') ->select('t.uid') ->andWhere("t.gender = :{$sqlParamName}_gender") - ->setParameter("{$sqlParamName}_gender", $value)) + ->setParameter("{$sqlParamName}_gender", $value)), ), 'authorManagerType' => $value === 'NULL' @@ -188,7 +188,7 @@ private static function applyTextMatchParamOnQuery( } $query = $query->setParameter( "{$sqlParamName}_$keywordIndex", - $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword + $subParams['matchBy'] === 'implicit' ? "%$keyword%" : $keyword, ); } return $query; diff --git a/be/src/Repository/Post/PostRepository.php b/be/src/Repository/Post/PostRepository.php index b46947cb..b15178bd 100644 --- a/be/src/Repository/Post/PostRepository.php +++ b/be/src/Repository/Post/PostRepository.php @@ -1,4 +1,6 @@ -getClassMetadata($postRepositoryClass)->setPrimaryTable([ - 'name' => "\"tbmc_f{$fid}_" . $this->getTableNameSuffix() . '"' + 'name' => "\"tbmc_f{$fid}_" . $this->getTableNameSuffix() . '"', ]); } diff --git a/be/src/Repository/Revision/ForumModeratorRepository.php b/be/src/Repository/Revision/ForumModeratorRepository.php index 438234e4..67521844 100644 --- a/be/src/Repository/Revision/ForumModeratorRepository.php +++ b/be/src/Repository/Revision/ForumModeratorRepository.php @@ -14,7 +14,7 @@ public function __construct(ManagerRegistry $registry) { parent::__construct($registry, ForumModerator::class); } - + public function getLatestOfUsers(int $fid, \ArrayAccess $portraits) { $entityManager = $this->getEntityManager(); diff --git a/be/tests/EventListener/ExceptionToJsonResponseTest.php b/be/tests/EventListener/ExceptionToJsonResponseTest.php index 467c240c..38dba58f 100644 --- a/be/tests/EventListener/ExceptionToJsonResponseTest.php +++ b/be/tests/EventListener/ExceptionToJsonResponseTest.php @@ -34,7 +34,7 @@ public function testHttpException(): void self::$kernel, new Request(), HttpKernelInterface::MAIN_REQUEST, - new HttpException(400, message: 'test', code: 40001) + new HttpException(400, message: 'test', code: 40001), ); ($this->sut)($event); self::assertEquals('test', $event->getResponse()->getContent()); diff --git a/be/tests/EventListener/PrettyJsonResponseTest.php b/be/tests/EventListener/PrettyJsonResponseTest.php index 3dd19be1..bcbd550a 100644 --- a/be/tests/EventListener/PrettyJsonResponseTest.php +++ b/be/tests/EventListener/PrettyJsonResponseTest.php @@ -29,7 +29,7 @@ public function test(): void self::$kernel, new Request(server: ['HTTP_ACCEPT' => 'application/json']), HttpKernelInterface::MAIN_REQUEST, - JsonResponse::fromJsonString(\Safe\json_encode(['test' => 'test'])) + JsonResponse::fromJsonString(\Safe\json_encode(['test' => 'test'])), ); ($this->sut)($event); self::assertEquals(<<<'JSON' diff --git a/be/tests/EventListener/ShowReactJsonViewTest.php b/be/tests/EventListener/ShowReactJsonViewTest.php index d263c99f..50a9ad31 100644 --- a/be/tests/EventListener/ShowReactJsonViewTest.php +++ b/be/tests/EventListener/ShowReactJsonViewTest.php @@ -34,7 +34,7 @@ public function test(): void self::$kernel, new Request(server: ['HTTP_ACCEPT' => 'text/html']), HttpKernelInterface::MAIN_REQUEST, - JsonResponse::fromJsonString(\Safe\json_encode(['test' => 'test'])) + JsonResponse::fromJsonString(\Safe\json_encode(['test' => 'test'])), ); ($this->sut)($event); self::assertEquals(<<<'HTML' diff --git a/be/tests/Repository/Post/PostRepositoryFactoryTest.php b/be/tests/Repository/Post/PostRepositoryFactoryTest.php index b29b68fc..7959348c 100644 --- a/be/tests/Repository/Post/PostRepositoryFactoryTest.php +++ b/be/tests/Repository/Post/PostRepositoryFactoryTest.php @@ -21,7 +21,7 @@ protected function setUp(): void $container = static::getContainer(); $this->sut = $container->get(PostRepositoryFactory::class); } - + #[DataProvider('providePostModelFid')] public function testPostModelFid(int $fid): void { diff --git a/be/tests/bootstrap.php b/be/tests/bootstrap.php index 47a58557..a30ba4dc 100644 --- a/be/tests/bootstrap.php +++ b/be/tests/bootstrap.php @@ -2,10 +2,10 @@ use Symfony\Component\Dotenv\Dotenv; -require dirname(__DIR__).'/vendor/autoload.php'; +require dirname(__DIR__) . '/vendor/autoload.php'; if (method_exists(Dotenv::class, 'bootEnv')) { - (new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); + (new Dotenv())->bootEnv(dirname(__DIR__) . '/.env'); } if ($_SERVER['APP_DEBUG']) { From 4156bf66322cb2ae7f963a4e5465a58fc86cb32d Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 18:57:18 +0000 Subject: [PATCH 57/61] * fix all violations of phpcs rule * excluding rule `PSR12.ControlStructures.ControlStructureSpacing` @ .phpcs.xml $ rm phpcs.xml.dist # should be deleted in 0302713d570b05bc0d2be37fe183eca2cf478cfc * fix phpunit error `Class App\Entity\Post\Post does not have a property named unguarded` @ `App\Tests\PostsQuery\BaseQueryTest->provideNestPostsWithParent()` @ be --- be/.phpcs.xml | 1 + be/phpcs.xml.dist | 19 ------------------- be/src/Controller/PostsController.php | 3 ++- be/src/EventListener/SerializeToJson.php | 4 +++- be/src/PostsQuery/BaseQuery.php | 6 ++++-- be/src/PostsQuery/SearchQuery.php | 9 ++++++++- be/tests/PostsQuery/BaseQueryTest.php | 7 +------ 7 files changed, 19 insertions(+), 30 deletions(-) delete mode 100644 be/phpcs.xml.dist diff --git a/be/.phpcs.xml b/be/.phpcs.xml index 0df55239..9ebf05dd 100644 --- a/be/.phpcs.xml +++ b/be/.phpcs.xml @@ -4,6 +4,7 @@ +
diff --git a/be/phpcs.xml.dist b/be/phpcs.xml.dist deleted file mode 100644 index 89195e2b..00000000 --- a/be/phpcs.xml.dist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - bin/ - config/ - public/ - src/ - tests/ - - diff --git a/be/src/Controller/PostsController.php b/be/src/Controller/PostsController.php index 1c32f3b1..461da3a6 100644 --- a/be/src/Controller/PostsController.php +++ b/be/src/Controller/PostsController.php @@ -50,7 +50,8 @@ public function __construct( public function query(Request $request): array { $this->validator->validate($request->query->all(), new Assert\Collection([ - 'cursor' => new Assert\Optional(new Assert\Regex( // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data + 'cursor' => new Assert\Optional(new Assert\Regex( + // https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data // (,|$)|,){5,6} means allow at most 5~6 parts of base64 segment or empty string to exist '/^(([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{2,3})(,|$)|,){5,6}$/', )), diff --git a/be/src/EventListener/SerializeToJson.php b/be/src/EventListener/SerializeToJson.php index 014615e8..5b600d86 100644 --- a/be/src/EventListener/SerializeToJson.php +++ b/be/src/EventListener/SerializeToJson.php @@ -7,7 +7,9 @@ use Symfony\Component\HttpKernel\Event\ViewEvent; use Symfony\Component\Serializer\SerializerInterface; -#[AsEventListener(priority: -129)] // https://github.com/symfony/twig-bridge/blob/d63fde6a6142ffbab5fe6ee252b668b9485bfc0d/EventListener/TemplateAttributeListener.php#L66 +// phpcs:disable Generic.Files.LineLength +// https://github.com/symfony/twig-bridge/blob/d63fde6a6142ffbab5fe6ee252b668b9485bfc0d/EventListener/TemplateAttributeListener.php#L66 +#[AsEventListener(priority: -129)] readonly class SerializeToJson { public function __construct(private SerializerInterface $serializer) {} diff --git a/be/src/PostsQuery/BaseQuery.php b/be/src/PostsQuery/BaseQuery.php index 2c7ecb19..94872988 100644 --- a/be/src/PostsQuery/BaseQuery.php +++ b/be/src/PostsQuery/BaseQuery.php @@ -210,13 +210,15 @@ static function (string $postIDName) use ($result): array { ->where('t.pid IN (:pids)')->setParameter('pids', $allRepliesId) ->getQuery()->getResult()) ->mapWithKeys(fn(ReplyContent $content) => [$content->getPid() => $content->getContent()]); - $replies->each(fn(Reply $reply) => $reply->setContent($replyContents->get($reply->getPid()))); + $replies->each(fn(Reply $reply) => + $reply->setContent($replyContents->get($reply->getPid()))); $subReplyContents = collect($this->postRepositoryFactory->newSubReplyContent($fid)->createQueryBuilder('t') ->where('t.spid IN (:spids)')->setParameter('spids', $spids) ->getQuery()->getResult()) ->mapWithKeys(fn(SubReplyContent $content) => [$content->getSpid() => $content->getContent()]); - $subReplies->each(fn(SubReply $subReply) => $subReply->setContent($subReplyContents->get($subReply->getSpid()))); + $subReplies->each(fn(SubReply $subReply) => + $subReply->setContent($subReplyContents->get($subReply->getSpid()))); $this->stopwatch->stop('parsePostContentProtoBufBytes'); return [ diff --git a/be/src/PostsQuery/SearchQuery.php b/be/src/PostsQuery/SearchQuery.php index b5734a0b..64fe7520 100644 --- a/be/src/PostsQuery/SearchQuery.php +++ b/be/src/PostsQuery/SearchQuery.php @@ -111,6 +111,7 @@ static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryR 'tid', 'pid', 'spid', 'authorUid', 'authorExpGrade', 'latestReplierUid', 'threadViewCount', 'threadShareCount', 'threadReplyCount', 'replySubReplyCount' => + // phpcs:disable Generic.WhiteSpace.ScopeIndent match ($sub['range']) { 'IN' => $query->andWhere("t.$fieldNameOfNumericParams $not IN (:$sqlParamName)") ->setParameter($sqlParamName, explode(',', $value)), @@ -123,7 +124,13 @@ static function (QueryBuilder $newQueryWhenCacheMiss) use (&$outCachedUserQueryR }, // textMatch 'threadTitle', 'postContent' => - self::applyTextMatchParamOnQuery($query, $name === 'threadTitle' ? 'title' : 'content', $value, $sub, $sqlParamName), + self::applyTextMatchParamOnQuery( + $query, + $name === 'threadTitle' ? 'title' : 'content', + $value, + $sub, + $sqlParamName, + ), // dateTimeRange 'postedAt', 'latestReplyPostedAt' => $whereBetween($name), // array diff --git a/be/tests/PostsQuery/BaseQueryTest.php b/be/tests/PostsQuery/BaseQueryTest.php index 44092cac..4273c574 100644 --- a/be/tests/PostsQuery/BaseQueryTest.php +++ b/be/tests/PostsQuery/BaseQueryTest.php @@ -2,7 +2,6 @@ namespace App\Tests\PostsQuery; -use App\Entity\Post\Post; use App\Entity\Post\Reply; use App\Entity\Post\SubReply; use App\Entity\Post\Thread; @@ -229,8 +228,7 @@ public function testNestPostsWithParent(array $input, array $expected): void public static function provideNestPostsWithParent(): array { - (new \ReflectionClass(Post::class))->setStaticPropertyValue('unguarded', true); - $ret = [[ + return [[ [ 'threads' => [new Thread(['tid' => 1])], 'replies' => [new Reply(['tid' => 1, 'pid' => 2])], @@ -245,8 +243,5 @@ public static function provideNestPostsWithParent(): array ]], ]], ]]; - // https://github.com/sebastianbergmann/phpunit/issues/5103 - (new \ReflectionClass(Post::class))->setStaticPropertyValue('unguarded', false); - return $ret; } } From 4b9914a3e30f7b8436b48b021f28afd6593ff8cb Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 19:54:20 +0000 Subject: [PATCH 58/61] * install php extension `intl` when running on Windows @ .github/actions/be/action.yml --- .github/actions/be/action.yml | 3 ++- .github/workflows/be_base.yml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/actions/be/action.yml b/.github/actions/be/action.yml index a23e65d4..385de8ba 100644 --- a/.github/actions/be/action.yml +++ b/.github/actions/be/action.yml @@ -17,7 +17,8 @@ runs: opcache.enable_cli=1, opcache.memory_consumption=256, opcache.jit=tracing, opcache.jit_buffer_size=64M # https://github.com/shivammathur/setup-php/wiki/Php-extensions-loaded-on-windows-2022/aee619eb6d77e86b17a76d458316b41e58a3b677 - extensions: fileinfo # league/flysystem-local@3.28.0 requires ext-fileinfo but it's not enabled by default on windows + # league/flysystem-local@3.28.0 requires ext-fileinfo but it's not enabled by default on windows + extensions: ${{ runner.os == 'Windows' && 'intl, fileinfo' || '' }} env: update: 'true' # https://github.com/shivammathur/setup-php/blob/2.31.1/README.md#force-update-setup # https://github.com/shivammathur/setup-php/blob/2.31.1/README.md#problem-matchers diff --git a/.github/workflows/be_base.yml b/.github/workflows/be_base.yml index 13fa4943..0d1598ce 100644 --- a/.github/workflows/be_base.yml +++ b/.github/workflows/be_base.yml @@ -58,7 +58,7 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/be - run: > - ./vendor/bin/phpstan analyse --error-format=checkstyle + ./vendor/bin/phpstan analyze --error-format=checkstyle | tee >(cs2pr --notices-as-warnings --graceful-warnings --prepend-filename --prepend-source) shell: bash From 44a63fe89025d526477de98f1797542ae506371f Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 21:36:03 +0000 Subject: [PATCH 59/61] + setter method of each prop for all entities - remove all phpdoc annotation `@noinspection PhpPropertyOnlyWrittenInspection` @ be --- be/src/DTO/User/AuthorExpGrade.php | 2 - be/src/DTO/User/ForumModerator.php | 2 - be/src/Entity/Forum.php | 17 +++- be/src/Entity/LatestReplier.php | 25 +++++- be/src/Entity/Post/Content/PostContent.php | 10 ++- be/src/Entity/Post/Content/ReplyContent.php | 7 +- .../Entity/Post/Content/SubReplyContent.php | 7 +- be/src/Entity/Post/Post.php | 27 ++++++- be/src/Entity/Post/Reply.php | 40 +++++++++- be/src/Entity/Post/SubReply.php | 17 +++- be/src/Entity/Post/Thread.php | 78 ++++++++++++++++++- be/src/Entity/Revision/AuthorExpGrade.php | 27 ++++++- be/src/Entity/Revision/ForumModerator.php | 22 +++++- be/src/Entity/TimestampedEntity.php | 12 ++- be/src/Entity/User.php | 53 ++++++++++++- 15 files changed, 316 insertions(+), 30 deletions(-) diff --git a/be/src/DTO/User/AuthorExpGrade.php b/be/src/DTO/User/AuthorExpGrade.php index 5b7544b7..3d5c4271 100644 --- a/be/src/DTO/User/AuthorExpGrade.php +++ b/be/src/DTO/User/AuthorExpGrade.php @@ -1,7 +1,5 @@ fid; } + public function setFid(int $fid): void + { + $this->fid = $fid; + } + public function getName(): string { return $this->name; } + public function setName(string $name): void + { + $this->name = $name; + } + public function isCrawling(): bool { return $this->isCrawling; } + + public function setIsCrawling(bool $isCrawling): void + { + $this->isCrawling = $isCrawling; + } } diff --git a/be/src/Entity/LatestReplier.php b/be/src/Entity/LatestReplier.php index ab585abd..f36ced95 100644 --- a/be/src/Entity/LatestReplier.php +++ b/be/src/Entity/LatestReplier.php @@ -1,7 +1,5 @@ id; } + public function setId(int $id): void + { + $this->id = $id; + } + public function getUid(): ?int { return $this->uid; } + public function setUid(?int $uid): void + { + $this->uid = $uid; + } + public function getName(): ?string { return $this->name; } + public function setName(?string $name): void + { + $this->name = $name; + } + public function getDisplayName(): ?string { return BlobResourceGetter::resource($this->displayName); } + + /** + * @param resource|null $displayName + */ + public function setDisplayName(null $displayName): void + { + $this->displayName = $displayName; + } } diff --git a/be/src/Entity/Post/Content/PostContent.php b/be/src/Entity/Post/Content/PostContent.php index 180f2cc1..e614325e 100644 --- a/be/src/Entity/Post/Content/PostContent.php +++ b/be/src/Entity/Post/Content/PostContent.php @@ -1,7 +1,5 @@ protoBufBytes, PostContentWrapper::class); } + + /** + * @param resource|null $protoBufBytes + */ + public function setProtoBufBytes(null $protoBufBytes): void + { + $this->protoBufBytes = $protoBufBytes; + } } diff --git a/be/src/Entity/Post/Content/ReplyContent.php b/be/src/Entity/Post/Content/ReplyContent.php index 7a1d9d84..ac87bfac 100644 --- a/be/src/Entity/Post/Content/ReplyContent.php +++ b/be/src/Entity/Post/Content/ReplyContent.php @@ -1,7 +1,5 @@ pid; } + + public function setPid(int $pid): void + { + $this->pid = $pid; + } } diff --git a/be/src/Entity/Post/Content/SubReplyContent.php b/be/src/Entity/Post/Content/SubReplyContent.php index b6420721..29e123b6 100644 --- a/be/src/Entity/Post/Content/SubReplyContent.php +++ b/be/src/Entity/Post/Content/SubReplyContent.php @@ -1,7 +1,5 @@ spid; } + + public function setSpid(int $spid): void + { + $this->spid = $spid; + } } diff --git a/be/src/Entity/Post/Post.php b/be/src/Entity/Post/Post.php index aa127e5c..907c5c30 100644 --- a/be/src/Entity/Post/Post.php +++ b/be/src/Entity/Post/Post.php @@ -1,7 +1,5 @@ authorUid; } + public function setAuthorUid(int $authorUid): void + { + $this->authorUid = $authorUid; + } + public function getPostedAt(): int { return $this->postedAt; } + public function setPostedAt(int $postedAt): void + { + $this->postedAt = $postedAt; + } + public function getLastSeenAt(): ?int { return $this->lastSeenAt; } + public function setLastSeenAt(?int $lastSeenAt): void + { + $this->lastSeenAt = $lastSeenAt; + } + public function getAgreeCount(): int { return $this->agreeCount ?? 0; } + public function setAgreeCount(?int $agreeCount): void + { + $this->agreeCount = $agreeCount; + } + public function getDisagreeCount(): int { return $this->disagreeCount ?? 0; } + public function setDisagreeCount(?int $disagreeCount): void + { + $this->disagreeCount = $disagreeCount; + } + public function getIsMatchQuery(): bool { return $this->isMatchQuery; diff --git a/be/src/Entity/Post/Reply.php b/be/src/Entity/Post/Reply.php index 8b91c6e0..5bf1d98e 100644 --- a/be/src/Entity/Post/Reply.php +++ b/be/src/Entity/Post/Reply.php @@ -1,7 +1,5 @@ tid; } + public function setTid(int $tid): void + { + $this->tid = $tid; + } + public function getPid(): int { return $this->pid; } + public function setPid(int $pid): void + { + $this->pid = $pid; + } + public function getFloor(): int { return $this->floor; } + public function setFloor(int $floor): void + { + $this->floor = $floor; + } + public function getSubReplyCount(): int { return $this->subReplyCount ?? 0; } + public function setSubReplyCount(?int $subReplyCount): void + { + $this->subReplyCount = $subReplyCount; + } + public function getIsFold(): ?int { return $this->isFold; } + public function setIsFold(?int $isFold): void + { + $this->isFold = $isFold; + } + public function getGeolocation(): ?array { return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } + /** + * @param resource|null $geolocation + */ + public function setGeolocation(null $geolocation): void + { + $this->geolocation = $geolocation; + } + public function getSignatureId(): ?int { return $this->signatureId; } + + public function setSignatureId(?int $signatureId): void + { + $this->signatureId = $signatureId; + } } diff --git a/be/src/Entity/Post/SubReply.php b/be/src/Entity/Post/SubReply.php index d52921d9..a28664a3 100644 --- a/be/src/Entity/Post/SubReply.php +++ b/be/src/Entity/Post/SubReply.php @@ -1,7 +1,5 @@ tid; } + public function setTid(int $tid): void + { + $this->tid = $tid; + } + public function getPid(): int { return $this->pid; } + public function setPid(int $pid): void + { + $this->pid = $pid; + } + public function getSpid(): int { return $this->spid; } + public function setSpid(int $spid): void + { + $this->spid = $spid; + } + #[Ignore] public function getIsMatchQuery(): bool { diff --git a/be/src/Entity/Post/Thread.php b/be/src/Entity/Post/Thread.php index 3054dffd..de00926b 100644 --- a/be/src/Entity/Post/Thread.php +++ b/be/src/Entity/Post/Thread.php @@ -1,7 +1,5 @@ tid; } + public function setTid(int $tid): void + { + $this->tid = $tid; + } + public function getThreadType(): int { return $this->threadType; } + public function setThreadType(int $threadType): void + { + $this->threadType = $threadType; + } + public function getStickyType(): ?string { return $this->stickyType; } + public function setStickyType(?string $stickyType): void + { + $this->stickyType = $stickyType; + } + public function getTopicType(): ?string { return $this->topicType; } + public function setTopicType(?string $topicType): void + { + $this->topicType = $topicType; + } + public function getIsGood(): ?int { return $this->isGood; } + public function setIsGood(?int $isGood): void + { + $this->isGood = $isGood; + } + public function getTitle(): string { return $this->title; } + public function setTitle(string $title): void + { + $this->title = $title; + } + public function getLatestReplyPostedAt(): int { return $this->latestReplyPostedAt; } + public function setLatestReplyPostedAt(int $latestReplyPostedAt): void + { + $this->latestReplyPostedAt = $latestReplyPostedAt; + } + public function getLatestReplierId(): ?int { return $this->latestReplierId; } + public function setLatestReplierId(?int $latestReplierId): void + { + $this->latestReplierId = $latestReplierId; + } + public function getReplyCount(): int { return $this->replyCount ?? 0; } + public function setReplyCount(?int $replyCount): void + { + $this->replyCount = $replyCount; + } + public function getViewCount(): int { return $this->viewCount ?? 0; } + public function setViewCount(?int $viewCount): void + { + $this->viewCount = $viewCount; + } + public function getShareCount(): int { return $this->shareCount ?? 0; } + public function setShareCount(?int $shareCount): void + { + $this->shareCount = $shareCount; + } + public function getZan(): ?array { return BlobResourceGetter::protoBuf($this->zan, Zan::class); } + /** + * @param resource|null $zan + */ + public function setZan(null $zan): void + { + $this->zan = $zan; + } + public function getGeolocation(): ?array { return BlobResourceGetter::protoBuf($this->geolocation, Lbs::class); } + /** + * @param resource|null $geolocation + */ + public function setGeolocation(null $geolocation): void + { + $this->geolocation = $geolocation; + } + public function getAuthorPhoneType(): ?string { return $this->authorPhoneType; } + + public function setAuthorPhoneType(?string $authorPhoneType): void + { + $this->authorPhoneType = $authorPhoneType; + } } diff --git a/be/src/Entity/Revision/AuthorExpGrade.php b/be/src/Entity/Revision/AuthorExpGrade.php index a2a773ef..940da32a 100644 --- a/be/src/Entity/Revision/AuthorExpGrade.php +++ b/be/src/Entity/Revision/AuthorExpGrade.php @@ -1,7 +1,5 @@ discoveredAt; } + public function setDiscoveredAt(int $discoveredAt): void + { + $this->discoveredAt = $discoveredAt; + } + public function getFid(): int { return $this->fid; } + public function setFid(int $fid): void + { + $this->fid = $fid; + } + public function getUid(): int { return $this->uid; } + public function setUid(int $uid): void + { + $this->uid = $uid; + } + public function getTriggeredBy(): string { return $this->triggeredBy; } + public function setTriggeredBy(string $triggeredBy): void + { + $this->triggeredBy = $triggeredBy; + } + public function getAuthorExpGrade(): int { return $this->authorExpGrade; } + + public function setAuthorExpGrade(int $authorExpGrade): void + { + $this->authorExpGrade = $authorExpGrade; + } } diff --git a/be/src/Entity/Revision/ForumModerator.php b/be/src/Entity/Revision/ForumModerator.php index fbf91b43..2cc4ebfd 100644 --- a/be/src/Entity/Revision/ForumModerator.php +++ b/be/src/Entity/Revision/ForumModerator.php @@ -1,7 +1,5 @@ discoveredAt; } + public function setDiscoveredAt(int $discoveredAt): void + { + $this->discoveredAt = $discoveredAt; + } + public function getFid(): int { return $this->fid; } + public function setFid(int $fid): void + { + $this->fid = $fid; + } + public function getPortrait(): string { return $this->portrait; } + public function setPortrait(string $portrait): void + { + $this->portrait = $portrait; + } + public function getModeratorTypes(): string { return $this->moderatorTypes; } + + public function setModeratorTypes(string $moderatorTypes): void + { + $this->moderatorTypes = $moderatorTypes; + } } diff --git a/be/src/Entity/TimestampedEntity.php b/be/src/Entity/TimestampedEntity.php index 81556511..1d27305f 100644 --- a/be/src/Entity/TimestampedEntity.php +++ b/be/src/Entity/TimestampedEntity.php @@ -1,7 +1,5 @@ createdAt; } + public function setCreatedAt(int $createdAt): void + { + $this->createdAt = $createdAt; + } + public function getUpdatedAt(): ?int { return $this->updatedAt; } + + public function setUpdatedAt(?int $updatedAt): void + { + $this->updatedAt = $updatedAt; + } } diff --git a/be/src/Entity/User.php b/be/src/Entity/User.php index f2130160..ca1e6a82 100644 --- a/be/src/Entity/User.php +++ b/be/src/Entity/User.php @@ -1,7 +1,5 @@ uid; } + public function setUid(int $uid): void + { + $this->uid = $uid; + } + public function getName(): ?string { return $this->name; } + public function setName(?string $name): void + { + $this->name = $name; + } + public function getDisplayName(): ?string { return BlobResourceGetter::resource($this->displayName); } + /** + * @param resource|null $displayName + */ + public function setDisplayName(null $displayName): void + { + $this->displayName = $displayName; + } + public function getPortrait(): string { return $this->portrait; } + public function setPortrait(string $portrait): void + { + $this->portrait = $portrait; + } + public function getPortraitUpdatedAt(): ?int { return $this->portraitUpdatedAt; } + public function setPortraitUpdatedAt(?int $portraitUpdatedAt): void + { + $this->portraitUpdatedAt = $portraitUpdatedAt; + } + public function getGender(): ?int { return $this->gender; } + public function setGender(?int $gender): void + { + $this->gender = $gender; + } + public function getFansNickname(): ?string { return $this->fansNickname; } + public function setFansNickname(?string $fansNickname): void + { + $this->fansNickname = $fansNickname; + } + public function getIcon(): ?array { return BlobResourceGetter::protoBufWrapper($this->icon, UserIconWrapper::class); } + /** + * @param resource|null $icon + */ + public function setIcon(null $icon): void + { + $this->icon = $icon; + } + public function getIpGeolocation(): ?string { return $this->ipGeolocation; } + public function setIpGeolocation(?string $ipGeolocation): void + { + $this->ipGeolocation = $ipGeolocation; + } + public function getCurrentForumModerator(): ?ForumModerator { return $this->currentForumModerator; From ac19173a720c1bc20646dd5ddbc6101f3b1b3be0 Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 21:36:23 +0000 Subject: [PATCH 60/61] $ composer require symfony/property-access # partial revert feccb70b30136af0464f5bf179966da89372c168 @ be --- be/composer.json | 1 + be/composer.lock | 244 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 244 insertions(+), 1 deletion(-) diff --git a/be/composer.json b/be/composer.json index 38666f53..7c76d07f 100644 --- a/be/composer.json +++ b/be/composer.json @@ -19,6 +19,7 @@ "symfony/dotenv": "^7.1.5", "symfony/flex": "^2.4.6", "symfony/framework-bundle": "^7.1.5", + "symfony/property-access": "7.1.*", "symfony/runtime": "^7.1.1", "symfony/serializer": "^7.1.5", "symfony/stopwatch": "7.1.*", diff --git a/be/composer.lock b/be/composer.lock index 26d82c14..8bf42e83 100644 --- a/be/composer.lock +++ b/be/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": "7bd0c37ead23d109b01b471c0691e248", + "content-hash": "832648ee1e08d385de4cfacb5fa71332", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -3540,6 +3540,166 @@ ], "time": "2024-09-21T06:09:21+00:00" }, + { + "name": "symfony/property-access", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "6c709f97103355016e5782d0622437ae381012ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/6c709f97103355016e5782d0622437ae381012ad", + "reference": "6c709f97103355016e5782d0622437ae381012ad", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" + }, + "require-dev": { + "symfony/cache": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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 functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v7.1.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-08-30T16:12:47+00:00" + }, + { + "name": "symfony/property-info", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", + "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "^7.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "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": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v7.1.3" + }, + "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-07-26T07:36:36+00:00" + }, { "name": "symfony/routing", "version": "v7.1.4", @@ -4396,6 +4556,88 @@ ], "time": "2024-09-08T12:32:26+00:00" }, + { + "name": "symfony/type-info", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/9f6094aa900d2c06bd61576a6f279d4ac441515f", + "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-info": "<6.4" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.1.5" + }, + "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-19T21:48:23+00:00" + }, { "name": "symfony/validator", "version": "v7.1.5", From 950be347e89e1e9bedc862a3b32b3daaaf01e7a0 Mon Sep 17 00:00:00 2001 From: n0099 Date: Wed, 9 Oct 2024 21:40:17 +0000 Subject: [PATCH 61/61] * fix passing empty entities by denormalize the array with props value into entity objects via their prop setter and filter out default values @ `(test|provide)NestPostsWithParent()` + dependency `DenormalizerInterface` for `testNestPostsWithParent()` @ `App\Tests\PostsQuery\BaseQueryTest` @ be --- be/tests/PostsQuery/BaseQueryTest.php | 36 +++++++++++++++++++++------ 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/be/tests/PostsQuery/BaseQueryTest.php b/be/tests/PostsQuery/BaseQueryTest.php index 4273c574..2c691db7 100644 --- a/be/tests/PostsQuery/BaseQueryTest.php +++ b/be/tests/PostsQuery/BaseQueryTest.php @@ -2,19 +2,20 @@ namespace App\Tests\PostsQuery; -use App\Entity\Post\Reply; -use App\Entity\Post\SubReply; -use App\Entity\Post\Thread; +use App\Helper; use App\PostsQuery\BaseQuery; use App\PostsQuery\IndexQuery; +use Illuminate\Support\Collection; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; #[CoversClass(BaseQuery::class)] class BaseQueryTest extends KernelTestCase { private BaseQuery $sut; + private DenormalizerInterface $denormalizer; protected function setUp(): void { @@ -23,6 +24,7 @@ protected function setUp(): void $container = self::getContainer(); $this->sut = $container->get(IndexQuery::class); (new \ReflectionProperty(BaseQuery::class, 'orderByField'))->setValue($this->sut, 'postedAt'); + $this->denormalizer = $container->get(DenormalizerInterface::class); } public function testPerPageItemsDefaultValue(): void @@ -220,9 +222,29 @@ public static function provideReOrderNestedPostsData(): array #[DataProvider('provideNestPostsWithParent')] public function testNestPostsWithParent(array $input, array $expected): void { + $input = collect($input)->mapWithKeys(function (array $posts, string $postTypePluralName) { + $postClass = 'App\Entity\Post\\' . ucfirst(Helper::POST_TYPE_PLURAL_TO_SINGULAR[$postTypePluralName]); + return [ + $postTypePluralName => array_map( + fn(array $post) => $this->denormalizer->denormalize($post, $postClass), + $posts, + ), + ]; + })->all(); self::assertEquals( collect($expected)->recursive(), - $this->sut->nestPostsWithParent(...array_map('collect', $input)), + $this->sut->nestPostsWithParent(...array_map('collect', $input)) + ->map(function (Collection $thread) { + /** @var Collection $replies */ + $replies = $thread['replies']; + $replies->transform(function (Collection $reply) { + /** @var Collection $subReplies */ + $subReplies = $reply['subReplies']; + $subReplies->transform(fn(Collection $subReply) => $subReply->filter()); + return $reply->filter(); + }); + return $thread->filter(); // remove normalized entity props with default value + }), ); } @@ -230,9 +252,9 @@ public static function provideNestPostsWithParent(): array { return [[ [ - 'threads' => [new Thread(['tid' => 1])], - 'replies' => [new Reply(['tid' => 1, 'pid' => 2])], - 'subReplies' => [new SubReply(['tid' => 1, 'pid' => 2, 'spid' => 3])], + 'threads' => [['tid' => 1]], + 'replies' => [['tid' => 1, 'pid' => 2]], + 'subReplies' => [['tid' => 1, 'pid' => 2, 'spid' => 3]], ], [[ 'tid' => 1,