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 4c2e706..9b99806 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -124,6 +124,7 @@ 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=payum.apikey="${{ secrets.payum-apikey }}" \ --set=mailer.dsn="${{ secrets.mailer-dsn }}" \ --set=sms.dsn="${{ secrets.sms-dsn }}" \ diff --git a/README.md b/README.md index fd75dc5..b614fa1 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,13 @@ Le code est disponible sous licence AGPL (Affero General Public License). Voir l ## Interface d’administration La plateforme dispose d’une interface d’administration, utilisant EasyAdmin, accessible aux utilisateur·rice·s disposant du rôle “administrateur·rice”. -Les administrateur·rice·s peuvent être ajoutés ou supprimés via l’interface d’administration. +Les administrateur·rice·s peuvent être ajoutés ou supprimés via l’interface d’administration. + + +## Paiement de l'adhésion à la plateforme +Il est possible d'activer ou désactiver cette fonctionnalité dans l'interface d’administration. +Si le paiement d'une adhésion à la plateforme est activé, il faut renseigner les tarifs d'adhésion (unique, mensuel, annuel), et le paiement devra se faire par l’utilisateur·rice après la création de son compte afin d'accéder aux fonctionnalités proposées (création d'objets, demandes d'emprunts etc.) +Si l’adhésion a une date de fin, lors de l’expiration de celle-ci, l’utilisateur·rice devra payer à nouveau son adhésion afin d'utiliser la plateforme. ## Utilisateur·rice·s Les utilisateur·rice·s peuvent s’inscrire librement sur la plateforme avec une adresse e-mail valide. @@ -80,7 +86,7 @@ L’utilisateur·rice peut également renseigner des périodes d’indisponibili La plateforme propose un traitement similaire aux objets et aux services. Les objets et services peuvent être consultés par les administrateur·rice·s dans l’interface d’administration. -Les services peuvent être activés ou désactivés pour l'instance, via l'espace d'administration. +Les services peuvent être activés ou désactivés pour l'instance, et/ou par groupe et sous-groupe via l'espace d'administration. ### Catégories @@ -159,6 +165,8 @@ La plateforme gère l’envoi de notifications automatiques par e-mail et SMS po | Nouveau gérant·e ou administrateur·rice de groupe | E-mail et SMS | | Invitation dans un groupe | E-mail et SMS | | Rappel expiration d’adhésion à 1 groupe J-7 J | E-mail et SMS | +| Confirmation du paiement de l'adhésion à la platefome | E-mail | +| Expiration d’adhésion à la platefome | E-mail | L’envoi d’email devra être configuré pour chaque instance avec un service tiers dédié (envoi serveur, Mailgun, Sendinblue, Mailchimp, …) @@ -187,12 +195,14 @@ L’interface d’administration permet de configurer les liens du menu. Le pied ## Fonctionnalités configurables Les options suivantes peuvent être configurées manuellement dans l’espace d’administration : - Activation des services +- Activation du paiement de l'adhésion et configuration des tarifs - Gestion des administrateur·rice·s de l’instance - Expéditeur des notifications (e-mail, nom) - Activation du lien de contact dans le menu - Activation des groupes - Création de groupe : Ouverte à tous ou uniquement par les administrateur·rice·s de l'instance - Création de groupe payante ou gratuite (NB : le paiement se fait hors de la plateforme) +- Accès à la fonctionnalité Services pour un groupe ou sous-groupe - Conversations d’emprunt visibles ou masquées dans l’espace d’administration 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 ea38541..922046e 100644 --- a/helm/chart/templates/cronjob-fixture-reset.yaml +++ b/helm/chart/templates/cronjob-fixture-reset.yaml @@ -7,6 +7,7 @@ metadata: {{- include "plateforme-ebs.labels" . | nindent 4 }} spec: schedule: '0 0 * * *' + timeZone: "Europe/Paris" jobTemplate: metadata: annotations: @@ -23,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: @@ -198,4 +200,4 @@ spec: periodSeconds: 3 resources: {{- toYaml .Values.resources.fixtures | nindent 16 }} -{{- end }} \ No newline at end of file +{{- end }} 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 485e5ed..7fe2af5 100644 --- a/helm/chart/templates/fixtures-job.yaml +++ b/helm/chart/templates/fixtures-job.yaml @@ -33,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: 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 c718313..08f2711 100644 --- a/helm/chart/values.yaml +++ b/helm/chart/values.yaml @@ -33,10 +33,13 @@ php: usePathStyleEndpoint: true publicKey: "" secret: "" - fixtureJob: - enabled: false fixtureCron: enabled: false + fixtureJob: + enabled: false + +dailyCronjobs: + enabled: true maildev: enabled: false @@ -48,9 +51,6 @@ mailer: sms: dsn: "null://null" -dailyCronjobs: - enabled: true - consumer: # We don't use async for now so consumer isn't needed enabled: false @@ -80,6 +80,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')