From 4eec7ee83785cde5831817f9322553baffd47729 Mon Sep 17 00:00:00 2001 From: Andrew Gardener Date: Wed, 4 Dec 2024 10:14:25 -0800 Subject: [PATCH] Add meilisearch Replacement for ElasticSearch --- .env | 15 +- .github/workflows/main.yml | 25 +- Makefile | 8 +- README.md | 7 +- composer.json | 7 +- composer.lock | 3017 +++++++++-------- config/bundles.php | 2 +- config/packages/fos_elastica.yaml | 156 - config/packages/http_discovery.yaml | 10 + config/packages/meilisearch.yaml | 67 + config/services.yaml | 17 - docker-compose.yaml | 16 +- src/Controller/.gitignore | 0 src/Controller/AliasController.php | 49 +- src/Controller/DefaultController.php | 268 +- src/Controller/PersonController.php | 81 +- src/Controller/PlaceController.php | 113 +- src/Controller/PublisherController.php | 62 +- src/Entity/.gitignore | 0 src/Entity/Alias.php | 20 +- src/Entity/Book.php | 8 + src/Entity/Compilation.php | 8 + src/Entity/HasHighlights.php | 25 - src/Entity/Periodical.php | 10 + src/Entity/Person.php | 26 +- src/Entity/Place.php | 25 +- src/Entity/Publication.php | 29 +- src/Entity/Publisher.php | 18 +- src/Repository/.gitignore | 0 src/Services/ElasticSearchHelper.php | 166 - .../ElasticaToModelTransformerCollection.php | 73 - src/Services/MeilisearchHelper.php | 194 ++ src/Services/MultiIndex.php | 51 - symfony.lock | 39 +- templates/alias/search.html.twig | 5 +- templates/book/index.html.twig | 2 +- templates/compilation/index.html.twig | 2 +- templates/default/search.html.twig | 10 +- templates/default/search_title.html.twig | 17 +- templates/misc/search-footer.html.twig | 5 - templates/misc/search-form.html.twig | 20 - templates/misc/search-header.html.twig | 13 - templates/periodical/index.html.twig | 2 +- templates/person/search.html.twig | 8 +- templates/place/search.html.twig | 8 +- templates/place/show.html.twig | 10 +- templates/publisher/search.html.twig | 6 +- templates/search/partial/filter.html.twig | 17 +- templates/search/partial/list.html.twig | 35 - templates/search/partial/order.html.twig | 6 +- .../search/partial/range_filter.html.twig | 6 +- .../search/partial/result_alias.html.twig | 14 + .../search/partial/result_book.html.twig | 27 + .../partial/result_compilation.html.twig | 27 + .../partial/result_periodical.html.twig | 33 + .../search/partial/result_person.html.twig | 25 + .../search/partial/result_place.html.twig | 15 + .../search/partial/result_publisher.html.twig | 11 + templates/search/partial/results.html.twig | 31 + 59 files changed, 2601 insertions(+), 2366 deletions(-) delete mode 100644 config/packages/fos_elastica.yaml create mode 100644 config/packages/http_discovery.yaml create mode 100644 config/packages/meilisearch.yaml delete mode 100644 src/Controller/.gitignore delete mode 100644 src/Entity/.gitignore delete mode 100644 src/Entity/HasHighlights.php delete mode 100644 src/Repository/.gitignore delete mode 100644 src/Services/ElasticSearchHelper.php delete mode 100644 src/Services/ElasticaToModelTransformerCollection.php create mode 100644 src/Services/MeilisearchHelper.php delete mode 100644 src/Services/MultiIndex.php delete mode 100644 templates/misc/search-footer.html.twig delete mode 100644 templates/misc/search-form.html.twig delete mode 100644 templates/misc/search-header.html.twig delete mode 100644 templates/search/partial/list.html.twig create mode 100644 templates/search/partial/result_alias.html.twig create mode 100644 templates/search/partial/result_book.html.twig create mode 100644 templates/search/partial/result_compilation.html.twig create mode 100644 templates/search/partial/result_periodical.html.twig create mode 100644 templates/search/partial/result_person.html.twig create mode 100644 templates/search/partial/result_place.html.twig create mode 100644 templates/search/partial/result_publisher.html.twig create mode 100644 templates/search/partial/results.html.twig diff --git a/.env b/.env index 2294418e..15f69c75 100755 --- a/.env +++ b/.env @@ -41,12 +41,6 @@ ROUTE_HOST=localhost ROUTE_BASE= TRUSTED_PROXIES=127.0.0.1 -# Elasticsearch -ELASTICSEARCH_HOST=elasticsearch -ELASTICSEARCH_PORT=9200 -ELASTICSEARCH_USERNAME=elastic -ELASTICSEARCH_PASSWORD=password - # Feedback notifications FEEDBACK_RECIPIENTS='[]' @@ -57,4 +51,11 @@ EWZ_RECAPTCHA_ENABLED=false ###> excelwebzone/recaptcha-bundle ### EWZ_RECAPTCHA_SITE_KEY= EWZ_RECAPTCHA_SECRET= -###< excelwebzone/recaptcha-bundle ### \ No newline at end of file +###< excelwebzone/recaptcha-bundle ### + +###> meilisearch/search-bundle ### +# Uncomment the following line if you use Meilisearch through Docker +MEILISEARCH_URL=http://meilisearch:7700 +MEILISEARCH_API_KEY="password" +MEILISEARCH_PREFIX=app_doceww_ +###< meilisearch/search-bundle ### diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ab4a7511..c1393602 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -79,30 +79,29 @@ jobs: mysql user: ${{ env.DB_USER }} mysql password: ${{ env.DB_PASSWORD }} - - name: Runs Elasticsearch - uses: getong/elasticsearch-action@v1.2 - with: - elasticsearch version: '8.9.2' - host port: 9200 - container port: 9200 - host node port: 9300 - node port: 9300 - discovery type: 'single-node' + - name: Run Meilisearch + run: | + docker run -d \ + -p 7700:7700 \ + -e MEILI_MASTER_KEY='password' \ + getmeili/meilisearch:v1.11.3 - name: Run Unit Tests run: | touch .env.test.local echo DATABASE_URL="mysql://${{ env.DB_USER }}:${{ env.DB_PASSWORD }}@127.0.0.1:3306/${{ env.DB_NAME }}?serverVersion=mariadb-10.11.0" >> .env.test.local - echo ELASTICSEARCH_HOST="127.0.0.1" >> .env.test.local - echo ELASTICSEARCH_PORT="9200" >> .env.test.local - echo ELASTICSEARCH_USERNAME="elastic" >> .env.test.local - echo ELASTICSEARCH_PASSWORD="" >> .env.test.local + echo MEILISEARCH_URL="http://127.0.0.1:7700" >> .env.test.local + echo MEILISEARCH_API_KEY="password" >> .env.test.local docker run --rm \ -v "${GITHUB_WORKSPACE}/.env.test.local":/var/www/html/.env.test.local \ --network host \ --platform=${{ matrix.platform }} \ ${{ env.REGISTRY_IMAGE }}@${{ steps.build.outputs.digest }} make test + - name: Stop Meilisearch + run: | + docker rm $(docker stop $(docker ps -a -q --filter ancestor=getmeili/meilisearch:v1.11.3 --format="{{.ID}}")) + - name: Export digest run: | mkdir -p /tmp/digests diff --git a/Makefile b/Makefile index f589aa58..c4384d71 100644 --- a/Makefile +++ b/Makefile @@ -27,12 +27,16 @@ test.reset: ## Create a test database and load the fixtures in it $(CONSOLE) --env=test doctrine:schema:validate --quiet $(CONSOLE) --env=test doctrine:cache:clear-metadata --quiet $(CONSOLE) --env=test doctrine:fixtures:load --quiet --no-interaction --group=dev - $(CONSOLE) --env=test fos:elastica:populate --quiet --no-debug + $(CONSOLE) --env=test meili:delete --quiet --no-debug + $(CONSOLE) --env=test meili:import --quiet --no-debug + +test.clean: ## Clean Meilisearch + $(CONSOLE) --env=test meili:delete --quiet --no-debug test.run: ## Directly run tests. Use optional path=/path/to/tests to limit target $(PHPUNIT) $(path) -test: test.reset test.run ## Run all tests. Use optional path=/path/to/tests to limit target +test: test.reset test.run test.clean ## Run all tests. Use optional path=/path/to/tests to limit target test.cover: test.reset ## Generate a test cover report $(PHP) -dpcov.enabled=1 -dpcov.directory=. -dpcov.exclude="~vendor~" $(PHPUNIT) $(path) --coverage-html=coverage diff --git a/README.md b/README.md index 12659e58..e271c8e3 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Next you must start the whole application docker compose up -d --build - docker exec -it doceww_app ./bin/console fos:elastica:populate --no-debug + docker exec -it doceww_app ./bin/console meili:import --no-debug doceww will now be available at `http://localhost:8080/` @@ -52,9 +52,10 @@ example: docker compose up -d --build -### Rebuilding the elasticsearch logs +### Rebuilding the meilisearch indexes - docker exec -it doceww_app ./bin/console fos:elastica:populate --no-debug + docker exec -it doceww_app ./bin/console meili:delete --no-debug + docker exec -it doceww_app ./bin/console meili:import --no-debug ### Viewing logs (each container) diff --git a/composer.json b/composer.json index e42aec85..8f9d372f 100644 --- a/composer.json +++ b/composer.json @@ -16,12 +16,14 @@ "doctrine/doctrine-bundle": "^2.10", "doctrine/doctrine-migrations-bundle": "^3.2", "doctrine/orm": "^2.15", - "friendsofsymfony/elastica-bundle": "^6.3", "guzzlehttp/guzzle": "^7.7", "knplabs/knp-menu-bundle": "^3.2", "knplabs/knp-paginator-bundle": "^6.2", + "meilisearch/search-bundle": "^0.15.6", "ninsuo/symfony-collection": "^2.1", + "nyholm/psr7": "^1.8", "phpdocumentor/reflection-docblock": "^5.3", + "phpstan/phpdoc-parser": "^1.33", "sensio/framework-extra-bundle": "^6.2", "sfu-dhil/nines": "6.3.16", "symfony/asset": "6.3.*", @@ -82,7 +84,8 @@ "sort-packages": true, "allow-plugins": { "symfony/flex": true, - "symfony/runtime": true + "symfony/runtime": true, + "php-http/discovery": true } }, "autoload": { diff --git a/composer.lock b/composer.lock index 71de9ab6..0220584a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "77674c9e66499b2c2994d3e905d28141", + "content-hash": "a73d9d013a094c5b6d9b264ad23baee3", "packages": [ { "name": "aternus/geonames-client", - "version": "2.3.1", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/Aternus/geonames-client.git", - "reference": "0d996ee5670b1df091da52df3e001dd37d90908b" + "reference": "fe26322803caf853053b2a8576a00ee249fc31e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Aternus/geonames-client/zipball/0d996ee5670b1df091da52df3e001dd37d90908b", - "reference": "0d996ee5670b1df091da52df3e001dd37d90908b", + "url": "https://api.github.com/repos/Aternus/geonames-client/zipball/fe26322803caf853053b2a8576a00ee249fc31e6", + "reference": "fe26322803caf853053b2a8576a00ee249fc31e6", "shasum": "" }, "require": { @@ -30,6 +30,7 @@ "require-dev": { "ext-xdebug": "*", "phpunit/phpunit": "8.*", + "slevomat/coding-standard": "^8.15", "squizlabs/php_codesniffer": "3.*" }, "type": "library", @@ -65,7 +66,7 @@ "issues": "https://github.com/Aternus/geonames-client/issues", "source": "https://github.com/Aternus/geonames-client" }, - "time": "2024-01-03T00:01:26+00:00" + "time": "2024-06-09T21:04:39+00:00" }, { "name": "beberlei/doctrineextensions", @@ -131,16 +132,16 @@ }, { "name": "doctrine/annotations", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", "shasum": "" }, "require": { @@ -152,10 +153,10 @@ "require-dev": { "doctrine/cache": "^2.0", "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.0", + "phpstan/phpstan": "^1.10.28", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" }, "suggest": { "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" @@ -201,9 +202,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.1" + "source": "https://github.com/doctrine/annotations/tree/2.0.2" }, - "time": "2023-02-02T22:02:53+00:00" + "time": "2024-09-05T10:17:24+00:00" }, { "name": "doctrine/cache", @@ -300,16 +301,16 @@ }, { "name": "doctrine/collections", - "version": "2.2.1", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813" + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/420480fc085bc65f3c956af13abe8e7546f94813", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { @@ -366,7 +367,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.2.1" + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -382,20 +383,20 @@ "type": "tidelift" } ], - "time": "2024-03-05T22:28:45+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { "name": "doctrine/common", - "version": "3.4.3", + "version": "3.4.5", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "url": "https://api.github.com/repos/doctrine/common/zipball/6c8fef961f67b8bc802ce3e32e3ebd1022907286", + "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286", "shasum": "" }, "require": { @@ -457,7 +458,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.4.3" + "source": "https://github.com/doctrine/common/tree/3.4.5" }, "funding": [ { @@ -473,20 +474,20 @@ "type": "tidelift" } ], - "time": "2022-10-09T11:47:59+00:00" + "time": "2024-10-08T15:53:43+00:00" }, { "name": "doctrine/dbal", - "version": "3.8.3", + "version": "3.9.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c" + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/db922ba9436b7b18a23d1653a0b41ff2369ca41c", - "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", "shasum": "" }, "require": { @@ -502,12 +503,12 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.58", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.16", + "phpstan/phpstan": "1.12.6", + "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.9.0", + "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" @@ -570,7 +571,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.3" + "source": "https://github.com/doctrine/dbal/tree/3.9.3" }, "funding": [ { @@ -586,7 +587,7 @@ "type": "tidelift" } ], - "time": "2024-03-03T15:55:06+00:00" + "time": "2024-10-10T17:56:43+00:00" }, { "name": "doctrine/deprecations", @@ -637,16 +638,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.12.0", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "5418e811a14724068e95e0ba43353b903ada530f" + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5418e811a14724068e95e0ba43353b903ada530f", - "reference": "5418e811a14724068e95e0ba43353b903ada530f", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", "shasum": "" }, "require": { @@ -737,7 +738,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.12.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.0" }, "funding": [ { @@ -753,20 +754,20 @@ "type": "tidelift" } ], - "time": "2024-03-19T07:20:37+00:00" + "time": "2024-09-01T09:46:40+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835" + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/1dd42906a5fb9c5960723e2ebb45c68006493835", - "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", "shasum": "" }, "require": { @@ -777,6 +778,7 @@ "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 ", @@ -828,7 +830,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.0" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" }, "funding": [ { @@ -844,20 +846,20 @@ "type": "tidelift" } ], - "time": "2023-11-13T19:44:41+00:00" + "time": "2024-05-14T20:32:18+00:00" }, { "name": "doctrine/event-manager", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", "shasum": "" }, "require": { @@ -867,10 +869,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^10", + "doctrine/coding-standard": "^12", "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.28" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "type": "library", "autoload": { @@ -919,7 +921,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" }, "funding": [ { @@ -935,7 +937,7 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:59:15+00:00" + "time": "2024-05-22T20:47:39+00:00" }, { "name": "doctrine/inflector", @@ -1177,21 +1179,21 @@ }, { "name": "doctrine/migrations", - "version": "3.7.4", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "954e0a314c2f0eb9fb418210445111747de254a6" + "reference": "5007eb1168691225ac305fe16856755c20860842" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/954e0a314c2f0eb9fb418210445111747de254a6", - "reference": "954e0a314c2f0eb9fb418210445111747de254a6", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/5007eb1168691225ac305fe16856755c20860842", + "reference": "5007eb1168691225ac305fe16856755c20860842", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/dbal": "^3.5.1 || ^4", + "doctrine/dbal": "^3.6 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2.0", "php": "^8.1", @@ -1209,6 +1211,7 @@ "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", @@ -1229,7 +1232,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + "Doctrine\\Migrations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1259,7 +1262,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.7.4" + "source": "https://github.com/doctrine/migrations/tree/3.8.2" }, "funding": [ { @@ -1275,20 +1278,20 @@ "type": "tidelift" } ], - "time": "2024-03-06T13:41:11+00:00" + "time": "2024-10-10T21:35:27+00:00" }, { "name": "doctrine/orm", - "version": "2.19.3", + "version": "2.20.0", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "1a5a4c674a416b4fdf76833c627c5e7f58bbb890" + "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/1a5a4c674a416b4fdf76833c627c5e7f58bbb890", - "reference": "1a5a4c674a416b4fdf76833c627c5e7f58bbb890", + "url": "https://api.github.com/repos/doctrine/orm/zipball/8ed6c2234aba019f9737a6bcc9516438e62da27c", + "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c", "shasum": "" }, "require": { @@ -1317,14 +1320,16 @@ "doctrine/annotations": "^1.13 || ^2", "doctrine/coding-standard": "^9.0.2 || ^12.0", "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/phpstan": "~1.4.10 || 1.10.59", + "phpstan/extension-installer": "~1.1.0 || ^1.4", + "phpstan/phpstan": "~1.4.10 || 1.12.6", + "phpstan/phpstan-deprecation-rules": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psr/log": "^1 || ^2 || ^3", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "vimeo/psalm": "4.30.0 || 5.22.2" + "vimeo/psalm": "4.30.0 || 5.24.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", @@ -1374,22 +1379,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.19.3" + "source": "https://github.com/doctrine/orm/tree/2.20.0" }, - "time": "2024-03-21T11:01:42+00:00" + "time": "2024-10-11T11:47:24+00:00" }, { "name": "doctrine/persistence", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "477da35bd0255e032826f440b94b3e37f2d56f42" + "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/477da35bd0255e032826f440b94b3e37f2d56f42", - "reference": "477da35bd0255e032826f440b94b3e37f2d56f42", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/0ea965320cec355dba75031c1b23d4c78362e3ff", + "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff", "shasum": "" }, "require": { @@ -1401,15 +1406,13 @@ "doctrine/common": "<2.10" }, "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^11", + "doctrine/coding-standard": "^12", "doctrine/common": "^3.0", - "phpstan/phpstan": "1.9.4", + "phpstan/phpstan": "1.12.7", "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.3.0" + "phpunit/phpunit": "^8.5.38 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -1458,7 +1461,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.3.2" + "source": "https://github.com/doctrine/persistence/tree/3.4.0" }, "funding": [ { @@ -1474,27 +1477,31 @@ "type": "tidelift" } ], - "time": "2024-03-12T14:54:36+00:00" + "time": "2024-10-30T19:48:12+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.2.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "a321d114e0a18e6497f8a2cd6f890e000cc17ecc" + "reference": "b784cbde727cf806721451dde40eff4fec3bbe86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a321d114e0a18e6497f8a2cd6f890e000cc17ecc", - "reference": "a321d114e0a18e6497f8a2cd6f890e000cc17ecc", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/b784cbde727cf806721451dde40eff4fec3bbe86", + "reference": "b784cbde727cf806721451dde40eff4fec3bbe86", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4" + "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" @@ -1524,9 +1531,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.2.0" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.1" }, - "time": "2023-08-16T21:49:04+00:00" + "time": "2024-10-21T18:21:57+00:00" }, { "name": "egulias/email-validator", @@ -1595,73 +1602,6 @@ ], "time": "2023-10-06T06:47:41+00:00" }, - { - "name": "elasticsearch/elasticsearch", - "version": "v7.17.2", - "source": { - "type": "git", - "url": "https://github.com/elastic/elasticsearch-php.git", - "reference": "2d302233f2bb0926812d82823bb820d405e130fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/2d302233f2bb0926812d82823bb820d405e130fc", - "reference": "2d302233f2bb0926812d82823bb820d405e130fc", - "shasum": "" - }, - "require": { - "ext-json": ">=1.3.7", - "ezimuel/ringphp": "^1.1.2", - "php": "^7.3 || ^8.0", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "ext-yaml": "*", - "ext-zip": "*", - "mockery/mockery": "^1.2", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.3", - "squizlabs/php_codesniffer": "^3.4", - "symfony/finder": "~4.0" - }, - "suggest": { - "ext-curl": "*", - "monolog/monolog": "Allows for client-level logging and tracing" - }, - "type": "library", - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Elasticsearch\\": "src/Elasticsearch/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0", - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Zachary Tong" - }, - { - "name": "Enrico Zimuel" - } - ], - "description": "PHP Client for Elasticsearch", - "keywords": [ - "client", - "elasticsearch", - "search" - ], - "support": { - "issues": "https://github.com/elastic/elasticsearch-php/issues", - "source": "https://github.com/elastic/elasticsearch-php/tree/v7.17.2" - }, - "time": "2023-04-21T15:31:12+00:00" - }, { "name": "excelwebzone/recaptcha-bundle", "version": "v1.5.40", @@ -1722,116 +1662,6 @@ }, "time": "2024-01-09T14:23:35+00:00" }, - { - "name": "ezimuel/guzzlestreams", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/ezimuel/guzzlestreams.git", - "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezimuel/guzzlestreams/zipball/b4b5a025dfee70d6cd34c780e07330eb93d5b997", - "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "~9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Stream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Fork of guzzle/streams (abandoned) to be used with elasticsearch-php", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "Guzzle", - "stream" - ], - "support": { - "source": "https://github.com/ezimuel/guzzlestreams/tree/3.1.0" - }, - "time": "2022-10-24T12:58:50+00:00" - }, - { - "name": "ezimuel/ringphp", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/ezimuel/ringphp.git", - "reference": "7887fc8488013065f72f977dcb281994f5fde9f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezimuel/ringphp/zipball/7887fc8488013065f72f977dcb281994f5fde9f4", - "reference": "7887fc8488013065f72f977dcb281994f5fde9f4", - "shasum": "" - }, - "require": { - "ezimuel/guzzlestreams": "^3.0.1", - "php": ">=5.4.0", - "react/promise": "~2.0" - }, - "replace": { - "guzzlehttp/ringphp": "self.version" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "~9.0" - }, - "suggest": { - "ext-curl": "Guzzle will use specific adapters if cURL is present" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Ring\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Fork of guzzle/RingPHP (abandoned) to be used with elasticsearch-php", - "support": { - "source": "https://github.com/ezimuel/ringphp/tree/1.2.2" - }, - "time": "2022-12-07T11:28:53+00:00" - }, { "name": "friendsofphp/proxy-manager-lts", "version": "v1.0.18", @@ -1914,105 +1744,6 @@ ], "time": "2024-03-20T12:50:41+00:00" }, - { - "name": "friendsofsymfony/elastica-bundle", - "version": "v6.3.1", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfSymfony/FOSElasticaBundle.git", - "reference": "5dd16e0199bad60735e2847f2b8f00e2121e8378" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfSymfony/FOSElasticaBundle/zipball/5dd16e0199bad60735e2847f2b8f00e2121e8378", - "reference": "5dd16e0199bad60735e2847f2b8f00e2121e8378", - "shasum": "" - }, - "require": { - "pagerfanta/pagerfanta": "^2.4 || ^3.0", - "php": "^7.4 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "ruflin/elastica": "^7.1", - "symfony/console": "^4.4 || ^5.4 || ^6.2", - "symfony/dependency-injection": "^4.4 || ^5.4 || ^6.2", - "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.2", - "symfony/property-access": "^4.4 || ^5.4 || ^6.2" - }, - "require-dev": { - "doctrine/doctrine-bundle": "^2.1.1", - "doctrine/mongodb-odm": "^2.2", - "doctrine/orm": "^2.8", - "doctrine/phpcr-odm": "^1.4", - "ergebnis/composer-normalize": "^2.28", - "friendsofphp/php-cs-fixer": "^3.0", - "jackalope/jackalope-doctrine-dbal": "^1.2", - "jms/serializer": "^3.8", - "jms/serializer-bundle": "^3.5 || ^4.0", - "knplabs/knp-components": "^2.4 || ^3.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-symfony": "^1.2", - "phpunit/phpunit": "^9.5", - "symfony/expression-language": "^4.4 || ^5.4 || ^6.2", - "symfony/messenger": "^4.4 || ^5.4 || ^6.2", - "symfony/serializer": "^4.4 || ^5.4 || ^6.2", - "symfony/twig-bundle": "^4.4 || ^5.4 || ^6.2", - "symfony/web-profiler-bundle": "^4.4 || ^5.4 || ^6.2", - "symfony/yaml": "^4.4 || ^5.4 || ^6.2" - }, - "suggest": { - "enqueue/elastica-bundle": "For populating Elasticsearch indexes asynchronously and using significanly less resources. Uses Enqueue.", - "symfony/messenger": "For populating Elasticsearch indexes asynchronously and using significanly less resources." - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "6.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "FOS\\ElasticaBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "FriendsOfSymfony Community", - "homepage": "https://github.com/FriendsOfSymfony/FOSElasticaBundle/contributors" - }, - { - "name": "Tim Nagel", - "email": "tim@nagel.com.au" - }, - { - "name": "Richard Miller", - "email": "richard.miller@limethinking.co.uk" - }, - { - "name": "Jeremy Mikola", - "email": "jmikola@gmail.com" - } - ], - "description": "Elasticsearch PHP integration for your Symfony project using Elastica", - "homepage": "https://github.com/FriendsOfSymfony/FOSElasticaBundle", - "keywords": [ - "doctrine2", - "elastica", - "elasticsearch", - "mongodb", - "search" - ], - "support": { - "issues": "https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues", - "source": "https://github.com/FriendsOfSymfony/FOSElasticaBundle/tree/v6.3.1" - }, - "time": "2023-05-28T18:05:31+00:00" - }, { "name": "google/recaptcha", "version": "1.3.0", @@ -2067,22 +1798,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "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" @@ -2093,9 +1824,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -2173,7 +1904,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -2189,20 +1920,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.2", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -2210,7 +1941,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { @@ -2256,7 +1987,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -2272,20 +2003,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -2300,8 +2031,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2372,7 +2103,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -2388,20 +2119,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "knplabs/knp-components", - "version": "v4.3.1", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/KnpLabs/knp-components.git", - "reference": "51f7053101ceb9c62af42ec08e6cfdee5fd64502" + "reference": "59ef316e34e814449d8718d7151946bdbb5e553f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/knp-components/zipball/51f7053101ceb9c62af42ec08e6cfdee5fd64502", - "reference": "51f7053101ceb9c62af42ec08e6cfdee5fd64502", + "url": "https://api.github.com/repos/KnpLabs/knp-components/zipball/59ef316e34e814449d8718d7151946bdbb5e553f", + "reference": "59ef316e34e814449d8718d7151946bdbb5e553f", "shasum": "" }, "require": { @@ -2409,21 +2140,22 @@ "symfony/event-dispatcher-contracts": "^3.0" }, "conflict": { - "doctrine/dbal": "<3.1" + "doctrine/dbal": "<3.8" }, "require-dev": { - "doctrine/mongodb-odm": "^2.4", - "doctrine/orm": "^2.12", - "doctrine/phpcr-odm": "^1.6", + "doctrine/dbal": "^3.8 || ^4.0", + "doctrine/mongodb-odm": "^2.5.5", + "doctrine/orm": "^2.13 || ^3.0", + "doctrine/phpcr-odm": "^1.8 || ^2.0", "ext-pdo_sqlite": "*", - "jackalope/jackalope-doctrine-dbal": "^1.8", - "phpunit/phpunit": "^9.5", + "jackalope/jackalope-doctrine-dbal": "^1.12 || ^2.0", + "phpunit/phpunit": "^9.6", "propel/propel1": "^1.7", "ruflin/elastica": "^7.0", "solarium/solarium": "^6.0", - "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", - "symfony/property-access": "^5.4 || ^6.0 || ^7.0" + "symfony/http-foundation": "^5.4.38 || ^6.4.4 || ^7.0", + "symfony/http-kernel": "^5.4.38 || ^6.4.4 || ^7.0", + "symfony/property-access": "^5.4.38 || ^6.4.4 || ^7.0" }, "suggest": { "doctrine/common": "to allow usage pagination with Doctrine ArrayCollection", @@ -2431,7 +2163,6 @@ "doctrine/orm": "to allow usage pagination with Doctrine ORM", "doctrine/phpcr-odm": "to allow usage pagination with Doctrine ODM PHPCR", "propel/propel1": "to allow usage pagination with Propel ORM", - "ruflin/elastica": "to allow usage pagination with ElasticSearch Client", "solarium/solarium": "to allow usage pagination with Solarium Client", "symfony/http-foundation": "to retrieve arguments from Request", "symfony/property-access": "to allow sorting arrays" @@ -2472,9 +2203,9 @@ ], "support": { "issues": "https://github.com/KnpLabs/knp-components/issues", - "source": "https://github.com/KnpLabs/knp-components/tree/v4.3.1" + "source": "https://github.com/KnpLabs/knp-components/tree/v4.4.0" }, - "time": "2024-03-09T08:43:32+00:00" + "time": "2024-04-23T07:05:01+00:00" }, { "name": "knplabs/knp-menu", @@ -2551,26 +2282,26 @@ }, { "name": "knplabs/knp-menu-bundle", - "version": "v3.3.0", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/KnpLabs/KnpMenuBundle.git", - "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5" + "reference": "6a1e3e1f4131f9a5a967e36717a1fe680c183637" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/KnpMenuBundle/zipball/02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", - "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", + "url": "https://api.github.com/repos/KnpLabs/KnpMenuBundle/zipball/6a1e3e1f4131f9a5a967e36717a1fe680c183637", + "reference": "6a1e3e1f4131f9a5a967e36717a1fe680c183637", "shasum": "" }, "require": { "knplabs/knp-menu": "^3.3", - "php": "^8.0", + "php": "^8.1", "symfony/deprecation-contracts": "^2.5 | ^3.3", "symfony/framework-bundle": "^5.4 | ^6.0 | ^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 | ^10.1", + "phpunit/phpunit": "^10.5 | ^11.0.3", "symfony/expression-language": "^5.4 | ^6.0 | ^7.0", "symfony/phpunit-bridge": "^6.0 | ^7.0", "symfony/templating": "^5.4 | ^6.0 | ^7.0" @@ -2610,9 +2341,9 @@ ], "support": { "issues": "https://github.com/KnpLabs/KnpMenuBundle/issues", - "source": "https://github.com/KnpLabs/KnpMenuBundle/tree/v3.3.0" + "source": "https://github.com/KnpLabs/KnpMenuBundle/tree/v3.4.2" }, - "time": "2023-11-01T09:25:40+00:00" + "time": "2024-06-03T08:48:36+00:00" }, { "name": "knplabs/knp-paginator-bundle", @@ -2690,28 +2421,28 @@ }, { "name": "laminas/laminas-code", - "version": "4.13.0", + "version": "4.16.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "7353d4099ad5388e84737dd16994316a04f48dbf" + "reference": "1793e78dad4108b594084d05d1fb818b85b110af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/7353d4099ad5388e84737dd16994316a04f48dbf", - "reference": "7353d4099ad5388e84737dd16994316a04f48dbf", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1793e78dad4108b594084d05d1fb818b85b110af", + "reference": "1793e78dad4108b594084d05d1fb818b85b110af", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "doctrine/annotations": "^2.0.1", "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.5.0", - "laminas/laminas-stdlib": "^3.17.0", - "phpunit/phpunit": "^10.3.3", - "psalm/plugin-phpunit": "^0.18.4", + "laminas/laminas-coding-standard": "^3.0.0", + "laminas/laminas-stdlib": "^3.18.0", + "phpunit/phpunit": "^10.5.37", + "psalm/plugin-phpunit": "^0.19.0", "vimeo/psalm": "^5.15.0" }, "suggest": { @@ -2749,7 +2480,7 @@ "type": "community_bridge" } ], - "time": "2023-10-18T10:00:55+00:00" + "time": "2024-11-20T13:15:13+00:00" }, { "name": "league/uri", @@ -2927,16 +2658,16 @@ }, { "name": "masterminds/html5", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { @@ -2944,7 +2675,7 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { @@ -2988,75 +2719,50 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "time": "2023-05-10T11:58:31+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { - "name": "monolog/monolog", - "version": "3.5.0", + "name": "meilisearch/meilisearch-php", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + "url": "https://github.com/meilisearch/meilisearch-php.git", + "reference": "4dd127cb87848f7a7b28e83bb355b4b86d329867" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "url": "https://api.github.com/repos/meilisearch/meilisearch-php/zipball/4dd127cb87848f7a7b28e83bb355b4b86d329867", + "reference": "4dd127cb87848f7a7b28e83bb355b4b86d329867", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" + "ext-json": "*", + "php": "^7.4 || ^8.0", + "php-http/discovery": "^1.7", + "psr/http-client": "^1.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.1", - "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" + "guzzlehttp/guzzle": "^7.8.1", + "http-interop/http-factory-guzzle": "^1.2.0", + "php-cs-fixer/shim": "^3.59.3", + "phpstan/extension-installer": "^1.4.1", + "phpstan/phpstan": "^1.11.5", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "phpunit/phpunit": "^9.5 || ^10.5" }, "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" + "guzzlehttp/guzzle": "Use Guzzle ^7 as HTTP client", + "http-interop/http-factory-guzzle": "Factory for guzzlehttp/guzzle" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, "autoload": { "psr-4": { - "Monolog\\": "src/Monolog" + "MeiliSearch\\": "src/", + "Meilisearch\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3065,53 +2771,78 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Clementine", + "email": "clementine@meilisearch.com" } ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", + "description": "PHP wrapper for the Meilisearch API", "keywords": [ - "log", - "logging", - "psr-3" + "api", + "client", + "instant", + "meilisearch", + "php", + "search" ], "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + "issues": "https://github.com/meilisearch/meilisearch-php/issues", + "source": "https://github.com/meilisearch/meilisearch-php/tree/v1.11.0" }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2023-10-27T15:32:31+00:00" + "time": "2024-10-28T14:04:37+00:00" }, { - "name": "ninsuo/symfony-collection", - "version": "2.1.33", + "name": "meilisearch/search-bundle", + "version": "v0.15.7", "source": { "type": "git", - "url": "https://github.com/ninsuo/symfony-collection.git", - "reference": "231f790eee9ea2c3301ac45f5fe4fbb09ec4289c" + "url": "https://github.com/meilisearch/meilisearch-symfony.git", + "reference": "345bb2b18ec0a962a8a12d0ae0e8088c2ebf0641" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ninsuo/symfony-collection/zipball/231f790eee9ea2c3301ac45f5fe4fbb09ec4289c", - "reference": "231f790eee9ea2c3301ac45f5fe4fbb09ec4289c", + "url": "https://api.github.com/repos/meilisearch/meilisearch-symfony/zipball/345bb2b18ec0a962a8a12d0ae0e8088c2ebf0641", + "reference": "345bb2b18ec0a962a8a12d0ae0e8088c2ebf0641", "shasum": "" }, - "type": "library", + "require": { + "doctrine/doctrine-bundle": "^2.10", + "ext-json": "*", + "meilisearch/meilisearch-php": "^1.0.0", + "php": "^7.4|^8.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4.17 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.27", + "symfony/property-access": "^5.4 || ^6.0 || ^7.0", + "symfony/serializer": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0.0", + "doctrine/orm": "^2.12 || ^3.0", + "matthiasnoback/symfony-config-test": "^4.3 || ^5.2", + "matthiasnoback/symfony-dependency-injection-test": "^4.3 || ^5.0", + "nyholm/psr7": "^1.8.1", + "php-cs-fixer/shim": "^3.58.1", + "phpmd/phpmd": "^2.15", + "phpstan/extension-installer": "^1.4.1", + "phpstan/phpstan": "^1.11.4", + "phpstan/phpstan-doctrine": "^1.4.3", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-symfony": "^1.4.4", + "phpunit/php-code-coverage": "^9.2.31", + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/framework-bundle": "^5.4.17 || ^6.0 || ^7.0", + "symfony/http-client": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.4 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "type": "symfony-bundle", "autoload": { - "classmap": [ - "ScriptHandler.php" - ] + "psr-4": { + "Meilisearch\\Bundle\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3119,46 +2850,90 @@ ], "authors": [ { - "name": "Alain Tiemblo", - "email": "ninsuo@gmail.com" + "name": "David Sanchez", + "email": "david38sanchez@gmail.com" } ], - "description": "A jQuery plugin that manages adding, deleting and moving elements from a Symfony collection", + "description": "Seamless integration of Meilisearch into your Symfony project.", + "keywords": [ + "api", + "bundle", + "instant", + "meilisearch", + "search", + "symfony" + ], "support": { - "issues": "https://github.com/ninsuo/symfony-collection/issues", - "source": "https://github.com/ninsuo/symfony-collection/tree/2.1.33" + "issues": "https://github.com/meilisearch/meilisearch-symfony/issues", + "source": "https://github.com/meilisearch/meilisearch-symfony/tree/v0.15.7" }, - "time": "2020-01-13T12:54:48+00:00" + "time": "2024-12-03T12:49:45+00:00" }, { - "name": "nyholm/dsn", - "version": "2.0.1", + "name": "monolog/monolog", + "version": "3.8.1", "source": { "type": "git", - "url": "https://github.com/Nyholm/dsn.git", - "reference": "9445621b426bac8c0ca161db8cd700da00a4e618" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/dsn/zipball/9445621b426bac8c0ca161db8cd700da00a4e618", - "reference": "9445621b426bac8c0ca161db8cd700da00a4e618", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" }, "require-dev": { - "symfony/phpunit-bridge": "^5.1" + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "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-master": "2.0-dev" + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "Nyholm\\Dsn\\": "src/" + "Monolog\\": "src/Monolog" } }, "notification-url": "https://packagist.org/downloads/", @@ -3167,42 +2942,83 @@ ], "authors": [ { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "Parse your DSN strings in a powerful and flexible way", - "homepage": "http://tnyholm.se", + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", "keywords": [ - "database", - "dsn", - "dsn parser", - "parser" + "log", + "logging", + "psr-3" ], "support": { - "issues": "https://github.com/Nyholm/dsn/issues", - "source": "https://github.com/Nyholm/dsn/tree/2.0.1" + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.8.1" }, "funding": [ { - "url": "https://github.com/Nyholm", + "url": "https://github.com/Seldaek", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-12-05T17:15:07+00:00" + }, + { + "name": "ninsuo/symfony-collection", + "version": "2.1.33", + "source": { + "type": "git", + "url": "https://github.com/ninsuo/symfony-collection.git", + "reference": "231f790eee9ea2c3301ac45f5fe4fbb09ec4289c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ninsuo/symfony-collection/zipball/231f790eee9ea2c3301ac45f5fe4fbb09ec4289c", + "reference": "231f790eee9ea2c3301ac45f5fe4fbb09ec4289c", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "ScriptHandler.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alain Tiemblo", + "email": "ninsuo@gmail.com" } ], - "time": "2021-11-18T09:23:29+00:00" + "description": "A jQuery plugin that manages adding, deleting and moving elements from a Symfony collection", + "support": { + "issues": "https://github.com/ninsuo/symfony-collection/issues", + "source": "https://github.com/ninsuo/symfony-collection/tree/2.1.33" + }, + "time": "2020-01-13T12:54:48+00:00" }, { "name": "nyholm/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", - "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { @@ -3255,7 +3071,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.1" + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { @@ -3267,110 +3083,86 @@ "type": "github" } ], - "time": "2023-11-13T09:31:12+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { - "name": "pagerfanta/pagerfanta", - "version": "v3.8.0", + "name": "php-http/discovery", + "version": "1.20.0", "source": { "type": "git", - "url": "https://github.com/BabDev/Pagerfanta.git", - "reference": "a07c84296e491add39d103b812129de77610c33b" + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BabDev/Pagerfanta/zipball/a07c84296e491add39d103b812129de77610c33b", - "reference": "a07c84296e491add39d103b812129de77610c33b", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.4 || ^8.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/polyfill-php80": "^1.15" + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" }, "conflict": { - "doctrine/collections": "<1.8", - "doctrine/dbal": "<3.1", - "doctrine/mongodb-odm": "<2.2.2", - "doctrine/orm": "<2.8", - "doctrine/phpcr-odm": "<1.5", - "ruflin/elastica": "<6.0", - "solarium/solarium": "<5.0", - "twig/twig": "<2.13" + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" }, - "replace": { - "pagerfanta/core": "self.version", - "pagerfanta/doctrine-collections-adapter": "self.version", - "pagerfanta/doctrine-dbal-adapter": "self.version", - "pagerfanta/doctrine-mongodb-odm-adapter": "self.version", - "pagerfanta/doctrine-orm-adapter": "self.version", - "pagerfanta/doctrine-phpcr-odm-adapter": "self.version", - "pagerfanta/elastica-adapter": "self.version", - "pagerfanta/solarium-adapter": "self.version", - "pagerfanta/twig": "self.version" - }, - "require-dev": { - "dg/bypass-finals": "^1.3", - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/collections": "^1.8 || ^2.0", - "doctrine/dbal": "^3.1", - "doctrine/mongodb-odm": "^2.2.2", - "doctrine/orm": "^2.8", - "doctrine/phpcr-odm": "^1.5", - "jackalope/jackalope-doctrine-dbal": "^1.7.4", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "1.9.14", - "phpstan/phpstan-phpunit": "1.3.3", - "phpunit/phpunit": "9.6.7 || 10.1.0", - "rector/rector": "0.15.12", - "ruflin/elastica": "^6.0 || ^7.0", - "solarium/solarium": "^5.0 || ^6.0", - "symfony/cache": "^5.4 || ^6.0", - "twig/twig": "^2.13 || ^3.0" + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" }, - "suggest": { - "twig/twig": "To integrate Pagerfanta with Twig" + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, - "type": "library", "autoload": { "psr-4": { - "Pagerfanta\\": "lib/Core/", - "Pagerfanta\\Twig\\": "lib/Twig/", - "Pagerfanta\\Elastica\\": "lib/Adapter/Elastica/", - "Pagerfanta\\Solarium\\": "lib/Adapter/Solarium/", - "Pagerfanta\\Doctrine\\ORM\\": "lib/Adapter/Doctrine/ORM/", - "Pagerfanta\\Doctrine\\DBAL\\": "lib/Adapter/Doctrine/DBAL/", - "Pagerfanta\\Doctrine\\PHPCRODM\\": "lib/Adapter/Doctrine/PHPCRODM/", - "Pagerfanta\\Doctrine\\MongoDBODM\\": "lib/Adapter/Doctrine/MongoDBODM/", - "Pagerfanta\\Doctrine\\Collections\\": "lib/Adapter/Doctrine/Collections/" + "Http\\Discovery\\": "src/" }, "exclude-from-classmap": [ - "lib/**/Tests/" + "src/Composer/Plugin.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Pagination for PHP", + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", "keywords": [ - "page", - "pagination", - "paginator", - "paging" + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" ], "support": { - "issues": "https://github.com/BabDev/Pagerfanta/issues", - "source": "https://github.com/BabDev/Pagerfanta/tree/v3.8.0" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" }, - "funding": [ - { - "url": "https://github.com/mbabker", - "type": "github" - } - ], - "time": "2023-04-15T16:39:36+00:00" + "time": "2024-10-02T11:20:13+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3427,28 +3219,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "version": "5.6.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c", + "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.1", "ext-filter": "*", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" }, "type": "library", "extra": { @@ -3472,35 +3271,35 @@ }, { "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "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.3.0" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0" }, - "time": "2021-10-19T17:43:47+00:00" + "time": "2024-11-12T11:25:25+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.8.2", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" + "phpstan/phpdoc-parser": "^1.18|^2.0" }, "require-dev": { "ext-tokenizer": "*", @@ -3536,22 +3335,22 @@ "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" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" }, - "time": "2024-02-23T11:10:43+00:00" + "time": "2024-11-09T15:12:26+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.27.0", + "version": "1.33.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757" + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757", - "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", "shasum": "" }, "require": { @@ -3583,9 +3382,9 @@ "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.27.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0" }, - "time": "2024-03-21T13:14:53+00:00" + "time": "2024-10-13T11:25:22+00:00" }, { "name": "psr/cache", @@ -3841,20 +3640,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -3878,7 +3677,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -3890,9 +3689,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -4005,16 +3804,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -4049,9 +3848,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "ralouphie/getallheaders", @@ -4098,33 +3897,61 @@ "time": "2019-03-08T08:55:37+00:00" }, { - "name": "react/promise", - "version": "v2.11.0", + "name": "sensio/framework-extra-bundle", + "version": "v6.2.10", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831" + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/1a8460931ea36dc5c76838fec5734d55c88c6831", - "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/2f886f4b31f23c76496901acaedfedb6936ba61f", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f", "shasum": "" }, "require": { - "php": ">=5.4.0" + "doctrine/annotations": "^1.0|^2.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "doctrine/dbal": "^2.10|^3.0", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/monolog-bridge": "^4.0|^5.0|^6.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "6.1.x-dev" + } }, - "type": "library", "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "React\\Promise\\": "src/" - } + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4132,177 +3959,8 @@ ], "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/v2.11.0" - }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-11-16T16:16:50+00:00" - }, - { - "name": "ruflin/elastica", - "version": "7.3.2", - "source": { - "type": "git", - "url": "https://github.com/ruflin/Elastica.git", - "reference": "84ba137678707a1aa4242d12bad891dc38fa2608" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ruflin/Elastica/zipball/84ba137678707a1aa4242d12bad891dc38fa2608", - "reference": "84ba137678707a1aa4242d12bad891dc38fa2608", - "shasum": "" - }, - "require": { - "elasticsearch/elasticsearch": "^7.10", - "ext-json": "*", - "nyholm/dsn": "^2.0.0", - "php": "^7.2 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0", - "symfony/polyfill-php73": "^1.19" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.155", - "guzzlehttp/guzzle": "^6.3 || ^7.2", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5.8 || ^9.4", - "symfony/phpunit-bridge": "^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow using IAM authentication with Amazon ElasticSearch Service", - "guzzlehttp/guzzle": "Allow using guzzle as transport", - "monolog/monolog": "Logging request" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Elastica\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Ruflin", - "homepage": "http://ruflin.com/" - } - ], - "description": "Elasticsearch Client", - "homepage": "http://elastica.io/", - "keywords": [ - "client", - "search" - ], - "support": { - "issues": "https://github.com/ruflin/Elastica/issues", - "source": "https://github.com/ruflin/Elastica/tree/7.3.2" - }, - "time": "2024-03-11T14:11:50+00:00" - }, - { - "name": "sensio/framework-extra-bundle", - "version": "v6.2.10", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/2f886f4b31f23c76496901acaedfedb6936ba61f", - "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0|^2.0", - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/framework-bundle": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine/doctrine-cache-bundle": "<1.3.1", - "doctrine/persistence": "<1.3" - }, - "require-dev": { - "doctrine/dbal": "^2.10|^3.0", - "doctrine/doctrine-bundle": "^1.11|^2.0", - "doctrine/orm": "^2.5", - "symfony/browser-kit": "^4.4|^5.0|^6.0", - "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/monolog-bridge": "^4.0|^5.0|^6.0", - "symfony/monolog-bundle": "^3.2", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", - "symfony/security-bundle": "^4.4|^5.0|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "6.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" - }, - "exclude-from-classmap": [ - "/tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "This bundle provides a way to configure your controllers with annotations", @@ -4560,16 +4218,16 @@ }, { "name": "symfony/cache-contracts", - "version": "v3.4.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778" + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", "shasum": "" }, "require": { @@ -4579,7 +4237,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -4616,7 +4274,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1" }, "funding": [ { @@ -4632,7 +4290,7 @@ "type": "tidelift" } ], - "time": "2023-09-25T12:52:38+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/clock", @@ -4955,16 +4613,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -4973,7 +4631,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5002,7 +4660,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -5018,7 +4676,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/doctrine-bridge", @@ -5360,16 +5018,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -5379,7 +5037,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5416,7 +5074,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -5432,7 +5090,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/expression-language", @@ -5627,22 +5285,25 @@ }, { "name": "symfony/flex", - "version": "v2.4.5", + "version": "v2.4.7", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "b0a405f40614c9f584b489d54f91091817b0e26e" + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/b0a405f40614c9f584b489d54f91091817b0e26e", - "reference": "b0a405f40614c9f584b489d54f91091817b0e26e", + "url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402", + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402", "shasum": "" }, "require": { "composer-plugin-api": "^2.1", "php": ">=8.0" }, + "conflict": { + "composer/semver": "<1.7.2" + }, "require-dev": { "composer/composer": "^2.1", "symfony/dotenv": "^5.4|^6.0", @@ -5672,7 +5333,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.4.5" + "source": "https://github.com/symfony/flex/tree/v2.4.7" }, "funding": [ { @@ -5688,7 +5349,7 @@ "type": "tidelift" } ], - "time": "2024-03-02T08:16:47+00:00" + "time": "2024-10-07T08:51:54+00:00" }, { "name": "symfony/form", @@ -6094,16 +5755,16 @@ }, { "name": "symfony/http-client-contracts", - "version": "v3.4.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "1ee70e699b41909c209a0c930f11034b93578654" + "reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1ee70e699b41909c209a0c930f11034b93578654", - "reference": "1ee70e699b41909c209a0c930f11034b93578654", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/c2f3ad828596624ca39ea40f83617ef51ca8bbf9", + "reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9", "shasum": "" }, "require": { @@ -6112,7 +5773,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6152,7 +5813,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.1" }, "funding": [ { @@ -6168,7 +5829,7 @@ "type": "tidelift" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2024-11-25T12:02:18+00:00" }, { "name": "symfony/http-foundation", @@ -6906,20 +6567,20 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -6964,7 +6625,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -6980,24 +6641,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance and support of other locales than \"en\"" @@ -7048,7 +6709,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0" }, "funding": [ { @@ -7064,26 +6725,25 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:12:16+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -7132,7 +6792,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -7148,24 +6808,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -7213,7 +6873,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -7229,24 +6889,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -7293,7 +6953,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -7309,40 +6969,32 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, - "type": "library", + "type": "metapackage", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -7366,7 +7018,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" }, "funding": [ { @@ -7382,24 +7034,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.29.0", + "name": "symfony/polyfill-php80", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7413,7 +7065,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" @@ -7424,6 +7076,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -7433,7 +7089,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -7442,7 +7098,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -7458,24 +7114,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "name": "symfony/polyfill-php81", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7489,7 +7145,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, "classmap": [ "Resources/stubs" @@ -7500,10 +7156,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -7513,7 +7165,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -7522,7 +7174,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -7538,25 +7190,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7599,7 +7250,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -7615,7 +7266,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", @@ -8567,21 +8218,22 @@ }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -8589,7 +8241,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -8629,7 +8281,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -8645,7 +8297,7 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/stopwatch", @@ -8892,16 +8544,16 @@ }, { "name": "symfony/translation-contracts", - "version": "v3.4.1", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "06450585bf65e978026bda220cdebca3f867fde7" + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", - "reference": "06450585bf65e978026bda220cdebca3f867fde7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { @@ -8910,7 +8562,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -8950,7 +8602,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -8966,7 +8618,7 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/twig-bridge", @@ -9770,30 +9422,38 @@ }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.16.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "475ad2dc97d65d8631393e721e7e44fb544f0561" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/475ad2dc97d65d8631393e721e7e44fb544f0561", + "reference": "475ad2dc97d65d8631393e721e7e44fb544f0561", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22" + "symfony/polyfill-php81": "^1.29" }, "require-dev": { + "phpstan/phpstan": "^2.0", "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.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/" } @@ -9826,7 +9486,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.16.0" }, "funding": [ { @@ -9838,7 +9498,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-11-29T08:27:05+00:00" }, { "name": "webmozart/assert", @@ -9900,32 +9560,104 @@ } ], "packages-dev": [ + { + "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": "composer/pcre", - "version": "3.1.3", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", - "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -9953,7 +9685,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.3" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -9969,28 +9701,28 @@ "type": "tidelift" } ], - "time": "2024-03-19T10:26:25+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", - "version": "3.4.0", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "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.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -10034,7 +9766,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -10050,20 +9782,20 @@ "type": "tidelift" } ], - "time": "2023-08-31T09:50:34+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", - "version": "3.0.4", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255" + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255", - "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { @@ -10100,7 +9832,7 @@ "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.4" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { @@ -10116,7 +9848,7 @@ "type": "tidelift" } ], - "time": "2024-03-26T18:29:49+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { "name": "dama/doctrine-test-bundle", @@ -10187,22 +9919,23 @@ }, { "name": "doctrine/data-fixtures", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f" + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", - "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/d2ff5046b263868baf6e9b06cf4918f60096c0d0", + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0", "shasum": "" }, "require": { "doctrine/deprecations": "^0.5.3 || ^1.0", - "doctrine/persistence": "^2.0|^3.0", - "php": "^7.4 || ^8.0" + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.4 || ^8.0", + "symfony/polyfill-php80": "^1" }, "conflict": { "doctrine/dbal": "<3.5 || >=5", @@ -10216,11 +9949,12 @@ "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.14 || ^3", "ext-sqlite3": "*", + "fig/log-test": "^1", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.6.13 || ^10.4.2", + "psr/log": "^1.1 || ^2 || ^3", "symfony/cache": "^5.4 || ^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6.3 || ^7", - "vimeo/psalm": "^5.9" + "symfony/var-exporter": "^5.4 || ^6.3 || ^7" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -10251,7 +9985,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.7.0" + "source": "https://github.com/doctrine/data-fixtures/tree/1.8.0" }, "funding": [ { @@ -10267,20 +10001,20 @@ "type": "tidelift" } ], - "time": "2023-11-24T11:18:31+00:00" + "time": "2024-11-04T22:36:12+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.5.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "c808a0c85c38c8ee265cc8405b456c1d2b38567d" + "reference": "f44a224e27573b79140197a44e68484c45fb24da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/c808a0c85c38c8ee265cc8405b456c1d2b38567d", - "reference": "c808a0c85c38c8ee265cc8405b456c1d2b38567d", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/f44a224e27573b79140197a44e68484c45fb24da", + "reference": "f44a224e27573b79140197a44e68484c45fb24da", "shasum": "" }, "require": { @@ -10309,7 +10043,7 @@ "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\FixturesBundle\\": "" + "Doctrine\\Bundle\\FixturesBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -10338,7 +10072,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.5.1" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.6.2" }, "funding": [ { @@ -10354,65 +10088,32 @@ "type": "tidelift" } ], - "time": "2023-11-19T12:48:54+00:00" + "time": "2024-11-13T07:41:29+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.52.1", + "name": "evenement/evenement", + "version": "v3.0.2", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "6e77207f0d851862ceeb6da63e6e22c01b1587bc" + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/6e77207f0d851862ceeb6da63e6e22c01b1587bc", - "reference": "6e77207f0d851862ceeb6da63e6e22c01b1587bc", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { - "composer/semver": "^3.4", - "composer/xdebug-handler": "^3.0.3", - "ext-filter": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^7.4 || ^8.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" + "php": ">=7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3 || ^2.0", - "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.4", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.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." + "phpunit/phpunit": "^9 || ^6" }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", + "type": "library", "autoload": { "psr-4": { - "PhpCsFixer\\": "src/" + "Evenement\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10421,10 +10122,162 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { + "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": "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.65.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/79d4f3e77b250a7d8043d76c6af8f0695e8a469f", + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.2", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", + "justinrainbow/json-schema": "^5.3 || ^6.0", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", + "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" + }, + "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" } @@ -10438,7 +10291,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.52.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.65.0" }, "funding": [ { @@ -10446,20 +10299,20 @@ "type": "github" } ], - "time": "2024-03-19T21:02:43+00:00" + "time": "2024-11-25T00:39:24+00:00" }, { "name": "friendsoftwig/twigcs", - "version": "6.4.0", + "version": "6.5.0", "source": { "type": "git", "url": "https://github.com/friendsoftwig/twigcs.git", - "reference": "954e1af488d649cf329f35deaedf2b8fe2cf4b56" + "reference": "aaa3ba112bf4fcee7b51a00d9b45b13bc2cc23bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/friendsoftwig/twigcs/zipball/954e1af488d649cf329f35deaedf2b8fe2cf4b56", - "reference": "954e1af488d649cf329f35deaedf2b8fe2cf4b56", + "url": "https://api.github.com/repos/friendsoftwig/twigcs/zipball/aaa3ba112bf4fcee7b51a00d9b45b13bc2cc23bc", + "reference": "aaa3ba112bf4fcee7b51a00d9b45b13bc2cc23bc", "shasum": "" }, "require": { @@ -10468,14 +10321,14 @@ "ext-json": "*", "ext-mbstring": "*", "ext-simplexml": "*", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "symfony/console": "^4.4 || ^5.3 || ^6.0 || ^7.0", "symfony/filesystem": "^4.4 || ^5.3 || ^6.0 || ^7.0", "symfony/finder": "^4.4 || ^5.3 || ^6.0 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.6.15", - "symfony/phpunit-bridge": "^7.0.1" + "phpunit/phpunit": "^9.6.19", + "symfony/phpunit-bridge": "^7.1.4" }, "bin": [ "bin/twigcs" @@ -10499,22 +10352,22 @@ "description": "Checkstyle automation for Twig", "support": { "issues": "https://github.com/friendsoftwig/twigcs/issues", - "source": "https://github.com/friendsoftwig/twigcs/tree/6.4.0" + "source": "https://github.com/friendsoftwig/twigcs/tree/6.5.0" }, - "time": "2023-12-05T07:36:35+00:00" + "time": "2024-11-27T21:59:24+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -10522,11 +10375,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "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", @@ -10552,7 +10406,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -10560,20 +10414,20 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "nikic/php-parser", - "version": "v5.0.2", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -10584,7 +10438,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -10616,9 +10470,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-03-05T20:51:40+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "phar-io/manifest", @@ -10740,16 +10594,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.65", + "version": "1.12.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6" + "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3c657d057a0b7ecae19cb12db446bbc99d8839c6", - "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0", + "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0", "shasum": "" }, "require": { @@ -10792,31 +10646,27 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2024-03-23T10:30:26+00:00" + "time": "2024-11-28T22:13:23+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "1.3.64", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "f42828ad684e026054c3d94161d89870150bc3da" + "reference": "231d3f795ed5ef54c98961fd3958868cbe091207" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/f42828ad684e026054c3d94161d89870150bc3da", - "reference": "f42828ad684e026054c3d94161d89870150bc3da", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/231d3f795ed5ef54c98961fd3958868cbe091207", + "reference": "231d3f795ed5ef54c98961fd3958868cbe091207", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.64" + "phpstan/phpstan": "^1.12.12" }, "conflict": { "doctrine/collections": "<1.0", @@ -10843,7 +10693,7 @@ "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-phpunit": "^1.3.13", "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^9.6.16", + "phpunit/phpunit": "^9.6.20", "ramsey/uuid": "^4.2", "symfony/cache": "^5.4" }, @@ -10868,28 +10718,28 @@ "description": "Doctrine extensions for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/1.3.64" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/1.5.7" }, - "time": "2024-03-21T10:19:51+00:00" + "time": "2024-12-02T16:47:26+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "1.3.9", + "version": "1.4.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "a32bc86da24495025d7aafd1ba62444d4a364a98" + "reference": "c7b7e7f520893621558bfbfdb2694d4364565c1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/a32bc86da24495025d7aafd1ba62444d4a364a98", - "reference": "a32bc86da24495025d7aafd1ba62444d4a364a98", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/c7b7e7f520893621558bfbfdb2694d4364565c1d", + "reference": "c7b7e7f520893621558bfbfdb2694d4364565c1d", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.62" + "phpstan/phpstan": "^1.12" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -10940,41 +10790,41 @@ "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.3.9" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.12" }, - "time": "2024-03-16T16:50:20+00:00" + "time": "2024-11-06T10:13:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.31", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "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.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "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.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -10983,7 +10833,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -11012,7 +10862,7 @@ "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.31" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -11020,7 +10870,7 @@ "type": "github" } ], - "time": "2024-03-02T06:37:42+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11150,221 +11000,751 @@ "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "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.22", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "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.1", + "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.22" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-12-05T13:48:26+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/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, "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": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ - "template" + "promise", + "promises" ], "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/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": "2020-10-26T05:33:50+00:00" + "time": "2024-05-24T10:39:05+00:00" }, { - "name": "phpunit/php-timer", - "version": "5.0.3", + "name": "react/socket", + "version": "v1.16.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "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": "5.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": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", "keywords": [ - "timer" + "Connection", + "Socket", + "async", + "reactphp", + "stream" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "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": "2020-10-26T13:16:10+00:00" + "time": "2024-07-26T10:38:09+00:00" }, { - "name": "phpunit/phpunit", - "version": "9.6.18", + "name": "react/stream", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "32c2c2d6580b1d8ab3c10b1e9e4dc263cc69bb04" + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/32c2c2d6580b1d8ab3c10b1e9e4dc263cc69bb04", - "reference": "32c2c2d6580b1d8ab3c10b1e9e4dc263cc69bb04", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.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" + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, - "bin": [ - "phpunit" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.6-dev" - } - }, "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "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": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", "keywords": [ - "phpunit", - "testing", - "xunit" + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" ], "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.18" + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" }, "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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2024-03-21T12:07:32+00:00" + "time": "2024-06-11T12:45:25+00:00" }, { "name": "sebastian/cli-parser", @@ -12697,16 +13077,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.4", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "16ed5bdfd18e14fc7de347c8688e8ac479284222" + "reference": "cebafe2f1ad2d1e745c1015b7c2519592341e4e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/16ed5bdfd18e14fc7de347c8688e8ac479284222", - "reference": "16ed5bdfd18e14fc7de347c8688e8ac479284222", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/cebafe2f1ad2d1e745c1015b7c2519592341e4e6", + "reference": "cebafe2f1ad2d1e745c1015b7c2519592341e4e6", "shasum": "" }, "require": { @@ -12726,8 +13106,8 @@ "type": "symfony-bridge", "extra": { "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" + "url": "https://github.com/sebastianbergmann/phpunit", + "name": "phpunit/phpunit" } }, "autoload": { @@ -12738,7 +13118,8 @@ "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -12758,83 +13139,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.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-02-08T14:08:19+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "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.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.16" }, "funding": [ { @@ -12850,7 +13155,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-11-13T15:06:22+00:00" }, { "name": "symfony/web-profiler-bundle", diff --git a/config/bundles.php b/config/bundles.php index 1d9a6bd8..1455dc0e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -24,5 +24,5 @@ Nines\UtilBundle\NinesUtilBundle::class => ['all' => true], DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true], EWZ\Bundle\RecaptchaBundle\EWZRecaptchaBundle::class => ['all' => true], - FOS\ElasticaBundle\FOSElasticaBundle::class => ['all' => true], + Meilisearch\Bundle\MeilisearchBundle::class => ['all' => true], ]; diff --git a/config/packages/fos_elastica.yaml b/config/packages/fos_elastica.yaml deleted file mode 100644 index 3565917f..00000000 --- a/config/packages/fos_elastica.yaml +++ /dev/null @@ -1,156 +0,0 @@ -# Read the documentation: https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/doc/setup.md -fos_elastica: - clients: - default: - host: '%env(ELASTICSEARCH_HOST)%' - port: '%env(ELASTICSEARCH_PORT)%' - username: '%env(ELASTICSEARCH_USERNAME)%' - password: '%env(ELASTICSEARCH_PASSWORD)%' - indexes: - alias: - index_name: alias - persistence: &default_persistence - driver: orm - model: App\Entity\Alias - listener: - defer: true - provider: ~ - finder: ~ - properties: - name: { type: text } - sortable: { type: keyword, property_path: sortableName } - description: { type: text, property_path: descriptionSanitized } - people: - type: object - properties: - fullName: { type: text } - book: - index_name: book - persistence: - <<: *default_persistence - model: App\Entity\Book - properties: &publication - title: { type: text } - sortable: { type: keyword, property_path: sortableTitle } - description: { type: text, property_path: descriptionSanitized } - dateYear: - type: object - properties: - year: { type: integer } - location: - type: object - properties: - name: { type: text } - nameFacet: { type: keyword, property_path: name } - genres: - type: object - properties: - label: { type: text } - contributions: - type: object - properties: - person: - type: object - properties: - fullName: { type: text } - publishers: - type: object - properties: - name: { type: text } - compilation: - index_name: compilation - persistence: - <<: *default_persistence - model: App\Entity\Compilation - properties: - <<: *publication - periodical: - index_name: periodical - persistence: - <<: *default_persistence - model: App\Entity\Periodical - properties: - <<: *publication - # periodical extra fields - continuedFrom: { type: text } - continuedBy: { type: text } - person: - index_name: person - persistence: - <<: *default_persistence - model: App\Entity\Person - properties: - fullName: { type: text } - sortable: { type: keyword, property_path: sortableName } - gender: { type: text } - canadian: { type: boolean } - description: { type: text, property_path: descriptionSanitized } - birthDate: - type: object - properties: - year: { type: integer } - birthPlace: - type: object - properties: - name: { type: text } - deathDate: - type: object - properties: - year: { type: integer } - deathPlace: - type: object - properties: - name: { type: text } - residences: - type: object - properties: - name: { type: text } - aliases: - type: object - properties: - name: { type: text } - place: - index_name: place - persistence: - <<: *default_persistence - model: App\Entity\Place - properties: - name: { type: text } - sortable: { type: keyword, property_path: sortableName } - region: { type: text, property_path: regionName } - regionFacet: { type: keyword, property_path: regionName } - country: { type: text, property_path: countryName } - countryFacet: { type: keyword, property_path: countryName } - description: { type: text, property_path: descriptionSanitized } - coordinates: { type: geo_point } - publisher: - index_name: publisher - persistence: - <<: *default_persistence - model: App\Entity\Publisher - properties: - name: { type: text } - sortable: { type: keyword, property_path: name } - places: - type: object - properties: - name: { type: text } - nameFacet: { type: keyword, property_path: name } - -when@test: - fos_elastica: - indexes: - alias: - index_name: test_alias - book: - index_name: test_book - compilation: - index_name: test_compilation - periodical: - index_name: test_periodical - person: - index_name: test_person - place: - index_name: test_place - publisher: - index_name: test_publisher diff --git a/config/packages/http_discovery.yaml b/config/packages/http_discovery.yaml new file mode 100644 index 00000000..2a789e73 --- /dev/null +++ b/config/packages/http_discovery.yaml @@ -0,0 +1,10 @@ +services: + Psr\Http\Message\RequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ResponseFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ServerRequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\StreamFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UploadedFileFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UriFactoryInterface: '@http_discovery.psr17_factory' + + http_discovery.psr17_factory: + class: Http\Discovery\Psr17Factory diff --git a/config/packages/meilisearch.yaml b/config/packages/meilisearch.yaml new file mode 100644 index 00000000..4efc78a1 --- /dev/null +++ b/config/packages/meilisearch.yaml @@ -0,0 +1,67 @@ +meilisearch: + url: '%env(MEILISEARCH_URL)%' + api_key: '%env(MEILISEARCH_API_KEY)%' + prefix: '%env(MEILISEARCH_PREFIX)%' + indices: + - name: alias + class: App\Entity\Alias + settings: &default_settings + searchableAttributes: ['name', 'description', 'people'] + filterableAttributes: ['recordType'] + sortableAttributes: ['sortable'] + # https://www.meilisearch.com/docs/reference/api/settings#ranking-rules + # allow prioritizing sort order above score + rankingRules: ["sort", "words", "typo", "proximity", "attribute", "exactness"] + pagination: + maxTotalHits: 10000 + faceting: + maxValuesPerFacet: 10000 + sortFacetValuesBy: + '*': count + + - name: book + class: App\Entity\Book + settings: + <<: *default_settings + searchableAttributes: ['title', 'description', 'location', 'genres', 'contributions', 'publishers'] + filterableAttributes: ['recordType', 'dateYear', 'location'] + + - name: compilation + class: App\Entity\Compilation + settings: + <<: *default_settings + searchableAttributes: ['title', 'description', 'location', 'genres', 'contributions', 'publishers'] + filterableAttributes: ['recordType', 'dateYear', 'location'] + + - name: periodical + class: App\Entity\Periodical + settings: + <<: *default_settings + searchableAttributes: ['title', 'description', 'location', 'genres', 'contributions', 'publishers', 'continuedFrom', 'continuedBy'] + filterableAttributes: ['recordType', 'dateYear', 'location'] + + - name: person + class: App\Entity\Person + settings: + <<: *default_settings + searchableAttributes: ['fullName', 'description', 'birthPlace', 'deathPlace', 'residences', 'aliases'] + filterableAttributes: ['recordType', 'birthDate', 'deathDate'] + + - name: place + class: App\Entity\Place + settings: + <<: *default_settings + sortableAttributes: ['sortable', _geo] + searchableAttributes: ['name', 'country', 'region', 'description'] + filterableAttributes: ['recordType', 'objectID', '_geo', 'country', 'region'] + + - name: publisher + class: App\Entity\Publisher + settings: + <<: *default_settings + searchableAttributes: ['name', 'places'] + filterableAttributes: ['recordType', 'places'] + +when@test: + meilisearch: + prefix: '%env(MEILISEARCH_PREFIX)%test_' diff --git a/config/services.yaml b/config/services.yaml index 4295483f..e1990e1c 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -50,43 +50,26 @@ services: tags: - 'controller.service_arguments' - 'knp_paginator.injectable' - arguments: - - '@fos_elastica.finder.alias' App\Controller\PersonController: tags: - 'controller.service_arguments' - 'knp_paginator.injectable' - arguments: - - '@fos_elastica.finder.person' App\Controller\PlaceController: tags: - 'controller.service_arguments' - 'knp_paginator.injectable' - arguments: - - '@fos_elastica.finder.place' App\Controller\PublisherController: tags: - 'controller.service_arguments' - 'knp_paginator.injectable' - arguments: - - '@fos_elastica.finder.publisher' App\Controller\DefaultController: tags: - 'controller.service_arguments' - 'knp_paginator.injectable' - arguments: - - '@fos_elastica.index_manager' - - '@fos_elastica.elastica_to_model_transformer.alias' - - '@fos_elastica.elastica_to_model_transformer.book' - - '@fos_elastica.elastica_to_model_transformer.compilation' - - '@fos_elastica.elastica_to_model_transformer.periodical' - - '@fos_elastica.elastica_to_model_transformer.person' - - '@fos_elastica.elastica_to_model_transformer.place' - - '@fos_elastica.elastica_to_model_transformer.publisher' App\Menu\Builder: tags: diff --git a/docker-compose.yaml b/docker-compose.yaml index 8e8e77d3..39f33879 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,4 +1,3 @@ -version: '3.8' services: db: container_name: doceww_db @@ -21,18 +20,15 @@ services: interval: 2s retries: 120 - elasticsearch: - container_name: doceww_elasticsearch - image: elasticsearch:8.9.2 + meilisearch: + container_name: doceww_meilisearch + image: getmeili/meilisearch:v1.11.3 ports: - - "9200:9200" - - "9300:9300" + - "7700:7700" volumes: - - .data/elasticsearch:/usr/share/elasticsearch/data + - .data/meilisearch:/meili_data environment: - discovery.type: single-node - xpack.security.enabled: true - ELASTIC_PASSWORD: password + MEILI_MASTER_KEY: password app: container_name: doceww_app diff --git a/src/Controller/.gitignore b/src/Controller/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Controller/AliasController.php b/src/Controller/AliasController.php index 88448f08..2c15d41b 100644 --- a/src/Controller/AliasController.php +++ b/src/Controller/AliasController.php @@ -7,28 +7,23 @@ use App\Entity\Alias; use App\Form\AliasType; use App\Repository\AliasRepository; -use App\Services\ElasticSearchHelper; use Doctrine\ORM\EntityManagerInterface; -use FOS\ElasticaBundle\Finder\PaginatedFinderInterface; use Knp\Bundle\PaginatorBundle\Definition\PaginatorAwareInterface; use Nines\UtilBundle\Controller\PaginatorTrait; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; -use stdClass; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; +use Meilisearch\Bundle\SearchService; +use App\Services\MeilisearchHelper; #[Route(path: '/alias')] class AliasController extends AbstractController implements PaginatorAwareInterface { use PaginatorTrait; - public function __construct( - private PaginatedFinderInterface $finder, - ) {} - #[Route(path: '/', name: 'alias_index', methods: ['GET'])] #[Template] public function index(EntityManagerInterface $em, Request $request) : array { @@ -45,29 +40,27 @@ public function index(EntityManagerInterface $em, Request $request) : array { #[Route(path: '/search', name: 'alias_search', methods: ['GET'])] #[Template] - public function search(Request $request) : array { - $elasticSearchHelper = new ElasticSearchHelper([ - 'queryTermFields' => [ - 'name^2', - 'description^0.5', - 'people.fullName^1.3', - ], - 'sort' => ElasticSearchHelper::generateDefaultSortOrder(), - 'highlights' => [ - 'name' => new stdClass(), - 'description' => new stdClass(), - 'people.fullName' => new stdClass(), - ], - ]); - $query = $elasticSearchHelper->getElasticQuery( - $request->query->get('q'), - $request->query->get('order') - ); - $results = $this->finder->createHybridPaginatorAdapter($query); + public function search(SearchService $searchService, Request $request) : array { + $sortOptions = MeilisearchHelper::getDefaultSortOptions(); + $searchParams = [ + // Pagination is handled by paginator service (not ideal but easier) + 'limit' => 10000, + // Highlights + 'attributesToHighlight' => ["*"], + 'highlightPreTag' => '', + 'highlightPostTag' => '', + // Sorting + 'sort' => MeilisearchHelper::getSort($sortOptions, $request->query->getString('order', '')), + // scoring + // 'rankingScoreThreshold' => 0.2, + 'showRankingScore' => true, + ]; + $searchResults = $searchService->rawSearch(Alias::class, $request->query->get('q') ?? '*', $searchParams); + $results = $this->paginator->paginate($searchResults['hits'], $request->query->getInt('page', 1), $this->getParameter('page_size')); return [ - 'results' => $this->paginator->paginate($results, $request->query->getInt('page', 1), $this->getParameter('page_size')), - 'sortOptions' => ElasticSearchHelper::generateDefaultSortOrder(), + 'results' => $results, + 'sortOptions' => $sortOptions, ]; } diff --git a/src/Controller/DefaultController.php b/src/Controller/DefaultController.php index 9e275bb4..1ff2b394 100644 --- a/src/Controller/DefaultController.php +++ b/src/Controller/DefaultController.php @@ -4,35 +4,24 @@ namespace App\Controller; -use App\Services\ElasticaToModelTransformerCollection; -use App\Services\ElasticSearchHelper; -use App\Services\MultiIndex; -use Elastica\Index; -use FOS\ElasticaBundle\Finder\TransformedFinder; -use FOS\ElasticaBundle\Index\IndexManager; -use FOS\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface; +use App\Entity\Book; +use App\Entity\Periodical; +use App\Entity\Compilation; use Knp\Bundle\PaginatorBundle\Definition\PaginatorAwareInterface; use Nines\UtilBundle\Controller\PaginatorTrait; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; -use stdClass; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; +use Meilisearch\Bundle\SearchService; +use Meilisearch\Client; +use Meilisearch\Contracts\MultiSearchFederation; +use App\Services\MeilisearchHelper; +use Meilisearch\Contracts\SearchQuery; class DefaultController extends AbstractController implements PaginatorAwareInterface { use PaginatorTrait; - public function __construct( - private IndexManager $indexManager, - private ElasticaToModelTransformerInterface $aliasTransformer, - private ElasticaToModelTransformerInterface $bookTransformer, - private ElasticaToModelTransformerInterface $compilationTransformer, - private ElasticaToModelTransformerInterface $periodicalTransformer, - private ElasticaToModelTransformerInterface $personTransformer, - private ElasticaToModelTransformerInterface $placeTransformer, - private ElasticaToModelTransformerInterface $publisherTransformer, - ) {} - #[Route(path: '/', name: 'homepage')] #[Template] public function index() : array { @@ -41,154 +30,117 @@ public function index() : array { #[Route(path: '/search', name: 'search')] #[Template] - public function search(Request $request) : array { - // setup multi index finder - $indices = [ - 'alias' => $this->indexManager->getIndex('alias'), - 'book' => $this->indexManager->getIndex('book'), - 'compilation' => $this->indexManager->getIndex('compilation'), - 'periodical' => $this->indexManager->getIndex('periodical'), - 'person' => $this->indexManager->getIndex('person'), - 'place' => $this->indexManager->getIndex('place'), - 'publisher' => $this->indexManager->getIndex('publisher'), - ]; - $searchable = new MultiIndex($indices['alias']->getClient(), $indices['alias']->getName()); - $searchable->addIndices(array_values($indices)); - - $transformer = new ElasticaToModelTransformerCollection([ - $indices['alias']->getName() => $this->aliasTransformer, - $indices['book']->getName() => $this->bookTransformer, - $indices['compilation']->getName() => $this->compilationTransformer, - $indices['periodical']->getName() => $this->periodicalTransformer, - $indices['person']->getName() => $this->personTransformer, - $indices['place']->getName() => $this->placeTransformer, - $indices['publisher']->getName() => $this->publisherTransformer, - ]); - $finder = new TransformedFinder($searchable, $transformer); - - // setup search query - $elasticSearchHelper = new ElasticSearchHelper([ - 'queryTermFields' => [ - 'name^2.5', - 'fullName^2.5', - 'title^2.5', - 'description^0.5', - 'country^0.2', - 'region^0.5', - 'continuedFrom^0.6', - 'continuedBy^0.6', - - 'genres.label^0.5', - 'aliases.name^1.3', - 'places.name^0.6', - 'people.fullName^1.3', - 'contributions.person.fullName^0.5', - 'location.name^0.5', - 'birthPlace.name^0.4', - 'deathPlace.name^0.4', - 'residences.name^0.3', - ], - 'filters' => [ - 'type' => ElasticSearchHelper::generateTermFilter('_index'), - ], - 'sort' => ElasticSearchHelper::generateDefaultSortOrder(), - 'highlights' => [ - 'name' => new stdClass(), - 'fullName' => new stdClass(), - 'title' => new stdClass(), - 'description' => new stdClass(), - 'country' => new stdClass(), - 'region' => new stdClass(), - 'continuedFrom' => new stdClass(), - 'continuedBy' => new stdClass(), - - 'genres.label' => new stdClass(), - 'aliases.name' => new stdClass(), - 'places.name' => new stdClass(), - 'people.fullName' => new stdClass(), - 'contributions.person.fullName' => new stdClass(), - 'location.name' => new stdClass(), - 'birthPlace.name' => new stdClass(), - 'deathPlace.name' => new stdClass(), - 'residences.name' => new stdClass(), - ], - ]); - $query = $elasticSearchHelper->getElasticQuery( - $request->query->get('q'), - $request->query->get('order'), - $request->query->all('filters') - ); - $results = $finder->createHybridPaginatorAdapter($query); - + public function search(Client $client, SearchService $searchService, Request $request) : array { + $config = $searchService->getConfiguration(); + $searchFilters = []; + $queries = []; + $facetsByIndex = []; + + $sortOptions = MeilisearchHelper::getDefaultSortOptions(); + $filters = $request->query->all('filters'); + if (array_key_exists('recordType', $filters)) { + $searchFilters[] = MeilisearchHelper::generateTermFilter('recordType', $filters['recordType']); + } + + $indexes = ['book', 'person', 'periodical', 'alias', 'place', 'publisher', 'compilation']; + foreach ($indexes as $index) { + $queries[] = (new SearchQuery()) + ->setIndexUid($config['prefix'] . $index) + ->setQuery($request->query->get('q') ?? '*') + // Highlights + ->setAttributesToHighlight(['*']) + ->setHighlightPreTag('') + ->setHighlightPostTag('') + // Sorting + ->setSort(MeilisearchHelper::getSort($sortOptions, $request->query->getString('order', '')) ?? []) + // Filtering + ->setFilter($searchFilters) + // Scoring + // ->setRankingScoreThreshold(0.2) + ->setShowRankingScore(true); + $facetsByIndex[$config['prefix'] . $index] = ['recordType']; + } + $multiSearchFederation = new MultiSearchFederation(); + // Pagination is handled by paginator service (not ideal but easier) + $multiSearchFederation->setLimit(10000); + // Facets + $multiSearchFederation->setFacetsByIndex($facetsByIndex); + $multiSearchFederation->setMergeFacets([ 'maxValuesPerFacet' => 10000 ]); + + // Run search + $searchResults = $client->multiSearch($queries, $multiSearchFederation); + $results = $this->paginator->paginate($searchResults['hits'], $request->query->getInt('page', 1), $this->getParameter('page_size')); + // fix sort order for record type + arsort($searchResults['facetDistribution']['recordType'], SORT_NUMERIC); return [ - 'results' => $this->paginator->paginate($results, $request->query->getInt('page', 1), $this->getParameter('page_size')), - 'sortOptions' => ElasticSearchHelper::generateDefaultSortOrder(), + 'results' => $results, + 'searchResults' => $searchResults, + 'facetDistribution' => $searchResults['facetDistribution'], + 'sortOptions' => $sortOptions, ]; - - // $qb->setHighlightFields([ - // 'continuedFrom', 'continuedBy']); } #[Route(path: '/search_title', name: 'search_title')] #[Template] - public function searchTitle(Request $request) : array { - // setup multi index finder - $indices = [ - 'book' => $this->indexManager->getIndex('book'), - 'compilation' => $this->indexManager->getIndex('compilation'), - 'periodical' => $this->indexManager->getIndex('periodical'), + public function searchTitle(Client $client, SearchService $searchService, Request $request) : array { + $config = $searchService->getConfiguration(); + $searchFilters = []; + $queries = []; + $facetsByIndex = []; + + $sortOptions = MeilisearchHelper::getDefaultSortOptions(); + $rangeFilters = [ + 'dateYear' => MeilisearchHelper::rangeFilter(1750, (int) date('Y'), 50), ]; - $searchable = new MultiIndex($indices['book']->getClient(), $indices['book']->getName()); - $searchable->addIndices(array_values($indices)); - - $transformer = new ElasticaToModelTransformerCollection([ - $indices['book']->getName() => $this->bookTransformer, - $indices['compilation']->getName() => $this->compilationTransformer, - $indices['periodical']->getName() => $this->periodicalTransformer, - ]); - $finder = new TransformedFinder($searchable, $transformer); - - // setup search query - $elasticSearchHelper = new ElasticSearchHelper([ - 'queryTermFields' => [ - 'title^2.5', - 'description^0.5', - 'location.name^0.5', - 'genres.label^0.5', - 'contributions.person.fullName^0.5', - 'publishers.name^0.4', - 'continuedFrom^0.6', - 'continuedBy^0.6', - ], - 'filters' => [ - 'publicationLocation' => ElasticSearchHelper::generateTermFilter('location.nameFacet'), - 'type' => ElasticSearchHelper::generateTermFilter('_index'), - ], - 'rangeFilters' => [ - 'publicationDate' => ElasticSearchHelper::generateRangeFilter('dateYear.year', 1750, (int) date('Y'), 50), - ], - 'sort' => ElasticSearchHelper::generateDefaultSortOrder(), - 'highlights' => [ - 'title' => new stdClass(), - 'description' => new stdClass(), - 'location.name' => new stdClass(), - 'genres.label' => new stdClass(), - 'contributions.person.fullName' => new stdClass(), - 'publishers.name' => new stdClass(), - 'continuedFrom' => new stdClass(), - 'continuedBy' => new stdClass(), - ], - ]); - $query = $elasticSearchHelper->getElasticQuery( - $request->query->get('q'), - $request->query->get('order'), - $request->query->all('filters') - ); - $results = $finder->createHybridPaginatorAdapter($query); + $filters = $request->query->all('filters'); + if (array_key_exists('dateYear', $filters)) { + $searchFilters[] = MeilisearchHelper::generateRangeFilter('dateYear', $rangeFilters['dateYear'], $filters['dateYear']); + } + if (array_key_exists('location', $filters)) { + $searchFilters[] = MeilisearchHelper::generateTermFilter('location', $filters['location']); + } + if (array_key_exists('recordType', $filters)) { + $searchFilters[] = MeilisearchHelper::generateTermFilter('recordType', $filters['recordType']); + } + + $indexes = ['book', 'periodical', 'compilation']; + foreach ($indexes as $index) { + $queries[] = (new SearchQuery()) + ->setIndexUid($config['prefix'] . $index) + ->setQuery($request->query->get('q') ?? '*') + // Highlights + ->setAttributesToHighlight(['*']) + ->setHighlightPreTag('') + ->setHighlightPostTag('') + // Sorting + ->setSort(MeilisearchHelper::getSort($sortOptions, $request->query->getString('order', '')) ?? []) + // Filtering + ->setFilter($searchFilters) + // Scoring + // ->setRankingScoreThreshold(0.2) + ->setShowRankingScore(true); + $facetsByIndex[$config['prefix'] . $index] = ['*']; + } + $multiSearchFederation = new MultiSearchFederation(); + // Pagination is handled by paginator service (not ideal but easier) + $multiSearchFederation->setLimit(10000); + // Facets + $multiSearchFederation->setFacetsByIndex($facetsByIndex); + $multiSearchFederation->setMergeFacets([ 'maxValuesPerFacet' => 10000 ]); + + // Run search + $searchResults = $client->multiSearch($queries, $multiSearchFederation); + $results = $this->paginator->paginate($searchResults['hits'], $request->query->getInt('page', 1), $this->getParameter('page_size')); + $searchResults['facetDistribution']['dateYear'] = MeilisearchHelper::addRangeFilterCounts($rangeFilters['dateYear'], $searchResults['facetDistribution']['dateYear']); + // fix sort order for location and record type + arsort($searchResults['facetDistribution']['recordType'], SORT_NUMERIC); + arsort($searchResults['facetDistribution']['location'], SORT_NUMERIC); return [ - 'results' => $this->paginator->paginate($results, $request->query->getInt('page', 1), $this->getParameter('page_size')), - 'sortOptions' => ElasticSearchHelper::generateDefaultSortOrder(), + 'results' => $results, + 'searchResults' => $searchResults, + 'facetDistribution' => $searchResults['facetDistribution'], + 'sortOptions' => $sortOptions, ]; } diff --git a/src/Controller/PersonController.php b/src/Controller/PersonController.php index 19eb50fd..d25e53a3 100644 --- a/src/Controller/PersonController.php +++ b/src/Controller/PersonController.php @@ -8,29 +8,24 @@ use App\Form\PersonType; use App\Repository\PersonRepository; use App\Repository\PublisherRepository; -use App\Services\ElasticSearchHelper; use Doctrine\ORM\EntityManagerInterface; -use FOS\ElasticaBundle\Finder\PaginatedFinderInterface; use Knp\Bundle\PaginatorBundle\Definition\PaginatorAwareInterface; use Nines\UtilBundle\Controller\PaginatorTrait; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; -use stdClass; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; +use Meilisearch\Bundle\SearchService; +use App\Services\MeilisearchHelper; #[Route(path: '/person')] class PersonController extends AbstractController implements PaginatorAwareInterface { use PaginatorTrait; - public function __construct( - private PaginatedFinderInterface $finder, - ) {} - #[Route(path: '/', name: 'person_index', methods: ['GET'])] #[Template] public function index(EntityManagerInterface $em, Request $request) : array { @@ -97,40 +92,48 @@ public function typeahead(PersonRepository $personRepository, Request $request) #[Route(path: '/search', name: 'person_search')] #[Template] - public function search(Request $request) : array { - $elasticSearchHelper = new ElasticSearchHelper([ - 'queryTermFields' => [ - 'fullName^2.5', - 'description^0.5', - 'birthPlace.name^0.4', - 'deathPlace.name^0.4', - 'residences.name^0.3', - 'aliases.name^1.3', - ], - 'rangeFilters' => [ - 'birthDate' => ElasticSearchHelper::generateRangeFilter('birthDate.year', 1750, (int) date('Y'), 50), - 'deathDate' => ElasticSearchHelper::generateRangeFilter('deathDate.year', 1750, (int) date('Y'), 50), - ], - 'sort' => ElasticSearchHelper::generateDefaultSortOrder(), - 'highlights' => [ - 'fullName' => new stdClass(), - 'description' => new stdClass(), - 'birthPlace.name' => new stdClass(), - 'deathPlace.name' => new stdClass(), - 'residences.name' => new stdClass(), - 'aliases.name' => new stdClass(), - ], - ]); - $query = $elasticSearchHelper->getElasticQuery( - $request->query->get('q'), - $request->query->get('order'), - $request->query->all('filters') - ); - $results = $this->finder->createHybridPaginatorAdapter($query); + public function search(SearchService $searchService, Request $request) : array { + $sortOptions = MeilisearchHelper::getDefaultSortOptions(); + $rangeFilters = [ + 'birthDate' => MeilisearchHelper::rangeFilter(1750, (int) date('Y'), 50), + 'deathDate' => MeilisearchHelper::rangeFilter(1750, (int) date('Y'), 50), + ]; + $searchParams = [ + // Pagination is handled by paginator service (not ideal but easier) + 'limit' => 10000, + // Highlights + 'attributesToHighlight' => ["*"], + 'highlightPreTag' => '', + 'highlightPostTag' => '', + // Sorting + 'sort' => MeilisearchHelper::getSort($sortOptions, $request->query->getString('order', '')), + // Filtering + 'filter' => [], + // Scoring + // 'rankingScoreThreshold' => 0.2, + 'showRankingScore' => true, + // Facets + 'facets' => ['*'], + ]; + $filters = $request->query->all('filters'); + if (array_key_exists('birthDate', $filters)) { + $searchParams['filter'][] = MeilisearchHelper::generateRangeFilter('birthDate', $rangeFilters['birthDate'], $filters['birthDate']); + } + if (array_key_exists('deathDate', $filters)) { + $searchParams['filter'][] = MeilisearchHelper::generateRangeFilter('deathDate', $rangeFilters['deathDate'], $filters['deathDate']); + } + + // Run search + $searchResults = $searchService->rawSearch(Person::class, $request->query->get('q') ?? '*', $searchParams); + $results = $this->paginator->paginate($searchResults['hits'], $request->query->getInt('page', 1), $this->getParameter('page_size')); + + $searchResults['facetDistribution']['birthDate'] = MeilisearchHelper::addRangeFilterCounts($rangeFilters['birthDate'], $searchResults['facetDistribution']['birthDate']); + $searchResults['facetDistribution']['deathDate'] = MeilisearchHelper::addRangeFilterCounts($rangeFilters['deathDate'], $searchResults['facetDistribution']['deathDate']); return [ - 'results' => $this->paginator->paginate($results, $request->query->getInt('page', 1), $this->getParameter('page_size')), - 'sortOptions' => ElasticSearchHelper::generateDefaultSortOrder(), + 'results' => $results, + 'facetDistribution' => $searchResults['facetDistribution'], + 'sortOptions' => $sortOptions, ]; } diff --git a/src/Controller/PlaceController.php b/src/Controller/PlaceController.php index 8ef3de94..9add9e29 100644 --- a/src/Controller/PlaceController.php +++ b/src/Controller/PlaceController.php @@ -7,29 +7,24 @@ use App\Entity\Place; use App\Form\PlaceType; use App\Repository\PlaceRepository; -use App\Services\ElasticSearchHelper; use App\Services\Merger; use Doctrine\ORM\EntityManagerInterface; -use FOS\ElasticaBundle\Finder\PaginatedFinderInterface; use Knp\Bundle\PaginatorBundle\Definition\PaginatorAwareInterface; use Nines\UtilBundle\Controller\PaginatorTrait; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; -use stdClass; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; +use Meilisearch\Bundle\SearchService; +use App\Services\MeilisearchHelper; #[Route(path: '/place')] class PlaceController extends AbstractController implements PaginatorAwareInterface { use PaginatorTrait; - public function __construct( - private PaginatedFinderInterface $finder, - ) {} - #[Route(path: '/', name: 'place_index', methods: ['GET'])] #[Template] public function index(EntityManagerInterface $em, Request $request) : array { @@ -64,36 +59,41 @@ public function typeahead(Request $request, PlaceRepository $repo) : JsonRespons #[Route(path: '/search', name: 'place_search')] #[Template] - public function search(Request $request) : array { - $elasticSearchHelper = new ElasticSearchHelper([ - 'queryTermFields' => [ - 'name^2.0', - 'country^0.2', - 'region^0.5', - 'description^0.5', - ], - 'filters' => [ - 'country' => ElasticSearchHelper::generateTermFilter('countryFacet'), - 'region' => ElasticSearchHelper::generateTermFilter('regionFacet'), - ], - 'sort' => ElasticSearchHelper::generateDefaultSortOrder(), - 'highlights' => [ - 'name' => new stdClass(), - 'country' => new stdClass(), - 'region' => new stdClass(), - 'description' => new stdClass(), - ], - ]); - $query = $elasticSearchHelper->getElasticQuery( - $request->query->get('q'), - $request->query->get('order'), - $request->query->all('filters') - ); - $results = $this->finder->createHybridPaginatorAdapter($query); + public function search(SearchService $searchService, Request $request) : array { + $sortOptions = MeilisearchHelper::getDefaultSortOptions(); + $searchParams = [ + // Pagination is handled by paginator service (not ideal but easier) + 'limit' => 10000, + // Highlights + 'attributesToHighlight' => ["*"], + 'highlightPreTag' => '', + 'highlightPostTag' => '', + // Sorting + 'sort' => MeilisearchHelper::getSort($sortOptions, $request->query->getString('order', '')), + // Filtering + 'filter' => [], + // Scoring + // 'rankingScoreThreshold' => 0.2, + 'showRankingScore' => true, + // Facets + 'facets' => ['*'], + ]; + $filters = $request->query->all('filters'); + if (array_key_exists('country', $filters)) { + $searchParams['filter'][] = MeilisearchHelper::generateTermFilter('country', $filters['country']); + } + if (array_key_exists('region', $filters)) { + $searchParams['filter'][] = MeilisearchHelper::generateTermFilter('region', $filters['region']); + } + + // Run search + $searchResults = $searchService->rawSearch(Place::class, $request->query->get('q') ?? '*', $searchParams); + $results = $this->paginator->paginate($searchResults['hits'], $request->query->getInt('page', 1), $this->getParameter('page_size')); return [ - 'results' => $this->paginator->paginate($results, $request->query->getInt('page', 1), $this->getParameter('page_size')), - 'sortOptions' => ElasticSearchHelper::generateDefaultSortOrder(), + 'results' => $results, + 'facetDistribution' => $searchResults['facetDistribution'], + 'sortOptions' => $sortOptions, ]; } @@ -122,39 +122,22 @@ public function new(EntityManagerInterface $em, Request $request) : array|Redire #[Route(path: '/{id}', name: 'place_show', methods: ['GET'])] #[Template] - public function show(Request $request, PlaceRepository $placeRepository, Place $place) : array { + public function show(SearchService $searchService, Request $request, PlaceRepository $placeRepository, Place $place) : array { $nearbyResults = null; if ($place->getCoordinates()) { - $elasticSearchHelper = new ElasticSearchHelper([ - 'sort' => [ - '_geo_distance' => [ - 'field' => '_geo_distance', - 'label' => '', - 'options' => [ - 'coordinates' => $place->getCoordinates(), - 'order' => 'asc', - 'unit' => 'km', - 'mode' => 'min', - 'distance_type' => 'arc', - 'ignore_unmapped' => true, - ], - ], - ], - 'excludeValues' => [ - '_id' => [$place->getId()], - ], - 'queryGeoDistanceFields' => [ - 'coordinates' => [ - 'distance' => '50km', - 'location' => $place->getCoordinates(), - 'excludeIds' => $place->getId(), - ], - ], - ]); - $query = $elasticSearchHelper->getElasticQuery(null, '_geo_distance'); - $results = $this->finder->createHybridPaginatorAdapter($query); - $nearbyResults = $this->paginator->paginate($results, $request->query->getInt('page', 1), $this->getParameter('page_size')); + $geoPoint = $place->getCoordinates(); + $searchParams = [ + // Pagination is handled by paginator service (not ideal but easier) + 'limit' => 10000, + // Sorting + 'sort' => ["_geoPoint({$geoPoint}):asc"], + // Filtering + 'filter' => ["objectID != {$place->getId()}", "_geoRadius({$geoPoint}, 50000)"], + ]; + // Run search + $searchResults = $searchService->rawSearch(Place::class, '*', $searchParams); + $nearbyResults = $this->paginator->paginate($searchResults['hits'], $request->query->getInt('page', 1), $this->getParameter('page_size')); } return [ diff --git a/src/Controller/PublisherController.php b/src/Controller/PublisherController.php index 1052f631..ac2bdc00 100644 --- a/src/Controller/PublisherController.php +++ b/src/Controller/PublisherController.php @@ -8,29 +8,24 @@ use App\Form\PublisherType; use App\Repository\PersonRepository; use App\Repository\PublisherRepository; -use App\Services\ElasticSearchHelper; use App\Services\Merger; use Doctrine\ORM\EntityManagerInterface; -use FOS\ElasticaBundle\Finder\PaginatedFinderInterface; use Knp\Bundle\PaginatorBundle\Definition\PaginatorAwareInterface; use Nines\UtilBundle\Controller\PaginatorTrait; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; -use stdClass; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; +use Meilisearch\Bundle\SearchService; +use App\Services\MeilisearchHelper; #[Route(path: '/publisher')] class PublisherController extends AbstractController implements PaginatorAwareInterface { use PaginatorTrait; - public function __construct( - private PaginatedFinderInterface $finder, - ) {} - #[Route(path: '/', name: 'publisher_index', methods: ['GET'])] #[Template] public function index(EntityManagerInterface $em, Request $request) : array { @@ -65,31 +60,38 @@ public function typeahead(Request $request, PublisherRepository $repo) : JsonRes #[Route(path: '/search', name: 'publisher_search')] #[Template] - public function search(Request $request) : array { - $elasticSearchHelper = new ElasticSearchHelper([ - 'queryTermFields' => [ - 'name^2.0', - 'places.name^0.6', - ], - 'filters' => [ - 'places' => ElasticSearchHelper::generateTermFilter('places.nameFacet'), - ], - 'sort' => ElasticSearchHelper::generateDefaultSortOrder(), - 'highlights' => [ - 'name' => new stdClass(), - 'places.name' => new stdClass(), - ], - ]); - $query = $elasticSearchHelper->getElasticQuery( - $request->query->get('q'), - $request->query->get('order'), - $request->query->all('filters') - ); - $results = $this->finder->createHybridPaginatorAdapter($query); + public function search(SearchService $searchService, Request $request) : array { + $sortOptions = MeilisearchHelper::getDefaultSortOptions(); + $searchParams = [ + // Pagination is handled by paginator service (not ideal but easier) + 'limit' => 10000, + // Highlights + 'attributesToHighlight' => ["*"], + 'highlightPreTag' => '', + 'highlightPostTag' => '', + // Sorting + 'sort' => MeilisearchHelper::getSort($sortOptions, $request->query->getString('order', '')), + // Filtering + 'filter' => [], + // Scoring + // 'rankingScoreThreshold' => 0.2, + 'showRankingScore' => true, + // Facets + 'facets' => ['*'], + ]; + $filters = $request->query->all('filters'); + if (array_key_exists('places', $filters)) { + $searchParams['filter'][] = MeilisearchHelper::generateTermFilter('places', $filters['places']); + } + + // Run search + $searchResults = $searchService->rawSearch(Publisher::class, $request->query->get('q') ?? '*', $searchParams); + $results = $this->paginator->paginate($searchResults['hits'], $request->query->getInt('page', 1), $this->getParameter('page_size')); return [ - 'results' => $this->paginator->paginate($results, $request->query->getInt('page', 1), $this->getParameter('page_size')), - 'sortOptions' => ElasticSearchHelper::generateDefaultSortOrder(), + 'results' => $results, + 'facetDistribution' => $searchResults['facetDistribution'], + 'sortOptions' => $sortOptions, ]; } diff --git a/src/Entity/.gitignore b/src/Entity/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Entity/Alias.php b/src/Entity/Alias.php index fe803f7c..58dd6529 100644 --- a/src/Entity/Alias.php +++ b/src/Entity/Alias.php @@ -9,15 +9,14 @@ use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; -use FOS\ElasticaBundle\Transformer\HighlightableModelInterface; use Nines\UtilBundle\Entity\AbstractEntity; +use Symfony\Component\Serializer\Normalizer\NormalizableInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'alias')] #[ORM\Index(columns: ['name'], flags: ['fulltext'])] #[ORM\Entity(repositoryClass: AliasRepository::class)] -class Alias extends AbstractEntity implements HighlightableModelInterface { - use HasHighlights; - +class Alias extends AbstractEntity implements NormalizableInterface { #[ORM\Column(type: Types::STRING, length: 100, nullable: false)] private ?string $name = null; @@ -162,4 +161,17 @@ public function getMarried(?bool $yesNo = false) : bool|string|null { return $this->married; } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + return [ + 'recordType' => 'Alias', + 'name' => $this->getName(), + 'sortable' => $this->getSortableName(), + 'description' => $this->getDescriptionSanitized(), + 'people' => array_unique(array_map(function ($person) { + return $person->getFullName(); + }, $this->getPeople()->toArray())), + ]; + } } diff --git a/src/Entity/Book.php b/src/Entity/Book.php index cd21396e..ecc2f374 100644 --- a/src/Entity/Book.php +++ b/src/Entity/Book.php @@ -6,6 +6,7 @@ use App\Repository\BookRepository; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'book')] #[ORM\Entity(repositoryClass: BookRepository::class)] @@ -13,4 +14,11 @@ class Book extends Publication { public function getCategory() : string { return self::BOOK; } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + $results = parent::normalize($serializer, $format, $context); + $results['recordType'] = 'Book'; + return $results; + } } diff --git a/src/Entity/Compilation.php b/src/Entity/Compilation.php index aaf11ec5..4a056402 100644 --- a/src/Entity/Compilation.php +++ b/src/Entity/Compilation.php @@ -6,6 +6,7 @@ use App\Repository\CompilationRepository; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'collection')] #[ORM\Entity(repositoryClass: CompilationRepository::class)] @@ -13,4 +14,11 @@ class Compilation extends Publication { public function getCategory() : string { return self::COMPILATION; } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + $results = parent::normalize($serializer, $format, $context); + $results['recordType'] = 'Compilation'; + return $results; + } } diff --git a/src/Entity/HasHighlights.php b/src/Entity/HasHighlights.php deleted file mode 100644 index 7d31740f..00000000 --- a/src/Entity/HasHighlights.php +++ /dev/null @@ -1,25 +0,0 @@ -getShortName(); - } - - public function setElasticHighlights(array $highlights) : self { - $this->highlights = $highlights; - - return $this; - } - - public function getElasticHighlights() : array { - return $this->highlights; - } -} diff --git a/src/Entity/Periodical.php b/src/Entity/Periodical.php index db665e87..2d014294 100644 --- a/src/Entity/Periodical.php +++ b/src/Entity/Periodical.php @@ -7,6 +7,7 @@ use App\Repository\PeriodicalRepository; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'periodical')] #[ORM\Entity(repositoryClass: PeriodicalRepository::class)] @@ -53,4 +54,13 @@ public function getContinuedBy() : ?string { public function getCategory() : string { return self::PERIODICAL; } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + $results = parent::normalize($serializer, $format, $context); + $results['recordType'] = 'Periodical'; + $results['continuedFrom'] = $this->getContinuedFrom(); + $results['continuedBy'] = $this->getContinuedBy(); + return $results; + } } diff --git a/src/Entity/Person.php b/src/Entity/Person.php index 779cb76d..79f99b57 100644 --- a/src/Entity/Person.php +++ b/src/Entity/Person.php @@ -9,16 +9,17 @@ use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; -use FOS\ElasticaBundle\Transformer\HighlightableModelInterface; use Nines\MediaBundle\Entity\LinkableInterface; use Nines\MediaBundle\Entity\LinkableTrait; use Nines\UtilBundle\Entity\AbstractEntity; +use Symfony\Component\Serializer\Normalizer\NormalizableInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'person')] #[ORM\Index(columns: ['full_name'], flags: ['fulltext'])] #[ORM\Index(columns: ['sortable_name'])] #[ORM\Entity(repositoryClass: PersonRepository::class)] -class Person extends AbstractEntity implements LinkableInterface, HighlightableModelInterface { +class Person extends AbstractEntity implements LinkableInterface, NormalizableInterface { use HasContributions { HasContributions::__construct as private trait_constructor; getContributions as private traitContributions; @@ -26,7 +27,6 @@ class Person extends AbstractEntity implements LinkableInterface, HighlightableM use LinkableTrait { LinkableTrait::__construct as private link_constructor; } - use HasHighlights; public const MALE = 'm'; @@ -307,4 +307,24 @@ public function setCanadian(?bool $canadian = null) : self { public function getCanadian() : ?bool { return $this->canadian; } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + return [ + 'recordType' => 'Person', + 'fullName' => $this->getFullName(), + 'sortable' => $this->getSortableName(), + 'description' => $this->getDescriptionSanitized(), + 'birthDate' => $this->getBirthDate()?->getYear(), + 'birthPlace' => $this->getBirthPlace()?->getName(), + 'deathDate' => $this->getDeathDate()?->getYear(), + 'deathPlace' => $this->getDeathPlace()?->getName(), + 'residences' => array_unique(array_map(function ($place) { + return $place->getName(); + }, $this->getResidences()->toArray())), + 'aliases' => array_unique(array_map(function ($alias) { + return $alias->getName(); + }, $this->getAliases()->toArray())), + ]; + } } diff --git a/src/Entity/Place.php b/src/Entity/Place.php index 9f8c1a98..b61e121e 100644 --- a/src/Entity/Place.php +++ b/src/Entity/Place.php @@ -9,18 +9,18 @@ use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; -use FOS\ElasticaBundle\Transformer\HighlightableModelInterface; use Nines\UtilBundle\Entity\AbstractEntity; +use Symfony\Component\Serializer\Normalizer\NormalizableInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'place')] #[ORM\Index(columns: ['name', 'country_name'], flags: ['fulltext'])] #[ORM\Index(columns: ['sortable_name'], flags: ['fulltext'])] #[ORM\Entity(repositoryClass: PlaceRepository::class)] -class Place extends AbstractEntity implements HighlightableModelInterface { +class Place extends AbstractEntity implements NormalizableInterface { use HasPublications { HasPublications::__construct as private trait_constructor; } - use HasHighlights; #[ORM\Column(type: Types::STRING, length: 250, nullable: false)] private ?string $name = null; @@ -351,4 +351,23 @@ public function getCoordinates() : ?string { return null; } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + $data = [ + 'recordType' => 'Place', + 'name' => $this->getName(), + 'sortable' => $this->getSortableName(), + 'region' => $this->getRegionName(), + 'country' => $this->getCountryName(), + 'description' => $this->getDescriptionSanitized(), + ]; + if ($this->getCoordinates()) { + $data['_geo'] = [ + 'lat' => $this->getLatitude(), + 'lng' => $this->getLongitude(), + ]; + } + return $data; + } } diff --git a/src/Entity/Publication.php b/src/Entity/Publication.php index daeec74f..f2e9a368 100644 --- a/src/Entity/Publication.php +++ b/src/Entity/Publication.php @@ -9,10 +9,11 @@ use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; -use FOS\ElasticaBundle\Transformer\HighlightableModelInterface; use Nines\MediaBundle\Entity\LinkableInterface; use Nines\MediaBundle\Entity\LinkableTrait; use Nines\UtilBundle\Entity\AbstractEntity; +use Symfony\Component\Serializer\Normalizer\NormalizableInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'publication')] #[ORM\Index(columns: ['title'], flags: ['fulltext'])] @@ -22,14 +23,13 @@ #[ORM\InheritanceType('JOINED')] #[ORM\DiscriminatorColumn(name: 'category', type: 'string', length: 64)] #[ORM\DiscriminatorMap(['book' => 'Book', 'compilation' => 'Compilation', 'periodical' => 'Periodical'])] -abstract class Publication extends AbstractEntity implements LinkableInterface, HighlightableModelInterface { +abstract class Publication extends AbstractEntity implements LinkableInterface, NormalizableInterface { use HasContributions { HasContributions::__construct as private trait_constructor; } use LinkableTrait { LinkableTrait::__construct as private link_constructor; } - use HasHighlights; public const BOOK = 'book'; @@ -170,7 +170,7 @@ public function setNotes(?string $notes) : self { return $this; } - public function appendNote(string $note) : self { + public function appendNote(?string $note) : self { if ( ! $this->notes) { $this->notes = $note; } else { @@ -280,4 +280,25 @@ public function setPublishers(Collection|array $publishers) : void { $this->publishers = $publishers; } } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + return [ + 'recordType' => 'Publication', + 'title' => $this->getTitle(), + 'sortable' => $this->getSortableTitle(), + 'description' => $this->getDescriptionSanitized(), + 'dateYear' => $this->getDateYear()?->getYear(), + 'location' => $this->getLocation()?->getName(), + 'genres' => array_unique(array_map(function ($genre) { + return $genre->getLabel(); + }, $this->getGenres()->toArray())), + 'contributions' => array_unique(array_map(function ($contribution) { + return $contribution->getPerson()->getFullName(); + }, $this->getContributions())), + 'publishers' => array_unique(array_map(function ($publisher) { + return $publisher->getName(); + }, $this->getPublishers()->toArray())), + ]; + } } diff --git a/src/Entity/Publisher.php b/src/Entity/Publisher.php index f2b4e352..46ad9eb5 100644 --- a/src/Entity/Publisher.php +++ b/src/Entity/Publisher.php @@ -9,17 +9,17 @@ use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; -use FOS\ElasticaBundle\Transformer\HighlightableModelInterface; use Nines\UtilBundle\Entity\AbstractEntity; +use Symfony\Component\Serializer\Normalizer\NormalizableInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[ORM\Table(name: 'publisher')] #[ORM\Index(columns: ['name'], flags: ['fulltext'])] #[ORM\Entity(repositoryClass: PublisherRepository::class)] -class Publisher extends AbstractEntity implements HighlightableModelInterface { +class Publisher extends AbstractEntity implements NormalizableInterface { use HasPublications { HasPublications::__construct as private trait_constructor; } - use HasHighlights; #[ORM\Column(type: Types::STRING, length: 100, nullable: false)] private ?string $name = null; @@ -113,4 +113,16 @@ public function removePublication(Publication $publication) : self { return $this; } + + public function normalize(NormalizerInterface $serializer, ?string $format = null, array $context = []): array + { + return [ + 'recordType' => 'Publisher', + 'name' => $this->getName(), + 'sortable' => $this->getName(), + 'places' => array_unique(array_map(function ($place) { + return $place->getName(); + }, $this->getPlaces()->toArray())), + ]; + } } diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Services/ElasticSearchHelper.php b/src/Services/ElasticSearchHelper.php deleted file mode 100644 index 0ce40325..00000000 --- a/src/Services/ElasticSearchHelper.php +++ /dev/null @@ -1,166 +0,0 @@ - $field, - 'size' => $size, - ]; - } - - public static function generateRangeFilter(string $field, int $start, int $end, int $gap, bool $includePreStart = false, bool $includePostEnd = false) : array { - $ranges = []; - if ($includePreStart) { - $ranges[] = ['to' => $start - 1]; - } - foreach (range($start, $end, $gap) as $from) { - $to = $from + $gap - 1; - $ranges[] = [ - 'from' => $from, - 'to' => $to < $end ? $to : $end, - ]; - } - if ($includePostEnd) { - $ranges[] = ['from' => $end + 1]; - } - - return [ - 'field' => $field, - 'ranges' => $ranges, - ]; - } - - public static function generateDefaultSortOrder() : array { - return [ - '_score' => [ - 'field' => '_score', - 'label' => 'Relevance', - 'options' => 'desc', - ], - 'sortable_asc' => [ - 'field' => 'sortable', - 'label' => 'Name (A to Z)', - 'options' => 'asc', - ], - 'sortable_desc' => [ - 'field' => 'sortable', - 'label' => 'Name (Z to A)', - 'options' => 'desc', - ], - ]; - } - - public function getElasticQuery(?string $q = null, ?string $sortKey = null, array $searchFilters = []) : Query { - // search query - $boolQuery = new Query\BoolQuery(); - - // query term fields - if (array_key_exists('queryTermFields', $this->elasticSearchOptions)) { - $keywordQuery = new Query\QueryString($q ? $q : '*'); - $keywordQuery->setDefaultOperator('or'); - $keywordQuery->setFields($this->elasticSearchOptions['queryTermFields']); - $boolQuery->addShould($keywordQuery); - } - - // geo search - foreach ($this->elasticSearchOptions['queryGeoDistanceFields'] ?? [] as $field => $options) { - $distanceFilter = new Query\GeoDistance($field, $options['location'], $options['distance']); - $boolQuery->addFilter($distanceFilter); - } - - // exclude values - if (array_key_exists('excludeValues', $this->elasticSearchOptions)) { - foreach ($this->elasticSearchOptions['excludeValues'] as $field => $terms) { - $termsQuery = new Query\Terms($field, $terms); - $boolQuery->addMustNot($termsQuery); - } - } - - // overall query - $query = new Query($boolQuery); - - // highlights - $query->setTrackScores(true); - if (array_key_exists('highlights', $this->elasticSearchOptions)) { - $query->setHighlight([ - 'pre_tags' => '', - 'post_tags' => '', - 'number_of_fragments' => 1, - 'fields' => $this->elasticSearchOptions['highlights'], - ]); - } - - // sorting - if (array_key_exists($sortKey ?? '', $this->elasticSearchOptions['sort'] ?? [])) { - $sortField = $this->elasticSearchOptions['sort'][$sortKey]; - $options = $sortField['options'] ?? []; - $query->setSort([$sortField['field'] => $options]); - } - - $boolPostFilterQuery = new Query\BoolQuery(); - $hasPostFilter = false; - if (array_key_exists('rangeFilters', $this->elasticSearchOptions)) { - foreach ($this->elasticSearchOptions['rangeFilters'] as $name => $rangeFilter) { - $aggregation = new Aggregation\Range($name); - $aggregation->setField($rangeFilter['field']); - $aggregation->setParam('ranges', $rangeFilter['ranges']); - $query->addAggregation($aggregation); - - if (array_key_exists($name, $searchFilters)) { - $boolRangeFilterQuery = new Query\BoolQuery(); - - $rangeIndexes = $searchFilters[$name]; - foreach ($rangeIndexes as $rangeIndex) { - if (array_key_exists($rangeIndex, $rangeFilter['ranges'])) { - $rangeValues = $rangeFilter['ranges'][$rangeIndex]; - $filter = []; - if (array_key_exists('from', $rangeValues)) { - $filter['gte'] = $rangeValues['from']; - } - if (array_key_exists('to', $rangeValues)) { - $filter['lte'] = $rangeValues['to']; - } - $rangeQuery = new Query\Range($rangeFilter['field'], $filter); - $boolRangeFilterQuery->addShould($rangeQuery); - } - } - $hasPostFilter = true; - $boolPostFilterQuery->addMust($boolRangeFilterQuery); - } - } - } - if (array_key_exists('filters', $this->elasticSearchOptions)) { - foreach ($this->elasticSearchOptions['filters'] as $name => $filter) { - $aggregation = new Aggregation\Terms($name); - $aggregation->setField($filter['field']); - $aggregation->setSize($filter['size']); - $aggregation->setOrder('_count', 'desc'); - $aggregation->setMinimumDocumentCount(1); - $query->addAggregation($aggregation); - - if (array_key_exists($name, $searchFilters)) { - $boolRangeFilterQuery = new Query\BoolQuery(); - $termsQuery = new Query\Terms($filter['field'], $searchFilters[$name]); - $hasPostFilter = true; - $boolPostFilterQuery->addMust($termsQuery); - } - } - } - if ($hasPostFilter) { - $query->setPostFilter($boolPostFilterQuery); - } - - return $query; - } -} diff --git a/src/Services/ElasticaToModelTransformerCollection.php b/src/Services/ElasticaToModelTransformerCollection.php deleted file mode 100644 index cb858219..00000000 --- a/src/Services/ElasticaToModelTransformerCollection.php +++ /dev/null @@ -1,73 +0,0 @@ -transformers = $transformers; - } - - public function getObjectClass() : string { - return implode(',', array_map(fn (ElasticaToModelTransformerInterface $transformer) => $transformer->getObjectClass(), $this->transformers)); - } - - public function getIdentifierField() : string { - return array_map(fn (ElasticaToModelTransformerInterface $transformer) => $transformer->getIdentifierField(), $this->transformers)[0]; - } - - public function transform(array $elasticaObjects) { - $sorted = []; - foreach ($elasticaObjects as $object) { - $sorted[$object->getIndex()][] = $object; - } - - $transformed = []; - foreach ($sorted as $type => $objects) { - $transformedObjects = $this->transformers[$type]->transform($objects); - $identifierGetter = 'get' . ucfirst($this->transformers[$type]->getIdentifierField()); - $transformed[$type] = array_combine( - array_map( - fn ($o) => $o->{$identifierGetter}(), - $transformedObjects - ), - $transformedObjects - ); - } - - $result = []; - foreach ($elasticaObjects as $object) { - if (array_key_exists((string) $object->getId(), $transformed[$object->getIndex()])) { - $result[] = $transformed[$object->getIndex()][(string) $object->getId()]; - } - } - - return $result; - } - - public function hybridTransform(array $elasticaObjects) { - $objects = $this->transform($elasticaObjects); - - $result = []; - for ($i = 0, $j = count($elasticaObjects); $i < $j; $i++) { - if ( ! isset($objects[$i])) { - continue; - } - $result[] = new HybridResult($elasticaObjects[$i], $objects[$i]); - } - - return $result; - } -} diff --git a/src/Services/MeilisearchHelper.php b/src/Services/MeilisearchHelper.php new file mode 100644 index 00000000..f63684be --- /dev/null +++ b/src/Services/MeilisearchHelper.php @@ -0,0 +1,194 @@ + null, 'Name (A to Z)' => 'sortable:asc', 'Name (Z to A)' => 'sortable:desc']; + } + public static function getSort(array $sortOptions, string $order) : ?array { + if (in_array($order, array_values($sortOptions)) && $order) { + return [$order]; + } + return null; + } + + + public static function generateTermFilter(string $fieldName, array $terms) : array { + $filters = []; + foreach ($terms as $term) { + $filters[] = "({$fieldName} = '{$term}')"; + } + return $filters; + } + + public static function rangeFilter(int $start, int $end, int $gap, bool $includePreStart = false, bool $includePostEnd = false) : array { + $ranges = []; + if ($includePreStart) { + $ranges[] = [ + 'to' => $start - 1, + ]; + } + foreach (range($start, $end, $gap) as $from) { + $to = $from + $gap - 1; + if ($to > $end) { + $to = $end; + } + $ranges[] = [ + 'from' => $from, + 'to' => $to, + ]; + } + if ($includePostEnd) { + $ranges[] = [ + 'from' => $end + 1, + ]; + } + + return $ranges; + } + + public static function generateRangeFilter(string $fieldName, array $ranges, array $selectedIndexes) : array { + $filters = []; + foreach ($selectedIndexes as $selectedIndex) { + if (array_key_exists($selectedIndex, $ranges)) { + $range = $ranges[$selectedIndex]; + if (array_key_exists('from', $range) && array_key_exists('to', $range)) { + $filters[] = "({$fieldName} <= {$range['to']} AND {$fieldName} >= {$range['from']})"; + } elseif (array_key_exists('to', $range)) { + $filters[] = "({$fieldName} <= {$range['to']})"; + } elseif (array_key_exists('from', $range)) { + $filters[] = "({$fieldName} <= {$range['from']})"; + } + } + } + return $filters; + } + + public static function addRangeFilterCounts(array $ranges, array $values) : array { + $in_range = function(?int $to, ?int $from, int $value) : bool { + if (!is_null($to) && $to < $value) { + return false; + } + if (!is_null($from) && $from > $value) { + return false; + } + return true; + }; + + foreach ($ranges as $index=>$range) { + $ranges[$index]['count'] = array_sum(array_filter( + $values, + fn(int $key) => $in_range($range['to'] ?? null, $range['from'] ?? null, $key), + ARRAY_FILTER_USE_KEY + )); + } + return $ranges; + } + + + // public function getElasticQuery(?string $q = null, ?string $sortKey = null, array $searchFilters = []) : Query { + // // search query + // $boolQuery = new Query\BoolQuery(); + + // // query term fields + // if (array_key_exists('queryTermFields', $this->elasticSearchOptions)) { + // $keywordQuery = new Query\QueryString($q ? $q : '*'); + // $keywordQuery->setDefaultOperator('or'); + // $keywordQuery->setFields($this->elasticSearchOptions['queryTermFields']); + // $boolQuery->addShould($keywordQuery); + // } + + // // geo search + // foreach ($this->elasticSearchOptions['queryGeoDistanceFields'] ?? [] as $field => $options) { + // $distanceFilter = new Query\GeoDistance($field, $options['location'], $options['distance']); + // $boolQuery->addFilter($distanceFilter); + // } + + // // exclude values + // if (array_key_exists('excludeValues', $this->elasticSearchOptions)) { + // foreach ($this->elasticSearchOptions['excludeValues'] as $field => $terms) { + // $termsQuery = new Query\Terms($field, $terms); + // $boolQuery->addMustNot($termsQuery); + // } + // } + + // // overall query + // $query = new Query($boolQuery); + + // // highlights + // $query->setTrackScores(true); + // if (array_key_exists('highlights', $this->elasticSearchOptions)) { + // $query->setHighlight([ + // 'pre_tags' => '', + // 'post_tags' => '', + // 'number_of_fragments' => 1, + // 'fields' => $this->elasticSearchOptions['highlights'], + // ]); + // } + + // // sorting + // if (array_key_exists($sortKey ?? '', $this->elasticSearchOptions['sort'] ?? [])) { + // $sortField = $this->elasticSearchOptions['sort'][$sortKey]; + // $options = $sortField['options'] ?? []; + // $query->setSort([$sortField['field'] => $options]); + // } + + // $boolPostFilterQuery = new Query\BoolQuery(); + // $hasPostFilter = false; + // if (array_key_exists('rangeFilters', $this->elasticSearchOptions)) { + // foreach ($this->elasticSearchOptions['rangeFilters'] as $name => $rangeFilter) { + // $aggregation = new Aggregation\Range($name); + // $aggregation->setField($rangeFilter['field']); + // $aggregation->setParam('ranges', $rangeFilter['ranges']); + // $query->addAggregation($aggregation); + + // if (array_key_exists($name, $searchFilters)) { + // $boolRangeFilterQuery = new Query\BoolQuery(); + + // $rangeIndexes = $searchFilters[$name]; + // foreach ($rangeIndexes as $rangeIndex) { + // if (array_key_exists($rangeIndex, $rangeFilter['ranges'])) { + // $rangeValues = $rangeFilter['ranges'][$rangeIndex]; + // $filter = []; + // if (array_key_exists('from', $rangeValues)) { + // $filter['gte'] = $rangeValues['from']; + // } + // if (array_key_exists('to', $rangeValues)) { + // $filter['lte'] = $rangeValues['to']; + // } + // $rangeQuery = new Query\Range($rangeFilter['field'], $filter); + // $boolRangeFilterQuery->addShould($rangeQuery); + // } + // } + // $hasPostFilter = true; + // $boolPostFilterQuery->addMust($boolRangeFilterQuery); + // } + // } + // } + // if (array_key_exists('filters', $this->elasticSearchOptions)) { + // foreach ($this->elasticSearchOptions['filters'] as $name => $filter) { + // $aggregation = new Aggregation\Terms($name); + // $aggregation->setField($filter['field']); + // $aggregation->setSize($filter['size']); + // $aggregation->setOrder('_count', 'desc'); + // $aggregation->setMinimumDocumentCount(1); + // $query->addAggregation($aggregation); + + // if (array_key_exists($name, $searchFilters)) { + // $boolRangeFilterQuery = new Query\BoolQuery(); + // $termsQuery = new Query\Terms($filter['field'], $searchFilters[$name]); + // $hasPostFilter = true; + // $boolPostFilterQuery->addMust($termsQuery); + // } + // } + // } + // if ($hasPostFilter) { + // $query->setPostFilter($boolPostFilterQuery); + // } + + // return $query; + // } +} diff --git a/src/Services/MultiIndex.php b/src/Services/MultiIndex.php deleted file mode 100644 index 3662d5d3..00000000 --- a/src/Services/MultiIndex.php +++ /dev/null @@ -1,51 +0,0 @@ -getName(); - } - - if ( ! is_scalar($index)) { - throw new InvalidException('Invalid param type'); - } - - $this->_indices[] = (string) $index; - - return $this; - } - - public function addIndices(array $indices = []) : self { - foreach ($indices as $index) { - $this->addIndex($index); - } - - return $this; - } - - public function getIndices() : array { - return $this->_indices; - } - - public function createSearch($query = '', $options = null, ?BuilderInterface $builder = null) : Search { - $search = new Search($this->getClient(), $builder); - // $search->addIndex($this); - $search->addIndices($this->getIndices()); - $search->setOptionsAndQuery($options, $query); - - return $search; - } -} diff --git a/symfony.lock b/symfony.lock index 85a002a4..684e151f 100644 --- a/symfony.lock +++ b/symfony.lock @@ -160,18 +160,6 @@ "friendsofphp/proxy-manager-lts": { "version": "v1.0.2" }, - "friendsofsymfony/elastica-bundle": { - "version": "6.3", - "recipe": { - "repo": "github.com/symfony/recipes-contrib", - "branch": "main", - "version": "5.0", - "ref": "46c9cd2c1e07f0fcfd97e96f12b03b2e0845c4cd" - }, - "files": [ - "config/packages/fos_elastica.yaml" - ] - }, "friendsoftwig/twigcs": { "version": "v5.1.0" }, @@ -211,6 +199,18 @@ "laminas/laminas-code": { "version": "4.0.0" }, + "meilisearch/search-bundle": { + "version": "0.15", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "0.10", + "ref": "f0730f97441a5391832fb176305f69abe86b70a3" + }, + "files": [ + "config/packages/meilisearch.yaml" + ] + }, "monolog/monolog": { "version": "1.25.3" }, @@ -244,6 +244,18 @@ "php-cs-fixer/diff": { "version": "v2.0.2" }, + "php-http/discovery": { + "version": "1.20", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "1.18", + "ref": "f45b5dd173a27873ab19f5e3180b2f661c21de02" + }, + "files": [ + "config/packages/http_discovery.yaml" + ] + }, "php-http/message-factory": { "version": "v1.0.2" }, @@ -603,9 +615,6 @@ "symfony/polyfill-php72": { "version": "v1.13.1" }, - "symfony/polyfill-php73": { - "version": "v1.13.1" - }, "symfony/polyfill-php80": { "version": "v1.17.0" }, diff --git a/templates/alias/search.html.twig b/templates/alias/search.html.twig index a06b4d5e..574c93be 100644 --- a/templates/alias/search.html.twig +++ b/templates/alias/search.html.twig @@ -30,11 +30,8 @@ } %}
- {% include 'search/partial/list.html.twig' with { - 'results': results, - } %} + {% include 'search/partial/results.html.twig' with { 'results': results } %}
- {% endblock %} diff --git a/templates/book/index.html.twig b/templates/book/index.html.twig index 5b88d1a6..6e333431 100644 --- a/templates/book/index.html.twig +++ b/templates/book/index.html.twig @@ -21,7 +21,7 @@ {% endif %}
- +
diff --git a/templates/compilation/index.html.twig b/templates/compilation/index.html.twig index d8aba455..1cc60689 100644 --- a/templates/compilation/index.html.twig +++ b/templates/compilation/index.html.twig @@ -21,7 +21,7 @@
{% endif %} - +
diff --git a/templates/default/search.html.twig b/templates/default/search.html.twig index fbed8ea6..e1b131ab 100644 --- a/templates/default/search.html.twig +++ b/templates/default/search.html.twig @@ -21,7 +21,6 @@ {% endif %}
-
{% include 'search/partial/order.html.twig' with { @@ -30,15 +29,12 @@ } %} {% include 'search/partial/filter.html.twig' with { 'header': 'Record Type', - 'filterName': 'type', - 'buckets': results.customParameters.aggregations.type.buckets, - 'capitalize': true, + 'filterName': 'recordType', + 'terms': facetDistribution.recordType, } %}
- {% include 'search/partial/list.html.twig' with { - 'results': results, - } %} + {% include 'search/partial/results.html.twig' with { 'results': results } %}
diff --git a/templates/default/search_title.html.twig b/templates/default/search_title.html.twig index 2d56f954..4b28b6a7 100644 --- a/templates/default/search_title.html.twig +++ b/templates/default/search_title.html.twig @@ -30,25 +30,22 @@ } %} {% include 'search/partial/filter.html.twig' with { 'header': 'Record Type', - 'filterName': 'type', - 'buckets': results.customParameters.aggregations.type.buckets, - 'capitalize': true, + 'filterName': 'recordType', + 'terms': facetDistribution.recordType, } %} {% include 'search/partial/range_filter.html.twig' with { 'header': 'Date of Publication', - 'filterName': 'publicationDate', - 'buckets': results.customParameters.aggregations.publicationDate.buckets, + 'filterName': 'dateYear', + 'ranges': facetDistribution.dateYear, } %} {% include 'search/partial/filter.html.twig' with { 'header': 'Place of Publication', - 'filterName': 'publicationLocation', - 'buckets': results.customParameters.aggregations.publicationLocation.buckets, + 'filterName': 'location', + 'terms': facetDistribution.location, } %}
- {% include 'search/partial/list.html.twig' with { - 'results': results, - } %} + {% include 'search/partial/results.html.twig' with { 'results': results } %}
diff --git a/templates/misc/search-footer.html.twig b/templates/misc/search-footer.html.twig deleted file mode 100644 index 93b3ed41..00000000 --- a/templates/misc/search-footer.html.twig +++ /dev/null @@ -1,5 +0,0 @@ -{% if q %} - -{% endif %} diff --git a/templates/misc/search-form.html.twig b/templates/misc/search-form.html.twig deleted file mode 100644 index 2285e42f..00000000 --- a/templates/misc/search-form.html.twig +++ /dev/null @@ -1,20 +0,0 @@ -{# empty Twig template #} -
-
- Search -
- -
-
- - - - -
-
-
-
-
diff --git a/templates/misc/search-header.html.twig b/templates/misc/search-header.html.twig deleted file mode 100644 index 3053ad01..00000000 --- a/templates/misc/search-header.html.twig +++ /dev/null @@ -1,13 +0,0 @@ -{% if q %} - {% block callback %} -

- Displaying {{ results|length }} search - {% if results|length == 1 %} - result - {% else %} - results - {% endif %} - of {{ results.getTotalItemCount }} total. -

- {% endblock %} -{% endif %} diff --git a/templates/periodical/index.html.twig b/templates/periodical/index.html.twig index 2576905d..a7127fd9 100644 --- a/templates/periodical/index.html.twig +++ b/templates/periodical/index.html.twig @@ -23,7 +23,7 @@
- +
diff --git a/templates/person/search.html.twig b/templates/person/search.html.twig index e28ed617..9da63c92 100644 --- a/templates/person/search.html.twig +++ b/templates/person/search.html.twig @@ -31,18 +31,16 @@ {% include 'search/partial/range_filter.html.twig' with { 'header': 'Birth Date', 'filterName': 'birthDate', - 'buckets': results.customParameters.aggregations.birthDate.buckets, + 'ranges': facetDistribution.birthDate, } %} {% include 'search/partial/range_filter.html.twig' with { 'header': 'Death Date', 'filterName': 'deathDate', - 'buckets': results.customParameters.aggregations.deathDate.buckets, + 'ranges': facetDistribution.deathDate, } %}
- {% include 'search/partial/list.html.twig' with { - 'results': results, - } %} + {% include 'search/partial/results.html.twig' with { 'results': results } %}
diff --git a/templates/place/search.html.twig b/templates/place/search.html.twig index 5cf19751..ef67ffa9 100644 --- a/templates/place/search.html.twig +++ b/templates/place/search.html.twig @@ -31,18 +31,16 @@ {% include 'search/partial/filter.html.twig' with { 'header': 'Country', 'filterName': 'country', - 'buckets': results.customParameters.aggregations.country.buckets, + 'terms': facetDistribution.country, } %} {% include 'search/partial/filter.html.twig' with { 'header': 'Region', 'filterName': 'region', - 'buckets': results.customParameters.aggregations.region.buckets, + 'terms': facetDistribution.region, } %}
- {% include 'search/partial/list.html.twig' with { - 'results': results, - } %} + {% include 'search/partial/results.html.twig' with { 'results': results } %}
diff --git a/templates/place/show.html.twig b/templates/place/show.html.twig index ce32d734..ba1e13a9 100644 --- a/templates/place/show.html.twig +++ b/templates/place/show.html.twig @@ -78,14 +78,12 @@ {% if nearbyResults %} diff --git a/templates/publisher/search.html.twig b/templates/publisher/search.html.twig index 6dcde563..eec8d4a3 100644 --- a/templates/publisher/search.html.twig +++ b/templates/publisher/search.html.twig @@ -31,13 +31,11 @@ {% include 'search/partial/filter.html.twig' with { 'header': 'Place', 'filterName': 'places', - 'buckets': results.customParameters.aggregations.places.buckets, + 'terms': facetDistribution.places, } %}
- {% include 'search/partial/list.html.twig' with { - 'results': results, - } %} + {% include 'search/partial/results.html.twig' with { 'results': results } %}
diff --git a/templates/search/partial/filter.html.twig b/templates/search/partial/filter.html.twig index 376f1066..3a6896af 100644 --- a/templates/search/partial/filter.html.twig +++ b/templates/search/partial/filter.html.twig @@ -1,23 +1,22 @@ {# @var string header #} {# @var string name #} -{# @var buckets array #} -{# @var boolean capitalize #} +{# @var terms array #} {% set query_params = app.request.query.all %}

{{ header }}

-{% if buckets|length > 10 %} +{% if terms|length > 10 %}
- And {{ (buckets|length) - 10 }} more. + And {{ (terms|length) - 10 }} more.
{% endif %} diff --git a/templates/search/partial/list.html.twig b/templates/search/partial/list.html.twig deleted file mode 100644 index 0bd47f4d..00000000 --- a/templates/search/partial/list.html.twig +++ /dev/null @@ -1,35 +0,0 @@ -{# @var results array #} -

Results

-

- {% if results.getPageCount > 0 %} - {{ results.getTotalItemCount ~ ' ' ~ (q ? 'found' : 'total') }}. - Showing page {{ results.getCurrentPageNumber }} of {{ results.getPageCount }} with results from {{ results.getPaginationData.firstItemNumber }} to {{ results.getPaginationData.lastItemNumber }}. - {% else %} - No results found. - {% endif %} -

-
- {% for hybridResult in results %} - {% set result = hybridResult.result %} - {% set entity = hybridResult.transformed %} - - - {{ entity.entityClassName }}: {{ entity }}
- {% for field, highlights in entity.elasticHighlights %} -
- {{ field|split('.')|first|capitalize }}: - {% for highlight in highlights %} - {{ highlight|raw }}
- {% endfor %} -
- {% endfor %} - - {% if is_granted('ROLE_USER') %} -

{{ result.score }}

- {% endif %} -
- {% endfor %} -
- \ No newline at end of file diff --git a/templates/search/partial/order.html.twig b/templates/search/partial/order.html.twig index 3a19f42a..159abedb 100644 --- a/templates/search/partial/order.html.twig +++ b/templates/search/partial/order.html.twig @@ -3,9 +3,9 @@ {% set query_params = app.request.query.all %}

{{ header }}

diff --git a/templates/search/partial/range_filter.html.twig b/templates/search/partial/range_filter.html.twig index 8748f9e0..cfa73685 100644 --- a/templates/search/partial/range_filter.html.twig +++ b/templates/search/partial/range_filter.html.twig @@ -4,14 +4,14 @@ {% set query_params = app.request.query.all %}

{{ header }}