diff --git a/.env b/.env index 8597c75..daf980d 100644 --- a/.env +++ b/.env @@ -74,6 +74,7 @@ MAILER_DSN=null://null # This is main the DNS that is used by the notifier component # the other below are just example for two different third party vendors #SMS_DSN=twilio://SID:TOKEN@default?from=FROM +#SMS_DSN=brevo://API_KEY@default?sender=SENDER SMS_DSN=null://null ###< symfony/notifier ### @@ -106,3 +107,7 @@ STORAGE_USE_PATH_STYLE_ENDPOINT=true STORAGE_KEY=app STORAGE_SECRET=!ChangeMe! ###< league/flysystem-bundle ### + +###> symfony/brevo-notifier ### +# BREVO_DSN=brevo://API_KEY@default?sender=SENDER +###< symfony/brevo-notifier ### diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49c0df0..8bebfe9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,6 +51,6 @@ jobs: - name: Twig Linter run: docker compose exec -T php ./vendor/bin/twigcs templates/ --exclude vendor - name: Install eslint - run: docker run --rm -w "/usr/app" -v "${PWD}":/usr/app gmolaire/yarn yarn add eslint + run: docker run --rm -w "/usr/app" -v "${PWD}":/usr/app gmolaire/yarn yarn add eslint@8.57.0 - name: Run eslint on javascript files run: docker run --rm -w "/usr/app" -v "${PWD}":/usr/app gmolaire/yarn yarn lint diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7b66316..0244cc7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,12 +3,20 @@ name: Deploy on: workflow_call: secrets: + kubeconfig: + description: kubeconfig stored as a base64 encrypted secret + required: true domain: description: Main project deploy domain used in URLs required: true payum-apikey: description: Payum API Key required: true + sms-dsn: + description: SMS DSN + required: true + mailer-dsn: + description: MAILER DSN storage-key: description: storage key required: true @@ -117,6 +125,8 @@ jobs: --set=ingress.tls[0].secretName=${{ needs.meta.outputs.release_name }}-tls \ --set=ingress.tls[0].hosts[0]=${{ vars.DOMAIN }} \ --set=postgresql.url="${{ secrets.database-url }}" \ + --set=postgresql.enabled='${{ github.event_name == 'pull_request' }}' \ + --set=sms.dsn="${{ secrets.sms-dsn }}" \ --set=payum.apikey="${{ secrets.payum-apikey }}" \ --set=mailer.dsn="${{ secrets.mailer-dsn }}" \ --set=php.storage.bucket="${{ vars.STORAGE_BUCKET }}" \ diff --git a/Dockerfile b/Dockerfile index becedd2..bc3bb4c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ # https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact ARG PHP_VERSION=8.1 -ARG CADDY_VERSION=2 +ARG CADDY_VERSION=2.8.4 # yarn build FROM gmolaire/yarn AS yarn_build @@ -24,7 +24,7 @@ RUN yarn build FROM php:${PHP_VERSION}-fpm-alpine AS app_php # needed for security update until base image is updated -RUN apk upgrade libcurl curl openssl openssl-dev libressl libcrypto3 libssl3 +#RUN apk upgrade libcurl curl openssl openssl-dev libressl libcrypto3 libssl3 # Allow to use development versions of Symfony ARG STABILITY="stable" @@ -188,7 +188,7 @@ RUN rm -f .env.local.php # Temporary fix for https://github.com/dunglas/mercure/issues/770 # https://github.com/dunglas/symfony-docker/pull/407/files -FROM caddy:2.7-builder-alpine AS app_caddy_builder +FROM caddy:2.8.4-builder-alpine AS app_caddy_builder # RUN xcaddy build \ # --with github.com/dunglas/mercure \ @@ -204,7 +204,7 @@ RUN xcaddy build \ FROM caddy:${CADDY_VERSION} AS app_caddy # needed for security update until base image is updated -RUN apk upgrade libcurl curl openssl openssl-dev libressl libcrypto1.1 libssl1.1 libcrypto3 libssl3 +#RUN apk upgrade libcurl curl openssl openssl-dev libressl libcrypto1.1 libssl1.1 libcrypto3 libssl3 WORKDIR /srv/app diff --git a/assets/admin.js b/assets/admin.js new file mode 100644 index 0000000..b3e40e5 --- /dev/null +++ b/assets/admin.js @@ -0,0 +1,8 @@ +import { startStimulusApp } from '@symfony/stimulus-bridge' +import AdminParentgroup from './controllers/admin_parentgroup_controller' + +import './styles/admin.css' + +const app = startStimulusApp() + +app.register('admin-parentgroup', AdminParentgroup) diff --git a/assets/controllers.json b/assets/controllers.json index 1f6fc3a..e077eb3 100644 --- a/assets/controllers.json +++ b/assets/controllers.json @@ -6,6 +6,7 @@ "fetch": "eager", "autoimport": { "tom-select/dist/css/tom-select.default.css": true, + "tom-select/dist/css/tom-select.bootstrap4.css": false, "tom-select/dist/css/tom-select.bootstrap5.css": false } } diff --git a/assets/controllers/admin_parentgroup_controller.js b/assets/controllers/admin_parentgroup_controller.js new file mode 100644 index 0000000..9d6638d --- /dev/null +++ b/assets/controllers/admin_parentgroup_controller.js @@ -0,0 +1,241 @@ +import { Controller} from '@hotwired/stimulus' + +/* stimulusFetch: 'lazy' */ +export default class extends Controller { + static targets = ['servicesEnabledField', 'parentField', 'idField', 'ownerField'] + + connect() { + const parentFields = document.querySelectorAll('[data-label="Parent"]') + const trs = Array.from(parentFields) + .map(e => e.firstElementChild) + .filter(e => e.tagName === 'A') + .map(e => e.closest('tr')) + for (const tr of trs) { + this.checkDisabledServices(tr) + } + } + + parentFieldTargetConnected(element) { + // edit page + const parentGroupId = element.value + const servicesEnabledToggle = document.getElementById('Group_servicesEnabled') + this.checkGroupEditDisableServices(parentGroupId, servicesEnabledToggle) + + element.addEventListener('change', () => { + const newParentGroupId = element.value + this.checkGroupEditDisableServices(newParentGroupId, servicesEnabledToggle) + }) + + // list page + const observer = new MutationObserver( ( ) => { + if (element.tomselect) { + observer.disconnect() + + const toggle = document.getElementById('Group_servicesEnabled') + toggle.addEventListener('change', () => { + this.updateParentOptions(toggle.checked, this.parentFieldTarget) + }) + } + }) + observer.observe(element, {attributes: true}) + } + + async updateParentOptions(servicesEnabled, parentField) { + const url = `/api/groups?services_enabled=${servicesEnabled}` + + const response = await fetch(url, { method: 'GET' }) + if (!response.ok) { + return + } + const data = await response.json() + const groups = data['hydra:member'] + + // Remove options + parentField.tomselect.clearOptions() + + // Populate with new options + groups.map(group => { + parentField.tomselect.addOption(new Option(group.name, group.id)) + }) + } + + servicesEnabledFieldTargetConnected() { + this.servicesEnabledFieldTarget.addEventListener('change', () => { + if(!this.servicesEnabledFieldTarget.checked) { + const params = new URLSearchParams(this.servicesEnabledFieldTarget.getAttribute('data-toggle-url')) + this.disableServicesForChildGroups(params.get('entityId')) + } + const parentFields = document.querySelectorAll('[data-label="Parent"]') + const trs = Array.from(parentFields) + .map(e => e.firstElementChild) + .filter(e => e.tagName === 'A') + .map(e => e.closest('tr')) + for (const tr of trs) { + this.checkDisabledServices(tr) + } + }) + } + + ownerFieldTargetConnected() { + const initialUserId = this.ownerFieldTarget.value + const groupsField = document.getElementById('Product_groups') + this.replaceGroups(initialUserId, groupsField) + this.ownerFieldTarget.addEventListener('change', () => { + const userId = this.ownerFieldTarget.value + + this.replaceGroups(userId, groupsField) + }) + } + + async checkDisabledServices(tr) { + const id = tr.getAttribute('data-id') + const url = `/api/groups/${id}` + + const response = await fetch(url, {method: 'GET'}) + if (!response.ok) { + return + } + const group = await response.json() + + let disabledTr = false + for (const parentUrl of group.parentsRecursively) { + const parentResponse = await fetch(parentUrl, { method: 'GET' }) + if (!response.ok) { + return + } + const parent = await parentResponse.json() + if (!parent.servicesEnabled) { + tr.querySelector('[data-admin-parentgroup-target="servicesEnabledField"]').disabled = true + disabledTr = true + break + } + } + if (!disabledTr) { + tr.querySelector('[data-admin-parentgroup-target="servicesEnabledField"]').disabled = false + } + } + + async disableServicesForChildGroups(groupId) { + const url = `/api/groups/${groupId}/disable_child_services` + + const response = await fetch(url, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/merge-patch+json', + }, + }) + if (!response.ok) { + return + } + const data = await response.json() + const groupChild = data.childrenRecursively + + const groupChildId = groupChild.map(group => { + return group.split('/')[3] + }) + + const allToggles = document.querySelectorAll('[data-admin-parentgroup-target="servicesEnabledField"]') + Array.from(allToggles).map(toggle => { + const params = new URLSearchParams(toggle.getAttribute('data-toggle-url')) + if(groupChildId.includes(params.get('entityId'))) { + toggle.checked = false + toggle.disabled = true + } + }) + + } + + async replaceGroups(userId, groupsField) { + const url = `/api/groups?user=${userId}&services_enabled=true&admin=0` + const response = await fetch(url, {method: 'GET'}) + if (!response.ok) { + return + } + const data = await response.json() + const groups = data['hydra:member'] + + const parentDiv = groupsField.parentElement + const smallElement = parentDiv.querySelector('small') + + const saveContinue = document.getElementsByClassName('action-saveAndContinue')[0] + const saveReturn = document.getElementsByClassName('action-saveAndReturn')[0] + const saveAdd = document.getElementsByClassName('action-saveAndAddAnother')[0] + + + groupsField.tomselect.clear() + groupsField.tomselect.clearOptions() + if (groups.length === 0) { + groupsField.tomselect.disable() + groupsField.tomselect.lock() + // show helper + if (null !== smallElement) { + smallElement.style.visibility = 'visible' + } + if (undefined !== saveContinue) { + saveContinue.disabled = true + } + if (undefined !== saveAdd) { + saveAdd.disabled = true + } + saveReturn.disabled = true + } else { + groups.map(group => { + groupsField.tomselect.addOption(new Option(group.name, group.id)) + }) + groupsField.tomselect.enable() + groupsField.tomselect.unlock() + + // remove helper + if (null !== smallElement) { + smallElement.style.visibility = 'hidden' + } + if (undefined !== saveContinue) { + saveContinue.disabled = false + } + if (undefined !== saveAdd) { + saveAdd.disabled = false + } + saveReturn.disabled = false + } + } + + async checkGroupEditDisableServices(parentGroupId, servicesEnabledToggle) { + const url = `/api/groups/${parentGroupId}` + + const response = await fetch(url, {method: 'GET'}) + if (!response.ok) { + return + } + const parentGroup = await response.json() + let parentAll = parentGroup.parentsRecursively + parentAll.push(parentGroup['@id']) + + const parentDiv = servicesEnabledToggle.parentElement.parentElement + const smallElement = parentDiv.querySelector('small') + + let disabled = false + for (const parentUrl of parentAll) { + const parentResponse = await fetch(parentUrl, { method: 'GET' }) + if (!response.ok) { + return + } + const parent = await parentResponse.json() + if (!parent.servicesEnabled) { + servicesEnabledToggle.checked = false + servicesEnabledToggle.disabled = true + if (null !== smallElement) { + smallElement.style.visibility = 'visible' + } + disabled = true + break + } + } + + if (!disabled) { + servicesEnabledToggle.disabled = false + if (null !== smallElement) { + smallElement.style.visibility = 'hidden' + } + } + } +} diff --git a/assets/controllers/parentgroup_controller.js b/assets/controllers/parentgroup_controller.js new file mode 100644 index 0000000..b5577c1 --- /dev/null +++ b/assets/controllers/parentgroup_controller.js @@ -0,0 +1,36 @@ +import { Controller} from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['servicesEnabledField', 'parentField'] + + connect() { + } + + updateParentOptions() { + const userId = this.servicesEnabledFieldTarget.getAttribute('data-user-id') + const servicesEnabled = this.servicesEnabledFieldTarget.checked + + const url = `/api/groups?user=${userId}&services_enabled=${servicesEnabled}` + this.addGroupsWithEnabledServices(url) + } + + async addGroupsWithEnabledServices(url) { + const response = await fetch(url, { method: 'GET' }) + if (!response.ok) { + return + } + const data = await response.json() + const groups = data['hydra:member'] + + // Remove options and set a default value + Array.from(this.parentFieldTarget.options).map((group) => { + this.parentFieldTarget.remove(group) + }) + this.parentFieldTarget.add(new Option()) + + // Populate with new options + groups.map(group => { + this.parentFieldTarget.add(new Option(group.name, group.id)) + }) + } +} diff --git a/assets/stimulus.js b/assets/stimulus.js index c02d609..352bda5 100644 --- a/assets/stimulus.js +++ b/assets/stimulus.js @@ -1,5 +1,4 @@ import { startStimulusApp } from '@symfony/stimulus-bridge' -import { Application } from '@hotwired/stimulus' import PasswordVisibility from 'stimulus-password-visibility' import Carousel from 'stimulus-carousel' @@ -15,7 +14,5 @@ export const app = startStimulusApp(require.context( // register any custom, 3rd party controllers here // app.register('some_controller_name', SomeImportedController); -const application = Application.start() -application.register('carousel', Carousel) -application.register('password-visibility', PasswordVisibility) - +app.register('carousel', Carousel) +app.register('password-visibility', PasswordVisibility) diff --git a/assets/styles/_product.scss b/assets/styles/_product.scss index 528883b..8472e7c 100644 --- a/assets/styles/_product.scss +++ b/assets/styles/_product.scss @@ -45,7 +45,7 @@ } &.less { - max-height: 500px; + max-height: 1000px; transition: max-height .3s ease-in-out; } } diff --git a/assets/styles/_utilities.scss b/assets/styles/_utilities.scss index 9aab182..a9bde42 100644 --- a/assets/styles/_utilities.scss +++ b/assets/styles/_utilities.scss @@ -109,30 +109,13 @@ } } -p > strong { - > a { +.page-content { + a { color: $blue-500;; - position: relative; text-decoration: none; - transition: .5s; - - &:after { - background-color: $blue-500; - content: ""; - height: 2px; - left: 0; - position: absolute; - top: 100%; - transform: scaleX(0); - transform-origin: right; - transition: transform .5s; - width: 100%; - } - - &:hover:after { - transform: scaleX(1); - transform-origin: left; - } + } + a:hover { + text-decoration: underline; } } diff --git a/assets/styles/admin.css b/assets/styles/admin.css new file mode 100644 index 0000000..5862dac --- /dev/null +++ b/assets/styles/admin.css @@ -0,0 +1,4 @@ +/* Remove the extra arrow added by Tom Select */ +.ts-wrapper.single .ts-control:after { + display: none; +} diff --git a/assets/styles/app.css b/assets/styles/app.css new file mode 100644 index 0000000..dd6181a --- /dev/null +++ b/assets/styles/app.css @@ -0,0 +1,3 @@ +body { + background-color: skyblue; +} diff --git a/composer.json b/composer.json index 8f02a41..3b87a6d 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "type": "project", "license": "MIT", "description": "APES : Platforme d'échange de services et de biens", - "minimum-stability": "stable", + "minimum-stability": "beta", "prefer-stable": true, "repositories": { "coopTilleuls/payum-mollie": { @@ -44,50 +44,53 @@ "odolbeau/phone-number-bundle": "^3.9", "payum/offline": "^1.7", "payum/payum-bundle": "^2.5", + "php-http/message": "^1.16", + "php-http/message-factory": "^1.1", "phpdocumentor/reflection-docblock": "^5.3", "phpstan/phpdoc-parser": "^1.11", - "sensio/framework-extra-bundle": "^6.2", "snc/redis-bundle": "^4.3", "stof/doctrine-extensions-bundle": "^1.7", - "symfony/asset": "6.2.*", - "symfony/cache": "6.2.*", - "symfony/clock": "6.2.*", - "symfony/console": "6.2.*", - "symfony/doctrine-messenger": "6.2.*", - "symfony/dotenv": "6.2.*", - "symfony/expression-language": "6.2.*", - "symfony/fake-sms-notifier": "6.2.*", + "symfony/asset": "6.4.*", + "symfony/brevo-notifier": "6.4.*", + "symfony/cache": "6.4.*", + "symfony/clock": "6.4.*", + "symfony/console": "6.4.*", + "symfony/doctrine-messenger": "6.4.*", + "symfony/dotenv": "6.4.*", + "symfony/expression-language": "6.4.*", + "symfony/fake-sms-notifier": "6.4.*", "symfony/flex": "^2", - "symfony/form": "6.2.*", - "symfony/framework-bundle": "6.2.*", - "symfony/google-mailer": "6.2.*", - "symfony/html-sanitizer": "6.2.*", - "symfony/http-client": "6.2.*", - "symfony/mailer": "6.2.*", + "symfony/form": "6.4.*", + "symfony/framework-bundle": "6.4.*", + "symfony/google-mailer": "6.4.*", + "symfony/html-sanitizer": "6.4.*", + "symfony/http-client": "6.4.*", + "symfony/mailer": "6.4.*", "symfony/mercure-bundle": "^0.3.5", - "symfony/messenger": "6.2.*", - "symfony/mime": "6.2.*", + "symfony/messenger": "6.4.*", + "symfony/mime": "6.4.*", "symfony/monolog-bundle": "^3.8", - "symfony/notifier": "6.2.*", - "symfony/ovh-cloud-notifier": "6.2.*", - "symfony/property-access": "6.2.*", - "symfony/property-info": "6.2.*", - "symfony/proxy-manager-bridge": "6.2.*", - "symfony/rate-limiter": "6.2.*", + "symfony/notifier": "6.4.*", + "symfony/ovh-cloud-notifier": "6.4.*", + "symfony/property-access": "6.4.*", + "symfony/property-info": "6.4.*", + "symfony/proxy-manager-bridge": "6.4.*", + "symfony/rate-limiter": "6.4.*", "symfony/requirements-checker": "^2.0", - "symfony/runtime": "6.2.*", - "symfony/security-bundle": "6.2.*", - "symfony/serializer": "6.2.*", + "symfony/runtime": "6.4.*", + "symfony/security-bundle": "6.4.*", + "symfony/serializer": "6.4.*", + "symfony/stimulus-bundle": "^2.14", "symfony/translation-contracts": "^3.2", - "symfony/twig-bridge": "6.2.*", - "symfony/twig-bundle": "6.2.*", - "symfony/twilio-notifier": "6.2.*", - "symfony/uid": "6.2.*", + "symfony/twig-bridge": "6.4.*", + "symfony/twig-bundle": "6.4.*", + "symfony/twilio-notifier": "6.4.*", + "symfony/uid": "6.4.*", "symfony/ux-autocomplete": "^2.7", - "symfony/validator": "6.2.*", + "symfony/validator": "6.4.*", "symfony/webpack-encore-bundle": "^1.16", - "symfony/workflow": "6.2.*", - "symfony/yaml": "6.2.*", + "symfony/workflow": "6.4.*", + "symfony/yaml": "6.4.*", "twig/cssinliner-extra": "^3.4", "twig/extra-bundle": "^3.4", "twig/inky-extra": "^3.4", @@ -151,7 +154,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "6.2.*", + "require": "6.4.*", "docker": true } }, @@ -168,13 +171,13 @@ "phpunit/phpunit": "^9.5", "rector/rector": "^0.14.5", "staabm/annotate-pull-request-from-checkstyle": "^1.8", - "symfony/browser-kit": "6.2.*", - "symfony/css-selector": "6.2.*", - "symfony/debug-bundle": "6.2.*", + "symfony/browser-kit": "6.4.*", + "symfony/css-selector": "6.4.*", + "symfony/debug-bundle": "6.4.*", "symfony/maker-bundle": "^1.47", "symfony/panther": "^2.0", "symfony/phpunit-bridge": "^6.1", - "symfony/web-profiler-bundle": "6.2.*", + "symfony/web-profiler-bundle": "6.4.*", "zenstruck/messenger-test": "^1.5" } } diff --git a/composer.lock b/composer.lock index 3c77d18..9d512f5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,27 +4,27 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3e1f8a3631e991b528d9f68758299e0e", + "content-hash": "f923f481246dcd1703ff8df8ada5ccc3", "packages": [ { "name": "alcohol/iso4217", - "version": "4.1.0", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/alcohol/iso4217.git", - "reference": "422890279c805e98dcea012f3dbbc184ac8afbe5" + "reference": "3ce6e02fbc0501f949ffdad327f5851c04367f4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/alcohol/iso4217/zipball/422890279c805e98dcea012f3dbbc184ac8afbe5", - "reference": "422890279c805e98dcea012f3dbbc184ac8afbe5", + "url": "https://api.github.com/repos/alcohol/iso4217/zipball/3ce6e02fbc0501f949ffdad327f5851c04367f4b", + "reference": "3ce6e02fbc0501f949ffdad327f5851c04367f4b", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { @@ -60,20 +60,26 @@ "issues": "https://github.com/alcohol/iso4217/issues", "source": "https://github.com/alcohol/iso4217" }, - "time": "2023-02-28T12:25:39+00:00" + "funding": [ + { + "url": "https://github.com/alcohol", + "type": "github" + } + ], + "time": "2024-07-01T09:50:00+00:00" }, { "name": "api-platform/core", - "version": "v3.1.11", + "version": "v3.3.12", "source": { "type": "git", "url": "https://github.com/api-platform/core.git", - "reference": "1fc611e59f7e87a89eb72ee069342916fc66c62d" + "reference": "e2eeb6b710f96542b75357a13d8d69ed4d8be5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/core/zipball/1fc611e59f7e87a89eb72ee069342916fc66c62d", - "reference": "1fc611e59f7e87a89eb72ee069342916fc66c62d", + "url": "https://api.github.com/repos/api-platform/core/zipball/e2eeb6b710f96542b75357a13d8d69ed4d8be5e2", + "reference": "e2eeb6b710f96542b75357a13d8d69ed4d8be5e2", "shasum": "" }, "require": { @@ -82,12 +88,13 @@ "psr/cache": "^1.0 || ^2.0 || ^3.0", "psr/container": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^3.1", - "symfony/http-foundation": "^6.1", - "symfony/http-kernel": "^6.1", - "symfony/property-access": "^6.1", - "symfony/property-info": "^6.1", - "symfony/serializer": "^6.1", - "symfony/web-link": "^6.1", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/translation-contracts": "^3.3", + "symfony/web-link": "^6.4 || ^7.0", "willdurand/negotiation": "^3.0" }, "conflict": { @@ -96,24 +103,23 @@ "doctrine/mongodb-odm": "<2.4", "doctrine/orm": "<2.14.0", "doctrine/persistence": "<1.3", - "elasticsearch/elasticsearch": ">=8.0", + "elasticsearch/elasticsearch": ">=8.0,<8.4", "phpspec/prophecy": "<1.15", "phpunit/phpunit": "<9.5", - "symfony/service-contracts": "<3", + "symfony/framework-bundle": "6.4.6 || 7.0.6", "symfony/var-exporter": "<6.1.1" }, "require-dev": { - "behat/behat": "^3.1", - "behat/mink": "^1.9@dev", + "behat/behat": "^3.11", + "behat/mink": "^1.9", "doctrine/cache": "^1.11 || ^2.1", "doctrine/common": "^3.2.2", - "doctrine/data-fixtures": "^1.2.2", "doctrine/dbal": "^3.4.0", "doctrine/doctrine-bundle": "^1.12 || ^2.0", "doctrine/mongodb-odm": "^2.2", - "doctrine/mongodb-odm-bundle": "^4.0", - "doctrine/orm": "^2.14", - "elasticsearch/elasticsearch": "^7.11.0", + "doctrine/mongodb-odm-bundle": "^4.0 || ^5.0", + "doctrine/orm": "^2.14 || ^3.0", + "elasticsearch/elasticsearch": "^7.11 || ^8.4", "friends-of-behat/mink-browserkit-driver": "^1.3.1", "friends-of-behat/mink-extension": "^2.2", "friends-of-behat/symfony-extension": "^2.1", @@ -123,44 +129,48 @@ "phpspec/prophecy-phpunit": "^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpdoc-parser": "^1.13", - "phpstan/phpstan": "^1.1", + "phpstan/phpstan": "^1.10", "phpstan/phpstan-doctrine": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-symfony": "^1.0", + "phpunit/phpunit": "^9.6", "psr/log": "^1.0 || ^2.0 || ^3.0", - "ramsey/uuid": "^3.7 || ^4.0", - "ramsey/uuid-doctrine": "^1.4", - "soyuka/contexts": "^3.3.6", + "ramsey/uuid": "^3.9.7 || ^4.0", + "ramsey/uuid-doctrine": "^1.4 || ^2.0", + "sebastian/comparator": "<5.0", + "soyuka/contexts": "v3.3.9", + "soyuka/pmu": "^0.0.2", "soyuka/stubs-mongodb": "^1.0", - "symfony/asset": "^6.1", - "symfony/browser-kit": "^6.1", - "symfony/cache": "^6.1", - "symfony/config": "^6.1", - "symfony/console": "^6.1", - "symfony/css-selector": "^6.1", - "symfony/dependency-injection": "^6.1", - "symfony/doctrine-bridge": "^6.1", - "symfony/dom-crawler": "^6.1", - "symfony/error-handler": "^6.1", - "symfony/event-dispatcher": "^6.1", - "symfony/expression-language": "^6.1", - "symfony/finder": "^6.1", - "symfony/form": "^6.1", - "symfony/framework-bundle": "^6.1", - "symfony/http-client": "^6.1", - "symfony/intl": "^6.1", + "symfony/asset": "^6.4 || ^7.0", + "symfony/browser-kit": "^6.4 || ^7.0", + "symfony/cache": "^6.4 || ^7.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/console": "^6.4 || ^7.0", + "symfony/css-selector": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0.12", + "symfony/doctrine-bridge": "^6.4 || ^7.0", + "symfony/dom-crawler": "^6.4 || ^7.0", + "symfony/error-handler": "^6.4 || ^7.0", + "symfony/event-dispatcher": "^6.4 || ^7.0", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/finder": "^6.4 || ^7.0", + "symfony/form": "^6.4 || ^7.0", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/http-client": "^6.4 || ^7.0", + "symfony/intl": "^6.4 || ^7.0", "symfony/maker-bundle": "^1.24", "symfony/mercure-bundle": "*", - "symfony/messenger": "^6.1", - "symfony/phpunit-bridge": "^6.1", - "symfony/routing": "^6.1", - "symfony/security-bundle": "^6.1", - "symfony/security-core": "^6.1", - "symfony/twig-bundle": "^6.1", - "symfony/uid": "^6.1", - "symfony/validator": "^6.1", - "symfony/web-profiler-bundle": "^6.1", - "symfony/yaml": "^6.1", + "symfony/messenger": "^6.4 || ^7.0", + "symfony/phpunit-bridge": "^6.4.1 || ^7.0", + "symfony/routing": "^6.4 || ^7.0", + "symfony/security-bundle": "^6.4 || ^7.0", + "symfony/security-core": "^6.4 || ^7.0", + "symfony/stopwatch": "^6.4 || ^7.0", + "symfony/twig-bundle": "^6.4 || ^7.0", + "symfony/uid": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "symfony/web-profiler-bundle": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0", "twig/twig": "^1.42.3 || ^2.12 || ^3.0", "webonyx/graphql-php": "^14.0 || ^15.0" }, @@ -185,11 +195,31 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.2.x-dev" + "dev-main": "3.3.x-dev" }, "symfony": { - "require": "^6.1" - } + "require": "^6.4 || ^7.0" + }, + "projects": [ + "api-platform/doctrine-common", + "api-platform/doctrine-orm", + "api-platform/doctrine-odm", + "api-platform/metadata", + "api-platform/json-schema", + "api-platform/elasticsearch", + "api-platform/jsonld", + "api-platform/hydra", + "api-platform/openapi", + "api-platform/graphql", + "api-platform/http-cache", + "api-platform/documentation", + "api-platform/parameter-validator", + "api-platform/ramsey-uuid", + "api-platform/serializer", + "api-platform/state", + "api-platform/symfony", + "api-platform/validator" + ] }, "autoload": { "psr-4": { @@ -222,28 +252,22 @@ ], "support": { "issues": "https://github.com/api-platform/core/issues", - "source": "https://github.com/api-platform/core/tree/v3.1.11" + "source": "https://github.com/api-platform/core/tree/v3.3.12" }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/api-platform/core", - "type": "tidelift" - } - ], - "time": "2023-05-05T14:18:25+00:00" + "time": "2024-08-30T14:44:44+00:00" }, { "name": "aws/aws-crt-php", - "version": "v1.2.1", + "version": "v1.2.6", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" + "reference": "a63485b65b6b3367039306496d49737cf1995408" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408", + "reference": "a63485b65b6b3367039306496d49737cf1995408", "shasum": "" }, "require": { @@ -282,35 +306,35 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6" }, - "time": "2023-03-24T20:22:19+00:00" + "time": "2024-06-13T17:21:28+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.270.1", + "version": "3.321.5", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "efc5a281bcdfb49bc1c608bb1f892403631da077" + "reference": "8cd434985ca76335c5de9d5cf76f42c380252dd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/efc5a281bcdfb49bc1c608bb1f892403631da077", - "reference": "efc5a281bcdfb49bc1c608bb1f892403631da077", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8cd434985ca76335c5de9d5cf76f42c380252dd2", + "reference": "8cd434985ca76335c5de9d5cf76f42c380252dd2", "shasum": "" }, "require": { - "aws/aws-crt-php": "^1.0.4", + "aws/aws-crt-php": "^1.2.3", "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/promises": "^1.4.0 || ^2.0", "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", - "php": ">=5.5", - "psr/http-message": "^1.0" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", @@ -325,7 +349,7 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", @@ -350,7 +374,10 @@ ], "psr-4": { "Aws\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/data/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -377,9 +404,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.270.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.321.5" }, - "time": "2023-05-22T18:23:05+00:00" + "time": "2024-09-05T18:04:31+00:00" }, { "name": "behat/transliterator", @@ -432,25 +459,25 @@ }, { "name": "brick/math", - "version": "0.11.0", + "version": "0.12.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.1" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "5.0.0" + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" }, "type": "library", "autoload": { @@ -470,12 +497,17 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.11.0" + "source": "https://github.com/brick/math/tree/0.12.1" }, "funding": [ { @@ -483,27 +515,96 @@ "type": "github" } ], - "time": "2023-01-15T23:15:59+00:00" + "time": "2023-11-29T23:19:16+00:00" }, { - "name": "clue/stream-filter", - "version": "v1.6.0", + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", "shasum": "" }, "require": { "php": ">=5.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -525,7 +626,7 @@ } ], "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "homepage": "https://github.com/clue/stream-filter", "keywords": [ "bucket brigade", "callback", @@ -537,7 +638,7 @@ ], "support": { "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" }, "funding": [ { @@ -549,32 +650,32 @@ "type": "github" } ], - "time": "2022-02-21T13:15:14+00:00" + "time": "2023-12-20T15:40:13+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.5", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", "shasum": "" }, "require": { "ext-openssl": "*", "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", + "phpstan/phpstan": "^1.10", + "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -609,7 +710,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.5" + "source": "https://github.com/composer/ca-bundle/tree/1.5.1" }, "funding": [ { @@ -625,56 +726,62 @@ "type": "tidelift" } ], - "time": "2023-01-11T08:27:00+00:00" + "time": "2024-07-08T15:28:20+00:00" }, { "name": "craue/formflow-bundle", - "version": "3.6.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/craue/CraueFormFlowBundle.git", - "reference": "af3db3519a9e62920c439b80d17ff4db689a5d60" + "reference": "8fea7ced6145451a5ccca2e8d4d87c74e6d42b56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/craue/CraueFormFlowBundle/zipball/af3db3519a9e62920c439b80d17ff4db689a5d60", - "reference": "af3db3519a9e62920c439b80d17ff4db689a5d60", + "url": "https://api.github.com/repos/craue/CraueFormFlowBundle/zipball/8fea7ced6145451a5ccca2e8d4d87c74e6d42b56", + "reference": "8fea7ced6145451a5ccca2e8d4d87c74e6d42b56", "shasum": "" }, "require": { - "php": "^7.3|^8", - "symfony/config": "~4.4|~5.3|^6.0", - "symfony/dependency-injection": "~4.4|~5.3|^6.0", - "symfony/event-dispatcher": "~4.4|~5.3|^6.0", - "symfony/form": "~4.4|~5.3|^6.0", - "symfony/http-foundation": "~4.4|~5.3|^6.0", - "symfony/http-kernel": "~4.4|~5.3|^6.0", - "symfony/options-resolver": "~4.4|~5.3|^6.0", - "symfony/security-core": "~4.4|~5.3|^6.0", - "symfony/translation": "~4.4|~5.3|^6.0", - "symfony/validator": "~4.4|~5.3|^6.0", - "symfony/yaml": "~4.4|~5.3|^6.0" + "php": "^7.3 || ^8", + "symfony/config": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/dependency-injection": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/event-dispatcher": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/form": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/http-foundation": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/http-kernel": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/options-resolver": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/security-core": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/translation": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/validator": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/yaml": "^4.4 || ^5.4 || ^6.3 || ^7.0" + }, + "conflict": { + "doctrine/dbal": "<2.10" }, "require-dev": { "craue/translations-tests": "^1.1", - "doctrine/annotations": "^1.6", - "doctrine/common": "~2.9|~3.0", - "doctrine/doctrine-bundle": "~1.10|~2.0", + "doctrine/collections": "^1.8 || ^2.1", + "doctrine/common": "^2.9 || ^3.0", + "doctrine/dbal": "^2.10 || ^3.0", + "doctrine/doctrine-bundle": "^1.10 || ^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.1", "phpunit/phpunit": "^9.5", - "symfony/browser-kit": "~4.4|~5.3|^6.0", - "symfony/css-selector": "~4.4|~5.3|^6.0", - "symfony/mime": "~4.4|~5.3|^6.0", - "symfony/phpunit-bridge": "^6", - "symfony/security-bundle": "~4.4|~5.3|^6.0", - "symfony/twig-bundle": "~4.4|~5.3|^6.0" + "symfony/browser-kit": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/css-selector": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/mime": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/phpunit-bridge": "^7.0", + "symfony/security-bundle": "^4.4 || ^5.4 || ^6.3 || ^7.0", + "symfony/twig-bundle": "^4.4 || ^5.4 || ^6.3 || ^7.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "3.6.x-dev" - }, - "symfony": { - "require": "~4.4|~5.3|^6.0" + "dev-master": "3.7.x-dev" } }, "autoload": { @@ -709,22 +816,22 @@ ], "support": { "issues": "https://github.com/craue/CraueFormFlowBundle/issues", - "source": "https://github.com/craue/CraueFormFlowBundle/tree/3.6.0" + "source": "https://github.com/craue/CraueFormFlowBundle/tree/3.7.0" }, - "time": "2022-01-24T14:43:05+00:00" + "time": "2024-01-11T01:03:17+00:00" }, { "name": "dflydev/dot-access-data", - "version": "v3.0.2", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "f41715465d65213d644d3141a6a93081be5d3549" + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", - "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { @@ -784,22 +891,22 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2022-10-27T11:44:00+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { "name": "doctrine/annotations", - "version": "1.14.3", + "version": "1.14.4", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915", "shasum": "" }, "require": { @@ -810,11 +917,11 @@ }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "~1.4.10 || ^1.10.28", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" + "symfony/cache": "^4.4 || ^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" @@ -860,9 +967,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" + "source": "https://github.com/doctrine/annotations/tree/1.14.4" }, - "time": "2023-02-01T09:20:38+00:00" + "time": "2024-09-05T10:15:52+00:00" }, { "name": "doctrine/cache", @@ -959,16 +1066,16 @@ }, { "name": "doctrine/collections", - "version": "2.1.2", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "db8cda536a034337f7dd63febecc713d4957f9ee" + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/db8cda536a034337f7dd63febecc713d4957f9ee", - "reference": "db8cda536a034337f7dd63febecc713d4957f9ee", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { @@ -976,12 +1083,12 @@ "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^10.0", + "doctrine/coding-standard": "^12", "ext-json": "*", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.22" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" }, "type": "library", "autoload": { @@ -1025,7 +1132,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.1.2" + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -1041,20 +1148,20 @@ "type": "tidelift" } ], - "time": "2022-12-27T23:41:38+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { "name": "doctrine/common", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "url": "https://api.github.com/repos/doctrine/common/zipball/0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", + "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", "shasum": "" }, "require": { @@ -1116,7 +1223,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.4" }, "funding": [ { @@ -1132,42 +1239,44 @@ "type": "tidelift" } ], - "time": "2022-10-09T11:47:59+00:00" + "time": "2024-04-16T13:35:33+00:00" }, { "name": "doctrine/data-fixtures", - "version": "1.6.6", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "4af35dadbfcf4b00abb2a217c4c8c8800cf5fcf4" + "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/4af35dadbfcf4b00abb2a217c4c8c8800cf5fcf4", - "reference": "4af35dadbfcf4b00abb2a217c4c8c8800cf5fcf4", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", + "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", "shasum": "" }, "require": { "doctrine/deprecations": "^0.5.3 || ^1.0", - "doctrine/persistence": "^1.3.3 || ^2.0 || ^3.0", - "php": "^7.2 || ^8.0" + "doctrine/persistence": "^2.0|^3.0", + "php": "^7.4 || ^8.0" }, "conflict": { - "doctrine/dbal": "<2.13", - "doctrine/orm": "<2.12", + "doctrine/dbal": "<3.5 || >=5", + "doctrine/orm": "<2.14 || >=4", "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "doctrine/dbal": "^2.13 || ^3.0", + "doctrine/annotations": "^1.12 || ^2", + "doctrine/coding-standard": "^12", + "doctrine/dbal": "^3.5 || ^4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", - "doctrine/orm": "^2.12", + "doctrine/orm": "^2.14 || ^3", "ext-sqlite3": "*", - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^8.5 || ^9.5 || ^10.0", - "symfony/cache": "^5.0 || ^6.0", - "vimeo/psalm": "^4.10 || ^5.9" + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6.13 || ^10.4.2", + "symfony/cache": "^5.4 || ^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6.3 || ^7", + "vimeo/psalm": "^5.9" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -1198,7 +1307,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.6.6" + "source": "https://github.com/doctrine/data-fixtures/tree/1.7.0" }, "funding": [ { @@ -1214,20 +1323,20 @@ "type": "tidelift" } ], - "time": "2023-04-20T13:08:54+00:00" + "time": "2023-11-24T11:18:31+00:00" }, { "name": "doctrine/dbal", - "version": "3.6.2", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b4bd1cfbd2b916951696d82e57d054394d84864c" + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b4bd1cfbd2b916951696d82e57d054394d84864c", - "reference": "b4bd1cfbd2b916951696d82e57d054394d84864c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", "shasum": "" }, "require": { @@ -1240,16 +1349,17 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "11.1.0", + "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2022.3", - "phpstan/phpstan": "1.10.9", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.6", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.12.0", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.20", "psalm/plugin-phpunit": "0.18.4", - "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^5.4|^6.0", - "symfony/console": "^4.4|^5.4|^6.0", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", "vimeo/psalm": "4.30.0" }, "suggest": { @@ -1310,7 +1420,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.2" + "source": "https://github.com/doctrine/dbal/tree/3.9.1" }, "funding": [ { @@ -1326,29 +1436,33 @@ "type": "tidelift" } ], - "time": "2023-04-14T07:25:38+00:00" + "time": "2024-09-01T13:49:23+00:00" }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1367,64 +1481,68 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.9.1", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "7539b3c8bd620f7df6c2c6d510204bd2ce0064e3" + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/7539b3c8bd620f7df6c2c6d510204bd2ce0064e3", - "reference": "7539b3c8bd620f7df6c2c6d510204bd2ce0064e3", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", "shasum": "" }, "require": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^3.6.0", + "doctrine/dbal": "^3.7.0 || ^4.0", "doctrine/persistence": "^2.2 || ^3", "doctrine/sql-formatter": "^1.0.1", "php": "^7.4 || ^8.0", - "symfony/cache": "^5.4 || ^6.0", - "symfony/config": "^5.4 || ^6.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/dependency-injection": "^5.4 || ^6.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7", - "symfony/framework-bundle": "^5.4 || ^6.0", + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" }, "conflict": { "doctrine/annotations": ">=3.0", - "doctrine/orm": "<2.11 || >=3.0", + "doctrine/orm": "<2.17 || >=4.0", "twig/twig": "<1.34 || >=2.0 <2.4" }, "require-dev": { "doctrine/annotations": "^1 || ^2", - "doctrine/coding-standard": "^9.0", + "doctrine/coding-standard": "^12", "doctrine/deprecations": "^1.0", - "doctrine/orm": "^2.11 || ^3.0", + "doctrine/orm": "^2.17 || ^3.0", "friendsofphp/proxy-manager-lts": "^1.0", - "phpunit/phpunit": "^9.5.26 || ^10.0", + "phpunit/phpunit": "^9.5.26", "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^4", + "psalm/plugin-symfony": "^5", "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^6.1", - "symfony/property-info": "^5.4 || ^6.0", - "symfony/proxy-manager-bridge": "^5.4 || ^6.0", - "symfony/security-bundle": "^5.4 || ^6.0", - "symfony/twig-bridge": "^5.4 || ^6.0", - "symfony/validator": "^5.4 || ^6.0", - "symfony/web-profiler-bundle": "^5.4 || ^6.0", - "symfony/yaml": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", "twig/twig": "^1.34 || ^2.12 || ^3.0", - "vimeo/psalm": "^4.30" + "vimeo/psalm": "^5.15" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -1434,7 +1552,7 @@ "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" + "Doctrine\\Bundle\\DoctrineBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1469,7 +1587,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.9.1" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.0" }, "funding": [ { @@ -1485,38 +1603,45 @@ "type": "tidelift" } ], - "time": "2023-04-14T05:39:34+00:00" + "time": "2024-09-01T09:46:40+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.2.2", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "3393f411ba25ade21969c33f2053220044854d01" + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/3393f411ba25ade21969c33f2053220044854d01", - "reference": "3393f411ba25ade21969c33f2053220044854d01", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "~1.0|~2.0", + "doctrine/doctrine-bundle": "^2.4", "doctrine/migrations": "^3.2", "php": "^7.2|^8.0", - "symfony/framework-bundle": "~3.4|~4.0|~5.0|~6.0" + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", - "doctrine/orm": "^2.6", - "doctrine/persistence": "^1.3||^2.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0|^9.0", - "vimeo/psalm": "^4.11" + "composer/semver": "^3.0", + "doctrine/coding-standard": "^12", + "doctrine/orm": "^2.6 || ^3", + "doctrine/persistence": "^2.0 || ^3 ", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.5|^9.5", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^3 || ^5", + "symfony/phpunit-bridge": "^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6 || ^7", + "vimeo/psalm": "^4.30 || ^5.15" }, "type": "symfony-bundle", "autoload": { @@ -1554,7 +1679,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.2.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" }, "funding": [ { @@ -1570,20 +1695,20 @@ "type": "tidelift" } ], - "time": "2022-02-01T18:08:07+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": { @@ -1593,10 +1718,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": { @@ -1645,7 +1770,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": [ { @@ -1661,32 +1786,32 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:59:15+00:00" + "time": "2024-05-22T20:47:39+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.6", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", - "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^10", + "doctrine/coding-standard": "^11.0", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-strict-rules": "^1.3", "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25" + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", "autoload": { @@ -1736,7 +1861,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.6" + "source": "https://github.com/doctrine/inflector/tree/2.0.10" }, "funding": [ { @@ -1752,7 +1877,7 @@ "type": "tidelift" } ], - "time": "2022-10-20T09:10:12+00:00" + "time": "2024-02-18T20:23:39+00:00" }, { "name": "doctrine/instantiator", @@ -1826,16 +1951,16 @@ }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", "shasum": "" }, "require": { @@ -1843,11 +1968,11 @@ "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", + "doctrine/coding-standard": "^9 || ^12", "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "vimeo/psalm": "^4.11 || ^5.21" }, "type": "library", "autoload": { @@ -1884,7 +2009,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "source": "https://github.com/doctrine/lexer/tree/2.1.1" }, "funding": [ { @@ -1900,51 +2025,52 @@ "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2024-02-05T11:35:39+00:00" }, { "name": "doctrine/migrations", - "version": "3.6.0", + "version": "3.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "e542ad8bcd606d7a18d0875babb8a6d963c9c059" + "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/e542ad8bcd606d7a18d0875babb8a6d963c9c059", - "reference": "e542ad8bcd606d7a18d0875babb8a6d963c9c059", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/7760fbd0b7cb58bfb50415505a7bab821adf0877", + "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/dbal": "^3.5.1", + "doctrine/dbal": "^3.6 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2.0", "php": "^8.1", "psr/log": "^1.1.3 || ^2 || ^3", - "symfony/console": "^4.4.16 || ^5.4 || ^6.0", - "symfony/stopwatch": "^4.4 || ^5.4 || ^6.0", - "symfony/var-exporter": "^6.2" + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.2 || ^7.0" }, "conflict": { - "doctrine/orm": "<2.12" + "doctrine/orm": "<2.12 || >=4" }, "require-dev": { - "doctrine/coding-standard": "^9", - "doctrine/orm": "^2.13", + "doctrine/coding-standard": "^12", + "doctrine/orm": "^2.13 || ^3", "doctrine/persistence": "^2 || ^3", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpstan/phpstan-symfony": "^1.1", - "phpunit/phpunit": "^9.5.24", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "symfony/process": "^4.4 || ^5.4 || ^6.0", - "symfony/yaml": "^4.4 || ^5.4 || ^6.0" + "fig/log-test": "^1", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.4", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^10.3", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", @@ -1956,7 +2082,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + "Doctrine\\Migrations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1986,7 +2112,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.6.0" + "source": "https://github.com/doctrine/migrations/tree/3.8.1" }, "funding": [ { @@ -2002,20 +2128,20 @@ "type": "tidelift" } ], - "time": "2023-02-15T18:49:46+00:00" + "time": "2024-08-28T13:17:28+00:00" }, { "name": "doctrine/orm", - "version": "2.15.1", + "version": "2.19.7", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "9bc6f5b4ac6f1e7d4248b2efbd01a748782075bc" + "reference": "168ac31084226f94d42e7461a40ff5607a56bd35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/9bc6f5b4ac6f1e7d4248b2efbd01a748782075bc", - "reference": "9bc6f5b4ac6f1e7d4248b2efbd01a748782075bc", + "url": "https://api.github.com/repos/doctrine/orm/zipball/168ac31084226f94d42e7461a40ff5607a56bd35", + "reference": "168ac31084226f94d42e7461a40ff5607a56bd35", "shasum": "" }, "require": { @@ -2028,12 +2154,12 @@ "doctrine/event-manager": "^1.2 || ^2", "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3 || ^2", - "doctrine/lexer": "^2", + "doctrine/lexer": "^2 || ^3", "doctrine/persistence": "^2.4 || ^3", "ext-ctype": "*", "php": "^7.1 || ^8.0", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^4.2 || ^5.0 || ^6.0", + "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", "symfony/polyfill-php72": "^1.23", "symfony/polyfill-php80": "^1.16" }, @@ -2044,14 +2170,14 @@ "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.14", + "phpstan/phpstan": "~1.4.10 || 1.11.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.0", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.11.0" + "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.24.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", @@ -2064,7 +2190,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" + "Doctrine\\ORM\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2101,22 +2227,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.15.1" + "source": "https://github.com/doctrine/orm/tree/2.19.7" }, - "time": "2023-05-07T18:56:25+00:00" + "time": "2024-08-23T06:54:57+00:00" }, { "name": "doctrine/persistence", - "version": "3.1.4", + "version": "3.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "8bf8ab15960787f1a49d405f6eb8c787b4841119" + "reference": "b337726451f5d530df338fc7f68dee8781b49779" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/8bf8ab15960787f1a49d405f6eb8c787b4841119", - "reference": "8bf8ab15960787f1a49d405f6eb8c787b4841119", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", + "reference": "b337726451f5d530df338fc7f68dee8781b49779", "shasum": "" }, "require": { @@ -2128,15 +2254,14 @@ "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.11.1", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "^8.5 || ^9.5", "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.3.0" + "vimeo/psalm": "4.30.0 || 5.24.0" }, "type": "library", "autoload": { @@ -2185,7 +2310,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.1.4" + "source": "https://github.com/doctrine/persistence/tree/3.3.3" }, "funding": [ { @@ -2201,27 +2326,30 @@ "type": "tidelift" } ], - "time": "2023-02-03T11:13:07+00:00" + "time": "2024-06-20T10:14:30+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.1.3", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5" + "reference": "7f83911cc5eba870de7ebb11283972483f7e2891" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/25a06c7bf4c6b8218f47928654252863ffc890a5", - "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/7f83911cc5eba870de7ebb11283972483f7e2891", + "reference": "7f83911cc5eba870de7ebb11283972483f7e2891", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "bin": [ "bin/sql-formatter" @@ -2251,9 +2379,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.1.3" + "source": "https://github.com/doctrine/sql-formatter/tree/1.4.1" }, - "time": "2022-05-23T21:33:49+00:00" + "time": "2024-08-05T20:32:22+00:00" }, { "name": "easycorp/easyadmin-bundle", @@ -2350,16 +2478,16 @@ }, { "name": "egulias/email-validator", - "version": "4.0.1", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", - "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", "shasum": "" }, "require": { @@ -2368,8 +2496,8 @@ "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^4.30" + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -2405,7 +2533,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" }, "funding": [ { @@ -2413,20 +2541,20 @@ "type": "github" } ], - "time": "2023-01-14T14:17:03+00:00" + "time": "2023-10-06T06:47:41+00:00" }, { "name": "fakerphp/faker", - "version": "v1.22.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "f85772abd508bd04e20bb4b1bbe260a68d0066d2" + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/f85772abd508bd04e20bb4b1bbe260a68d0066d2", - "reference": "f85772abd508bd04e20bb4b1bbe260a68d0066d2", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", "shasum": "" }, "require": { @@ -2452,11 +2580,6 @@ "ext-mbstring": "Required for multibyte Unicode string functionality." }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v1.21-dev" - } - }, "autoload": { "psr-4": { "Faker\\": "src/Faker/" @@ -2479,32 +2602,32 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.22.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" }, - "time": "2023-05-14T12:31:37+00:00" + "time": "2024-01-02T13:46:09+00:00" }, { "name": "firebase/php-jwt", - "version": "v6.5.0", + "version": "v6.10.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "e94e7353302b0c11ec3cfff7180cd0b1743975d2" + "reference": "500501c2ce893c824c801da135d02661199f60c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/e94e7353302b0c11ec3cfff7180cd0b1743975d2", - "reference": "e94e7353302b0c11ec3cfff7180cd0b1743975d2", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" }, @@ -2542,28 +2665,28 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.5.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" }, - "time": "2023-05-12T15:47:07+00:00" + "time": "2024-05-18T18:05:11+00:00" }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.15", + "version": "v1.0.18", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "3ca65b8edb8d96b46fedc9bb4911396516347129" + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/3ca65b8edb8d96b46fedc9bb4911396516347129", - "reference": "3ca65b8edb8d96b46fedc9bb4911396516347129", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", "shasum": "" }, "require": { "laminas/laminas-code": "~3.4.1|^4.0", "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0|^6.0" + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" }, "conflict": { "laminas/laminas-stdlib": "<3.2.1", @@ -2574,7 +2697,7 @@ }, "require-dev": { "ext-phar": "*", - "symfony/phpunit-bridge": "^5.4|^6.0" + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" }, "type": "library", "extra": { @@ -2614,7 +2737,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.15" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.18" }, "funding": [ { @@ -2626,38 +2749,38 @@ "type": "tidelift" } ], - "time": "2023-05-16T13:18:04+00:00" + "time": "2024-03-20T12:50:41+00:00" }, { "name": "friendsofsymfony/ckeditor-bundle", - "version": "2.4.0", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle.git", - "reference": "a4df4056b2832881e17b939e83f25406a6cc6414" + "reference": "9d4cd4f2db4d800164b9c3051e4bfdee21acb27f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfSymfony/FOSCKEditorBundle/zipball/a4df4056b2832881e17b939e83f25406a6cc6414", - "reference": "a4df4056b2832881e17b939e83f25406a6cc6414", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSCKEditorBundle/zipball/9d4cd4f2db4d800164b9c3051e4bfdee21acb27f", + "reference": "9d4cd4f2db4d800164b9c3051e4bfdee21acb27f", "shasum": "" }, "require": { "ext-json": "*", "ext-zip": "*", - "php": "^7.1|^8.0", - "symfony/asset": "^4.4 || ^5.0 || ^6.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", - "symfony/expression-language": "^4.4 || ^5.0 || ^6.0", - "symfony/form": "^4.4 || ^5.0 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0", - "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", - "symfony/options-resolver": "^4.4 || ^5.0 || ^6.0", - "symfony/property-access": "^4.4 || ^5.0 || ^6.0", - "symfony/routing": "^4.4 || ^5.0 || ^6.0", - "symfony/twig-bundle": "^4.4 || ^5.0 || ^6.0", + "php": "^8.0", + "symfony/asset": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/expression-language": "^5.4 || ^6.0 || ^7.0", + "symfony/form": "^5.4 || ^6.0 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/property-access": "^5.4 || ^6.0 || ^7.0", + "symfony/routing": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bundle": "^5.4 || ^6.0 || ^7.0", "twig/twig": "^2.4 || ^3.0" }, "conflict": { @@ -2665,11 +2788,11 @@ "sebastian/exporter": "<2.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "matthiasnoback/symfony-dependency-injection-test": "^3.0 || ^4.0", - "symfony/console": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^4.4 || ^5.0 || ^6.0", - "symfony/yaml": "^4.4 || ^5.0 || ^6.0" + "friendsofphp/php-cs-fixer": "^3.41", + "matthiasnoback/symfony-dependency-injection-test": "^4.0 || ^5.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "egeloen/form-extra-bundle": "Allows to load CKEditor asynchronously" @@ -2705,68 +2828,70 @@ ], "support": { "issues": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle/issues", - "source": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle/tree/2.4.0" + "source": "https://github.com/FriendsOfSymfony/FOSCKEditorBundle/tree/2.5.0" }, - "time": "2022-01-07T12:34:18+00:00" + "time": "2024-01-23T15:35:55+00:00" }, { "name": "gedmo/doctrine-extensions", - "version": "v3.11.1", + "version": "v3.16.1", "source": { "type": "git", "url": "https://github.com/doctrine-extensions/DoctrineExtensions.git", - "reference": "ae4bdf0d567e06b6bb1902a560ee78961b230953" + "reference": "e85560ed96f977b8c29428a99222cb2ef2f0e80d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/ae4bdf0d567e06b6bb1902a560ee78961b230953", - "reference": "ae4bdf0d567e06b6bb1902a560ee78961b230953", + "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/e85560ed96f977b8c29428a99222cb2ef2f0e80d", + "reference": "e85560ed96f977b8c29428a99222cb2ef2f0e80d", "shasum": "" }, "require": { - "behat/transliterator": "~1.2", - "doctrine/annotations": "^1.13 || ^2.0", + "behat/transliterator": "^1.2", "doctrine/collections": "^1.2 || ^2.0", "doctrine/common": "^2.13 || ^3.0", + "doctrine/deprecations": "^1.0", "doctrine/event-manager": "^1.2 || ^2.0", "doctrine/persistence": "^2.2 || ^3.0", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "psr/cache": "^1 || ^2 || ^3", - "symfony/cache": "^4.4 || ^5.3 || ^6.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0" + "psr/clock": "^1", + "symfony/cache": "^5.4 || ^6.0 || ^7.0" }, "conflict": { - "doctrine/cache": "<1.11", - "doctrine/dbal": "<2.13.1 || ^3.0 <3.2", - "doctrine/mongodb-odm": "<2.3", - "doctrine/orm": "<2.10.2", - "sebastian/comparator": "<2.0" + "doctrine/annotations": "<1.13 || >=3.0", + "doctrine/dbal": "<3.2 || >=4.0", + "doctrine/mongodb-odm": "<2.3 || >=3.0", + "doctrine/orm": "<2.14.0 || 2.16.0 || 2.16.1 || >=4.0" }, "require-dev": { + "doctrine/annotations": "^1.13 || ^2.0", "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/dbal": "^3.2", "doctrine/doctrine-bundle": "^2.3", "doctrine/mongodb-odm": "^2.3", - "doctrine/orm": "^2.10.2", - "friendsofphp/php-cs-fixer": "^3.4.0,<3.10", - "nesbot/carbon": "^2.55", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-doctrine": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/console": "^4.4 || ^5.3 || ^6.0", - "symfony/phpunit-bridge": "^6.0", - "symfony/yaml": "^4.4 || ^5.3 || ^6.0" + "doctrine/orm": "^2.14.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.14.0", + "nesbot/carbon": "^2.71 || ^3.0", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-doctrine": "^1.4", + "phpstan/phpstan-phpunit": "^1.4", + "phpunit/phpunit": "^9.6", + "rector/rector": "^1.1", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/doctrine-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.0 || ^7.0", + "symfony/uid": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "doctrine/mongodb-odm": "to use the extensions with the MongoDB ODM", - "doctrine/orm": "to use the extensions with the ORM", - "symfony/cache": "to cache parsed annotations" + "doctrine/orm": "to use the extensions with the ORM" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.12-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -2814,33 +2939,48 @@ "support": { "email": "gediminas.morkevicius@gmail.com", "issues": "https://github.com/doctrine-extensions/DoctrineExtensions/issues", - "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.11.1", + "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.16.1", "wiki": "https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc" }, - "time": "2023-02-20T19:24:07+00:00" + "funding": [ + { + "url": "https://github.com/l3pp4rd", + "type": "github" + }, + { + "url": "https://github.com/mbabker", + "type": "github" + }, + { + "url": "https://github.com/phansys", + "type": "github" + }, + { + "url": "https://github.com/stof", + "type": "github" + } + ], + "time": "2024-06-25T16:22:14+00:00" }, { "name": "geocoder-php/common-http", - "version": "4.5.0", + "version": "4.6.0", "source": { "type": "git", "url": "https://github.com/geocoder-php/php-common-http.git", - "reference": "4ee2cee60d21631e2a09c196bf6b9fd296bca728" + "reference": "d8c22a66120daed35ba8017467bc1ebfec28a63e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/php-common-http/zipball/4ee2cee60d21631e2a09c196bf6b9fd296bca728", - "reference": "4ee2cee60d21631e2a09c196bf6b9fd296bca728", + "url": "https://api.github.com/repos/geocoder-php/php-common-http/zipball/d8c22a66120daed35ba8017467bc1ebfec28a63e", + "reference": "d8c22a66120daed35ba8017467bc1ebfec28a63e", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", - "php-http/client-implementation": "^1.0", - "php-http/discovery": "^1.6", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0", - "psr/http-message-implementation": "^1.0", + "php": "^8.0", + "php-http/discovery": "^1.17", + "psr/http-client-implementation": "^1.0", + "psr/http-factory-implementation": "^1.0", "willdurand/geocoder": "^4.0" }, "require-dev": { @@ -2848,7 +2988,7 @@ "php-http/message": "^1.0", "php-http/mock-client": "^1.0", "phpunit/phpunit": "^9.5", - "symfony/stopwatch": "~2.5" + "symfony/stopwatch": "~2.5 || ~5.0" }, "type": "library", "extra": { @@ -2880,9 +3020,9 @@ "http geocoder" ], "support": { - "source": "https://github.com/geocoder-php/php-common-http/tree/4.5.0" + "source": "https://github.com/geocoder-php/php-common-http/tree/4.6.0" }, - "time": "2022-07-30T12:09:30+00:00" + "time": "2023-12-28T10:51:54+00:00" }, { "name": "geocoder-php/nominatim-provider", @@ -3004,16 +3144,16 @@ }, { "name": "giggsey/libphonenumber-for-php", - "version": "8.13.11", + "version": "8.13.45", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php.git", - "reference": "e2395dadce92f139fc6ec71bfe8ae46a2e942944" + "reference": "142ccdd603e4eeef7de9a7ddbd9ae18c2651dbd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/e2395dadce92f139fc6ec71bfe8ae46a2e942944", - "reference": "e2395dadce92f139fc6ec71bfe8ae46a2e942944", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/142ccdd603e4eeef7de9a7ddbd9ae18c2651dbd6", + "reference": "142ccdd603e4eeef7de9a7ddbd9ae18c2651dbd6", "shasum": "" }, "require": { @@ -3021,6 +3161,9 @@ "php": ">=5.3.2", "symfony/polyfill-mbstring": "^1.17" }, + "replace": { + "giggsey/libphonenumber-for-php-lite": "self.version" + }, "require-dev": { "pear/pear-core-minimal": "^1.9", "pear/pear_exception": "^1.0", @@ -3072,20 +3215,20 @@ "issues": "https://github.com/giggsey/libphonenumber-for-php/issues", "source": "https://github.com/giggsey/libphonenumber-for-php" }, - "time": "2023-04-27T11:06:55+00:00" + "time": "2024-09-06T11:22:54+00:00" }, { "name": "giggsey/locale", - "version": "2.4", + "version": "2.6", "source": { "type": "git", "url": "https://github.com/giggsey/Locale.git", - "reference": "a6b33dfc9e8949b7e28133c4628b29cd9f1850bb" + "reference": "37874fa473131247c348059fb7b8985efc18b5ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/Locale/zipball/a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", - "reference": "a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", + "url": "https://api.github.com/repos/giggsey/Locale/zipball/37874fa473131247c348059fb7b8985efc18b5ea", + "reference": "37874fa473131247c348059fb7b8985efc18b5ea", "shasum": "" }, "require": { @@ -3124,40 +3267,42 @@ "description": "Locale functions required by libphonenumber-for-php", "support": { "issues": "https://github.com/giggsey/Locale/issues", - "source": "https://github.com/giggsey/Locale/tree/2.4" + "source": "https://github.com/giggsey/Locale/tree/2.6" }, - "time": "2023-04-13T07:40:58+00:00" + "time": "2024-04-18T19:31:19+00:00" }, { "name": "google/auth", - "version": "v1.28.0", + "version": "v1.42.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "07f7f6305f1b7df32b2acf6e101c1225c839c7ac" + "reference": "0c25599a91530b5847f129b271c536f75a7563f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/07f7f6305f1b7df32b2acf6e101c1225c839c7ac", - "reference": "07f7f6305f1b7df32b2acf6e101c1225c839c7ac", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/0c25599a91530b5847f129b271c536f75a7563f5", + "reference": "0c25599a91530b5847f129b271c536f75a7563f5", "shasum": "" }, "require": { "firebase/php-jwt": "^6.0", - "guzzlehttp/guzzle": "^6.2.1|^7.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.4.5", - "php": "^7.4||^8.0", - "psr/cache": "^1.0||^2.0||^3.0", + "php": "^8.0", + "psr/cache": "^2.0||^3.0", "psr/http-message": "^1.1||^2.0" }, "require-dev": { - "guzzlehttp/promises": "^1.3", - "kelvinmo/simplejwt": "0.7.0", - "phpseclib/phpseclib": "^3.0", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.0.0", + "guzzlehttp/promises": "^2.0", + "kelvinmo/simplejwt": "0.7.1", + "phpseclib/phpseclib": "^3.0.35", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", "sebastian/comparator": ">=1.2.3", - "squizlabs/php_codesniffer": "^3.5" + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^6.0||^7.0", + "webmozart/assert": "^1.11" }, "suggest": { "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." @@ -3182,40 +3327,41 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.28.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.42.0" }, - "time": "2023-05-11T21:58:18+00:00" + "time": "2024-08-26T18:33:48+00:00" }, { "name": "google/cloud-core", - "version": "v1.51.2", + "version": "v1.59.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "85dc48d62143f4bbfaa34c24da95003371de7b79" + "reference": "35aae23dc4d0b860b6c3733e5cf381a510b506d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/85dc48d62143f4bbfaa34c24da95003371de7b79", - "reference": "85dc48d62143f4bbfaa34c24da95003371de7b79", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/35aae23dc4d0b860b6c3733e5cf381a510b506d9", + "reference": "35aae23dc4d0b860b6c3733e5cf381a510b506d9", "shasum": "" }, "require": { - "google/auth": "^1.18", - "guzzlehttp/guzzle": "^5.3|^6.5.7|^7.4.4", - "guzzlehttp/promises": "^1.3", - "guzzlehttp/psr7": "^1.7|^2.0", - "monolog/monolog": "^1.1|^2.0|^3.0", - "php": ">=7.4", - "psr/http-message": "^1.0", + "google/auth": "^1.34", + "google/gax": "^1.34.0", + "guzzlehttp/guzzle": "^6.5.8|^7.4.4", + "guzzlehttp/promises": "^1.4||^2.0", + "guzzlehttp/psr7": "^2.6", + "monolog/monolog": "^2.9|^3.0", + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", "rize/uri-template": "~0.3" }, "require-dev": { "erusev/parsedown": "^1.6", - "google/cloud-common-protos": "^0.4", - "google/gax": "^1.9", + "google/cloud-common-protos": "~0.5", "opis/closure": "^3", - "phpdocumentor/reflection": "^5.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.0", "squizlabs/php_codesniffer": "2.*" @@ -3247,34 +3393,34 @@ ], "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.51.2" + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.59.1" }, - "time": "2023-05-05T23:01:42+00:00" + "time": "2024-08-10T02:24:23+00:00" }, { "name": "google/cloud-storage", - "version": "v1.31.2", + "version": "v1.42.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-storage.git", - "reference": "7fe96d56856cda550b21779bb95a066b264852da" + "reference": "2a418cad887e44d08a86de19a878ea3607212edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/7fe96d56856cda550b21779bb95a066b264852da", - "reference": "7fe96d56856cda550b21779bb95a066b264852da", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/2a418cad887e44d08a86de19a878ea3607212edb", + "reference": "2a418cad887e44d08a86de19a878ea3607212edb", "shasum": "" }, "require": { - "google/cloud-core": "^1.51.1", - "google/crc32": "^0.2.0", - "php": ">=7.4", + "google/cloud-core": "^1.55", + "php": "^8.0", "ramsey/uuid": "^4.2.3" }, "require-dev": { "erusev/parsedown": "^1.6", - "google/cloud-pubsub": "^1.0", - "phpdocumentor/reflection": "^5.0", + "google/cloud-pubsub": "^2.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "phpseclib/phpseclib": "^2.0||^3.0", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.0", @@ -3304,73 +3450,314 @@ ], "description": "Cloud Storage Client for PHP", "support": { - "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.31.2" + "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.42.1" }, - "time": "2023-05-05T23:01:42+00:00" + "time": "2024-07-08T23:14:13+00:00" }, { - "name": "google/crc32", - "version": "v0.2.0", + "name": "google/common-protos", + "version": "v4.7.0", "source": { "type": "git", - "url": "https://github.com/google/php-crc32.git", - "reference": "948f7945d803dcc1a375152c72f63144c2dadf23" + "url": "https://github.com/googleapis/common-protos-php.git", + "reference": "e58068776f57605c336e32c7db373f0a81da17b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/google/php-crc32/zipball/948f7945d803dcc1a375152c72f63144c2dadf23", - "reference": "948f7945d803dcc1a375152c72f63144c2dadf23", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/e58068776f57605c336e32c7db373f0a81da17b8", + "reference": "e58068776f57605c336e32c7db373f0a81da17b8", "shasum": "" }, "require": { - "php": ">=7.4" + "google/protobuf": "^v3.25.3||^4.26.1", + "php": "^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "v3.15", - "phpunit/phpunit": "^9" + "phpunit/phpunit": "^9.6" }, "type": "library", "autoload": { "psr-4": { - "Google\\CRC32\\": "src" + "Google\\Api\\": "src/Api", + "Google\\Iam\\": "src/Iam", + "Google\\Rpc\\": "src/Rpc", + "Google\\Type\\": "src/Type", + "Google\\Cloud\\": "src/Cloud", + "GPBMetadata\\Google\\Api\\": "metadata/Api", + "GPBMetadata\\Google\\Iam\\": "metadata/Iam", + "GPBMetadata\\Google\\Rpc\\": "metadata/Rpc", + "GPBMetadata\\Google\\Type\\": "metadata/Type", + "GPBMetadata\\Google\\Cloud\\": "metadata/Cloud", + "GPBMetadata\\Google\\Logging\\": "metadata/Logging" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], - "authors": [ - { - "name": "Andrew Brampton", - "email": "bramp@google.com" - } + "description": "Google API Common Protos for PHP", + "homepage": "https://github.com/googleapis/common-protos-php", + "keywords": [ + "google" ], - "description": "Various CRC32 implementations", - "homepage": "https://github.com/google/php-crc32", "support": { - "issues": "https://github.com/google/php-crc32/issues", - "source": "https://github.com/google/php-crc32/tree/v0.2.0" + "issues": "https://github.com/googleapis/common-protos-php/issues", + "source": "https://github.com/googleapis/common-protos-php/tree/v4.7.0" }, - "time": "2023-04-16T22:44:57+00:00" + "time": "2024-07-25T20:20:43+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.7.0", + "name": "google/gax", + "version": "v1.34.1", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + "url": "https://github.com/googleapis/gax-php.git", + "reference": "173f0a97323284f91fd453c4ed7ed8317ecf6cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "url": "https://api.github.com/repos/googleapis/gax-php/zipball/173f0a97323284f91fd453c4ed7ed8317ecf6cfa", + "reference": "173f0a97323284f91fd453c4ed7ed8317ecf6cfa", + "shasum": "" + }, + "require": { + "google/auth": "^1.34.0", + "google/common-protos": "^4.4", + "google/grpc-gcp": "^0.4", + "google/longrunning": "~0.4", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^1.13", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "ramsey/uuid": "^4.0" + }, + "conflict": { + "ext-protobuf": "<3.7.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.1", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\ApiCore\\": "src", + "GPBMetadata\\ApiCore\\": "metadata/ApiCore" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Google API Core for PHP", + "homepage": "https://github.com/googleapis/gax-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/gax-php/issues", + "source": "https://github.com/googleapis/gax-php/tree/v1.34.1" + }, + "time": "2024-08-15T18:00:58+00:00" + }, + { + "name": "google/grpc-gcp", + "version": "v0.4.0", + "source": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "shasum": "" + }, + "require": { + "google/auth": "^1.3", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^v1.13.0", + "php": "^8.0", + "psr/cache": "^1.0.1||^2.0.0||^3.0.0" + }, + "require-dev": { + "google/cloud-spanner": "^1.7", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\Gcp\\": "src/" + }, + "classmap": [ + "src/generated/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC GCP library for channel management", + "support": { + "issues": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues", + "source": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.4.0" + }, + "time": "2024-04-03T16:37:55+00:00" + }, + { + "name": "google/longrunning", + "version": "0.4.3", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-longrunning.git", + "reference": "ed718a735e407826c3332b7197a44602eb03e608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-longrunning/zipball/ed718a735e407826c3332b7197a44602eb03e608", + "reference": "ed718a735e407826c3332b7197a44602eb03e608", + "shasum": "" + }, + "require-dev": { + "google/gax": "^1.34.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "component": { + "id": "longrunning", + "path": "LongRunning", + "entry": null, + "target": "googleapis/php-longrunning" + } + }, + "autoload": { + "psr-4": { + "Google\\LongRunning\\": "src/LongRunning", + "Google\\ApiCore\\LongRunning\\": "src/ApiCore/LongRunning", + "GPBMetadata\\Google\\Longrunning\\": "metadata/Longrunning" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google LongRunning Client for PHP", + "support": { + "source": "https://github.com/googleapis/php-longrunning/tree/v0.4.3" + }, + "time": "2024-06-01T03:14:01+00:00" + }, + { + "name": "google/protobuf", + "version": "v4.28.0", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "17e3d804bf6631c2744c99575698f9cd4878b84f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/17e3d804bf6631c2744c99575698f9cd4878b84f", + "reference": "17e3d804bf6631c2744c99575698f9cd4878b84f", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.28.0" + }, + "time": "2024-08-28T17:54:02+00:00" + }, + { + "name": "grpc/grpc", + "version": "1.57.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/b610c42022ed3a22f831439cb93802f2a4502fdf", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io", + "keywords": [ + "rpc" + ], + "support": { + "source": "https://github.com/grpc/grpc-php/tree/v1.57.0" + }, + "time": "2023-08-14T23:57:54+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "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" @@ -3379,11 +3766,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "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.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -3461,7 +3848,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -3477,33 +3864,37 @@ "type": "tidelift" } ], - "time": "2023-05-21T14:04:53+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.3", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -3540,7 +3931,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.3" + "source": "https://github.com/guzzle/promises/tree/2.0.3" }, "funding": [ { @@ -3556,20 +3947,20 @@ "type": "tidelift" } ], - "time": "2023-05-21T12:31:43+00:00" + "time": "2024-07-18T10:29:17+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -3583,9 +3974,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -3656,7 +4047,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -3672,7 +4063,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "handcraftedinthealps/goodby-csv", @@ -3751,16 +4142,16 @@ }, { "name": "hautelook/alice-bundle", - "version": "2.12.0", + "version": "2.12.2", "source": { "type": "git", "url": "https://github.com/theofidry/AliceBundle.git", - "reference": "ebaf24ec0318583d8c022966687e2a4979bb9af8" + "reference": "76485f14618725c3555e3c2737c68088d06104fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/AliceBundle/zipball/ebaf24ec0318583d8c022966687e2a4979bb9af8", - "reference": "ebaf24ec0318583d8c022966687e2a4979bb9af8", + "url": "https://api.github.com/repos/theofidry/AliceBundle/zipball/76485f14618725c3555e3c2737c68088d06104fb", + "reference": "76485f14618725c3555e3c2737c68088d06104fb", "shasum": "" }, "require": { @@ -3818,44 +4209,45 @@ ], "support": { "issues": "https://github.com/theofidry/AliceBundle/issues", - "source": "https://github.com/theofidry/AliceBundle/tree/2.12.0" + "source": "https://github.com/theofidry/AliceBundle/tree/2.12.2" }, - "time": "2023-03-26T09:04:39+00:00" + "time": "2023-11-22T23:06:15+00:00" }, { "name": "knplabs/knp-components", - "version": "v4.1.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/KnpLabs/knp-components.git", - "reference": "6b6efa81ee894e325744bf785d50dc962937b1f2" + "reference": "1dbd333b8f1915b6825f692f2831bf81b27e22a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/knp-components/zipball/6b6efa81ee894e325744bf785d50dc962937b1f2", - "reference": "6b6efa81ee894e325744bf785d50dc962937b1f2", + "url": "https://api.github.com/repos/KnpLabs/knp-components/zipball/1dbd333b8f1915b6825f692f2831bf81b27e22a2", + "reference": "1dbd333b8f1915b6825f692f2831bf81b27e22a2", "shasum": "" }, "require": { - "php": "^8.0", + "php": "^8.1", "symfony/event-dispatcher-contracts": "^3.0" }, "conflict": { - "doctrine/dbal": "<2.10" + "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": "^10.5 || ^11.3", "propel/propel1": "^1.7", "ruflin/elastica": "^7.0", "solarium/solarium": "^6.0", - "symfony/http-foundation": "^5.4 || ^6.0", - "symfony/http-kernel": "^5.4 || ^6.0", - "symfony/property-access": "^5.4 || ^6.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", @@ -3871,7 +4263,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -3894,7 +4286,7 @@ } ], "description": "Knplabs component library", - "homepage": "http://github.com/KnpLabs/knp-components", + "homepage": "https://github.com/KnpLabs/knp-components", "keywords": [ "components", "knp", @@ -3904,46 +4296,46 @@ ], "support": { "issues": "https://github.com/KnpLabs/knp-components/issues", - "source": "https://github.com/KnpLabs/knp-components/tree/v4.1.0" + "source": "https://github.com/KnpLabs/knp-components/tree/v5.0.0" }, - "time": "2022-12-19T09:36:54+00:00" + "time": "2024-08-22T12:34:41+00:00" }, { "name": "knplabs/knp-paginator-bundle", - "version": "v6.2.0", + "version": "v6.5.0", "source": { "type": "git", "url": "https://github.com/KnpLabs/KnpPaginatorBundle.git", - "reference": "8da698f0856b1d9c9c02dcacbfc382c5c9440c80" + "reference": "f2462bcb0585c50f927ede5910e6da36b965d480" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/KnpPaginatorBundle/zipball/8da698f0856b1d9c9c02dcacbfc382c5c9440c80", - "reference": "8da698f0856b1d9c9c02dcacbfc382c5c9440c80", + "url": "https://api.github.com/repos/KnpLabs/KnpPaginatorBundle/zipball/f2462bcb0585c50f927ede5910e6da36b965d480", + "reference": "f2462bcb0585c50f927ede5910e6da36b965d480", "shasum": "" }, "require": { - "knplabs/knp-components": "^4.1", - "php": "^8.0", - "symfony/config": "^6.0", - "symfony/dependency-injection": "^6.0", - "symfony/event-dispatcher": "^6.0", - "symfony/http-foundation": "^6.0", - "symfony/http-kernel": "^6.0", - "symfony/routing": "^6.0", - "symfony/translation": "^6.0", + "knplabs/knp-components": "^4.4 || ^5.0", + "php": "^8.1", + "symfony/config": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/event-dispatcher": "^6.4 || ^7.0", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/routing": "^6.4 || ^7.0", + "symfony/translation": "^6.4 || ^7.0", "twig/twig": "^3.0" }, "require-dev": { - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^9.5", - "symfony/expression-language": "^6.0", - "symfony/templating": "^6.0" + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^10.5 || ^11.3", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/templating": "^6.4 || ^7.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "6.x-dev" } }, "autoload": { @@ -3978,35 +4370,35 @@ ], "support": { "issues": "https://github.com/KnpLabs/KnpPaginatorBundle/issues", - "source": "https://github.com/KnpLabs/KnpPaginatorBundle/tree/v6.2.0" + "source": "https://github.com/KnpLabs/KnpPaginatorBundle/tree/v6.5.0" }, - "time": "2023-03-25T06:51:40+00:00" + "time": "2024-09-03T06:34:25+00:00" }, { "name": "laminas/laminas-code", - "version": "4.11.0", + "version": "4.14.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "169123b3ede20a9193480c53de2a8194f8c073ec" + "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/169123b3ede20a9193480c53de2a8194f8c073ec", - "reference": "169123b3ede20a9193480c53de2a8194f8c073ec", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/562e02b7d85cb9142b5116cc76c4c7c162a11a1c", + "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" }, "require-dev": { - "doctrine/annotations": "^2.0.0", + "doctrine/annotations": "^2.0.1", "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.3.0", - "laminas/laminas-stdlib": "^3.6.1", - "phpunit/phpunit": "^10.0.9", - "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.7.1" + "laminas/laminas-coding-standard": "^2.5.0", + "laminas/laminas-stdlib": "^3.17.0", + "phpunit/phpunit": "^10.3.3", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.15.0" }, "suggest": { "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", @@ -4043,41 +4435,39 @@ "type": "community_bridge" } ], - "time": "2023-05-14T12:05:38+00:00" + "time": "2024-06-17T08:50:25+00:00" }, { "name": "lcobucci/jwt", - "version": "5.0.0", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "47bdb0e0b5d00c2f89ebe33e7e384c77e84e7c34" + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/47bdb0e0b5d00c2f89ebe33e7e384c77e84e7c34", - "reference": "47bdb0e0b5d00c2f89ebe33e7e384c77e84e7c34", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", "shasum": "" }, "require": { - "ext-hash": "*", - "ext-json": "*", "ext-openssl": "*", "ext-sodium": "*", - "php": "~8.1.0 || ~8.2.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", "psr/clock": "^1.0" }, "require-dev": { - "infection/infection": "^0.26.19", + "infection/infection": "^0.27.0", "lcobucci/clock": "^3.0", - "lcobucci/coding-standard": "^9.0", - "phpbench/phpbench": "^1.2.8", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2.9", "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.10.3", - "phpstan/phpstan-deprecation-rules": "^1.1.2", - "phpstan/phpstan-phpunit": "^1.3.8", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.0.12" + "phpunit/phpunit": "^10.2.6" }, "suggest": { "lcobucci/clock": ">= 3.0" @@ -4106,7 +4496,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.0.0" + "source": "https://github.com/lcobucci/jwt/tree/5.3.0" }, "funding": [ { @@ -4118,20 +4508,20 @@ "type": "patreon" } ], - "time": "2023-02-25T21:35:16+00:00" + "time": "2024-04-11T23:07:54+00:00" }, { "name": "league/commonmark", - "version": "2.4.0", + "version": "2.5.3", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" + "reference": "b650144166dfa7703e62a22e493b853b58d874b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0", + "reference": "b650144166dfa7703e62a22e493b853b58d874b0", "shasum": "" }, "require": { @@ -4144,8 +4534,8 @@ }, "require-dev": { "cebe/markdown": "^1.0", - "commonmark/cmark": "0.30.0", - "commonmark/commonmark.js": "0.30.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", "composer/package-versions-deprecated": "^1.8", "embed/embed": "^4.4", "erusev/parsedown": "^1.0", @@ -4154,10 +4544,10 @@ "michelf/php-markdown": "^1.4 || ^2.0", "nyholm/psr7": "^1.5", "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.21", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0" }, @@ -4167,7 +4557,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.6-dev" } }, "autoload": { @@ -4224,7 +4614,7 @@ "type": "tidelift" } ], - "time": "2023-03-24T15:16:10+00:00" + "time": "2024-08-16T11:46:16+00:00" }, { "name": "league/config", @@ -4310,16 +4700,16 @@ }, { "name": "league/flysystem", - "version": "3.15.1", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a141d430414fcb8bf797a18716b09f759a385bed" + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a141d430414fcb8bf797a18716b09f759a385bed", - "reference": "a141d430414fcb8bf797a18716b09f759a385bed", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", "shasum": "" }, "require": { @@ -4328,6 +4718,8 @@ "php": "^8.0.2" }, "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", "aws/aws-sdk-php": "3.209.31 || 3.210.0", "guzzlehttp/guzzle": "<7.0", "guzzlehttp/ringphp": "<1.1.1", @@ -4335,20 +4727,23 @@ "symfony/http-client": "<5.2" }, "require-dev": { - "async-aws/s3": "^1.5", - "async-aws/simple-s3": "^1.1", - "aws/aws-sdk-php": "^3.220.0", + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", + "ext-mongodb": "^1.3", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "phpseclib/phpseclib": "^3.0.14", - "phpstan/phpstan": "^0.12.26", - "phpunit/phpunit": "^9.5.11", - "sabre/dav": "^4.3.1" + "mongodb/mongodb": "^1.2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" }, "type": "library", "autoload": { @@ -4382,36 +4777,26 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.15.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2023-05-04T09:04:26+00:00" + "time": "2024-05-22T10:09:12+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.15.0", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "d8de61ee10b6a607e7996cff388c5a3a663e8c8a" + "reference": "22071ef1604bc776f5ff2468ac27a752514665c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/d8de61ee10b6a607e7996cff388c5a3a663e8c8a", - "reference": "d8de61ee10b6a607e7996cff388c5a3a663e8c8a", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/22071ef1604bc776f5ff2468ac27a752514665c8", + "reference": "22071ef1604bc776f5ff2468ac27a752514665c8", "shasum": "" }, "require": { - "aws/aws-sdk-php": "^3.220.0", + "aws/aws-sdk-php": "^3.295.10", "league/flysystem": "^3.10.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" @@ -4447,57 +4832,49 @@ "storage" ], "support": { - "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.15.0" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2023-05-02T20:02:14+00:00" + "time": "2024-05-06T20:05:52+00:00" }, { "name": "league/flysystem-bundle", - "version": "3.1.0", + "version": "3.3.5", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-bundle.git", - "reference": "4b6e8095dbb9bed9971b4a5d8158cc6d8e720a26" + "reference": "4fff744a247d360cb7b0b5f641d951f27d37013c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/4b6e8095dbb9bed9971b4a5d8158cc6d8e720a26", - "reference": "4b6e8095dbb9bed9971b4a5d8158cc6d8e720a26", + "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/4fff744a247d360cb7b0b5f641d951f27d37013c", + "reference": "4fff744a247d360cb7b0b5f641d951f27d37013c", "shasum": "" }, "require": { "league/flysystem": "^3.0", "php": ">=8.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/options-resolver": "^5.4|^6.0" + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { + "doctrine/mongodb-odm": "^2.0", "league/flysystem-async-aws-s3": "^3.1", "league/flysystem-aws-s3-v3": "^3.1", "league/flysystem-azure-blob-storage": "^3.1", "league/flysystem-ftp": "^3.1", "league/flysystem-google-cloud-storage": "^3.1", + "league/flysystem-gridfs": "^3.28", "league/flysystem-memory": "^3.1", + "league/flysystem-read-only": "^3.15", "league/flysystem-sftp-v3": "^3.1", - "symfony/dotenv": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/dotenv": "^5.4 || ^6.0 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "type": "symfony-bundle", "autoload": { @@ -4518,22 +4895,22 @@ "description": "Symfony bundle integrating Flysystem into Symfony 5.4+ applications", "support": { "issues": "https://github.com/thephpleague/flysystem-bundle/issues", - "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.1.0" + "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.3.5" }, - "time": "2022-12-26T19:09:49+00:00" + "time": "2024-05-30T20:04:21+00:00" }, { "name": "league/flysystem-google-cloud-storage", - "version": "3.15.0", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-google-cloud-storage.git", - "reference": "c7949cd9919801f9820902e02d148e7158ef80e0" + "reference": "072b92961e6d14272de4b857546fe824e689775b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-google-cloud-storage/zipball/c7949cd9919801f9820902e02d148e7158ef80e0", - "reference": "c7949cd9919801f9820902e02d148e7158ef80e0", + "url": "https://api.github.com/repos/thephpleague/flysystem-google-cloud-storage/zipball/072b92961e6d14272de4b857546fe824e689775b", + "reference": "072b92961e6d14272de4b857546fe824e689775b", "shasum": "" }, "require": { @@ -4566,33 +4943,22 @@ "google cloud storage" ], "support": { - "issues": "https://github.com/thephpleague/flysystem-google-cloud-storage/issues", - "source": "https://github.com/thephpleague/flysystem-google-cloud-storage/tree/3.15.0" + "source": "https://github.com/thephpleague/flysystem-google-cloud-storage/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2023-05-02T20:02:14+00:00" + "time": "2024-05-06T20:05:52+00:00" }, { "name": "league/flysystem-local", - "version": "3.15.0", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3" + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/543f64c397fefdf9cfeac443ffb6beff602796b3", - "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", "shasum": "" }, "require": { @@ -4626,33 +4992,22 @@ "local" ], "support": { - "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.15.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2023-05-02T20:02:14+00:00" + "time": "2024-05-06T20:05:52+00:00" }, { "name": "league/flysystem-memory", - "version": "3.15.0", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-memory.git", - "reference": "b6caa40a84ae1d7dd9c4c1ff8b797e08790ee892" + "reference": "009a4a1b64dfbfb709fad9ced8dc3d2ed2224f85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/b6caa40a84ae1d7dd9c4c1ff8b797e08790ee892", - "reference": "b6caa40a84ae1d7dd9c4c1ff8b797e08790ee892", + "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/009a4a1b64dfbfb709fad9ced8dc3d2ed2224f85", + "reference": "009a4a1b64dfbfb709fad9ced8dc3d2ed2224f85", "shasum": "" }, "require": { @@ -4685,43 +5040,32 @@ "memory" ], "support": { - "issues": "https://github.com/thephpleague/flysystem-memory/issues", - "source": "https://github.com/thephpleague/flysystem-memory/tree/3.15.0" + "source": "https://github.com/thephpleague/flysystem-memory/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2023-05-02T20:02:14+00:00" + "time": "2024-05-06T20:05:52+00:00" }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.15.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -4742,7 +5086,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" }, "funding": [ { @@ -4754,7 +5098,7 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2024-01-28T23:22:08+00:00" }, { "name": "league/uri", @@ -4858,16 +5202,16 @@ }, { "name": "league/uri-components", - "version": "2.4.1", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-components.git", - "reference": "06f49e726a7fd06063e80f5f8b045fb9128e6c43" + "reference": "c93837294fe9021d518fd3ea4c5f3fbba8b8ddeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/06f49e726a7fd06063e80f5f8b045fb9128e6c43", - "reference": "06f49e726a7fd06063e80f5f8b045fb9128e6c43", + "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/c93837294fe9021d518fd3ea4c5f3fbba8b8ddeb", + "reference": "c93837294fe9021d518fd3ea4c5f3fbba8b8ddeb", "shasum": "" }, "require": { @@ -4877,15 +5221,15 @@ "psr/http-message": "^1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.8.0", + "friendsofphp/php-cs-fixer": "^v3.22.0", "guzzlehttp/psr7": "^2.2", - "laminas/laminas-diactoros": "^2.11.0", + "laminas/laminas-diactoros": "^2.11", "league/uri": "^6.0", - "phpstan/phpstan": "^1.7", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.2", - "phpunit/phpunit": "^9.5.20" + "phpstan/phpstan": "^1.10.28", + "phpstan/phpstan-deprecation-rules": "^1.1.4", + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^9.6.10" }, "suggest": { "ext-fileinfo": "Needed to create Data URI from a filepath", @@ -4935,8 +5279,7 @@ "userinfo" ], "support": { - "issues": "https://github.com/thephpleague/uri-components/issues", - "source": "https://github.com/thephpleague/uri-components/tree/2.4.1" + "source": "https://github.com/thephpleague/uri-components/tree/2.4.2" }, "funding": [ { @@ -4944,7 +5287,7 @@ "type": "github" } ], - "time": "2022-05-26T05:50:46+00:00" + "time": "2023-08-13T19:53:57+00:00" }, { "name": "league/uri-interfaces", @@ -5019,16 +5362,16 @@ }, { "name": "lorenzo/pinky", - "version": "1.0.9", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/lorenzo/pinky.git", - "reference": "f890472e4a25f89591f176aa03d9588a9d3332a7" + "reference": "e1b1bdb2c132b8a7ba32bca64d2443f646ddbd17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lorenzo/pinky/zipball/f890472e4a25f89591f176aa03d9588a9d3332a7", - "reference": "f890472e4a25f89591f176aa03d9588a9d3332a7", + "url": "https://api.github.com/repos/lorenzo/pinky/zipball/e1b1bdb2c132b8a7ba32bca64d2443f646ddbd17", + "reference": "e1b1bdb2c132b8a7ba32bca64d2443f646ddbd17", "shasum": "" }, "require": { @@ -5066,22 +5409,22 @@ ], "support": { "issues": "https://github.com/lorenzo/pinky/issues", - "source": "https://github.com/lorenzo/pinky/tree/1.0.9" + "source": "https://github.com/lorenzo/pinky/tree/1.1.0" }, - "time": "2023-01-12T16:15:52+00:00" + "time": "2023-07-31T13:36:50+00:00" }, { "name": "masterminds/html5", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "3c5d5a56d56f48a1ca08a0670f0f80c1dad368f3" + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/3c5d5a56d56f48a1ca08a0670f0f80c1dad368f3", - "reference": "3c5d5a56d56f48a1ca08a0670f0f80c1dad368f3", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { @@ -5089,7 +5432,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": { @@ -5133,41 +5476,40 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.0" + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "time": "2023-04-26T07:27:39+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { "name": "meilisearch/meilisearch-php", - "version": "v1.1.1", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/meilisearch/meilisearch-php.git", - "reference": "950d587995bbd72f5eb794a1f3e88eceb34f6245" + "reference": "110be455194fda42ae3a3b8b6a9243479c3a6d19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/meilisearch/meilisearch-php/zipball/950d587995bbd72f5eb794a1f3e88eceb34f6245", - "reference": "950d587995bbd72f5eb794a1f3e88eceb34f6245", + "url": "https://api.github.com/repos/meilisearch/meilisearch-php/zipball/110be455194fda42ae3a3b8b6a9243479c3a6d19", + "reference": "110be455194fda42ae3a3b8b6a9243479c3a6d19", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.4 || ^8.0", - "php-http/client-common": "^2.0", "php-http/discovery": "^1.7", - "php-http/httplug": "^2.1" + "psr/http-client": "^1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.0", - "guzzlehttp/guzzle": "^7.1", - "http-interop/http-factory-guzzle": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "1.10.8", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^9.5" + "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": { "guzzlehttp/guzzle": "Use Guzzle ^7 as HTTP client", @@ -5186,7 +5528,7 @@ ], "authors": [ { - "name": "Clementine Urquizar", + "name": "Clementine", "email": "clementine@meilisearch.com" } ], @@ -5201,22 +5543,22 @@ ], "support": { "issues": "https://github.com/meilisearch/meilisearch-php/issues", - "source": "https://github.com/meilisearch/meilisearch-php/tree/v1.1.1" + "source": "https://github.com/meilisearch/meilisearch-php/tree/v1.10.0" }, - "time": "2023-04-03T10:05:59+00:00" + "time": "2024-08-26T23:09:54+00:00" }, { "name": "mollie/mollie-api-php", - "version": "v2.55.0", + "version": "v2.71.0", "source": { "type": "git", "url": "https://github.com/mollie/mollie-api-php.git", - "reference": "a2be26bd83dd33ea187a2238fbe0b30582c50774" + "reference": "dff324f0621ff134fbefffa42ee511833a58578f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/a2be26bd83dd33ea187a2238fbe0b30582c50774", - "reference": "a2be26bd83dd33ea187a2238fbe0b30582c50774", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/dff324f0621ff134fbefffa42ee511833a58578f", + "reference": "dff324f0621ff134fbefffa42ee511833a58578f", "shasum": "" }, "require": { @@ -5293,9 +5635,9 @@ ], "support": { "issues": "https://github.com/mollie/mollie-api-php/issues", - "source": "https://github.com/mollie/mollie-api-php/tree/v2.55.0" + "source": "https://github.com/mollie/mollie-api-php/tree/v2.71.0" }, - "time": "2023-05-09T10:09:56+00:00" + "time": "2024-07-17T08:02:14+00:00" }, { "name": "moneyphp/money", @@ -5385,16 +5727,16 @@ }, { "name": "monolog/monolog", - "version": "3.3.1", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "9b5daeaffce5b926cac47923798bba91059e60e2" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/9b5daeaffce5b926cac47923798bba91059e60e2", - "reference": "9b5daeaffce5b926cac47923798bba91059e60e2", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -5409,7 +5751,7 @@ "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "graylog2/gelf-php": "^1.4.2 || ^2.0", "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", @@ -5417,7 +5759,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^9.5.26", + "phpunit/phpunit": "^10.5.17", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -5470,7 +5812,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.3.1" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -5482,29 +5824,29 @@ "type": "tidelift" } ], - "time": "2023-02-06T13:46:10+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.6.1", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", + "php": "^7.2.5 || ^8.0", "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^7.5.15" + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" }, "bin": [ "bin/jp.php" @@ -5512,7 +5854,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.8-dev" } }, "autoload": { @@ -5528,6 +5870,11 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", @@ -5541,22 +5888,22 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" }, - "time": "2021-06-14T00:11:39+00:00" + "time": "2024-09-04T18:46:31+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -5564,11 +5911,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", @@ -5594,7 +5942,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.0" }, "funding": [ { @@ -5602,44 +5950,44 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nelmio/alice", - "version": "3.12.2", + "version": "3.13.6", "source": { "type": "git", "url": "https://github.com/nelmio/alice.git", - "reference": "a020c0767e10dbb7bf1c193e16e94710691133d9" + "reference": "76caab8675c68956d56a2dd03f66384251e0aa7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/alice/zipball/a020c0767e10dbb7bf1c193e16e94710691133d9", - "reference": "a020c0767e10dbb7bf1c193e16e94710691133d9", + "url": "https://api.github.com/repos/nelmio/alice/zipball/76caab8675c68956d56a2dd03f66384251e0aa7c", + "reference": "76caab8675c68956d56a2dd03f66384251e0aa7c", "shasum": "" }, "require": { "fakerphp/faker": "^1.10", "myclabs/deep-copy": "^1.10", "php": "^8.1", - "sebastian/comparator": "^3.0 || ^4.0 || ^5.0", - "symfony/property-access": "^5.4 || ^6.0", - "symfony/yaml": "^5.4 || ^6.0" + "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/yaml": "^6.0 || ^7.0" }, "conflict": { - "symfony/framework-bundle": "<5.4.0" + "symfony/framework-bundle": "<6.4.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "phpspec/prophecy": "^1.6", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.3", - "symfony/config": "^5.4 || ^6.0", - "symfony/dependency-injection": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/http-kernel": "^5.4 || ^6.0", - "symfony/phpunit-bridge": "^5.4 || ^6.0", - "symfony/var-dumper": "^5.4 || ^6.0" + "symfony/config": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/finder": "^6.4 || ^7.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/phpunit-bridge": "^6.4 || ^7.0", + "symfony/var-dumper": "^6.4 || ^7.0" }, "suggest": { "theofidry/alice-data-fixtures": "Wrapper for Alice to provide a persistence layer." @@ -5647,7 +5995,8 @@ "type": "library", "extra": { "bamarni-bin": { - "bin-links": false + "bin-links": false, + "forward-command": false }, "branch-alias": { "dev-master": "3.x-dev" @@ -5688,7 +6037,7 @@ ], "support": { "issues": "https://github.com/nelmio/alice/issues", - "source": "https://github.com/nelmio/alice/tree/3.12.2" + "source": "https://github.com/nelmio/alice/tree/3.13.6" }, "funding": [ { @@ -5696,29 +6045,29 @@ "type": "github" } ], - "time": "2023-02-13T11:17:55+00:00" + "time": "2024-07-03T17:54:12+00:00" }, { "name": "nelmio/cors-bundle", - "version": "2.3.1", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioCorsBundle.git", - "reference": "185d2c0ae50a3f0b628790170164d5f1c5b7c281" + "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/185d2c0ae50a3f0b628790170164d5f1c5b7c281", - "reference": "185d2c0ae50a3f0b628790170164d5f1c5b7c281", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/3a526fe025cd20e04a6a11370cf5ab28dbb5a544", + "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544", "shasum": "" }, "require": { "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0" + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "mockery/mockery": "^1.2", - "symfony/phpunit-bridge": "^4.4 || ^5.4 || ^6.0" + "mockery/mockery": "^1.3.6", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" }, "type": "symfony-bundle", "extra": { @@ -5756,34 +6105,39 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.3.1" + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.5.0" }, - "time": "2023-02-16T08:49:29+00:00" + "time": "2024-06-24T21:25:28+00:00" }, { "name": "nesbot/carbon", - "version": "2.66.0", + "version": "2.72.5", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "496712849902241f04902033b0441b269effe001" + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001", - "reference": "496712849902241f04902033b0441b269effe001", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed", + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed", "shasum": "" }, "require": { + "carbonphp/carbon-doctrine-types": "*", "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "psr/clock-implementation": "1.0" + }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4", - "doctrine/orm": "^2.7", + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", "ondrejmirtes/better-reflection": "*", @@ -5800,8 +6154,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" }, "laravel": { "providers": [ @@ -5860,35 +6214,35 @@ "type": "tidelift" } ], - "time": "2023-01-29T18:53:47+00:00" + "time": "2024-06-03T19:18:41+00:00" }, { "name": "nette/schema", - "version": "v1.2.3", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", "shasum": "" }, "require": { - "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.3" + "nette/utils": "^4.0", + "php": "8.1 - 8.3" }, "require-dev": { - "nette/tester": "^2.3 || ^2.4", + "nette/tester": "^2.4", "phpstan/phpstan-nette": "^1.0", - "tracy/tracy": "^2.7" + "tracy/tracy": "^2.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -5920,26 +6274,26 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.3" + "source": "https://github.com/nette/schema/tree/v1.3.0" }, - "time": "2022-10-13T01:24:26+00:00" + "time": "2023-12-11T11:54:22+00:00" }, { "name": "nette/utils", - "version": "v4.0.0", + "version": "v4.0.5", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e" + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/cacdbf5a91a657ede665c541eda28941d4b09c1e", - "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", "shasum": "" }, "require": { - "php": ">=8.0 <8.3" + "php": "8.0 - 8.4" }, "conflict": { "nette/finder": "<3", @@ -5947,7 +6301,7 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.4", + "nette/tester": "^2.5", "phpstan/phpstan": "^1.0", "tracy/tracy": "^2.9" }, @@ -5957,8 +6311,7 @@ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-json": "to use Nette\\Utils\\Json", "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { @@ -6007,22 +6360,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.0" + "source": "https://github.com/nette/utils/tree/v4.0.5" }, - "time": "2023-02-02T10:41:53+00:00" + "time": "2024-08-07T15:39:19+00:00" }, { "name": "nyholm/psr7", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", "shasum": "" }, "require": { @@ -6075,7 +6428,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.0" + "source": "https://github.com/Nyholm/psr7/tree/1.8.1" }, "funding": [ { @@ -6087,30 +6440,28 @@ "type": "github" } ], - "time": "2023-05-02T11:26:24+00:00" + "time": "2023-11-13T09:31:12+00:00" }, { "name": "odolbeau/phone-number-bundle", - "version": "v3.9.1", + "version": "v3.10.0", "source": { "type": "git", "url": "https://github.com/odolbeau/phone-number-bundle.git", - "reference": "a4c084d9709a416511234b49d6803d76b64dbc02" + "reference": "d8fccfb56ff012fcc04aa580d60e0bead29df4b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/odolbeau/phone-number-bundle/zipball/a4c084d9709a416511234b49d6803d76b64dbc02", - "reference": "a4c084d9709a416511234b49d6803d76b64dbc02", + "url": "https://api.github.com/repos/odolbeau/phone-number-bundle/zipball/d8fccfb56ff012fcc04aa580d60e0bead29df4b1", + "reference": "d8fccfb56ff012fcc04aa580d60e0bead29df4b1", "shasum": "" }, "require": { - "giggsey/libphonenumber-for-php": "^8.0", - "php": ">=7.4", - "symfony/framework-bundle": "^4.4|^5.3|^6.0", - "symfony/intl": "^4.4|^5.3|^6.0" - }, - "conflict": { - "symfony/serializer": "6.0.0" + "giggsey/libphonenumber-for-php": "^8.9", + "php": ">=8.1", + "symfony/framework-bundle": "^5.4 || ^6.3 || ^7.0", + "symfony/intl": "^5.4 || ^6.3 || ^7.0", + "symfony/polyfill-mbstring": "^1.28" }, "replace": { "misd/phone-number-bundle": "self.version" @@ -6118,12 +6469,13 @@ "require-dev": { "doctrine/doctrine-bundle": "^1.12|^2.0", "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "symfony/form": "^4.4|^5.3|^6.0", - "symfony/property-access": "^4.4|^5.3|^6.0", - "symfony/serializer": "^4.4|^5.3|^6.0.1", - "symfony/twig-bundle": "^4.4|^5.3|^6.0", - "symfony/validator": "^4.4|^5.3|^6.0" + "phpunit/phpunit": "^9.6.11", + "symfony/form": "^5.4 || ^6.3 || ^7.0", + "symfony/phpunit-bridge": "^7.0", + "symfony/property-access": "^5.4 || ^6.3 || ^7.0", + "symfony/serializer": "^5.4 || ^6.3 || ^7.0", + "symfony/twig-bundle": "^5.4 || ^6.3 || ^7.0", + "symfony/validator": "^5.4 || ^6.3 || ^7.0" }, "suggest": { "doctrine/doctrine-bundle": "Add a DBAL mapping type", @@ -6136,7 +6488,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "3.6.x-dev" + "dev-master": "3.10.x-dev" } }, "autoload": { @@ -6159,23 +6511,23 @@ ], "support": { "issues": "https://github.com/odolbeau/phone-number-bundle/issues", - "source": "https://github.com/odolbeau/phone-number-bundle/tree/v3.9.1" + "source": "https://github.com/odolbeau/phone-number-bundle/tree/v3.10.0" }, - "time": "2023-01-16T11:06:41+00:00" + "time": "2023-12-05T17:40:56+00:00" }, { "name": "payum/core", - "version": "1.7.3", + "version": "1.7.4", "target-dir": "Payum/Core", "source": { "type": "git", "url": "https://github.com/Payum/Core.git", - "reference": "37b75090d77245569c481c4b9240a9cf01e0e8c8" + "reference": "77f621c2bec49dcb2c148b5a01e07d074564e283" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Payum/Core/zipball/37b75090d77245569c481c4b9240a9cf01e0e8c8", - "reference": "37b75090d77245569c481c4b9240a9cf01e0e8c8", + "url": "https://api.github.com/repos/Payum/Core/zipball/77f621c2bec49dcb2c148b5a01e07d074564e283", + "reference": "77f621c2bec49dcb2c148b5a01e07d074564e283", "shasum": "" }, "require": { @@ -6277,9 +6629,9 @@ "withdrawal" ], "support": { - "source": "https://github.com/Payum/Core/tree/1.7.3" + "source": "https://github.com/Payum/Core/tree/1.7.4" }, - "time": "2022-07-04T09:47:14+00:00" + "time": "2023-11-06T09:43:01+00:00" }, { "name": "payum/iso4217", @@ -6351,17 +6703,17 @@ }, { "name": "payum/offline", - "version": "1.7.3", + "version": "1.7.4", "target-dir": "Payum/Offline", "source": { "type": "git", "url": "https://github.com/Payum/Offline.git", - "reference": "0600b0eb3cff8f19a351a0b3c7d29743c9cdbb20" + "reference": "1b980f5ed4805d6a2b048b84b88ece973de64d36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Payum/Offline/zipball/0600b0eb3cff8f19a351a0b3c7d29743c9cdbb20", - "reference": "0600b0eb3cff8f19a351a0b3c7d29743c9cdbb20", + "url": "https://api.github.com/repos/Payum/Offline/zipball/1b980f5ed4805d6a2b048b84b88ece973de64d36", + "reference": "1b980f5ed4805d6a2b048b84b88ece973de64d36", "shasum": "" }, "require": { @@ -6409,22 +6761,22 @@ "payment" ], "support": { - "source": "https://github.com/Payum/Offline/tree/1.7.3" + "source": "https://github.com/Payum/Offline/tree/1.7.4" }, - "time": "2021-05-17T19:26:36+00:00" + "time": "2023-11-06T09:43:01+00:00" }, { "name": "payum/payum-bundle", - "version": "2.5.1", + "version": "2.5.2", "source": { "type": "git", "url": "https://github.com/Payum/PayumBundle.git", - "reference": "9e1765add77c32c879d937444c89c3e044d35f21" + "reference": "a10faf18eabc9066ea1e10de0d6b81f77ba0646a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Payum/PayumBundle/zipball/9e1765add77c32c879d937444c89c3e044d35f21", - "reference": "9e1765add77c32c879d937444c89c3e044d35f21", + "url": "https://api.github.com/repos/Payum/PayumBundle/zipball/a10faf18eabc9066ea1e10de0d6b81f77ba0646a", + "reference": "a10faf18eabc9066ea1e10de0d6b81f77ba0646a", "shasum": "" }, "require": { @@ -6513,54 +6865,50 @@ ], "support": { "issues": "https://github.com/Payum/PayumBundle/issues", - "source": "https://github.com/Payum/PayumBundle/tree/2.5.1" + "source": "https://github.com/Payum/PayumBundle/tree/2.5.2" }, - "time": "2023-05-03T10:39:27+00:00" + "time": "2023-08-16T15:46:43+00:00" }, { - "name": "php-http/client-common", - "version": "2.6.1", + "name": "php-http/curl-client", + "version": "2.3.2", "source": { "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "665bfc381bb910385f70391ed3eeefd0b7bbdd0d" + "url": "https://github.com/php-http/curl-client.git", + "reference": "0b869922458b1cde9137374545ed4fff7ac83623" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/665bfc381bb910385f70391ed3eeefd0b7bbdd0d", - "reference": "665bfc381bb910385f70391ed3eeefd0b7bbdd0d", + "url": "https://api.github.com/repos/php-http/curl-client/zipball/0b869922458b1cde9137374545ed4fff7ac83623", + "reference": "0b869922458b1cde9137374545ed4fff7ac83623", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", + "ext-curl": "*", + "php": "^7.4 || ^8.0", + "php-http/discovery": "^1.6", "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "php-http/message-factory": "^1.0", + "php-http/message": "^1.2", "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.17" + "psr/http-factory-implementation": "^1.0", + "symfony/options-resolver": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" }, "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + "guzzlehttp/psr7": "^2.0", + "laminas/laminas-diactoros": "^2.0", + "php-http/client-integration-tests": "^3.0", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^7.5 || ^9.4" }, "type": "library", "autoload": { "psr-4": { - "Http\\Client\\Common\\": "src/" + "Http\\Client\\Curl\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6569,36 +6917,35 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Михаил Красильников", + "email": "m.krasilnikov@yandex.ru" } ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", + "description": "PSR-18 and HTTPlug Async client with cURL", + "homepage": "http://php-http.org", "keywords": [ - "client", - "common", + "curl", "http", - "httplug" + "psr-18" ], "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.6.1" + "issues": "https://github.com/php-http/curl-client/issues", + "source": "https://github.com/php-http/curl-client/tree/2.3.2" }, - "time": "2023-04-14T13:30:08+00:00" + "time": "2024-03-03T08:21:07+00:00" }, { "name": "php-http/discovery", - "version": "1.18.0", + "version": "1.19.4", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "29ae6fae35f4116bbfe4c8b96ccc3f687eb07cd9" + "reference": "0700efda8d7526335132360167315fdab3aeb599" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/29ae6fae35f4116bbfe4c8b96ccc3f687eb07cd9", - "reference": "29ae6fae35f4116bbfe4c8b96ccc3f687eb07cd9", + "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", + "reference": "0700efda8d7526335132360167315fdab3aeb599", "shasum": "" }, "require": { @@ -6622,7 +6969,8 @@ "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, "type": "composer-plugin", "extra": { @@ -6661,9 +7009,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.18.0" + "source": "https://github.com/php-http/discovery/tree/1.19.4" }, - "time": "2023-05-03T14:49:12+00:00" + "time": "2024-03-29T13:00:05+00:00" }, { "name": "php-http/httplug", @@ -6724,22 +7072,21 @@ }, { "name": "php-http/message", - "version": "1.15.0", + "version": "1.16.1", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "2a1fbaa00cf5ffc82f379adf47388663bce8190d" + "reference": "5997f3289332c699fa2545c427826272498a2088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/2a1fbaa00cf5ffc82f379adf47388663bce8190d", - "reference": "2a1fbaa00cf5ffc82f379adf47388663bce8190d", + "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", + "reference": "5997f3289332c699fa2545c427826272498a2088", "shasum": "" }, "require": { "clue/stream-filter": "^1.5", "php": "^7.2 || ^8.0", - "php-http/message-factory": "^1.0.2", "psr/http-message": "^1.1 || ^2.0" }, "provide": { @@ -6750,6 +7097,7 @@ "ext-zlib": "*", "guzzlehttp/psr7": "^1.0 || ^2.0", "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "slim/slim": "^3.0" }, @@ -6787,9 +7135,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.15.0" + "source": "https://github.com/php-http/message/tree/1.16.1" }, - "time": "2023-05-10T08:19:58+00:00" + "time": "2024-03-07T13:22:09+00:00" }, { "name": "php-http/message-factory", @@ -6848,31 +7196,26 @@ }, { "name": "php-http/promise", - "version": "1.1.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { "Http\\Promise\\": "src/" @@ -6899,9 +7242,9 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2020-07-07T09:29:14+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -6958,28 +7301,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "version": "5.4.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", "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", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" }, "type": "library", "extra": { @@ -7003,33 +7353,33 @@ }, { "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.4.1" }, - "time": "2021-10-19T17:43:47+00:00" + "time": "2024-05-21T05:55:05+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714" + "reference": "153ae662783729388a584b4361f2545e4d841e3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", + "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", "phpstan/phpdoc-parser": "^1.13" }, @@ -7067,28 +7417,30 @@ "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.7.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" }, - "time": "2023-03-27T19:02:04+00:00" + "time": "2024-02-23T11:10:43+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.20.4", + "version": "1.30.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd" + "reference": "5ceb0e384997db59f38774bf79c2a6134252c08f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd", - "reference": "7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/5ceb0e384997db59f38774bf79c2a6134252c08f", + "reference": "5ceb0e384997db59f38774bf79c2a6134252c08f", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", @@ -7112,9 +7464,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.20.4" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.0" }, - "time": "2023-05-02T09:19:37+00:00" + "time": "2024-08-29T09:54:52+00:00" }, { "name": "psr/cache", @@ -7318,16 +7670,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -7364,26 +7716,26 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "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", @@ -7407,7 +7759,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", @@ -7419,9 +7771,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", @@ -7534,16 +7886,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "79dff0b268932c640297f5208d6298f71855c03e" }, "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/79dff0b268932c640297f5208d6298f71855c03e", + "reference": "79dff0b268932c640297f5208d6298f71855c03e", "shasum": "" }, "require": { @@ -7578,9 +7930,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.1" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-08-21T13:31:24+00:00" }, { "name": "psr/simple-cache", @@ -7768,20 +8120,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.4", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "60a4c63ab724854332900504274f6150ff26d286" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", - "reference": "60a4c63ab724854332900504274f6150ff26d286", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -7844,7 +8196,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.4" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -7856,20 +8208,20 @@ "type": "tidelift" } ], - "time": "2023-04-15T23:01:58+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "rize/uri-template", - "version": "0.3.5", + "version": "0.3.8", "source": { "type": "git", "url": "https://github.com/rize/UriTemplate.git", - "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168" + "reference": "34a5b96d0b65a5dddb7d20f09b6527a43faede24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rize/UriTemplate/zipball/5ed4ba8ea34af84485dea815d4b6b620794d1168", - "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168", + "url": "https://api.github.com/repos/rize/UriTemplate/zipball/34a5b96d0b65a5dddb7d20f09b6527a43faede24", + "reference": "34a5b96d0b65a5dddb7d20f09b6527a43faede24", "shasum": "" }, "require": { @@ -7902,7 +8254,7 @@ ], "support": { "issues": "https://github.com/rize/UriTemplate/issues", - "source": "https://github.com/rize/UriTemplate/tree/0.3.5" + "source": "https://github.com/rize/UriTemplate/tree/0.3.8" }, "funding": [ { @@ -7918,7 +8270,7 @@ "type": "open_collective" } ], - "time": "2022-10-12T17:22:51+00:00" + "time": "2024-08-30T07:09:40+00:00" }, { "name": "sebastian/comparator", @@ -7996,16 +8348,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -8050,7 +8402,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -8058,20 +8410,20 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -8127,7 +8479,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -8135,7 +8487,7 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/recursion-context", @@ -8200,137 +8552,58 @@ ], "time": "2023-02-03T06:07:39+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" - } - ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "support": { - "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.10" - }, - "abandoned": "Symfony", - "time": "2023-02-24T14:57:12+00:00" - }, { "name": "snc/redis-bundle", - "version": "4.6.0", + "version": "4.7.2", "source": { "type": "git", "url": "https://github.com/snc/SncRedisBundle.git", - "reference": "dc5f4438d669f1c52234f1d2b7bc558f8399c58e" + "reference": "01b68b27f8a6f71cfb5dc2d4bec12bcfce7f0175" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/snc/SncRedisBundle/zipball/dc5f4438d669f1c52234f1d2b7bc558f8399c58e", - "reference": "dc5f4438d669f1c52234f1d2b7bc558f8399c58e", + "url": "https://api.github.com/repos/snc/SncRedisBundle/zipball/01b68b27f8a6f71cfb5dc2d4bec12bcfce7f0175", + "reference": "01b68b27f8a6f71cfb5dc2d4bec12bcfce7f0175", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", "symfony/deprecation-contracts": "^2 || ^3", - "symfony/framework-bundle": "^4.4 || ^5.3 || ^6.0", - "symfony/http-foundation": "^4.4 || ^5.3 || ^6.0", + "symfony/framework-bundle": "^5.4.20 ||^6.0 || ^7.0", + "symfony/http-foundation": "^5.4.20 ||^6.0 || ^7.0", "symfony/service-contracts": ">=1.0", - "symfony/var-dumper": "^4.4 || ^5.3 || ^6.0" + "symfony/var-dumper": "^5.4.20 ||^6.0 || ^7.0" }, "conflict": { "ext-redis": "<5.3", - "predis/predis": "<2.0 || >=3.0" + "predis/predis": "<2.0" }, "require-dev": { - "doctrine/annotations": "^1.13", - "doctrine/coding-standard": "^10.0", + "doctrine/annotations": "^2.0", + "doctrine/coding-standard": "^12.0", "ext-pdo_sqlite": "*", "ext-redis": "*", "friendsofphp/proxy-manager-lts": "^1.0.6", "monolog/monolog": "*", - "phpunit/phpunit": "^8.5.32 || ^9.5.28", + "phpunit/phpunit": "^9.5.28 || ^10", "predis/predis": "^2.0", - "symfony/browser-kit": "^4.4 || ^5.3 || ^6.0", - "symfony/cache": "^4.4 || ^5.3 || ^6.0", - "symfony/console": "^4.4 || ^5.3 || ^6.0", - "symfony/dom-crawler": "^4.4 || ^5.3 || ^6.0", - "symfony/filesystem": "^4.4 || ^5.3 || ^6.0", - "symfony/phpunit-bridge": "^6.0", - "symfony/profiler-pack": "^1.0", - "symfony/proxy-manager-bridge": "^4.4 || ^5.3 || ^6.0", - "symfony/stopwatch": "^4.4 || ^5.3 || ^6.0", - "symfony/twig-bundle": "^4.4 || ^5.3 || ^6.0", - "symfony/yaml": "^4.4 || ^5.3 || ^6.0", + "seec/phpunit-consecutive-params": "dev-master", + "symfony/browser-kit": "^5.4.20 ||^6.0 || ^7.0", + "symfony/cache": "^5.4.20 ||^6.0 || ^7.0", + "symfony/config": "^5.4.20 ||^6.0 || ^7.0", + "symfony/console": "^5.4.20 ||^6.0 || ^7.0", + "symfony/dom-crawler": "^5.4.20 ||^6.0 || ^7.0", + "symfony/filesystem": "^5.4.20 ||^6.0 || ^7.0", + "symfony/stopwatch": "^5.4.20 ||^6.0 || ^7.0", + "symfony/twig-bundle": "^5.4.20 ||^6.0 || ^7.0", + "symfony/web-profiler-bundle": "^5.4.20 ||^6.0 || ^7.0", + "symfony/yaml": "^5.4.20 ||^6.0 || ^7.0", "vimeo/psalm": "^5.2" }, "suggest": { "monolog/monolog": "If you want to use the monolog redis handler.", "predis/predis": "If you want to use predis.", - "symfony/console": "If you want to use commands to interact with the redis database", - "symfony/proxy-manager-bridge": "If you want to lazy-load some services" + "symfony/console": "If you want to use commands to interact with the redis database" }, "type": "symfony-bundle", "extra": { @@ -8366,36 +8639,42 @@ ], "support": { "issues": "https://github.com/snc/SncRedisBundle/issues", - "source": "https://github.com/snc/SncRedisBundle/tree/4.6.0" + "source": "https://github.com/snc/SncRedisBundle/tree/4.7.2" }, - "time": "2023-01-29T15:18:19+00:00" + "time": "2024-08-19T19:00:02+00:00" }, { "name": "stof/doctrine-extensions-bundle", - "version": "v1.7.1", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/stof/StofDoctrineExtensionsBundle.git", - "reference": "fa650e60e174afa06c09e28a54fb1854af04c7fe" + "reference": "473ae65598fa4160654c350e139e20ee75d9a91a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/fa650e60e174afa06c09e28a54fb1854af04c7fe", - "reference": "fa650e60e174afa06c09e28a54fb1854af04c7fe", + "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/473ae65598fa4160654c350e139e20ee75d9a91a", + "reference": "473ae65598fa4160654c350e139e20ee75d9a91a", "shasum": "" }, "require": { - "gedmo/doctrine-extensions": "^2.3.4 || ^3.0.0", - "php": "^7.1.3 || ^8.0", - "symfony/config": "^4.4 || ^5.2 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.2 || ^6.0", - "symfony/event-dispatcher": "^4.4 || ^5.2 || ^6.0", - "symfony/http-kernel": "^4.4 || ^5.2 || ^6.0" + "gedmo/doctrine-extensions": "^3.15.0", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "symfony/mime": "^4.4 || ^5.2 || ^6.0", - "symfony/phpunit-bridge": "^v5.2.4 || ^6.0", - "symfony/security-core": "^4.4 || ^5.2 || ^6.0" + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.5", + "phpstan/phpstan-symfony": "^1.3", + "symfony/mime": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^v6.4.1 || ^7.0.1", + "symfony/security-core": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "doctrine/doctrine-bundle": "to use the ORM extensions", @@ -8440,22 +8719,22 @@ ], "support": { "issues": "https://github.com/stof/StofDoctrineExtensionsBundle/issues", - "source": "https://github.com/stof/StofDoctrineExtensionsBundle/tree/v1.7.1" + "source": "https://github.com/stof/StofDoctrineExtensionsBundle/tree/v1.12.0" }, - "time": "2022-09-30T11:52:24+00:00" + "time": "2024-06-10T12:27:27+00:00" }, { "name": "symfony/asset", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "223df790e684ecc7bc37323c2d1e265129ca02de" + "reference": "c668aa320e26b7379540368832b9d1dd43d32603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/223df790e684ecc7bc37323c2d1e265129ca02de", - "reference": "223df790e684ecc7bc37323c2d1e265129ca02de", + "url": "https://api.github.com/repos/symfony/asset/zipball/c668aa320e26b7379540368832b9d1dd43d32603", + "reference": "c668aa320e26b7379540368832b9d1dd43d32603", "shasum": "" }, "require": { @@ -8465,12 +8744,9 @@ "symfony/http-foundation": "<5.4" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0" - }, - "suggest": { - "symfony/http-foundation": "" + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8498,7 +8774,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v6.2.7" + "source": "https://github.com/symfony/asset/tree/v6.4.8" }, "funding": [ { @@ -8514,29 +8790,99 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { - "name": "symfony/cache", - "version": "v6.2.10", + "name": "symfony/brevo-notifier", + "version": "v6.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "1ce7ed8e7ca6948892b6a3a52bb60cf2b04f7c94" + "url": "https://github.com/symfony/brevo-notifier.git", + "reference": "6c5ccdabaea84d8f88517960563ffdba78c83925" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/1ce7ed8e7ca6948892b6a3a52bb60cf2b04f7c94", - "reference": "1ce7ed8e7ca6948892b6a3a52bb60cf2b04f7c94", + "url": "https://api.github.com/repos/symfony/brevo-notifier/zipball/6c5ccdabaea84d8f88517960563ffdba78c83925", + "reference": "6c5ccdabaea84d8f88517960563ffdba78c83925", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/notifier": "^6.4|^7.0" + }, + "require-dev": { + "symfony/event-dispatcher": "^5.4|^6.0|^7.0" + }, + "type": "symfony-notifier-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Notifier\\Bridge\\Brevo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pierre Tanguy", + "homepage": "https://github.com/petanguy" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Brevo Notifier Bridge", + "homepage": "https://symfony.com", + "keywords": [ + "brevo", + "notifier" + ], + "support": { + "source": "https://github.com/symfony/brevo-notifier/tree/v6.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:51:39+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", "shasum": "" }, "require": { "php": ">=8.1", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2|^3", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^6.2.10" + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" }, "conflict": { "doctrine/dbal": "<2.13.1", @@ -8551,15 +8897,15 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3.0", - "predis/predis": "^1.1", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8594,7 +8940,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.2.10" + "source": "https://github.com/symfony/cache/tree/v6.4.12" }, "funding": [ { @@ -8610,33 +8956,30 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:42:15+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.2.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "eeb71f04b6f7f34ca6d15633df82e014528b1632" + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/eeb71f04b6f7f34ca6d15633df82e014528b1632", - "reference": "eeb71f04b6f7f34ca6d15633df82e014528b1632", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", "shasum": "" }, "require": { "php": ">=8.1", "psr/cache": "^3.0" }, - "suggest": { - "symfony/cache-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -8673,7 +9016,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" }, "funding": [ { @@ -8689,31 +9032,35 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/clock", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "54d724dcda6298a05db32aa7f69be1ce638b8417" + "reference": "7a4840efd17135cbd547e41ec49fb910ed4f8b98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/54d724dcda6298a05db32aa7f69be1ce638b8417", - "reference": "54d724dcda6298a05db32aa7f69be1ce638b8417", + "url": "https://api.github.com/repos/symfony/clock/zipball/7a4840efd17135cbd547e41ec49fb910ed4f8b98", + "reference": "7a4840efd17135cbd547e41ec49fb910ed4f8b98", "shasum": "" }, "require": { "php": ">=8.1", - "psr/clock": "^1.0" + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" }, "provide": { "psr/clock-implementation": "1.0" }, "type": "library", "autoload": { + "files": [ + "Resources/now.php" + ], "psr-4": { "Symfony\\Component\\Clock\\": "" }, @@ -8743,7 +9090,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v6.2.7" + "source": "https://github.com/symfony/clock/tree/v6.4.8" }, "funding": [ { @@ -8759,40 +9106,38 @@ "type": "tidelift" } ], - "time": "2023-02-20T14:53:25+00:00" + "time": "2024-05-31T14:51:39+00:00" }, { "name": "symfony/config", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "249271da6f545d6579e0663374f8249a80be2893" + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", - "reference": "249271da6f545d6579e0663374f8249a80be2893", + "url": "https://api.github.com/repos/symfony/config/zipball/12e7e52515ce37191b193cf3365903c4f3951e35", + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^5.4|^6.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0|^7.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8820,7 +9165,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.2.7" + "source": "https://github.com/symfony/config/tree/v6.4.8" }, "funding": [ { @@ -8836,28 +9181,28 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/console", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "12288d9f4500f84a4d02254d4aa968b15488476f" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/12288d9f4500f84a4d02254d4aa968b15488476f", - "reference": "12288d9f4500f84a4d02254d4aa968b15488476f", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.4|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/dependency-injection": "<5.4", @@ -8871,18 +9216,16 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8916,7 +9259,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.10" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -8932,20 +9275,20 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:37:43+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/css-selector", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" + "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08", + "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08", "shasum": "" }, "require": { @@ -8981,7 +9324,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.2.7" + "source": "https://github.com/symfony/css-selector/tree/v6.4.8" }, "funding": [ { @@ -8997,34 +9340,34 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "d732a66a2672669232c0b4536c8c96724a679780" + "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d732a66a2672669232c0b4536c8c96724a679780", - "reference": "d732a66a2672669232c0b4536c8c96724a679780", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", + "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", "shasum": "" }, "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/service-contracts": "^1.1.6|^2.0|^3.0", - "symfony/var-exporter": "^6.2.7" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10|^7.0" }, "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<6.1", "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.2", + "symfony/proxy-manager-bridge": "<6.3", "symfony/yaml": "<5.4" }, "provide": { @@ -9032,15 +9375,9 @@ "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^6.1", - "symfony/expression-language": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/yaml": "" + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9068,7 +9405,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.2.10" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.12" }, "funding": [ { @@ -9084,20 +9421,20 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:42:15+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -9106,7 +9443,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -9135,7 +9472,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.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -9151,78 +9488,71 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:25:55+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v6.2.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "4b3aeaa90d41c5527d7ba211d12102cedf06936e" + "reference": "b5c0a0172bbe9b1435181d94ca5cbe4af3fb45af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/4b3aeaa90d41c5527d7ba211d12102cedf06936e", - "reference": "4b3aeaa90d41c5527d7ba211d12102cedf06936e", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b5c0a0172bbe9b1435181d94ca5cbe4af3fb45af", + "reference": "b5c0a0172bbe9b1435181d94ca5cbe4af3fb45af", "shasum": "" }, "require": { "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^2|^3", + "doctrine/persistence": "^3.1", "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "doctrine/dbal": "<2.13.1", "doctrine/lexer": "<1.1", - "doctrine/orm": "<2.7.4", - "phpunit/phpunit": "<5.4.3", + "doctrine/orm": "<2.15", "symfony/cache": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/form": "<5.4.21|>=6,<6.2.7", + "symfony/dependency-injection": "<6.2", + "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.3", "symfony/http-kernel": "<6.2", + "symfony/lock": "<6.3", "symfony/messenger": "<5.4", "symfony/property-info": "<5.4", "symfony/security-bundle": "<5.4", - "symfony/security-core": "<6.0", - "symfony/validator": "<5.4" + "symfony/security-core": "<6.4", + "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", "doctrine/collections": "^1.0|^2.0", "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "^2.13.1|^3.0", - "doctrine/orm": "^2.7.4", + "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/doctrine-messenger": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/form": "^5.4.21|^6.2.7", - "symfony/http-kernel": "^6.2", - "symfony/messenger": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/proxy-manager-bridge": "^5.4|^6.0", - "symfony/security-core": "^6.0", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/property-info": "", - "symfony/validator": "" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.2|^7.0", + "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4.38|^6.4.6|^7.0.6", + "symfony/http-kernel": "^6.3|^7.0", + "symfony/lock": "^6.3|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/proxy-manager-bridge": "^6.4", + "symfony/security-core": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -9250,7 +9580,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.2.9" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.12" }, "funding": [ { @@ -9266,35 +9596,35 @@ "type": "tidelift" } ], - "time": "2023-04-11T16:08:35+00:00" + "time": "2024-09-08T12:31:10+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "a1fdf9ce88df35d538907b52cd1dac2bf86ef507" + "reference": "68ae3eeb7ee515d77fe6d0164c8df42c2ebad513" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/a1fdf9ce88df35d538907b52cd1dac2bf86ef507", - "reference": "a1fdf9ce88df35d538907b52cd1dac2bf86ef507", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/68ae3eeb7ee515d77fe6d0164c8df42c2ebad513", + "reference": "68ae3eeb7ee515d77fe6d0164c8df42c2ebad513", "shasum": "" }, "require": { - "doctrine/dbal": "^2.13|^3.0", + "doctrine/dbal": "^2.13|^3|^4", "php": ">=8.1", - "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "doctrine/persistence": "<1.3" }, "require-dev": { "doctrine/persistence": "^1.3|^2|^3", - "symfony/property-access": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" }, "type": "symfony-messenger-bridge", "autoload": { @@ -9322,7 +9652,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v6.2.10" + "source": "https://github.com/symfony/doctrine-messenger/tree/v6.4.12" }, "funding": [ { @@ -9338,20 +9668,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/dotenv", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "4481aa45be7a11d2335c1d5b5bbe2f0c6199b105" + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/4481aa45be7a11d2335c1d5b5bbe2f0c6199b105", - "reference": "4481aa45be7a11d2335c1d5b5bbe2f0c6199b105", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/815284236cab7d8e1280f53bf562c07a4dfe5954", + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954", "shasum": "" }, "require": { @@ -9362,8 +9692,8 @@ "symfony/process": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9396,7 +9726,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.2.8" + "source": "https://github.com/symfony/dotenv/tree/v6.4.12" }, "funding": [ { @@ -9412,31 +9742,35 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:06:03+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/error-handler", - "version": "v6.2.10", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb" + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8b7e9f124640cb0611624a9383176c3e5f7d8cfb", - "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -9467,7 +9801,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.2.10" + "source": "https://github.com/symfony/error-handler/tree/v6.4.10" }, "funding": [ { @@ -9483,28 +9817,29 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.2.8", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -9512,17 +9847,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9550,7 +9881,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" }, "funding": [ { @@ -9566,33 +9897,30 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -9629,7 +9957,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -9645,26 +9973,27 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/expression-language", - "version": "v6.2.7", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "83e1fee4c018aa60bcbbecd585a2c54af6aca905" + "reference": "564e109c40d3637053c942a29a58e9434592a8bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/83e1fee4c018aa60bcbbecd585a2c54af6aca905", - "reference": "83e1fee4c018aa60bcbbecd585a2c54af6aca905", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/564e109c40d3637053c942a29a58e9434592a8bf", + "reference": "564e109c40d3637053c942a29a58e9434592a8bf", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/cache": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -9692,7 +10021,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.2.7" + "source": "https://github.com/symfony/expression-language/tree/v6.4.11" }, "funding": [ { @@ -9708,27 +10037,30 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2024-08-12T09:55:28+00:00" }, { "name": "symfony/fake-sms-notifier", - "version": "v6.2.7", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/fake-sms-notifier.git", - "reference": "d6363378b5be5e77ee9238ea029a0cee8ebe42a4" + "reference": "3d16f1700c21821de3e103b3ef9df89639d3e395" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/fake-sms-notifier/zipball/d6363378b5be5e77ee9238ea029a0cee8ebe42a4", - "reference": "d6363378b5be5e77ee9238ea029a0cee8ebe42a4", + "url": "https://api.github.com/repos/symfony/fake-sms-notifier/zipball/3d16f1700c21821de3e103b3ef9df89639d3e395", + "reference": "3d16f1700c21821de3e103b3ef9df89639d3e395", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/http-client": "^5.4|^6.0", - "symfony/mailer": "^5.4|^6.0", - "symfony/notifier": "^6.2.7" + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/notifier": "^6.2.7|^7.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/mailer": "^5.4|^6.0|^7.0" }, "type": "symfony-notifier-bridge", "autoload": { @@ -9768,7 +10100,7 @@ "symfony" ], "support": { - "source": "https://github.com/symfony/fake-sms-notifier/tree/v6.2.7" + "source": "https://github.com/symfony/fake-sms-notifier/tree/v6.4.12" }, "funding": [ { @@ -9784,20 +10116,20 @@ "type": "tidelift" } ], - "time": "2023-02-17T11:05:34+00:00" + "time": "2024-09-19T12:02:43+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "fd588debf7d1bc16a2c84b4b3b71145d9946b894" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/fd588debf7d1bc16a2c84b4b3b71145d9946b894", - "reference": "fd588debf7d1bc16a2c84b4b3b71145d9946b894", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -9805,6 +10137,9 @@ "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" + }, "type": "library", "autoload": { "psr-4": { @@ -9831,7 +10166,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.10" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -9847,27 +10182,27 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", - "version": "v6.2.7", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb" + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb", + "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -9895,7 +10230,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.2.7" + "source": "https://github.com/symfony/finder/tree/v6.4.11" }, "funding": [ { @@ -9911,20 +10246,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2024-08-13T14:27:37+00:00" }, { "name": "symfony/flex", - "version": "v2.2.5", + "version": "v2.4.6", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "2ff8465e7172790a47ab3c129f2b514eb2d8a286" + "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/2ff8465e7172790a47ab3c129f2b514eb2d8a286", - "reference": "2ff8465e7172790a47ab3c129f2b514eb2d8a286", + "url": "https://api.github.com/repos/symfony/flex/zipball/4dc11919791f81d087a12db2ab4c7e044431ef6b", + "reference": "4dc11919791f81d087a12db2ab4c7e044431ef6b", "shasum": "" }, "require": { @@ -9960,7 +10295,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.2.5" + "source": "https://github.com/symfony/flex/tree/v2.4.6" }, "funding": [ { @@ -9976,67 +10311,60 @@ "type": "tidelift" } ], - "time": "2023-02-18T08:03:15+00:00" + "time": "2024-04-27T10:22:22+00:00" }, { "name": "symfony/form", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "a123512b46caea497ab8d96d9dbdbdaaf416a606" + "reference": "5037c00071b193182eae4088fbd1801793b326f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/a123512b46caea497ab8d96d9dbdbdaaf416a606", - "reference": "a123512b46caea497ab8d96d9dbdbdaaf416a606", + "url": "https://api.github.com/repos/symfony/form/zipball/5037c00071b193182eae4088fbd1801793b326f4", + "reference": "5037c00071b193182eae4088fbd1801793b326f4", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/options-resolver": "^5.4|^6.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/options-resolver": "^5.4|^6.0|^7.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4", "symfony/dependency-injection": "<5.4", "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", "symfony/error-handler": "<5.4", "symfony/framework-bundle": "<5.4", "symfony/http-kernel": "<5.4", - "symfony/translation": "<5.4", - "symfony/translation-contracts": "<1.1.7", - "symfony/twig-bridge": "<5.4.21|>=6,<6.2.7" + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.3" }, "require-dev": { "doctrine/collections": "^1.0|^2.0", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/html-sanitizer": "^6.1", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", - "symfony/security-core": "^6.2", - "symfony/security-csrf": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "symfony/security-core": "For hashing users passwords.", - "symfony/security-csrf": "For protecting forms against CSRF attacks.", - "symfony/twig-bridge": "For templating with Twig.", - "symfony/validator": "For form validation." + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -10064,7 +10392,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.2.10" + "source": "https://github.com/symfony/form/tree/v6.4.12" }, "funding": [ { @@ -10080,114 +10408,111 @@ "type": "tidelift" } ], - "time": "2023-04-19T08:03:37+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "823f285befde4e97bb70d97cae57997c38e4d6fd" + "reference": "6a9665bd1fae37b198429775c6132f193339434f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/823f285befde4e97bb70d97cae57997c38e4d6fd", - "reference": "823f285befde4e97bb70d97cae57997c38e4d6fd", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6a9665bd1fae37b198429775c6132f193339434f", + "reference": "6a9665bd1fae37b198429775c6132f193339434f", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", "php": ">=8.1", - "symfony/cache": "^5.4|^6.0", - "symfony/config": "^6.1", - "symfony/dependency-injection": "^6.2.8", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^6.1", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-foundation": "^6.2", - "symfony/http-kernel": "^6.2.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4.12|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.1|^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/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^5.4|^6.0" + "symfony/routing": "^6.4|^7.0" }, "conflict": { "doctrine/annotations": "<1.13.1", "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "phpunit/phpunit": "<5.4.3", "symfony/asset": "<5.4", - "symfony/console": "<5.4", - "symfony/dom-crawler": "<5.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.3", + "symfony/console": "<5.4|>=7.0", + "symfony/dom-crawler": "<6.4", "symfony/dotenv": "<5.4", "symfony/form": "<5.4", - "symfony/http-client": "<5.4", + "symfony/http-client": "<6.3", "symfony/lock": "<5.4", "symfony/mailer": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", + "symfony/messenger": "<6.3", + "symfony/mime": "<6.4", "symfony/property-access": "<5.4", "symfony/property-info": "<5.4", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-core": "<5.4", "symfony/security-csrf": "<5.4", - "symfony/serializer": "<6.1", + "symfony/serializer": "<6.4", "symfony/stopwatch": "<5.4", - "symfony/translation": "<6.2.8", + "symfony/translation": "<6.4", "symfony/twig-bridge": "<5.4", "symfony/twig-bundle": "<5.4", - "symfony/validator": "<5.4", - "symfony/web-profiler-bundle": "<5.4", - "symfony/workflow": "<5.4" + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" }, "require-dev": { "doctrine/annotations": "^1.13.1|^2", "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.4|^6.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4.9|^6.0.9", - "symfony/css-selector": "^5.4|^6.0", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/dotenv": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/form": "^5.4|^6.0", - "symfony/html-sanitizer": "^6.1", - "symfony/http-client": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/mailer": "^5.4|^6.0", - "symfony/messenger": "^6.2", - "symfony/mime": "^6.2", - "symfony/notifier": "^5.4|^6.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-client": "^6.3|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/mailer": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.3|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/rate-limiter": "^5.4|^6.0", - "symfony/security-bundle": "^5.4|^6.0", - "symfony/semaphore": "^5.4|^6.0", - "symfony/serializer": "^6.1", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/string": "^5.4|^6.0", - "symfony/translation": "^6.2.8", - "symfony/twig-bundle": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/web-link": "^5.4|^6.0", - "symfony/workflow": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0", - "twig/twig": "^2.10|^3.0" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/scheduler": "^6.4.4|^7.0.4", + "symfony/security-bundle": "^5.4|^6.0|^7.0", + "symfony/semaphore": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", + "twig/twig": "^2.10|^3.0.4" }, "type": "symfony-bundle", "autoload": { @@ -10215,7 +10540,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.2.10" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.12" }, "funding": [ { @@ -10231,28 +10556,28 @@ "type": "tidelift" } ], - "time": "2023-04-23T08:23:35+00:00" + "time": "2024-09-20T13:34:56+00:00" }, { "name": "symfony/google-mailer", - "version": "v6.2.10", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/google-mailer.git", - "reference": "7e6cde8d40144e889e607bfc5320ea4192b247cd" + "reference": "e8d8c34dfcd94687a9b56c02318e5f633b5a94e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/google-mailer/zipball/7e6cde8d40144e889e607bfc5320ea4192b247cd", - "reference": "7e6cde8d40144e889e607bfc5320ea4192b247cd", + "url": "https://api.github.com/repos/symfony/google-mailer/zipball/e8d8c34dfcd94687a9b56c02318e5f633b5a94e1", + "reference": "e8d8c34dfcd94687a9b56c02318e5f633b5a94e1", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/mailer": "^5.4.21|^6.2.7" + "symfony/mailer": "^5.4.21|^6.2.7|^7.0" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0" + "symfony/http-client": "^5.4|^6.0|^7.0" }, "type": "symfony-mailer-bridge", "autoload": { @@ -10280,7 +10605,7 @@ "description": "Symfony Google Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/google-mailer/tree/v6.2.10" + "source": "https://github.com/symfony/google-mailer/tree/v6.4.8" }, "funding": [ { @@ -10296,25 +10621,25 @@ "type": "tidelift" } ], - "time": "2023-04-14T16:23:31+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v6.2.7", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "211e36bbb20a5e5db2b940399ab1d2b421a08068" + "reference": "b58efe8ed0d8f5bf84913380a2f9da0c242f4200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/211e36bbb20a5e5db2b940399ab1d2b421a08068", - "reference": "211e36bbb20a5e5db2b940399ab1d2b421a08068", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/b58efe8ed0d8f5bf84913380a2f9da0c242f4200", + "reference": "b58efe8ed0d8f5bf84913380a2f9da0c242f4200", "shasum": "" }, "require": { "ext-dom": "*", - "league/uri": "^6.5", + "league/uri": "^6.5|^7.0", "masterminds/html5": "^2.7.2", "php": ">=8.1" }, @@ -10349,7 +10674,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v6.2.7" + "source": "https://github.com/symfony/html-sanitizer/tree/v6.4.12" }, "funding": [ { @@ -10365,28 +10690,32 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-09-20T08:21:33+00:00" }, { "name": "symfony/http-client", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "3f5545a91c8e79dedd1a06c4b04e1682c80c42f9" + "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/3f5545a91c8e79dedd1a06c4b04e1682c80c42f9", - "reference": "3f5545a91c8e79dedd1a06c4b04e1682c80c42f9", + "url": "https://api.github.com/repos/symfony/http-client/zipball/fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56", + "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^1.0|^2|^3" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^3.4.1", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" }, "provide": { "php-http/async-client-implementation": "*", @@ -10399,14 +10728,15 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -10437,7 +10767,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.2.10" + "source": "https://github.com/symfony/http-client/tree/v6.4.12" }, "funding": [ { @@ -10453,32 +10783,29 @@ "type": "tidelift" } ], - "time": "2023-04-20T13:12:48+00:00" + "time": "2024-09-20T08:21:33+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.2.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "df2ecd6cb70e73c1080e6478aea85f5f4da2c48b" + "reference": "20414d96f391677bf80078aa55baece78b82647d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/df2ecd6cb70e73c1080e6478aea85f5f4da2c48b", - "reference": "df2ecd6cb70e73c1080e6478aea85f5f4da2c48b", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", + "reference": "20414d96f391677bf80078aa55baece78b82647d", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/http-client-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -10518,7 +10845,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" }, "funding": [ { @@ -10534,41 +10861,40 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc" + "reference": "133ac043875f59c26c55e79cf074562127cce4d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49adbb92bcb4e3c2943719d2756271e8b9602acc", - "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", + "reference": "133ac043875f59c26c55e79cf074562127cce4d2", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.2" + "symfony/cache": "<6.3" }, "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^5.4|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -10596,7 +10922,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.2.10" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" }, "funding": [ { @@ -10612,29 +10938,29 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "81064a65a5496f17d2b6984f6519406f98864215" + "reference": "96df83d51b5f78804f70c093b97310794fd6257b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/81064a65a5496f17d2b6984f6519406f98864215", - "reference": "81064a65a5496f17d2b6984f6519406f98864215", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96df83d51b5f78804f70c093b97310794fd6257b", + "reference": "96df83d51b5f78804f70c093b97310794fd6257b", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^6.1", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -10642,15 +10968,18 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.2", + "symfony/dependency-injection": "<6.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/mailer": "<5.4", "symfony/messenger": "<5.4", "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", "symfony/twig-bridge": "<5.4", - "symfony/validator": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, "provide": { @@ -10658,29 +10987,29 @@ }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^6.1", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.2", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", - "symfony/uid": "^5.4|^6.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, "type": "library", "autoload": { "psr-4": { @@ -10707,7 +11036,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.2.10" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.12" }, "funding": [ { @@ -10723,28 +11052,29 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:50:28+00:00" + "time": "2024-09-21T06:02:57+00:00" }, { "name": "symfony/intl", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "860c99e53149d22df1900d3aefdaeb17adb7669d" + "reference": "5f64d7218f4078492ca59da94747d7474a2a52c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/860c99e53149d22df1900d3aefdaeb17adb7669d", - "reference": "860c99e53149d22df1900d3aefdaeb17adb7669d", + "url": "https://api.github.com/repos/symfony/intl/zipball/5f64d7218f4078492ca59da94747d7474a2a52c4", + "reference": "5f64d7218f4078492ca59da94747d7474a2a52c4", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0" + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -10752,7 +11082,8 @@ "Symfony\\Component\\Intl\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/Resources/data/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -10788,7 +11119,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.2.10" + "source": "https://github.com/symfony/intl/tree/v6.4.12" }, "funding": [ { @@ -10804,20 +11135,20 @@ "type": "tidelift" } ], - "time": "2023-04-14T16:23:31+00:00" + "time": "2024-09-20T08:16:53+00:00" }, { "name": "symfony/mailer", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "bfcfa015c67e19c6fdb7ca6fe70700af1e740a17" + "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/bfcfa015c67e19c6fdb7ca6fe70700af1e740a17", - "reference": "bfcfa015c67e19c6fdb7ca6fe70700af1e740a17", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b6a25408c569ae2366b3f663a4edad19420a9c26", + "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26", "shasum": "" }, "require": { @@ -10825,21 +11156,22 @@ "php": ">=8.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/mime": "^6.2", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", "symfony/messenger": "<6.2", "symfony/mime": "<6.2", "symfony/twig-bridge": "<6.2.1" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/messenger": "^6.2", - "symfony/twig-bridge": "^6.2" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" }, "type": "library", "autoload": { @@ -10867,7 +11199,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.2.8" + "source": "https://github.com/symfony/mailer/tree/v6.4.12" }, "funding": [ { @@ -10883,37 +11215,37 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:00:05+00:00" + "time": "2024-09-08T12:30:05+00:00" }, { "name": "symfony/mercure", - "version": "v0.6.3", + "version": "v0.6.5", "source": { "type": "git", "url": "https://github.com/symfony/mercure.git", - "reference": "af2953ae60e77628339659a31b8b2a9e40ca1dd9" + "reference": "304cf84609ef645d63adc65fc6250292909a461b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mercure/zipball/af2953ae60e77628339659a31b8b2a9e40ca1dd9", - "reference": "af2953ae60e77628339659a31b8b2a9e40ca1dd9", + "url": "https://api.github.com/repos/symfony/mercure/zipball/304cf84609ef645d63adc65fc6250292909a461b", + "reference": "304cf84609ef645d63adc65fc6250292909a461b", "shasum": "" }, "require": { "php": ">=7.1.3", - "symfony/deprecation-contracts": "^2.0|^3.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.0|^3.0|^4.0", + "symfony/http-client": "^4.4|^5.0|^6.0|^7.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0|^7.0", "symfony/polyfill-php80": "^1.22", - "symfony/web-link": "^4.4|^5.0|^6.0" + "symfony/web-link": "^4.4|^5.0|^6.0|^7.0" }, "require-dev": { "lcobucci/jwt": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/phpunit-bridge": "^5.2|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "twig/twig": "^2.0|^3.0" + "symfony/event-dispatcher": "^4.4|^5.0|^6.0|^7.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0|^7.0", + "symfony/phpunit-bridge": "^5.2|^6.0|^7.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0|^7.0", + "twig/twig": "^2.0|^3.0|^4.0" }, "suggest": { "symfony/stopwatch": "Integration with the profiler performances" @@ -10921,7 +11253,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "0.5.x-dev" + "dev-main": "0.6.x-dev" }, "thanks": { "name": "dunglas/mercure", @@ -10957,7 +11289,7 @@ ], "support": { "issues": "https://github.com/symfony/mercure/issues", - "source": "https://github.com/symfony/mercure/tree/v0.6.3" + "source": "https://github.com/symfony/mercure/tree/v0.6.5" }, "funding": [ { @@ -10969,36 +11301,36 @@ "type": "tidelift" } ], - "time": "2023-03-06T22:43:27+00:00" + "time": "2024-04-08T12:51:34+00:00" }, { "name": "symfony/mercure-bundle", - "version": "v0.3.6", + "version": "v0.3.9", "source": { "type": "git", "url": "https://github.com/symfony/mercure-bundle.git", - "reference": "262c922912d94d01230b2c647208d06fc46d4cff" + "reference": "77435d740b228e9f5f3f065b6db564f85f2cdb64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mercure-bundle/zipball/262c922912d94d01230b2c647208d06fc46d4cff", - "reference": "262c922912d94d01230b2c647208d06fc46d4cff", + "url": "https://api.github.com/repos/symfony/mercure-bundle/zipball/77435d740b228e9f5f3f065b6db564f85f2cdb64", + "reference": "77435d740b228e9f5f3f065b6db564f85f2cdb64", "shasum": "" }, "require": { "lcobucci/jwt": "^3.4|^4.0|^5.0", "php": ">=7.1.3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.4|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/config": "^4.4|^5.0|^6.0|^7.0", + "symfony/dependency-injection": "^4.4|^5.4|^6.0|^7.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0|^7.0", "symfony/mercure": "^0.6.1", - "symfony/web-link": "^4.4|^5.0|^6.0" + "symfony/web-link": "^4.4|^5.0|^6.0|^7.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.3.7|^5.0|^6.0", - "symfony/stopwatch": "^4.3.7|^5.0|^6.0", + "symfony/phpunit-bridge": "^4.3.7|^5.0|^6.0|^7.0", + "symfony/stopwatch": "^4.3.7|^5.0|^6.0|^7.0", "symfony/ux-turbo": "*", - "symfony/var-dumper": "^4.3.7|^5.0|^6.0" + "symfony/var-dumper": "^4.3.7|^5.0|^6.0|^7.0" }, "suggest": { "symfony/messenger": "To use the Messenger integration" @@ -11038,7 +11370,7 @@ ], "support": { "issues": "https://github.com/symfony/mercure-bundle/issues", - "source": "https://github.com/symfony/mercure-bundle/tree/v0.3.6" + "source": "https://github.com/symfony/mercure-bundle/tree/v0.3.9" }, "funding": [ { @@ -11050,50 +11382,50 @@ "type": "tidelift" } ], - "time": "2023-03-06T22:48:03+00:00" + "time": "2024-05-31T09:07:18+00:00" }, { "name": "symfony/messenger", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "f54eef78d500309bbc51291f8a353b4b0afef8c1" + "reference": "05035355ef94de2cb054f8697e65d82f67bf89d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/f54eef78d500309bbc51291f8a353b4b0afef8c1", - "reference": "f54eef78d500309bbc51291f8a353b4b0afef8c1", + "url": "https://api.github.com/repos/symfony/messenger/zipball/05035355ef94de2cb054f8697e65d82f67bf89d4", + "reference": "05035355ef94de2cb054f8697e65d82f67bf89d4", "shasum": "" }, "require": { "php": ">=8.1", - "psr/log": "^1|^2|^3" + "psr/log": "^1|^2|^3", + "symfony/clock": "^6.3|^7.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { + "symfony/console": "<6.3", "symfony/event-dispatcher": "<5.4", - "symfony/event-dispatcher-contracts": "<2", + "symfony/event-dispatcher-contracts": "<2.5", "symfony/framework-bundle": "<5.4", "symfony/http-kernel": "<5.4", "symfony/serializer": "<5.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/rate-limiter": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0" - }, - "suggest": { - "enqueue/messenger-adapter": "For using the php-enqueue library as a transport." + "symfony/console": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/validator": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -11121,7 +11453,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v6.2.8" + "source": "https://github.com/symfony/messenger/tree/v6.4.12" }, "funding": [ { @@ -11137,24 +11469,25 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:00:05+00:00" + "time": "2024-09-08T12:31:10+00:00" }, { "name": "symfony/mime", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "b6c137fc53a9f7c4c951cd3f362b3734c7a97723" + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/b6c137fc53a9f7c4c951cd3f362b3734c7a97723", - "reference": "b6c137fc53a9f7c4c951cd3f362b3734c7a97723", + "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -11163,16 +11496,17 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^6.2" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -11204,7 +11538,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.2.10" + "source": "https://github.com/symfony/mime/tree/v6.4.12" }, "funding": [ { @@ -11220,46 +11554,42 @@ "type": "tidelift" } ], - "time": "2023-04-19T09:54:16+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.2.8", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "34700f2e5c7e9eae78f8e59fc02399dd8f110cae" + "reference": "0fbee64913b1c595e7650a1919ba3edba8d49ea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/34700f2e5c7e9eae78f8e59fc02399dd8f110cae", - "reference": "34700f2e5c7e9eae78f8e59fc02399dd8f110cae", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/0fbee64913b1c595e7650a1919ba3edba8d49ea7", + "reference": "0fbee64913b1c595e7650a1919ba3edba8d49ea7", "shasum": "" }, "require": { "monolog/monolog": "^1.25.1|^2|^3", "php": ">=8.1", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/console": "<5.4", "symfony/http-foundation": "<5.4", - "symfony/security-core": "<6.0" + "symfony/security-core": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/mailer": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/security-core": "^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", - "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", - "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mailer": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -11287,7 +11617,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.2.8" + "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.8" }, "funding": [ { @@ -11303,34 +11633,34 @@ "type": "tidelift" } ], - "time": "2023-03-09T16:20:02+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v3.8.0", + "version": "v3.10.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d" + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d", - "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", "shasum": "" }, "require": { - "monolog/monolog": "^1.22 || ^2.0 || ^3.0", - "php": ">=7.1.3", - "symfony/config": "~4.4 || ^5.0 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", - "symfony/http-kernel": "~4.4 || ^5.0 || ^6.0", - "symfony/monolog-bridge": "~4.4 || ^5.0 || ^6.0" + "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", + "php": ">=7.2.5", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "symfony/console": "~4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.2 || ^6.0", - "symfony/yaml": "~4.4 || ^5.0 || ^6.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "type": "symfony-bundle", "extra": { @@ -11368,7 +11698,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v3.8.0" + "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0" }, "funding": [ { @@ -11384,20 +11714,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T14:24:36+00:00" + "time": "2023-11-06T17:08:13+00:00" }, { "name": "symfony/notifier", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/notifier.git", - "reference": "993df4464c577e7eb828324181d2a451e81619b6" + "reference": "3db8454f16470d752ff46c6e5d87400c9f7423ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/notifier/zipball/993df4464c577e7eb828324181d2a451e81619b6", - "reference": "993df4464c577e7eb828324181d2a451e81619b6", + "url": "https://api.github.com/repos/symfony/notifier/zipball/3db8454f16470d752ff46c6e5d87400c9f7423ab", + "reference": "3db8454f16470d752ff46c6e5d87400c9f7423ab", "shasum": "" }, "require": { @@ -11406,13 +11736,15 @@ }, "conflict": { "symfony/event-dispatcher": "<5.4", + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4" }, "require-dev": { - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/http-client-contracts": "^2|^3", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0" + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -11444,7 +11776,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/notifier/tree/v6.2.8" + "source": "https://github.com/symfony/notifier/tree/v6.4.12" }, "funding": [ { @@ -11460,25 +11792,25 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:06:03+00:00" + "time": "2024-09-08T12:30:05+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629" + "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/aa0e85b53bbb2b4951960efd61d295907eacd629", - "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22ab9e9101ab18de37839074f8a1197f55590c1b", + "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3" + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -11511,7 +11843,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.2.7" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.8" }, "funding": [ { @@ -11527,26 +11859,26 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/ovh-cloud-notifier", - "version": "v6.2.8", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/ovh-cloud-notifier.git", - "reference": "e52d74d630df94d2f2eaa581e2aa98100c894e43" + "reference": "ed7ed6fb5ff72b04d6bc866a5f3173c7efe260f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ovh-cloud-notifier/zipball/e52d74d630df94d2f2eaa581e2aa98100c894e43", - "reference": "e52d74d630df94d2f2eaa581e2aa98100c894e43", + "url": "https://api.github.com/repos/symfony/ovh-cloud-notifier/zipball/ed7ed6fb5ff72b04d6bc866a5f3173c7efe260f8", + "reference": "ed7ed6fb5ff72b04d6bc866a5f3173c7efe260f8", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/http-client": "^5.4|^6.0", - "symfony/notifier": "^6.2.7" + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/notifier": "^6.2.7|^7.0" }, "type": "symfony-notifier-bridge", "autoload": { @@ -11579,7 +11911,7 @@ "sms" ], "support": { - "source": "https://github.com/symfony/ovh-cloud-notifier/tree/v6.2.8" + "source": "https://github.com/symfony/ovh-cloud-notifier/tree/v6.4.8" }, "funding": [ { @@ -11595,20 +11927,20 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:56:17+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "67820d8570bf1c2c2cd87cb76d9d12a9d52ab808" + "reference": "90ebbe946e5d64a5fad9ac9427e335045cf2bd31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/67820d8570bf1c2c2cd87cb76d9d12a9d52ab808", - "reference": "67820d8570bf1c2c2cd87cb76d9d12a9d52ab808", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/90ebbe946e5d64a5fad9ac9427e335045cf2bd31", + "reference": "90ebbe946e5d64a5fad9ac9427e335045cf2bd31", "shasum": "" }, "require": { @@ -11618,8 +11950,8 @@ "symfony/security-core": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/security-core": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -11651,7 +11983,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.2.7" + "source": "https://github.com/symfony/password-hasher/tree/v6.4.8" }, "funding": [ { @@ -11667,33 +11999,30 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "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" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -11732,7 +12061,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -11748,33 +12077,30 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.27.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "a3d9148e2c363588e05abbdd4ee4f971f0a5330c" + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/a3d9148e2c363588e05abbdd4ee4f971f0a5330c", - "reference": "a3d9148e2c363588e05abbdd4ee4f971f0a5330c", + "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\"" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -11819,7 +12145,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0" }, "funding": [ { @@ -11835,35 +12161,31 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "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" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -11906,7 +12228,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -11922,33 +12244,30 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "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" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -11990,7 +12309,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -12006,24 +12325,24 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -12033,9 +12352,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -12073,7 +12389,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -12089,24 +12405,100 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-uuid", - "version": "v1.27.0", + "name": "symfony/polyfill-php83", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -12116,9 +12508,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -12155,7 +12544,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -12171,32 +12560,29 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/property-access", - "version": "v6.2.8", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "2ad1e0a07b8cab3e09905659d14f3b248e916374" + "reference": "866f6cd84f2094cbc6f66ce9752faf749916e2a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/2ad1e0a07b8cab3e09905659d14f3b248e916374", - "reference": "2ad1e0a07b8cab3e09905659d14f3b248e916374", + "url": "https://api.github.com/repos/symfony/property-access/zipball/866f6cd84f2094cbc6f66ce9752faf749916e2a9", + "reference": "866f6cd84f2094cbc6f66ce9752faf749916e2a9", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/property-info": "^5.4|^6.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/property-info": "^5.4|^6.0|^7.0" }, "require-dev": { - "symfony/cache": "^5.4|^6.0" - }, - "suggest": { - "psr/cache-implementation": "To cache access methods." + "symfony/cache": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -12235,7 +12621,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.2.8" + "source": "https://github.com/symfony/property-access/tree/v6.4.11" }, "funding": [ { @@ -12251,44 +12637,38 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:00:05+00:00" + "time": "2024-08-30T16:10:11+00:00" }, { "name": "symfony/property-info", - "version": "v6.2.10", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "617177c24e1a92e011851948ba973758429a68b2" + "reference": "edaea9dcc723cb4a0ab6a00f7d6f8c07c0d8ff77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/617177c24e1a92e011851948ba973758429a68b2", - "reference": "617177c24e1a92e011851948ba973758429a68b2", + "url": "https://api.github.com/repos/symfony/property-info/zipball/edaea9dcc723cb4a0ab6a00f7d6f8c07c0d8ff77", + "reference": "edaea9dcc723cb4a0ab6a00f7d6f8c07c0d8ff77", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/string": "^5.4|^6.0" + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" - }, - "suggest": { - "phpdocumentor/reflection-docblock": "To use the PHPDoc", - "psr/cache-implementation": "To cache results", - "symfony/doctrine-bridge": "To use Doctrine metadata", - "symfony/serializer": "To use Serializer metadata" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -12324,7 +12704,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.2.10" + "source": "https://github.com/symfony/property-info/tree/v6.4.10" }, "funding": [ { @@ -12340,29 +12720,30 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2024-07-26T07:32:07+00:00" }, { "name": "symfony/proxy-manager-bridge", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "534119513ce1d06faa6d55b6717f237e980b4e91" + "reference": "b8119e0b248ef0711c25cd09acc729102122621c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/534119513ce1d06faa6d55b6717f237e980b4e91", - "reference": "534119513ce1d06faa6d55b6717f237e980b4e91", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/b8119e0b248ef0711c25cd09acc729102122621c", + "reference": "b8119e0b248ef0711c25cd09acc729102122621c", "shasum": "" }, "require": { "friendsofphp/proxy-manager-lts": "^1.0.2", "php": ">=8.1", - "symfony/dependency-injection": "^6.2" + "symfony/dependency-injection": "^6.3|^7.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/config": "^6.1" + "symfony/config": "^6.1|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -12390,7 +12771,7 @@ "description": "Provides integration for ProxyManager with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.2.7" + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.8" }, "funding": [ { @@ -12406,32 +12787,30 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/rate-limiter", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "e82784d6a8d64a33f44a8acfd703327a32831533" + "reference": "d96117211cf6740080827ee8c9eaf7e370243b50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/e82784d6a8d64a33f44a8acfd703327a32831533", - "reference": "e82784d6a8d64a33f44a8acfd703327a32831533", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/d96117211cf6740080827ee8c9eaf7e370243b50", + "reference": "d96117211cf6740080827ee8c9eaf7e370243b50", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/options-resolver": "^5.4|^6.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/options-resolver": "^5.4|^6.0|^7.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/lock": "^5.4|^6.0" - }, - "suggest": { - "symfony/lock": "For preventing race conditions in rate limiters" + "symfony/lock": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -12463,7 +12842,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v6.2.7" + "source": "https://github.com/symfony/rate-limiter/tree/v6.4.8" }, "funding": [ { @@ -12479,7 +12858,7 @@ "type": "tidelift" } ], - "time": "2023-02-24T10:42:00+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/requirements-checker", @@ -12549,20 +12928,21 @@ }, { "name": "symfony/routing", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "69062e2823f03b82265d73a966999660f0e1e404" + "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/69062e2823f03b82265d73a966999660f0e1e404", - "reference": "69062e2823f03b82265d73a966999660f0e1e404", + "url": "https://api.github.com/repos/symfony/routing/zipball/a7c8036bd159486228dc9be3e846a00a0dda9f9f", + "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", @@ -12573,17 +12953,11 @@ "require-dev": { "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -12617,7 +12991,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.2.8" + "source": "https://github.com/symfony/routing/tree/v6.4.12" }, "funding": [ { @@ -12633,20 +13007,20 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:00:05+00:00" + "time": "2024-09-20T08:32:26+00:00" }, { "name": "symfony/runtime", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "f8b0751b33888329be8f8f0481bb81d279ec4157" + "reference": "bfe32a1adf41da4dd7f6b939a039779d7af5497f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/f8b0751b33888329be8f8f0481bb81d279ec4157", - "reference": "f8b0751b33888329be8f8f0481bb81d279ec4157", + "url": "https://api.github.com/repos/symfony/runtime/zipball/bfe32a1adf41da4dd7f6b939a039779d7af5497f", + "reference": "bfe32a1adf41da4dd7f6b939a039779d7af5497f", "shasum": "" }, "require": { @@ -12658,10 +13032,10 @@ }, "require-dev": { "composer/composer": "^1.0.2|^2.0", - "symfony/console": "^5.4|^6.0", - "symfony/dotenv": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0" + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "type": "composer-plugin", "extra": { @@ -12696,7 +13070,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.2.8" + "source": "https://github.com/symfony/runtime/tree/v6.4.12" }, "funding": [ { @@ -12712,63 +13086,75 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:48:35+00:00" + "time": "2024-09-19T13:29:10+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.2.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "b12dcedbcf423ae6d34d79cfaa6791a21c90bd14" + "reference": "620be16fceded671823ce6332d06f44bb327096d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/b12dcedbcf423ae6d34d79cfaa6791a21c90bd14", - "reference": "b12dcedbcf423ae6d34d79cfaa6791a21c90bd14", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/620be16fceded671823ce6332d06f44bb327096d", + "reference": "620be16fceded671823ce6332d06f44bb327096d", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", "php": ">=8.1", - "symfony/config": "^6.1", - "symfony/dependency-injection": "^6.2", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^6.2", + "symfony/clock": "^6.3|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4.11|^7.1.4", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.2|^7.0", "symfony/http-kernel": "^6.2", - "symfony/password-hasher": "^5.4|^6.0", - "symfony/security-core": "^6.2", - "symfony/security-csrf": "^5.4|^6.0", - "symfony/security-http": "^6.2.10" + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/security-http": "^6.3.6|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/browser-kit": "<5.4", "symfony/console": "<5.4", - "symfony/framework-bundle": "<5.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-client": "<5.4", "symfony/ldap": "<5.4", - "symfony/twig-bundle": "<5.4" + "symfony/serializer": "<6.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "symfony/asset": "^5.4|^6.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/form": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", - "symfony/ldap": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/rate-limiter": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/twig-bridge": "^5.4|^6.0", - "symfony/twig-bundle": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1", + "web-token/jwt-signature-algorithm-eddsa": "^3.1", + "web-token/jwt-signature-algorithm-hmac": "^3.1", + "web-token/jwt-signature-algorithm-none": "^3.1", + "web-token/jwt-signature-algorithm-rsa": "^3.1" }, "type": "symfony-bundle", "autoload": { @@ -12796,7 +13182,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.2.10" + "source": "https://github.com/symfony/security-bundle/tree/v6.4.11" }, "funding": [ { @@ -12812,54 +13198,49 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:49:06+00:00" + "time": "2024-08-20T11:22:16+00:00" }, { "name": "symfony/security-core", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "c141337bc7451f9a9e464733f1e536bf38d1d2fb" + "reference": "8c7e52155262b3ef6b7885f6d9bd90fb24eaa66f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/c141337bc7451f9a9e464733f1e536bf38d1d2fb", - "reference": "c141337bc7451f9a9e464733f1e536bf38d1d2fb", + "url": "https://api.github.com/repos/symfony/security-core/zipball/8c7e52155262b3ef6b7885f6d9bd90fb24eaa66f", + "reference": "8c7e52155262b3ef6b7885f6d9bd90fb24eaa66f", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^1.1|^2|^3", - "symfony/password-hasher": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.6|^2|^3" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/event-dispatcher": "<5.4", "symfony/http-foundation": "<5.4", "symfony/ldap": "<5.4", "symfony/security-guard": "<5.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", "symfony/validator": "<5.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/ldap": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0" - }, - "suggest": { - "psr/container-implementation": "To instantiate the Security class", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/ldap": "For using LDAP integration", - "symfony/validator": "For using the user password constraint" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/validator": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -12887,7 +13268,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.2.8" + "source": "https://github.com/symfony/security-core/tree/v6.4.12" }, "funding": [ { @@ -12903,34 +13284,31 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:06:03+00:00" + "time": "2024-09-20T08:21:33+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "6cce7efdce68e0670d2f19acebc21dcd0798e333" + "reference": "f46ab02b76311087873257071559edcaf6d7ab99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/6cce7efdce68e0670d2f19acebc21dcd0798e333", - "reference": "6cce7efdce68e0670d2f19acebc21dcd0798e333", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/f46ab02b76311087873257071559edcaf6d7ab99", + "reference": "f46ab02b76311087873257071559edcaf6d7ab99", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/security-core": "^5.4|^6.0" + "symfony/security-core": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/http-foundation": "<5.4" }, "require-dev": { - "symfony/http-foundation": "^5.4|^6.0" - }, - "suggest": { - "symfony/http-foundation": "For using the class SessionTokenStorage." + "symfony/http-foundation": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -12958,7 +13336,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.2.7" + "source": "https://github.com/symfony/security-csrf/tree/v6.4.8" }, "funding": [ { @@ -12974,48 +13352,51 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/security-http", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "c468f059fac27680acf7e84cea07ba5ffff8942a" + "reference": "f6df97af71943cda726dc852335204eac02a716b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/c468f059fac27680acf7e84cea07ba5ffff8942a", - "reference": "c468f059fac27680acf7e84cea07ba5ffff8942a", + "url": "https://api.github.com/repos/symfony/security-http/zipball/f6df97af71943cda726dc852335204eac02a716b", + "reference": "f6df97af71943cda726dc852335204eac02a716b", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^6.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.2|^7.0", + "symfony/http-kernel": "^6.3|^7.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/security-core": "~6.0.19|~6.1.11|^6.2.5" + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "symfony/clock": "<6.3", "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", + "symfony/http-client-contracts": "<3.0", "symfony/security-bundle": "<5.4", "symfony/security-csrf": "<5.4" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/rate-limiter": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/security-csrf": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0" - }, - "suggest": { - "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", - "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.3|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^3.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1" }, "type": "library", "autoload": { @@ -13043,7 +13424,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.2.10" + "source": "https://github.com/symfony/security-http/tree/v6.4.12" }, "funding": [ { @@ -13059,24 +13440,25 @@ "type": "tidelift" } ], - "time": "2023-04-21T11:56:14+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/serializer", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "0732edf0ad28dd3faacde4f1200ab9d7a4d5f40d" + "reference": "10ae9c1b90f4809ccb7277cc8fe8d80b3af4412c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/0732edf0ad28dd3faacde4f1200ab9d7a4d5f40d", - "reference": "0732edf0ad28dd3faacde4f1200ab9d7a4d5f40d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/10ae9c1b90f4809ccb7277cc8fe8d80b3af4412c", + "reference": "10ae9c1b90f4809ccb7277cc8fe8d80b3af4412c", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -13085,38 +13467,34 @@ "phpdocumentor/type-resolver": "<1.4.0", "symfony/dependency-injection": "<5.4", "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4", + "symfony/property-info": "<5.4.24|>=6,<6.2.11", "symfony/uid": "<5.4", + "symfony/validator": "<6.4", "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12|^2", "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", - "symfony/cache": "^5.4|^6.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/form": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0", - "symfony/var-exporter": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "psr/cache-implementation": "For using the metadata cache.", - "symfony/config": "For using the XML mapping loader.", - "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", - "symfony/property-access": "For using the ObjectNormalizer.", - "symfony/property-info": "To deserialize relations.", - "symfony/var-exporter": "For using the metadata compiler.", - "symfony/yaml": "For using the default YAML mapping loader." + "seld/jsonlint": "^1.10", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.26|^6.3|^7.0", + "symfony/property-info": "^5.4.24|^6.2.11|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -13144,7 +13522,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.2.10" + "source": "https://github.com/symfony/serializer/tree/v6.4.12" }, "funding": [ { @@ -13160,36 +13538,34 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:57:49+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -13229,7 +13605,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -13245,25 +13621,94 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { - "name": "symfony/stopwatch", - "version": "v6.2.7", + "name": "symfony/stimulus-bundle", + "version": "v2.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" + "url": "https://github.com/symfony/stimulus-bundle.git", + "reference": "ae69e3a764694b9f45d8a009dd2b8c22444c5e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/ae69e3a764694b9f45d8a009dd2b8c22444c5e0c", + "reference": "ae69e3a764694b9f45d8a009dd2b8c22444c5e0c", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/service-contracts": "^1|^2|^3" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.0|^3.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "twig/twig": "^2.15.3|^3.8" + }, + "require-dev": { + "symfony/asset-mapper": "^6.3|^7.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "zenstruck/browser": "^1.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\UX\\StimulusBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Integration with your Symfony app & Stimulus!", + "keywords": [ + "symfony-ux" + ], + "support": { + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-24T09:27:42+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "63e069eb616049632cde9674c46957819454b8aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa", + "reference": "63e069eb616049632cde9674c46957819454b8aa", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -13291,7 +13736,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.8" }, "funding": [ { @@ -13307,20 +13752,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/string", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/193e83bbd6617d6b2151c37fff10fa7168ebddef", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -13331,14 +13776,14 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -13377,7 +13822,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.8" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -13393,32 +13838,35 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/translation", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5" + "reference": "cf8360b8352b086be620fae8342c4d96e391a489" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/817535dbb1721df8b3a8f2489dc7e50bcd6209b5", - "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5", + "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", + "reference": "cf8360b8352b086be620fae8342c4d96e391a489", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { "symfony/config": "<5.4", "symfony/console": "<5.4", "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", "symfony/twig-bundle": "<5.4", "symfony/yaml": "<5.4" }, @@ -13426,25 +13874,19 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^4.18|^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "nikic/php-parser": "To use PhpAstExtractor", - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -13475,7 +13917,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.2.8" + "source": "https://github.com/symfony/translation/tree/v6.4.12" }, "funding": [ { @@ -13491,32 +13933,29 @@ "type": "tidelift" } ], - "time": "2023-03-31T09:14:44+00:00" + "time": "2024-09-16T06:02:54+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.2.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dfec258b9dd17a6b24420d464c43bffe347441c8", - "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/translation-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -13556,7 +13995,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -13572,88 +14011,73 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/twig-bridge", - "version": "v6.2.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "30e3ad6ae749b2d2700ecf9b4a1a9d5c96b18927" + "reference": "09c0df13f822a1b80c5972ca1aa9eeb1288e1194" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/30e3ad6ae749b2d2700ecf9b4a1a9d5c96b18927", - "reference": "30e3ad6ae749b2d2700ecf9b4a1a9d5c96b18927", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/09c0df13f822a1b80c5972ca1aa9eeb1288e1194", + "reference": "09c0df13f822a1b80c5972ca1aa9eeb1288e1194", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/translation-contracts": "^2.5|^3", "twig/twig": "^2.13|^3.0.4" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/console": "<5.4", - "symfony/form": "<6.2.7", + "symfony/form": "<6.3", "symfony/http-foundation": "<5.4", - "symfony/http-kernel": "<6.2", + "symfony/http-kernel": "<6.4", "symfony/mime": "<6.2", + "symfony/serializer": "<6.4", "symfony/translation": "<5.4", "symfony/workflow": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/form": "^6.2.7", - "symfony/html-sanitizer": "^6.1", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^6.2", - "symfony/intl": "^5.4|^6.0", - "symfony/mime": "^6.2", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.3|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^5.4|^6.0", - "symfony/security-csrf": "^5.4|^6.0", - "symfony/security-http": "^5.4|^6.0", - "symfony/serializer": "^6.2", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/web-link": "^5.4|^6.0", - "symfony/workflow": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0", + "symfony/security-core": "^5.4|^6.0|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/security-http": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.1|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/workflow": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", "twig/cssinliner-extra": "^2.12|^3", "twig/inky-extra": "^2.12|^3", "twig/markdown-extra": "^2.12|^3" }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/html-sanitizer": "For using the HtmlSanitizerExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, "type": "symfony-bridge", "autoload": { "psr-4": { @@ -13680,7 +14104,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.2.8" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.12" }, "funding": [ { @@ -13696,30 +14120,30 @@ "type": "tidelift" } ], - "time": "2023-03-31T09:14:44+00:00" + "time": "2024-09-15T06:35:36+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.2.7", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "8bb562655c6ae4b8fae9cf72077591f38b961566" + "reference": "4e63369647e3924e110b37337c6a58aac3086ad4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/8bb562655c6ae4b8fae9cf72077591f38b961566", - "reference": "8bb562655c6ae4b8fae9cf72077591f38b961566", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4e63369647e3924e110b37337c6a58aac3086ad4", + "reference": "4e63369647e3924e110b37337c6a58aac3086ad4", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "php": ">=8.1", - "symfony/config": "^6.1", - "symfony/dependency-injection": "^6.1", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^6.2", - "symfony/twig-bridge": "^6.2", + "symfony/twig-bridge": "^6.4", "twig/twig": "^2.13|^3.0.4" }, "conflict": { @@ -13727,17 +14151,16 @@ "symfony/translation": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "symfony/asset": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/form": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/web-link": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -13765,7 +14188,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v6.2.7" + "source": "https://github.com/symfony/twig-bundle/tree/v6.4.12" }, "funding": [ { @@ -13781,26 +14204,32 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-09-08T12:30:05+00:00" }, { "name": "symfony/twilio-notifier", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/twilio-notifier.git", - "reference": "0903cb2a31d01975c5e419a0459d40e8a785f646" + "reference": "46406b7123305c84077bb2bb4aa793c7bf231e41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twilio-notifier/zipball/0903cb2a31d01975c5e419a0459d40e8a785f646", - "reference": "0903cb2a31d01975c5e419a0459d40e8a785f646", + "url": "https://api.github.com/repos/symfony/twilio-notifier/zipball/46406b7123305c84077bb2bb4aa793c7bf231e41", + "reference": "46406b7123305c84077bb2bb4aa793c7bf231e41", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/http-client": "^5.4|^6.0", - "symfony/notifier": "^6.2.7" + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/notifier": "^6.2.7|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<6.2" + }, + "require-dev": { + "symfony/webhook": "^6.3|^7.0" }, "type": "symfony-notifier-bridge", "autoload": { @@ -13833,7 +14262,7 @@ "twilio" ], "support": { - "source": "https://github.com/symfony/twilio-notifier/tree/v6.2.7" + "source": "https://github.com/symfony/twilio-notifier/tree/v6.4.8" }, "funding": [ { @@ -13849,20 +14278,20 @@ "type": "tidelift" } ], - "time": "2023-02-17T11:05:34+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/uid", - "version": "v6.2.7", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0" + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", - "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", + "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", "shasum": "" }, "require": { @@ -13870,7 +14299,7 @@ "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -13907,7 +14336,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.2.7" + "source": "https://github.com/symfony/uid/tree/v6.4.12" }, "funding": [ { @@ -13923,48 +14352,53 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-09-20T08:32:26+00:00" }, { "name": "symfony/ux-autocomplete", - "version": "v2.8.1", + "version": "v2.20.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-autocomplete.git", - "reference": "b226b472aa693ad8e30cea330aff1bf0ccf62af8" + "reference": "0bb3e7e3299fc8437f957eb5162303317043a7a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/b226b472aa693ad8e30cea330aff1bf0ccf62af8", - "reference": "b226b472aa693ad8e30cea330aff1bf0ccf62af8", + "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/0bb3e7e3299fc8437f957eb5162303317043a7a8", + "reference": "0bb3e7e3299fc8437f957eb5162303317043a7a8", "shasum": "" }, "require": { - "php": ">=8.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/string": "^5.4|^6.0" + "php": ">=8.1", + "symfony/dependency-injection": "^6.3|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.3|^7.0", + "symfony/http-kernel": "^6.3|^7.0", + "symfony/property-access": "^6.3|^7.0", + "symfony/string": "^6.3|^7.0" }, "conflict": { "doctrine/orm": "2.9.0 || 2.9.1" }, "require-dev": { - "doctrine/doctrine-bundle": "^2.4", - "doctrine/orm": "^2.9", - "mtdowling/jmespath.php": "2.6.x-dev", - "symfony/form": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", + "doctrine/collections": "^1.6.8|^2.0", + "doctrine/doctrine-bundle": "^2.4.3", + "doctrine/orm": "^2.9.4|^3.0", + "fakerphp/faker": "^1.22", + "mtdowling/jmespath.php": "^2.6", + "symfony/form": "^6.3|^7.0", + "symfony/framework-bundle": "^6.3|^7.0", "symfony/maker-bundle": "^1.40", - "symfony/phpunit-bridge": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/security-bundle": "^5.4|^6.0", - "symfony/security-csrf": "^5.4|^6.0", - "symfony/twig-bundle": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", + "symfony/options-resolver": "^6.3|^7.0", + "symfony/phpunit-bridge": "^6.3|^7.0", + "symfony/process": "^6.3|^7.0", + "symfony/security-bundle": "^6.3|^7.0", + "symfony/security-csrf": "^6.3|^7.0", + "symfony/twig-bundle": "^6.3|^7.0", + "symfony/uid": "^6.3|^7.0", + "twig/twig": "^2.14.7|^3.0.4", "zenstruck/browser": "^1.1", - "zenstruck/foundry": "^1.19" + "zenstruck/foundry": "1.37.*" }, "type": "symfony-bundle", "extra": { @@ -13994,7 +14428,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-autocomplete/tree/v2.8.1" + "source": "https://github.com/symfony/ux-autocomplete/tree/v2.20.0" }, "funding": [ { @@ -14010,71 +14444,59 @@ "type": "tidelift" } ], - "time": "2023-04-24T18:32:24+00:00" + "time": "2024-09-06T17:27:37+00:00" }, { "name": "symfony/validator", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "c02ea86844926f04247bc1f5db5f85bb53330823" + "reference": "6da1f0a1ee73d060a411d832cbe0539cfe9bbaa0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/c02ea86844926f04247bc1f5db5f85bb53330823", - "reference": "c02ea86844926f04247bc1f5db5f85bb53330823", + "url": "https://api.github.com/repos/symfony/validator/zipball/6da1f0a1ee73d060a411d832cbe0539cfe9bbaa0", + "reference": "6da1f0a1ee73d060a411d832cbe0539cfe9bbaa0", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^1.1|^2|^3" + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.13", "doctrine/lexer": "<1.1", - "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<5.4", "symfony/expression-language": "<5.4", "symfony/http-kernel": "<5.4", "symfony/intl": "<5.4", "symfony/property-info": "<5.4", - "symfony/translation": "<5.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.13|^2", "egulias/email-validator": "^2.1.10|^3|^4", - "symfony/cache": "^5.4|^6.0", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "egulias/email-validator": "Strict (RFC compliant) email validation", - "psr/cache-implementation": "For using the mapping cache.", - "symfony/config": "", - "symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/property-access": "For accessing properties within comparison constraints", - "symfony/property-info": "To automatically add NotNull and Type constraints", - "symfony/translation": "For translating validation errors.", - "symfony/yaml": "" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -14082,7 +14504,8 @@ "Symfony\\Component\\Validator\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/Resources/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -14102,7 +14525,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.2.10" + "source": "https://github.com/symfony/validator/tree/v6.4.12" }, "funding": [ { @@ -14118,42 +14541,39 @@ "type": "tidelift" } ], - "time": "2023-04-19T09:54:16+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab" + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41a750a23412ca76fdbbf5096943b4134272c1ab", - "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -14190,7 +14610,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.10" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" }, "funding": [ { @@ -14206,27 +14626,30 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2024-08-30T16:03:21+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.2.10", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "9a07920c2058bafee921ce4d90aeef2193837d63" + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/9a07920c2058bafee921ce4d90aeef2193837d63", - "reference": "9a07920c2058bafee921ce4d90aeef2193837d63", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -14264,7 +14687,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.2.10" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" }, "funding": [ { @@ -14280,20 +14703,20 @@ "type": "tidelift" } ], - "time": "2023-04-21T08:33:05+00:00" + "time": "2024-06-24T15:53:56+00:00" }, { "name": "symfony/web-link", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "410aac2034608ac661cdca1968e3c56d4164abc8" + "reference": "304c67cefe7128ea3957e9bb1ac6ce08a90a635b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/410aac2034608ac661cdca1968e3c56d4164abc8", - "reference": "410aac2034608ac661cdca1968e3c56d4164abc8", + "url": "https://api.github.com/repos/symfony/web-link/zipball/304c67cefe7128ea3957e9bb1ac6ce08a90a635b", + "reference": "304c67cefe7128ea3957e9bb1ac6ce08a90a635b", "shasum": "" }, "require": { @@ -14307,10 +14730,7 @@ "psr/link-implementation": "1.0|2.0" }, "require-dev": { - "symfony/http-kernel": "^5.4|^6.0" - }, - "suggest": { - "symfony/http-kernel": "" + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -14350,7 +14770,7 @@ "push" ], "support": { - "source": "https://github.com/symfony/web-link/tree/v6.2.7" + "source": "https://github.com/symfony/web-link/tree/v6.4.8" }, "funding": [ { @@ -14366,20 +14786,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/webpack-encore-bundle", - "version": "v1.16.1", + "version": "v1.17.2", "source": { "type": "git", "url": "https://github.com/symfony/webpack-encore-bundle.git", - "reference": "1862d71e483769b40278548a30e756ce13ef9d4c" + "reference": "471ebbc03072dad6e31840dc317bc634a32785f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/1862d71e483769b40278548a30e756ce13ef9d4c", - "reference": "1862d71e483769b40278548a30e756ce13ef9d4c", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/471ebbc03072dad6e31840dc317bc634a32785f5", + "reference": "471ebbc03072dad6e31840dc317bc634a32785f5", "shasum": "" }, "require": { @@ -14423,7 +14843,7 @@ "description": "Integration with your Symfony app & Webpack Encore!", "support": { "issues": "https://github.com/symfony/webpack-encore-bundle/issues", - "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.16.1" + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.17.2" }, "funding": [ { @@ -14439,35 +14859,39 @@ "type": "tidelift" } ], - "time": "2023-01-18T19:37:55+00:00" + "time": "2023-09-26T14:36:28+00:00" }, { "name": "symfony/workflow", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/workflow.git", - "reference": "d3b73e52ccd2b3682a612d2718ba7123fa37e3d2" + "reference": "73cd60814e6895cba60e931b023bc5af3202f3bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/workflow/zipball/d3b73e52ccd2b3682a612d2718ba7123fa37e3d2", - "reference": "d3b73e52ccd2b3682a612d2718ba7123fa37e3d2", + "url": "https://api.github.com/repos/symfony/workflow/zipball/73cd60814e6895cba60e931b023bc5af3202f3bb", + "reference": "73cd60814e6895cba60e931b023bc5af3202f3bb", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "symfony/event-dispatcher": "<5.4" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/security-core": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/validator": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -14507,7 +14931,7 @@ "workflow" ], "support": { - "source": "https://github.com/symfony/workflow/tree/v6.2.7" + "source": "https://github.com/symfony/workflow/tree/v6.4.8" }, "funding": [ { @@ -14523,34 +14947,32 @@ "type": "tidelift" } ], - "time": "2023-02-24T10:42:00+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/yaml", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "61916f3861b1e9705b18cfde723921a71dd1559d" + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/61916f3861b1e9705b18cfde723921a71dd1559d", - "reference": "61916f3861b1e9705b18cfde723921a71dd1559d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/762ee56b2649659380e0ef4d592d807bc17b7971", + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "symfony/console": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -14581,7 +15003,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.2.10" + "source": "https://github.com/symfony/yaml/tree/v6.4.12" }, "funding": [ { @@ -14597,7 +15019,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:25:36+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "theofidry/alice-data-fixtures", @@ -14695,23 +15117,23 @@ }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.6", + "version": "v2.2.7", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", - "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" @@ -14742,34 +15164,38 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" }, - "time": "2023-01-03T09:29:04+00:00" + "time": "2023-12-08T13:03:43+00:00" }, { "name": "twig/cssinliner-extra", - "version": "v3.6.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/cssinliner-extra.git", - "reference": "85c8f3d7712bab57f6162f9637613df0511f207b" + "reference": "31fd1f7bc79bf3b7c188316e02d78fdd0fc153e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/85c8f3d7712bab57f6162f9637613df0511f207b", - "reference": "85c8f3d7712bab57f6162f9637613df0511f207b", + "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/31fd1f7bc79bf3b7c188316e02d78fdd0fc153e3", + "reference": "31fd1f7bc79bf3b7c188316e02d78fdd0fc153e3", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", "tijsverkoyen/css-to-inline-styles": "^2.0", - "twig/twig": "^2.7|^3.0" + "twig/twig": "^3.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { "Twig\\Extra\\CssInliner\\": "" }, @@ -14797,7 +15223,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.6.0" + "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.12.0" }, "funding": [ { @@ -14809,38 +15235,38 @@ "type": "tidelift" } ], - "time": "2023-02-09T06:45:16+00:00" + "time": "2024-08-26T15:29:01+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.6.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "4a9674e775f49a9df5e26da66546e8f3364afe67" + "reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/4a9674e775f49a9df5e26da66546e8f3364afe67", - "reference": "4a9674e775f49a9df5e26da66546e8f3364afe67", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a5427976a23c50b98d034d2f4c215ffaaaf5875f", + "reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/framework-bundle": "^4.4|^5.0|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "twig/twig": "^2.7|^3.0" + "php": ">=8.0.2", + "symfony/framework-bundle": "^5.4|^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.4|^7.0", + "twig/twig": "^3.0" }, "require-dev": { "league/commonmark": "^1.0|^2.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", + "symfony/phpunit-bridge": "^6.4|^7.0", "twig/cache-extra": "^3.0", - "twig/cssinliner-extra": "^2.12|^3.0", - "twig/html-extra": "^2.12|^3.0", - "twig/inky-extra": "^2.12|^3.0", - "twig/intl-extra": "^2.12|^3.0", - "twig/markdown-extra": "^2.12|^3.0", - "twig/string-extra": "^2.12|^3.0" + "twig/cssinliner-extra": "^3.0", + "twig/html-extra": "^3.0", + "twig/inky-extra": "^3.0", + "twig/intl-extra": "^3.0", + "twig/markdown-extra": "^3.0", + "twig/string-extra": "^3.0" }, "type": "symfony-bundle", "autoload": { @@ -14871,7 +15297,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.6.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.12.0" }, "funding": [ { @@ -14883,32 +15309,36 @@ "type": "tidelift" } ], - "time": "2023-04-14T11:03:02+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/inky-extra", - "version": "v3.6.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/inky-extra.git", - "reference": "907abf7046082cc151a3ee01f268dbf5f5f28eab" + "reference": "cf3abb00b329af9a3732d3bd6168a4e16ae8cd9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/907abf7046082cc151a3ee01f268dbf5f5f28eab", - "reference": "907abf7046082cc151a3ee01f268dbf5f5f28eab", + "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/cf3abb00b329af9a3732d3bd6168a4e16ae8cd9f", + "reference": "cf3abb00b329af9a3732d3bd6168a4e16ae8cd9f", "shasum": "" }, "require": { "lorenzo/pinky": "^1.0.5", - "php": ">=7.1.3", - "twig/twig": "^2.7|^3.0" + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "twig/twig": "^3.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { "Twig\\Extra\\Inky\\": "" }, @@ -14937,7 +15367,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/inky-extra/tree/v3.6.0" + "source": "https://github.com/twigphp/inky-extra/tree/v3.12.0" }, "funding": [ { @@ -14949,29 +15379,29 @@ "type": "tidelift" } ], - "time": "2023-02-09T06:45:16+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/intl-extra", - "version": "v3.6.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "a97c323bebfca009d02994a5a8568c0b412a49ab" + "reference": "61e1189333120a475d2b67b93664b8002668fc27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/a97c323bebfca009d02994a5a8568c0b412a49ab", - "reference": "a97c323bebfca009d02994a5a8568c0b412a49ab", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/61e1189333120a475d2b67b93664b8002668fc27", + "reference": "61e1189333120a475d2b67b93664b8002668fc27", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/intl": "^4.4|^5.0|^6.0", - "twig/twig": "^2.7|^3.0" + "php": ">=8.0.2", + "symfony/intl": "^5.4|^6.4|^7.0", + "twig/twig": "^3.10" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -15001,7 +15431,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.6.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.12.0" }, "funding": [ { @@ -15013,35 +15443,39 @@ "type": "tidelift" } ], - "time": "2023-02-09T06:45:16+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.6.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "8f1179e279cea6ef14066a4560b859df58acd5d8" + "reference": "2a94d7902a58147474840c89cbfcd16e68c70499" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/8f1179e279cea6ef14066a4560b859df58acd5d8", - "reference": "8f1179e279cea6ef14066a4560b859df58acd5d8", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/2a94d7902a58147474840c89cbfcd16e68c70499", + "reference": "2a94d7902a58147474840c89cbfcd16e68c70499", "shasum": "" }, "require": { - "php": ">=7.1.3", - "twig/twig": "^2.7|^3.0" + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "twig/twig": "^3.0" }, "require-dev": { "erusev/parsedown": "^1.7", "league/commonmark": "^1.0|^2.0", "league/html-to-markdown": "^4.8|^5.0", "michelf/php-markdown": "^1.8|^2.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { "Twig\\Extra\\Markdown\\": "" }, @@ -15069,7 +15503,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.6.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.12.0" }, "funding": [ { @@ -15081,33 +15515,41 @@ "type": "tidelift" } ], - "time": "2023-02-09T06:45:16+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/twig", - "version": "v3.6.0", + "version": "v3.14.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "106c170d08e8415d78be2d16c3d057d0d108262b" + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/106c170d08e8415d78be2d16c3d057d0d108262b", - "reference": "106c170d08e8415d78be2d16c3d057d0d108262b", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", "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-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.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/" } @@ -15140,7 +15582,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.6.0" + "source": "https://github.com/twigphp/Twig/tree/v3.14.0" }, "funding": [ { @@ -15152,7 +15594,7 @@ "type": "tidelift" } ], - "time": "2023-05-03T19:06:57+00:00" + "time": "2024-09-09T17:55:12+00:00" }, { "name": "webbaard/payum-mollie", @@ -15341,34 +15783,37 @@ }, { "name": "willdurand/geocoder-bundle", - "version": "5.19.0", + "version": "5.20.1", "source": { "type": "git", "url": "https://github.com/geocoder-php/BazingaGeocoderBundle.git", - "reference": "f4530ab17c9453f1308f1f89ad736300f34455a1" + "reference": "0e1b7eb3d9fda20b5fe1349b4da7212fdf17e61b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/BazingaGeocoderBundle/zipball/f4530ab17c9453f1308f1f89ad736300f34455a1", - "reference": "f4530ab17c9453f1308f1f89ad736300f34455a1", + "url": "https://api.github.com/repos/geocoder-php/BazingaGeocoderBundle/zipball/0e1b7eb3d9fda20b5fe1349b4da7212fdf17e61b", + "reference": "0e1b7eb3d9fda20b5fe1349b4da7212fdf17e61b", "shasum": "" }, "require": { "geocoder-php/plugin": "^1.5", "php": "^7.4 || ^8.0", + "php-http/curl-client": "^2.3", "php-http/discovery": "^1.14", - "symfony/console": "^4.4 || ^5.0 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/options-resolver": "^4.4 || ^5.0 || ^6.0", + "symfony/console": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^4.4 || ^5.4 || ^6.4 || ^7.0", "willdurand/geocoder": "^4.6" }, "conflict": { "geocoder-php/nominatim-provider": "<5.0" }, "require-dev": { - "doctrine/orm": "~2.8", + "doctrine/annotations": "^1.11.1 || ^2.0", + "doctrine/doctrine-bundle": "^2.3", + "doctrine/orm": "^2.8", "fakerphp/faker": "^1.20", - "friendsofphp/php-cs-fixer": "^3.13", + "friendsofphp/php-cs-fixer": "^3.0", "geocoder-php/algolia-places-provider": "^0.4", "geocoder-php/arcgis-online-provider": "^4.4", "geocoder-php/bing-maps-provider": "^4.3", @@ -15401,14 +15846,18 @@ "geoip/geoip": "~1.17", "nyholm/nsa": "^1.3", "nyholm/psr7": "^1.5", - "nyholm/symfony-bundle-test": "dev-master", - "php-http/curl-client": "^2.2", + "nyholm/symfony-bundle-test": "^2.0 || ^3.0", "php-http/message": "^1.13", + "php-http/mock-client": "^1.6", "phpstan/phpstan": "^1.9.2", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.2 || ^6.0", - "symfony/validator": "^4.4 || ^5.0 || ^6.0", - "symfony/yaml": "^4.4 || ^5.0 || ^6.0" + "psr/http-client": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/config": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.1", + "symfony/validator": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.0 || ^6.0 || ^7.0", + "symfony/yaml": "^4.4 || ^5.0 || ^6.0 || ^7.0" }, "type": "symfony-bundle", "extra": { @@ -15438,9 +15887,9 @@ ], "support": { "issues": "https://github.com/geocoder-php/BazingaGeocoderBundle/issues", - "source": "https://github.com/geocoder-php/BazingaGeocoderBundle/tree/5.19.0" + "source": "https://github.com/geocoder-php/BazingaGeocoderBundle/tree/5.20.1" }, - "time": "2022-12-05T13:56:11+00:00" + "time": "2024-05-22T10:35:41+00:00" }, { "name": "willdurand/negotiation", @@ -15501,31 +15950,103 @@ ], "packages-dev": [ { - "name": "composer/pcre", - "version": "3.1.0", + "name": "clue/ndjson-react", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "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.3.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, "require-dev": { - "phpstan/phpstan": "^1.3", + "phpstan/phpstan": "^1.11.10", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -15553,7 +16074,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.0" + "source": "https://github.com/composer/pcre/tree/3.3.1" }, "funding": [ { @@ -15569,20 +16090,20 @@ "type": "tidelift" } ], - "time": "2022-11-17T09:50:14+00:00" + "time": "2024-08-27T18:44:43+00:00" }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", "shasum": "" }, "require": { @@ -15632,9 +16153,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.2" }, "funding": [ { @@ -15650,20 +16171,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2024-07-12T11:35:52+00:00" }, { "name": "composer/xdebug-handler", - "version": "3.0.3", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { @@ -15674,7 +16195,7 @@ "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { @@ -15698,9 +16219,9 @@ "performance" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "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.3" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { @@ -15716,7 +16237,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { "name": "ekino/phpstan-banned-code", @@ -15784,54 +16305,166 @@ "time": "2021-11-02T08:37:34+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.14.2", + "name": "evenement/evenement", + "version": "v3.0.2", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "14f0541651841b63640e7aafad041ad55dc7aa88" + "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/14f0541651841b63640e7aafad041ad55dc7aa88", - "reference": "14f0541651841b63640e7aafad041ad55dc7aa88", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { - "composer/semver": "^3.3", - "composer/xdebug-handler": "^3.0.3", - "doctrine/annotations": "^1.14.2 || ^2", - "doctrine/lexer": "^2", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.27", - "symfony/polyfill-php80": "^1.27", - "symfony/polyfill-php81": "^1.27", - "symfony/process": "^5.4 || ^6.0", - "symfony/stopwatch": "^5.4 || ^6.0" + "php": ">=7.0" }, "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.64.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "58dd9c931c785a79739310aef5178928305ffa67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", + "reference": "58dd9c931c785a79739310aef5178928305ffa67", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.0", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.3", + "infection/infection": "^0.29.5", "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^2.0", + "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.11", - "php-coveralls/php-coveralls": "^2.5.3", + "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.16", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "phpunitgoodpractices/polyfill": "^1.6", - "phpunitgoodpractices/traits": "^1.9.2", - "symfony/phpunit-bridge": "^6.2.3", - "symfony/yaml": "^5.4 || ^6.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -15844,7 +16477,10 @@ "autoload": { "psr-4": { "PhpCsFixer\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -15861,9 +16497,15 @@ } ], "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.2" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0" }, "funding": [ { @@ -15871,20 +16513,20 @@ "type": "github" } ], - "time": "2023-01-29T23:47:01+00:00" + "time": "2024-08-30T23:09:38+00:00" }, { "name": "friendsoftwig/twigcs", - "version": "6.2.0", + "version": "6.4.0", "source": { "type": "git", "url": "https://github.com/friendsoftwig/twigcs.git", - "reference": "da697cc1bf6bf22feb1d8dbefcbdb1451e6a35f6" + "reference": "954e1af488d649cf329f35deaedf2b8fe2cf4b56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/friendsoftwig/twigcs/zipball/da697cc1bf6bf22feb1d8dbefcbdb1451e6a35f6", - "reference": "da697cc1bf6bf22feb1d8dbefcbdb1451e6a35f6", + "url": "https://api.github.com/repos/friendsoftwig/twigcs/zipball/954e1af488d649cf329f35deaedf2b8fe2cf4b56", + "reference": "954e1af488d649cf329f35deaedf2b8fe2cf4b56", "shasum": "" }, "require": { @@ -15893,14 +16535,14 @@ "ext-json": "*", "ext-mbstring": "*", "ext-simplexml": "*", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0", - "symfony/console": "^4.4 || ^5.3 || ^6.0", - "symfony/filesystem": "^4.4 || ^5.3 || ^6.0", - "symfony/finder": "^4.4 || ^5.3 || ^6.0" + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.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.5.27", - "symfony/phpunit-bridge": "^6.2.3" + "phpunit/phpunit": "^9.6.15", + "symfony/phpunit-bridge": "^7.0.1" }, "bin": [ "bin/twigcs" @@ -15924,31 +16566,33 @@ "description": "Checkstyle automation for Twig", "support": { "issues": "https://github.com/friendsoftwig/twigcs/issues", - "source": "https://github.com/friendsoftwig/twigcs/tree/6.2.0" + "source": "https://github.com/friendsoftwig/twigcs/tree/6.4.0" }, - "time": "2023-01-13T16:02:00+00:00" + "time": "2023-12-05T07:36:35+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v5.1.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -15956,7 +16600,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -15980,26 +16624,27 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2024-07-01T20:03:41+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -16040,9 +16685,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -16097,16 +16748,16 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.14.0", + "version": "1.15.1", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "3ea4f924afb43056bf9c630509e657d951608563" + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", - "reference": "3ea4f924afb43056bf9c630509e657d951608563", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8", + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8", "shasum": "" }, "require": { @@ -16115,7 +16766,7 @@ "ext-zip": "*", "php": "^7.3 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^5.0 || ^6.0" + "symfony/process": "^5.0 || ^6.0 || ^7.0" }, "replace": { "facebook/webdriver": "*" @@ -16157,28 +16808,28 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1" }, - "time": "2023-02-09T12:12:19+00:00" + "time": "2023-10-20T12:21:20+00:00" }, { "name": "phpstan/extension-installer", - "version": "1.3.0", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/phpstan/extension-installer.git", - "reference": "f5e02d40f277d28513001976f444d9ff1dc15e9a" + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f5e02d40f277d28513001976f444d9ff1dc15e9a", - "reference": "f5e02d40f277d28513001976f444d9ff1dc15e9a", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", "shasum": "" }, "require": { "composer-plugin-api": "^2.0", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.8.0" + "phpstan/phpstan": "^1.9.0 || ^2.0" }, "require-dev": { "composer/composer": "^2.0", @@ -16187,12 +16838,7 @@ }, "type": "composer-plugin", "extra": { - "class": "PHPStan\\ExtensionInstaller\\Plugin", - "phpstan/extension-installer": { - "ignore": [ - "phpstan/phpstan-phpunit" - ] - } + "class": "PHPStan\\ExtensionInstaller\\Plugin" }, "autoload": { "psr-4": { @@ -16204,24 +16850,28 @@ "MIT" ], "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/extension-installer/issues", - "source": "https://github.com/phpstan/extension-installer/tree/1.3.0" + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" }, - "time": "2023-04-18T13:08:02+00:00" + "time": "2024-09-04T20:21:43+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.15", + "version": "1.12.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd" + "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/762c4dac4da6f8756eebb80e528c3a47855da9bd", - "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", + "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", "shasum": "" }, "require": { @@ -16264,35 +16914,30 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2023-05-09T15:28:01+00:00" + "time": "2024-09-05T16:09:28+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "1.1.3", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319" + "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", - "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/fa8cce7720fa782899a0aa97b6a41225d1bb7b26", + "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.11" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-php-parser": "^1.1", "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -16316,27 +16961,27 @@ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.3" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.0" }, - "time": "2023-03-17T07:50:08+00:00" + "time": "2024-04-20T06:39:48+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "1.3.40", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "f741919a720af6f84249abc62befeb15eee7bc88" + "reference": "38db3bad8f1567d7bf64806738d724261f8a2b5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/f741919a720af6f84249abc62befeb15eee7bc88", - "reference": "f741919a720af6f84249abc62befeb15eee7bc88", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/38db3bad8f1567d7bf64806738d724261f8a2b5c", + "reference": "38db3bad8f1567d7bf64806738d724261f8a2b5c", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10.12" + "phpstan/phpstan": "^1.11.7" }, "conflict": { "doctrine/collections": "<1.0", @@ -16346,24 +16991,26 @@ "doctrine/persistence": "<1.3" }, "require-dev": { + "cache/array-adapter": "^1.1", "composer/semver": "^3.3.2", - "doctrine/annotations": "^1.11.0", - "doctrine/collections": "^1.6", + "cweagans/composer-patches": "^1.7.3", + "doctrine/annotations": "^1.11 || ^2.0", + "doctrine/collections": "^1.6 || ^2.1", "doctrine/common": "^2.7 || ^3.0", "doctrine/dbal": "^2.13.8 || ^3.3.3", - "doctrine/lexer": "^1.2.1", - "doctrine/mongodb-odm": "^1.3 || ^2.1", - "doctrine/orm": "^2.11.0", - "doctrine/persistence": "^1.3.8 || ^2.2.1", + "doctrine/lexer": "^2.0 || ^3.0", + "doctrine/mongodb-odm": "^1.3 || ^2.4.3", + "doctrine/orm": "^2.16.0", + "doctrine/persistence": "^2.2.1 || ^3.2", "gedmo/doctrine-extensions": "^3.8", "nesbot/carbon": "^2.49", "nikic/php-parser": "^4.13.2", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5.10", - "ramsey/uuid-doctrine": "^1.5.0", - "symfony/cache": "^4.4.35" + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^9.6.16", + "ramsey/uuid": "^4.2", + "symfony/cache": "^5.4" }, "type": "phpstan-extension", "extra": { @@ -16386,27 +17033,27 @@ "description": "Doctrine extensions for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/1.3.40" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/1.5.3" }, - "time": "2023-05-11T11:26:04+00:00" + "time": "2024-09-01T13:17:34+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.1", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6" + "reference": "363f921dd8441777d4fc137deb99beb486c77df1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b21c03d4f6f3a446e4311155f4be9d65048218e6", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/363f921dd8441777d4fc137deb99beb486c77df1", + "reference": "363f921dd8441777d4fc137deb99beb486c77df1", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.11" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -16435,28 +17082,28 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.1" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.6.0" }, - "time": "2023-03-29T14:47:40+00:00" + "time": "2024-04-20T06:37:51+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "1.3.2", + "version": "1.4.9", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "7332b90dfc291ac5b4b83fbca2081936faa1e3f9" + "reference": "51ab2438fb2695467cf96b58d2f8f28d4dd1e3e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/7332b90dfc291ac5b4b83fbca2081936faa1e3f9", - "reference": "7332b90dfc291ac5b4b83fbca2081936faa1e3f9", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/51ab2438fb2695467cf96b58d2f8f28d4dd1e3e9", + "reference": "51ab2438fb2695467cf96b58d2f8f28d4dd1e3e9", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.18" + "phpstan/phpstan": "^1.12" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -16464,8 +17111,8 @@ "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpstan/phpstan-strict-rules": "^1.5.1", "phpunit/phpunit": "^8.5.29 || ^9.5", "psr/container": "1.0 || 1.1.1", "symfony/config": "^5.4 || ^6.1", @@ -16476,7 +17123,8 @@ "symfony/http-foundation": "^5.4 || ^6.1", "symfony/messenger": "^5.4", "symfony/polyfill-php80": "^1.24", - "symfony/serializer": "^5.4" + "symfony/serializer": "^5.4", + "symfony/service-contracts": "^2.2.0" }, "type": "phpstan-extension", "extra": { @@ -16506,22 +17154,22 @@ "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.2" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.9" }, - "time": "2023-05-16T12:46:15+00:00" + "time": "2024-09-05T16:15:09+00:00" }, { "name": "phpstan/phpstan-webmozart-assert", - "version": "1.2.4", + "version": "1.2.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-webmozart-assert.git", - "reference": "d1ff28697bd4e1c9ef5d3f871367ce9092871fec" + "reference": "be3dcd883f52f1c7372519a3c019e54e847dbc17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-webmozart-assert/zipball/d1ff28697bd4e1c9ef5d3f871367ce9092871fec", - "reference": "d1ff28697bd4e1c9ef5d3f871367ce9092871fec", + "url": "https://api.github.com/repos/phpstan/phpstan-webmozart-assert/zipball/be3dcd883f52f1c7372519a3c019e54e847dbc17", + "reference": "be3dcd883f52f1c7372519a3c019e54e847dbc17", "shasum": "" }, "require": { @@ -16557,41 +17205,41 @@ "description": "PHPStan webmozart/assert extension", "support": { "issues": "https://github.com/phpstan/phpstan-webmozart-assert/issues", - "source": "https://github.com/phpstan/phpstan-webmozart-assert/tree/1.2.4" + "source": "https://github.com/phpstan/phpstan-webmozart-assert/tree/1.2.10" }, - "time": "2023-02-21T20:34:19+00:00" + "time": "2024-08-19T12:57:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "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.15", + "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", @@ -16600,7 +17248,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -16628,7 +17276,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -16636,7 +17285,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -16881,45 +17530,45 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.8", + "version": "9.6.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e" + "reference": "49d7820565836236411f5dc002d16dd689cde42f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e", - "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", + "reference": "49d7820565836236411f5dc002d16dd689cde42f", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.5.0 || ^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", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.31", + "phpunit/php-file-iterator": "^3.0.6", "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", + "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.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/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": { @@ -16964,7 +17613,7 @@ "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.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" }, "funding": [ { @@ -16980,7 +17629,537 @@ "type": "tidelift" } ], - "time": "2023-05-11T05:14:45+00:00" + "time": "2024-07-10T11:45:39+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.5", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/socket": "^1.8", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + }, + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-09-16T13:41:56+00:00" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, + { + "name": "react/socket", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-07-26T10:38:09+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" }, { "name": "rector/rector", @@ -17041,16 +18220,16 @@ }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -17085,7 +18264,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -17093,7 +18272,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -17208,20 +18387,20 @@ }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -17253,7 +18432,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -17261,7 +18440,7 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/environment", @@ -17328,16 +18507,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { @@ -17380,7 +18559,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -17388,24 +18567,24 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -17437,7 +18616,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -17445,7 +18624,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -17561,16 +18740,16 @@ }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -17582,7 +18761,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -17603,8 +18782,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -17612,7 +18790,7 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", @@ -17777,30 +18955,27 @@ }, { "name": "symfony/browser-kit", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "87bd43240e6cc855f70ea1c7a448ab3bd442633c" + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/87bd43240e6cc855f70ea1c7a448ab3bd442633c", - "reference": "87bd43240e6cc855f70ea1c7a448ab3bd442633c", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/62ab90b92066ef6cce5e79365625b4b1432464c8", + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/dom-crawler": "^5.4|^6.0" + "symfony/dom-crawler": "^5.4|^6.0|^7.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" - }, - "suggest": { - "symfony/process": "" + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -17828,7 +19003,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.2.7" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.8" }, "funding": [ { @@ -17844,41 +19019,37 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.2.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "8ff6c96d09c462beade7512137899e400c76d994" + "reference": "689f1bcb0bd3b945e3c671cbd06274b127c64dc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/8ff6c96d09c462beade7512137899e400c76d994", - "reference": "8ff6c96d09c462beade7512137899e400c76d994", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/689f1bcb0bd3b945e3c671cbd06274b127c64dc9", + "reference": "689f1bcb0bd3b945e3c671cbd06274b127c64dc9", "shasum": "" }, "require": { "ext-xml": "*", "php": ">=8.1", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/twig-bridge": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/config": "<5.4", "symfony/dependency-injection": "<5.4" }, "require-dev": { - "symfony/config": "^5.4|^6.0", - "symfony/web-profiler-bundle": "^5.4|^6.0" - }, - "suggest": { - "symfony/config": "For service container configuration", - "symfony/dependency-injection": "For using as a service from the container" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -17906,7 +19077,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v6.2.7" + "source": "https://github.com/symfony/debug-bundle/tree/v6.4.8" }, "funding": [ { @@ -17922,20 +19093,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.2.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "328bc3795059651d2d4e462e8febdf7ec2d7a626" + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/328bc3795059651d2d4e462e8febdf7ec2d7a626", - "reference": "328bc3795059651d2d4e462e8febdf7ec2d7a626", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/9d307ecbcb917001692be333cdc58f474fdb37f0", + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0", "shasum": "" }, "require": { @@ -17945,10 +19116,7 @@ "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0" - }, - "suggest": { - "symfony/css-selector": "" + "symfony/css-selector": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -17976,7 +19144,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.2.9" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.12" }, "funding": [ { @@ -17992,56 +19160,54 @@ "type": "tidelift" } ], - "time": "2023-04-11T16:03:19+00:00" + "time": "2024-09-15T06:35:36+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.48.0", + "version": "v1.61.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "2e428e8432e9879187672fe08f1cc335e2a31dd6" + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/2e428e8432e9879187672fe08f1cc335e2a31dd6", - "reference": "2e428e8432e9879187672fe08f1cc335e2a31dd6", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", "shasum": "" }, "require": { "doctrine/inflector": "^2.0", - "nikic/php-parser": "^4.11", - "php": ">=8.0", - "symfony/config": "^5.4.7|^6.0", - "symfony/console": "^5.4.7|^6.0", - "symfony/dependency-injection": "^5.4.7|^6.0", + "nikic/php-parser": "^4.18|^5.0", + "php": ">=8.1", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.2|^3", - "symfony/filesystem": "^5.4.7|^6.0", - "symfony/finder": "^5.4.3|^6.0", - "symfony/framework-bundle": "^5.4.7|^6.0", - "symfony/http-kernel": "^5.4.7|^6.0" + "symfony/filesystem": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" }, "conflict": { - "doctrine/doctrine-bundle": "<2.4", - "doctrine/orm": "<2.10", - "symfony/doctrine-bridge": "<5.4" + "doctrine/doctrine-bundle": "<2.10", + "doctrine/orm": "<2.15" }, "require-dev": { "composer/semver": "^3.0", - "doctrine/doctrine-bundle": "^2.4", - "doctrine/orm": "^2.10.0", - "symfony/http-client": "^5.4.7|^6.0", - "symfony/phpunit-bridge": "^5.4.7|^6.0", - "symfony/polyfill-php80": "^1.16.0", - "symfony/process": "^5.4.7|^6.0", - "symfony/security-core": "^5.4.7|^6.0", - "symfony/yaml": "^5.4.3|^6.0", - "twig/twig": "^2.0|^3.0" + "doctrine/doctrine-bundle": "^2.5.0", + "doctrine/orm": "^2.15|^3", + "symfony/http-client": "^6.4|^7.0", + "symfony/phpunit-bridge": "^6.4.1|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.0|^4.x-dev" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-main": "1.0-dev" + "dev-main": "1.x-dev" } }, "autoload": { @@ -18063,13 +19229,14 @@ "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", "keywords": [ "code generator", + "dev", "generator", "scaffold", "scaffolding" ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.48.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" }, "funding": [ { @@ -18085,20 +19252,20 @@ "type": "tidelift" } ], - "time": "2022-11-14T10:48:46+00:00" + "time": "2024-08-29T22:50:23+00:00" }, { "name": "symfony/panther", - "version": "v2.0.1", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/symfony/panther.git", - "reference": "dc572828ee81051b87c39db8a9be1bb78980d738" + "reference": "ef9a6f2393ac9679af03a93d3f508e4aa65c15b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/panther/zipball/dc572828ee81051b87c39db8a9be1bb78980d738", - "reference": "dc572828ee81051b87c39db8a9be1bb78980d738", + "url": "https://api.github.com/repos/symfony/panther/zipball/ef9a6f2393ac9679af03a93d3f508e4aa65c15b5", + "reference": "ef9a6f2393ac9679af03a93d3f508e4aa65c15b5", "shasum": "" }, "require": { @@ -18106,19 +19273,19 @@ "ext-libxml": "*", "php": ">=8.0", "php-webdriver/webdriver": "^1.8.2", - "symfony/browser-kit": "^5.3 || ^6.0", - "symfony/dependency-injection": "^5.3 || ^6.0", + "symfony/browser-kit": "^5.3 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.3 || ^6.0 || ^7.0", "symfony/deprecation-contracts": "^2.4 || ^3", - "symfony/dom-crawler": "^5.3 || ^6.0", - "symfony/http-client": "^5.3 || ^6.0", - "symfony/http-kernel": "^5.3 || ^6.0", - "symfony/process": "^5.3 || ^6.0" + "symfony/dom-crawler": "^5.3 || ^6.0 || ^7.0", + "symfony/http-client": "^5.3 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.3 || ^6.0 || ^7.0", + "symfony/process": "^5.3 || ^6.0 || ^7.0" }, "require-dev": { - "symfony/css-selector": "^5.3 || ^6.0", - "symfony/framework-bundle": "^5.3 || ^6.0", - "symfony/mime": "^5.3 || ^6.0", - "symfony/phpunit-bridge": "^5.3 || ^6.0" + "symfony/css-selector": "^5.3 || ^6.0 || ^7.0", + "symfony/framework-bundle": "^5.3 || ^6.0 || ^7.0", + "symfony/mime": "^5.3 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.3 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -18158,7 +19325,7 @@ ], "support": { "issues": "https://github.com/symfony/panther/issues", - "source": "https://github.com/symfony/panther/tree/v2.0.1" + "source": "https://github.com/symfony/panther/tree/v2.1.1" }, "funding": [ { @@ -18174,20 +19341,20 @@ "type": "tidelift" } ], - "time": "2021-12-02T17:32:12+00:00" + "time": "2023-12-03T22:17:31+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v6.2.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "552950db2919421ad917e29e76d1999a2a31a8e3" + "reference": "168f412dcd6caf3813a9cc0f286cd68f6a76f070" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/552950db2919421ad917e29e76d1999a2a31a8e3", - "reference": "552950db2919421ad917e29e76d1999a2a31a8e3", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/168f412dcd6caf3813a9cc0f286cd68f6a76f070", + "reference": "168f412dcd6caf3813a9cc0f286cd68f6a76f070", "shasum": "" }, "require": { @@ -18197,11 +19364,9 @@ "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3.0", - "symfony/error-handler": "^5.4|^6.0" - }, - "suggest": { - "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/polyfill-php81": "^1.27" }, "bin": [ "bin/simple-phpunit" @@ -18221,7 +19386,8 @@ "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -18241,7 +19407,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.2.10" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.11" }, "funding": [ { @@ -18257,20 +19423,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2024-08-13T14:27:37+00:00" }, { "name": "symfony/process", - "version": "v6.2.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", - "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -18302,7 +19468,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.10" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -18318,41 +19484,42 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:56:57+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.2.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "24b6f4370f1cd59aacfc5e799c8614b40776e9c8" + "reference": "ef4b8b4f9f51260d18abec40ceacc4bc9c5555e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/24b6f4370f1cd59aacfc5e799c8614b40776e9c8", - "reference": "24b6f4370f1cd59aacfc5e799c8614b40776e9c8", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ef4b8b4f9f51260d18abec40ceacc4bc9c5555e3", + "reference": "ef4b8b4f9f51260d18abec40ceacc4bc9c5555e3", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/config": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", - "symfony/http-kernel": "^6.1", - "symfony/routing": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/twig-bundle": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, "conflict": { "symfony/form": "<5.4", "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4" + "symfony/messenger": "<5.4", + "symfony/twig-bundle": ">=7.0" }, "require-dev": { - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -18379,8 +19546,11 @@ ], "description": "Provides a development tool that gives detailed information about the execution of any request", "homepage": "https://symfony.com", + "keywords": [ + "dev" + ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.2.10" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.11" }, "funding": [ { @@ -18396,20 +19566,20 @@ "type": "tidelift" } ], - "time": "2023-04-24T13:41:17+00:00" + "time": "2024-08-12T09:55:28+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -18438,7 +19608,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -18446,31 +19616,31 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "zenstruck/assert", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/zenstruck/assert.git", - "reference": "8fdd1f1b23f3c8612176d78616b52aa60df1be7f" + "reference": "60956bb6584a51c6c2ab9fa8707b7c013d770163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zenstruck/assert/zipball/8fdd1f1b23f3c8612176d78616b52aa60df1be7f", - "reference": "8fdd1f1b23f3c8612176d78616b52aa60df1be7f", + "url": "https://api.github.com/repos/zenstruck/assert/zipball/60956bb6584a51c6c2ab9fa8707b7c013d770163", + "reference": "60956bb6584a51c6c2ab9fa8707b7c013d770163", "shasum": "" }, "require": { "php": ">=8.0", "symfony/polyfill-php81": "^1.23", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "require-dev": { "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^9.5", - "symfony/phpunit-bridge": "^6.2" + "symfony/phpunit-bridge": "^6.3" }, "type": "library", "autoload": { @@ -18497,7 +19667,7 @@ ], "support": { "issues": "https://github.com/zenstruck/assert/issues", - "source": "https://github.com/zenstruck/assert/tree/v1.4.0" + "source": "https://github.com/zenstruck/assert/tree/v1.5.0" }, "funding": [ { @@ -18505,27 +19675,27 @@ "type": "github" } ], - "time": "2023-04-17T15:45:16+00:00" + "time": "2023-12-02T09:08:04+00:00" }, { "name": "zenstruck/messenger-test", - "version": "v1.7.2", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/zenstruck/messenger-test.git", - "reference": "8ef7993cf452182ee843a614921552ae560e408c" + "reference": "063455f6ff6471409c2930e0d53a416eb23e0d1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zenstruck/messenger-test/zipball/8ef7993cf452182ee843a614921552ae560e408c", - "reference": "8ef7993cf452182ee843a614921552ae560e408c", + "url": "https://api.github.com/repos/zenstruck/messenger-test/zipball/063455f6ff6471409c2930e0d53a416eb23e0d1f", + "reference": "063455f6ff6471409c2930e0d53a416eb23e0d1f", "shasum": "" }, "require": { - "php": ">=8.0", + "php": ">=8.1", "symfony/deprecation-contracts": "^2.2|^3.0", - "symfony/framework-bundle": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", "zenstruck/assert": "^1.0" }, "conflict": { @@ -18533,10 +19703,14 @@ }, "require-dev": { "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^9.5.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "phpunit/phpunit": "^9.6.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.3|^7.0", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "suggest": { + "symfony/clock": "A PSR-20 clock implementation in order to support DelayStamp." }, "type": "symfony-bundle", "autoload": { @@ -18558,13 +19732,14 @@ "homepage": "https://github.com/zenstruck/messenger-test", "keywords": [ "Messenger", + "dev", "queue", "symfony", "test" ], "support": { "issues": "https://github.com/zenstruck/messenger-test/issues", - "source": "https://github.com/zenstruck/messenger-test/tree/v1.7.2" + "source": "https://github.com/zenstruck/messenger-test/tree/v1.10.0" }, "funding": [ { @@ -18572,11 +19747,11 @@ "type": "github" } ], - "time": "2023-02-24T20:54:57+00:00" + "time": "2024-07-31T14:08:07+00:00" } ], "aliases": [], - "minimum-stability": "stable", + "minimum-stability": "beta", "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, @@ -18590,5 +19765,5 @@ "ext-zip": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/composer.md b/composer.md index 428cbce..7b90a63 100644 --- a/composer.md +++ b/composer.md @@ -1,23 +1 @@ # Note regarding composer.json - -## Meilisearch - - meilisearch/meilisearch-php - -Is locked to `v0.26.0` to prevent this error: - - Executing script cache:clear [KO] - [KO] - Script cache:clear returned with error code 1 - !! - !! In DebugClassLoader.php line 327: - !! - !! Case mismatch between loaded and declared class names: "MeiliSearch\Client" - !! vs "Meilisearch\Client". - !! - !! - !! - Script @auto-scripts was called via post-update-cmd - - -I have opened a ticket https://github.com/meilisearch/meilisearch-php/issues/452. diff --git a/config/bundles.php b/config/bundles.php index efd16ea..8856197 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -28,9 +28,9 @@ return [ Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], League\FlysystemBundle\FlysystemBundle::class => ['all' => true], Knp\Bundle\PaginatorBundle\KnpPaginatorBundle::class => ['all' => true], - Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], Symfony\UX\Autocomplete\AutocompleteBundle::class => ['all' => true], Payum\Bundle\PayumBundle\PayumBundle::class => ['all' => true], FOS\CKEditorBundle\FOSCKEditorBundle::class => ['all' => true], Misd\PhoneNumberBundle\MisdPhoneNumberBundle::class => ['all' => true], + Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true], ]; diff --git a/config/packages/fos_ckeditor.yaml b/config/packages/fos_ckeditor.yaml index 8a9bc50..2cb9703 100644 --- a/config/packages/fos_ckeditor.yaml +++ b/config/packages/fos_ckeditor.yaml @@ -6,5 +6,7 @@ twig: fos_ck_editor: configs: + default: + versionCheck: false main_config: toolbar: full diff --git a/config/packages/security.yaml b/config/packages/security.yaml index b75cfbc..dc04dba 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -47,8 +47,8 @@ security: access_control: - { path: ^/admin, roles: [ROLE_ADMIN, ROLE_GROUP_ADMIN] } # to synchronize with MyAccountAction - - { path: ^/en/my-account/, roles: ROLE_USER } - - { path: ^/fr/mon-compte/, roles: ROLE_USER } + - { path: ^/en/my-account, roles: MEMBERSHIP_PAID } + - { path: ^/fr/mon-compte, roles: MEMBERSHIP_PAID } role_hierarchy: ROLE_ADMIN: [ROLE_USER, ROLE_ALLOWED_TO_SWITCH, ROLE_GROUP_ADMIN] diff --git a/config/packages/sensio_framework_extra.yaml b/config/packages/sensio_framework_extra.yaml deleted file mode 100644 index 74ff738..0000000 --- a/config/packages/sensio_framework_extra.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# https://stackoverflow.com/q/69809320/633864 -sensio_framework_extra: - router: - annotations: false - request: - converters: false - auto_convert: false diff --git a/docker-compose.override.yml b/docker-compose.override.yml index e7df768..3984cf6 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,5 +1,3 @@ -version: "3.4" - # Development environment override services: # https://localhost/_profiler/phpinfo @@ -30,8 +28,13 @@ services: maildev: image: maildev/maildev ports: - - 1080:1080 - - 1025:1025 + - "1080:1080" + - "1025:1025" + healthcheck: + test: ["CMD-SHELL", "wget -O - http://0.0.0.0:1080/healthz || exit 1"] + interval: 5s + timeout: 5s + retries: 5 storage: image: minio/minio diff --git a/docker-compose.override.yml.dist b/docker-compose.override.yml.dist index f3ac34c..54f9e7c 100644 --- a/docker-compose.override.yml.dist +++ b/docker-compose.override.yml.dist @@ -6,18 +6,8 @@ services: ports: - "1081:1080" - "1026:1025" - healthcheck: - test: ["CMD", "wget", "-qO-", "http://localhost:1080"] - interval: 10s - timeout: 5s - retries: 5 adminer: image: adminer ports: - "8989:8080" - healthcheck: - test: ["CMD-SHELL", "curl --silent --fail http://127.0.0.1:8080/ || exit 1"] - interval: 10s - timeout: 30s - retries: 10 diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 8c33061..ececd2b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,5 +1,3 @@ -version: "3.4" - # Production environment override services: php: diff --git a/docker-compose.yml b/docker-compose.yml index 55b97de..416524a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.4" - services: php: build: @@ -89,7 +87,7 @@ services: redis: image: redis:7-alpine ports: - - '6389:6379' + - "6389:6379" healthcheck: test: ["CMD-SHELL", "redis-cli -h 127.0.0.1 ping | grep 'PONG' || exit 1"] interval: 10s diff --git a/docs/README.md b/docs/README.md index 63f0942..c2e1dd1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,16 +21,21 @@ Access `https://localhost` in your browser and accept the security risk. You should have access now to: -* Main project : https://localhost -* Meilisearch : http://localhost:7700/ +* The main frontend: https://localhost +* The Meilisearch UI: http://localhost:7700/ -To access the dev tools, run= +Note that you can also use the [online meilisearch-ui](https://meilisearch-ui.riccox.com). +Be careful it is not an official Meilisearch website, use only for dev data, do not +send cloud credentials. + +To access the dev tools, run: make start-dev You should have access now to: * Adminer : http://localhost:8989/?pgsql=database&username=app&db=app&ns=public&select=group +* Mailcatcher : http://localhost:1081/ * Maildev : http://localhost:1080 ## Makefile diff --git a/docs/configuration.md b/docs/configuration.md index 6459fcb..d658b06 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -4,7 +4,6 @@ This page documents the settings that can be configured as environment varibles for the production environment. Defaults value are shown in the [.env](../.env) file. - ## Application | name | default value | @@ -47,7 +46,7 @@ For example, to use a standart SMTP server use: Where mailer is the DSN of your SMTP server and 1025 the port to use. -Yo use Gmail with a secret key use: +To use Gmail with a secret key use: MAILER_DSN=gmail://email@example.com:secretkey@default @@ -58,14 +57,19 @@ Twilio, Sendgrid, Mailingblue... SMS_DSN=null://null -This is the main parameter to send DNS. If you leave `null://null`, nothing will -be send without errors. It can be useful when having issues with your SMS provider -and wanting to disable it temporarly. +This is the main parameter to send DNS. If you leave `null://null`, no SMS will +be sent. +It may be useful when having issues with your SMS provider and wanting to disable it temporarily. -For example, to use a service like Twilio, the parameters should look like: +Below are the supported value templates to use depending on your SMS provider. - SMS_DSN=twilio://AccountSID:AuthToken@default?from=%2BFROMNUMBER +### Brevo + SMS_DSN=brevo://API_KEY@default?sender=PHONE_NUMBER + +### Twilio + + SMS_DSN=twilio://AccountSID:AuthToken@default?from=PHONE_NUMBER ## Meilisearch diff --git a/fixtures/prod-boot/configuration.yaml b/fixtures/prod-boot/configuration.yaml index 4866531..e2facd2 100644 --- a/fixtures/prod-boot/configuration.yaml +++ b/fixtures/prod-boot/configuration.yaml @@ -4,8 +4,9 @@ App\Entity\Configuration: features (extends configuration_template): configuration: - services: - servicesEnabled: true + global: + globalServicesEnabled: true + globalPaidMembership: false notificationsSender: notificationsSenderEmail: info@example.com notificationsSenderName: Contact diff --git a/fixtures/test/configuration.yaml b/fixtures/test/configuration.yaml index 74fe9ee..6200b9b 100644 --- a/fixtures/test/configuration.yaml +++ b/fixtures/test/configuration.yaml @@ -4,8 +4,10 @@ App\Entity\Configuration: features (extends configuration_template): configuration: - services: - servicesEnabled: true + global: + globalName: Echanges de biens et de services + globalServicesEnabled: true + globalPaidMembership: false notificationsSender: notificationsSenderEmail: info@example.com notificationsSenderName: Contact diff --git a/fixtures/test/group_offer.yaml b/fixtures/test/group_offer.yaml index 723a1f4..d2881b3 100644 --- a/fixtures/test/group_offer.yaml +++ b/fixtures/test/group_offer.yaml @@ -4,11 +4,11 @@ App\Entity\GroupOffer: # Templates group_offer_group_1_template (template, extends group_offer_template): group: '@group_1' - type: !php/enum App\Enum\Group\GroupOfferType::YEARLY + type: !php/enum App\Enum\OfferType::YEARLY group_offer_group_7_template (template, extends group_offer_template): group: '@group_7' - type: !php/enum App\Enum\Group\GroupOfferType::YEARLY + type: !php/enum App\Enum\OfferType::YEARLY # Group 1 group_offer_group_1_10 (extends group_offer_group_1_template): diff --git a/fixtures/test/page.yaml b/fixtures/test/page.yaml index 54fd53f..117f596 100644 --- a/fixtures/test/page.yaml +++ b/fixtures/test/page.yaml @@ -68,7 +68,7 @@ App\Entity\Page:

 


Dépôt

-

Toutes les informations sur le projet et le code sont disponibles sur le dépôt public.

+

Toutes les informations sur le projet et le code sont disponibles sur le dépôt public.

 


Démo

diff --git a/fixtures/test/platform_offer.yaml b/fixtures/test/platform_offer.yaml new file mode 100644 index 0000000..d37d126 --- /dev/null +++ b/fixtures/test/platform_offer.yaml @@ -0,0 +1,14 @@ +App\Entity\PlatformOffer: + platform_offer_template (template): + configuration: '@features' + + platform_offer_1 (extends platform_offer_template): + id: + name: Lorem ipsum + price: 2000 + type: !php/enum App\Enum\OfferType::YEARLY + + platform_offer_2 (extends platform_offer_template): + name: Aliquet risus + price: 200 + type: !php/enum App\Enum\OfferType::MONTHLY diff --git a/fixtures/test/product.yaml b/fixtures/test/product.yaml index c1f6de9..083eb03 100644 --- a/fixtures/test/product.yaml +++ b/fixtures/test/product.yaml @@ -8,6 +8,7 @@ App\Entity\Product: service (template, extends product): type: !php/enum App\Enum\Product\ProductType::SERVICE + visibility: !php/enum App\Enum\Product\ProductVisibility::RESTRICTED # Loic ————————————————————————————————————————————————————————————————————— loic_object_1 (extends object): diff --git a/fixtures/test/user.yaml b/fixtures/test/user.yaml index 5fc4cc2..ea3b449 100644 --- a/fixtures/test/user.yaml +++ b/fixtures/test/user.yaml @@ -35,6 +35,10 @@ App\Entity\User: devAccount: true address: '@address_loic' avatar: '7c732ddb-9c13-45eb-aea0-e614f2340e6d.jpg' + membershipPaid: true + platformOffer: '@platform_offer_1' + startAt: + endAt: admin_kevin (extends admin_template): id: @@ -42,6 +46,12 @@ App\Entity\User: firstname: 'Kevin' lastname: 'Pirouet' avatar: '7c732ddb-9c13-45eb-aea0-e614f2340e6d.jpg' + type: !php/enum App\Enum\User\UserType::ADMIN + membershipPaid: true + platformOffer: '@platform_offer_1' + startAt: + endAt: + roles: [ !php/const App\Entity\User::ROLE_ADMIN, !php/const App\Entity\User::MEMBERSHIP_PAID] admin_apes (extends admin_template): id: diff --git a/helm/chart/templates/cronjob-fixture-reset.yaml b/helm/chart/templates/cronjob-fixture-reset.yaml index fa244e2..6566f30 100644 --- a/helm/chart/templates/cronjob-fixture-reset.yaml +++ b/helm/chart/templates/cronjob-fixture-reset.yaml @@ -1,3 +1,4 @@ +{{- if .Values.php.fixtureCron.enabled }} apiVersion: batch/v1 kind: CronJob metadata: @@ -6,6 +7,7 @@ metadata: {{- include "plateforme-ebs.labels" . | nindent 4 }} spec: schedule: '0 0 * * *' + timeZone: "Europe/Paris" jobTemplate: metadata: annotations: @@ -22,19 +24,20 @@ spec: serviceAccountName: {{ include "plateforme-ebs.serviceAccountName" . }} restartPolicy: Never containers: - - name: {{ .Chart.Name }}-cronjob-notify-ms-e-7 + - name: {{ .Chart.Name }}-cronjob-fixture-reset image: "{{ .Values.php.image.repository }}:{{ .Values.php.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.php.image.pullPolicy }} command: ['/bin/sh', '-c'] - args: [' - bin/console doctrine:database:drop --if-exists --force; - bin/console doctrine:database:create --if-not-exists; - bin/console doctrine:schema:create; - bin/console doctrine:schema:validate; - bin/console messenger:setup-transports; - bin/console hautelook:fixtures:load --no-interaction -vv --no-bundles; - bin/console app:index-products; - '] + args: [' + set -ex; + bin/console doctrine:database:drop --if-exists --force; + bin/console doctrine:database:create --if-not-exists; + bin/console doctrine:schema:create; + bin/console doctrine:schema:validate; + bin/console messenger:setup-transports; + bin/console hautelook:fixtures:load --no-interaction -vv --no-bundles; + bin/console app:index-products;' + ] env: - name: API_ENTRYPOINT_HOST valueFrom: diff --git a/helm/chart/templates/cronjobs/cronjobEndMembership.yaml b/helm/chart/templates/cronjobs/cronjobEndMembership.yaml index e94f215..0a604d7 100644 --- a/helm/chart/templates/cronjobs/cronjobEndMembership.yaml +++ b/helm/chart/templates/cronjobs/cronjobEndMembership.yaml @@ -7,6 +7,7 @@ metadata: {{- include "plateforme-ebs.labels" . | nindent 4 }} spec: schedule: '6 1 * * *' + timeZone: "Europe/Paris" jobTemplate: metadata: annotations: @@ -78,6 +79,23 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} - name: MERCURE_URL valueFrom: configMapKeyRef: @@ -93,6 +111,11 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn - name: STORAGE_BUCKET valueFrom: configMapKeyRef: diff --git a/helm/chart/templates/cronjobs/cronjobEndPlatformMembership.yaml b/helm/chart/templates/cronjobs/cronjobEndPlatformMembership.yaml new file mode 100644 index 0000000..b199f09 --- /dev/null +++ b/helm/chart/templates/cronjobs/cronjobEndPlatformMembership.yaml @@ -0,0 +1,171 @@ +{{- if .Values.dailyCronjobs.enabled }} +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ include "plateforme-ebs" . }}-cronjob-end-p-membership + labels: + {{- include "plateforme-ebs.labels" . | nindent 4 }} +spec: + schedule: '17 1 * * *' + timeZone: "Europe/Paris" + jobTemplate: + metadata: + annotations: + rollme: {{ randAlphaNum 5 | quote }} + labels: + {{- include "plateforme-ebs.selectorLabels" . | nindent 8 }} + spec: + template: + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 12 }} + {{- end }} + serviceAccountName: {{ include "plateforme-ebs.serviceAccountName" . }} + restartPolicy: Never + containers: + - name: {{ .Chart.Name }}-cronjob-end-p-membership + image: "{{ .Values.php.image.repository }}:{{ .Values.php.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.php.image.pullPolicy }} + command: ['/bin/sh', '-c'] + args: ['bin/console app:end-platform-membership --env=prod'] + env: + - name: API_ENTRYPOINT_HOST + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-host + - name: JWT_PASSPHRASE + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-passphrase + - name: JWT_PUBLIC_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-public-key + - name: JWT_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-secret-key + - name: TRUSTED_HOSTS + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-trusted-hosts + - name: TRUSTED_PROXIES + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-trusted-proxies + - name: APP_ENV + value: "prod" + - name: APP_DEBUG + value: "0" + - name: APP_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-app-secret + - name: CORS_ALLOW_ORIGIN + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-cors-allow-origin + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} + - name: MERCURE_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-url + - name: MERCURE_PUBLIC_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-public-url + - name: MERCURE_JWT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn + - name: STORAGE_BUCKET + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-bucket + - name: STORAGE_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-endpoint + - name: STORAGE_REGION + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-region + - name: STORAGE_USE_PATH_STYLE_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-use-path-style-endpoint + - name: STORAGE_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-key + - name: STORAGE_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-secret + lifecycle: + preStop: + exec: + command: ["/bin/sh", "-c", "/bin/sleep 1; kill -QUIT 1"] + startupProbe: + exec: + command: + - docker-healthcheck + failureThreshold: 40 + periodSeconds: 3 + readinessProbe: + exec: + command: + - docker-healthcheck + periodSeconds: 3 + livenessProbe: + exec: + command: + - docker-healthcheck + periodSeconds: 3 + resources: + {{- toYaml .Values.resources.fixtures | nindent 16 }} +{{- end }} diff --git a/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration1.yaml b/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration1.yaml index e7324b0..4c62f61 100644 --- a/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration1.yaml +++ b/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration1.yaml @@ -7,6 +7,7 @@ metadata: {{- include "plateforme-ebs.labels" . | nindent 4 }} spec: schedule: '12 2 * * *' + timeZone: "Europe/Paris" jobTemplate: metadata: annotations: @@ -78,6 +79,23 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} - name: MERCURE_URL valueFrom: configMapKeyRef: @@ -93,6 +111,11 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn - name: STORAGE_BUCKET valueFrom: configMapKeyRef: diff --git a/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration7.yaml b/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration7.yaml index 44f2f0e..a1958ff 100644 --- a/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration7.yaml +++ b/helm/chart/templates/cronjobs/cronjobNotifyMembershipExpiration7.yaml @@ -7,6 +7,7 @@ metadata: {{- include "plateforme-ebs.labels" . | nindent 4 }} spec: schedule: '3 21 * * *' + timeZone: "Europe/Paris" jobTemplate: metadata: annotations: @@ -78,6 +79,23 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} - name: MERCURE_URL valueFrom: configMapKeyRef: @@ -93,6 +111,11 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn - name: STORAGE_BUCKET valueFrom: configMapKeyRef: diff --git a/helm/chart/templates/cronjobs/cronjobNotifyPlatformMembershipExpiration1.yaml b/helm/chart/templates/cronjobs/cronjobNotifyPlatformMembershipExpiration1.yaml new file mode 100644 index 0000000..ad8e192 --- /dev/null +++ b/helm/chart/templates/cronjobs/cronjobNotifyPlatformMembershipExpiration1.yaml @@ -0,0 +1,171 @@ +{{- if .Values.dailyCronjobs.enabled }} +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ include "plateforme-ebs" . }}-cronjob-notify-pms-e-1 + labels: + {{- include "plateforme-ebs.labels" . | nindent 4 }} +spec: + schedule: '20 2 * * *' + timeZone: "Europe/Paris" + jobTemplate: + metadata: + annotations: + rollme: {{ randAlphaNum 5 | quote }} + labels: + {{- include "plateforme-ebs.selectorLabels" . | nindent 8 }} + spec: + template: + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 12 }} + {{- end }} + serviceAccountName: {{ include "plateforme-ebs.serviceAccountName" . }} + restartPolicy: Never + containers: + - name: {{ .Chart.Name }}-cronjob-notify-pms-e-1 + image: "{{ .Values.php.image.repository }}:{{ .Values.php.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.php.image.pullPolicy }} + command: ['/bin/sh', '-c'] + args: ['bin/console app:notify-platform-membership-expiration 1 --env=prod'] + env: + - name: API_ENTRYPOINT_HOST + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-host + - name: JWT_PASSPHRASE + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-passphrase + - name: JWT_PUBLIC_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-public-key + - name: JWT_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-secret-key + - name: TRUSTED_HOSTS + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-trusted-hosts + - name: TRUSTED_PROXIES + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-trusted-proxies + - name: APP_ENV + value: "prod" + - name: APP_DEBUG + value: "0" + - name: APP_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-app-secret + - name: CORS_ALLOW_ORIGIN + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-cors-allow-origin + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} + - name: MERCURE_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-url + - name: MERCURE_PUBLIC_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-public-url + - name: MERCURE_JWT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn + - name: STORAGE_BUCKET + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-bucket + - name: STORAGE_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-endpoint + - name: STORAGE_REGION + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-region + - name: STORAGE_USE_PATH_STYLE_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-use-path-style-endpoint + - name: STORAGE_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-key + - name: STORAGE_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-secret + lifecycle: + preStop: + exec: + command: ["/bin/sh", "-c", "/bin/sleep 1; kill -QUIT 1"] + startupProbe: + exec: + command: + - docker-healthcheck + failureThreshold: 40 + periodSeconds: 3 + readinessProbe: + exec: + command: + - docker-healthcheck + periodSeconds: 3 + livenessProbe: + exec: + command: + - docker-healthcheck + periodSeconds: 3 + resources: + {{- toYaml .Values.resources.fixtures | nindent 16 }} +{{- end }} diff --git a/helm/chart/templates/cronjobs/cronjobNotifyPlatformMembershipExpiration7.yaml b/helm/chart/templates/cronjobs/cronjobNotifyPlatformMembershipExpiration7.yaml new file mode 100644 index 0000000..1e2787b --- /dev/null +++ b/helm/chart/templates/cronjobs/cronjobNotifyPlatformMembershipExpiration7.yaml @@ -0,0 +1,171 @@ +{{- if .Values.dailyCronjobs.enabled }} +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ include "plateforme-ebs" . }}-cronjob-notify-pms-e-7 + labels: + {{- include "plateforme-ebs.labels" . | nindent 4 }} +spec: + schedule: '10 21 * * *' + timeZone: "Europe/Paris" + jobTemplate: + metadata: + annotations: + rollme: {{ randAlphaNum 5 | quote }} + labels: + {{- include "plateforme-ebs.selectorLabels" . | nindent 8 }} + spec: + template: + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 12 }} + {{- end }} + serviceAccountName: {{ include "plateforme-ebs.serviceAccountName" . }} + restartPolicy: Never + containers: + - name: {{ .Chart.Name }}-cronjob-notify-pms-e-7 + image: "{{ .Values.php.image.repository }}:{{ .Values.php.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.php.image.pullPolicy }} + command: ['/bin/sh', '-c'] + args: ['bin/console app:notify-platform-membership-expiration 7 --env=prod'] + env: + - name: API_ENTRYPOINT_HOST + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-host + - name: JWT_PASSPHRASE + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-passphrase + - name: JWT_PUBLIC_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-public-key + - name: JWT_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-jwt-secret-key + - name: TRUSTED_HOSTS + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-trusted-hosts + - name: TRUSTED_PROXIES + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-trusted-proxies + - name: APP_ENV + value: "prod" + - name: APP_DEBUG + value: "0" + - name: APP_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-app-secret + - name: CORS_ALLOW_ORIGIN + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-cors-allow-origin + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} + - name: MERCURE_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-url + - name: MERCURE_PUBLIC_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-public-url + - name: MERCURE_JWT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn + - name: STORAGE_BUCKET + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-bucket + - name: STORAGE_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-endpoint + - name: STORAGE_REGION + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-region + - name: STORAGE_USE_PATH_STYLE_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-use-path-style-endpoint + - name: STORAGE_KEY + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-key + - name: STORAGE_SECRET + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: php-storage-secret + lifecycle: + preStop: + exec: + command: ["/bin/sh", "-c", "/bin/sleep 1; kill -QUIT 1"] + startupProbe: + exec: + command: + - docker-healthcheck + failureThreshold: 40 + periodSeconds: 3 + readinessProbe: + exec: + command: + - docker-healthcheck + periodSeconds: 3 + livenessProbe: + exec: + command: + - docker-healthcheck + periodSeconds: 3 + resources: + {{- toYaml .Values.resources.fixtures | nindent 16 }} +{{- end }} diff --git a/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesEnd.yaml b/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesEnd.yaml index 19079e9..d0ae489 100644 --- a/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesEnd.yaml +++ b/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesEnd.yaml @@ -7,6 +7,7 @@ metadata: {{- include "plateforme-ebs.labels" . | nindent 4 }} spec: schedule: '44 4 * * *' + timeZone: "Europe/Paris" jobTemplate: metadata: annotations: @@ -78,6 +79,23 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} - name: MERCURE_URL valueFrom: configMapKeyRef: @@ -93,6 +111,11 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn - name: STORAGE_BUCKET valueFrom: configMapKeyRef: diff --git a/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesStart.yaml b/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesStart.yaml index 8b434c1..316aacb 100644 --- a/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesStart.yaml +++ b/helm/chart/templates/cronjobs/cronjobNotifyServiceRequestDatesStart.yaml @@ -7,6 +7,7 @@ metadata: {{- include "plateforme-ebs.labels" . | nindent 4 }} spec: schedule: '2 4 * * *' + timeZone: "Europe/Paris" jobTemplate: metadata: annotations: @@ -78,6 +79,23 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: database-url + - name: MAILER_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: mailer-dsn + {{- if .Values.meilisearch.enabled }} + - name: MEILISEARCH_API_KEY + valueFrom: + secretKeyRef: + name: {{ printf "%s-%s" (include "meilisearch.fullname" .Subcharts.meilisearch ) "master-key" }} + key: MEILI_MASTER_KEY + - name: MEILISEARCH_URL + valueFrom: + configMapKeyRef: + name: {{ include "plateforme-ebs" . }} + key: meilisearch-url + {{- end }} - name: MERCURE_URL valueFrom: configMapKeyRef: @@ -93,6 +111,11 @@ spec: secretKeyRef: name: {{ include "plateforme-ebs" . }} key: mercure-jwt-secret + - name: SMS_DSN + valueFrom: + secretKeyRef: + name: {{ include "plateforme-ebs" . }} + key: sms-dsn - name: STORAGE_BUCKET valueFrom: configMapKeyRef: diff --git a/helm/chart/templates/fixtures-job.yaml b/helm/chart/templates/fixtures-job.yaml index 45f9245..09eca03 100644 --- a/helm/chart/templates/fixtures-job.yaml +++ b/helm/chart/templates/fixtures-job.yaml @@ -1,3 +1,4 @@ +{{- if .Values.php.fixtureJob.enabled -}} apiVersion: batch/v1 kind: Job metadata: @@ -32,18 +33,14 @@ spec: command: ['/bin/sh', '-c'] args: [' set -ex; - echo no fixtures job at the moment + bin/console doctrine:database:drop --if-exists --force; + bin/console doctrine:database:create --if-not-exists; + bin/console doctrine:schema:create; + bin/console doctrine:schema:validate; + bin/console messenger:setup-transports; + bin/console hautelook:fixtures:load --no-interaction -vv --no-bundles; + bin/console app:index-products; '] - # if [ "$APP_ENV" != "prod" ]; then - # composer install --prefer-dist --no-progress --no-suggest --no-interaction; - # fi; - # bin/console doctrine:database:drop --if-exists --force; - # bin/console doctrine:database:create --if-not-exists; - # bin/console doctrine:schema:create; - # bin/console doctrine:schema:validate; - # bin/console messenger:setup-transports; - # bin/console hautelook:fixtures:load --no-interaction -vv --no-bundles; - # bin/console app:index-products; env: - name: API_ENTRYPOINT_HOST valueFrom: @@ -208,3 +205,4 @@ spec: tolerations: {{- toYaml . | nindent 8 }} {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/chart/values-nonprod.yml b/helm/chart/values-nonprod.yml new file mode 100644 index 0000000..b38ec60 --- /dev/null +++ b/helm/chart/values-nonprod.yml @@ -0,0 +1,38 @@ +imagePullSecrets: + - name: regcred + +ingress: + className: nginx + annotations: + cert-manager.io/cluster-issuer: letsencrypt-production + hosts: + - host: toset + paths: + - path: / + pathType: Prefix + tls: + - secretName: toset + hosts: + - toset + +meilisearch: + persistence: + enabled: true + storageClass: "standard" + size: "1Gi" + +redis: + master: + persistence: + enabled: true + storageClass: "standard" + size: "1Gi" + +postgresql: + url: change_me + +php: + fixtureJob: + enabled: true + fixtureCron: + enabled: true \ No newline at end of file diff --git a/helm/chart/values-prod.yml b/helm/chart/values-prod.yml index 35498ed..c644cc5 100644 --- a/helm/chart/values-prod.yml +++ b/helm/chart/values-prod.yml @@ -29,4 +29,10 @@ redis: size: "1Gi" postgresql: - enabled: false \ No newline at end of file + url: change_me + +php: + fixtureJob: + enabled: true + fixtureCron: + enabled: true diff --git a/helm/chart/values.yaml b/helm/chart/values.yaml index d9a56fe..5eee356 100644 --- a/helm/chart/values.yaml +++ b/helm/chart/values.yaml @@ -30,6 +30,13 @@ php: usePathStyleEndpoint: true publicKey: "" secret: "" + fixtureCron: + enabled: false + fixtureJob: + enabled: false + +dailyCronjobs: + enabled: true maildev: enabled: false @@ -41,9 +48,6 @@ mailer: sms: dsn: "null://null" -dailyCronjobs: - enabled: true - consumer: # We don't use async for now so consumer isn't needed enabled: false @@ -73,6 +77,7 @@ postgresql: username: "example" password: "!ChangeMe!" database: "api" + postgresPassword: "!ChangeMe!" # Persistent Volume Storage configuration. # ref: https://kubernetes.io/docs/user-guide/persistent-volumes pullPolicy: IfNotPresent diff --git a/src/Command/EndMembershipCommand.php b/src/Command/EndMembershipCommand.php index f75e1e4..8defef3 100644 --- a/src/Command/EndMembershipCommand.php +++ b/src/Command/EndMembershipCommand.php @@ -69,7 +69,7 @@ final class EndMembershipCommand extends Command /** @var UserGroup $userGroup */ $user = $userGroup->getUser(); $group = $userGroup->getGroup(); - $io->comment(sprintf(' > deleting membership for %s of %s (%s) (%s)', + $io->comment(\sprintf(' > deleting membership for %s of %s (%s) (%s)', $group->getName(), $user->getDisplayName(), $userGroup->getMembership()->value, @@ -88,7 +88,7 @@ final class EndMembershipCommand extends Command ++$count; } - $io->note(sprintf(' > %d deletion(s) done.', $count)); + $io->note(\sprintf(' > %d deletion(s) done.', $count)); $this->memoryReport($io); $this->done($io); diff --git a/src/Command/EndPlatformMembershipCommand.php b/src/Command/EndPlatformMembershipCommand.php new file mode 100644 index 0000000..580c0c7 --- /dev/null +++ b/src/Command/EndPlatformMembershipCommand.php @@ -0,0 +1,102 @@ +configureCommand(self::DESCRIPTION); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $configuration = $this->configurationRepository->getInstanceConfigurationOrCreate(); + if (!$configuration->getPaidMembership()) { + return Command::SUCCESS; + } + $platform = $configuration->getPlatformName(); + $io->title(self::DESCRIPTION.' ('.$this->environment.' env)'); + $this->memoryReport($io); + + $io->section('Getting concerned membership...'); + $query = $this->userRepository->getExpiredMembership(); + + $io->section('Processing user updates...'); + $count = 0; + /** @var User $user */ + foreach ($query->toIterable() as $user) { + if ($user->getPlatformOffer()?->getType() === OfferType::ONESHOT) { + continue; + } + + $io->comment(\sprintf(' > ending platform membership expiration for user %s (%s)', + $user->getDisplayName(), + $user->getEmail(), + )); + + // save it here for the mail before setting it back to null + $endAt = $user->getEndAt(); + + $user->setMembershipPaid(false) + ->setEndAt(null) + ->setPayedAt(null) + ->setStartAt(null) + ->setPlatformOffer(null); + + $this->userManager->save($user, true); + + $this->appMailer->send(EndPlatformMembershipMail::class, compact('user', 'platform', 'endAt')); + $this->sendSms($user, EndPlatformMembershipMail::class, ['%platform%' => $platform]); + ++$count; + } + + $io->note(\sprintf(' > %d update(s) done.', $count)); + $this->memoryReport($io); + $this->done($io); + + return Command::SUCCESS; + } +} diff --git a/src/Command/NotifyMembershipExpirationCommand.php b/src/Command/NotifyMembershipExpirationCommand.php index 64a495b..be8a24b 100644 --- a/src/Command/NotifyMembershipExpirationCommand.php +++ b/src/Command/NotifyMembershipExpirationCommand.php @@ -64,7 +64,7 @@ final class NotifyMembershipExpirationCommand extends Command $days = $input->getArgument('days'); $days = max(1, (int) $days); - $io->section(sprintf('Getting membership expiring in %d days...', $days)); + $io->section(\sprintf('Getting membership expiring in %d days...', $days)); $query = $this->userGroupRepository->getExpiring($days); $io->section('Sending notificaitons...'); $count = 0; @@ -72,7 +72,7 @@ final class NotifyMembershipExpirationCommand extends Command /** @var UserGroup $userGroup */ $user = $userGroup->getUser(); $group = $userGroup->getGroup(); - $io->comment(sprintf(' > notifying membership for %s of %s/%s (%s) (%s)', + $io->comment(\sprintf(' > notifying membership for %s of %s/%s (%s) (%s)', $group->getName(), $user->getDisplayName(), $userGroup->getEndAt()?->format('Y-m-d'), @@ -88,7 +88,7 @@ final class NotifyMembershipExpirationCommand extends Command ++$count; } - $io->note(sprintf(' > %d notification(s) sent.', $count)); + $io->note(\sprintf(' > %d notification(s) sent.', $count)); $this->memoryReport($io); $this->done($io); diff --git a/src/Command/NotifyPlatformMembershipExpirationCommand.php b/src/Command/NotifyPlatformMembershipExpirationCommand.php new file mode 100644 index 0000000..f4af551 --- /dev/null +++ b/src/Command/NotifyPlatformMembershipExpirationCommand.php @@ -0,0 +1,95 @@ +configureCommand(self::DESCRIPTION); + $this->addArgument('days', InputArgument::REQUIRED, 'Number of days from tomorrow (1 = notify members expiring tomorrow)'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $configuration = $this->configurationRepository->getInstanceConfigurationOrCreate(); + if (!$configuration->getPaidMembership()) { + return Command::SUCCESS; + } + $platform = $configuration->getPlatformName(); + $io->title(self::DESCRIPTION.' ('.$this->environment.' env)'); + $this->memoryReport($io); + + /** @var string $days */ + $days = $input->getArgument('days'); + $days = max(1, (int) $days); + + $io->section(\sprintf('Getting platform membership expiring in %d days...', $days)); + $query = $this->userRepository->getExpiring($days); + $io->section('Sending notifications...'); + $count = 0; + /** @var User $user */ + foreach ($query->toIterable() as $user) { + if ($user->getPlatformOffer()?->getType() === OfferType::ONESHOT) { + continue; + } + + $io->comment(\sprintf(' > notifying platform membership expiration for user %s (%s)', + $user->getDisplayName(), + $user->getEmail(), + )); + + $this->appMailer->send(NotifyPlatformMembershipExpirationMail::class, compact('user', 'days', 'platform')); + $this->sendSms($user, NotifyPlatformMembershipExpirationMail::class, ['%days%' => $days, '%platform%' => $platform]); + ++$count; + } + + $io->note(\sprintf(' > %d notification(s) sent.', $count)); + + $this->memoryReport($io); + $this->done($io); + + return Command::SUCCESS; + } +} diff --git a/src/Command/NotifyServiceRequestDatesCommand.php b/src/Command/NotifyServiceRequestDatesCommand.php index bde2db3..87693be 100644 --- a/src/Command/NotifyServiceRequestDatesCommand.php +++ b/src/Command/NotifyServiceRequestDatesCommand.php @@ -84,7 +84,7 @@ final class NotifyServiceRequestDatesCommand extends Command $serviceRequest->getStartAt() : $serviceRequest->getEndAt() ; - $io->comment(sprintf(' > notifying owner and recipient for service request %s (%s) starting on %s.', + $io->comment(\sprintf(' > notifying owner and recipient for service request %s (%s) starting on %s.', $serviceRequest->getId(), $serviceRequest->getStatus()->value, $referenceDate->format('Y-m-d') @@ -106,7 +106,7 @@ final class NotifyServiceRequestDatesCommand extends Command ++$count; } - $io->note(sprintf(' > %d notification(s) sent.', $count * 2)); // owner and recipient + $io->note(\sprintf(' > %d notification(s) sent.', $count * 2)); // owner and recipient $this->memoryReport($io); $this->done($io); diff --git a/src/Controller/Admin/AbstractCategoryCrudController.php b/src/Controller/Admin/AbstractCategoryCrudController.php index 026929d..73deb62 100644 --- a/src/Controller/Admin/AbstractCategoryCrudController.php +++ b/src/Controller/Admin/AbstractCategoryCrudController.php @@ -245,7 +245,7 @@ abstract class AbstractCategoryCrudController extends AbstractCrudController imp $idField, $createdAt, $updatedAt, - ]; + ]; } public function moveUp(AdminContext $context): Response diff --git a/src/Controller/Admin/AbstractProductCrudController.php b/src/Controller/Admin/AbstractProductCrudController.php index 5f0f351..9e0ac39 100755 --- a/src/Controller/Admin/AbstractProductCrudController.php +++ b/src/Controller/Admin/AbstractProductCrudController.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Controller\Admin; +use App\Controller\i18nTrait; use App\EasyAdmin\Field\FieldTrait; use App\EasyAdmin\Filter\EnumFilter; use App\EasyAdmin\Filter\UuidFilter; @@ -15,8 +16,10 @@ use App\Enum\Product\ProductType; use App\Enum\Product\ProductVisibility; use App\Flysystem\EasyAdminHelper; use App\Flysystem\MediaManager; +use App\Form\Type\Product\AbstractProductFormType; use App\Helper\CsvExporter; use App\Repository\CategoryRepository; +use App\Repository\GroupRepository; use App\Repository\ProductRepository; use Doctrine\ORM\QueryBuilder; use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection; @@ -54,6 +57,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; abstract class AbstractProductCrudController extends AbstractCrudController implements AdminSecuredCrudControllerInterface { use FieldTrait; + use i18nTrait; abstract public function getProductType(): ProductType; @@ -74,6 +78,7 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl private readonly TranslatorInterface $translator, private readonly FilterFactory $filterFactory, private readonly SluggerInterface $slugger, + protected readonly GroupRepository $groupRepository, ) { } @@ -88,6 +93,9 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl '@EasyAdmin/crud/form_theme.html.twig', 'easy_admin/crud/form_theme.html.twig', ]) + ->setFormOptions([ + 'validation_groups' => [AbstractProductFormType::class], + ]) ; } @@ -241,9 +249,15 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl ->setFormType(EnumType::class) ->setFormTypeOption('class', ProductVisibility::class) ->setChoices(ProductVisibility::getAsArray()); - $groupsField = CollectionField::new('groups'); + $groupsField = AssociationField::new('groups')->onlyOnForms(); + $groupsFieldList = CollectionField::new('groups')->hideOnForm(); - $ownerField = AssociationField::new('owner'); + $ownerField = AssociationField::new('owner') + ->setFormTypeOption('attr', [ + 'data-controller' => 'admin-parentgroup', + 'data-admin-parentgroup-target' => 'ownerField', + ]) + ->addWebpackEncoreEntries('admin'); $categoryField = AssociationField::new('category') ->setQueryBuilder(function (QueryBuilder $queryBuilder) { return $this->categoryRepository->addTypeFilter($queryBuilder, $this->getProductType()); @@ -300,6 +314,7 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl 'statusField', 'visibilityField', 'groupsField', + 'groupsFieldList', 'ownerField', 'categoryField', 'nameField', diff --git a/src/Controller/Admin/AbstractUserCrudController.php b/src/Controller/Admin/AbstractUserCrudController.php index 1943880..4fa5f6e 100755 --- a/src/Controller/Admin/AbstractUserCrudController.php +++ b/src/Controller/Admin/AbstractUserCrudController.php @@ -17,6 +17,7 @@ use App\Flysystem\MediaManager; use App\Helper\CsvExporter; use App\Mailer\AppMailer; use App\Mailer\Email\Admin\PromoteToAdmin\PromoteToAdminEmail; +use App\Repository\ConfigurationRepository; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\QueryBuilder; use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection; @@ -37,10 +38,12 @@ use EasyCorp\Bundle\EasyAdminBundle\Factory\FormFactory; use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; +use EasyCorp\Bundle\EasyAdminBundle\Field\DateField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField; use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField; use EasyCorp\Bundle\EasyAdminBundle\Field\IdField; use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField; +use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; use EasyCorp\Bundle\EasyAdminBundle\Filter\DateTimeFilter; @@ -89,6 +92,7 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme #[Autowire('%user_base_path%')] private readonly string $userBasePath, AppMailer $mailer, + private readonly ConfigurationRepository $configurationRepository, ) { $this->mailer = $mailer; } @@ -355,6 +359,20 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme $vacationModeField = BooleanField::new('vacationMode'); $addressField = AssociationField::new('address'); $groupsCountField = AssociationField::new('userGroups')->setLabel('Groups number'); + $membershipPaidField = $this->getSimpleBooleanField('membershipPaid'); + $startAt = DateField::new('startAt'); + $endAt = DateField::new('endAt'); + $expiresInField = IntegerField::new('expiresIn') + ->formatValue(function ($value) { + return $value !== null ? $this->translator->trans($this->getI18nPrefix().'.expires_in.formatted_value', ['%days%' => $value], 'admin') : ''; + }) + ->setFormTypeOptions([ + 'attr' => ['readonly' => 'readonly'], + 'required' => false, + ]) + ; + $payedAt = DateTimeField::new('payedAt'); + $offerField = AssociationField::new('platformOffer'); return compact( 'idField', @@ -378,6 +396,12 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme 'vacationModeField', 'addressField', 'groupsCountField', + 'membershipPaidField', + 'startAt', + 'endAt', + 'expiresInField', + 'payedAt', + 'offerField', ); } @@ -445,4 +469,9 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme return $builder; } + + public function platformRequiresGlobalPayment(): bool + { + return $this->configurationRepository->getInstanceConfigurationOrCreate()->getPaidMembership(); + } } diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index 36db687..b360ac9 100755 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -22,15 +22,18 @@ use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard; use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController; use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator; -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Contracts\Translation\TranslatorInterface; /** * All /admin routes are protected at the security.yaml level. + * ROLE_ADMIN inherits the ROLE_GROUP_ADMIN role. + * + * @see security.yaml */ -#[Security("is_granted('".User::ROLE_ADMIN."') or is_granted('".User::ROLE_GROUP_ADMIN."')")] +#[IsGranted(User::ROLE_GROUP_ADMIN)] final class DashboardController extends AbstractDashboardController { public const DOMAIN = 'admin'; @@ -60,7 +63,7 @@ final class DashboardController extends AbstractDashboardController private readonly AdminUrlGenerator $adminUrlGenerator, private readonly AuthorizationChecker $authorizationChecker, private readonly UserRepository $userRepository, - private readonly ServiceRequestRepository $requestRepository + private readonly ServiceRequestRepository $requestRepository, ) { } @@ -159,8 +162,8 @@ final class DashboardController extends AbstractDashboardController yield MenuItem::linkToCrud('menu.pages', 'fas fa-hat-wizard', Page::class)->setPermission(User::ROLE_ADMIN); yield MenuItem::subMenu('menu.categories', 'fa-solid fa-folder')->setSubItems([ - MenuItem::linkToUrl('menu.objects', 'fa-solid fa-box', $categoryObjectUrl)->setPermission(User::ROLE_ADMIN), - MenuItem::linkToUrl('menu.services', 'fa-regular fa-handshake', $categoryServiceUrl)->setPermission(User::ROLE_ADMIN), + MenuItem::linkToUrl('menu.objects', 'fa-solid fa-box', $categoryObjectUrl)->setPermission(User::ROLE_ADMIN), + MenuItem::linkToUrl('menu.services', 'fa-regular fa-handshake', $categoryServiceUrl)->setPermission(User::ROLE_ADMIN), ])->setPermission(User::ROLE_ADMIN); // ————————————————————————————————————————————————————————————————————— diff --git a/src/Controller/Admin/GroupCrudController.php b/src/Controller/Admin/GroupCrudController.php index fb42db0..5759a27 100755 --- a/src/Controller/Admin/GroupCrudController.php +++ b/src/Controller/Admin/GroupCrudController.php @@ -19,6 +19,7 @@ use App\Form\Type\Security\GroupInvitationFormType; use App\Helper\CsvExporter; use App\Message\Command\Group\CreateGroupInvitationMessage; use App\MessageBus\CommandBus; +use App\Repository\ConfigurationRepository; use App\Security\Checker\AuthorizationChecker; use Doctrine\ORM\QueryBuilder; use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection; @@ -66,6 +67,7 @@ final class GroupCrudController extends AbstractCrudController implements GroupA private readonly TranslatorInterface $translator, private readonly FilterFactory $filterFactory, private readonly SluggerInterface $slugger, + private readonly ConfigurationRepository $configurationRepository, ) { } @@ -75,6 +77,7 @@ final class GroupCrudController extends AbstractCrudController implements GroupA ->setEntityLabelInPlural('groups') ->setSearchFields(['name', 'description']) ->setDefaultSort(['id' => 'ASC']) + ->overrideTemplate('crud/field/boolean', 'admin/field/services_enabled.html.twig') ; } @@ -209,7 +212,7 @@ final class GroupCrudController extends AbstractCrudController implements GroupA /** @var User $user */ $user = $this->getUser(); - $qb->andWhere(sprintf('%s.id IN (:groups)', $qb->getRootAliases()[0] ?? '')) + $qb->andWhere(\sprintf('%s.id IN (:groups)', $qb->getRootAliases()[0] ?? '')) ->setParameter(':groups', $user->getMyGroupsAsAdmin()); return $qb; @@ -230,8 +233,24 @@ final class GroupCrudController extends AbstractCrudController implements GroupA ->setFormTypeOption('class', GroupMembership::class) ->setChoices(GroupMembership::getAsArray()); + if ($this->configurationRepository->getInstanceConfigurationOrCreate()->getServicesEnabled()) { + $servicesEnabledField = BooleanField::new('servicesEnabled') + ->renderAsSwitch() + ->setFormTypeOption('attr', [ + 'data-controller' => 'admin-parentgroup', + 'data-admin-parentgroup-target' => 'servicesEnabledField', + ]) + ->addWebpackEncoreEntries('admin'); + } + $parentField = AssociationField::new('parent') - ->setRequired(false); + ->setRequired(false) + ->addWebpackEncoreEntries('admin') + ->setFormTypeOption('attr', [ + 'data-controller' => 'admin-parentgroup', + 'data-admin-parentgroup-target' => 'parentField', + ]) + ; $childrenField = AssociationField::new('children'); $usersField = AssociationField::new('userGroups') ->setTemplatePath('admin/group/user_groups_field.html.twig'); @@ -247,14 +266,20 @@ final class GroupCrudController extends AbstractCrudController implements GroupA $panels = $this->getPanels(); if ($pageName === Crud::PAGE_INDEX) { - return [$nameField, $typeField, $parentField, $membershipField, $usersField, $createdAt, $updatedAt]; + $fields = [$nameField, $typeField, $parentField, $membershipField, $usersField, $createdAt, $updatedAt]; + + if ($this->configurationRepository->getInstanceConfigurationOrCreate()->getServicesEnabled()) { + array_splice($fields, 3, 0, [$servicesEnabledField]); + } + + return $fields; } if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) { $typeField->setChoices(GroupType::cases()); $membershipField->setChoices(GroupMembership::cases()); - return [ + $fields = [ $nameField, $typeField, $membershipField, @@ -264,11 +289,29 @@ final class GroupCrudController extends AbstractCrudController implements GroupA $invitationByAdminField, $membershipField, ]; + + if ($this->configurationRepository->getInstanceConfigurationOrCreate()->getServicesEnabled()) { + $i18prefix = $this->getI18nPrefix(self::class); + /** @var Group|null $group */ + $group = $this->getContext()?->getEntity()?->getInstance(); + if (null !== $group) { + foreach ($group->getParentsRecursively() as $parent) { + if (!$parent->getServicesEnabled()) { + $servicesEnabledField->setDisabled(); + $servicesEnabledField->setHelp($i18prefix.'.field.services_enabled.parent_disabled'); + break; + } + } + } + array_splice($fields, 4, 0, [$servicesEnabledField]); + } + + return $fields; } // show - return [ + $fields = [ $panels['information'], $nameField, $parentField, @@ -283,6 +326,12 @@ final class GroupCrudController extends AbstractCrudController implements GroupA $updatedAt, $createdAt, ]; + + if ($this->configurationRepository->getInstanceConfigurationOrCreate()->getServicesEnabled()) { + array_splice($fields, 3, 0, [$servicesEnabledField]); + } + + return $fields; } /** @@ -309,7 +358,7 @@ final class GroupCrudController extends AbstractCrudController implements GroupA } /** - * For now we export exactly what we see in the list to avoid seurity problems. + * For now we export exactly what we see in the list to avoid security problems. */ public function export(AdminContext $context): Response { diff --git a/src/Controller/Admin/GroupOfferCrudController.php b/src/Controller/Admin/GroupOfferCrudController.php index 1597cca..3e9c808 100755 --- a/src/Controller/Admin/GroupOfferCrudController.php +++ b/src/Controller/Admin/GroupOfferCrudController.php @@ -10,12 +10,12 @@ use App\EasyAdmin\Field\FieldTrait; use App\EasyAdmin\Filter\EnumFilter; use App\EasyAdmin\Filter\UserGroup\MyGroupFilter; use App\EasyAdmin\Filter\UuidFilter; -use App\EasyAdmin\Form\Type\GroupOfferTypeType; +use App\EasyAdmin\Form\Type\OfferTypeType; use App\Entity\GroupOffer; use App\Entity\User; use App\Enum\Group\GroupMembership; -use App\Enum\Group\GroupOfferType; use App\Enum\Group\UserMembership; +use App\Enum\OfferType; use App\Security\Checker\AuthorizationChecker; use Doctrine\ORM\QueryBuilder; use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection; @@ -65,7 +65,7 @@ final class GroupOfferCrudController extends AbstractCrudController implements G return $filters ->add(UuidFilter::new('id')) ->add(MyGroupFilter::new('group')) - ->add(EnumFilter::new('membership', GroupOfferTypeType::class)) + ->add(EnumFilter::new('membership', OfferTypeType::class)) ->add('name') ->add('active') ; @@ -98,7 +98,7 @@ final class GroupOfferCrudController extends AbstractCrudController implements G /** @var User $user */ $user = $this->getUser(); - $qb->andWhere(sprintf('%s.group IN (:groups)', $qb->getRootAliases()[0] ?? '')) + $qb->andWhere(\sprintf('%s.group IN (:groups)', $qb->getRootAliases()[0] ?? '')) ->setParameter(':groups', $user->getMyGroupsAsAdmin()); return $qb; @@ -129,8 +129,8 @@ final class GroupOfferCrudController extends AbstractCrudController implements G $nameField = TextField::new('name'); $typeField = ChoiceField::new('type') ->setFormType(EnumType::class) - ->setFormTypeOption('class', GroupOfferType::class) - ->setChoices(GroupOfferType::getAsArray()); + ->setFormTypeOption('class', OfferType::class) + ->setChoices(OfferType::getAsArray()); $priceField = MoneyField::new('price') ->setCurrencyPropertyPath('currency') @@ -149,7 +149,7 @@ final class GroupOfferCrudController extends AbstractCrudController implements G } if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) { - $typeField->setChoices(GroupOfferType::cases()); + $typeField->setChoices(OfferType::cases()); return [ $groupField, diff --git a/src/Controller/Admin/PlatformOfferCrudController.php b/src/Controller/Admin/PlatformOfferCrudController.php new file mode 100644 index 0000000..5a599b5 --- /dev/null +++ b/src/Controller/Admin/PlatformOfferCrudController.php @@ -0,0 +1,121 @@ +setEntityLabelInPlural('platform_offers') + ->setSearchFields(['name']) + ; + } + + public function configureFilters(Filters $filters): Filters + { + return $filters + ->add(UuidFilter::new('id')) + ->add(EnumFilter::new('type', OfferTypeType::class)) + ->add('name') + ->add('active') + ; + } + + public function configureActions(Actions $actions): Actions + { + return $actions + ->add(Crud::PAGE_INDEX, Action::DETAIL) + ->add(Crud::PAGE_EDIT, Action::DETAIL) + ->add(Crud::PAGE_EDIT, Action::INDEX) + ; + } + + public static function getEntityFqcn(): string + { + return PlatformOffer::class; + } + + public function configureFields(string $pageName): iterable + { + $idField = IdField::new('id') + ->setLabel('id') + ->hideOnForm(); + + $nameField = TextField::new('name'); + $typeField = ChoiceField::new('type') + ->setFormType(EnumType::class) + ->setFormTypeOption('class', OfferType::class) + ->setChoices(OfferType::getAsArray()); + + $priceField = MoneyField::new('price') + ->setCurrencyPropertyPath('currency') + ->setStoredAsCents(); + $currencyField = CurrencyField::new('currency'); + + $activeField = BooleanField::new('active') + ->setTemplatePath('easy_admin/field/boolean.html.twig') + ; + $createdAtField = DateTimeField::new('createdAt'); + $updatedAtField = DateTimeField::new('updatedAt'); + + $panels = $this->getPanels(); + if ($pageName === Crud::PAGE_INDEX) { + return [$nameField, $typeField, $priceField, $activeField, $createdAtField, $updatedAtField]; + } + + if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) { + $typeField->setChoices(OfferType::cases()); + + return [ + $nameField, + $typeField, + $priceField, + $currencyField, + $activeField, + ]; + } + + // show + return [ + $panels['information'], + $nameField, + $typeField, + $priceField, + $currencyField, + + $panels['tech_information'], + $idField, + $updatedAtField, + $createdAtField, + ]; + } +} diff --git a/src/Controller/Admin/ServiceCrudController.php b/src/Controller/Admin/ServiceCrudController.php index bccc265..70366a8 100644 --- a/src/Controller/Admin/ServiceCrudController.php +++ b/src/Controller/Admin/ServiceCrudController.php @@ -5,10 +5,13 @@ declare(strict_types=1); namespace App\Controller\Admin; use App\Entity\Product; +use App\Enum\Group\UserMembership; use App\Enum\Product\ProductStatus; use App\Enum\Product\ProductType; use App\Enum\Product\ProductVisibility; +use Doctrine\ORM\QueryBuilder; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; +use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField; @@ -36,6 +39,7 @@ final class ServiceCrudController extends AbstractProductCrudController { $product = parent::createEntity($entityFqcn); $product->setCurrency(null); // remove the default value which is not needed here + $product->setVisibility(ProductVisibility::RESTRICTED); return $product; } @@ -49,6 +53,8 @@ final class ServiceCrudController extends AbstractProductCrudController 'typeField' => $typeField, 'statusField' => $statusField, 'visibilityField' => $visibilityField, + 'groupsField' => $groupsField, + 'groupsFieldList' => $groupsFieldList, 'ownerField' => $ownerField, 'categoryField' => $categoryField, 'nameField' => $nameField, @@ -61,7 +67,7 @@ final class ServiceCrudController extends AbstractProductCrudController // list if ($pageName === Crud::PAGE_INDEX) { - return [$nameField, $ownerField, $categoryField, $statusField, $visibilityField, $imageField, $createdAt]; + return [$nameField, $ownerField, $categoryField, $statusField, $visibilityField, $groupsFieldList, $imageField, $createdAt]; } /** @var ImageField $imageField */ @@ -71,10 +77,35 @@ final class ServiceCrudController extends AbstractProductCrudController if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) { /** @var ChoiceField $statusField */ $statusField->setChoices(ProductStatus::cases()); - /** @var ChoiceField $visibilityField */ - $visibilityField->setChoices(ProductVisibility::cases()); - return [$nameField, $ownerField, $categoryField, $statusField, $visibilityField, $descriptionField, $imageField, $durationField]; + $i18prefix = $this->getI18nPrefix(self::class); + + /** @var AssociationField $groupsField */ + $groupsField->setHelp($i18prefix.'.field.groups.help'); + + if ($pageName === Crud::PAGE_NEW) { + return [$nameField, $ownerField, $categoryField, $statusField, $groupsField, $descriptionField, $imageField, $durationField]; + } + /** @var Product|null $product */ + $product = $this->getContext()?->getEntity()?->getInstance(); + $owner = $product?->getOwner(); + if (null !== $owner && !$owner->getUserGroupsConfirmedWithServices()->isEmpty()) { + $groupsField->setQueryBuilder(function (QueryBuilder $queryBuilder) use ($owner) { + return $queryBuilder + ->join('entity.userGroups', 'ug') + ->andWhere('ug.membership != :membership') + ->andWhere('ug.user = :user') + ->andWhere('entity.servicesEnabled = :true') + ->setParameter('user', $owner) + ->setParameter('membership', UserMembership::INVITATION) + ->setParameter('true', true) + ; + }); + } else { + $groupsField->setDisabled(); + } + + return [$nameField, $ownerField, $categoryField, $statusField, $groupsField, $descriptionField, $imageField, $durationField]; } // detail @@ -85,6 +116,7 @@ final class ServiceCrudController extends AbstractProductCrudController $categoryField, $statusField, $visibilityField, + $groupsFieldList, $nameField, $descriptionField, $durationField, diff --git a/src/Controller/Admin/UserCrudController.php b/src/Controller/Admin/UserCrudController.php index 376aae5..a181c1b 100755 --- a/src/Controller/Admin/UserCrudController.php +++ b/src/Controller/Admin/UserCrudController.php @@ -48,16 +48,27 @@ final class UserCrudController extends AbstractUserCrudController 'vacationModeField' => $vacationModeField, 'addressField' => $addressField, 'groupsCountField' => $groupsCountField, + 'membershipPaidField' => $membershipPaidField, + 'startAt' => $startAt, + 'endAt' => $endAt, + 'expiresInField' => $expiresInField, + 'payedAt' => $payedAt, + 'offerField' => $offerField, ] = $this->getFields($pageName); if ($pageName === Crud::PAGE_INDEX) { - return [$emailField, $firstNameField, $lastNameField, $enabledField, $emailConfirmedField, $avatarField, $createdAt, $updatedAt, $loginAt, $groupsCountField]; + $listFields = [$emailField, $firstNameField, $lastNameField, $enabledField, $emailConfirmedField, $avatarField, $createdAt, $updatedAt, $loginAt, $groupsCountField]; + if ($this->platformRequiresGlobalPayment()) { + $listFields[] = $membershipPaidField; + } + + return $listFields; } $panels = $this->getPanels(); if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) { - return [ + $editFields = [ $panels['information'], $emailField, $firstNameField, @@ -74,9 +85,21 @@ final class UserCrudController extends AbstractUserCrudController $enabledField, $emailConfirmedField, ]; + if ($this->platformRequiresGlobalPayment()) { + $editFields = array_merge($editFields, [ + $panels['payment_information'], + $membershipPaidField, + $offerField, + $startAt, + $endAt, + $payedAt, + ]); + } + + return $editFields; } - return [ + $showFields = [ $panels['information'], $emailField, $firstNameField, @@ -97,5 +120,17 @@ final class UserCrudController extends AbstractUserCrudController $updatedAt, $loginAt, ]; + if ($this->platformRequiresGlobalPayment()) { + $showFields = array_merge($showFields, [ + $panels['payment_information'], + $membershipPaidField, + $startAt, + $endAt, + $payedAt, + $expiresInField, + ]); + } + + return $showFields; } } diff --git a/src/Controller/Admin/UserGroupCrudController.php b/src/Controller/Admin/UserGroupCrudController.php index 437e765..40517c1 100755 --- a/src/Controller/Admin/UserGroupCrudController.php +++ b/src/Controller/Admin/UserGroupCrudController.php @@ -130,7 +130,7 @@ final class UserGroupCrudController extends AbstractCrudController implements Gr /** @var User $user */ $user = $this->getUser(); - $qb->andWhere(sprintf('%s.group IN (:groups)', $qb->getRootAliases()[0] ?? '')) + $qb->andWhere(\sprintf('%s.group IN (:groups)', $qb->getRootAliases()[0] ?? '')) ->setParameter(':groups', $user->getMyGroupsAsAdmin()); return $qb; diff --git a/src/Controller/Group/CreateGroupAction.php b/src/Controller/Group/CreateGroupAction.php index 45ce1d3..fc955fc 100644 --- a/src/Controller/Group/CreateGroupAction.php +++ b/src/Controller/Group/CreateGroupAction.php @@ -39,8 +39,6 @@ final class CreateGroupAction extends AbstractController use FlashTrait; use GroupTrait; - public const MAX_ELEMENT_BY_PAGE = 20; - public function __construct( private readonly QueryBus $queryBus, private readonly GroupRepository $groupRepository, @@ -52,7 +50,7 @@ final class CreateGroupAction extends AbstractController ) { } - #[isGranted(User::ROLE_USER)] + #[IsGranted(User::ROLE_USER)] #[Route([ 'en' => MyAccountAction::BASE_URL_EN.'/groups/create-my-group', 'fr' => MyAccountAction::BASE_URL_FR.'/groupes/creer-mon-groupe', @@ -61,6 +59,16 @@ final class CreateGroupAction extends AbstractController )] public function createGroup(Request $request, #[CurrentUser] User $user): Response { + // Admin must use the admin interface + if ($user->isAdmin()) { + return $this->redirect( + $this->adminUrlGenerator + ->setController(GroupCrudController::class) + ->set('crudAction', Crud::PAGE_NEW) + ->generateUrl() + ); + } + $configuration = $this->configurationRepository->getInstanceConfigurationOrCreate(); if (!$configuration->isGroupsCreationForAll()) { throw $this->createAccessDeniedException('Cannot create group with current settings.'); diff --git a/src/Controller/PaginationTrait.php b/src/Controller/PaginationTrait.php index 19d8529..f9b41b9 100644 --- a/src/Controller/PaginationTrait.php +++ b/src/Controller/PaginationTrait.php @@ -21,7 +21,7 @@ trait PaginationTrait * * @implements PaginationInterface * - * @return PaginationInterface + * @return PaginationInterface */ private function paginate(SearchResult $searchResult): PaginationInterface { diff --git a/src/Controller/Payment/DoneAction.php b/src/Controller/Payment/Group/DoneAction.php similarity index 94% rename from src/Controller/Payment/DoneAction.php rename to src/Controller/Payment/Group/DoneAction.php index 13e2d5d..f3d2eb1 100755 --- a/src/Controller/Payment/DoneAction.php +++ b/src/Controller/Payment/Group/DoneAction.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace App\Controller\Payment; +namespace App\Controller\Payment\Group; use App\Controller\FlashTrait; use App\Controller\i18nTrait; @@ -18,7 +18,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; -use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Requirement\Requirement; use Symfony\Component\Security\Http\Attribute\CurrentUser; use Symfony\Component\Security\Http\Attribute\IsGranted; @@ -67,6 +67,7 @@ final class DoneAction extends AbstractController $this->addFlashSuccess($this->translator->trans($this->getI18nPrefix().'.flash.success', [ '%group%' => $groupOffer->getGroup()->getName()], )); + $request->getSession()->remove('payment_in_progress'); } else { $this->addFlashWarning($this->translator->trans($this->getI18nPrefix().'.status.'.$status->getValue())); } diff --git a/src/Controller/Payment/GroupOfferTrait.php b/src/Controller/Payment/Group/GroupOfferTrait.php similarity index 93% rename from src/Controller/Payment/GroupOfferTrait.php rename to src/Controller/Payment/Group/GroupOfferTrait.php index c8b623b..5bf260e 100644 --- a/src/Controller/Payment/GroupOfferTrait.php +++ b/src/Controller/Payment/Group/GroupOfferTrait.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace App\Controller\Payment; +namespace App\Controller\Payment\Group; use App\Entity\GroupOffer; use App\Repository\GroupOfferRepository; diff --git a/src/Controller/Payment/PrepareAction.php b/src/Controller/Payment/Group/PrepareAction.php similarity index 95% rename from src/Controller/Payment/PrepareAction.php rename to src/Controller/Payment/Group/PrepareAction.php index af5e4bc..f72f83b 100755 --- a/src/Controller/Payment/PrepareAction.php +++ b/src/Controller/Payment/Group/PrepareAction.php @@ -2,14 +2,13 @@ declare(strict_types=1); -namespace App\Controller\Payment; +namespace App\Controller\Payment\Group; use App\Controller\User\MyAccountAction; use App\Entity\User; use App\Payment\PayumManager; use App\Repository\GroupOfferRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -// use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; diff --git a/src/Controller/Payment/PlatformMembership/DoneAction.php b/src/Controller/Payment/PlatformMembership/DoneAction.php new file mode 100755 index 0000000..5c61277 --- /dev/null +++ b/src/Controller/Payment/PlatformMembership/DoneAction.php @@ -0,0 +1,84 @@ + Requirement::UUID_V6], + )] + public function __invoke(Request $request, #[MapEntity(expr: 'repository.findOneActive(id)')] PlatformOffer $platformOffer, #[CurrentUser] User $user): Response + { + try { + /** @var PaymentToken $token */ + $token = $this->payum->getHttpRequestVerifier()->verify($request); + } catch (\Exception $e) { + $this->logger->error($e->getMessage()); + throw new UnprocessableEntityHttpException('Cannot verify Payum token.'); + } + + /** @var GetHumanStatus $status */ + $status = $this->commandBus->dispatch(new PlatformMembershipPaidCommand($platformOffer->getId(), $user->getId(), $token)); + + $request->getSession()->remove('payment_in_progress'); + // Not captured + if (!$status->isCaptured()) { + $this->addFlashWarning($this->translator->trans($this->getI18nPrefix().'.status.'.$status->getValue())); + + return $this->redirectToRoute('app_user_my_account'); + } + + $this->addFlashSuccess($this->translator->trans($this->getI18nPrefix().'.flash.success', [ + '%platform%' => $platformOffer->getConfiguration()?->getPlatformName()], + )); + + $group = $user->getMyGroupsAsInvited()->first(); + if ($group !== false) { + return $this->redirectToRoute('app_group_show_logged', $group->getRoutingParameters()); + } + + return $this->redirectToRoute('app_user_my_account'); + } +} diff --git a/src/Controller/Payment/PlatformMembership/PrepareAction.php b/src/Controller/Payment/PlatformMembership/PrepareAction.php new file mode 100644 index 0000000..6147de9 --- /dev/null +++ b/src/Controller/Payment/PlatformMembership/PrepareAction.php @@ -0,0 +1,69 @@ + Requirement::UUID_V6], + methods: ['POST'], + )] + public function preparePayment(Request $request, #[MapEntity(expr: 'repository.findOneActive(id)')] PlatformOffer $platformOffer, #[CurrentUser] User $user, PayumManager $payumManager): Response + { + /** @var ?string $token */ + $token = $request->request->get('token'); + if (!$this->isCsrfTokenValid('payment_prepare', $token)) { + throw new UnprocessableEntityHttpException('Invalid CSRF token'); + } + + $request->getSession()->set('payment_in_progress', true); + + // create and save the payment main reference + $payment = $payumManager->getPayment($platformOffer, $user); + + // create the capture token and redirect to the capture action + $captureToken = $payumManager->getCaptureToken($payment, DoneAction::ROUTE_NAME, [ + 'id' => (string) $platformOffer->getId(), + ]); + + return $this->redirect($captureToken->getTargetUrl()); + } + + #[Route(path: [ + 'en' => '/en/subcription', + 'fr' => '/fr/abonnement', + ], name: 'redirect_to_payment')] + public function redirectToPayment(PlatformOfferRepository $platformOfferRepository, ConfigurationRepository $configurationRepository): Response + { + $offers = $platformOfferRepository->findBy(['active' => true]); + $lowOffer = $platformOfferRepository->findLowOffer(); + $platformName = $configurationRepository->getInstanceConfigurationOrCreate()->getPlatformName(); + + return $this->render('pages/redirect_to_payment.html.twig', compact('offers', 'lowOffer', 'platformName')); + } +} diff --git a/src/Controller/Security/AccountCreateController.php b/src/Controller/Security/AccountCreateController.php index c541fff..966f362 100644 --- a/src/Controller/Security/AccountCreateController.php +++ b/src/Controller/Security/AccountCreateController.php @@ -19,6 +19,7 @@ use App\Message\Query\Security\GetUserByTokenQuery; use App\MessageBus\CommandBus; use App\MessageBus\QueryBus; use App\MessageHandler\Command\Security\AccountCreateStep1CommandHandler; +use App\Repository\ConfigurationRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\HttpFoundation\Request; @@ -41,6 +42,7 @@ final class AccountCreateController extends AbstractController private readonly QueryBus $queryBus, private readonly CommandBus $commandBus, private readonly Security $security, + private readonly ConfigurationRepository $configurationRepository, ) { $this->i18nPrefix = $this->getI18nPrefix(); } @@ -97,6 +99,7 @@ final class AccountCreateController extends AbstractController return $this->redirectToRoute('app_login'); } + $configuration = $this->configurationRepository->getInstanceConfigurationOrCreate(); // nominal case: user found and token not expired $form = $this->createForm(AccountCreateStep2FormType::class, $user->setStep2Defaults())->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { @@ -110,13 +113,26 @@ final class AccountCreateController extends AbstractController // page group. $group = $user->getMyGroupsAsInvited()->first(); if ($group !== false) { - $this->addFlashSuccess($this->i18nPrefix.'.step2.with_invitation.flash.success'); + // If platform needs payment, redirect to payment + if ($configuration->getPaidMembership()) { + $successMessage = $this->i18nPrefix.'.step2.with_invitation.global_paid_membership.flash.success'; + $this->addFlashSuccess($successMessage); + + return $this->redirectToRoute('redirect_to_payment'); + } + $successMessage = $this->i18nPrefix.'.step2.with_invitation.flash.success'; + $this->addFlashSuccess($successMessage); return $this->redirectToRoute('app_group_show_logged', $group->getRoutingParameters()); } + if ($configuration->getPaidMembership()) { + $successMessage = $this->i18nPrefix.'.step2.global_paid_membership.flash.success'; + } else { + $successMessage = $this->i18nPrefix.'.step2.flash.success'; + } // otherwise go to the address form - $this->addFlashSuccess($this->i18nPrefix.'.step2.flash.success'); + $this->addFlashSuccess($successMessage); return $this->redirectToRoute(MyAccountAction::ROUTE); } diff --git a/src/Controller/User/AddressController.php b/src/Controller/User/AddressController.php index 79e6c0a..2668d58 100644 --- a/src/Controller/User/AddressController.php +++ b/src/Controller/User/AddressController.php @@ -45,7 +45,7 @@ final class AddressController extends AbstractController /** * @see UserAddressQueryHandler */ - #[isGranted(User::ROLE_USER)] + #[IsGranted(User::ROLE_USER)] #[Route(path: [ 'en' => MyAccountAction::BASE_URL_EN.'/my-address/step-1', 'fr' => MyAccountAction::BASE_URL_FR.'/mon-adresse/etape-1', @@ -75,7 +75,7 @@ final class AddressController extends AbstractController return $this->render('pages/account/address/step1.html.twig', compact('form')); } - #[isGranted(User::ROLE_USER)] + #[IsGranted(User::ROLE_USER)] #[Route(path: [ 'en' => MyAccountAction::BASE_URL_EN.'/my-address/step-2', 'fr' => MyAccountAction::BASE_URL_FR.'/mon-adresse/etape-2', diff --git a/src/Controller/User/Group/UserGroupController.php b/src/Controller/User/Group/UserGroupController.php index d93d672..3c44e3d 100644 --- a/src/Controller/User/Group/UserGroupController.php +++ b/src/Controller/User/Group/UserGroupController.php @@ -29,7 +29,7 @@ use Symfony\Component\Security\Http\Attribute\IsGranted; /** * @see UserGroupControllerTest */ -#[isGranted(User::ROLE_USER)] +#[IsGranted(User::ROLE_USER)] final class UserGroupController extends AbstractController { use SecurityTrait; @@ -39,7 +39,7 @@ final class UserGroupController extends AbstractController public function __construct( private readonly QueryBus $queryBus, - private readonly CommandBus $commandBus + private readonly CommandBus $commandBus, ) { } diff --git a/src/Controller/User/MyAccountAction.php b/src/Controller/User/MyAccountAction.php index 69c51e8..7bdb160 100644 --- a/src/Controller/User/MyAccountAction.php +++ b/src/Controller/User/MyAccountAction.php @@ -32,7 +32,7 @@ final class MyAccountAction extends AbstractController ) { } - #[isGranted(User::ROLE_USER)] + #[IsGranted(User::ROLE_USER)] #[Route(path: [ 'en' => self::BASE_URL_EN, 'fr' => self::BASE_URL_FR, diff --git a/src/Controller/User/Product/DeleteProductUnavailabilityAction.php b/src/Controller/User/Product/DeleteProductUnavailabilityAction.php index 22b63c7..72d0112 100644 --- a/src/Controller/User/Product/DeleteProductUnavailabilityAction.php +++ b/src/Controller/User/Product/DeleteProductUnavailabilityAction.php @@ -35,9 +35,9 @@ final class DeleteProductUnavailabilityAction extends AbstractController } #[Route(path: [ - 'en' => MyAccountAction::BASE_URL_EN.'/products/unavailability/{id}/delete', - 'fr' => MyAccountAction::BASE_URL_FR.'/produits/indisponibilite/{id}/supprimer', - ], + 'en' => MyAccountAction::BASE_URL_EN.'/products/unavailability/{id}/delete', + 'fr' => MyAccountAction::BASE_URL_FR.'/produits/indisponibilite/{id}/supprimer', + ], name: 'app_user_product_delete_availability', requirements: [ 'id' => Requirement::UUID_V6, diff --git a/src/Controller/User/Product/ProductAvailabilityController.php b/src/Controller/User/Product/ProductAvailabilityController.php index 857a08e..b0f8f2a 100644 --- a/src/Controller/User/Product/ProductAvailabilityController.php +++ b/src/Controller/User/Product/ProductAvailabilityController.php @@ -35,13 +35,13 @@ final class ProductAvailabilityController extends AbstractController public const ROUTE = 'app_user_product_availabilities'; public function __construct( - public readonly ProductRepository $productRepository, - private readonly QueryBus $queryBus, - private readonly CommandBus $commandBus, + public readonly ProductRepository $productRepository, + private readonly QueryBus $queryBus, + private readonly CommandBus $commandBus, ) { } - #[isGranted(User::ROLE_USER)] + #[IsGranted(User::ROLE_USER)] #[Route(path: [ 'en' => MyAccountAction::BASE_URL_EN.'/my-products/{id}/availabilities', 'fr' => MyAccountAction::BASE_URL_FR.'/mes-produits/{id}/disponibilites', diff --git a/src/Controller/User/Product/ServiceController.php b/src/Controller/User/Product/ServiceController.php index dad5958..0316c35 100644 --- a/src/Controller/User/Product/ServiceController.php +++ b/src/Controller/User/Product/ServiceController.php @@ -9,6 +9,7 @@ use App\Controller\User\MyAccountAction; use App\Doctrine\Manager\ProductManager; use App\Entity\Product; use App\Entity\User; +use App\Enum\Product\ProductVisibility; use App\Form\Type\Product\ServiceFormType; use App\MessageBus\QueryBus; use App\Repository\ConfigurationRepository; @@ -56,6 +57,7 @@ final class ServiceController extends AbstractController { if ($this->configurationRepository->getServicesParameter()) { $product = $this->productManager->initService($user); + $product->setVisibility(ProductVisibility::RESTRICTED); $form = $this->getForm($product, $request); if ($form->isSubmitted() && $form->isValid()) { /** @var array|null $images */ diff --git a/src/Controller/User/Product/UserProductsController.php b/src/Controller/User/Product/UserProductsController.php index 54e7eb5..605c2dd 100644 --- a/src/Controller/User/Product/UserProductsController.php +++ b/src/Controller/User/Product/UserProductsController.php @@ -30,7 +30,7 @@ use Symfony\Component\Security\Http\Attribute\IsGranted; /** * @see UserProductsControllerTest */ -#[isGranted(User::ROLE_USER)] +#[IsGranted(User::ROLE_USER)] #[Route(name: 'app_user_')] final class UserProductsController extends AbstractController { @@ -49,7 +49,7 @@ final class UserProductsController extends AbstractController /** * @implements PaginationInterface * - * @return PaginationInterface + * @return PaginationInterface */ private function paginate(Query $query, int $page): PaginationInterface { diff --git a/src/Controller/User/ServiceRequest/ConversationController.php b/src/Controller/User/ServiceRequest/ConversationController.php index a399ca6..c4c8342 100644 --- a/src/Controller/User/ServiceRequest/ConversationController.php +++ b/src/Controller/User/ServiceRequest/ConversationController.php @@ -27,7 +27,7 @@ use Symfony\Component\Security\Http\Attribute\IsGranted; /** * @see ConversationControllerTest */ -#[isGranted(User::ROLE_USER)] +#[IsGranted(User::ROLE_USER)] class ConversationController extends AbstractController { use FlashTrait; diff --git a/src/Controller/User/ServiceRequest/MyLendingsAction.php b/src/Controller/User/ServiceRequest/MyLendingsAction.php index be2cfef..0fc395c 100644 --- a/src/Controller/User/ServiceRequest/MyLendingsAction.php +++ b/src/Controller/User/ServiceRequest/MyLendingsAction.php @@ -37,7 +37,7 @@ final class MyLendingsAction extends AbstractController ) { } - #[isGranted(User::ROLE_USER)] + #[IsGranted(User::ROLE_USER)] #[Route(path: [ 'en' => MyAccountAction::BASE_URL_EN.'/my-lendings', 'fr' => MyAccountAction::BASE_URL_FR.'/mes-prets', diff --git a/src/Controller/User/ServiceRequest/MyLoansAction.php b/src/Controller/User/ServiceRequest/MyLoansAction.php index 967ff9e..eaf24cb 100644 --- a/src/Controller/User/ServiceRequest/MyLoansAction.php +++ b/src/Controller/User/ServiceRequest/MyLoansAction.php @@ -35,7 +35,7 @@ class MyLoansAction extends AbstractController ) { } - #[isGranted(User::ROLE_USER)] + #[IsGranted(User::ROLE_USER)] #[Route(path: [ 'en' => MyAccountAction::BASE_URL_EN.'/my-loans', 'fr' => MyAccountAction::BASE_URL_FR.'/mes-emprunts', diff --git a/src/Controller/User/ServiceRequest/ServiceRequestController.php b/src/Controller/User/ServiceRequest/ServiceRequestController.php index bd835b5..4712b8c 100644 --- a/src/Controller/User/ServiceRequest/ServiceRequestController.php +++ b/src/Controller/User/ServiceRequest/ServiceRequestController.php @@ -29,7 +29,7 @@ use Symfony\Component\Uid\Uuid; /** * @see ServiceRequestControllerTest */ -#[isGranted(User::ROLE_USER)] +#[IsGranted(User::ROLE_USER)] class ServiceRequestController extends AbstractController { use FlashTrait; diff --git a/src/Controller/User/ServiceRequest/ServiceRequestStatusWorkflowController.php b/src/Controller/User/ServiceRequest/ServiceRequestStatusWorkflowController.php index 7d44e1f..b26d305 100644 --- a/src/Controller/User/ServiceRequest/ServiceRequestStatusWorkflowController.php +++ b/src/Controller/User/ServiceRequest/ServiceRequestStatusWorkflowController.php @@ -29,7 +29,7 @@ use function Symfony\Component\String\u; /** * @see ServiceRequestStatusWorkflowControllerTest */ -#[isGranted(User::ROLE_USER)] +#[IsGranted(User::ROLE_USER)] class ServiceRequestStatusWorkflowController extends AbstractController { use FlashTrait; diff --git a/src/Controller/i18nTrait.php b/src/Controller/i18nTrait.php index eb63463..297dcb3 100644 --- a/src/Controller/i18nTrait.php +++ b/src/Controller/i18nTrait.php @@ -14,7 +14,7 @@ trait i18nTrait * Get the i18n prefix of a given class to have a consistent key naming in i18n * files. */ - public function getI18nPrefix(string $class = null): string + public function getI18nPrefix(?string $class = null): string { $class = $class ?? $this::class; diff --git a/src/DataFixtures/Processor/ValidationProcessor.php b/src/DataFixtures/Processor/ValidationProcessor.php index b1c2f32..e18cac4 100644 --- a/src/DataFixtures/Processor/ValidationProcessor.php +++ b/src/DataFixtures/Processor/ValidationProcessor.php @@ -11,7 +11,7 @@ use Symfony\Component\Validator\Validator\ValidatorInterface; final class ValidationProcessor implements ProcessorInterface { public function __construct( - private readonly ValidatorInterface $validator + private readonly ValidatorInterface $validator, ) { } @@ -20,7 +20,7 @@ final class ValidationProcessor implements ProcessorInterface /** @var ConstraintViolationList $violations */ $violations = $this->validator->validate($object); if ($violations->count() > 0) { - $message = sprintf("Error when validating fixture \"%s\", violation(s) detected:\n%s", $id, $violations); + $message = \sprintf("Error when validating fixture \"%s\", violation(s) detected:\n%s", $id, $violations); throw new \DomainException($message); } } diff --git a/src/Doctrine/Behavior/AbstractOfferEntity.php b/src/Doctrine/Behavior/AbstractOfferEntity.php new file mode 100644 index 0000000..9580150 --- /dev/null +++ b/src/Doctrine/Behavior/AbstractOfferEntity.php @@ -0,0 +1,148 @@ +name.' ('.$this->type->value.')'; + } + + public function getId(): Uuid + { + return $this->id; + } + + public function setId(Uuid $uuid): self + { + $this->id = $uuid; + + return $this; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getType(): OfferType + { + return $this->type; + } + + public function setType(OfferType $type): self + { + $this->type = $type; + + return $this; + } + + public function setPrice(int $price): self + { + $this->price = $price; + + return $this; + } + + public function getPrice(): int + { + return $this->price; + } + + public function getActualPrice(): int + { + return $this->price / 100; + } + + public function getCurrency(): string + { + return $this->currency; + } + + public function setCurrency(string $currency): self + { + $this->currency = $currency; + + return $this; + } + + public function isActive(): bool + { + return $this->active; + } + + public function setActive(bool $active): self + { + $this->active = $active; + + return $this; + } +} diff --git a/src/Doctrine/Listener/MembershipPaidListener.php b/src/Doctrine/Listener/MembershipPaidListener.php new file mode 100644 index 0000000..9e158cf --- /dev/null +++ b/src/Doctrine/Listener/MembershipPaidListener.php @@ -0,0 +1,40 @@ +security->getUser(); + if (!$user instanceof User) { + return; + } + $config = $this->configurationRepository->getInstanceConfigurationOrCreate(); + $session = $event->getRequest()->getSession(); + /** @var bool $isPaymentInProgress */ + $isPaymentInProgress = $session->get('payment_in_progress'); + + if ($config->getPaidMembership() && !$user->isMembershipPaid() && !$isPaymentInProgress) { + $event->setResponse(new RedirectResponse($this->router->generate('redirect_to_payment'))); + } + } +} diff --git a/src/Doctrine/Listener/UserListener.php b/src/Doctrine/Listener/UserListener.php index 890f868..e11346f 100644 --- a/src/Doctrine/Listener/UserListener.php +++ b/src/Doctrine/Listener/UserListener.php @@ -19,7 +19,7 @@ use function Symfony\Component\String\u; final class UserListener { public function __construct( - private readonly UserManager $userManager + private readonly UserManager $userManager, ) { } diff --git a/src/Doctrine/Manager/MessageManager.php b/src/Doctrine/Manager/MessageManager.php index aa93961..75ed3aa 100644 --- a/src/Doctrine/Manager/MessageManager.php +++ b/src/Doctrine/Manager/MessageManager.php @@ -43,7 +43,7 @@ final class MessageManager ServiceRequest $serviceRequest, string $messageTemplate, array $messageParameters = [], - \DateTimeImmutable $createdAt = null, + ?\DateTimeImmutable $createdAt = null, ): Message { $message = (new Message()) ->setServiceRequest($serviceRequest) @@ -61,7 +61,7 @@ final class MessageManager return $message; } - public function createFromRecipientMessage(ServiceRequest $serviceRequest, string $message, \DateTimeImmutable $createdAt = null): Message + public function createFromRecipientMessage(ServiceRequest $serviceRequest, string $message, ?\DateTimeImmutable $createdAt = null): Message { $message = (new Message()) ->setServiceRequest($serviceRequest) diff --git a/src/Doctrine/Manager/ProductManager.php b/src/Doctrine/Manager/ProductManager.php index 504115c..9f7bc00 100644 --- a/src/Doctrine/Manager/ProductManager.php +++ b/src/Doctrine/Manager/ProductManager.php @@ -66,7 +66,7 @@ class ProductManager try { $this->productStorage->delete($image); } catch (FilesystemException $e) { - $this->logger->warning(sprintf('Unable to delete product (%s) image %s: %s', $product->getId(), $image, $e->getMessage())); + $this->logger->warning(\sprintf('Unable to delete product (%s) image %s: %s', $product->getId(), $image, $e->getMessage())); } $product->deleteImage($image); diff --git a/src/Doctrine/Manager/UserManager.php b/src/Doctrine/Manager/UserManager.php index ee8d0ad..3ef66b6 100644 --- a/src/Doctrine/Manager/UserManager.php +++ b/src/Doctrine/Manager/UserManager.php @@ -186,7 +186,7 @@ final class UserManager try { $this->userStorage->delete((string) $user->getAvatar()); } catch (FilesystemException $e) { - $this->logger->warning(sprintf('Unable to avatar of user (%s) image %s: %s', $user->getId(), $user->getAvatar(), $e->getMessage())); + $this->logger->warning(\sprintf('Unable to avatar of user (%s) image %s: %s', $user->getId(), $user->getAvatar(), $e->getMessage())); } $user->deleteAvatar(); $this->save($user, true); diff --git a/src/Dto/Product/Search.php b/src/Dto/Product/Search.php index c570464..2141e24 100644 --- a/src/Dto/Product/Search.php +++ b/src/Dto/Product/Search.php @@ -14,7 +14,7 @@ use App\Form\Type\Product\SearchFormType; */ final class Search { - public function __construct(string $q, int $page = 1, User $user = null) + public function __construct(string $q, int $page = 1, ?User $user = null) { $this->q = $q; $this->page = $page; @@ -78,9 +78,9 @@ final class Search */ public function hasProximity(): bool { - return $this->hasCity() && - ($this->city?->hasLocality() ?? false) && - $this->hasDistance() + return $this->hasCity() + && ($this->city?->hasLocality() ?? false) + && $this->hasDistance() ; } diff --git a/src/EasyAdmin/Field/FieldTrait.php b/src/EasyAdmin/Field/FieldTrait.php index d84fe46..3c836d5 100644 --- a/src/EasyAdmin/Field/FieldTrait.php +++ b/src/EasyAdmin/Field/FieldTrait.php @@ -15,7 +15,7 @@ trait FieldTrait /** * Render the boolean without switch: ✅ ❌. */ - public function getSimpleBooleanField(string $propertyName, string $label = null): BooleanField + public function getSimpleBooleanField(string $propertyName, ?string $label = null): BooleanField { return BooleanField::new($propertyName, $label) ->renderAsSwitch(false) @@ -30,6 +30,7 @@ trait FieldTrait return [ 'information' => FormField::addPanel('panel.information', 'fas fa-info-circle'), 'tech_information' => FormField::addPanel('panel.tech_information', 'fas fa-history'), + 'payment_information' => FormField::addPanel('panel.payment_information', 'fas fa-dollar-sign'), ]; } } diff --git a/src/EasyAdmin/Filter/EnumFilter.php b/src/EasyAdmin/Filter/EnumFilter.php index 7ade70f..6a82d29 100644 --- a/src/EasyAdmin/Filter/EnumFilter.php +++ b/src/EasyAdmin/Filter/EnumFilter.php @@ -18,7 +18,7 @@ final class EnumFilter implements FilterInterface { use FilterTrait; - public static function new(string $propertyName, string $formType, string $label = null): self + public static function new(string $propertyName, string $formType, ?string $label = null): self { return (new self()) ->setFilterFqcn(__CLASS__) @@ -32,7 +32,7 @@ final class EnumFilter implements FilterInterface */ public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void { - $queryBuilder->andWhere(sprintf('%s.%s = :value', $filterDataDto->getEntityAlias(), $filterDataDto->getProperty())) + $queryBuilder->andWhere(\sprintf('%s.%s = :value', $filterDataDto->getEntityAlias(), $filterDataDto->getProperty())) ->setParameter('value', $filterDataDto->getValue()); } } diff --git a/src/EasyAdmin/Filter/User/GroupFilter.php b/src/EasyAdmin/Filter/User/GroupFilter.php index 92fe638..8db80d7 100644 --- a/src/EasyAdmin/Filter/User/GroupFilter.php +++ b/src/EasyAdmin/Filter/User/GroupFilter.php @@ -20,7 +20,7 @@ final class GroupFilter implements FilterInterface { use FilterTrait; - public static function new(string $propertyName, string $label = null): self + public static function new(string $propertyName, ?string $label = null): self { return (new self()) ->setFilterFqcn(__CLASS__) @@ -37,7 +37,7 @@ final class GroupFilter implements FilterInterface /** @var Group $group */ $group = $filterDataDto->getValue(); $queryBuilder - ->innerJoin(sprintf('%s.userGroups', $filterDataDto->getEntityAlias()), 'ug') + ->innerJoin(\sprintf('%s.userGroups', $filterDataDto->getEntityAlias()), 'ug') ->andWhere('ug.group = :group') ->setParameter(':group', $group->getId()) ; diff --git a/src/EasyAdmin/Filter/User/MyUsersFilter.php b/src/EasyAdmin/Filter/User/MyUsersFilter.php index 4b2b8de..bb37a75 100644 --- a/src/EasyAdmin/Filter/User/MyUsersFilter.php +++ b/src/EasyAdmin/Filter/User/MyUsersFilter.php @@ -20,7 +20,7 @@ final class MyUsersFilter implements FilterInterface { use FilterTrait; - public static function new(string $propertyName, string $label = null): self + public static function new(string $propertyName, ?string $label = null): self { return (new self()) ->setFilterFqcn(__CLASS__) diff --git a/src/EasyAdmin/Filter/UserGroup/MyGroupFilter.php b/src/EasyAdmin/Filter/UserGroup/MyGroupFilter.php index 4ccd28c..8b5a714 100644 --- a/src/EasyAdmin/Filter/UserGroup/MyGroupFilter.php +++ b/src/EasyAdmin/Filter/UserGroup/MyGroupFilter.php @@ -20,7 +20,7 @@ final class MyGroupFilter implements FilterInterface { use FilterTrait; - public static function new(string $propertyName, string $label = null): self + public static function new(string $propertyName, ?string $label = null): self { return (new self()) ->setFilterFqcn(__CLASS__) diff --git a/src/EasyAdmin/Filter/UuidFilter.php b/src/EasyAdmin/Filter/UuidFilter.php index 6a96a43..66a4edb 100644 --- a/src/EasyAdmin/Filter/UuidFilter.php +++ b/src/EasyAdmin/Filter/UuidFilter.php @@ -22,7 +22,7 @@ final class UuidFilter implements FilterInterface { use FilterTrait; - public static function new(string $propertyName, string $label = null): self + public static function new(string $propertyName, ?string $label = null): self { return (new self()) ->setFilterFqcn(__CLASS__) @@ -37,7 +37,7 @@ final class UuidFilter implements FilterInterface */ public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void { - $queryBuilder->andWhere(sprintf('%s.%s = :value', $filterDataDto->getEntityAlias(), $filterDataDto->getProperty())) + $queryBuilder->andWhere(\sprintf('%s.%s = :value', $filterDataDto->getEntityAlias(), $filterDataDto->getProperty())) ->setParameter('value', $filterDataDto->getValue()); } } diff --git a/src/EasyAdmin/Form/Type/GroupType.php b/src/EasyAdmin/Form/Type/GroupType.php index e49c8e3..fecd1d9 100644 --- a/src/EasyAdmin/Form/Type/GroupType.php +++ b/src/EasyAdmin/Form/Type/GroupType.php @@ -21,7 +21,7 @@ class GroupType extends AbstractType { public function __construct( private readonly Security $security, - private readonly AuthorizationChecker $authorizationChecker + private readonly AuthorizationChecker $authorizationChecker, ) { } diff --git a/src/EasyAdmin/Form/Type/GroupOfferTypeType.php b/src/EasyAdmin/Form/Type/OfferTypeType.php similarity index 75% rename from src/EasyAdmin/Form/Type/GroupOfferTypeType.php rename to src/EasyAdmin/Form/Type/OfferTypeType.php index 719e9fb..2efa4fd 100644 --- a/src/EasyAdmin/Form/Type/GroupOfferTypeType.php +++ b/src/EasyAdmin/Form/Type/OfferTypeType.php @@ -5,20 +5,20 @@ declare(strict_types=1); namespace App\EasyAdmin\Form\Type; use App\Controller\Admin\DashboardController; -use App\Enum\Group\GroupOfferType; +use App\Enum\OfferType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\OptionsResolver\OptionsResolver; /** - * Form type for the GroupOfferType enumeration. + * Form type for the OfferType enumeration. */ -class GroupOfferTypeType extends AbstractType +class OfferTypeType extends AbstractType { public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ - 'choices' => GroupOfferType::getAsArray(), + 'choices' => OfferType::getAsArray(), 'translation_domain' => DashboardController::DOMAIN, ]); } diff --git a/src/EasyAdmin/Form/Type/UserType.php b/src/EasyAdmin/Form/Type/UserType.php index 4389e64..c5d62f2 100644 --- a/src/EasyAdmin/Form/Type/UserType.php +++ b/src/EasyAdmin/Form/Type/UserType.php @@ -20,7 +20,7 @@ class UserType extends AbstractType { public function __construct( private readonly Security $security, - private readonly AuthorizationChecker $authorizationChecker + private readonly AuthorizationChecker $authorizationChecker, ) { } diff --git a/src/Entity/Address.php b/src/Entity/Address.php index 262aebe..2afe5c5 100644 --- a/src/Entity/Address.php +++ b/src/Entity/Address.php @@ -45,7 +45,7 @@ class Address implements \Stringable #[ORM\Column(type: Types::STRING, length: 255, nullable: false)] #[Assert\NotBlank] #[Assert\Length(max: 255)] - private string $address; + private ?string $address = null; /** * Additional information for the address, eg: APT 555. @@ -90,7 +90,7 @@ class Address implements \Stringable #[ORM\Column(type: Types::STRING, length: 255, nullable: false)] #[Assert\NotBlank] #[Assert\Length(max: 255)] - private string $locality = ''; + private ?string $locality = ''; /** * Postal code, eg: "59160". @@ -98,7 +98,7 @@ class Address implements \Stringable #[ORM\Column(type: Types::STRING, length: 10, nullable: false)] #[Assert\NotBlank] #[Assert\Length(max: 20)] - private string $postalCode; + private ?string $postalCode = null; /** * ISO code of the country, eg: "FR". @@ -108,7 +108,7 @@ class Address implements \Stringable #[ORM\Column(type: Types::STRING, length: 2, nullable: false)] #[Assert\NotBlank] #[Assert\Country] - private string $country; + private ?string $country = null; /** * Latitude of the address (north/south), eg: "50.6322562". @@ -148,7 +148,7 @@ class Address implements \Stringable * OpenStreetMap identifier, usefull to create link to maps. */ #[ORM\Column(type: Types::BIGINT, nullable: true)] - private int $osmId; + private string $osmId; public function __toString(): string { @@ -167,12 +167,12 @@ class Address implements \Stringable return $this; } - public function getAddress(): string + public function getAddress(): ?string { return $this->address; } - public function setAddress(string $address): self + public function setAddress(?string $address): self { $this->address = $address; @@ -227,7 +227,7 @@ class Address implements \Stringable return $this; } - public function getLocality(): string + public function getLocality(): ?string { return $this->locality; } @@ -237,7 +237,7 @@ class Address implements \Stringable return $this->locality !== ''; } - public function setLocality(string $locality): self + public function setLocality(?string $locality): self { $this->locality = $locality; @@ -256,24 +256,24 @@ class Address implements \Stringable return $this; } - public function getPostalCode(): string + public function getPostalCode(): ?string { return $this->postalCode; } - public function setPostalCode(string $postalCode): self + public function setPostalCode(?string $postalCode): self { $this->postalCode = $postalCode; return $this; } - public function getCountry(): string + public function getCountry(): ?string { return $this->country; } - public function setCountry(string $country): self + public function setCountry(?string $country): self { $this->country = $country; @@ -340,12 +340,12 @@ class Address implements \Stringable return $this; } - public function getOsmId(): int + public function getOsmId(): string { return $this->osmId; } - public function setOsmId(int $osmId): Address + public function setOsmId(string $osmId): Address { $this->osmId = $osmId; @@ -378,7 +378,7 @@ class Address implements \Stringable return $this; } - public function getSubAndLocality(): string + public function getSubAndLocality(): ?string { if (u($this->subLocality)->isEmpty()) { return $this->locality; diff --git a/src/Entity/Configuration.php b/src/Entity/Configuration.php index e60559c..0b1d091 100644 --- a/src/Entity/Configuration.php +++ b/src/Entity/Configuration.php @@ -8,6 +8,8 @@ use App\Doctrine\Behavior\TimestampableEntity; use App\Enum\ConfigurationType; use App\Message\Command\Admin\ParametersFormCommand; use App\Repository\ConfigurationRepository; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; @@ -25,6 +27,13 @@ class Configuration #[Assert\NotBlank] protected ConfigurationType $type = ConfigurationType::INSTANCE; + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'configuration', targetEntity: PlatformOffer::class, orphanRemoval: true)] + #[ORM\OrderBy(['price' => 'ASC'])] + private Collection $offers; + /** * Associative array to store parameters. * @@ -33,6 +42,11 @@ class Configuration #[ORM\Column(type: 'json')] private array $configuration = []; + public function __construct() + { + $this->offers = new ArrayCollection(); + } + public function getId(): ?int { return $this->id; @@ -76,21 +90,35 @@ class Configuration /** end of basic getters and setters ------------------------------------------------ */ /** - * @return bool[] + * @return array */ - public function getServices(): array + public function getGlobals(): array { - /** @var array $services */ - $services = $this->configuration['services'] ?? []; + /** @var array $globals */ + $globals = $this->configuration['global'] ?? []; - return $services; + return $globals; + } + + public function getPlatformName(): string + { + $globals = $this->getGlobals(); + + return (string) ($globals['globalName'] ?? ''); } public function getServicesEnabled(): bool { - $services = $this->getServices(); + $globals = $this->getGlobals(); - return $services['servicesEnabled']; + return (bool) $globals['globalServicesEnabled']; + } + + public function getPaidMembership(): bool + { + $globals = $this->getGlobals(); + + return (bool) $globals['globalPaidMembership']; } /** diff --git a/src/Entity/Group.php b/src/Entity/Group.php index fa86764..7164aeb 100755 --- a/src/Entity/Group.php +++ b/src/Entity/Group.php @@ -7,10 +7,16 @@ namespace App\Entity; use ApiPlatform\Doctrine\Orm\Filter\OrderFilter; use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Metadata\ApiProperty; +use ApiPlatform\Metadata\ApiResource; +use ApiPlatform\Metadata\Get; +use ApiPlatform\Metadata\GetCollection; +use ApiPlatform\Metadata\Patch; use App\Doctrine\Behavior\TimestampableEntity; use App\Enum\Group\GroupMembership; use App\Enum\Group\GroupType; use App\Repository\GroupRepository; +use App\State\GroupsProvider; +use App\State\Processor\GroupChildServicesEnabledProcessor; use App\Validator as AppAssert; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; @@ -26,6 +32,17 @@ use Symfony\Component\Validator\Constraints as Assert; #[ORM\Index(columns: ['type'])] #[ApiFilter(OrderFilter::class, properties: ['name'])] #[AppAssert\Constraints\Group\GroupParentNotSelf] +#[ApiResource( + operations: [ + new GetCollection(provider: GroupsProvider::class), + new Patch( + uriTemplate: '/groups/{id}/disable_child_services', + input: false, + processor: GroupChildServicesEnabledProcessor::class + ), + new Get(), + ] +)] class Group implements \Stringable { use TimestampableEntity; @@ -123,6 +140,9 @@ class Group implements \Stringable #[ORM\ManyToMany(targetEntity: Product::class, mappedBy: 'groups')] private Collection $products; + #[ORM\Column(type: 'boolean')] + private bool $servicesEnabled = false; + public function __construct() { $this->children = new ArrayCollection(); @@ -248,10 +268,10 @@ class Group implements \Stringable return $this; } - public function getMembership(): GroupMembership - { - return $this->membership; - } + public function getMembership(): GroupMembership + { + return $this->membership; + } public function setMembership(GroupMembership $membership): void { @@ -340,6 +360,16 @@ class Group implements \Stringable return $this; } + public function getServicesEnabled(): bool + { + return $this->servicesEnabled; + } + + public function setServicesEnabled(bool $servicesEnabled): void + { + $this->servicesEnabled = $servicesEnabled; + } + // End of basic 'etters ---------------------------------------------------- /** @@ -384,4 +414,34 @@ class Group implements \Stringable { return !$this->getActiveOffers()->isEmpty(); } + + /** + * @return list + */ + public function getParentsRecursively(): array + { + $parents = []; + $parent = $this->getParent(); + if (null !== $parent) { + $parents = $parent->getParentsRecursively(); + $parents[] = $parent; + } + + return $parents; + } + + /** + * @return list + */ + public function getChildrenRecursively(): array + { + $result = []; + $children = $this->getChildren(); + foreach ($children as $child) { + $result = array_merge($result, $child->getChildrenRecursively()); + $result[] = $child; + } + + return $result; + } } diff --git a/src/Entity/GroupOffer.php b/src/Entity/GroupOffer.php index 87263c1..752655e 100644 --- a/src/Entity/GroupOffer.php +++ b/src/Entity/GroupOffer.php @@ -4,33 +4,16 @@ declare(strict_types=1); namespace App\Entity; -use App\Doctrine\Behavior\TimestampableEntity; -use App\Enum\Group\GroupOfferType; +use App\Doctrine\Behavior\AbstractOfferEntity; use App\Repository\GroupOfferRepository; -use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; -use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator; -use Symfony\Component\Uid\Uuid; use Symfony\Component\Validator\Constraints as Assert; #[ORM\Entity(repositoryClass: GroupOfferRepository::class)] #[ORM\Table(name: 'group_offer')] #[ORM\Index(columns: ['type'])] -class GroupOffer implements \Stringable +class GroupOffer extends AbstractOfferEntity { - use TimestampableEntity; - - final public const DEFAULT_CURRENCY = 'EUR'; - - /** - * Generates a V6 uuid. - */ - #[ORM\Id] - #[ORM\Column(type: 'uuid', unique: true)] - #[ORM\GeneratedValue(strategy: 'CUSTOM')] - #[ORM\CustomIdGenerator(class: UuidGenerator::class)] - private Uuid $id; - /** * Related group. */ @@ -39,134 +22,15 @@ class GroupOffer implements \Stringable #[ORM\OrderBy(['createdAt' => 'ASC'])] private Group $group; - /** - * Short name of the offer. - */ - #[ORM\Column(type: Types::STRING, length: 255, nullable: false)] - #[Assert\NotBlank] - #[Assert\Length(max: 255)] - private string $name; - - /** - * Type of offer. - */ - #[ORM\Column(name: 'type', type: 'string', nullable: false, enumType: GroupOfferType::class)] - #[Assert\NotBlank] - protected GroupOfferType $type; - - /** - * Price, we stored the amount multiplied by 100 so we can use an integer for - * this property. - */ - #[ORM\Column(type: Types::INTEGER, nullable: false)] - protected int $price; - - /** - * Associated currency for the price property. - * - * @see https://en.wikipedia.org/wiki/ISO_4217 - */ - #[ORM\Column(type: Types::STRING, nullable: false)] - protected string $currency = self::DEFAULT_CURRENCY; - - /** - * If the offer is visible on the front site. Can be use to deactivate offers - * for some time. - */ - #[ORM\Column(type: 'boolean', nullable: false)] - protected bool $active = true; - - public function __toString() - { - return $this->name.' ('.$this->type->value.')'; - } - - public function getId(): Uuid - { - return $this->id; - } - - public function setId(Uuid $uuid): self - { - $this->id = $uuid; - - return $this; - } - public function getGroup(): Group { return $this->group; } - public function setGroup(Group $group): GroupOffer + public function setGroup(Group $group): self { $this->group = $group; return $this; } - - public function getName(): string - { - return $this->name; - } - - public function setName(string $name): GroupOffer - { - $this->name = $name; - - return $this; - } - - public function getType(): GroupOfferType - { - return $this->type; - } - - public function setType(GroupOfferType $type): GroupOffer - { - $this->type = $type; - - return $this; - } - - public function setPrice(int $price): self - { - $this->price = $price; - - return $this; - } - - public function getPrice(): int - { - return $this->price; - } - - public function getActualPrice(): int - { - return $this->price / 100; - } - - public function getCurrency(): string - { - return $this->currency; - } - - public function setCurrency(string $currency): self - { - $this->currency = $currency; - - return $this; - } - - public function isActive(): bool - { - return $this->active; - } - - public function setActive(bool $active): GroupOffer - { - $this->active = $active; - - return $this; - } } diff --git a/src/Entity/Menu.php b/src/Entity/Menu.php index ac66fee..265edb9 100644 --- a/src/Entity/Menu.php +++ b/src/Entity/Menu.php @@ -127,12 +127,12 @@ class Menu implements ImageInterface, \Stringable public function removeItem(MenuItem $item): self { $this->items->removeElement($item); -// if ($this->items->removeElement($item)) { + // if ($this->items->removeElement($item)) { // set the owning side to null (unless already changed) -// if ($item->getMenu() === $this) { -// $item->setMenu(null); -// } -// } + // if ($item->getMenu() === $this) { + // $item->setMenu(null); + // } + // } return $this; } diff --git a/src/Entity/PlatformOffer.php b/src/Entity/PlatformOffer.php new file mode 100644 index 0000000..b9ed102 --- /dev/null +++ b/src/Entity/PlatformOffer.php @@ -0,0 +1,35 @@ + 'ASC'])] + #[ORM\JoinColumn(nullable: true, onDelete: 'CASCADE')] + private ?Configuration $configuration; + + public function getConfiguration(): ?Configuration + { + return $this->configuration; + } + + public function setConfiguration(?Configuration $configuration): self + { + $this->configuration = $configuration; + + return $this; + } +} diff --git a/src/Entity/Product.php b/src/Entity/Product.php index 21c1ef3..aa11ebc 100644 --- a/src/Entity/Product.php +++ b/src/Entity/Product.php @@ -39,7 +39,7 @@ use Symfony\Component\Validator\Constraints as Assert; operations: [ new Patch( uriTemplate: '/product/{id}/switchStatus', - openapiContext: ['summary' => 'Swicth the status of the product'], + openapiContext: ['summary' => 'Switch the status of the product'], normalizationContext: ['groups' => [ProductSwitchProcessor::class]], security: "is_granted('".ProductVoter::EDIT."', object)", input: false, @@ -156,7 +156,7 @@ class Product implements \Stringable, ImagesInterface */ #[ORM\ManyToMany(targetEntity: Group::class, inversedBy: 'products')] #[Assert\When( - expression: '!this.getVisibility().isPublic()', + expression: '!this.getVisibility().isPublic() && !this.getOwner().getUserGroupsConfirmedWithServices().isEmpty()', constraints: [ new Assert\Count(min: 1, minMessage: 'app.entity.product.groups.constraints.count.min_message'), ], @@ -487,9 +487,9 @@ class Product implements \Stringable, ImagesInterface $resultArray = []; $today = CarbonImmutable::today(); // start of day 00:00:00 $unavailabilities = $this->getAvailabilities()->filter( - fn (ProductAvailability $pa) => $pa->getMode()->isUnavailable() && // of the good type - ($serviceRequest === null || $pa->getServiceRequest() !== $serviceRequest) && // exclude the dates of the current service request (modify dates) - $pa->getEndAt() >= $today // passed dates are useless but the start date can be in the past + fn (ProductAvailability $pa) => $pa->getMode()->isUnavailable() // of the good type + && ($serviceRequest === null || $pa->getServiceRequest() !== $serviceRequest) // exclude the dates of the current service request (modify dates) + && $pa->getEndAt() >= $today // passed dates are useless but the start date can be in the past ); foreach ($unavailabilities as $unavailability) { diff --git a/src/Entity/User.php b/src/Entity/User.php index 132004d..687abf7 100755 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -17,6 +17,9 @@ use App\Form\Type\User\ChangeLoginFormType; use App\Form\Type\User\ChangePasswordFormType; use App\Form\Type\User\EditProfileFormType; use App\Repository\UserRepository; +use App\Validator\Constraints\User\MembershipPaid; +use App\Validator\Constraints\User\UniqueUser; +use Carbon\Carbon; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; @@ -26,6 +29,7 @@ use libphonenumber\PhoneNumberUtil; use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber; use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; +use Symfony\Component\Security\Core\User\EquatableInterface; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\Validator\Constraints as SecurityAssert; @@ -41,8 +45,10 @@ use function Symfony\Component\String\u; #[ORM\Index(columns: ['lost_password_token'])] #[ORM\Table(name: '`user`')] // we also need escaping here #[ORM\EntityListeners([UserListener::class])] -#[UniqueEntity('email', groups: [AccountCreateStep1FormType::class, ChangeLoginFormType::class, 'Default'])] -class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageInterface +#[UniqueUser(groups: [AccountCreateStep1FormType::class, ChangeLoginFormType::class])] +#[UniqueEntity('email', groups: ['Default'])] +#[MembershipPaid] +class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageInterface, EquatableInterface { use UserConfirmationTrait; use UserLostPasswordTrait; @@ -51,6 +57,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn final public const ROLE_USER = 'ROLE_USER'; final public const ROLE_ADMIN = 'ROLE_ADMIN'; final public const ROLE_GROUP_ADMIN = 'ROLE_GROUP_ADMIN'; + final public const MEMBERSHIP_PAID = 'MEMBERSHIP_PAID'; private const EMAIL_MAX_LENGTH = 180; private const NAME_LENGTH = 180; @@ -265,6 +272,36 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn #[Assert\IsTrue(groups: [AccountCreateStep2FormType::class])] public bool $gdpr = true; + /** + * Paid for membership of the platform. + */ + #[ORM\Column(type: 'boolean', nullable: false)] + private bool $membershipPaid = false; + + #[ORM\ManyToOne(targetEntity: PlatformOffer::class)] + #[ORM\JoinColumn(referencedColumnName: 'id', onDelete: 'SET NULL')] + private ?PlatformOffer $platformOffer = null; + + /** + * Starting date of a paying membership. The starting date of a free membership + * is stored in the creation date. + */ + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] + protected ?\DateTimeImmutable $startAt = null; + + /** + * Ending date of the paying membership. If it only set for recurring membership. + * For one-shot payments, only the start date is filled. + */ + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] + protected ?\DateTimeImmutable $endAt = null; + + /** + * Date of the last payment of this membership. + */ + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] + protected ?\DateTimeImmutable $payedAt = null; + /** * Local cache to store groups (extracted from related userGroups). * @@ -474,6 +511,10 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn } } + if ($this->isMembershipPaid()) { + $roles[] = self::MEMBERSHIP_PAID; + } + return array_unique($roles); } @@ -574,10 +615,10 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn $this->category = $category; } - public function getDescription(): ?string - { - return $this->description; - } + public function getDescription(): ?string + { + return $this->description; + } public function setDescription(?string $description): void { @@ -671,6 +712,17 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn return $collection; } + /** + * @return Collection + */ + public function getUserGroupsConfirmedWithServices(): Collection + { + /** @var Collection $collection */ + $collection = $this->userGroups->filter(fn (UserGroup $userGroup) => !$userGroup->getMembership()->isInvited() && $userGroup->getGroup()->getServicesEnabled()); + + return $collection; + } + /** * @return array */ @@ -714,6 +766,54 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn return $this; } + public function isMembershipPaid(): bool + { + return $this->membershipPaid; + } + + public function setMembershipPaid(bool $membershipPaid): self + { + $this->membershipPaid = $membershipPaid; + + return $this; + } + + public function getStartAt(): ?\DateTimeImmutable + { + return $this->startAt; + } + + public function setStartAt(?\DateTimeImmutable $startAt): self + { + $this->startAt = $startAt; + + return $this; + } + + public function getEndAt(): ?\DateTimeImmutable + { + return $this->endAt; + } + + public function setEndAt(?\DateTimeImmutable $endAt): self + { + $this->endAt = $endAt; + + return $this; + } + + public function getPayedAt(): ?\DateTimeImmutable + { + return $this->payedAt; + } + + public function setPayedAt(?\DateTimeImmutable $payedAt): self + { + $this->payedAt = $payedAt; + + return $this; + } + // —— end of basic 'etters ————————————————————————————————————————————————— public function promoteToAdmin(): self @@ -743,7 +843,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn UserType::USER => UserCrudController::class, UserType::ADMIN => AdministratorCrudController::class, UserType::PLACE => PlaceCrudController::class, - default => throw new \LogicException('No type assigned to user yet.') + default => throw new \LogicException('No type assigned to user yet.'), }; } @@ -770,15 +870,23 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn * * @return Collection */ - public function getMyGroupsAsAdmin(): Collection + public function getMyGroupsAsAdmin(bool $enabledServices = false): Collection { $adminUserGroups = $this->userGroups->filter( static fn (UserGroup $userGroup) => $userGroup->getMembership()->isAdmin() || $userGroup->isMainAdminAccount() ); - return new ArrayCollection( + $groups = new ArrayCollection( array_map(static fn (UserGroup $userGroup) => $userGroup->getGroup(), $adminUserGroups->toArray()) ); + + if ($enabledServices) { + return $groups->filter( + static fn (Group $group) => $group->getServicesEnabled() + ); + } + + return $groups; } /** @@ -894,4 +1002,35 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, ImageIn return $this; } + + public function expiresIn(): ?int + { + $today = Carbon::today(); + if ($this->endAt === null || $this->endAt < $today) { + return null; + } + + $endAt = new Carbon($this->endAt); + + return $today->diffInDays($endAt); + } + + public function getPlatformOffer(): ?PlatformOffer + { + return $this->platformOffer; + } + + public function setPlatformOffer(?PlatformOffer $platformOffer): void + { + $this->platformOffer = $platformOffer; + } + + public function isEqualTo(UserInterface $user): bool + { + if (!$user instanceof self) { + return false; + } + + return $this->email === $user->getUserIdentifier() && $this->password === $user->getPassword(); + } } diff --git a/src/Entity/UserGroup.php b/src/Entity/UserGroup.php index 8400882..d4e38f5 100644 --- a/src/Entity/UserGroup.php +++ b/src/Entity/UserGroup.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Entity; +use ApiPlatform\Metadata\ApiResource; use App\Doctrine\Behavior\TimestampableEntity; use App\Enum\Group\UserMembership; use App\Repository\UserGroupRepository; @@ -16,6 +17,7 @@ use Symfony\Component\Validator\Constraints as Assert; #[ORM\Entity(repositoryClass: UserGroupRepository::class)] #[ORM\UniqueConstraint(columns: ['user', 'group'])] +#[ApiResource] class UserGroup { use TimestampableEntity; diff --git a/src/Enum/Group/GroupOfferType.php b/src/Enum/OfferType.php similarity index 76% rename from src/Enum/Group/GroupOfferType.php rename to src/Enum/OfferType.php index bbf761b..222acdd 100644 --- a/src/Enum/Group/GroupOfferType.php +++ b/src/Enum/OfferType.php @@ -2,25 +2,23 @@ declare(strict_types=1); -namespace App\Enum\Group; +namespace App\Enum; -use App\Enum\AsArrayTrait; - -enum GroupOfferType: string +enum OfferType: string { use AsArrayTrait; - // The user only to pay once to access the group. In his case the end date is - // not set and the membership is valid until it is deleted or a end date is + // The user only to pay once to access the group/platform. In his case the end date is + // not set and the membership is valid until it is deleted or an end date is // set. The end date can always be set manually in case of a problem. case ONESHOT = 'oneshot'; // Monthly subscription. The membership is valid 1 month and the user has to // renew it once the end date is over. This can be useful when a user when to - // try a group on the short period before taking a longer subscription. + // try a group/platform on the short period before taking a longer subscription. case MONTHLY = 'monthly'; - // Subscription valid for one year. An email will be send a few days before + // Subscription valid for one year. An email will be sent a few days before // the end of the membership case YEARLY = 'yearly'; diff --git a/src/Form/Type/Admin/ParametersFormType.php b/src/Form/Type/Admin/ParametersFormType.php index c4e7735..173cc84 100755 --- a/src/Form/Type/Admin/ParametersFormType.php +++ b/src/Form/Type/Admin/ParametersFormType.php @@ -25,13 +25,24 @@ final class ParametersFormType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $builder - ->add('servicesEnabled', CheckboxType::class, [ + ->add('globalName', TextType::class, [ + 'label' => 'parameter.global_name', + ]) + + ->add('globalServicesEnabled', CheckboxType::class, [ 'label' => 'parameter.services', 'label_attr' => [ 'class' => 'checkbox-inline checkbox-switch', ], ]) + ->add('globalPaidMembership', CheckboxType::class, [ + 'label' => 'parameter.paid_membership', + 'label_attr' => [ + 'class' => 'checkbox-inline checkbox-switch', + ], + ]) + ->add('notificationsSenderEmail', EmailType::class, [ 'label' => 'parameter.mail', 'label_attr' => ['class' => 'col-sm-2 col-form-label'], diff --git a/src/Form/Type/Group/CreateGroupFormType.php b/src/Form/Type/Group/CreateGroupFormType.php index 565827a..1a28352 100644 --- a/src/Form/Type/Group/CreateGroupFormType.php +++ b/src/Form/Type/Group/CreateGroupFormType.php @@ -4,23 +4,30 @@ declare(strict_types=1); namespace App\Form\Type\Group; +use App\Entity\Configuration; use App\Entity\Group; use App\Entity\User; use App\Enum\Group\GroupMembership; use App\Enum\Group\GroupType; +use App\Repository\ConfigurationRepository; +use App\Repository\GroupRepository; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Webmozart\Assert\Assert; class CreateGroupFormType extends AbstractType { public function __construct( private readonly Security $security, + private readonly ConfigurationRepository $configurationRepository, + private readonly GroupRepository $groupRepository, ) { } @@ -28,6 +35,8 @@ class CreateGroupFormType extends AbstractType { /** @var User $user */ $user = $this->security->getUser(); + $configuration = $this->configurationRepository->getInstanceConfiguration(); + $myGroupsWithDisabledServices = $this->groupRepository->getGroupsByEnabledServices(false, $user); $builder ->add('name', TextType::class, [ @@ -43,27 +52,44 @@ class CreateGroupFormType extends AbstractType 'label_attr' => ['class' => 'fs-6 text-black'], 'expanded' => true, 'choice_label' => 'transKey', - ]) - ->add('membership', EnumType::class, [ - 'class' => GroupMembership::class, - 'label' => 'templates.pages.group.create.form.membership', - 'label_attr' => ['class' => 'fs-6 text-black'], - 'expanded' => true, - ]) - ->add('submit', SubmitType::class, [ - 'label' => 'templates.pages.group.create.form.submit', - 'attr' => ['class' => 'btn btn-primary btn-sm d-grid col-12 my-5'], ]); + Assert::isInstanceOf($configuration, Configuration::class); + if ($configuration->getServicesEnabled()) { + $builder + ->add('servicesEnabled', CheckboxType::class, [ + 'label' => 'templates.pages.group.create.form.servicesEnabled', + 'label_attr' => ['class' => 'fs-6 text-black mb-3 switch-custom'], + 'required' => false, + 'attr' => [ + 'data-action' => 'click->parentgroup#updateParentOptions', + 'data-parentgroup-target' => 'servicesEnabledField', + 'data-user-id' => $user->getId(), + ], + ]); + } + $builder + ->add('membership', EnumType::class, [ + 'class' => GroupMembership::class, + 'label' => 'templates.pages.group.create.form.membership', + 'label_attr' => ['class' => 'fs-6 text-black'], + 'expanded' => true, + ]) + ->add('submit', SubmitType::class, [ + 'label' => 'templates.pages.group.create.form.submit', + 'attr' => ['class' => 'btn btn-primary btn-sm d-grid col-12 my-5'], + ]); - $myGroups = $user->getMyGroupsAsAdmin(); - if (!$myGroups->isEmpty()) { + if ([] === $myGroupsWithDisabledServices) { $builder ->add('parent', EntityType::class, [ 'class' => Group::class, - 'choices' => $myGroups, + 'choices' => $myGroupsWithDisabledServices, 'label' => 'templates.pages.group.create.form.subgroup', 'label_attr' => ['class' => 'fs-6 text-black'], 'required' => false, + 'attr' => [ + 'data-parentgroup-target' => 'parentField', + ], ]); } } diff --git a/src/Form/Type/Product/AbstractProductFormType.php b/src/Form/Type/Product/AbstractProductFormType.php index 52dd3b0..8234781 100644 --- a/src/Form/Type/Product/AbstractProductFormType.php +++ b/src/Form/Type/Product/AbstractProductFormType.php @@ -6,18 +6,14 @@ namespace App\Form\Type\Product; use App\Controller\i18nTrait; use App\Entity\Category; -use App\Entity\Group; use App\Entity\Product; use App\Entity\User; use App\Enum\Product\ProductType; -use App\Enum\Product\ProductVisibility; use App\Flysystem\MediaManager; use App\Repository\CategoryRepository; -use App\Repository\GroupRepository; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; @@ -36,7 +32,6 @@ abstract class AbstractProductFormType extends AbstractType public function __construct( private readonly MediaManager $mediaManager, - private readonly GroupRepository $groupRepository, private readonly Security $security, ) { } @@ -87,38 +82,6 @@ abstract class AbstractProductFormType extends AbstractType 'attr' => ['class' => 'btn-sm btn-primary'], ]); - // only if the user has groups - if (!$user->getUserGroupsConfirmed()->isEmpty()) { - $builder - ->add('visibility', EnumType::class, [ - 'class' => ProductVisibility::class, - 'label' => 'product.form.visibility', - 'expanded' => true, - 'label_attr' => [ - 'class' => 'radio-inline text-black fs-6 fw-normal', - ], - // check if we can do simpler (@see productvisibility_controller.js) - 'choice_attr' => [ - 0 => [ - 'data-productvisibility-target' => ProductVisibility::PUBLIC->value, - 'data-action' => 'click->productvisibility#hideGroups', - ], - 1 => [ - 'data-productvisibility-target' => ProductVisibility::RESTRICTED->value, - 'data-action' => 'click->productvisibility#showGroups', - ], - ], - ]) - ->add('groups', EntityType::class, [ - 'class' => Group::class, - 'query_builder' => $this->groupRepository->getUserGroups($user), - 'label' => $i18nPrefix.'.form.groups', - 'expanded' => true, - 'multiple' => true, - 'required' => false, - ]); - } - // remove all group associations if public to avoid side effects $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event): void { /** @var Product $product */ @@ -132,7 +95,7 @@ abstract class AbstractProductFormType extends AbstractType public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ - 'validation_groups' => self::class, + 'validation_groups' => [self::class], ]); } } diff --git a/src/Form/Type/Product/ObjectFormType.php b/src/Form/Type/Product/ObjectFormType.php index db464e2..42cc8bb 100644 --- a/src/Form/Type/Product/ObjectFormType.php +++ b/src/Form/Type/Product/ObjectFormType.php @@ -4,8 +4,16 @@ declare(strict_types=1); namespace App\Form\Type\Product; +use App\Entity\Group; use App\Entity\Product; +use App\Entity\User; use App\Enum\Product\ProductType; +use App\Enum\Product\ProductVisibility; +use App\Flysystem\MediaManager; +use App\Repository\GroupRepository; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; +use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\MoneyType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; @@ -13,10 +21,22 @@ use Symfony\Component\OptionsResolver\OptionsResolver; final class ObjectFormType extends AbstractProductFormType { + public function __construct( + MediaManager $mediaManager, + private readonly GroupRepository $groupRepository, + private readonly Security $security, + ) { + parent::__construct($mediaManager, $security); + } + public function buildForm(FormBuilderInterface $builder, array $options): void { parent::buildForm($builder, $options); + $i18nPrefix = $this->getI18nPrefix(); + /** @var User $user */ + $user = $this->security->getUser(); + $builder ->add('age', TextType::class, [ 'label' => 'object.form.age', @@ -34,6 +54,38 @@ final class ObjectFormType extends AbstractProductFormType 'label_attr' => ['class' => 'text-black fs-6 fw-normal'], 'required' => false, ]); + + // only if the user is connected and has groups + if (!$user->getUserGroupsConfirmed()->isEmpty()) { + $builder + ->add('visibility', EnumType::class, [ + 'class' => ProductVisibility::class, + 'label' => 'product.form.visibility', + 'expanded' => true, + 'label_attr' => [ + 'class' => 'radio-inline text-black fs-6 fw-normal', + ], + // check if we can do simpler (@see productvisibility_controller.js) + 'choice_attr' => [ + 0 => [ + 'data-productvisibility-target' => ProductVisibility::PUBLIC->value, + 'data-action' => 'click->productvisibility#hideGroups', + ], + 1 => [ + 'data-productvisibility-target' => ProductVisibility::RESTRICTED->value, + 'data-action' => 'click->productvisibility#showGroups', + ], + ], + ]) + ->add('groups', EntityType::class, [ + 'class' => Group::class, + 'query_builder' => $this->groupRepository->getUserGroups($user), + 'label' => $i18nPrefix.'.form.groups', + 'expanded' => true, + 'multiple' => true, + 'required' => false, + ]); + } } public function getType(): ProductType diff --git a/src/Form/Type/Product/ServiceFormType.php b/src/Form/Type/Product/ServiceFormType.php index e61dbf9..eb4c7f6 100644 --- a/src/Form/Type/Product/ServiceFormType.php +++ b/src/Form/Type/Product/ServiceFormType.php @@ -4,24 +4,77 @@ declare(strict_types=1); namespace App\Form\Type\Product; +use App\Entity\Group; use App\Entity\Product; +use App\Entity\User; use App\Enum\Product\ProductType; +use App\Enum\Product\ProductVisibility; +use App\Flysystem\MediaManager; +use App\Repository\GroupRepository; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; +use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; final class ServiceFormType extends AbstractProductFormType { + public function __construct( + MediaManager $mediaManager, + private readonly GroupRepository $groupRepository, + private readonly Security $security, + ) { + parent::__construct($mediaManager, $security); + } + public function buildForm(FormBuilderInterface $builder, array $options): void { parent::buildForm($builder, $options); + $i18nPrefix = $this->getI18nPrefix(); + /** @var User $user */ + $user = $this->security->getUser(); + $builder ->add('duration', TextType::class, [ 'label' => 'new_service.form.serviceDuration', 'label_attr' => ['class' => 'text-black fs-6 fw-normal'], 'required' => false, ]); + + // only if the user is connected and has groups + $groups = $this->groupRepository->getUserGroupsWithEnabledServices($user); + if (!$user->getUserGroupsConfirmed()->isEmpty()) { + $builder + ->add('visibility', ChoiceType::class, [ + 'label' => 'product.form.visibility', + 'expanded' => true, + 'label_attr' => [ + 'class' => 'radio-inline text-black fs-6 fw-normal', + ], + 'choices' => [ + 0 => [ + 'product.service.form.visibility' => ProductVisibility::RESTRICTED, + ], + ], + 'multiple' => false, + 'data' => ProductVisibility::RESTRICTED, + 'disabled' => true, + ]) + ->add('groups', EntityType::class, [ + 'class' => Group::class, + 'query_builder' => $groups, + 'label' => [] === $groups->getQuery()->getResult() ? $i18nPrefix.'.form.no_groups' : $i18nPrefix.'.form.groups', + 'label_attr' => [] === $groups->getQuery()->getResult() ? ['class' => 'text-danger fs-6 fw-normal'] : [], + 'expanded' => true, + 'multiple' => true, + 'required' => false, + ]); + } + if ($groups->getQuery()->getResult() === []) { + $builder->get('submit')->setDisabled(true); + } } public function getType(): ProductType diff --git a/src/Form/Type/ServiceRequest/AbstractUserProductSelectFormType.php b/src/Form/Type/ServiceRequest/AbstractUserProductSelectFormType.php index aa6651a..c2921fb 100644 --- a/src/Form/Type/ServiceRequest/AbstractUserProductSelectFormType.php +++ b/src/Form/Type/ServiceRequest/AbstractUserProductSelectFormType.php @@ -28,13 +28,13 @@ abstract class AbstractUserProductSelectFormType extends AbstractType return $builder ->setMethod('GET') ->add('product', EntityType::class, [ - 'class' => Product::class, + 'class' => Product::class, 'query_builder' => function (EntityRepository $entityRepository) { $qb = $entityRepository->createQueryBuilder('p') ->from(ServiceRequest::class, 'sr') ->andWhere('p = sr.product'); - return $qb->andWhere(sprintf('sr.%s = :user', $this->isOwner() ? 'owner' : 'recipient')) + return $qb->andWhere(\sprintf('sr.%s = :user', $this->isOwner() ? 'owner' : 'recipient')) ->setParameter('user', $this->security->getUser()); }, 'required' => false, diff --git a/src/Geocoder/Adapter/NominatimToAddressAdapter.php b/src/Geocoder/Adapter/NominatimToAddressAdapter.php index ef3085d..c64eb58 100644 --- a/src/Geocoder/Adapter/NominatimToAddressAdapter.php +++ b/src/Geocoder/Adapter/NominatimToAddressAdapter.php @@ -31,7 +31,7 @@ final class NominatimToAddressAdapter $address->setOsmType((string) $nominatimAddress->getOSMType()); if ($nominatimAddress->getOSMId() !== null) { - $address->setOsmId($nominatimAddress->getOSMId()); + $address->setOsmId((string) $nominatimAddress->getOSMId()); } } } diff --git a/src/Geocoder/GeoProvider.php b/src/Geocoder/GeoProvider.php index f112516..e10cf88 100644 --- a/src/Geocoder/GeoProvider.php +++ b/src/Geocoder/GeoProvider.php @@ -33,7 +33,7 @@ class GeoProvider implements GeoProviderInterface /** @var AddressCollection $collection */ $collection = $this->nominatimGeocoder->geocodeQuery($query); } catch (Exception $e) { - throw new \RuntimeException(sprintf('Unable to get geoloc of %s: %s', $text, $e->getMessage())); + throw new \RuntimeException(\sprintf('Unable to get geoloc of %s: %s', $text, $e->getMessage())); } return $collection; diff --git a/src/Mailer/Email/Admin/Group/GroupInvitationEmail.php b/src/Mailer/Email/Admin/Group/GroupInvitationEmail.php index 37b6f49..683b76a 100644 --- a/src/Mailer/Email/Admin/Group/GroupInvitationEmail.php +++ b/src/Mailer/Email/Admin/Group/GroupInvitationEmail.php @@ -28,7 +28,7 @@ final class GroupInvitationEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } @@ -46,8 +46,8 @@ final class GroupInvitationEmail implements EmailInterface ->to($user->getEmail()) ->priority(Email::PRIORITY_HIGH) ->subject($this->translator->trans($this->getI18nPrefix().'.subject', [ - '%brand%' => $this->brand, - '%group%' => $group->getName(), + '%brand%' => $this->brand, + '%group%' => $group->getName(), ], AppMailer::TR_DOMAIN)) ->htmlTemplate('email/admin/group/group_invitation.html.twig') ->context($context) diff --git a/src/Mailer/Email/Admin/New/NewAdminEmail.php b/src/Mailer/Email/Admin/New/NewAdminEmail.php index 4b01f69..aae4c6b 100644 --- a/src/Mailer/Email/Admin/New/NewAdminEmail.php +++ b/src/Mailer/Email/Admin/New/NewAdminEmail.php @@ -22,7 +22,7 @@ class NewAdminEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Admin/PromoteToAdmin/PromoteToAdminEmail.php b/src/Mailer/Email/Admin/PromoteToAdmin/PromoteToAdminEmail.php index e90c228..93331b2 100644 --- a/src/Mailer/Email/Admin/PromoteToAdmin/PromoteToAdminEmail.php +++ b/src/Mailer/Email/Admin/PromoteToAdmin/PromoteToAdminEmail.php @@ -22,7 +22,7 @@ class PromoteToAdminEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Admin/UserGroup/AdminPromotionEmail.php b/src/Mailer/Email/Admin/UserGroup/AdminPromotionEmail.php index a2b7bb0..18ca317 100644 --- a/src/Mailer/Email/Admin/UserGroup/AdminPromotionEmail.php +++ b/src/Mailer/Email/Admin/UserGroup/AdminPromotionEmail.php @@ -25,7 +25,7 @@ final class AdminPromotionEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Admin/UserGroup/MainAdminPromotionEmail.php b/src/Mailer/Email/Admin/UserGroup/MainAdminPromotionEmail.php index 861a901..ff12872 100644 --- a/src/Mailer/Email/Admin/UserGroup/MainAdminPromotionEmail.php +++ b/src/Mailer/Email/Admin/UserGroup/MainAdminPromotionEmail.php @@ -25,7 +25,7 @@ final class MainAdminPromotionEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Command/EndMembershipEmail.php b/src/Mailer/Email/Command/EndMembershipEmail.php index 6ad663d..7ee4aad 100644 --- a/src/Mailer/Email/Command/EndMembershipEmail.php +++ b/src/Mailer/Email/Command/EndMembershipEmail.php @@ -28,7 +28,7 @@ final class EndMembershipEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Command/EndPlatformMembershipMail.php b/src/Mailer/Email/Command/EndPlatformMembershipMail.php new file mode 100644 index 0000000..de5e26e --- /dev/null +++ b/src/Mailer/Email/Command/EndPlatformMembershipMail.php @@ -0,0 +1,50 @@ + $context + */ + public function getEmail(array $context): TemplatedEmail + { + /** @var ?User $user */ + $user = $context['user'] ?? null; + Assert::isInstanceOf($user, User::class); + + return (new TemplatedEmail()) + ->to($user->getEmail()) + ->priority(Email::PRIORITY_HIGH) + ->subject($this->translator->trans($this->getI18nPrefix().'.subject', [ + '%brand%' => $this->brand, + '%platform%' => $context['platform'], + ], AppMailer::TR_DOMAIN)) + ->htmlTemplate('email/command/end_platform_membership.html.twig') + ->context($context) + ; + } +} diff --git a/src/Mailer/Email/Command/NotifyMembershipExpirationEmail.php b/src/Mailer/Email/Command/NotifyMembershipExpirationEmail.php index b6360dc..9af44e6 100644 --- a/src/Mailer/Email/Command/NotifyMembershipExpirationEmail.php +++ b/src/Mailer/Email/Command/NotifyMembershipExpirationEmail.php @@ -27,7 +27,7 @@ final class NotifyMembershipExpirationEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Command/NotifyPlatformMembershipExpirationMail.php b/src/Mailer/Email/Command/NotifyPlatformMembershipExpirationMail.php new file mode 100644 index 0000000..046edf9 --- /dev/null +++ b/src/Mailer/Email/Command/NotifyPlatformMembershipExpirationMail.php @@ -0,0 +1,51 @@ + $context + */ + public function getEmail(array $context): TemplatedEmail + { + /** @var ?User $user */ + $user = $context['user'] ?? null; + Assert::isInstanceOf($user, User::class); + + return (new TemplatedEmail()) + ->to($user->getEmail()) + ->priority(Email::PRIORITY_HIGH) + ->subject($this->translator->trans($this->getI18nPrefix().'.subject', [ + '%brand%' => $this->brand, + '%days%' => $context['days'], + '%platform%' => $context['platform'], + ], AppMailer::TR_DOMAIN)) + ->htmlTemplate('email/command/notify_platform_membership_expiration.html.twig') + ->context($context) + ; + } +} diff --git a/src/Mailer/Email/Command/NotifyServiceRequestEndEmail.php b/src/Mailer/Email/Command/NotifyServiceRequestEndEmail.php index 7570bb5..7128dfc 100644 --- a/src/Mailer/Email/Command/NotifyServiceRequestEndEmail.php +++ b/src/Mailer/Email/Command/NotifyServiceRequestEndEmail.php @@ -27,7 +27,7 @@ final class NotifyServiceRequestEndEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Command/NotifyServiceRequestStartEmail.php b/src/Mailer/Email/Command/NotifyServiceRequestStartEmail.php index 42b44da..7e7ad4d 100644 --- a/src/Mailer/Email/Command/NotifyServiceRequestStartEmail.php +++ b/src/Mailer/Email/Command/NotifyServiceRequestStartEmail.php @@ -27,7 +27,7 @@ final class NotifyServiceRequestStartEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/Payment/PlatformMembershipPaidMail.php b/src/Mailer/Email/Payment/PlatformMembershipPaidMail.php new file mode 100644 index 0000000..b817cbc --- /dev/null +++ b/src/Mailer/Email/Payment/PlatformMembershipPaidMail.php @@ -0,0 +1,50 @@ + $context + */ + public function getEmail(array $context): TemplatedEmail + { + /** @var ?User $user */ + $user = $context['user'] ?? null; + Assert::isInstanceOf($user, User::class); + + return (new TemplatedEmail()) + ->to($user->getEmail()) + ->priority(Email::PRIORITY_HIGH) + ->subject($this->translator->trans($this->getI18nPrefix().'.subject', [ + '%brand%' => $this->brand, + '%platform%' => $context['platform'], + ], AppMailer::TR_DOMAIN)) + ->htmlTemplate('email/payment/platform_membership_paid.html.twig') + ->context($context) + ; + } +} diff --git a/src/Mailer/Email/Security/CreateAccountStep1Email.php b/src/Mailer/Email/Security/CreateAccountStep1Email.php index a48f190..e003847 100644 --- a/src/Mailer/Email/Security/CreateAccountStep1Email.php +++ b/src/Mailer/Email/Security/CreateAccountStep1Email.php @@ -28,7 +28,7 @@ final class CreateAccountStep1Email implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } @@ -53,8 +53,8 @@ final class CreateAccountStep1Email implements EmailInterface ->to($user->getEmail()) ->priority(Email::PRIORITY_HIGH) ->subject($this->translator->trans($subjectKey, [ - '%brand%' => $this->brand, - '%group%' => $group?->getName(), + '%brand%' => $this->brand, + '%group%' => $group?->getName(), ], AppMailer::TR_DOMAIN)) ->htmlTemplate('email/security/create_account_step1.html.twig') ->context($context) diff --git a/src/Mailer/Email/ServiceRequest/NewMessageEmail.php b/src/Mailer/Email/ServiceRequest/NewMessageEmail.php index c66fc4c..af863a2 100644 --- a/src/Mailer/Email/ServiceRequest/NewMessageEmail.php +++ b/src/Mailer/Email/ServiceRequest/NewMessageEmail.php @@ -25,7 +25,7 @@ final class NewMessageEmail implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Mailer/Email/ServiceRequest/NewServiceRequest.php b/src/Mailer/Email/ServiceRequest/NewServiceRequest.php index f6f4e02..9cca769 100644 --- a/src/Mailer/Email/ServiceRequest/NewServiceRequest.php +++ b/src/Mailer/Email/ServiceRequest/NewServiceRequest.php @@ -27,7 +27,7 @@ final class NewServiceRequest implements EmailInterface public function __construct( private readonly TranslatorInterface $translator, #[Autowire('%brand%')] - private readonly string $brand + private readonly string $brand, ) { } diff --git a/src/Message/Command/Admin/AbstractFormCommand.php b/src/Message/Command/Admin/AbstractFormCommand.php index 19089cb..c33aafc 100644 --- a/src/Message/Command/Admin/AbstractFormCommand.php +++ b/src/Message/Command/Admin/AbstractFormCommand.php @@ -45,6 +45,6 @@ abstract class AbstractFormCommand } } - throw new \UnexpectedValueException(sprintf('Invalid property name, it should start with "%s"', implode(', ', $this->getSections()))); + throw new \UnexpectedValueException(\sprintf('Invalid property name, it should start with "%s"', implode(', ', $this->getSections()))); } } diff --git a/src/Message/Command/Admin/ParametersFormCommand.php b/src/Message/Command/Admin/ParametersFormCommand.php index c719a45..d34f2cf 100755 --- a/src/Message/Command/Admin/ParametersFormCommand.php +++ b/src/Message/Command/Admin/ParametersFormCommand.php @@ -17,9 +17,15 @@ final class ParametersFormCommand extends AbstractFormCommand final public const ONLY_ADMIN = 'only_admin'; final public const ALL = 'all'; - // services section ————————————————————————————————————————————— + // global section ————————————————————————————————————————————— + #[Assert\NotBlank()] + public ?string $globalName = null; + #[Assert\Type('bool')] - public bool $servicesEnabled = true; + public bool $globalServicesEnabled = true; + + #[Assert\Type('bool')] + public bool $globalPaidMembership = false; // notificationsSender section ————————————————————————————————————————————— #[Assert\Email()] @@ -59,7 +65,7 @@ final class ParametersFormCommand extends AbstractFormCommand protected function getSections(): array { return [ - 'services', + 'global', 'notificationsSender', 'contact', 'groups', @@ -76,7 +82,6 @@ final class ParametersFormCommand extends AbstractFormCommand public function hydrate(Configuration $configuration): self { $instanceConfiguration = $configuration->getConfiguration(); -// dd($instanceConfiguration); foreach (array_keys(get_class_vars($this::class)) as $classVar) { $this->{$classVar} = $instanceConfiguration[$this->getSection($classVar)][$classVar]; // @phpstan-ignore-line } diff --git a/src/Message/Command/Payment/PlatformMembershipPaidCommand.php b/src/Message/Command/Payment/PlatformMembershipPaidCommand.php new file mode 100644 index 0000000..10fa2ff --- /dev/null +++ b/src/Message/Command/Payment/PlatformMembershipPaidCommand.php @@ -0,0 +1,22 @@ +messageBus = $commandBus; } diff --git a/src/MessageBus/QueryBus.php b/src/MessageBus/QueryBus.php index e5f546f..67c0df2 100644 --- a/src/MessageBus/QueryBus.php +++ b/src/MessageBus/QueryBus.php @@ -12,7 +12,7 @@ final class QueryBus implements QueryBusInterface use HandleTrait; public function __construct( - MessageBusInterface $queryBus + MessageBusInterface $queryBus, ) { $this->messageBus = $queryBus; } diff --git a/src/MessageHandler/Command/Admin/ParametersFormCommandHandler.php b/src/MessageHandler/Command/Admin/ParametersFormCommandHandler.php index b9d42f0..dcd9c09 100644 --- a/src/MessageHandler/Command/Admin/ParametersFormCommandHandler.php +++ b/src/MessageHandler/Command/Admin/ParametersFormCommandHandler.php @@ -6,13 +6,15 @@ namespace App\MessageHandler\Command\Admin; use App\Message\Command\Admin\ParametersFormCommand; use App\Repository\ConfigurationRepository; +use App\Repository\GroupRepository; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler] final class ParametersFormCommandHandler { public function __construct( - private readonly ConfigurationRepository $configurationRepository + private readonly ConfigurationRepository $configurationRepository, + private readonly GroupRepository $groupRepository, ) { } @@ -24,5 +26,10 @@ final class ParametersFormCommandHandler $configuration = $this->configurationRepository->getInstanceConfigurationOrCreate(); $configuration->setConfiguration($message->toJsonArray()); $this->configurationRepository->save($configuration, true); + + if (!$configuration->getServicesEnabled()) { + $groups = $this->groupRepository->findAll(); + $this->groupRepository->disableServicesForAllGroups($groups); + } } } diff --git a/src/MessageHandler/Command/Payment/PlatformMembershipPaidCommandHandler.php b/src/MessageHandler/Command/Payment/PlatformMembershipPaidCommandHandler.php new file mode 100644 index 0000000..dd082f3 --- /dev/null +++ b/src/MessageHandler/Command/Payment/PlatformMembershipPaidCommandHandler.php @@ -0,0 +1,71 @@ +platformOfferRepository->get($message->platformOfferId); + $user = $this->userRepository->get($message->userId); + + $gateway = $this->payum->getGateway($message->paymentToken->getGatewayName()); + $status = new GetHumanStatus($message->paymentToken); + $gateway->execute($status); + + // Not captured + if (!$status->isCaptured()) { + return $status; + } + + $user + ->setMembershipPaid(true) + ->setStartAt(CarbonImmutable::today()) + ->setPayedAt(CarbonImmutable::now()) + ->setPlatformOffer($platformOffer) + ; + if (($offerType = $platformOffer->getType())->isRecurring()) { + $user->setEndAt(new CarbonImmutable($offerType->getEndAtInterval())); + } + + $this->userManager->save($user, true); + + // payment was captured and membership is saved so invalidate the token + $this->payum->getHttpRequestVerifier()->invalidate($message->paymentToken); + + // send confirmation email + $configuration = $this->configurationRepository->getInstanceConfigurationOrCreate(); + $platform = $configuration->getPlatformName(); + $this->mailer->send(PlatformMembershipPaidMail::class, [ + 'platform' => $platform, + 'user' => $user, + ]); + + return $status; + } +} diff --git a/src/MessageHandler/Command/Product/CreateGroupInvitationMessageHandler.php b/src/MessageHandler/Command/Product/CreateGroupInvitationMessageHandler.php index da39fd9..68c3290 100644 --- a/src/MessageHandler/Command/Product/CreateGroupInvitationMessageHandler.php +++ b/src/MessageHandler/Command/Product/CreateGroupInvitationMessageHandler.php @@ -58,6 +58,9 @@ final class CreateGroupInvitationMessageHandler $user = $this->userManager->getStep1User($message->email); $this->userManager->save($user, true); $isNewUser = true; + } elseif (!$user->isEmailConfirmed()) { + $this->userManager->refreshConfirmationToken($user); + $isNewUser = true; } // now create the invitation to the group. diff --git a/src/MessageHandler/Command/Product/DuplicateProductCommandHandler.php b/src/MessageHandler/Command/Product/DuplicateProductCommandHandler.php index 99997ef..619c585 100644 --- a/src/MessageHandler/Command/Product/DuplicateProductCommandHandler.php +++ b/src/MessageHandler/Command/Product/DuplicateProductCommandHandler.php @@ -21,7 +21,7 @@ class DuplicateProductCommandHandler public function __construct( private readonly ProductRepository $productRepository, private readonly ProductManager $productManager, - private readonly AuthorizationCheckerInterface $authorizationChecker + private readonly AuthorizationCheckerInterface $authorizationChecker, ) { } diff --git a/src/MessageHandler/Command/Security/AccountCreateStep1CommandHandler.php b/src/MessageHandler/Command/Security/AccountCreateStep1CommandHandler.php index 6a91d81..ecbbdbc 100644 --- a/src/MessageHandler/Command/Security/AccountCreateStep1CommandHandler.php +++ b/src/MessageHandler/Command/Security/AccountCreateStep1CommandHandler.php @@ -9,6 +9,7 @@ use App\Entity\User; use App\Mailer\AppMailer; use App\Mailer\Email\Security\CreateAccountStep1Email; use App\Message\Command\Security\AccountCreateStep1Command; +use App\Repository\UserRepository; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler] @@ -20,6 +21,7 @@ final class AccountCreateStep1CommandHandler public function __construct( private readonly UserManager $userManager, private readonly AppMailer $appMailer, + private readonly UserRepository $userRepository, ) { } @@ -31,6 +33,17 @@ final class AccountCreateStep1CommandHandler */ public function __invoke(AccountCreateStep1Command $message): void { + $existingUser = $this->userRepository->findOneByEmail($message->email); + if ($existingUser instanceof User) { + if (!$existingUser->isEmailConfirmed()) { + $this->userManager->refreshConfirmationToken($existingUser); + $this->userManager->save($existingUser, true); + $this->appMailer->send(CreateAccountStep1Email::class, ['user' => $existingUser]); + + return; + } + } + $user = new User(); $user->setEmail($message->email); $this->userManager->refreshConfirmationToken($user); diff --git a/src/MessageHandler/Command/User/ServiceRequest/TryAutoFinalizeCommandHandler.php b/src/MessageHandler/Command/User/ServiceRequest/TryAutoFinalizeCommandHandler.php index ee32566..2a456ff 100644 --- a/src/MessageHandler/Command/User/ServiceRequest/TryAutoFinalizeCommandHandler.php +++ b/src/MessageHandler/Command/User/ServiceRequest/TryAutoFinalizeCommandHandler.php @@ -22,7 +22,7 @@ final class TryAutoFinalizeCommandHandler public function __construct( private readonly ServiceRequestRepository $serviceRequestRepository, private readonly ServiceRequestManager $serviceRequestManager, - private readonly ServiceRequestStatusWorkflow $serviceRequestStatusWorkflow + private readonly ServiceRequestStatusWorkflow $serviceRequestStatusWorkflow, ) { } diff --git a/src/MessageHandler/Query/Admin/ParametersFormQueryHandler.php b/src/MessageHandler/Query/Admin/ParametersFormQueryHandler.php index 880999b..1b7638a 100644 --- a/src/MessageHandler/Query/Admin/ParametersFormQueryHandler.php +++ b/src/MessageHandler/Query/Admin/ParametersFormQueryHandler.php @@ -13,7 +13,7 @@ use Symfony\Component\Messenger\Attribute\AsMessageHandler; final class ParametersFormQueryHandler { public function __construct( - private readonly ConfigurationRepository $configurationRepository + private readonly ConfigurationRepository $configurationRepository, ) { } diff --git a/src/MessageHandler/Query/ServiceRequest/GetServiceRequestByIdQueryHandler.php b/src/MessageHandler/Query/ServiceRequest/GetServiceRequestByIdQueryHandler.php index 386e2a2..446e882 100644 --- a/src/MessageHandler/Query/ServiceRequest/GetServiceRequestByIdQueryHandler.php +++ b/src/MessageHandler/Query/ServiceRequest/GetServiceRequestByIdQueryHandler.php @@ -33,7 +33,7 @@ final class GetServiceRequestByIdQueryHandler } if (!$this->security->isGranted(ServiceRequestVoter::VIEW, $serviceRequest)) { - throw new AccessDeniedException(sprintf('Access to service request "%s" denied (not owner or recipient).', $message->id)); + throw new AccessDeniedException(\sprintf('Access to service request "%s" denied (not owner or recipient).', $message->id)); } return $serviceRequest; diff --git a/src/MessageHandler/Query/User/GetUserServicesQueryHandler.php b/src/MessageHandler/Query/User/GetUserServicesQueryHandler.php index f5e05f2..6d97a2d 100644 --- a/src/MessageHandler/Query/User/GetUserServicesQueryHandler.php +++ b/src/MessageHandler/Query/User/GetUserServicesQueryHandler.php @@ -17,8 +17,8 @@ use Webmozart\Assert\Assert; final class GetUserServicesQueryHandler { public function __construct( - private readonly ProductRepository $productRepository, - private readonly UserRepository $userRepository, + private readonly ProductRepository $productRepository, + private readonly UserRepository $userRepository, ) { } diff --git a/src/MessageHandler/Query/User/UserAddressQueryHandler.php b/src/MessageHandler/Query/User/UserAddressQueryHandler.php index 1e5e981..f5bd6eb 100644 --- a/src/MessageHandler/Query/User/UserAddressQueryHandler.php +++ b/src/MessageHandler/Query/User/UserAddressQueryHandler.php @@ -15,7 +15,7 @@ final class UserAddressQueryHandler private const WITH_LIMIT = 3; public function __construct( - private readonly GeoProviderInterface $geoProvider + private readonly GeoProviderInterface $geoProvider, ) { } diff --git a/src/Payment/PayumManager.php b/src/Payment/PayumManager.php index a7b4bbc..e169846 100644 --- a/src/Payment/PayumManager.php +++ b/src/Payment/PayumManager.php @@ -4,9 +4,10 @@ declare(strict_types=1); namespace App\Payment; -use App\Controller\Payment\PrepareAction; +use App\Controller\Payment\Group\PrepareAction; use App\Entity\GroupOffer; use App\Entity\Payment; +use App\Entity\PlatformOffer; use App\Entity\User; use App\Enum\Payment\PaymentMethod; use Payum\Core\Payum; @@ -20,7 +21,7 @@ final class PayumManager { public function __construct( private readonly Payum $payum, - #[Autowire('%env(string:PAYUM_GATEWAY)%')] private readonly string $payumGateway + #[Autowire('%env(string:PAYUM_GATEWAY)%')] private readonly string $payumGateway, ) { } @@ -29,20 +30,27 @@ final class PayumManager * * @see PrepareAction */ - public function getPayment(GroupOffer $groupOffer, User $user): Payment + public function getPayment(GroupOffer|PlatformOffer $offer, User $user): Payment { $storage = $this->payum->getStorage(Payment::class); - /** @var Payment $payment */ $payment = $storage->create(); $payment->setNumber(uniqid('payum_', true)); - $payment->setCurrencyCode($groupOffer->getCurrency()); - $payment->setTotalAmount($groupOffer->getPrice()); - $payment->setDescription($groupOffer->getGroup()->getName().' / '.$groupOffer->getName()); + $payment->setCurrencyCode($offer->getCurrency()); + $payment->setTotalAmount($offer->getPrice()); + + if ($offer instanceof GroupOffer) { + $payment->setDescription($offer->getGroup()->getName().' / '.$offer->getName()); + } + + if ($offer instanceof PlatformOffer) { + $payment->setDescription($offer->getConfiguration()?->getPlatformName().' / '.$offer->getName()); + } + $payment->setClientId((string) $user->getId()); $payment->setClientEmail($user->getEmail()); $payment->setUser($user); - $payment->setDetails($this->getGatewayDetails($groupOffer)); + $payment->setDetails($this->getGatewayDetails($offer)); $storage->update($payment); return $payment; @@ -61,16 +69,27 @@ final class PayumManager * * @return array */ - private function getGatewayDetails(GroupOffer $groupOffer): array + private function getGatewayDetails(GroupOffer|PlatformOffer $offer): array { - return [ - // method must be set as the default value is not retrieved from the gateway configuration - 'method' => PaymentMethod::CREDITCARD->value, - 'metadata' => [ - 'groupId' => (string) $groupOffer->getGroup()->getId(), - 'groupOfferId' => (string) $groupOffer->getId(), - ], - ]; + if ($offer instanceof GroupOffer) { + return [ + // method must be set as the default value is not retrieved from the gateway configuration + 'method' => PaymentMethod::CREDITCARD->value, + 'metadata' => [ + 'groupId' => (string) $offer->getGroup()->getId(), + 'groupOfferId' => (string) $offer->getId(), + ], + ]; + } else { + return [ + // method must be set as the default value is not retrieved from the gateway configuration + 'method' => PaymentMethod::CREDITCARD->value, + 'metadata' => [ + 'platformId' => (string) $offer->getConfiguration()?->getId(), + 'platformOfferId' => (string) $offer->getId(), + ], + ]; + } } /** diff --git a/src/Repository/CategoryRepository.php b/src/Repository/CategoryRepository.php index 98f82c7..e23322d 100644 --- a/src/Repository/CategoryRepository.php +++ b/src/Repository/CategoryRepository.php @@ -8,7 +8,6 @@ use App\Entity\Category; use App\Entity\Product; use App\Entity\User; use App\Enum\Product\ProductType; -use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\QueryBuilder; @@ -16,7 +15,7 @@ use Doctrine\Persistence\ManagerRegistry; use Gedmo\Tree\Entity\Repository\NestedTreeRepository; /** - * #@extends ServiceEntityRepository. + * @extends NestedTreeRepository. * * @method Category|null find($id, $lockMode = null, $lockVersion = null) * @method Category|null findOneBy(array $criteria, array $orderBy = null) diff --git a/src/Repository/ConfigurationRepository.php b/src/Repository/ConfigurationRepository.php index 9601154..c2f392d 100644 --- a/src/Repository/ConfigurationRepository.php +++ b/src/Repository/ConfigurationRepository.php @@ -61,13 +61,13 @@ final class ConfigurationRepository extends ServiceEntityRepository public function getServicesParameter(): bool { - /** @var array{configuration: array{ services: array{ servicesEnabled: bool }}} $config */ + /** @var array{configuration: array{ global: array{ globalServicesEnabled: bool }}} $config */ $config = $this ->createQueryBuilder('c') ->select('c.configuration') ->setMaxResults(1) ->getQuery()->getOneOrNullResult(); - return $config['configuration']['services']['servicesEnabled']; + return $config['configuration']['global']['globalServicesEnabled']; } } diff --git a/src/Repository/GroupOfferRepository.php b/src/Repository/GroupOfferRepository.php index cda327c..c287314 100644 --- a/src/Repository/GroupOfferRepository.php +++ b/src/Repository/GroupOfferRepository.php @@ -28,7 +28,7 @@ class GroupOfferRepository extends ServiceEntityRepository /** * Return an object or throws an exception if not found. */ - public function get(mixed $id, int|null $lockMode = null, int|null $lockVersion = null): GroupOffer + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): GroupOffer { return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('Group offer not found.'); } diff --git a/src/Repository/GroupRepository.php b/src/Repository/GroupRepository.php index 65a01b6..27c93f8 100644 --- a/src/Repository/GroupRepository.php +++ b/src/Repository/GroupRepository.php @@ -8,6 +8,7 @@ use App\Entity\Group; use App\Entity\User; use App\Entity\UserGroup; use App\Enum\Group\GroupType; +use App\Enum\Group\UserMembership; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; @@ -33,7 +34,7 @@ final class GroupRepository extends ServiceEntityRepository /** * Return an object or throws an exception if not found. */ - public function get(mixed $id, int|null $lockMode = null, int|null $lockVersion = null): Group + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): Group { return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('Group not found.'); } @@ -79,6 +80,64 @@ final class GroupRepository extends ServiceEntityRepository return $qb->orderBy('g.name', 'ASC')->getQuery(); } + public function getUserGroupsWithEnabledServices(User $user): QueryBuilder + { + return $this->getUserGroups($user) + ->andWhere('g.servicesEnabled = :enabled') + ->setParameter('enabled', true); + } + + /** + * @return Group[] + */ + public function getGroupsByEnabledServices(bool $servicesEnabled, ?User $user = null, bool $admin = true): array + { + $qb = $this->createQueryBuilder('g') + ->andWhere('g.servicesEnabled = :servicesEnabled') + ->setParameter('servicesEnabled', $servicesEnabled); + + if ($user instanceof User) { + $qb + ->leftJoin('g.userGroups', 'gu') + ->andWhere('gu.user = :user') + ->setParameter('user', $user); + + if ($admin) { + $qb + ->andWhere('gu.mainAdminAccount = :mainAdminAccount OR gu.membership = :membership') + ->setParameter('mainAdminAccount', true) + ->setParameter('membership', UserMembership::ADMIN) + ; + } + } + + /** @var Group[] */ + return $qb + ->getQuery() + ->getResult(); + } + + /** + * @param Group[] $groups + */ + public function disableServicesForAllGroups(array $groups): void + { + foreach ($groups as $group) { + $group->setServicesEnabled(false); + $this->getEntityManager()->persist($group); + } + $this->getEntityManager()->flush(); + } + + public function disableServicesForChildGroup(Group $group): void + { + foreach ($group->getChildrenRecursively() as $child) { + $child->setServicesEnabled(false); + $this->getEntityManager()->persist($child); + } + $this->getEntityManager()->flush(); + } + public function getUserGroups(User $user): QueryBuilder { return $this->createQueryBuilder('g') diff --git a/src/Repository/PaymentRepository.php b/src/Repository/PaymentRepository.php index d9f26c7..4d1899c 100644 --- a/src/Repository/PaymentRepository.php +++ b/src/Repository/PaymentRepository.php @@ -25,7 +25,7 @@ final class PaymentRepository extends ServiceEntityRepository parent::__construct($registry, self::ENTITY_CLASS); } - public function get(mixed $id, int|null $lockMode = null, int|null $lockVersion = null): Payment + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): Payment { return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('Payment not found.'); } diff --git a/src/Repository/PlatformOfferRepository.php b/src/Repository/PlatformOfferRepository.php new file mode 100644 index 0000000..9511f87 --- /dev/null +++ b/src/Repository/PlatformOfferRepository.php @@ -0,0 +1,56 @@ + + * + * @method PlatformOffer|null find($id, $lockMode = null, $lockVersion = null) + * @method PlatformOffer|null findOneBy(array $criteria, array $orderBy = null) + * @method PlatformOffer[] findAll() + * @method PlatformOffer[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) + */ +class PlatformOfferRepository extends ServiceEntityRepository +{ + private const ENTITY_CLASS = PlatformOffer::class; + + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, self::ENTITY_CLASS); + } + + /** + * Return an object or throws an exception if not found. + */ + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): PlatformOffer + { + return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('Platform offer not found.'); + } + + public function findOneActive(string $id): ?PlatformOffer + { + return $this->findOneBy(['id' => $id, 'active' => true]); + } + + /** + * @throws NonUniqueResultException + */ + public function findLowOffer(): ?PlatformOffer + { + /** @var ?PlatformOffer */ + return $this + ->createQueryBuilder('o') + ->andWhere('o.active = true') + ->orderBy('o.price', 'ASC') + ->getQuery() + ->setMaxResults(1) + ->getOneOrNullResult(); + } +} diff --git a/src/Repository/ProductAvailabilityRepository.php b/src/Repository/ProductAvailabilityRepository.php index 8d7af14..95f5e4d 100644 --- a/src/Repository/ProductAvailabilityRepository.php +++ b/src/Repository/ProductAvailabilityRepository.php @@ -31,7 +31,7 @@ final class ProductAvailabilityRepository extends ServiceEntityRepository /** * Return product availability or throws an exception if not found. */ - public function get(mixed $id, int|null $lockMode = null, int|null $lockVersion = null): ProductAvailability + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): ProductAvailability { return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('ProductAvailability not found.'); } diff --git a/src/Repository/ProductRepository.php b/src/Repository/ProductRepository.php index f61bebd..b89d74f 100644 --- a/src/Repository/ProductRepository.php +++ b/src/Repository/ProductRepository.php @@ -34,7 +34,7 @@ class ProductRepository extends ServiceEntityRepository /** * Return an object or throws an exception if not found. */ - public function get(mixed $id, int|null $lockMode = null, int|null $lockVersion = null): Product + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): Product { return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('Product not found.'); } diff --git a/src/Repository/ServiceRequestRepository.php b/src/Repository/ServiceRequestRepository.php index 971ced9..8ebaa26 100644 --- a/src/Repository/ServiceRequestRepository.php +++ b/src/Repository/ServiceRequestRepository.php @@ -35,7 +35,7 @@ final class ServiceRequestRepository extends ServiceEntityRepository /** * Return an object or throws an exception if not found. */ - public function get(mixed $id, int|null $lockMode = null, int|null $lockVersion = null): ServiceRequest + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): ServiceRequest { return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('Service request not found.'); } @@ -101,15 +101,15 @@ final class ServiceRequestRepository extends ServiceEntityRepository */ public function getActionSoon(string $property, int $days = 1): Query { - $from = new \DateTimeImmutable(sprintf('+%d days midnight', $days)); + $from = new \DateTimeImmutable(\sprintf('+%d days midnight', $days)); $to = $from->modify('+ 1 day'); // just add one day for the end limit $qb = $this ->createQueryBuilder('sr') ->innerJoin('sr.owner', 'o') ->innerJoin('sr.recipient', 'g') - ->andWhere(sprintf('sr.%s >= :from', $property)) - ->andWhere(sprintf('sr.%s < :to', $property)) + ->andWhere(\sprintf('sr.%s >= :from', $property)) + ->andWhere(\sprintf('sr.%s < :to', $property)) ->setParameter('from', $from->format('Y-m-d')) ->setParameter('to', $to->format('Y-m-d')) ->andWhere('sr.status = :status') diff --git a/src/Repository/UserGroupRepository.php b/src/Repository/UserGroupRepository.php index 1db29dc..2501adf 100644 --- a/src/Repository/UserGroupRepository.php +++ b/src/Repository/UserGroupRepository.php @@ -86,7 +86,7 @@ class UserGroupRepository extends ServiceEntityRepository */ public function getExpiring(int $days): Query { - $from = new \DateTimeImmutable(sprintf('+%d days midnight', $days)); + $from = new \DateTimeImmutable(\sprintf('+%d days midnight', $days)); $to = $from->modify('+ 1 day'); // just add one day for the end limit $qb = $this diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index f82f0a2..2515d1c 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -6,9 +6,11 @@ namespace App\Repository; use App\Entity\User; use App\Enum\User\UserType; +use Carbon\Carbon; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; +use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; @@ -36,7 +38,7 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader /** * Return object or throws an exception if not found. */ - public function get(mixed $id, int|null $lockMode = null, int|null $lockVersion = null): User + public function get(mixed $id, ?int $lockMode = null, ?int $lockVersion = null): User { return $this->find($id, $lockMode, $lockVersion) ?? throw new \LogicException('User not found.'); } @@ -71,7 +73,7 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void { if (!$user instanceof User) { - throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', \get_class($user))); + throw new UnsupportedUserException(\sprintf('Instances of "%s" are not supported.', \get_class($user))); } $user->setPassword($newHashedPassword); @@ -147,4 +149,32 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader ->getQuery() ->getSingleScalarResult(); } + + public function getExpiredMembership(): Query + { + $today = Carbon::today(); + $qb = $this + ->createQueryBuilder('u') + ->andWhere('u.endAt < :date') + ->setParameter('date', $today->format('Y-m-d')) + ; + + return $qb->getQuery(); + } + + public function getExpiring(int $days): Query + { + $from = new \DateTimeImmutable(\sprintf('+%d days midnight', $days)); + $to = $from->modify('+ 1 day'); // just add one day for the end limit + + $qb = $this + ->createQueryBuilder('u') + ->andWhere('u.endAt >= :from') + ->andWhere('u.endAt < :to') + ->setParameter('from', $from->format('Y-m-d')) + ->setParameter('to', $to->format('Y-m-d')) + ; + + return $qb->getQuery(); + } } diff --git a/src/Search/Command/IndexProductsCommand.php b/src/Search/Command/IndexProductsCommand.php index fa78fbd..b6926ad 100644 --- a/src/Search/Command/IndexProductsCommand.php +++ b/src/Search/Command/IndexProductsCommand.php @@ -70,20 +70,20 @@ final class IndexProductsCommand extends Command foreach ($query->toIterable() as $product) { /** @var Product $product */ - $io->comment(sprintf(' > adding product %s to batch', $product->getId())); + $io->comment(\sprintf(' > adding product %s to batch', $product->getId())); $toIndex[] = $product; if ((\count($toIndex) % $batchSize) === 0) { $this->meilisearch->indexProducts($toIndex, $swapIndex); - $io->note(sprintf(' > indexing %d product(s) from batch', \count($toIndex))); + $io->note(\sprintf(' > indexing %d product(s) from batch', \count($toIndex))); $toIndex = []; } ++$count; } $this->meilisearch->indexProducts($toIndex, $swapIndex); - $io->note(sprintf(' > indexing %d remaining product(s) from batch', \count($toIndex))); + $io->note(\sprintf(' > indexing %d remaining product(s) from batch', \count($toIndex))); - $io->note(sprintf(' -> %d product(s) indexed.', $count)); + $io->note(\sprintf(' -> %d product(s) indexed.', $count)); $io->note(' -> DONE'); $io->newLine(); diff --git a/src/Search/Meilisearch.php b/src/Search/Meilisearch.php index ad94dcd..7ed55c3 100755 --- a/src/Search/Meilisearch.php +++ b/src/Search/Meilisearch.php @@ -190,7 +190,7 @@ class Meilisearch /** * Search with a main query and various filtery. */ - public function search(Search $searchDto, ProductType $productType = null): SearchResult + public function search(Search $searchDto, ?ProductType $productType = null): SearchResult { $searchParams = []; $searchParams = $this->withFilters($searchParams, $searchDto, $productType); @@ -240,13 +240,13 @@ class Meilisearch // place filter if ($searchDto->place !== null) { - $filters[] = sprintf('ownerId = %s', $searchDto->place->getId()); + $filters[] = \sprintf('ownerId = %s', $searchDto->place->getId()); } // geo filter if ($searchDto->hasProximity()) { Assert::isInstanceOf($searchDto->city, Address::class); - $filters[] = sprintf('_geoRadius(%s, %s, %d)', + $filters[] = \sprintf('_geoRadius(%s, %s, %d)', $searchDto->city->getLatitude(), $searchDto->city->getLongitude(), (int) $searchDto->distance * 1000 // the distance is in meters, not kilometers @@ -271,7 +271,7 @@ class Meilisearch // the proximity search has the priority to sort results if ($searchDto->hasProximity()) { Assert::isInstanceOf($searchDto->city, Address::class); - $searchParams['sort'] = [sprintf('_geoPoint(%s, %s):asc', + $searchParams['sort'] = [\sprintf('_geoPoint(%s, %s):asc', $searchDto->city->getLatitude(), $searchDto->city->getLongitude()), ]; @@ -309,6 +309,9 @@ class Meilisearch if ($product === null) { return null; } + if ($product->getOwner()->isInVacation()) { + return null; + } // enrich with the distance to the geoPoint if it is available if (\array_key_exists('_geoDistance', $hit)) { diff --git a/src/Security/Checker/AuthorizationChecker.php b/src/Security/Checker/AuthorizationChecker.php index a64b6e9..84fc034 100644 --- a/src/Security/Checker/AuthorizationChecker.php +++ b/src/Security/Checker/AuthorizationChecker.php @@ -11,7 +11,7 @@ use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; final class AuthorizationChecker { public function __construct( - public readonly AuthorizationCheckerInterface $authorizationChecker + public readonly AuthorizationCheckerInterface $authorizationChecker, ) { } diff --git a/src/Security/EntryPoint/AuthenticationEntryPoint.php b/src/Security/EntryPoint/AuthenticationEntryPoint.php index 644010c..7114929 100644 --- a/src/Security/EntryPoint/AuthenticationEntryPoint.php +++ b/src/Security/EntryPoint/AuthenticationEntryPoint.php @@ -23,11 +23,11 @@ use function Symfony\Component\String\u; class AuthenticationEntryPoint implements AuthenticationEntryPointInterface { public function __construct( - private readonly UrlGeneratorInterface $urlGenerator + private readonly UrlGeneratorInterface $urlGenerator, ) { } - public function start(Request $request, AuthenticationException $authException = null): RedirectResponse + public function start(Request $request, ?AuthenticationException $authException = null): RedirectResponse { /** @var string $route */ $route = $request->attributes->get('_route'); diff --git a/src/Security/Voter/MembershipPaidVoter.php b/src/Security/Voter/MembershipPaidVoter.php new file mode 100644 index 0000000..f97d156 --- /dev/null +++ b/src/Security/Voter/MembershipPaidVoter.php @@ -0,0 +1,34 @@ +getUser(); + + if (!$user instanceof User) { + return false; + } + + return !$this->configurationRepository->getInstanceConfigurationOrCreate()->getPaidMembership() || $user->isMembershipPaid(); + } +} diff --git a/src/Security/Voter/ProductVoter.php b/src/Security/Voter/ProductVoter.php index aed94cd..27df9d7 100644 --- a/src/Security/Voter/ProductVoter.php +++ b/src/Security/Voter/ProductVoter.php @@ -51,7 +51,7 @@ final class ProductVoter extends Voter self::DUPLICATE => $this->canDuplicate($subject, $user), self::BORROW => $this->canBorrow($subject, $user), self::DELETE => $this->canDelete($subject, $user), - default => throw new \LogicException('This code should not be reached!') + default => throw new \LogicException('This code should not be reached!'), }; } diff --git a/src/Security/Voter/ServiceRequest/ServiceRequestVoter.php b/src/Security/Voter/ServiceRequest/ServiceRequestVoter.php index c4709fa..dd47d91 100644 --- a/src/Security/Voter/ServiceRequest/ServiceRequestVoter.php +++ b/src/Security/Voter/ServiceRequest/ServiceRequestVoter.php @@ -38,7 +38,7 @@ class ServiceRequestVoter extends Voter return match ($attribute) { self::VIEW => $this->canView($subject, $user), - default => throw new \LogicException('This code should not be reached!') + default => throw new \LogicException('This code should not be reached!'), }; } diff --git a/src/Serializer/ProductDocumentNormalizer.php b/src/Serializer/ProductDocumentNormalizer.php index e34b23b..8ad754c 100644 --- a/src/Serializer/ProductDocumentNormalizer.php +++ b/src/Serializer/ProductDocumentNormalizer.php @@ -17,7 +17,7 @@ final class ProductDocumentNormalizer implements NormalizerInterface */ public function __construct( #[Autowire(service: ObjectNormalizer::class)] - private readonly NormalizerInterface $normalizer + private readonly NormalizerInterface $normalizer, ) { } @@ -28,7 +28,7 @@ final class ProductDocumentNormalizer implements NormalizerInterface * * @throws ExceptionInterface */ - public function normalize(mixed $object, string $format = null, array $context = []): array + public function normalize(mixed $object, ?string $format = null, array $context = []): array { /** @var array $data */ $data = $this->normalizer->normalize($object, $format, $context); @@ -46,7 +46,7 @@ final class ProductDocumentNormalizer implements NormalizerInterface /** * @param array $context */ - public function supportsNormalization($data, string $format = null, array $context = []): bool + public function supportsNormalization($data, ?string $format = null, array $context = []): bool { return $data instanceof ProductDocument; } diff --git a/src/State/GroupGetStatsProvider.php b/src/State/GroupGetStatsProvider.php index 3a9a372..8ce9e68 100644 --- a/src/State/GroupGetStatsProvider.php +++ b/src/State/GroupGetStatsProvider.php @@ -15,11 +15,11 @@ use App\Repository\GroupRepository; final class GroupGetStatsProvider implements ProviderInterface { public function __construct( - readonly private GroupRepository $groupRepository + readonly private GroupRepository $groupRepository, ) { } - public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null // @phpstan-ignore-line + public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null { $groupStats = new GroupResource(); $groupStats->count = $this->groupRepository->count([]); diff --git a/src/State/GroupsProvider.php b/src/State/GroupsProvider.php new file mode 100644 index 0000000..d52cded --- /dev/null +++ b/src/State/GroupsProvider.php @@ -0,0 +1,36 @@ + + */ +class GroupsProvider implements ProviderInterface +{ + public function __construct( + readonly private GroupRepository $groupRepository, + readonly private UserRepository $userRepository, + ) { + } + + public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null + { + if (isset($context['filters']['user'])) { // @phpstan-ignore-line + $user = $this->userRepository->find($context['filters']['user']); + + $admin = (bool) ($context['filters']['admin'] ?? true); // @phpstan-ignore-line + + return $this->groupRepository->getGroupsByEnabledServices($context['filters']['services_enabled'] === 'true', $user, $admin); // @phpstan-ignore-line + } + + return $this->groupRepository->getGroupsByEnabledServices($context['filters']['services_enabled'] === 'true'); // @phpstan-ignore-line + } +} diff --git a/src/State/Processor/GroupChildServicesEnabledProcessor.php b/src/State/Processor/GroupChildServicesEnabledProcessor.php new file mode 100644 index 0000000..ce5141b --- /dev/null +++ b/src/State/Processor/GroupChildServicesEnabledProcessor.php @@ -0,0 +1,28 @@ + + */ +class GroupChildServicesEnabledProcessor implements ProcessorInterface +{ + public function __construct( + private readonly GroupRepository $groupRepository, + ) { + } + + public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): Group + { + $this->groupRepository->disableServicesForChildGroup($data); + + return $data; + } +} diff --git a/src/State/Processor/ProductSwitchProcessor.php b/src/State/Processor/ProductSwitchProcessor.php index 86e66bb..355082d 100644 --- a/src/State/Processor/ProductSwitchProcessor.php +++ b/src/State/Processor/ProductSwitchProcessor.php @@ -8,25 +8,21 @@ use ApiPlatform\Metadata\Operation; use ApiPlatform\State\ProcessorInterface; use App\Entity\Product; use App\Repository\ProductRepository; -use Webmozart\Assert\Assert; /** * Change the status of a product from active to paused or the opposite. + * + * @implements ProcessorInterface */ final class ProductSwitchProcessor implements ProcessorInterface { public function __construct( - private readonly ProductRepository $productRepository + private readonly ProductRepository $productRepository, ) { } - /** - * @param array $uriVariables - * @param array $context - */ public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): Product { - Assert::isInstanceOf($data, Product::class); $data->switchStatus(); $this->productRepository->save($data, true); diff --git a/src/Subscriber/Workflow/Guard/ServiceRequestAcceptTransitionSubscriber.php b/src/Subscriber/Workflow/Guard/ServiceRequestAcceptTransitionSubscriber.php index 39e5cf8..427c4c3 100644 --- a/src/Subscriber/Workflow/Guard/ServiceRequestAcceptTransitionSubscriber.php +++ b/src/Subscriber/Workflow/Guard/ServiceRequestAcceptTransitionSubscriber.php @@ -17,7 +17,7 @@ use Symfony\Component\Workflow\Event\GuardEvent; final class ServiceRequestAcceptTransitionSubscriber implements EventSubscriberInterface { public function __construct( - public readonly Security $security + public readonly Security $security, ) { } diff --git a/src/Subscriber/Workflow/Guard/ServiceRequestAutoFinalizeTransitionSubscriber.php b/src/Subscriber/Workflow/Guard/ServiceRequestAutoFinalizeTransitionSubscriber.php index a68892d..2758344 100644 --- a/src/Subscriber/Workflow/Guard/ServiceRequestAutoFinalizeTransitionSubscriber.php +++ b/src/Subscriber/Workflow/Guard/ServiceRequestAutoFinalizeTransitionSubscriber.php @@ -16,7 +16,7 @@ use Symfony\Component\Workflow\Event\GuardEvent; final class ServiceRequestAutoFinalizeTransitionSubscriber implements EventSubscriberInterface { public function __construct( - public readonly Security $security + public readonly Security $security, ) { } diff --git a/src/Subscriber/Workflow/Guard/ServiceRequestConfirmTransitionSubscriber.php b/src/Subscriber/Workflow/Guard/ServiceRequestConfirmTransitionSubscriber.php index 063dc6a..dfda131 100644 --- a/src/Subscriber/Workflow/Guard/ServiceRequestConfirmTransitionSubscriber.php +++ b/src/Subscriber/Workflow/Guard/ServiceRequestConfirmTransitionSubscriber.php @@ -17,7 +17,7 @@ use Symfony\Component\Workflow\Event\GuardEvent; final class ServiceRequestConfirmTransitionSubscriber implements EventSubscriberInterface { public function __construct( - public readonly Security $security + public readonly Security $security, ) { } diff --git a/src/Subscriber/Workflow/Guard/ServiceRequestFinalizeTransitionSubscriber.php b/src/Subscriber/Workflow/Guard/ServiceRequestFinalizeTransitionSubscriber.php index 851b6b2..92f59d8 100644 --- a/src/Subscriber/Workflow/Guard/ServiceRequestFinalizeTransitionSubscriber.php +++ b/src/Subscriber/Workflow/Guard/ServiceRequestFinalizeTransitionSubscriber.php @@ -17,7 +17,7 @@ use Symfony\Component\Workflow\Event\GuardEvent; final class ServiceRequestFinalizeTransitionSubscriber implements EventSubscriberInterface { public function __construct( - public readonly Security $security + public readonly Security $security, ) { } diff --git a/src/Subscriber/Workflow/Guard/ServiceRequestModifyOwnerTransitionSubscriber.php b/src/Subscriber/Workflow/Guard/ServiceRequestModifyOwnerTransitionSubscriber.php index c1f7d36..fc9885e 100644 --- a/src/Subscriber/Workflow/Guard/ServiceRequestModifyOwnerTransitionSubscriber.php +++ b/src/Subscriber/Workflow/Guard/ServiceRequestModifyOwnerTransitionSubscriber.php @@ -17,7 +17,7 @@ use Symfony\Component\Workflow\Event\GuardEvent; final class ServiceRequestModifyOwnerTransitionSubscriber implements EventSubscriberInterface { public function __construct( - public readonly Security $security + public readonly Security $security, ) { } diff --git a/src/Subscriber/Workflow/Guard/ServiceRequestModifyRecipientTransitionSubscriber.php b/src/Subscriber/Workflow/Guard/ServiceRequestModifyRecipientTransitionSubscriber.php index ff6b076..0bc56c0 100644 --- a/src/Subscriber/Workflow/Guard/ServiceRequestModifyRecipientTransitionSubscriber.php +++ b/src/Subscriber/Workflow/Guard/ServiceRequestModifyRecipientTransitionSubscriber.php @@ -17,7 +17,7 @@ use Symfony\Component\Workflow\Event\GuardEvent; final class ServiceRequestModifyRecipientTransitionSubscriber implements EventSubscriberInterface { public function __construct( - public readonly Security $security + public readonly Security $security, ) { } diff --git a/src/Subscriber/Workflow/ServiceRequestFinishedSubscriber.php b/src/Subscriber/Workflow/ServiceRequestFinishedSubscriber.php index 0128775..6f94a4b 100644 --- a/src/Subscriber/Workflow/ServiceRequestFinishedSubscriber.php +++ b/src/Subscriber/Workflow/ServiceRequestFinishedSubscriber.php @@ -54,7 +54,7 @@ final class ServiceRequestFinishedSubscriber implements EventSubscriberInterface $this->createSystemMessage($serviceRequest, $serviceRequest->getFinalizedAt()); } - private function createSystemMessage(ServiceRequest $serviceRequest, \DateTimeImmutable $createdAt = null): void + private function createSystemMessage(ServiceRequest $serviceRequest, ?\DateTimeImmutable $createdAt = null): void { $systemMessage = $this->messageManager->createSystemMessage( $serviceRequest, diff --git a/src/Subscriber/Workflow/ServiceRequestModifiedByOwnerSubscriber.php b/src/Subscriber/Workflow/ServiceRequestModifiedByOwnerSubscriber.php index 855562c..15d1757 100644 --- a/src/Subscriber/Workflow/ServiceRequestModifiedByOwnerSubscriber.php +++ b/src/Subscriber/Workflow/ServiceRequestModifiedByOwnerSubscriber.php @@ -58,8 +58,8 @@ final class ServiceRequestModifiedByOwnerSubscriber implements EventSubscriberIn $serviceRequest, self::MESSAGE_SYSTEM_MODIFIED_BY_OWNER.'.'.$product->getType()->value, [ - '%startAt%' => $serviceRequest->getStartAt()->format($dateFormat), - '%endAt%' => $serviceRequest->getEndAt()->format($dateFormat), + '%startAt%' => $serviceRequest->getStartAt()->format($dateFormat), + '%endAt%' => $serviceRequest->getEndAt()->format($dateFormat), ] ); $this->messageManager->save($systemMessage, true); diff --git a/src/Test/ContainerRepositoryTrait.php b/src/Test/ContainerRepositoryTrait.php index a718071..81d7e32 100755 --- a/src/Test/ContainerRepositoryTrait.php +++ b/src/Test/ContainerRepositoryTrait.php @@ -15,6 +15,7 @@ use App\Repository\MenuItemRepository; use App\Repository\MenuRepository; use App\Repository\MessageRepository; use App\Repository\PaymentRepository; +use App\Repository\PlatformOfferRepository; use App\Repository\ProductAvailabilityRepository; use App\Repository\ProductRepository; use App\Repository\ServiceRequestRepository; @@ -113,4 +114,9 @@ trait ContainerRepositoryTrait { return self::getContainer()->get(ServiceRequestRepository::class); } + + public function getPlatformOfferRepository(): PlatformOfferRepository + { + return self::getContainer()->get(PlatformOfferRepository::class); + } } diff --git a/src/Translator/NoTranslator.php b/src/Translator/NoTranslator.php index 08a007a..7f177a3 100644 --- a/src/Translator/NoTranslator.php +++ b/src/Translator/NoTranslator.php @@ -21,7 +21,7 @@ final class NoTranslator implements TranslatorInterface, TranslatorBagInterface, * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator */ public function __construct( - private readonly TranslatorInterface $translator + private readonly TranslatorInterface $translator, ) { } @@ -31,12 +31,12 @@ final class NoTranslator implements TranslatorInterface, TranslatorBagInterface, * * @param array $parameters */ - public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string + public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string { // to find EasyAdmin translations codes, uncomment this -// if ($domain === 'EasyAdminBundle') { -// dump($id); -// } + // if ($domain === 'EasyAdminBundle') { + // dump($id); + // } return $id; } @@ -46,7 +46,7 @@ final class NoTranslator implements TranslatorInterface, TranslatorBagInterface, return $this->translator->getCatalogues(); } - public function getCatalogue(string $locale = null): MessageCatalogueInterface + public function getCatalogue(?string $locale = null): MessageCatalogueInterface { return $this->translator->getCatalogue($locale); } diff --git a/src/Validator/Constraints/User/MembershipPaid.php b/src/Validator/Constraints/User/MembershipPaid.php new file mode 100644 index 0000000..e19d61c --- /dev/null +++ b/src/Validator/Constraints/User/MembershipPaid.php @@ -0,0 +1,18 @@ +isMembershipPaid()) { + return; + } + + $platformOffer = $value->getPlatformOffer(); + if (null === $platformOffer) { + $this->context->buildViolation($constraint->message) + ->atPath('platformOffer') + ->addViolation(); + + return; + } + if (null === $value->getStartAt()) { + $this->context->buildViolation($constraint->message) + ->atPath('startAt') + ->addViolation(); + } + + match ($platformOffer->getType()) { + OfferType::YEARLY, OfferType::MONTHLY => $this->checkEndAt($value, $constraint), + OfferType::ONESHOT => null, + }; + } + + private function checkEndAt(User $value, MembershipPaid $constraint): void + { + if (null === $value->getEndAt()) { + $this->context->buildViolation($constraint->message) + ->atPath('endAt') + ->addViolation(); + } + } +} diff --git a/src/Validator/Constraints/User/UniqueUser.php b/src/Validator/Constraints/User/UniqueUser.php new file mode 100644 index 0000000..c3f7159 --- /dev/null +++ b/src/Validator/Constraints/User/UniqueUser.php @@ -0,0 +1,18 @@ +userRepository->findOneByEmail($value->getEmail()); + + if (null === $existingUser) { + return; + } + + if (!$existingUser->isEmailConfirmed()) { + return; + } + + $this->context->buildViolation($constraint->message) + ->atPath('email') + ->addViolation(); + } +} diff --git a/src/Workflow/ServiceRequestStatusWorkflow.php b/src/Workflow/ServiceRequestStatusWorkflow.php index b995aeb..8697de7 100644 --- a/src/Workflow/ServiceRequestStatusWorkflow.php +++ b/src/Workflow/ServiceRequestStatusWorkflow.php @@ -31,7 +31,7 @@ final class ServiceRequestStatusWorkflow public const WORKFLOW_SERVICE_REQUEST_COMPLETED_AUTO_FINALIZE_EVENT = 'workflow.service_request_status.completed.autoFinalize'; public function __construct( - private readonly WorkflowInterface $serviceRequestStatusStateMachine + private readonly WorkflowInterface $serviceRequestStatusStateMachine, ) { } @@ -66,7 +66,7 @@ final class ServiceRequestStatusWorkflow private function getException(ServiceRequest $sr, ServiceRequestStatusTransition $transition): \LogicException { - return new \LogicException(sprintf(self::EXCEPTION_MESSAGE, $transition->name, $sr->getId(), $sr->getStatus()->value)); + return new \LogicException(\sprintf(self::EXCEPTION_MESSAGE, $transition->name, $sr->getId(), $sr->getStatus()->value)); } public function canAccept(ServiceRequest $sr): bool diff --git a/symfony.lock b/symfony.lock index 2073928..1072167 100644 --- a/symfony.lock +++ b/symfony.lock @@ -185,6 +185,15 @@ "config/packages/http_discovery.yaml" ] }, + "phpstan/phpstan": { + "version": "1.11", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "1.0", + "ref": "5e490cc197fb6bb1ae22e5abbc531ddc633b6767" + } + }, "phpunit/phpunit": { "version": "9.5", "recipe": { @@ -199,18 +208,6 @@ "tests/bootstrap.php" ] }, - "sensio/framework-extra-bundle": { - "version": "6.2", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "5.2", - "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" - }, - "files": [ - "config/packages/sensio_framework_extra.yaml" - ] - }, "snc/redis-bundle": { "version": "4.3", "recipe": { @@ -235,6 +232,15 @@ "config/packages/stof_doctrine_extensions.yaml" ] }, + "symfony/brevo-notifier": { + "version": "6.4", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.4", + "ref": "3ae8f4671b4c42babcf3c1ce306a85c6398474a5" + } + }, "symfony/console": { "version": "6.1", "recipe": { @@ -444,6 +450,15 @@ "config/packages/security.yaml" ] }, + "symfony/stimulus-bundle": { + "version": "2.18", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "2.8", + "ref": "9e33a8a3794b603fb4be6c04ee5ecab901ce549e" + } + }, "symfony/translation": { "version": "6.2", "recipe": { diff --git a/templates/admin/field/services_enabled.html.twig b/templates/admin/field/services_enabled.html.twig new file mode 100644 index 0000000..f87d522 --- /dev/null +++ b/templates/admin/field/services_enabled.html.twig @@ -0,0 +1,17 @@ +{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} +{# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} +{# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} +{% trans_default_domain 'EasyAdminBundle' %} + +{% if ea.crud.currentAction == 'detail' or not field.customOptions.get('renderAsSwitch') %} + + {{ (field.value == true ? 'label.true' : 'label.false')|trans }} + +{% else %} +
+ + +
+{% endif %} diff --git a/templates/admin/parameters.html.twig b/templates/admin/parameters.html.twig index 435fdda..b2fc959 100644 --- a/templates/admin/parameters.html.twig +++ b/templates/admin/parameters.html.twig @@ -14,12 +14,30 @@ {% block main %} {{ form_start(form) }}
-

{{ 'parameters.services.h2'|trans }}

+

{{ 'parameters.global.h2'|trans }}


- {{ form_widget(form.servicesEnabled) }} + {{ form_row(form.globalName) }} -

{{ 'parameters.senders.h2'|trans }}

+

{{ 'parameters.services.h3'|trans }}

+ + {{ form_widget(form.globalServicesEnabled) }} + +

{{ 'parameters.paid_membership.h3'|trans }}

+ + {{ form_widget(form.globalPaidMembership) }} + + + +

{{ 'parameters.senders.h2'|trans }}


{{ form_row(form.notificationsSenderEmail) }} diff --git a/templates/cms/page.html.twig b/templates/cms/page.html.twig index 9c3ef2d..3076cba 100644 --- a/templates/cms/page.html.twig +++ b/templates/cms/page.html.twig @@ -5,7 +5,7 @@ {% block title %}{{ page is not null ? page.name : brand }}{% endblock %} {% block body %} -
+
{% if page is not null %} {{ page.content|raw }} {% else %} diff --git a/templates/components/group/_modal_offers.html.twig b/templates/components/group/_modal_offers.html.twig index 3d3f2b7..31291b7 100644 --- a/templates/components/group/_modal_offers.html.twig +++ b/templates/components/group/_modal_offers.html.twig @@ -27,7 +27,7 @@
-
+ diff --git a/templates/email/command/end_platform_membership.html.twig b/templates/email/command/end_platform_membership.html.twig new file mode 100644 index 0000000..c4ad9c2 --- /dev/null +++ b/templates/email/command/end_platform_membership.html.twig @@ -0,0 +1,11 @@ +{% trans_default_domain 'email' %} + +{% set i18n_prefix = _self|i18n_prefix %} + +

{{ (i18n_prefix ~ '.h1')|trans }}

+ +

{{ (i18n_prefix ~ '.p1')|trans({'%endAt%': endAt|date('d-m-Y H:i:s'), '%platform%': platform}) }}

+ +{{ (i18n_prefix ~ '.loginLink')|trans }} + +

{{ brand }}

diff --git a/templates/email/command/notify_platform_membership_expiration.html.twig b/templates/email/command/notify_platform_membership_expiration.html.twig new file mode 100644 index 0000000..75f40a0 --- /dev/null +++ b/templates/email/command/notify_platform_membership_expiration.html.twig @@ -0,0 +1,9 @@ +{% trans_default_domain 'email' %} + +{% set i18n_prefix = _self|i18n_prefix %} + +

{{ (i18n_prefix ~ '.h1')|trans }}

+ +

{{ (i18n_prefix ~ '.p1')|trans({'%platform%': platform, '%days%': days}) }}

+ +

{{ brand }}

diff --git a/templates/email/payment/platform_membership_paid.html.twig b/templates/email/payment/platform_membership_paid.html.twig new file mode 100644 index 0000000..350a029 --- /dev/null +++ b/templates/email/payment/platform_membership_paid.html.twig @@ -0,0 +1,9 @@ +{% trans_default_domain 'email' %} + +{% set i18n_prefix = _self|i18n_prefix %} + +

{{ (i18n_prefix ~ '.h1')|trans }}

+ +

{{ (i18n_prefix ~ '.p1')|trans({'%startAt%': user.startAt, '%endAt%': user.endAt, '%platform%': platform}) }}

+ +

{{ brand }}

diff --git a/templates/pages/group/create.html.twig b/templates/pages/group/create.html.twig index 11ee476..a91f317 100644 --- a/templates/pages/group/create.html.twig +++ b/templates/pages/group/create.html.twig @@ -17,9 +17,20 @@ {{ form_row(form.name) }} {{ form_row(form.type) }} {{ form_row(form.membership) }} - {% if form.parent is defined and form.parent is not null %} - {{ form_row(form.parent) }} - {% endif %} + +
+ {% if form.servicesEnabled is defined %} +
+ {{ form_widget(form.servicesEnabled) }} +
+ {% endif %} + {% if form.parent is defined and form.parent is not null %} + {{ form_row(form.parent) }} + {% endif %} +
{{ form_widget(form.submit) }} {{ form_end(form) }}
diff --git a/templates/pages/group/show/_logged_with_link.html.twig b/templates/pages/group/show/_logged_with_link.html.twig index a6eefbc..eb8dc81 100644 --- a/templates/pages/group/show/_logged_with_link.html.twig +++ b/templates/pages/group/show/_logged_with_link.html.twig @@ -5,7 +5,8 @@ {% if not group.activeOffers.isEmpty %} {% include 'components/group/_first_offer.html.twig' with {group} %} {% include 'components/group/_modal_offers.html.twig' with { - offers: group.activeOffers + offers: group.activeOffers, + prepare_path: 'app_payment_prepare' } %} {# 2.1.2 otherwise it is a free group #} diff --git a/templates/pages/group/show/_logged_without_link.html.twig b/templates/pages/group/show/_logged_without_link.html.twig index 8a6922e..c5ade60 100644 --- a/templates/pages/group/show/_logged_without_link.html.twig +++ b/templates/pages/group/show/_logged_without_link.html.twig @@ -20,7 +20,8 @@ {% include 'components/group/_first_offer.html.twig' with {group} %} {% include 'components/group/_modal_offers.html.twig' with { - offers: group.activeOffers + offers: group.activeOffers, + prepare_path: 'app_payment_prepare' } %} {# 1.3 group is not correclty configured, it doesn't have any offer configured yet. #} diff --git a/templates/pages/redirect_to_payment.html.twig b/templates/pages/redirect_to_payment.html.twig new file mode 100644 index 0000000..7ac3c7a --- /dev/null +++ b/templates/pages/redirect_to_payment.html.twig @@ -0,0 +1,40 @@ +{% extends 'layout/base.html.twig' %} + +{% set i18n_prefix = _self|i18n_prefix %} + +{% block body %} +
+ {% include 'components/layout/_title_3.html.twig' with { + name: (i18n_prefix ~ '.title')|trans({'%name%': platformName}) + } %} + {% include 'components/layout/_text.html.twig' with { + text: (i18n_prefix ~ '.text')|trans + } %} + +
+

+ {{ (i18n_prefix ~ '.membership')|trans }} + + {{ (i18n_prefix ~ '.membership.start')|trans }} + {{ lowOffer.actualPrice|format_currency(lowOffer.currency) }} + +

+
+
+ +
+ + {% include 'components/group/_modal_offers.html.twig' with { + offers: offers, + prepare_path: 'app_platform_payment_prepare' + } %} +
+{% endblock %} diff --git a/tests/Functional/Controller/Admin/AdministratorCrudControllerTest.php b/tests/Functional/Controller/Admin/AdministratorCrudControllerTest.php index 8aeeb5d..854acf6 100644 --- a/tests/Functional/Controller/Admin/AdministratorCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/AdministratorCrudControllerTest.php @@ -20,7 +20,7 @@ final class AdministratorCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsUser16($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', AdministratorCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', AdministratorCrudController::class)); self::assertResponseStatusCodeSame(Response::HTTP_FORBIDDEN); } @@ -33,19 +33,19 @@ final class AdministratorCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', AdministratorCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', AdministratorCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); self::assertResponseIsSuccessful(); // new - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', AdministratorCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', AdministratorCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); @@ -69,7 +69,7 @@ final class AdministratorCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', AdministratorCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', AdministratorCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); @@ -93,7 +93,7 @@ final class AdministratorCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'connectAs', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'connectAs', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); self::assertResponseRedirects(); $client->followRedirects(); self::assertResponseRedirects(); @@ -107,10 +107,10 @@ final class AdministratorCrudControllerTest extends WebTestCase $client = self::createClient(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', AdministratorCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', AdministratorCrudController::class)); self::assertResponseIsSuccessful(); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'export', AdministratorCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'export', AdministratorCrudController::class)); self::assertResponseIsSuccessful(); } @@ -118,7 +118,7 @@ final class AdministratorCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'delete', AdministratorCrudController::class, TestReference::PLACE_7)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'delete', AdministratorCrudController::class, TestReference::PLACE_7)); self::assertResponseRedirects(); $client->followRedirects(); self::assertResponseRedirects(); @@ -133,7 +133,7 @@ final class AdministratorCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'delete', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'delete', AdministratorCrudController::class, TestReference::ADMIN_CAMILLE)); self::assertResponseStatusCodeSame(Response::HTTP_FORBIDDEN); } } diff --git a/tests/Functional/Controller/Admin/CategoryObjectCrudControllerTest.php b/tests/Functional/Controller/Admin/CategoryObjectCrudControllerTest.php index b1e98b6..e74e0d2 100644 --- a/tests/Functional/Controller/Admin/CategoryObjectCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/CategoryObjectCrudControllerTest.php @@ -28,11 +28,11 @@ final class CategoryObjectCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', CategoryObjectCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', CategoryObjectCrudController::class)); self::assertResponseIsSuccessful(); // edit - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); self::assertResponseIsSuccessful(); // upload @@ -48,7 +48,7 @@ final class CategoryObjectCrudControllerTest extends WebTestCase self::assertResponseIsSuccessful(); // delete file - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(self::SAVE_AND_CONTINUE_BUTTON_NAME)->form(); /** @var ChoiceFormField $choiceFormField */ @@ -60,21 +60,21 @@ final class CategoryObjectCrudControllerTest extends WebTestCase self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); self::assertResponseIsSuccessful(); // new - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', CategoryObjectCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', CategoryObjectCrudController::class)); self::assertResponseIsSuccessful(); // move up - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'moveUp', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'moveUp', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); self::assertResponseRedirects(); $client->followRedirect(); self::assertResponseIsSuccessful(); // move down - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'moveDown', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'moveDown', CategoryObjectCrudController::class, TestReference::CATEGORY_OBJECT_1)); self::assertResponseRedirects(); $client->followRedirect(); self::assertResponseIsSuccessful(); diff --git a/tests/Functional/Controller/Admin/CategoryServiceCrudControllerTest.php b/tests/Functional/Controller/Admin/CategoryServiceCrudControllerTest.php index bfde891..bf5fd68 100644 --- a/tests/Functional/Controller/Admin/CategoryServiceCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/CategoryServiceCrudControllerTest.php @@ -21,19 +21,19 @@ final class CategoryServiceCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', CategoryServiceCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', CategoryServiceCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', CategoryServiceCrudController::class, TestReference::CATEGORY_SERVICE_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', CategoryServiceCrudController::class, TestReference::CATEGORY_SERVICE_1)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', CategoryServiceCrudController::class, TestReference::CATEGORY_SERVICE_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', CategoryServiceCrudController::class, TestReference::CATEGORY_SERVICE_1)); self::assertResponseIsSuccessful(); // new - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', CategoryServiceCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', CategoryServiceCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); diff --git a/tests/Functional/Controller/Admin/Dev/DevToolsControllerTest.php b/tests/Functional/Controller/Admin/Dev/DevToolsControllerTest.php index 4b3aa48..caf666f 100644 --- a/tests/Functional/Controller/Admin/Dev/DevToolsControllerTest.php +++ b/tests/Functional/Controller/Admin/Dev/DevToolsControllerTest.php @@ -19,7 +19,7 @@ final class DevToolsControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL_CUSTOM_CONTROLLER, 'admin_dev_tools')); + $client->request('GET', \sprintf(TestReference::ADMIN_URL_CUSTOM_CONTROLLER, 'admin_dev_tools')); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/FooterCrudControllerTest.php b/tests/Functional/Controller/Admin/FooterCrudControllerTest.php index fae05e2..6b303bd 100644 --- a/tests/Functional/Controller/Admin/FooterCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/FooterCrudControllerTest.php @@ -25,15 +25,15 @@ class FooterCrudControllerTest extends WebTestCase $menu = $menuRepo->getByCode('footer'); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', FooterCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', FooterCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', FooterCrudController::class, $menu->getId())); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', FooterCrudController::class, $menu->getId())); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', FooterCrudController::class, $menu->getId())); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', FooterCrudController::class, $menu->getId())); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/FooterItemCrudControllerTest.php b/tests/Functional/Controller/Admin/FooterItemCrudControllerTest.php index 8d88d47..a32fe4d 100644 --- a/tests/Functional/Controller/Admin/FooterItemCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/FooterItemCrudControllerTest.php @@ -27,8 +27,8 @@ class FooterItemCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); - $dataId = sprintf("[data-id='%s']", TestReference::MENU_FOOTER_ITEM_FIRST); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', MenuItemFooterCrudController::class)); + $dataId = \sprintf("[data-id='%s']", TestReference::MENU_FOOTER_ITEM_FIRST); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', MenuItemFooterCrudController::class)); self::assertSelectorTextNotContains($dataId, 'menu.action.up_item'); self::assertSelectorTextContains($dataId, 'menu.action.down_item'); @@ -49,8 +49,8 @@ class FooterItemCrudControllerTest extends WebTestCase $client->followRedirects(); $this->loginAsAdmin($client); - $dataId = sprintf("[data-id='%s']", TestReference::MENU_FOOTER_ITEM_LAST); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', MenuItemFooterCrudController::class)); + $dataId = \sprintf("[data-id='%s']", TestReference::MENU_FOOTER_ITEM_LAST); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', MenuItemFooterCrudController::class)); self::assertSelectorTextContains($dataId, 'menu.action.up_item'); $upLink = $client->getCrawler()->filter($dataId.' .action-up')->link(); @@ -65,21 +65,21 @@ class FooterItemCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', MenuItemFooterCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', MenuItemFooterCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuItemFooterCrudController::class, TestReference::MENU_FOOTER_ITEM_FIRST)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuItemFooterCrudController::class, TestReference::MENU_FOOTER_ITEM_FIRST)); self::assertResponseIsSuccessful(); - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuItemFooterCrudController::class, TestReference::MENU_FOOTER_ITEM_LAST)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuItemFooterCrudController::class, TestReference::MENU_FOOTER_ITEM_LAST)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', MenuItemFooterCrudController::class, TestReference::MENU_FOOTER_ITEM_FIRST)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', MenuItemFooterCrudController::class, TestReference::MENU_FOOTER_ITEM_FIRST)); self::assertResponseIsSuccessful(); // new icon link - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', MenuItemMenuSocialNetwordFooterCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', MenuItemMenuSocialNetwordFooterCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); @@ -92,7 +92,7 @@ class FooterItemCrudControllerTest extends WebTestCase self::assertResponseIsSuccessful(); // new text link - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', NewMenuFooterLinkController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', NewMenuFooterLinkController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); diff --git a/tests/Functional/Controller/Admin/GroupCrudControllerAsGroupAdminTest.php b/tests/Functional/Controller/Admin/GroupCrudControllerAsGroupAdminTest.php index dd80e90..ca29dd0 100644 --- a/tests/Functional/Controller/Admin/GroupCrudControllerAsGroupAdminTest.php +++ b/tests/Functional/Controller/Admin/GroupCrudControllerAsGroupAdminTest.php @@ -27,7 +27,7 @@ final class GroupCrudControllerAsGroupAdminTest extends WebTestCase $this->loginAsUser16($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class)); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/GroupCrudControllerTest.php b/tests/Functional/Controller/Admin/GroupCrudControllerTest.php index cc5f8e9..30669de 100644 --- a/tests/Functional/Controller/Admin/GroupCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/GroupCrudControllerTest.php @@ -22,24 +22,24 @@ final class GroupCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class)); self::assertResponseIsSuccessful(); // list + filter $filters = 'filters[type]=private&filter[membership]=free'; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class.'&'.$filters)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class.'&'.$filters)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', GroupCrudController::class, TestReference::GROUP_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', GroupCrudController::class, TestReference::GROUP_1)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', GroupCrudController::class, TestReference::GROUP_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', GroupCrudController::class, TestReference::GROUP_1)); self::assertResponseIsSuccessful(); // new - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', GroupCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', GroupCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); @@ -78,7 +78,7 @@ final class GroupCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // custom invite - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'invite', GroupCrudController::class, $groupId)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'invite', GroupCrudController::class, $groupId)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton('group_invitation_form_submit')->form(); @@ -102,8 +102,8 @@ final class GroupCrudControllerTest extends WebTestCase $client = self::createClient(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class)); - $dataId = sprintf("[data-id='%s']", TestReference::GROUP_1); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', GroupCrudController::class)); + $dataId = \sprintf("[data-id='%s']", TestReference::GROUP_1); $offersListlink = $client->getCrawler()->filter($dataId.' .action-offersList')->link(); $client->click($offersListlink); self::assertResponseRedirects(); @@ -115,7 +115,7 @@ final class GroupCrudControllerTest extends WebTestCase $client = self::createClient(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'export', GroupCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'export', GroupCrudController::class)); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/GroupOfferCrudControllerAsGroupAdminTest.php b/tests/Functional/Controller/Admin/GroupOfferCrudControllerAsGroupAdminTest.php index 39157b2..c13ecd6 100644 --- a/tests/Functional/Controller/Admin/GroupOfferCrudControllerAsGroupAdminTest.php +++ b/tests/Functional/Controller/Admin/GroupOfferCrudControllerAsGroupAdminTest.php @@ -26,11 +26,11 @@ final class GroupOfferCrudControllerAsGroupAdminTest extends WebTestCase // list+custom filters $filters = '&filters[group]='.TestReference::GROUP_1; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', GroupOfferCrudController::class.'&'.$filters)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', GroupOfferCrudController::class.'&'.$filters)); self::assertResponseIsSuccessful(); // new (groups are restricted) - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', GroupOfferCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', GroupOfferCrudController::class)); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/GroupOfferCrudControllerTest.php b/tests/Functional/Controller/Admin/GroupOfferCrudControllerTest.php index 4c48dc1..17b9c94 100644 --- a/tests/Functional/Controller/Admin/GroupOfferCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/GroupOfferCrudControllerTest.php @@ -25,19 +25,19 @@ final class GroupOfferCrudControllerTest extends WebTestCase // list+custom filters $filters = '&filters[group]='.TestReference::GROUP_1; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', GroupOfferCrudController::class.'&'.$filters)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', GroupOfferCrudController::class.'&'.$filters)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', GroupOfferCrudController::class, TestReference::GROUP_OFFER_GROUP_1_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', GroupOfferCrudController::class, TestReference::GROUP_OFFER_GROUP_1_1)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', GroupOfferCrudController::class, TestReference::GROUP_OFFER_GROUP_1_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', GroupOfferCrudController::class, TestReference::GROUP_OFFER_GROUP_1_1)); self::assertResponseIsSuccessful(); // new - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', GroupOfferCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', GroupOfferCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); diff --git a/tests/Functional/Controller/Admin/MenuCrudControllerTest.php b/tests/Functional/Controller/Admin/MenuCrudControllerTest.php index 6b7818d..bbb3d9d 100644 --- a/tests/Functional/Controller/Admin/MenuCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/MenuCrudControllerTest.php @@ -25,15 +25,15 @@ class MenuCrudControllerTest extends WebTestCase $menu = $menuRepo->getByCode('menu'); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', MenuCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', MenuCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuCrudController::class, $menu->getId())); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuCrudController::class, $menu->getId())); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', MenuCrudController::class, $menu->getId())); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', MenuCrudController::class, $menu->getId())); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/MenuItemCrudControllerTest.php b/tests/Functional/Controller/Admin/MenuItemCrudControllerTest.php index defb0da..00acb3e 100644 --- a/tests/Functional/Controller/Admin/MenuItemCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/MenuItemCrudControllerTest.php @@ -28,9 +28,9 @@ class MenuItemCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', MenuItemCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', MenuItemCrudController::class)); - $dataId = sprintf("[data-id='%s']", TestReference::MENU_HEADER_ITEM_FIRST); + $dataId = \sprintf("[data-id='%s']", TestReference::MENU_HEADER_ITEM_FIRST); self::assertSelectorTextNotContains($dataId, 'menu.action.up_item'); self::assertSelectorTextContains($dataId, 'menu.action.down_item'); @@ -50,8 +50,8 @@ class MenuItemCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', MenuItemCrudController::class)); - $dataId = sprintf("[data-id='%s']", TestReference::MENU_HEADER_ITEM_LAST); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', MenuItemCrudController::class)); + $dataId = \sprintf("[data-id='%s']", TestReference::MENU_HEADER_ITEM_LAST); self::assertSelectorTextContains($dataId, 'menu.action.up_item'); $upLink = $client->getCrawler()->filter($dataId.' .action-up')->link(); @@ -68,19 +68,19 @@ class MenuItemCrudControllerTest extends WebTestCase // list + filter $filters = 'filters[mediaType]=facebook'; - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&'.$filters, 'index', MenuItemCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&'.$filters, 'index', MenuItemCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuItemCrudController::class, TestReference::MENU_HEADER_ITEM_FIRST)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', MenuItemCrudController::class, TestReference::MENU_HEADER_ITEM_FIRST)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', MenuItemCrudController::class, TestReference::MENU_HEADER_ITEM_FIRST)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', MenuItemCrudController::class, TestReference::MENU_HEADER_ITEM_FIRST)); self::assertResponseIsSuccessful(); // new icon link - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', MenuItemSocialNetworkCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', MenuItemSocialNetworkCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); @@ -93,7 +93,7 @@ class MenuItemCrudControllerTest extends WebTestCase self::assertResponseIsSuccessful(); // new text link - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', MenuItemLinkCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', MenuItemLinkCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); diff --git a/tests/Functional/Controller/Admin/ObjectCrudControllerTest.php b/tests/Functional/Controller/Admin/ObjectCrudControllerTest.php index c8bef78..1d0c979 100644 --- a/tests/Functional/Controller/Admin/ObjectCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/ObjectCrudControllerTest.php @@ -27,7 +27,7 @@ final class ObjectCrudControllerTest extends WebTestCase $client = self::createClient(); $client->followRedirects(); $this->loginAsAdmin($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', ObjectCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', ObjectCrudController::class)); $client->clickLink(self::ACTION_ACTIVATE); self::assertResponseIsSuccessful(); $client->clickLink(self::ACTION_ONBREAK); @@ -40,7 +40,7 @@ final class ObjectCrudControllerTest extends WebTestCase $client->followRedirects(); $this->loginAsAdmin($client); - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ObjectCrudController::class, TestReference::OBJECT_LOIC_1)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ObjectCrudController::class, TestReference::OBJECT_LOIC_1)); $link = $crawler->selectLink('action.availability')->link(); self::assertSame('http://localhost/admin?crudAction=linkToProductAvailabilityPage&crudControllerFqcn=App%5CController%5CAdmin%5CObjectCrudController&entityId='.TestReference::OBJECT_LOIC_1.'&referrer=?crudAction%3Ddetail%26crudControllerFqcn%3DApp%255CController%255CAdmin%255CObjectCrudController%26entityId%3D'.TestReference::OBJECT_LOIC_1, $client->click($link)->getUri()); } @@ -55,19 +55,19 @@ final class ObjectCrudControllerTest extends WebTestCase // list+filter $filters = 'filters[enabled]=1&filters[id]='.TestReference::OBJECT_LOIC_1; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', ObjectCrudController::class.'&'.$filters)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', ObjectCrudController::class.'&'.$filters)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', ObjectCrudController::class, TestReference::OBJECT_LOIC_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', ObjectCrudController::class, TestReference::OBJECT_LOIC_1)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ObjectCrudController::class, TestReference::OBJECT_LOIC_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ObjectCrudController::class, TestReference::OBJECT_LOIC_1)); self::assertResponseIsSuccessful(); // new - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', ObjectCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', ObjectCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); diff --git a/tests/Functional/Controller/Admin/PageCrudControllerTest.php b/tests/Functional/Controller/Admin/PageCrudControllerTest.php index c80a285..5ee7635 100644 --- a/tests/Functional/Controller/Admin/PageCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/PageCrudControllerTest.php @@ -21,15 +21,15 @@ final class PageCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', PageCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', PageCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', PageCrudController::class, TestReference::PAGE_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', PageCrudController::class, TestReference::PAGE_1)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', PageCrudController::class, TestReference::PAGE_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', PageCrudController::class, TestReference::PAGE_1)); self::assertResponseIsSuccessful(); $client->clickLink('page.action.link'); @@ -38,7 +38,7 @@ final class PageCrudControllerTest extends WebTestCase self::assertResponseIsSuccessful(); // new - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', PageCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', PageCrudController::class)); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/ParametersControllerTest.php b/tests/Functional/Controller/Admin/ParametersControllerTest.php index 0eca960..0cda40c 100644 --- a/tests/Functional/Controller/Admin/ParametersControllerTest.php +++ b/tests/Functional/Controller/Admin/ParametersControllerTest.php @@ -29,7 +29,7 @@ final class ParametersControllerTest extends WebTestCase $this->loginAsAdmin($client); // form - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL_CUSTOM_CONTROLLER, 'admin_parameters')); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL_CUSTOM_CONTROLLER, 'admin_parameters')); self::assertResponseIsSuccessful(); $form = $crawler->selectButton('parameters_form_submit')->form(); diff --git a/tests/Functional/Controller/Admin/PaymentCrudControllerTest.php b/tests/Functional/Controller/Admin/PaymentCrudControllerTest.php index 6f7501d..2d92312 100644 --- a/tests/Functional/Controller/Admin/PaymentCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/PaymentCrudControllerTest.php @@ -23,11 +23,11 @@ final class PaymentCrudControllerTest extends WebTestCase // list + filters $filters = '&filters[user]='.TestReference::USER_16; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', PaymentCrudController::class).'&'.$filters); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', PaymentCrudController::class).'&'.$filters); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', PaymentCrudController::class, TestReference::PAYMENT_USER_16_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', PaymentCrudController::class, TestReference::PAYMENT_USER_16_1)); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/PlaceCrudControllerTest.php b/tests/Functional/Controller/Admin/PlaceCrudControllerTest.php index 9975cb7..383cb40 100644 --- a/tests/Functional/Controller/Admin/PlaceCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/PlaceCrudControllerTest.php @@ -22,15 +22,15 @@ final class PlaceCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', PlaceCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', PlaceCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', PlaceCrudController::class, TestReference::PLACE_7)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', PlaceCrudController::class, TestReference::PLACE_7)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', PlaceCrudController::class, TestReference::PLACE_7)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', PlaceCrudController::class, TestReference::PLACE_7)); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/PlatformOfferCrudControllerTest.php b/tests/Functional/Controller/Admin/PlatformOfferCrudControllerTest.php new file mode 100644 index 0000000..b32c314 --- /dev/null +++ b/tests/Functional/Controller/Admin/PlatformOfferCrudControllerTest.php @@ -0,0 +1,57 @@ +loginAsAdmin($client); + + // list+custom filters + $filters = '&filters[type]='.(OfferType::MONTHLY->isMonthly() ? '1' : '0'); + + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', PlatformOfferCrudController::class.'&'.$filters)); + self::assertResponseIsSuccessful(); + + // edit + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', PlatformOfferCrudController::class, TestReference::PLATFORM_OFFER_1)); + self::assertResponseIsSuccessful(); + + // detail + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', PlatformOfferCrudController::class, TestReference::PLATFORM_OFFER_1)); + self::assertResponseIsSuccessful(); + + // new + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', PlatformOfferCrudController::class)); + self::assertResponseIsSuccessful(); + + $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); + $client->submit($form, [ + $form->getName().'[name]' => 'New special offer', + $form->getName().'[type]' => 'yearly', + $form->getName().'[price]' => 490, + $form->getName().'[currency]' => 'EUR', + $form->getName().'[active]' => false, + ]); + self::assertResponseRedirects(); + $client->followRedirect(); + self::assertResponseIsSuccessful(); + } +} diff --git a/tests/Functional/Controller/Admin/ServiceCrudControllerTest.php b/tests/Functional/Controller/Admin/ServiceCrudControllerTest.php index 3df113d..0b88a17 100644 --- a/tests/Functional/Controller/Admin/ServiceCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/ServiceCrudControllerTest.php @@ -24,25 +24,24 @@ final class ServiceCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', ServiceCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', ServiceCrudController::class)); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', ServiceCrudController::class, TestReference::SERVICE_LOIC_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', ServiceCrudController::class, TestReference::SERVICE_LOIC_1)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ServiceCrudController::class, TestReference::SERVICE_LOIC_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ServiceCrudController::class, TestReference::SERVICE_LOIC_1)); self::assertResponseIsSuccessful(); // new - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', ServiceCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', ServiceCrudController::class)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE_AND_RETURN)->form(); $client->submit($form, [ $form->getName().'[name]' => 'Object public', - $form->getName().'[visibility]' => 'public', $form->getName().'[status]' => 'active', $form->getName().'[owner]' => TestReference::ADMIN_LOIC, $form->getName().'[description]' => 'very nice object', diff --git a/tests/Functional/Controller/Admin/ServiceRequestCrudControllerTest.php b/tests/Functional/Controller/Admin/ServiceRequestCrudControllerTest.php index f93fed2..52e0b22 100644 --- a/tests/Functional/Controller/Admin/ServiceRequestCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/ServiceRequestCrudControllerTest.php @@ -8,14 +8,14 @@ use App\Controller\Admin\ServiceRequestCrudController; use App\Test\ContainerRepositoryTrait; use App\Test\KernelTrait; use App\Tests\TestReference; -use Hautelook\AliceBundle\PhpUnit\RefreshDatabaseTrait; +use Hautelook\AliceBundle\PhpUnit\ReloadDatabaseTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\HttpFoundation\Response; final class ServiceRequestCrudControllerTest extends WebTestCase { use KernelTrait; - use RefreshDatabaseTrait; + use ReloadDatabaseTrait; use ContainerRepositoryTrait; /** @@ -28,15 +28,15 @@ final class ServiceRequestCrudControllerTest extends WebTestCase // list + filter $filters = 'filters[status]=new'; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', ServiceRequestCrudController::class.'&'.$filters)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', ServiceRequestCrudController::class.'&'.$filters)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ServiceRequestCrudController::class, TestReference::SERVICE_REQUEST_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', ServiceRequestCrudController::class, TestReference::SERVICE_REQUEST_1)); self::assertResponseIsSuccessful(); // conversation - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'conversation', ServiceRequestCrudController::class, TestReference::SERVICE_REQUEST_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'conversation', ServiceRequestCrudController::class, TestReference::SERVICE_REQUEST_1)); self::assertResponseIsSuccessful(); } @@ -52,7 +52,7 @@ final class ServiceRequestCrudControllerTest extends WebTestCase $configurationRepo->getInstanceConfiguration()?->setConfiguration($config); // conversation page not allowed if confidentiality conversation admin access is set to false - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'conversation', ServiceRequestCrudController::class, TestReference::SERVICE_REQUEST_1)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'conversation', ServiceRequestCrudController::class, TestReference::SERVICE_REQUEST_1)); self::assertResponseStatusCodeSame(Response::HTTP_FORBIDDEN); } } diff --git a/tests/Functional/Controller/Admin/UserCrudControllerTest.php b/tests/Functional/Controller/Admin/UserCrudControllerTest.php index f8f68e5..505b258 100644 --- a/tests/Functional/Controller/Admin/UserCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/UserCrudControllerTest.php @@ -22,19 +22,19 @@ final class UserCrudControllerTest extends WebTestCase $this->loginAsAdmin($client); // list - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', UserCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', UserCrudController::class)); // list + filters $filters = '&filters[group]='.TestReference::GROUP_1; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', UserCrudController::class).'&'.$filters); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', UserCrudController::class).'&'.$filters); self::assertResponseIsSuccessful(); // edit - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserCrudController::class, TestReference::USER_17)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserCrudController::class, TestReference::USER_17)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', UserCrudController::class, TestReference::USER_16)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', UserCrudController::class, TestReference::USER_16)); self::assertResponseIsSuccessful(); } @@ -45,7 +45,7 @@ final class UserCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserCrudController::class, TestReference::USER_17)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserCrudController::class, TestReference::USER_17)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE)->form(); @@ -63,7 +63,7 @@ final class UserCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserCrudController::class, TestReference::USER_17)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserCrudController::class, TestReference::USER_17)); self::assertResponseIsSuccessful(); $form = $crawler->selectButton(TestReference::ACTION_SAVE)->form(); @@ -80,9 +80,9 @@ final class UserCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsAdmin($client); - $crawler = $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', UserCrudController::class)); + $crawler = $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', UserCrudController::class)); - $dataId = sprintf("[data-id='%s']", TestReference::USER_17); + $dataId = \sprintf("[data-id='%s']", TestReference::USER_17); self::assertSelectorTextContains($dataId, 'action.promoteToAdmin'); $link = $crawler->filter('.action-promoteToAdmin')->link(); diff --git a/tests/Functional/Controller/Admin/UserGroupCrudControllerAsGroupAdminTest.php b/tests/Functional/Controller/Admin/UserGroupCrudControllerAsGroupAdminTest.php index fb210a6..c86bcb2 100644 --- a/tests/Functional/Controller/Admin/UserGroupCrudControllerAsGroupAdminTest.php +++ b/tests/Functional/Controller/Admin/UserGroupCrudControllerAsGroupAdminTest.php @@ -26,11 +26,11 @@ final class UserGroupCrudControllerAsGroupAdminTest extends WebTestCase // list+custom filters $filters = '&filters[group]='.TestReference::GROUP_1.'&filters[user]='.TestReference::ADMIN_CAMILLE; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', UserGroupCrudController::class.'&'.$filters)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', UserGroupCrudController::class.'&'.$filters)); self::assertResponseIsSuccessful(); // new (groups & users are restricted) - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'new', UserGroupCrudController::class)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'new', UserGroupCrudController::class)); self::assertResponseIsSuccessful(); } } diff --git a/tests/Functional/Controller/Admin/UserGroupCrudControllerTest.php b/tests/Functional/Controller/Admin/UserGroupCrudControllerTest.php index cfd08e7..98f183e 100644 --- a/tests/Functional/Controller/Admin/UserGroupCrudControllerTest.php +++ b/tests/Functional/Controller/Admin/UserGroupCrudControllerTest.php @@ -25,11 +25,11 @@ final class UserGroupCrudControllerTest extends WebTestCase // list+custom filters $filters = '&filters[group]='.TestReference::GROUP_1; - $client->request('GET', sprintf(TestReference::ADMIN_URL, 'index', UserGroupCrudController::class.'&'.$filters)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL, 'index', UserGroupCrudController::class.'&'.$filters)); self::assertResponseIsSuccessful(); // detail - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', UserGroupCrudController::class, TestReference::USER_GROUP_LOIC_GROUP_7)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'detail', UserGroupCrudController::class, TestReference::USER_GROUP_LOIC_GROUP_7)); self::assertResponseIsSuccessful(); } @@ -49,7 +49,7 @@ final class UserGroupCrudControllerTest extends WebTestCase { $client = self::createClient(); $this->loginAsSarah($client); - $client->request('GET', sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserGroupCrudController::class, TestReference::USER_GROUP_LOIC_GROUP_7)); + $client->request('GET', \sprintf(TestReference::ADMIN_URL.'&entityId=%s', 'edit', UserGroupCrudController::class, TestReference::USER_GROUP_LOIC_GROUP_7)); $form = $client->getCrawler()->selectButton('ea[newForm][btn]')->form(); $client->submit($form, [ diff --git a/tests/Functional/Controller/Group/CreateGroupActionTest.php b/tests/Functional/Controller/Group/CreateGroupActionTest.php index 046eb95..9999f71 100644 --- a/tests/Functional/Controller/Group/CreateGroupActionTest.php +++ b/tests/Functional/Controller/Group/CreateGroupActionTest.php @@ -31,10 +31,10 @@ final class CreateGroupActionTest extends WebTestCase $form = $crawler->selectButton('create_group_form_submit')->form(); $client->submit($form, [ - $form->getName().'[name]' => 'Groupe 1', - $form->getName().'[type]' => 'public', - $form->getName().'[parent]' => TestReference::GROUP_1, - ]); + $form->getName().'[name]' => 'Groupe 1', + $form->getName().'[type]' => 'public', + $form->getName().'[servicesEnabled]' => false, + ]); self::assertResponseRedirects(); self::assertTrue(u($client->getResponse()->headers->get('Location'))->startsWith('http://localhost/admin')); diff --git a/tests/Functional/Controller/Group/GroupControllerTest.php b/tests/Functional/Controller/Group/GroupControllerTest.php index d89d50b..443bda2 100644 --- a/tests/Functional/Controller/Group/GroupControllerTest.php +++ b/tests/Functional/Controller/Group/GroupControllerTest.php @@ -7,7 +7,7 @@ namespace App\Tests\Functional\Controller\Group; use App\Test\ContainerRepositoryTrait; use App\Test\KernelTrait; use App\Tests\TestReference; -use Hautelook\AliceBundle\PhpUnit\RefreshDatabaseTrait; +use Hautelook\AliceBundle\PhpUnit\ReloadDatabaseTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\HttpFoundation\Response; @@ -16,7 +16,7 @@ use Symfony\Component\HttpFoundation\Response; */ final class GroupControllerTest extends WebTestCase { - use RefreshDatabaseTrait; + use ReloadDatabaseTrait; use KernelTrait; use ContainerRepositoryTrait; @@ -59,7 +59,7 @@ final class GroupControllerTest extends WebTestCase $form = $client->getCrawler()->selectButton('group_select_form_submit')->form(); $client->submit($form, [ - $form->getName().'[q]' => 'Groupe 2', + $form->getName().'[q]' => 'Groupe 2', ]); self::assertSame(1, $client->getCrawler()->filter('.group-test')->count()); @@ -80,7 +80,7 @@ final class GroupControllerTest extends WebTestCase $form = $client->getCrawler()->selectButton('group_select_form_submit')->form(); $client->submit($form, [ - $form->getName().'[q]' => 'sarah', + $form->getName().'[q]' => 'sarah', ]); self::assertSame(1, $client->getCrawler()->filter('.group-test')->count()); diff --git a/tests/Functional/Controller/Payment/PrepareActionTest.php b/tests/Functional/Controller/Payment/PrepareActionTest.php index a71cb74..d0c139c 100644 --- a/tests/Functional/Controller/Payment/PrepareActionTest.php +++ b/tests/Functional/Controller/Payment/PrepareActionTest.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace App\Tests\Functional\Controller\Payment; -use App\Controller\Payment\PrepareAction; +use App\Controller\Payment\Group\PrepareAction; use App\Test\KernelTrait; use App\Tests\TestReference; use Hautelook\AliceBundle\PhpUnit\RefreshDatabaseTrait; diff --git a/tests/Functional/Controller/Product/ServiceControllerTest.php b/tests/Functional/Controller/Product/ServiceControllerTest.php index 82e1148..efa7d39 100644 --- a/tests/Functional/Controller/Product/ServiceControllerTest.php +++ b/tests/Functional/Controller/Product/ServiceControllerTest.php @@ -35,8 +35,6 @@ class ServiceControllerTest extends WebTestCase $form->getName().'[name]' => 'jardinage', $form->getName().'[description]' => 'description', $form->getName().'[duration]' => '1 jour', - $form->getName().'[visibility]' => 'restricted', - $form->getName().'[groups]' => [TestReference::GROUP_1], ]); $container = $client->getContainer(); @@ -49,7 +47,6 @@ class ServiceControllerTest extends WebTestCase self::assertSame('jardinage', $editedService->getName()); self::assertSame('description', $editedService->getDescription()); self::assertSame('1 jour', $editedService->getDuration()); - self::assertSame('restricted', $editedService->getVisibility()->value); self::assertResponseRedirects(); $client->followRedirect(); diff --git a/tests/Functional/Controller/Security/AccountCreateActionStep2UserTest.php b/tests/Functional/Controller/Security/AccountCreateActionStep2UserTest.php index d5feb55..f52c464 100644 --- a/tests/Functional/Controller/Security/AccountCreateActionStep2UserTest.php +++ b/tests/Functional/Controller/Security/AccountCreateActionStep2UserTest.php @@ -7,7 +7,7 @@ namespace App\Tests\Functional\Controller\Security; use App\Test\ContainerRepositoryTrait; use App\Test\KernelTrait; use App\Tests\TestReference; -use Hautelook\AliceBundle\PhpUnit\RefreshDatabaseTrait; +use Hautelook\AliceBundle\PhpUnit\ReloadDatabaseTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\String\ByteString; @@ -17,7 +17,7 @@ use Symfony\Component\String\ByteString; final class AccountCreateActionStep2UserTest extends WebTestCase { use ContainerRepositoryTrait; - use RefreshDatabaseTrait; + use ReloadDatabaseTrait; use KernelTrait; private const ROUTE = '/fr/compte/creer-mon-compte-etape-2/'; diff --git a/tests/Functional/Controller/User/AddressControllerTest.php b/tests/Functional/Controller/User/AddressControllerTest.php index 983b6da..6c9fda7 100644 --- a/tests/Functional/Controller/User/AddressControllerTest.php +++ b/tests/Functional/Controller/User/AddressControllerTest.php @@ -143,6 +143,23 @@ final class AddressControllerTest extends WebTestCase self::assertSelectorTextContains('body', 'address.step1_action.no_address.warning'); } + /** + * Step1 form submitted without entering data. + */ + public function testStep1FormNothingFilledFailure(): void + { + $client = self::createClient(); + $this->loginAsUser16($client); + + $crawler = $client->request('GET', self::ROUTE_STEP1); + self::assertResponseIsSuccessful(); + + $form = $crawler->selectButton(self::STEP1_FORM_ID.'_submit')->form(); + $client->submit($form); + self::assertResponseIsUnprocessable(); + self::assertSelectorTextContains('body', 'This value should not be blank'); + } + /** * Step2 direct access is forbidden. */ diff --git a/tests/Integration/Command/EndMembershipCommandTest.php b/tests/Integration/Command/EndMembershipCommandTest.php index 08185b8..db97e73 100644 --- a/tests/Integration/Command/EndMembershipCommandTest.php +++ b/tests/Integration/Command/EndMembershipCommandTest.php @@ -31,7 +31,7 @@ final class EndMembershipCommandTest extends KernelTestCase self::assertEmailCount(1); self::assertNotificationCount(1); $output = $commandTester->getDisplay(); - self::assertStringContainsString(sprintf('%d deletion', 1), $output); + self::assertStringContainsString(\sprintf('%d deletion', 1), $output); // already deleted $commandTester->execute([]); @@ -39,6 +39,6 @@ final class EndMembershipCommandTest extends KernelTestCase self::assertEmailCount(1); // not +1 self::assertNotificationCount(1); $output = $commandTester->getDisplay(); - self::assertStringContainsString(sprintf('%d deletion', 0), $output); + self::assertStringContainsString(\sprintf('%d deletion', 0), $output); } } diff --git a/tests/Integration/Command/EndPlatformMembershipCommandTest.php b/tests/Integration/Command/EndPlatformMembershipCommandTest.php new file mode 100644 index 0000000..3c651ad --- /dev/null +++ b/tests/Integration/Command/EndPlatformMembershipCommandTest.php @@ -0,0 +1,51 @@ +fixDoctrineBug($kernel->getContainer()); + + // temporarily set global configuration as globalPaidMembership = true + $configuration = $this->getConfigurationRepository()->getInstanceConfigurationOrCreate(); + $newConfig = $configuration->getConfiguration(); + $newConfig['global']['globalPaidMembership'] = true; + $configuration->setConfiguration($newConfig); + $this->getConfigurationRepository()->save($configuration, true); + + $application = new Application($kernel); + $command = $application->find(EndPlatformMembershipCommand::CMD); + $commandTester = new CommandTester($command); + $commandTester->execute([]); + $commandTester->assertCommandIsSuccessful(); + self::assertEmailCount(1); + self::assertNotificationCount(1); + $output = $commandTester->getDisplay(); + self::assertStringContainsString(\sprintf('%d update', 1), $output); + + // already deleted + $commandTester->execute([]); + $commandTester->assertCommandIsSuccessful(); + self::assertEmailCount(1); // not +1 + self::assertNotificationCount(1); + $output = $commandTester->getDisplay(); + self::assertStringContainsString(\sprintf('%d update', 0), $output); + } +} diff --git a/tests/Integration/Command/NotifyMembershipExpirationCommandTest.php b/tests/Integration/Command/NotifyMembershipExpirationCommandTest.php index 594d824..f1091dd 100644 --- a/tests/Integration/Command/NotifyMembershipExpirationCommandTest.php +++ b/tests/Integration/Command/NotifyMembershipExpirationCommandTest.php @@ -27,7 +27,7 @@ final class NotifyMembershipExpirationCommandTest extends KernelTestCase ]); $commandTester->assertCommandIsSuccessful(); $output = $commandTester->getDisplay(); - self::assertStringContainsString(sprintf('%d notification', 1), $output); + self::assertStringContainsString(\sprintf('%d notification', 1), $output); self::assertMatchesRegularExpression('/Groupe 1 - adhésion payante of[\s\/\\n]*Camille/', $output); self::assertEmailCount(1); self::assertNotificationCount(1); @@ -38,7 +38,7 @@ final class NotifyMembershipExpirationCommandTest extends KernelTestCase ]); $commandTester->assertCommandIsSuccessful(); $output = $commandTester->getDisplay(); - self::assertStringContainsString(sprintf('%d notification', 1), $output); + self::assertStringContainsString(\sprintf('%d notification', 1), $output); self::assertStringContainsString('Groupe 7 of Sarah', $output); self::assertEmailCount(2); // cumulative self::assertNotificationCount(2); diff --git a/tests/Integration/Command/NotifyPlatformMembershipExpirationCommandTest.php b/tests/Integration/Command/NotifyPlatformMembershipExpirationCommandTest.php new file mode 100644 index 0000000..11846ea --- /dev/null +++ b/tests/Integration/Command/NotifyPlatformMembershipExpirationCommandTest.php @@ -0,0 +1,44 @@ +getConfigurationRepository()->getInstanceConfigurationOrCreate(); + $newConfig = $configuration->getConfiguration(); + $newConfig['global']['globalPaidMembership'] = true; + $configuration->setConfiguration($newConfig); + $this->getConfigurationRepository()->save($configuration, true); + + $application = new Application($kernel); + $command = $application->find(NotifyPlatformMembershipExpirationCommand::CMD); + $commandTester = new CommandTester($command); + + // in one week + $commandTester->execute([ + 'days' => 7, + ]); + $commandTester->assertCommandIsSuccessful(); + $output = $commandTester->getDisplay(); + self::assertStringContainsString(\sprintf('%d notification', 1), $output); + self::assertStringContainsString(\sprintf('notifying platform membership expiration for user %s', 'Kevin'), $output); + self::assertEmailCount(1); + self::assertNotificationCount(1); + } +} diff --git a/tests/Integration/Command/NotifyServiceRequestDatesCommandTest.php b/tests/Integration/Command/NotifyServiceRequestDatesCommandTest.php index 5f1de53..106d807 100644 --- a/tests/Integration/Command/NotifyServiceRequestDatesCommandTest.php +++ b/tests/Integration/Command/NotifyServiceRequestDatesCommandTest.php @@ -29,7 +29,7 @@ final class NotifyServiceRequestDatesCommandTest extends KernelTestCase ]); $commandTester->assertCommandIsSuccessful(); $output = $commandTester->getDisplay(); - self::assertStringContainsString(sprintf('%d notification(s)', 2), $output); // owner + recipient + self::assertStringContainsString(\sprintf('%d notification(s)', 2), $output); // owner + recipient self::assertStringContainsString('DONE', $output); self::assertEmailCount(2); self::assertNotificationCount(2); @@ -40,7 +40,7 @@ final class NotifyServiceRequestDatesCommandTest extends KernelTestCase ]); $commandTester->assertCommandIsSuccessful(); $output = $commandTester->getDisplay(); - self::assertStringContainsString(sprintf('%d notification(s)', 2), $output); + self::assertStringContainsString(\sprintf('%d notification(s)', 2), $output); self::assertStringContainsString('DONE', $output); self::assertEmailCount(4); // cumulative results self::assertNotificationCount(4); diff --git a/tests/Integration/MessageHandler/Payment/PlatformMembershipPaidCommandHandlerTest.php b/tests/Integration/MessageHandler/Payment/PlatformMembershipPaidCommandHandlerTest.php new file mode 100644 index 0000000..818a4f9 --- /dev/null +++ b/tests/Integration/MessageHandler/Payment/PlatformMembershipPaidCommandHandlerTest.php @@ -0,0 +1,75 @@ +get(PlatformMembershipPaidCommandHandler::class); + self::assertInstanceOf(PlatformMembershipPaidCommandHandler::class, $handler); + + $platformOffer = $this->getPlatformOfferRepository()->get(TestReference::PLATFORM_OFFER_1); + $user = $this->getUserRepository()->get(TestReference::ADMIN_LOIC); + + $message = new PlatformMembershipPaidCommand($platformOffer->getId(), $user->getId(), $this->getToken($user)); + $status = $handler($message); + self::assertTrue($status->isNew()); + } + + private function getToken(User $user): PaymentToken + { + $token = new PaymentToken(); + $token->setGatewayName('offline'); + $payment = new Payment(); + $payment->setUser($user); + $token->setDetails($payment); + + return $token; + } + + /** + * No error 500 if the user is already a member. + */ + public function testDoneAlreadyMember(): void + { + self::bootKernel(); + $handler = self::getContainer()->get(PlatformMembershipPaidCommandHandler::class); + self::assertInstanceOf(PlatformMembershipPaidCommandHandler::class, $handler); + + $platformOffer = $this->getPlatformOfferRepository()->get(TestReference::PLATFORM_OFFER_1); + $user = $this->getUserRepository()->get(TestReference::ADMIN_LOIC); + $user->setMembershipPaid(false); // juste for the test + $this->getUserManager()->save($user, true); + $payment = $this->getPaymentRepository()->get(TestReference::PAYMENT_USER_16_1); + $token = new PaymentToken(); + $token->setGatewayName('offline'); + $payment->setUser($user); + $token->setDetails($payment); + + $message = new PlatformMembershipPaidCommand($platformOffer->getId(), $user->getId(), $token); + $status = $handler($message); + self::assertTrue($status->isCaptured()); + self::assertEmailCount(1); + self::assertTrue($user->isMembershipPaid()); + } +} diff --git a/tests/Integration/Search/Command/IndexProductsCommandTest.php b/tests/Integration/Search/Command/IndexProductsCommandTest.php index ae155af..4d8b49b 100644 --- a/tests/Integration/Search/Command/IndexProductsCommandTest.php +++ b/tests/Integration/Search/Command/IndexProductsCommandTest.php @@ -26,7 +26,7 @@ final class IndexProductsCommandTest extends KernelTestCase $commandTester->execute([]); $commandTester->assertCommandIsSuccessful(); $output = $commandTester->getDisplay(); - self::assertStringContainsString(sprintf('%d product(s) indexed', TestReference::PRODUCTS_INDEXABLE_COUNT), $output); + self::assertStringContainsString(\sprintf('%d product(s) indexed', TestReference::PRODUCTS_INDEXABLE_COUNT), $output); // check if the search is OK // sleep(2); // wait a little to be sure the indexing process is OK @@ -45,13 +45,14 @@ final class IndexProductsCommandTest extends KernelTestCase $searchDto = new Search(''); // all documents when not logged (-1 because of a restricted product) + // services are now restricted and do not appear here with default filters $results = $meilisearch->search($searchDto); - self::assertSame(TestReference::PRODUCTS_INDEXABLE_COUNT - 1, $results->getHitsCount()); + self::assertSame(TestReference::PRODUCTS_VISIBLE_COUNT - 1, $results->getHitsCount()); // all documents when logged with a user with access to the restricted product $searchDto->user = $this->getUserRepository()->get(TestReference::PLACE_APES); $results = $meilisearch->search($searchDto); - self::assertSame(TestReference::PRODUCTS_INDEXABLE_COUNT, $results->getHitsCount()); + self::assertSame(TestReference::PRODUCTS_VISIBLE_COUNT, $results->getHitsCount()); // keyword search $searchDto->user = null; @@ -60,8 +61,19 @@ final class IndexProductsCommandTest extends KernelTestCase self::assertSame(3, $results->getHitsCount()); // typo tolerance example - $searchDto->q = 'histiore'; + $searchDto->q = 'jumeles'; $results = $meilisearch->search($searchDto); self::assertSame(1, $results->getHitsCount()); + + // test vacation + + $searchDto->user = null; + $searchDto->q = ''; + $user16 = $this->getUserRepository()->get(TestReference::USER_16); + $user16->setVacationMode(true); + $this->getUserManager()->save($user16); + $results = $meilisearch->search($searchDto); + // two objects are now hidden + self::assertSame(TestReference::PRODUCTS_VISIBLE_COUNT - 3, $results->getHitsCount()); } } diff --git a/tests/Integration/Search/MeilisearchTest.php b/tests/Integration/Search/MeilisearchTest.php index b10ce0c..32bf5c2 100644 --- a/tests/Integration/Search/MeilisearchTest.php +++ b/tests/Integration/Search/MeilisearchTest.php @@ -23,6 +23,6 @@ final class MeilisearchTest extends KernelTestCase $meilisearch->indexProducts([$object, $service]); $searchDto = new Search('vélo'); $results = $meilisearch->search($searchDto); - self::assertNotEmpty($results->getHitsCount()); + self::assertNotEmpty($results); } } diff --git a/tests/TestReference.php b/tests/TestReference.php index dc43b23..ed3efda 100644 --- a/tests/TestReference.php +++ b/tests/TestReference.php @@ -9,7 +9,7 @@ final class TestReference // common public const UUID_404 = '1ed7a2a8-0a77-6dbc-a404-040404040404'; // valid UUID for 404 pages public const VALIDATION_ERROR_BLANK = 'This value should not be blank'; - public const VALIDATION_ERROR_ALREADY_USED = 'This value is already used'; + public const VALIDATION_ERROR_ALREADY_USED = 'validator.user.unique.message'; // EasyAdmin public const ADMIN_URL = '/admin?crudAction=%s&crudControllerFqcn=%s'; @@ -69,6 +69,8 @@ final class TestReference public const PRODUCTS_COUNT = 18; public const PRODUCTS_NOT_INDEXABLE_COUNT = 1; public const PRODUCTS_INDEXABLE_COUNT = self::PRODUCTS_COUNT - self::PRODUCTS_NOT_INDEXABLE_COUNT; + public const PRODUCTS_RESTRICTED_COUNT = 5; + public const PRODUCTS_VISIBLE_COUNT = 12; public const PRODUCT_AVAILABILITIES_COUNT = 4; public const USER_17_SERVICES_COUNT = 0; @@ -127,4 +129,7 @@ final class TestReference // payments final public const PAYMENT_USER_16_1 = '1edcefc9-45b3-6a3e-b4a6-db137f56da56'; + + // platform offer + final public const PLATFORM_OFFER_1 = '016b2a27-1037-6d47-bcdc-ec5efbd723f2'; } diff --git a/tests/Unit/Controller/Payment/DoneActionTest.php b/tests/Unit/Controller/Payment/Group/DoneActionTest.php similarity index 96% rename from tests/Unit/Controller/Payment/DoneActionTest.php rename to tests/Unit/Controller/Payment/Group/DoneActionTest.php index bc4c817..e95b7a9 100644 --- a/tests/Unit/Controller/Payment/DoneActionTest.php +++ b/tests/Unit/Controller/Payment/Group/DoneActionTest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Tests\Unit\Controller\Payment; +namespace App\Tests\Unit\Controller\Payment\Group; -use App\Controller\Payment\DoneAction; +use App\Controller\Payment\Group\DoneAction; use App\Entity\Group; use App\Entity\GroupOffer; use App\Entity\PaymentToken; @@ -39,7 +39,7 @@ final class DoneActionTest extends TestCase ->setId($this->getUuid()) ->setSlug('group'); - return (new GroupOffer()) + return (new GroupOffer()) // @phpstan-ignore-line ->setId($this->getUuid()) ->setGroup($group); } @@ -103,6 +103,7 @@ final class DoneActionTest extends TestCase ); $this->expectException(\RuntimeException::class); $this->expectExceptionMessage('Cannot verify Payum token'); + $doneAction->__invoke(new Request(), TestReference::UUID_404, $this->getUser()); } @@ -153,7 +154,8 @@ final class DoneActionTest extends TestCase $container->method('get')->willReturn($requesStack); $doneAction->setContainer($container); - $this->expectException(\Error::class); // or more mock are needed. To cleanup later + $this->expectException(\Error::class); // or more mock are needed. To clean up later + $doneAction->__invoke(new Request(), TestReference::UUID_404, $this->getUser()); } } diff --git a/tests/Unit/Controller/Payment/PlatformMembership/DoneActionTest.php b/tests/Unit/Controller/Payment/PlatformMembership/DoneActionTest.php new file mode 100644 index 0000000..67d0db3 --- /dev/null +++ b/tests/Unit/Controller/Payment/PlatformMembership/DoneActionTest.php @@ -0,0 +1,154 @@ +getMockBuilder(HttpRequestVerifierInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $httpRequestVerifierInterface->method('verify') + ->willThrowException(new UnprocessableEntityHttpException()); + + $payum = $this->getMockBuilder(Payum::class) + ->disableOriginalConstructor() + ->getMock(); + $payum->method('getHttpRequestVerifier') + ->willReturn($httpRequestVerifierInterface); + + $translator = $this->getMockBuilder(TranslatorInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $doneAction = new DoneAction( + $this->getCommandBus(), + $payum, + $translator, + $this->getLogger(), + ); + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Cannot verify Payum token'); + + $doneAction->__invoke(new Request(), $this->getPlatformOffer(), $this->getUser()); + } + + /** + * All this to test a line :/. + */ + public function testFlashWarning(): void + { + $httpRequestVerifierInterface = $this->getMockBuilder(HttpRequestVerifierInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $httpRequestVerifierInterface->method('verify') + ->willReturn(new PaymentToken()); + + $payum = $this->getMockBuilder(Payum::class) + ->disableOriginalConstructor() + ->getMock(); + $payum->method('getHttpRequestVerifier') + ->willReturn($httpRequestVerifierInterface); + + $translator = $this->getMockBuilder(TranslatorInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $comandBus = $this->getCommandBus(); + $comandBus->method('dispatch')->willReturn(new GetHumanStatus(new PaymentToken())); + + $doneAction = new DoneAction( + $comandBus, + $payum, + $translator, + $this->getLogger(), + ); + + // set session! + $session = $this->getMockBuilder(FlashBagAwareSessionInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $session->method('getFlashBag')->willReturn(new FlashBag()); + $session->method('remove')->with('payment_in_progress')->willReturn(true); + + $requesStack = $this->getMockBuilder(RequestStack::class) + ->disableOriginalConstructor() + ->getMock(); + $requesStack->method('getSession')->willReturn($session); + $container = $this->getMockBuilder(ContainerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $container->method('get')->willReturn($requesStack); + $doneAction->setContainer($container); + + $request = new Request(); + $request->setSession($session); + $requesStack->push($request); + + $this->expectException(\Error::class); // or more mock are needed. To clean up later + + $doneAction->__invoke($request, $this->getPlatformOffer(), $this->getUser()); + } + + /** + * @return CommandBusInterface&MockObject + */ + private function getCommandBus(): MockObject + { + return $this->getMockBuilder(CommandBusInterface::class) + ->disableOriginalConstructor() + ->getMock(); + } + + private function getLogger(): MockObject&LoggerInterface + { + return $this->getMockBuilder(LoggerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + } + + private function getUser(): User + { + return (new User()) + ->setId($this->getUuid()); + } + + private function getUuid(): Uuid + { + return Uuid::v6(); + } + + private function getPlatformOffer(): PlatformOffer + { + $platformOffer = new PlatformOffer(); + $platformOffer->setId($this->getUuid()); + + return $platformOffer; + } +} diff --git a/tests/Unit/Entity/AddressTest.php b/tests/Unit/Entity/AddressTest.php index ffc1612..b3e9b61 100644 --- a/tests/Unit/Entity/AddressTest.php +++ b/tests/Unit/Entity/AddressTest.php @@ -27,6 +27,6 @@ final class AddressTest extends TestCase self::assertSame('nominatim', $address->setProvidedBy('nominatim')->getProvidedBy()); self::assertSame('copyright', $address->setAttribution('copyright')->getAttribution()); self::assertSame('way', $address->setOsmType('way')->getOsmType()); - self::assertSame(12345, $address->setOsmId(12345)->getOsmId()); + self::assertSame('12345', $address->setOsmId('12345')->getOsmId()); } } diff --git a/tests/Unit/Enum/Group/GroupOfferTypeTest.php b/tests/Unit/Enum/Group/GroupOfferTypeTest.php index 392f199..c69b24a 100644 --- a/tests/Unit/Enum/Group/GroupOfferTypeTest.php +++ b/tests/Unit/Enum/Group/GroupOfferTypeTest.php @@ -4,14 +4,14 @@ declare(strict_types=1); namespace App\Tests\Unit\Enum\Group; -use App\Enum\Group\GroupOfferType; +use App\Enum\OfferType; use PHPUnit\Framework\TestCase; final class GroupOfferTypeTest extends TestCase { public function testGroupOfferType(): void { - self::assertTrue(GroupOfferType::MONTHLY->isMonthly()); - self::assertTrue(GroupOfferType::YEARLY->isYearly()); + self::assertTrue(OfferType::MONTHLY->isMonthly()); + self::assertTrue(OfferType::YEARLY->isYearly()); } } diff --git a/translations/admin.fr.xlf b/translations/admin.fr.xlf index cbd466e..944a467 100644 --- a/translations/admin.fr.xlf +++ b/translations/admin.fr.xlf @@ -260,11 +260,21 @@ Paramètres de l'instance - - parameters.services.h2 + + parameters.global.h2 + Paramètres généraux de la plateforme + + + + parameters.services.h3 Services + + parameters.paid_membership.h3 + Adhésion payante + + parameters.senders.h2 Expéditeur·rice des notifications @@ -317,6 +327,11 @@ Informations + + panel.payment_information + Informations sur l'abonnement + + images.help @@ -363,6 +378,16 @@ Nombre de groupes + + Membership Paid + Abonnement à la plateforme payé + + + + Platform Offer + Tarif d'adhésion + + diff --git a/translations/app/Controller/Admin/GroupCrudController/admin.fr.xlf b/translations/app/Controller/Admin/GroupCrudController/admin.fr.xlf new file mode 100644 index 0000000..265beb7 --- /dev/null +++ b/translations/app/Controller/Admin/GroupCrudController/admin.fr.xlf @@ -0,0 +1,15 @@ + + + +
+ +
+ + + app.controller.admin.group_crud_controller.field.services_enabled.parent_disabled + Un des groupes parents de ce groupe a désactivé la disponibilité des services + + + +
+
diff --git a/translations/app/Controller/Admin/PlatformOfferCrudController/admin.fr.xlf b/translations/app/Controller/Admin/PlatformOfferCrudController/admin.fr.xlf new file mode 100644 index 0000000..8d81373 --- /dev/null +++ b/translations/app/Controller/Admin/PlatformOfferCrudController/admin.fr.xlf @@ -0,0 +1,20 @@ + + + +
+ +
+ + + platform_offers + Tarifs d'adhésion pour la plateforme + + + + PlatformOffer + Tarifs d'adhésion + + + +
+
diff --git a/translations/app/Controller/Admin/ServiceCrudController/admin.fr.xlf b/translations/app/Controller/Admin/ServiceCrudController/admin.fr.xlf new file mode 100644 index 0000000..fed3404 --- /dev/null +++ b/translations/app/Controller/Admin/ServiceCrudController/admin.fr.xlf @@ -0,0 +1,15 @@ + + + +
+ +
+ + + app.controller.admin.service_crud_controller.field.groups.help + Aucun des groupes du/de la propriétaire n'a la disponibilité des services activée + + + +
+
diff --git a/translations/app/Controller/Admin/UserCrudController/admin.fr.xlf b/translations/app/Controller/Admin/UserCrudController/admin.fr.xlf new file mode 100644 index 0000000..2c0ae11 --- /dev/null +++ b/translations/app/Controller/Admin/UserCrudController/admin.fr.xlf @@ -0,0 +1,15 @@ + + + +
+ +
+ + + app.controller.admin.user_crud_controller.expires_in.formatted_value + %days% jour(s). + + + +
+
diff --git a/translations/app/Controller/Payment/DoneAction/messages.fr.xlf b/translations/app/Controller/Payment/Group/DoneAction/messages.fr.xlf similarity index 66% rename from translations/app/Controller/Payment/DoneAction/messages.fr.xlf rename to translations/app/Controller/Payment/Group/DoneAction/messages.fr.xlf index c0b0d1e..4d87247 100644 --- a/translations/app/Controller/Payment/DoneAction/messages.fr.xlf +++ b/translations/app/Controller/Payment/Group/DoneAction/messages.fr.xlf @@ -5,28 +5,28 @@ - - app.controller.payment.done_action.flash.success + + app.controller.payment.group.done_action.flash.success Paiement réussi. Vous êtes désormais membre du groupe %group%. - - app.controller.payment.done_action.status.new + + app.controller.payment.group.done_action.status.new Le paiement est en cours mais n'a pas encore abouti. - - app.controller.payment.done_action.status.failed + + app.controller.payment.group.done_action.status.failed Le paiement a échoué, vous n'avez pas été prélevé·e. - - app.controller.payment.done_action.status.canceled + + app.controller.payment.group.done_action.status.canceled Le paiement a été annulé, vous n'avez pas été prélevé·e. - - app.controller.payment.done_action.status.expired + + app.controller.payment.group.done_action.status.expired Le paiement a expiré, veuillez réessayer. diff --git a/translations/app/Controller/Payment/PlatformMembership/messages.fr.xlf b/translations/app/Controller/Payment/PlatformMembership/messages.fr.xlf new file mode 100644 index 0000000..18c12b2 --- /dev/null +++ b/translations/app/Controller/Payment/PlatformMembership/messages.fr.xlf @@ -0,0 +1,34 @@ + + + +
+ +
+ + + app.controller.payment.platform_membership.done_action.flash.success + Paiement réussi. Vous êtes désormais membre de la plateforme %platform%. Veuillez renseigner votre adresse afin de pouvoir utiliser les différents services. + + + + app.controller.payment.platform_membership.done_action.status.new + Le paiement est en cours mais n'a pas encore abouti. + + + + app.controller.payment.platform_membership.done_action.status.failed + Le paiement a échoué, vous n'avez pas été prélevé·e. + + + + app.controller.payment.platform_membership.done_action.status.canceled + Le paiement a été annulé, vous n'avez pas été prélevé·e. + + + + app.controller.payment.platform_membership.done_action.status.expired + Le paiement a expiré, veuillez réessayer. + + +
+
diff --git a/translations/app/Controller/Security/AccountCreateController/messages.fr.xlf b/translations/app/Controller/Security/AccountCreateController/messages.fr.xlf index eac3165..cbee186 100644 --- a/translations/app/Controller/Security/AccountCreateController/messages.fr.xlf +++ b/translations/app/Controller/Security/AccountCreateController/messages.fr.xlf @@ -15,11 +15,21 @@ Votre compte a bien été créé. Veuillez renseigner votre adresse afin de pouvoir utiliser les différents services.
- + + app.controller.security.account_create_controller.step2.global_paid_membership.flash.success + Votre compte a bien été créé. Pour accéder à la plateforme, veuillez payer l'adhésion. + + + app.controller.security.account_create_controller.step2.with_invitation.flash.success Votre compte a bien été créé. Vous pouvez accepter l'invitation sur la page du groupe. + + app.controller.security.account_create_controller.step2.with_invitation.global_paid_membership.flash.success + Votre compte a bien été créé. Pour accéder à la plateforme, veuillez payer l'adhésion. Vous pourrez alors accepter l'invitation sur la page du groupe. + + app.controller.security.account_create_controller.step2.user_not_found.warning Aucun·e utilisateur·rice correspondant à ce code n'a été trouvé·e. Si votre compte est déjà confirmé veuillez vous connecter. diff --git a/translations/app/Form/Type/Product/ServiceFormType/messages.fr.xlf b/translations/app/Form/Type/Product/ServiceFormType/messages.fr.xlf index 9c405a3..1026009 100644 --- a/translations/app/Form/Type/Product/ServiceFormType/messages.fr.xlf +++ b/translations/app/Form/Type/Product/ServiceFormType/messages.fr.xlf @@ -5,11 +5,15 @@ - + app.form.type.product.service_form_type.form.groups Visible dans mes groupes : + + app.form.type.product.service_form_type.form.no_groups + Vous n'avez aucun groupe avec la disponibilité des services activée + diff --git a/translations/app/Mailer/Email/Command/EndPlatformMembershipMail/email.fr.xlf b/translations/app/Mailer/Email/Command/EndPlatformMembershipMail/email.fr.xlf new file mode 100644 index 0000000..0a23d65 --- /dev/null +++ b/translations/app/Mailer/Email/Command/EndPlatformMembershipMail/email.fr.xlf @@ -0,0 +1,15 @@ + + + +
+ +
+ + + app.mailer.email.command.end_platform_membership_mail.subject + %brand% : Expiration de votre adhésion à la plateforme %platform%. + + + +
+
diff --git a/translations/app/Mailer/Email/Command/NotifyPlatformMembershipExpirationMail/email.fr.xlf b/translations/app/Mailer/Email/Command/NotifyPlatformMembershipExpirationMail/email.fr.xlf new file mode 100644 index 0000000..99deb01 --- /dev/null +++ b/translations/app/Mailer/Email/Command/NotifyPlatformMembershipExpirationMail/email.fr.xlf @@ -0,0 +1,15 @@ + + + +
+ +
+ + + app.mailer.email.command.notify_platform_membership_expiration_mail.subject + %brand% : expiration de l'adhésion à la plateforme %platform% dans %days% jour(s). + + + +
+
diff --git a/translations/app/Mailer/Email/Payment/PlatformMembershipPaidMail/email.fr.xlf b/translations/app/Mailer/Email/Payment/PlatformMembershipPaidMail/email.fr.xlf new file mode 100644 index 0000000..599506c --- /dev/null +++ b/translations/app/Mailer/Email/Payment/PlatformMembershipPaidMail/email.fr.xlf @@ -0,0 +1,15 @@ + + + +
+ +
+ + + app.mailer.email.command.platform_membership_paid_mail.subject + %brand% : Confirmation de votre adhésion à la plateforme %platform%. + + + +
+
diff --git a/translations/group/admin.fr.xlf b/translations/group/admin.fr.xlf index c2b00d8..fd333a5 100644 --- a/translations/group/admin.fr.xlf +++ b/translations/group/admin.fr.xlf @@ -25,6 +25,11 @@ Envoi d'invitations par les admins possible
+ + Services Enabled + Activer la disponibilité des services pour le groupe + + Invitation By Moderator Envoi d'invitations par les modérateur·rice·s possible diff --git a/translations/parameters/admin.fr.xlf b/translations/parameters/admin.fr.xlf index 87cfc04..9066ee5 100644 --- a/translations/parameters/admin.fr.xlf +++ b/translations/parameters/admin.fr.xlf @@ -6,12 +6,27 @@ - + + + parameter.global_name + Nom de la plateforme + + parameter.services Services activés + + parameter.paid_membership + Adhésion à la plateforme payante + + + + parameter.set_price + Configurer le tarif + + parameter.mail diff --git a/translations/product/messages.fr.xlf b/translations/product/messages.fr.xlf index a165e60..5615560 100644 --- a/translations/product/messages.fr.xlf +++ b/translations/product/messages.fr.xlf @@ -105,6 +105,11 @@ Uniquement mes groupes + + product.service.form.visibility + Uniquement mes groupes + + new_product.available diff --git a/translations/templates/email/command/end_platform_membership/email.fr.xlf b/translations/templates/email/command/end_platform_membership/email.fr.xlf new file mode 100644 index 0000000..7b19e79 --- /dev/null +++ b/translations/templates/email/command/end_platform_membership/email.fr.xlf @@ -0,0 +1,26 @@ + + + +
+ +
+ + + emplates.email.command.end_platform_membership.h1 + Bonjour ! + + + + templates.email.command.end_platform_membership.p1 + Votre adhésion à la plateforme %platform% a expiré le %endAt%. + Connectez-vous à votre compte pour renouveler votre adhésion. + + + + templates.email.command.end_platform_membership.loginLink + Me connecter + + + +
+
diff --git a/translations/templates/email/command/notify_platform_membership_expiration/email.fr.xlf b/translations/templates/email/command/notify_platform_membership_expiration/email.fr.xlf new file mode 100644 index 0000000..d235ff3 --- /dev/null +++ b/translations/templates/email/command/notify_platform_membership_expiration/email.fr.xlf @@ -0,0 +1,20 @@ + + + +
+ +
+ + + templates.email.command.notify_membership_expiration.h1 + Bonjour ! + + + + templates.email.command.notify_membership_expiration.p1 + Votre adhésion à la plateform %platform% expire dans %days% jour(s). + + + +
+
diff --git a/translations/templates/email/payment/platform_membership_paid/email.fr.xlf b/translations/templates/email/payment/platform_membership_paid/email.fr.xlf new file mode 100644 index 0000000..6ec8626 --- /dev/null +++ b/translations/templates/email/payment/platform_membership_paid/email.fr.xlf @@ -0,0 +1,21 @@ + + + +
+ +
+ + + emplates.email.payment.platform_membership_paid.h1 + Bonjour ! + + + + templates.email.payment.platform_membership_paid.p1 + Votre adhésion à la plateforme %platform% a bien été pris en compte le %startAt%. + Il expirera le %endAt% + + + +
+
diff --git a/translations/templates/pages/group/create/messages.fr.xlf b/translations/templates/pages/group/create/messages.fr.xlf index 5776265..331a35b 100644 --- a/translations/templates/pages/group/create/messages.fr.xlf +++ b/translations/templates/pages/group/create/messages.fr.xlf @@ -26,6 +26,11 @@ Type
+ + templates.pages.group.create.form.servicesEnabled + Activer la disponibilité des services pour le groupe + + templates.pages.group.create.form.membership Tarif diff --git a/translations/templates/pages/messages.fr.xlf b/translations/templates/pages/messages.fr.xlf new file mode 100644 index 0000000..ba0cc08 --- /dev/null +++ b/translations/templates/pages/messages.fr.xlf @@ -0,0 +1,65 @@ + + + +
+ +
+ + + + templates.pages.redirect_to_payment.type.yearly + Adhésion annuel + + + + templates.pages.redirect_to_payment.type.monthly + Adhésion mensuel + + + + templates.pages.redirect_to_payment.type.oneshot + Unique + + + + templates.pages.redirect_to_payment.choose_offer + Rejoindre la plateforme + + + + templates.pages.redirect_to_payment.close + Annuler + + + + templates.pages.redirect_to_payment.membership + Adhésion: + + + + templates.pages.redirect_to_payment.membership.start + À partir de + + + + templates.pages.redirect_to_payment.payment_prepare.form.submit + Accéder au paiement + + + + templates.pages.redirect_payment.title + Bienvenue sur %name% + + + + templates.pages.redirect_to_payment.text + Pour avoir accès aux prêts/emprunts sur notre plateforme, il faut être adhérent. + + + + templates.pages.redirect_to_payment.button + Payer mon adhésion + + +
+
diff --git a/translations/user/validators.fr.xlf b/translations/user/validators.fr.xlf new file mode 100644 index 0000000..cc175b2 --- /dev/null +++ b/translations/user/validators.fr.xlf @@ -0,0 +1,21 @@ + + + +
+ +
+ + + + validator.user.membership_paid + Veuillez remplir ce champ + + + + validator.user.unique.message + Cette valeur est déjà utilisée. + + + +
+
diff --git a/webpack.config.js b/webpack.config.js index fef2287..a6620c4 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -21,6 +21,7 @@ Encore * and one CSS file (e.g. app.css) if your JavaScript imports CSS. */ .addEntry('app', './assets/app.js') + .addEntry('admin', './assets/admin.js') // enables the Symfony UX Stimulus bridge (used in assets/bootstrap.js) .enableStimulusBridge('./assets/controllers.json')