diff --git a/.composer-require-checker.json b/.composer-require-checker.json new file mode 100644 index 0000000..c11ac16 --- /dev/null +++ b/.composer-require-checker.json @@ -0,0 +1,10 @@ +{ + "symbol-whitelist": [ + "null", "true", "false", + "static", "self", "parent", + "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", + "Contao\\ManagerPlugin\\Bundle\\BundlePluginInterface", + "Contao\\ManagerPlugin\\Bundle\\Parser\\ParserInterface", + "Contao\\ManagerPlugin\\Bundle\\Config\\BundleConfig" + ] +} diff --git a/.ddev/.gitignore b/.ddev/.gitignore new file mode 100644 index 0000000..fcd77f8 --- /dev/null +++ b/.ddev/.gitignore @@ -0,0 +1,47 @@ +#ddev-generated: Automatically generated ddev .gitignore. + +/**/*.example +/.dbimageBuild +/.dbimageExtra +/.ddev-docker-*.yaml +/.*downloads +/.global_commands +/.homeadditions +/.importdb* +/.sshimageBuild +/.venv +/.webimageBuild +/.webimageExtra +/apache/apache-site.conf +/commands/.gitattributes +/commands/db/mysql +/commands/host/launch +/commands/web/xdebug +/commands/web/live +/config.local.y*ml +/db_snapshots +/import-db +/import.yaml +/mutagen/mutagen.yml +/mutagen/.start-synced +/nginx_full/nginx-site.conf +/postgres/postgresql.conf +/providers/acquia.yaml +/providers/lagoon.yaml +/providers/platform.yaml +/providers/upsun.yaml +/sequelpro.spf +/settings/settings.ddev.py +/traefik/config/hofff-contao-navigation.yaml +/traefik/certs/hofff-contao-navigation.crt +/traefik/certs/hofff-contao-navigation.key +/xhprof/xhprof_prepend.php +/**/README.* +!/backup +/contao/vendor +/contao/assets +/contao/public +/contao/bin +/contao/system +/contao/var +/contao/.env.local diff --git a/.ddev/backup/database.sql.gz b/.ddev/backup/database.sql.gz new file mode 100644 index 0000000..67c3093 Binary files /dev/null and b/.ddev/backup/database.sql.gz differ diff --git a/.ddev/commands/host/console b/.ddev/commands/host/console new file mode 100755 index 0000000..b1e0711 --- /dev/null +++ b/.ddev/commands/host/console @@ -0,0 +1,7 @@ +#!/bin/bash + +## Description: Delegates commands to the contao console +## Usage: console +## Example: "ddev console contao:migrate" + +ddev exec vendor/bin/contao-console "$@" diff --git a/.ddev/commands/host/migrate b/.ddev/commands/host/migrate new file mode 100755 index 0000000..16144eb --- /dev/null +++ b/.ddev/commands/host/migrate @@ -0,0 +1,7 @@ +#!/bin/bash + +## Description: Executes Contao database migration +## Usage: migrate +## Example: "ddev migrate --no-backup" + +ddev exec vendor/bin/contao-console contao:migrate "$@" diff --git a/.ddev/config.yaml b/.ddev/config.yaml new file mode 100644 index 0000000..64653d9 --- /dev/null +++ b/.ddev/config.yaml @@ -0,0 +1,24 @@ +name: hofff-contao-navigation +type: php +docroot: ".ddev/contao/public" +php_version: "8.1" +webserver_type: apache-fpm +router_http_port: "80" +router_https_port: "443" +xdebug_enabled: false +additional_hostnames: [] +additional_fqdns: [] +database: + type: mariadb + version: "10.4" +nfs_mount_enabled: false +mutagen_enabled: false +use_dns_when_possible: true +composer_root: ".ddev/contao" +composer_version: "2" +web_environment: [] +nodejs_version: "16" +timezone: Europe/Berlin +working_dir: { + web: "/var/www/html/.ddev/contao" +} diff --git a/.ddev/contao/.env b/.ddev/contao/.env new file mode 100644 index 0000000..fd23acf --- /dev/null +++ b/.ddev/contao/.env @@ -0,0 +1,2 @@ +APP_ENV=dev +DATABASE_URL="mysql://db:db@db:3306/db" diff --git a/.ddev/contao/composer.json b/.ddev/contao/composer.json new file mode 100644 index 0000000..9e0ae28 --- /dev/null +++ b/.ddev/contao/composer.json @@ -0,0 +1,42 @@ +{ + "name": "contao/managed-edition", + "description": "Contao Managed Edition", + "license": "LGPL-3.0-or-later", + "type": "project", + "require": { + "contao/conflicts": "@dev", + "contao/manager-bundle": "^5.3", + "hofff/contao-navigation": "@dev" + }, + "conflict": { + "contao-components/installer": "<1.3" + }, + "minimum-stability": "dev", + "prefer-stable": true, + "config": { + "allow-plugins": { + "composer/package-versions-deprecated": true, + "contao-community-alliance/composer-plugin": true, + "contao-components/installer": true, + "contao/manager-plugin": true, + "php-http/discovery": false + } + }, + "extra": { + "contao-component-dir": "assets" + }, + "scripts": { + "post-install-cmd": [ + "@php vendor/bin/contao-setup" + ], + "post-update-cmd": [ + "@php vendor/bin/contao-setup" + ] + }, + "repositories": [ + { + "type": "path", + "url": "../.." + } + ] +} diff --git a/.ddev/contao/composer.lock b/.ddev/contao/composer.lock new file mode 100644 index 0000000..26bc3ac --- /dev/null +++ b/.ddev/contao/composer.lock @@ -0,0 +1,12951 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1b118b7e232f4ce3bbd395b7d5730fbc", + "packages": [ + { + "name": "ausi/slug-generator", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/ausi/slug-generator.git", + "reference": "4e761b08966c5d4aeecc1829ac997e5a5a29d231" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ausi/slug-generator/zipball/4e761b08966c5d4aeecc1829ac997e5a5a29d231", + "reference": "4e761b08966c5d4aeecc1829ac997e5a5a29d231", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "lib-icu": ">=4.2.1", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "contao/easy-coding-standard": "^3.0", + "phpstan/phpstan": "^0.12.40", + "phpstan/phpstan-phpunit": "^0.12.16", + "phpunit/phpunit": "^7.5.20 || ^8.5.4 || ^9.4.2", + "psalm/plugin-phpunit": "^0.9", + "slam/phpstan-extensions": "^5.0", + "vimeo/psalm": "^3.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ausi\\SlugGenerator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Martin Auswöger", + "email": "martin@auswoeger.com" + } + ], + "description": "Slug Generator", + "keywords": [ + "ascii", + "cldr", + "pretty-url", + "slug", + "slug-generator", + "slugify", + "transliteration", + "unicode" + ], + "support": { + "issues": "https://github.com/ausi/slug-generator/issues", + "source": "https://github.com/ausi/slug-generator/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/ausi", + "type": "github" + } + ], + "time": "2020-10-19T15:25:33+00:00" + }, + { + "name": "bacon/bacon-qr-code", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.1", + "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + }, + "time": "2022-12-07T17:46:57+00:00" + }, + { + "name": "beberlei/assert", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/beberlei/assert.git", + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": ">=6.0.0", + "yoast/phpunit-polyfills": "^0.1.0" + }, + "suggest": { + "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Assert/functions.php" + ], + "psr-4": { + "Assert\\": "lib/Assert" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de", + "role": "Lead Developer" + }, + { + "name": "Richard Quadling", + "email": "rquadling@gmail.com", + "role": "Collaborator" + } + ], + "description": "Thin assertion library for input validation in business models.", + "keywords": [ + "assert", + "assertion", + "validation" + ], + "support": { + "issues": "https://github.com/beberlei/assert/issues", + "source": "https://github.com/beberlei/assert/tree/v3.3.2" + }, + "time": "2021-12-16T21:41:27+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.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-20T15:40:13+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "b66d11b7479109ab547f9405b97205640b17d385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", + "reference": "b66d11b7479109ab547f9405b97205640b17d385", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-12-18T12:05:55+00:00" + }, + { + "name": "contao-components/ace", + "version": "1.32.6", + "source": { + "type": "git", + "url": "https://github.com/contao-components/ace.git", + "reference": "cdf6a74c93d03c28457ccce16c61184edd3fa047" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/ace/zipball/cdf6a74c93d03c28457ccce16c61184edd3fa047", + "reference": "cdf6a74c93d03c28457ccce16c61184edd3fa047", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabian Jakobs", + "homepage": "https://github.com/fjakobs" + } + ], + "description": "ACE code editor integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/ace/issues", + "source": "https://github.com/contao-components/ace/tree/1.32.6" + }, + "time": "2024-02-07T09:27:31+00:00" + }, + { + "name": "contao-components/chosen", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/contao-components/chosen.git", + "reference": "da03c67010b8fc520f64f2a9bbfcafb453ad2489" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/chosen/zipball/da03c67010b8fc520f64f2a9bbfcafb453ad2489", + "reference": "da03c67010b8fc520f64f2a9bbfcafb453ad2489", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jules Janssen", + "homepage": "https://github.com/julesjanssen" + } + ], + "description": "Chosen integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/chosen/issues", + "source": "https://github.com/contao-components/chosen/tree/2.0.2" + }, + "time": "2023-09-01T07:42:59+00:00" + }, + { + "name": "contao-components/colorbox", + "version": "1.6.6", + "source": { + "type": "git", + "url": "https://github.com/contao-components/colorbox.git", + "reference": "80c3b1b5adff4add0a7a54db93ad0bf15ae6bd9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/colorbox/zipball/80c3b1b5adff4add0a7a54db93ad0bf15ae6bd9d", + "reference": "80c3b1b5adff4add0a7a54db93ad0bf15ae6bd9d", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "Colorbox integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/colorbox/issues", + "source": "https://github.com/contao-components/colorbox/tree/1.6.6" + }, + "time": "2020-05-01T15:29:20+00:00" + }, + { + "name": "contao-components/colorpicker", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/contao-components/colorpicker.git", + "reference": "fd6f899746c6a18fbfdfd30e156f862894b00d3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/colorpicker/zipball/fd6f899746c6a18fbfdfd30e156f862894b00d3b", + "reference": "fd6f899746c6a18fbfdfd30e156f862894b00d3b", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christopher Beloch", + "homepage": "https://github.com/CBeloch" + } + ], + "description": "Color picker integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/colorpicker/issues", + "source": "https://github.com/contao-components/colorpicker/tree/1.5.3" + }, + "time": "2024-01-19T16:00:42+00:00" + }, + { + "name": "contao-components/contao", + "version": "9.3.4", + "source": { + "type": "git", + "url": "https://github.com/contao-components/contao.git", + "reference": "a34e1327beabe1f1623e853c46ab7a7cbf9fc7da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/contao/zipball/a34e1327beabe1f1623e853c46ab7a7cbf9fc7da", + "reference": "a34e1327beabe1f1623e853c46ab7a7cbf9fc7da", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "Contao Open Source CMS components", + "support": { + "issues": "https://github.com/contao-components/contao/issues", + "source": "https://github.com/contao-components/contao/tree/9.3.4" + }, + "time": "2023-10-12T07:49:31+00:00" + }, + { + "name": "contao-components/datepicker", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/contao-components/datepicker.git", + "reference": "355e79949cb2c3ff5016b41ef13f426333d01632" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/datepicker/zipball/355e79949cb2c3ff5016b41ef13f426333d01632", + "reference": "355e79949cb2c3ff5016b41ef13f426333d01632", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arian Stolwijk", + "homepage": "https://github.com/arian" + } + ], + "description": "Date picker integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/datepicker/issues", + "source": "https://github.com/contao-components/datepicker/tree/3.0.0" + }, + "time": "2023-01-07T14:42:52+00:00" + }, + { + "name": "contao-components/dropzone", + "version": "5.9.3", + "source": { + "type": "git", + "url": "https://github.com/contao-components/dropzone.git", + "reference": "212c524e3c226b01e8232287c764b22d7469df6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/dropzone/zipball/212c524e3c226b01e8232287c764b22d7469df6a", + "reference": "212c524e3c226b01e8232287c764b22d7469df6a", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "DropZone integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/dropzone/issues", + "source": "https://github.com/contao-components/dropzone/tree/5.9.3" + }, + "time": "2021-09-28T07:38:53+00:00" + }, + { + "name": "contao-components/handorgel", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/contao-components/handorgel.git", + "reference": "0f617439750945848dfea006ea19e8f49244bc1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/handorgel/zipball/0f617439750945848dfea006ea19e8f49244bc1f", + "reference": "0f617439750945848dfea006ea19e8f49244bc1f", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Manuel Sommerhalder", + "homepage": "https://github.com/oncode" + } + ], + "description": "Handorgel integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/handorgel/issues", + "source": "https://github.com/contao-components/handorgel/tree/1.0.0" + }, + "time": "2023-12-22T15:41:53+00:00" + }, + { + "name": "contao-components/installer", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/contao-components/installer.git", + "reference": "eb0c34f0f61a3338dd985a55bd865483e78c3bb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/installer/zipball/eb0c34f0f61a3338dd985a55bd865483e78c3bb7", + "reference": "eb0c34f0f61a3338dd985a55bd865483e78c3bb7", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.6" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0", + "phpunit/phpunit": "^5.7.26" + }, + "type": "composer-plugin", + "extra": { + "class": "Contao\\ComponentsInstaller\\Composer\\Plugin" + }, + "autoload": { + "psr-4": { + "Contao\\ComponentsInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "Contao components installer", + "support": { + "issues": "https://github.com/contao-components/installer/issues", + "source": "https://github.com/contao-components/installer/tree/1.4.1" + }, + "time": "2020-12-23T10:51:52+00:00" + }, + { + "name": "contao-components/jquery", + "version": "3.7.1", + "source": { + "type": "git", + "url": "https://github.com/contao-components/jquery.git", + "reference": "34215fee962fc9b9831600d6b983d2f77d9e6f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/jquery/zipball/34215fee962fc9b9831600d6b983d2f77d9e6f71", + "reference": "34215fee962fc9b9831600d6b983d2f77d9e6f71", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "OpenJS Foundation and other contributors", + "homepage": "https://github.com/jquery/jquery/blob/main/AUTHORS.txt" + } + ], + "description": "jQuery integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/jquery/issues", + "source": "https://github.com/contao-components/jquery/tree/3.7.1" + }, + "time": "2023-08-31T10:23:57+00:00" + }, + { + "name": "contao-components/jquery-ui", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/contao-components/jquery-ui.git", + "reference": "f1ac19cfd2093663278ffa509038d0ffc6d38db5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/jquery-ui/zipball/f1ac19cfd2093663278ffa509038d0ffc6d38db5", + "reference": "f1ac19cfd2093663278ffa509038d0ffc6d38db5", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "jQuery Foundation and other contributors", + "homepage": "https://github.com/jquery/jquery-ui/blob/main/AUTHORS.txt" + } + ], + "description": "jQuery UI integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/jquery-ui/issues", + "source": "https://github.com/contao-components/jquery-ui/tree/1.13.2" + }, + "time": "2022-12-07T15:46:44+00:00" + }, + { + "name": "contao-components/mediabox", + "version": "1.5.5", + "source": { + "type": "git", + "url": "https://github.com/contao-components/mediabox.git", + "reference": "8f56fdbcfe7156e90a7f43e4976e09f61bdb1082" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/mediabox/zipball/8f56fdbcfe7156e90a7f43e4976e09f61bdb1082", + "reference": "8f56fdbcfe7156e90a7f43e4976e09f61bdb1082", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "Mediabox integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/mediabox/issues", + "source": "https://github.com/contao-components/mediabox/tree/1.5.5" + }, + "time": "2019-07-12T07:33:27+00:00" + }, + { + "name": "contao-components/mootools", + "version": "1.6.0.7", + "source": { + "type": "git", + "url": "https://github.com/contao-components/mootools.git", + "reference": "048bdd9264156f9b66175fddc4531694bfd5ce1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/mootools/zipball/048bdd9264156f9b66175fddc4531694bfd5ce1b", + "reference": "048bdd9264156f9b66175fddc4531694bfd5ce1b", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "MooTools Development Team", + "homepage": "http://mootools.net/developers" + } + ], + "description": "MooTools integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/mootools/issues", + "source": "https://github.com/contao-components/mootools/tree/1.6.0.7" + }, + "time": "2022-10-20T09:36:26+00:00" + }, + { + "name": "contao-components/simplemodal", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/contao-components/simplemodal.git", + "reference": "ba6aab8a88430f05a869a6f42f4573714ce6d762" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/simplemodal/zipball/ba6aab8a88430f05a869a6f42f4573714ce6d762", + "reference": "ba6aab8a88430f05a869a6f42f4573714ce6d762", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Dell'Anna", + "homepage": "https://plasm.it" + } + ], + "description": "SimpleModal integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/simplemodal/issues", + "source": "https://github.com/contao-components/simplemodal/tree/3.0.1" + }, + "time": "2023-11-06T10:36:23+00:00" + }, + { + "name": "contao-components/swipe", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/contao-components/swipe.git", + "reference": "29aec32b76cb7192d949f3bf3a51283b26b16094" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/swipe/zipball/29aec32b76cb7192d949f3bf3a51283b26b16094", + "reference": "29aec32b76cb7192d949f3bf3a51283b26b16094", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brad Birdsall", + "homepage": "https://github.com/thebird" + }, + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "A JavaScript touch slider with dot menu", + "support": { + "issues": "https://github.com/contao-components/swipe/issues", + "source": "https://github.com/contao-components/swipe/tree/2.2.1" + }, + "time": "2023-10-10T13:09:42+00:00" + }, + { + "name": "contao-components/swiper", + "version": "11.0.5", + "source": { + "type": "git", + "url": "https://github.com/contao-components/swiper.git", + "reference": "22e17071488228f52b54d83f5b7c87048306bfb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/swiper/zipball/22e17071488228f52b54d83f5b7c87048306bfb9", + "reference": "22e17071488228f52b54d83f5b7c87048306bfb9", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Vladimir Kharlampidi", + "homepage": "https://github.com/nolimits4web" + } + ], + "description": "The most modern mobile touch slider", + "support": { + "issues": "https://github.com/contao-components/swiper/issues", + "source": "https://github.com/contao-components/swiper/tree/11.0.5" + }, + "time": "2023-12-15T15:58:56+00:00" + }, + { + "name": "contao-components/tablesort", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/contao-components/tablesort.git", + "reference": "faabcfab17e388b767c8f5a18987c44429692a9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/tablesort/zipball/faabcfab17e388b767c8f5a18987c44429692a9d", + "reference": "faabcfab17e388b767c8f5a18987c44429692a9d", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "Contao Open Source CMS tablesort", + "support": { + "issues": "https://github.com/contao-components/tablesort/issues", + "source": "https://github.com/contao-components/tablesort/tree/4.0.1" + }, + "time": "2019-07-12T07:43:54+00:00" + }, + { + "name": "contao-components/tablesorter", + "version": "2.31.3", + "source": { + "type": "git", + "url": "https://github.com/contao-components/tablesorter.git", + "reference": "2b3f64c2ababdfe291e3248b26bbef5f4821f868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/tablesorter/zipball/2b3f64c2ababdfe291e3248b26bbef5f4821f868", + "reference": "2b3f64c2ababdfe291e3248b26bbef5f4821f868", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "jQuery tablesorter integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/tablesorter/issues", + "source": "https://github.com/contao-components/tablesorter/tree/2.31.3" + }, + "time": "2020-05-14T15:24:29+00:00" + }, + { + "name": "contao-components/tinymce4", + "version": "6.8.3", + "source": { + "type": "git", + "url": "https://github.com/contao-components/tinymce4.git", + "reference": "3c0d160bedf1825fdc7a9a04d79008356cdf7a8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/tinymce4/zipball/3c0d160bedf1825fdc7a9a04d79008356cdf7a8e", + "reference": "3c0d160bedf1825fdc7a9a04d79008356cdf7a8e", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Tiny", + "homepage": "https://github.com/tinymce" + } + ], + "description": "TinyMCE integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/tinymce4/issues", + "source": "https://github.com/contao-components/tinymce4/tree/6.8.3" + }, + "time": "2024-02-09T09:54:31+00:00" + }, + { + "name": "contao-components/tristen-tablesort", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/contao-components/tristen-tablesort.git", + "reference": "41367130f19432efa8e13c19483c16420110fc97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao-components/tristen-tablesort/zipball/41367130f19432efa8e13c19483c16420110fc97", + "reference": "41367130f19432efa8e13c19483c16420110fc97", + "shasum": "" + }, + "require": { + "contao-components/installer": "^1.0.9" + }, + "type": "contao-component", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tristen Brown", + "homepage": "https://github.com/tristen" + } + ], + "description": "Tablesort integration for Contao Open Source CMS", + "support": { + "issues": "https://github.com/contao-components/tristen-tablesort/issues", + "source": "https://github.com/contao-components/tristen-tablesort/tree/5.3.0" + }, + "time": "2022-06-24T13:24:06+00:00" + }, + { + "name": "contao/conflicts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/contao/conflicts.git", + "reference": "8d5342f2a54ce5ff61315ce8e1f58fa9d648a4ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao/conflicts/zipball/8d5342f2a54ce5ff61315ce8e1f58fa9d648a4ba", + "reference": "8d5342f2a54ce5ff61315ce8e1f58fa9d648a4ba", + "shasum": "" + }, + "conflict": { + "doctrine/dbal": "2.9.* <2.9.3 || 3.3.0 || 3.5.0 || 3.7.0", + "doctrine/doctrine-bundle": "2.6.0", + "doctrine/doctrine-migrations-bundle": "<1.1", + "doctrine/orm": "<2.4", + "doctrine/persistence": "1.3.2", + "knplabs/knp-time-bundle": "1.9.0", + "lcobucci/jwt": ">=4.2.0", + "league/flysystem-bundle": "3.3.0", + "lexik/maintenance-bundle": "2.1.4", + "php-http/discovery": "1.15.0", + "symfony/dependency-injection": "5.4.16 || 6.0.16 || 6.1.8 || 6.2.0 || 6.2.1", + "symfony/finder": "3.4.7 || 4.0.7 || 5.4.26 || 6.2.13 || 6.3.2", + "symfony/framework-bundle": "4.2.7 || 5.2.6", + "symfony/http-foundation": "4.4.27 || 4.4.46 || 5.4.13 || 6.0.13 || 6.1.5", + "symfony/http-kernel": "5.4.1 || 5.4.12", + "symfony/routing": "6.4.0", + "symfony/security": "3.3.17 || 3.4.7 || 3.4.8 || 3.4.11", + "symfony/swiftmailer-bundle": "2.6.* <2.6.2", + "symfony/twig-bundle": "4.1.0", + "symfony/web-profiler-bundle": "6.1.* <6.1.2", + "twig/twig": "2.7.0" + }, + "default-branch": true, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + } + ], + "description": "Contao 4 conflicting packages", + "support": { + "source": "https://github.com/contao/conflicts/tree/main" + }, + "funding": [ + { + "url": "https://to.contao.org/donate", + "type": "custom" + } + ], + "time": "2023-11-30T14:27:33+00:00" + }, + { + "name": "contao/core-bundle", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/contao/core-bundle.git", + "reference": "3870d9cd16680cdd90b5048788bb53ba643a977e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao/core-bundle/zipball/3870d9cd16680cdd90b5048788bb53ba643a977e", + "reference": "3870d9cd16680cdd90b5048788bb53ba643a977e", + "shasum": "" + }, + "require": { + "ausi/slug-generator": "^1.1", + "bacon/bacon-qr-code": "^2.0", + "composer-runtime-api": "^2.0.14", + "contao-components/ace": "^1.8", + "contao-components/chosen": "^2.0", + "contao-components/colorbox": "^1.6", + "contao-components/colorpicker": "^1.5", + "contao-components/contao": "^9.1", + "contao-components/datepicker": "^3.0", + "contao-components/dropzone": "^5.0.1", + "contao-components/handorgel": "^1.0", + "contao-components/jquery": "^3.5", + "contao-components/jquery-ui": "^1.11.4", + "contao-components/mediabox": "^1.5", + "contao-components/mootools": "^1.6.0.1", + "contao-components/simplemodal": "^3.0", + "contao-components/swipe": "^2.0.3", + "contao-components/swiper": "^11.0", + "contao-components/tablesort": "^4.0", + "contao-components/tablesorter": "^2.1", + "contao-components/tinymce4": "^5.0 || ^6.0", + "contao-components/tristen-tablesort": "^5.3", + "contao/image": "^1.2", + "contao/imagine-svg": "^1.0", + "debril/feed-io": "^6.0", + "doctrine/collections": "^2.1", + "doctrine/dbal": "^3.6", + "doctrine/doctrine-bundle": "^2.8", + "doctrine/orm": "^2.17", + "doctrine/persistence": "^3.2", + "dragonmantank/cron-expression": "^2.3", + "ext-dom": "*", + "ext-filter": "*", + "ext-gd": "*", + "ext-hash": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-pdo": "*", + "ext-session": "*", + "ext-zlib": "*", + "friendsofsymfony/http-cache": "^2.15.1", + "friendsofsymfony/http-cache-bundle": "^2.6", + "guzzlehttp/promises": "^1.5", + "imagine/imagine": "^1.2.4", + "knplabs/knp-menu": "^3.1", + "knplabs/knp-menu-bundle": "^3.0", + "knplabs/knp-time-bundle": "^1.11 || ^2.0", + "lcobucci/jwt": "^4.0", + "league/commonmark": "^2.2", + "league/flysystem": "^3.0", + "league/flysystem-bundle": "^3.0", + "matthiasmullie/minify": "^1.3", + "monolog/monolog": "^2.0", + "nelmio/cors-bundle": "^2.0.1", + "nelmio/security-bundle": "^3.0", + "nikic/php-parser": "^4.9", + "nyholm/psr7": "^1.2", + "paragonie/constant_time_encoding": "^2.2", + "php": "^8.1", + "phpspec/php-diff": "^1.0", + "psr/cache": "^3.0", + "psr/container": "^2.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1.1 || 2.0 || ^3.0", + "scheb/2fa-backup-code": "^6.0", + "scheb/2fa-bundle": "^6.0", + "scheb/2fa-trusted-device": "^6.0", + "scrivo/highlight.php": "^9.18", + "scssphp/scssphp": "^1.5", + "simplepie/simplepie": "^1.3", + "spatie/schema-org": "^3.4", + "spomky-labs/otphp": "^10.0", + "symfony-cmf/routing": "^3.0", + "symfony-cmf/routing-bundle": "^3.0", + "symfony/asset": "^6.4", + "symfony/cache": "^6.4", + "symfony/cache-contracts": "^3.0", + "symfony/config": "^6.4", + "symfony/console": "^6.4", + "symfony/dependency-injection": "^6.4", + "symfony/deprecation-contracts": "^3.0", + "symfony/doctrine-bridge": "^6.4", + "symfony/doctrine-messenger": "^6.4", + "symfony/dom-crawler": "^6.4", + "symfony/event-dispatcher": "^6.4", + "symfony/event-dispatcher-contracts": "^3.0", + "symfony/expression-language": "^6.4", + "symfony/filesystem": "^6.4", + "symfony/finder": "^6.4", + "symfony/framework-bundle": "^6.4", + "symfony/html-sanitizer": "^6.4", + "symfony/http-client": "^6.4", + "symfony/http-client-contracts": "^3.1", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.4", + "symfony/intl": "^6.4", + "symfony/lock": "^6.4", + "symfony/mailer": "^6.4", + "symfony/messenger": "^6.4", + "symfony/mime": "^6.4", + "symfony/monolog-bridge": "^6.4", + "symfony/password-hasher": "^6.4", + "symfony/polyfill-intl-idn": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/process": "^6.4", + "symfony/property-access": "^6.4", + "symfony/rate-limiter": "^6.4", + "symfony/routing": "^6.4", + "symfony/security-bundle": "^6.4", + "symfony/security-core": "^6.4", + "symfony/security-csrf": "^6.4", + "symfony/security-http": "^6.4", + "symfony/service-contracts": "^3.0", + "symfony/string": "^6.4", + "symfony/translation": "^6.4", + "symfony/translation-contracts": "^3.0", + "symfony/twig-bridge": "^6.4", + "symfony/twig-bundle": "^6.4", + "symfony/uid": "^6.4", + "symfony/var-dumper": "^6.4", + "symfony/yaml": "^6.4", + "terminal42/escargot": "^1.6", + "terminal42/service-annotation-bundle": "^1.1", + "toflar/cronjob-supervisor": "^1.0", + "twig/string-extra": "^3.0", + "twig/twig": "^3.8", + "ua-parser/uap-php": "^3.9", + "webignition/robots-txt-file": "^3.0", + "wikimedia/less.php": "^1.7" + }, + "conflict": { + "contao-community-alliance/composer-plugin": "<3.0", + "contao/core": "*", + "contao/manager-bundle": "^4.5 <4.5.2", + "contao/manager-plugin": "<2.0 || >=3.0", + "doctrine/cache": "<1.10", + "terminal42/contao-ce-access": "<3.0", + "thecodingmachine/safe": "<1.2" + }, + "require-dev": { + "contao/manager-plugin": "^2.3.1", + "contao/test-case": "self.version", + "ext-fileinfo": "*", + "league/flysystem-memory": "^3.0", + "phpunit/phpunit": "^9.5.19", + "symfony/browser-kit": "^6.4", + "symfony/phpunit-bridge": "^6.4", + "symfony/web-profiler-bundle": "^6.4" + }, + "type": "symfony-bundle", + "extra": { + "contao-manager-plugin": "Contao\\CoreBundle\\ContaoManager\\Plugin" + }, + "autoload": { + "psr-4": { + "Contao\\CoreBundle\\": "src/" + }, + "classmap": [ + "contao/" + ], + "exclude-from-classmap": [ + "contao/config/", + "contao/dca/", + "contao/languages/", + "contao/templates/", + "contao/themes/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + }, + { + "name": "Contao Community", + "homepage": "https://contao.org/contributors" + } + ], + "description": "Contao Open Source CMS", + "homepage": "https://contao.org", + "support": { + "docs": "https://docs.contao.org", + "forum": "https://community.contao.org", + "issues": "https://github.com/contao/contao/issues", + "source": "https://github.com/contao/core-bundle" + }, + "funding": [ + { + "url": "https://to.contao.org/donate", + "type": "other" + } + ], + "time": "2024-02-16T11:16:22+00:00" + }, + { + "name": "contao/image", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/contao/image.git", + "reference": "858d8be1f8500d26ace75c3a724b2ce73b11eebe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao/image/zipball/858d8be1f8500d26ace75c3a724b2ce73b11eebe", + "reference": "858d8be1f8500d26ace75c3a724b2ce73b11eebe", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-gd": "*", + "ext-hash": "*", + "ext-json": "*", + "ext-zlib": "*", + "imagine/imagine": "^1.3", + "php": "^7.2 || ^8.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.27", + "symfony/polyfill-php80": "^1.27" + }, + "conflict": { + "contao/imagine-svg": "<1.0 || >=2.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "contao/imagine-svg": "^1.0", + "contao/test-case": "^4.5", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/phpunit-bridge": "^5.4", + "symfony/polyfill-php81": "^1.27" + }, + "suggest": { + "ext-exif": "To support EXIF auto-rotation and preserve copyright metadata" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "target-directory": "tools" + } + }, + "autoload": { + "psr-4": { + "Contao\\Image\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Martin Auswöger", + "homepage": "https://github.com/ausi" + } + ], + "description": "Contao image library", + "support": { + "issues": "https://github.com/contao/image/issues", + "source": "https://github.com/contao/image/tree/1.2.0" + }, + "funding": [ + { + "url": "https://to.contao.org/donate", + "type": "custom" + } + ], + "time": "2023-05-30T13:29:46+00:00" + }, + { + "name": "contao/imagine-svg", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/contao/imagine-svg.git", + "reference": "913cf57746fbbf00ab7eba5e0585e2ef47a05b99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao/imagine-svg/zipball/913cf57746fbbf00ab7eba5e0585e2ef47a05b99", + "reference": "913cf57746fbbf00ab7eba5e0585e2ef47a05b99", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "imagine/imagine": "^1.1", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "contao/easy-coding-standard": "^3.0", + "contao/test-case": "^4.4", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12.8", + "phpstan/phpstan-symfony": "^0.12.6", + "phpunit/phpunit": "^8.5.4", + "psalm/plugin-phpunit": "^0.15", + "psalm/plugin-symfony": "^2.0", + "slam/phpstan-extensions": "^5.0", + "symfony/filesystem": "^5.0", + "thecodingmachine/phpstan-strict-rules": "^0.12", + "vimeo/psalm": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Contao\\ImagineSvg\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Martin Auswöger", + "homepage": "https://github.com/ausi" + } + ], + "description": "Contao Imagine SVG library", + "support": { + "issues": "https://github.com/contao/imagine-svg/issues", + "source": "https://github.com/contao/imagine-svg/tree/1.0.3" + }, + "time": "2021-08-10T09:33:50+00:00" + }, + { + "name": "contao/manager-bundle", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/contao/manager-bundle.git", + "reference": "c5b416a3105e605becfc799ae98c24fe64233306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao/manager-bundle/zipball/c5b416a3105e605becfc799ae98c24fe64233306", + "reference": "c5b416a3105e605becfc799ae98c24fe64233306", + "shasum": "" + }, + "require": { + "contao/core-bundle": "self.version", + "contao/manager-plugin": "^2.4", + "doctrine/dbal": "^3.6", + "doctrine/doctrine-bundle": "^2.8", + "ext-json": "*", + "friendsofsymfony/http-cache": "^2.6", + "friendsofsymfony/http-cache-bundle": "^2.6", + "nelmio/cors-bundle": "^2.0.1", + "nelmio/security-bundle": "^2.2 || ^3.0", + "php": "^8.1", + "symfony/cache": "^6.4", + "symfony/config": "^6.4", + "symfony/console": "^6.4", + "symfony/debug-bundle": "^6.4", + "symfony/dependency-injection": "^6.4", + "symfony/deprecation-contracts": "^3.0", + "symfony/doctrine-bridge": "^6.4", + "symfony/dotenv": "^6.4", + "symfony/error-handler": "^6.4", + "symfony/expression-language": "^6.4", + "symfony/filesystem": "^6.4", + "symfony/finder": "^6.4", + "symfony/framework-bundle": "^6.4", + "symfony/http-client": "^6.4", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.4", + "symfony/mailer": "^6.4", + "symfony/monolog-bridge": "^6.4", + "symfony/monolog-bundle": "^3.1", + "symfony/process": "^6.4", + "symfony/routing": "^6.4", + "symfony/security-bundle": "^6.4", + "symfony/stopwatch": "^6.4", + "symfony/twig-bundle": "^6.4", + "symfony/web-profiler-bundle": "^6.4", + "symfony/yaml": "^6.4", + "toflar/psr6-symfony-http-cache-store": "^4.0", + "twig/extra-bundle": "^3.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "contao/news-bundle": "self.version", + "contao/test-case": "self.version", + "phpunit/phpunit": "^9.5", + "symfony/phpunit-bridge": "^6.4" + }, + "bin": [ + "bin/contao-console", + "bin/contao-setup" + ], + "type": "symfony-bundle", + "extra": { + "contao-manager-plugin": "Contao\\ManagerBundle\\ContaoManager\\Plugin" + }, + "autoload": { + "psr-4": { + "Contao\\ManagerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Leo Feyer", + "homepage": "https://github.com/leofeyer" + }, + { + "name": "Contao Community", + "homepage": "https://contao.org/contributors" + } + ], + "description": "Provides the Contao Managed Edition", + "homepage": "https://contao.org", + "support": { + "docs": "https://docs.contao.org", + "forum": "https://community.contao.org", + "issues": "https://github.com/contao/contao/issues", + "source": "https://github.com/contao/manager-bundle" + }, + "funding": [ + { + "url": "https://to.contao.org/donate", + "type": "other" + } + ], + "time": "2024-02-16T11:01:20+00:00" + }, + { + "name": "contao/manager-plugin", + "version": "2.13.1", + "source": { + "type": "git", + "url": "https://github.com/contao/manager-plugin.git", + "reference": "06b53b7f5a63f5632e3da7788a96536b4a5d0b9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contao/manager-plugin/zipball/06b53b7f5a63f5632e3da7788a96536b4a5d0b9b", + "reference": "06b53b7f5a63f5632e3da7788a96536b4a5d0b9b", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.7 || ^2.0", + "php": "^7.1 || ^8.0", + "symfony/config": "^3.3 || ^4.0 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^3.3 || ^4.0 || ^5.0 || ^6.0", + "symfony/filesystem": "^3.3 || ^4.0 || ^5.0 || ^6.0", + "symfony/http-kernel": "^3.3 || ^4.0 || ^5.0 || ^6.0", + "symfony/routing": "^3.3 || ^4.0 || ^5.0 || ^6.0" + }, + "conflict": { + "contao/manager-bundle": "4.9.* <4.9.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "composer/composer": "^1.7 || ^2.0", + "contao/core-bundle": "^4.4 || ^5.0", + "ext-zip": "*", + "php-http/guzzle6-adapter": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.3", + "symfony/phpunit-bridge": "^3.4.40 || ^4.0 || ^5.0 || ^6.0", + "webmozart/path-util": "^2.0" + }, + "type": "composer-plugin", + "extra": { + "bamarni-bin": { + "bin-links": false, + "target-directory": "tools" + }, + "class": [ + "Contao\\ManagerPlugin\\Composer\\ArtifactsPlugin", + "Contao\\ManagerPlugin\\Composer\\ManagerPluginInstaller", + "Contao\\ManagerPlugin\\Composer\\AppAutoloadPlugin" + ] + }, + "autoload": { + "psr-4": { + "Contao\\ManagerPlugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Andreas Schempp", + "homepage": "https://github.com/aschempp" + } + ], + "description": "Contao 4 manager plugin", + "support": { + "issues": "https://github.com/contao/manager-plugin/issues", + "source": "https://github.com/contao/manager-plugin/tree/2.13.1" + }, + "funding": [ + { + "url": "https://to.contao.org/donate", + "type": "custom" + } + ], + "time": "2024-01-26T11:34:57+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.5" + }, + "time": "2023-08-25T16:18:39+00:00" + }, + { + "name": "debril/feed-io", + "version": "v6.0.3", + "source": { + "type": "git", + "url": "https://github.com/alexdebril/feed-io.git", + "reference": "0bde9ae2a611d7d36c5ba5afb291b174c2cccb27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alexdebril/feed-io/zipball/0bde9ae2a611d7d36c5ba5afb291b174c2cccb27", + "reference": "0bde9ae2a611d7d36c5ba5afb291b174c2cccb27", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "nyholm/psr7": "^1.5", + "php": ">=8.1", + "php-http/discovery": "^1.14", + "php-http/httplug": "^2.3", + "psr/http-client-implementation": "*", + "psr/log": "~1.0|~2.0|~3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.5", + "monolog/monolog": "1.*|2.*", + "php-http/mock-client": "^1.5", + "phpstan/phpstan": "^0.12.81", + "phpunit/phpunit": "~9.3.0" + }, + "suggest": { + "monolog/monolog": "Allows to handle logs", + "php-http/guzzle7-adapter": "Handles HTTP requests and responses" + }, + "bin": [ + "bin/feedio" + ], + "type": "library", + "autoload": { + "psr-4": { + "FeedIo\\": "src/FeedIo" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexandre Debril", + "email": "alex.debril@gmail.com" + } + ], + "description": "PHP library built to consume and serve JSONFeed / RSS / Atom feeds", + "homepage": "https://feed-io.net", + "keywords": [ + "atom", + "cli", + "client", + "feed", + "jsonfeed", + "news", + "rss" + ], + "support": { + "issues": "https://github.com/alexdebril/feed-io/issues", + "source": "https://github.com/alexdebril/feed-io/tree/v6.0.3" + }, + "time": "2023-10-16T14:12:49+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.1" + }, + "time": "2023-02-02T22:02:53+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "72328a11443a0de79967104ad36ba7b30bded134" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/72328a11443a0de79967104ad36ba7b30bded134", + "reference": "72328a11443a0de79967104ad36ba7b30bded134", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.1.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2023-10-03T09:22:33+00:00" + }, + { + "name": "doctrine/common", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^6.1", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.4.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2022-10-09T11:47:59+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.8.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "a19a1d05ca211f41089dffcc387733a6875196cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/a19a1d05ca211f41089dffcc387733a6875196cb", + "reference": "a19a1d05ca211f41089dffcc387733a6875196cb", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.57", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "9.6.16", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.8.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2024-02-12T18:36:36+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.11.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "492725310ae9a1b5b20d6ae09fb5ae6404616e68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/492725310ae9a1b5b20d6ae09fb5ae6404616e68", + "reference": "492725310ae9a1b5b20d6ae09fb5ae6404616e68", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/persistence": "^2.2 || ^3", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" + }, + "conflict": { + "doctrine/annotations": ">=3.0", + "doctrine/orm": "<2.17 || >=4.0", + "twig/twig": "<1.34 || >=2.0 <2.4" + }, + "require-dev": { + "doctrine/annotations": "^1 || ^2", + "doctrine/coding-standard": "^12", + "doctrine/deprecations": "^1.0", + "doctrine/orm": "^2.17 || ^3.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^5", + "psr/log": "^1.1.4 || ^2.0 || ^3.0", + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^5.15" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.11.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2024-02-10T20:56:20+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:59:15+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "doctrine/orm", + "version": "2.18.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "f2176a9ce56cafdfd1624d54bfdb076819083d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/f2176a9ce56cafdfd1624d54bfdb076819083d5b", + "reference": "f2176a9ce56cafdfd1624d54bfdb076819083d5b", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.12.1 || ^2.1.1", + "doctrine/collections": "^1.5 || ^2.1", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^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 || ^7.0", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.13 || >= 3.0" + }, + "require-dev": { + "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.35", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psr/log": "^1 || ^2 || ^3", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "vimeo/psalm": "4.30.0 || 5.16.0" + }, + "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.18.0" + }, + "time": "2024-01-31T15:53:12+00:00" + }, + { + "name": "doctrine/persistence", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/63fee8c33bef740db6730eb2a750cd3da6495603", + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^11", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.9.4", + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "src/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2023-05-17T18:32:04+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/25a06c7bf4c6b8218f47928654252863ffc890a5", + "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "https://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.3" + }, + "time": "2022-05-23T21:33:49+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2", + "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2020-10-13T00:52:37+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "friendsofsymfony/http-cache", + "version": "2.15.3", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfSymfony/FOSHttpCache.git", + "reference": "39f6b356fb253f95067b3c29139949ddbcae3934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSHttpCache/zipball/39f6b356fb253f95067b3c29139949ddbcae3934", + "reference": "39f6b356fb253f95067b3c29139949ddbcae3934", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "php-http/client-common": "^1.1.0 || ^2.0", + "php-http/client-implementation": "^1.0 || ^2.0", + "php-http/discovery": "^1.12", + "php-http/message": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "symfony/event-dispatcher": "^4.3 || ^5.0 || ^6.0", + "symfony/options-resolver": "^4.3 || ^5.0 || ^6.0" + }, + "conflict": { + "toflar/psr6-symfony-http-cache-store": "<2.2.1" + }, + "require-dev": { + "mockery/mockery": "^1.3.1", + "monolog/monolog": "^1.0", + "php-http/guzzle7-adapter": "^0.1.1", + "php-http/mock-client": "^1.2", + "symfony/http-kernel": "^4.3 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.0 || ^6.0", + "symfony/process": "^4.3 || ^5.0 || ^6.0" + }, + "suggest": { + "friendsofsymfony/http-cache-bundle": "For integration with the Symfony framework", + "monolog/monolog": "For logging issues while invalidating" + }, + "type": "library", + "autoload": { + "psr-4": { + "FOS\\HttpCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Liip AG", + "homepage": "http://www.liip.ch/" + }, + { + "name": "Driebit", + "email": "tech@driebit.nl", + "homepage": "http://www.driebit.nl" + }, + { + "name": "Community contributions", + "homepage": "https://github.com/friendsofsymfony/FOSHttpCache/contributors" + } + ], + "description": "Tools to manage HTTP caching proxies with PHP", + "homepage": "https://github.com/friendsofsymfony/FOSHttpCache", + "keywords": [ + "caching", + "http", + "invalidation", + "nginx", + "purge", + "varnish" + ], + "support": { + "issues": "https://github.com/FriendsOfSymfony/FOSHttpCache/issues", + "source": "https://github.com/FriendsOfSymfony/FOSHttpCache/tree/2.15.3" + }, + "time": "2023-12-11T10:07:11+00:00" + }, + { + "name": "friendsofsymfony/http-cache-bundle", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle.git", + "reference": "70f641381efa77307b22a56b98f1f8b60b27bb23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSHttpCacheBundle/zipball/70f641381efa77307b22a56b98f1f8b60b27bb23", + "reference": "70f641381efa77307b22a56b98f1f8b60b27bb23", + "shasum": "" + }, + "require": { + "friendsofsymfony/http-cache": "^2.15", + "php": "^7.3 || ^8.0", + "symfony/framework-bundle": "^4.4.0 || ^5.0 || ^6.0", + "symfony/http-foundation": "^4.4.0 || ^5.0 || ^6.0", + "symfony/http-kernel": "^4.4.0 || ^5.0 || ^6.0" + }, + "conflict": { + "symfony/monolog-bridge": "<3.4.4", + "twig/twig": "<1.12.0" + }, + "require-dev": { + "doctrine/annotations": "^1.11", + "guzzlehttp/guzzle": "^7.2", + "matthiasnoback/symfony-dependency-injection-test": "^4.0", + "mockery/mockery": "^1.3.2", + "monolog/monolog": "*", + "php-http/discovery": "^1.13", + "php-http/guzzle7-adapter": "^0.1.1", + "php-http/httplug": "^2.2.0", + "php-http/message": "^1.0 || ^2.0", + "sebastian/exporter": "^2.0", + "sensio/framework-extra-bundle": "^4.0 || ^5.5.1 || ^6.0", + "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0", + "symfony/console": "^4.4 || ^5.0 || ^6.0", + "symfony/css-selector": "^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-bundle": "^3.0", + "symfony/phpunit-bridge": "v5.3.7", + "symfony/routing": "^4.4 || ^5.0 || ^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": "^2.13" + }, + "suggest": { + "jean-beru/fos-http-cache-cloudfront": "To use CloudFront proxy", + "sensio/framework-extra-bundle": "For Tagged Cache Invalidation", + "symfony/console": "To send invalidation requests from the command line", + "symfony/expression-language": "For Tagged Cache Invalidation" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "FOS\\HttpCacheBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Liip AG", + "homepage": "http://www.liip.ch/" + }, + { + "name": "Driebit", + "email": "tech@driebit.nl", + "homepage": "http://www.driebit.nl" + }, + { + "name": "Community contributions", + "homepage": "https://github.com/friendsofsymfony/FOSHttpCacheBundle/contributors" + } + ], + "description": "Set path based HTTP cache headers and send invalidation requests to your HTTP cache", + "homepage": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle", + "keywords": [ + "caching", + "esi", + "http", + "invalidation", + "purge", + "varnish" + ], + "support": { + "issues": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle/issues", + "source": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle/tree/2.17.0" + }, + "time": "2023-10-10T09:15:19+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-05-21T12:31:43+00:00" + }, + { + "name": "hofff/contao-navigation", + "version": "dev-develop", + "dist": { + "type": "path", + "url": "../..", + "reference": "d22619e0d8579d37749d31290521e445020b19b1" + }, + "require": { + "contao/core-bundle": "^4.13 || ^5.3", + "doctrine/dbal": "^3.8", + "php": "^8.1", + "symfony/config": "^5.4 || ^6.4", + "symfony/dependency-injection": "^5.4 || ^6.4", + "symfony/event-dispatcher-contracts": "^1.1 || ^2.0 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.4", + "symfony/http-kernel": "^5.4 || ^6.4", + "symfony/security-core": "^5.4 || ^6.4" + }, + "replace": { + "backboneit/contao-navigation": "self.version", + "contao-legacy/backboneit_navigation": "self.version" + }, + "require-dev": { + "contao/manager-plugin": "^2.0", + "doctrine/coding-standard": "^12.0.", + "phpcq/runner-bootstrap": "1.x-dev" + }, + "type": "contao-bundle", + "extra": { + "branch-alias": { + "dev-develop": "2.0.x", + "dev-master": "1.9.x" + }, + "contao-manager-plugin": "Hofff\\Contao\\Navigation\\ContaoManager\\Plugin" + }, + "autoload": { + "psr-4": { + "Hofff\\Contao\\Navigation\\": "src/" + } + }, + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Oliver Hoff", + "email": "oliver@hofff.com", + "homepage": "https://www.hofff.com/", + "role": "Developer" + }, + { + "name": "Nicky Hoff", + "email": "nick@hofff.com", + "homepage": "https://www.hofff.com/", + "role": "Maintainer" + }, + { + "name": "David Molineus", + "email": "david@hofff.com", + "homepage": "https://www.hofff.com/", + "role": "Maintainer" + } + ], + "description": "Advanced navigation module for Contao CMS", + "keywords": [ + "contao", + "module", + "navigation", + "page" + ], + "support": { + "issues": "https://github.com/hofff/contao-navigation/issues", + "source": "https://github.com/hofff/contao-navigation" + }, + "transport-options": { + "relative": true + } + }, + { + "name": "imagine/imagine", + "version": "1.3.5", + "source": { + "type": "git", + "url": "https://github.com/php-imagine/Imagine.git", + "reference": "7151d553edec4dc2bbac60419f7a74ff34700e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-imagine/Imagine/zipball/7151d553edec4dc2bbac60419f7a74ff34700e7f", + "reference": "7151d553edec4dc2bbac60419f7a74ff34700e7f", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4 || ^9.3" + }, + "suggest": { + "ext-exif": "to read EXIF metadata", + "ext-gd": "to use the GD implementation", + "ext-gmagick": "to use the Gmagick implementation", + "ext-imagick": "to use the Imagick implementation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Imagine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bulat Shakirzyanov", + "email": "mallluhuct@gmail.com", + "homepage": "http://avalanche123.com" + } + ], + "description": "Image processing for PHP 5.3", + "homepage": "http://imagine.readthedocs.org/", + "keywords": [ + "drawing", + "graphics", + "image manipulation", + "image processing" + ], + "support": { + "issues": "https://github.com/php-imagine/Imagine/issues", + "source": "https://github.com/php-imagine/Imagine/tree/1.3.5" + }, + "time": "2023-06-07T14:49:52+00:00" + }, + { + "name": "knplabs/knp-menu", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/KnpMenu.git", + "reference": "bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31", + "reference": "bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "conflict": { + "twig/twig": "<1.42.3 || >=2,<2.9" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6", + "psr/container": "^1.0", + "symfony/http-foundation": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2", + "symfony/routing": "^5.4 || ^6.0", + "twig/twig": "^2.9 || ^3.0" + }, + "suggest": { + "twig/twig": "for the TwigRenderer and the integration with your templates" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Knp\\Menu\\": "src/Knp/Menu" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KnpLabs", + "homepage": "https://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "The Community", + "homepage": "https://github.com/KnpLabs/KnpMenu/contributors" + } + ], + "description": "An object oriented menu library", + "homepage": "https://knplabs.com", + "keywords": [ + "menu", + "tree" + ], + "support": { + "issues": "https://github.com/KnpLabs/KnpMenu/issues", + "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.4.0" + }, + "time": "2023-05-17T18:48:46+00:00" + }, + { + "name": "knplabs/knp-menu-bundle", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/KnpMenuBundle.git", + "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/KnpMenuBundle/zipball/02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", + "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", + "shasum": "" + }, + "require": { + "knplabs/knp-menu": "^3.3", + "php": "^8.0", + "symfony/deprecation-contracts": "^2.5 | ^3.3", + "symfony/framework-bundle": "^5.4 | ^6.0 | ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 | ^10.1", + "symfony/expression-language": "^5.4 | ^6.0 | ^7.0", + "symfony/phpunit-bridge": "^6.0 | ^7.0", + "symfony/templating": "^5.4 | ^6.0 | ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Knp\\Bundle\\MenuBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Knplabs", + "homepage": "http://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/KnpLabs/KnpMenuBundle/contributors" + } + ], + "description": "This bundle provides an integration of the KnpMenu library", + "keywords": [ + "menu" + ], + "support": { + "issues": "https://github.com/KnpLabs/KnpMenuBundle/issues", + "source": "https://github.com/KnpLabs/KnpMenuBundle/tree/v3.3.0" + }, + "time": "2023-11-01T09:25:40+00:00" + }, + { + "name": "knplabs/knp-time-bundle", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/KnpTimeBundle.git", + "reference": "69cb36a9f22ac8432e8532c9ae84e92d46820d96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/KnpTimeBundle/zipball/69cb36a9f22ac8432e8532c9ae84e92d46820d96", + "reference": "69cb36a9f22ac8432e8532c9ae84e92d46820d96", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^9.6", + "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" + }, + "suggest": { + "symfony/twig-bundle": "to use the Twig `time_diff()` function and `|time_diff`/`|duration` filter" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Knp\\Bundle\\TimeBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KnpLabs Team", + "homepage": "https://knplabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/KnpLabs/KnpTimeBundle/contributors" + } + ], + "description": "Making your dates and durations look sensible and descriptive", + "homepage": "https://github.com/KnpLabs/KnpTimeBundle", + "keywords": [ + "bundle", + "date", + "descriptive time", + "duration", + "knp", + "knplabs", + "time" + ], + "support": { + "issues": "https://github.com/KnpLabs/KnpTimeBundle/issues", + "source": "https://github.com/KnpLabs/KnpTimeBundle/tree/v2.2.0" + }, + "time": "2023-11-13T19:38:34+00:00" + }, + { + "name": "lcobucci/clock", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "c7aadcd6fd97ed9e199114269c0be3f335e38876" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/c7aadcd6fd97ed9e199114269c0be3f335e38876", + "reference": "c7aadcd6fd97ed9e199114269c0be3f335e38876", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0", + "stella-maris/clock": "^0.1.7" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "infection/infection": "^0.26", + "lcobucci/coding-standard": "^9.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.27" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2022-12-19T14:38:11+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "4.1.5", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "fe2d89f2eaa7087af4aa166c6f480ef04e000582" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/fe2d89f2eaa7087af4aa166c6f480ef04e000582", + "reference": "fe2d89f2eaa7087af4aa166c6f480ef04e000582", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-sodium": "*", + "lcobucci/clock": "^2.0", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "infection/infection": "^0.21", + "lcobucci/coding-standard": "^6.0", + "mikey179/vfsstream": "^1.6.7", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/php-invoker": "^3.1", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/4.1.5" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2021-09-28T19:34:56+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.3", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-02-02T11:59:32+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.24.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "b25a361508c407563b34fac6f64a8a17a8819675" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b25a361508c407563b34fac6f64a8a17a8819675", + "reference": "b25a361508c407563b34fac6f64a8a17a8819675", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "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", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.34", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.24.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-02-04T12:10:17+00:00" + }, + { + "name": "league/flysystem-bundle", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-bundle.git", + "reference": "ad6ef9c0a8d918269ae5cf47da2f0a4a995bfbd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/ad6ef9c0a8d918269ae5cf47da2f0a4a995bfbd8", + "reference": "ad6ef9c0a8d918269ae5cf47da2f0a4a995bfbd8", + "shasum": "" + }, + "require": { + "league/flysystem": "^3.0", + "php": ">=8.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": { + "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-memory": "^3.1", + "league/flysystem-read-only": "^3.15", + "league/flysystem-sftp-v3": "^3.1", + "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": { + "psr-4": { + "League\\FlysystemBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" + } + ], + "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.3.2" + }, + "time": "2023-12-02T17:27:51+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.23.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "b884d2bf9b53bb4804a56d2df4902bb51e253f00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/b884d2bf9b53bb4804a56d2df4902bb51e253f00", + "reference": "b884d2bf9b53bb4804a56d2df4902bb51e253f00", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.23.1" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-01-26T18:25:23+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "league/uri", + "version": "7.4.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "bf414ba956d902f5d98bf9385fcf63954f09dce5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/bf414ba956d902f5d98bf9385fcf63954f09dce5", + "reference": "bf414ba956d902f5d98bf9385fcf63954f09dce5", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.3", + "php": "^8.1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.4.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2023-12-01T06:24:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.4.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "bd8c487ec236930f7bbc42b8d374fa882fbba0f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/bd8c487ec236930f7bbc42b8d374fa882fbba0f3", + "reference": "bd8c487ec236930f7bbc42b8d374fa882fbba0f3", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2023-11-24T15:40:42+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + }, + "time": "2023-05-10T11:58:31+00:00" + }, + { + "name": "matthiasmullie/minify", + "version": "1.3.71", + "source": { + "type": "git", + "url": "https://github.com/matthiasmullie/minify.git", + "reference": "ae42a47d7fecc1fbb7277b2f2d84c37a33edc3b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/ae42a47d7fecc1fbb7277b2f2d84c37a33edc3b1", + "reference": "ae42a47d7fecc1fbb7277b2f2d84c37a33edc3b1", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "matthiasmullie/path-converter": "~1.1", + "php": ">=5.3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": ">=2.0", + "matthiasmullie/scrapbook": ">=1.3", + "phpunit/phpunit": ">=4.8", + "squizlabs/php_codesniffer": ">=3.0" + }, + "suggest": { + "psr/cache-implementation": "Cache implementation to use with Minify::cache" + }, + "bin": [ + "bin/minifycss", + "bin/minifyjs" + ], + "type": "library", + "autoload": { + "psr-4": { + "MatthiasMullie\\Minify\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthias Mullie", + "email": "minify@mullie.eu", + "homepage": "https://www.mullie.eu", + "role": "Developer" + } + ], + "description": "CSS & JavaScript minifier, in PHP. Removes whitespace, strips comments, combines files (incl. @import statements and small assets in CSS files), and optimizes/shortens a few common programming patterns.", + "homepage": "https://github.com/matthiasmullie/minify", + "keywords": [ + "JS", + "css", + "javascript", + "minifier", + "minify" + ], + "support": { + "issues": "https://github.com/matthiasmullie/minify/issues", + "source": "https://github.com/matthiasmullie/minify/tree/1.3.71" + }, + "funding": [ + { + "url": "https://github.com/matthiasmullie", + "type": "github" + } + ], + "time": "2023-04-25T20:33:03+00:00" + }, + { + "name": "matthiasmullie/path-converter", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/matthiasmullie/path-converter.git", + "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matthiasmullie/path-converter/zipball/e7d13b2c7e2f2268e1424aaed02085518afa02d9", + "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "MatthiasMullie\\PathConverter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthias Mullie", + "email": "pathconverter@mullie.eu", + "homepage": "http://www.mullie.eu", + "role": "Developer" + } + ], + "description": "Relative path converter", + "homepage": "http://github.com/matthiasmullie/path-converter", + "keywords": [ + "converter", + "path", + "paths", + "relative" + ], + "support": { + "issues": "https://github.com/matthiasmullie/path-converter/issues", + "source": "https://github.com/matthiasmullie/path-converter/tree/1.1.3" + }, + "time": "2019-02-05T23:41:09+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.9.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-10-27T15:25:26+00:00" + }, + { + "name": "nelmio/cors-bundle", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/nelmio/NelmioCorsBundle.git", + "reference": "78fcdb91f76b080a1008133def9c7f613833933d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/78fcdb91f76b080a1008133def9c7f613833933d", + "reference": "78fcdb91f76b080a1008133def9c7f613833933d", + "shasum": "" + }, + "require": { + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.6", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Nelmio\\CorsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nelmio", + "homepage": "http://nelm.io" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", + "keywords": [ + "api", + "cors", + "crossdomain" + ], + "support": { + "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" + }, + "time": "2023-11-30T16:41:19+00:00" + }, + { + "name": "nelmio/security-bundle", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/nelmio/NelmioSecurityBundle.git", + "reference": "9ae9fabf708ec5899cda46b2d764864bceaa9c8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nelmio/NelmioSecurityBundle/zipball/9ae9fabf708ec5899cda46b2d764864bceaa9c8e", + "reference": "9ae9fabf708ec5899cda46b2d764864bceaa9c8e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "symfony/framework-bundle": "^5.4 || ^6.3 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.3 || ^7.0", + "symfony/security-core": "^5.4 || ^6.3 || ^7.0", + "symfony/security-csrf": "^5.4 || ^6.3 || ^7.0", + "symfony/security-http": "^5.4 || ^6.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.3 || ^7.0", + "ua-parser/uap-php": "^3.4.4" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.1", + "phpunit/phpunit": "^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/browser-kit": "^5.4 || ^6.3 || ^7.0", + "symfony/cache": "^5.4 || ^6.3 || ^7.0", + "symfony/phpunit-bridge": "^6.3 || ^7.0", + "symfony/twig-bundle": "^5.4 || ^6.3 || ^7.0", + "twig/twig": "^2.10 || ^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Nelmio\\SecurityBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nelmio", + "homepage": "http://nelm.io" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioSecurityBundle/contributors" + } + ], + "description": "Extra security-related features for Symfony: signed/encrypted cookies, HTTPS/SSL/HSTS handling, cookie session storage, ...", + "keywords": [ + "security" + ], + "support": { + "issues": "https://github.com/nelmio/NelmioSecurityBundle/issues", + "source": "https://github.com/nelmio/NelmioSecurityBundle/tree/v3.1.1" + }, + "time": "2024-01-17T14:32:52+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.0" + }, + "time": "2023-12-11T11:54:22+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.4" + }, + "time": "2024-01-17T16:50:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + }, + "time": "2023-12-10T21:03:43+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.1" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2023-11-13T09:31:12+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "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 || ^7.0", + "symfony/polyfill-php80": "^1.17" + }, + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.1" + }, + "time": "2023-11-30T10:31:25+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.19.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", + "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.2" + }, + "time": "2023-11-30T16:49:05+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" + }, + "time": "2023-04-14T15:10:03+00:00" + }, + { + "name": "php-http/message", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "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" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.0" + }, + "time": "2023-05-17T06:43:38+00:00" + }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, + { + "name": "php-http/promise", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "2916a606d3b390f4e9e8e2b8dd68581508be0f07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/2916a606d3b390f4e9e8e2b8dd68581508be0f07", + "reference": "2916a606d3b390f4e9e8e2b8dd68581508be0f07", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.0" + }, + "time": "2024-01-04T18:49:48+00:00" + }, + { + "name": "phpspec/php-diff", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "support": { + "source": "https://github.com/phpspec/php-diff/tree/v1.1.3" + }, + "time": "2020-09-18T13:47:07+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "scheb/2fa-backup-code", + "version": "v6.12.0", + "source": { + "type": "git", + "url": "https://github.com/scheb/2fa-backup-code.git", + "reference": "1ad84e7eb26eb425c609e03097cac99387dde44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scheb/2fa-backup-code/zipball/1ad84e7eb26eb425c609e03097cac99387dde44c", + "reference": "1ad84e7eb26eb425c609e03097cac99387dde44c", + "shasum": "" + }, + "require": { + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "scheb/2fa-bundle": "self.version" + }, + "type": "library", + "autoload": { + "psr-4": { + "Scheb\\TwoFactorBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Scheb", + "email": "me@christianscheb.de" + } + ], + "description": "Extends scheb/2fa-bundle with backup codes support", + "homepage": "https://github.com/scheb/2fa", + "keywords": [ + "2fa", + "Authentication", + "backup-codes", + "symfony", + "two-factor", + "two-step" + ], + "support": { + "source": "https://github.com/scheb/2fa-backup-code/tree/v6.12.0" + }, + "time": "2023-12-03T15:44:26+00:00" + }, + { + "name": "scheb/2fa-bundle", + "version": "v6.12.0", + "source": { + "type": "git", + "url": "https://github.com/scheb/2fa-bundle.git", + "reference": "6e51477c53070f27ac3e3d36be1a991870db415a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/6e51477c53070f27ac3e3d36be1a991870db415a", + "reference": "6e51477c53070f27ac3e3d36be1a991870db415a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/dependency-injection": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/framework-bundle": "^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/security-bundle": "^5.4 || ^6.0", + "symfony/twig-bundle": "^5.4 || ^6.0" + }, + "conflict": { + "scheb/two-factor-bundle": "*", + "symfony/security-core": "^7" + }, + "suggest": { + "scheb/2fa-backup-code": "Emergency codes when you have no access to other methods", + "scheb/2fa-email": "Send codes by email", + "scheb/2fa-google-authenticator": "Google Authenticator support", + "scheb/2fa-totp": "Temporary one-time password (TOTP) support (Google Authenticator compatible)", + "scheb/2fa-trusted-device": "Trusted devices support" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Scheb\\TwoFactorBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Scheb", + "email": "me@christianscheb.de" + } + ], + "description": "A generic interface to implement two-factor authentication in Symfony applications", + "homepage": "https://github.com/scheb/2fa", + "keywords": [ + "2fa", + "Authentication", + "symfony", + "two-factor", + "two-step" + ], + "support": { + "source": "https://github.com/scheb/2fa-bundle/tree/v6.12.0" + }, + "time": "2023-12-03T16:02:15+00:00" + }, + { + "name": "scheb/2fa-trusted-device", + "version": "v6.12.0", + "source": { + "type": "git", + "url": "https://github.com/scheb/2fa-trusted-device.git", + "reference": "1ca6158dc6518ca9dba8b111bd9807a8b9be2903" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scheb/2fa-trusted-device/zipball/1ca6158dc6518ca9dba8b111bd9807a8b9be2903", + "reference": "1ca6158dc6518ca9dba8b111bd9807a8b9be2903", + "shasum": "" + }, + "require": { + "lcobucci/clock": "^2.0 || ^3.0", + "lcobucci/jwt": "^4.1 || ^5.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "scheb/2fa-bundle": "self.version" + }, + "type": "library", + "autoload": { + "psr-4": { + "Scheb\\TwoFactorBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Scheb", + "email": "me@christianscheb.de" + } + ], + "description": "Extends scheb/2fa-bundle with trusted devices support", + "homepage": "https://github.com/scheb/2fa", + "keywords": [ + "2fa", + "Authentication", + "symfony", + "trusted-device", + "two-factor", + "two-step" + ], + "support": { + "source": "https://github.com/scheb/2fa-trusted-device/tree/v6.12.0" + }, + "time": "2023-12-03T15:44:26+00:00" + }, + { + "name": "scrivo/highlight.php", + "version": "v9.18.1.10", + "source": { + "type": "git", + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", + "symfony/finder": "^2.8|^3.4|^5.4", + "symfony/var-dumper": "^2.8|^3.4|^5.4" + }, + "suggest": { + "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" + }, + "type": "library", + "autoload": { + "files": [ + "HighlightUtilities/functions.php" + ], + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" + }, + { + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io", + "role": "Maintainer" + }, + { + "name": "Martin Folkers", + "homepage": "https://twobrain.io", + "role": "Contributor" + } + ], + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", + "keywords": [ + "code", + "highlight", + "highlight.js", + "highlight.php", + "syntax" + ], + "support": { + "issues": "https://github.com/scrivo/highlight.php/issues", + "source": "https://github.com/scrivo/highlight.php" + }, + "funding": [ + { + "url": "https://github.com/allejo", + "type": "github" + } + ], + "time": "2022-12-17T21:53:22+00:00" + }, + { + "name": "scssphp/scssphp", + "version": "v1.12.1", + "source": { + "type": "git", + "url": "https://github.com/scssphp/scssphp.git", + "reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/394ed1e960138710a60d035c1a85d43d0bf0faeb", + "reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^5.1", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "~5.0", + "twbs/bootstrap4": "4.6.1", + "zurb/foundation": "~6.7.0" + }, + "suggest": { + "ext-iconv": "Can be used as fallback when ext-mbstring is not available", + "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" + }, + "bin": [ + "bin/pscss" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "forward-command": false, + "bin-links": false + } + }, + "autoload": { + "psr-4": { + "ScssPhp\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "http://scssphp.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "support": { + "issues": "https://github.com/scssphp/scssphp/issues", + "source": "https://github.com/scssphp/scssphp/tree/v1.12.1" + }, + "time": "2024-01-13T12:36:40+00:00" + }, + { + "name": "simplepie/simplepie", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/simplepie/simplepie.git", + "reference": "65b095d87bc00898d8fa7737bdbcda93a3fbcc55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplepie/simplepie/zipball/65b095d87bc00898d8fa7737bdbcda93a3fbcc55", + "reference": "65b095d87bc00898d8fa7737bdbcda93a3fbcc55", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19 || ^3.8", + "psr/simple-cache": "^1 || ^2 || ^3", + "yoast/phpunit-polyfills": "^1.0.1" + }, + "suggest": { + "ext-curl": "", + "ext-iconv": "", + "ext-intl": "", + "ext-mbstring": "", + "mf2/mf2": "Microformat module that allows for parsing HTML for microformats" + }, + "type": "library", + "autoload": { + "psr-0": { + "SimplePie": "library" + }, + "psr-4": { + "SimplePie\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Ryan Parman", + "homepage": "http://ryanparman.com/", + "role": "Creator, alumnus developer" + }, + { + "name": "Sam Sneddon", + "homepage": "https://gsnedders.com/", + "role": "Alumnus developer" + }, + { + "name": "Ryan McCue", + "email": "me@ryanmccue.info", + "homepage": "http://ryanmccue.info/", + "role": "Developer" + } + ], + "description": "A simple Atom/RSS parsing library for PHP", + "homepage": "http://simplepie.org/", + "keywords": [ + "atom", + "feeds", + "rss" + ], + "support": { + "issues": "https://github.com/simplepie/simplepie/issues", + "source": "https://github.com/simplepie/simplepie/tree/1.8.0" + }, + "time": "2023-01-20T08:37:35+00:00" + }, + { + "name": "spatie/schema-org", + "version": "3.23.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/schema-org.git", + "reference": "c95abf7da59f16570aec18ca11d861255e645c39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/schema-org/zipball/c95abf7da59f16570aec18ca11d861255e645c39", + "reference": "c95abf7da59f16570aec18ca11d861255e645c39", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.6", + "graham-campbell/analyzer": "^3.0.5", + "illuminate/collections": "^8.62.0", + "league/flysystem": "^2.3.0 || ^3.0", + "pestphp/pest": "^1.21", + "symfony/console": "^5.3.7 || 6.0", + "twig/twig": "^3.3.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\SchemaOrg\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Tom Witkowski", + "email": "dev.gummibeer@gmail.com", + "homepage": "https://gummibeer.de", + "role": "Developer" + } + ], + "description": "A fluent builder Schema.org types and ld+json generator", + "homepage": "https://github.com/spatie/schema-org", + "keywords": [ + "schema-org", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/schema-org/issues", + "source": "https://github.com/spatie/schema-org/tree/3.23.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-01-11T14:58:44+00:00" + }, + { + "name": "spomky-labs/otphp", + "version": "v10.0.3", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/otphp.git", + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", + "shasum": "" + }, + "require": { + "beberlei/assert": "^3.0", + "ext-mbstring": "*", + "paragonie/constant_time_encoding": "^2.0", + "php": "^7.2|^8.0", + "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-beberlei-assert": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^8.0", + "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "v10.0": "10.0.x-dev", + "v9.0": "9.0.x-dev", + "v8.3": "8.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "OTPHP\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/Spomky-Labs/otphp/contributors" + } + ], + "description": "A PHP library for generating one time passwords according to RFC 4226 (HOTP Algorithm) and the RFC 6238 (TOTP Algorithm) and compatible with Google Authenticator", + "homepage": "https://github.com/Spomky-Labs/otphp", + "keywords": [ + "FreeOTP", + "RFC 4226", + "RFC 6238", + "google authenticator", + "hotp", + "otp", + "totp" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/otphp/issues", + "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" + }, + "time": "2022-03-17T08:00:35+00:00" + }, + { + "name": "stella-maris/clock", + "version": "0.1.7", + "source": { + "type": "git", + "url": "https://github.com/stella-maris-solutions/clock.git", + "reference": "fa23ce16019289a18bb3446fdecd45befcdd94f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stella-maris-solutions/clock/zipball/fa23ce16019289a18bb3446fdecd45befcdd94f8", + "reference": "fa23ce16019289a18bb3446fdecd45befcdd94f8", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0", + "psr/clock": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "StellaMaris\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Heigl", + "role": "Maintainer" + } + ], + "description": "A pre-release of the proposed PSR-20 Clock-Interface", + "homepage": "https://gitlab.com/stella-maris/clock", + "keywords": [ + "clock", + "datetime", + "point in time", + "psr20" + ], + "support": { + "source": "https://github.com/stella-maris-solutions/clock/tree/0.1.7" + }, + "time": "2022-11-25T16:15:06+00:00" + }, + { + "name": "symfony-cmf/routing", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony-cmf/Routing.git", + "reference": "4d6e40f8f91f5729e00e5a023640eb13fb359cbd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/4d6e40f8f91f5729e00e5a023640eb13fb359cbd", + "reference": "4d6e40f8f91f5729e00e5a023640eb13fb359cbd", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/http-kernel": "^6.0 || ^7.0", + "symfony/routing": "^6.0 || ^7.0" + }, + "require-dev": { + "symfony/config": "^6.0 || ^7.0", + "symfony/dependency-injection": "^6.0 || ^7.0", + "symfony/event-dispatcher": "^6.0 || ^7.0", + "symfony/phpunit-bridge": "^7.0.3" + }, + "suggest": { + "symfony/event-dispatcher": "DynamicRouter can optionally trigger an event at the start of matching. Minimal version ^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Cmf\\Component\\Routing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony CMF Community", + "homepage": "https://github.com/symfony-cmf/Routing/contributors" + } + ], + "description": "Extends the Symfony routing component for dynamic routes and chaining several routers", + "homepage": "http://cmf.symfony.com", + "keywords": [ + "database", + "routing" + ], + "support": { + "issues": "https://github.com/symfony-cmf/Routing/issues", + "source": "https://github.com/symfony-cmf/Routing/tree/3.0.3" + }, + "time": "2024-02-19T02:00:24+00:00" + }, + { + "name": "symfony-cmf/routing-bundle", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony-cmf/routing-bundle.git", + "reference": "e90e86175d4640be33d252645cfd57439d8902ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony-cmf/routing-bundle/zipball/e90e86175d4640be33d252645cfd57439d8902ad", + "reference": "e90e86175d4640be33d252645cfd57439d8902ad", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony-cmf/routing": "^3.0", + "symfony/framework-bundle": "^6.0" + }, + "conflict": { + "doctrine/common": "<3.1.1", + "doctrine/persistence": "<1.3.0", + "doctrine/phpcr-odm": "<1.4", + "phpunit/phpunit": "<6" + }, + "require-dev": { + "doctrine/data-fixtures": "^1.0.0", + "doctrine/doctrine-bundle": "^2.0", + "doctrine/orm": "^2.9", + "doctrine/phpcr-bundle": "^2.3", + "doctrine/phpcr-odm": "^1.4|^2.0", + "jackalope/jackalope-doctrine-dbal": "^1.3", + "matthiasnoback/symfony-config-test": "^4.1.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.1.0", + "symfony-cmf/testing": "dev-master as 4.2.0", + "symfony/form": "^6.0", + "symfony/monolog-bundle": "^3.5", + "symfony/phpunit-bridge": "^6.0", + "symfony/security-bundle": "^6.0", + "symfony/serializer": "^6.0", + "symfony/translation": "^6.0", + "symfony/twig-bundle": "^6.0", + "symfony/validator": "^6.0", + "twig/twig": "^2.4.4 || ^3.0" + }, + "suggest": { + "doctrine/orm": "To enable support for the ORM entities (^2.5)", + "doctrine/phpcr-bundle": "To enable support for the PHPCR ODM documents", + "doctrine/phpcr-odm": "To enable support for the PHPCR ODM documents (^1.4)" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Cmf\\Bundle\\RoutingBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony CMF Community", + "homepage": "https://github.com/symfony-cmf/RoutingBundle/contributors" + } + ], + "description": "Symfony RoutingBundle", + "homepage": "http://cmf.symfony.com", + "keywords": [ + "database", + "routing" + ], + "support": { + "issues": "https://github.com/symfony-cmf/routing-bundle/issues", + "source": "https://github.com/symfony-cmf/routing-bundle/tree/3.0.2" + }, + "time": "2023-06-03T15:52:53+00:00" + }, + { + "name": "symfony/asset", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "14b1c0fddb64af6ea626af51bb3c47af9fa19cb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/14b1c0fddb64af6ea626af51bb3c47af9fa19cb7", + "reference": "14b1c0fddb64af6ea626af51bb3c47af9fa19cb7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "symfony/http-foundation": "<5.4" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "49f8cdee544a621a621cd21b6cda32a38926d310" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/49f8cdee544a621a621cd21b6cda32a38926d310", + "reference": "49f8cdee544a621a621cd21b6cda32a38926d310", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "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", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^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|^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": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "1d74b127da04ffa87aa940abe15446fa89653778" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", + "reference": "1d74b127da04ffa87aa940abe15446fa89653778", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.4.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": "2023-09-25T12:52:38+00:00" + }, + { + "name": "symfony/clock", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "f48770105c544001da00b8d745873a628e0de198" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/f48770105c544001da00b8d745873a628e0de198", + "reference": "f48770105c544001da00b8d745873a628e0de198", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/config", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "206482ff3ed450495b1d5b7bad1bc3a852def96f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/206482ff3ed450495b1d5b7bad1bc3a852def96f", + "reference": "206482ff3ed450495b1d5b7bad1bc3a852def96f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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/service-contracts": "<2.5" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T13:26:27+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", + "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "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": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/debug-bundle", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug-bundle.git", + "reference": "425c7760a4e6fdc6cb643c791d32277037c971df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/425c7760a4e6fdc6cb643c791d32277037c971df", + "reference": "425c7760a4e6fdc6cb643c791d32277037c971df", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=8.1", + "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|^7.0", + "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\DebugBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug-bundle/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "6871811c5a5c5e180244ddb689746446db02c05b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6871811c5a5c5e180244ddb689746446db02c05b", + "reference": "6871811c5a5c5e180244ddb689746446db02c05b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "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.3", + "symfony/yaml": "<5.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T08:32:12+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "9c9a44bb06337dadeb9db1a8b202f15cca804353" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9c9a44bb06337dadeb9db1a8b202f15cca804353", + "reference": "9c9a44bb06337dadeb9db1a8b202f15cca804353", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1.2|^2", + "doctrine/persistence": "^3.1", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.15", + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<6.2", + "symfony/form": "<5.4.21|>=6,<6.2.7", + "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.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/orm": "^2.15|^3", + "psr/log": "^1|^2|^3", + "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.21|^6.2.7|^7.0", + "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": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T11:24:52+00:00" + }, + { + "name": "symfony/doctrine-messenger", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-messenger.git", + "reference": "bd83f174a5f26aa07086a41e1a1f4812409e6542" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/bd83f174a5f26aa07086a41e1a1f4812409e6542", + "reference": "bd83f174a5f26aa07086a41e1a1f4812409e6542", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.13|^3|^4", + "php": ">=8.1", + "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|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "type": "symfony-messenger-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Messenger Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-messenger/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "6db31849011fefe091e94d0bb10cba26f7919894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6db31849011fefe091e94d0bb10cba26f7919894", + "reference": "6db31849011fefe091e94d0bb10cba26f7919894", + "shasum": "" + }, + "require": { + "masterminds/html5": "^2.6", + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/css-selector": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "3cb7ca997124760ed1389d5341806247670f4ef8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/3cb7ca997124760ed1389d5341806247670f4ef8", + "reference": "3cb7ca997124760ed1389d5341806247670f4ef8", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "symfony/console": "<5.4", + "symfony/process": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/6dc3c76a278b77f01d864a6005d640822c6f26a6", + "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "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.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T15:40:36+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^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": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4", + "reference": "b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.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": "2023-10-31T17:30:12+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "fb413ac4483803954411966a39f3a9204835848e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/fb413ac4483803954411966a39f3a9204835848e", + "reference": "fb413ac4483803954411966a39f3a9204835848e", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4|^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": "^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", + "symfony/asset": "<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": "<6.3", + "symfony/lock": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<6.3", + "symfony/mime": "<6.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4", + "symfony/scheduler": "<6.4.3|>=7.0.0,<7.0.3", + "symfony/security-core": "<5.4", + "symfony/security-csrf": "<5.4", + "symfony/serializer": "<6.4", + "symfony/stopwatch": "<5.4", + "symfony/translation": "<6.4", + "symfony/twig-bridge": "<5.4", + "symfony/twig-bundle": "<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", + "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|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/scheduler": "^6.4.3|^7.0.3", + "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" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T15:02:55+00:00" + }, + { + "name": "symfony/html-sanitizer", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/html-sanitizer.git", + "reference": "116335ab09e10b05405f01d8afd31ccc3832b08b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/116335ab09e10b05405f01d8afd31ccc3832b08b", + "reference": "116335ab09e10b05405f01d8afd31ccc3832b08b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "league/uri": "^6.5|^7.0", + "masterminds/html5": "^2.7.2", + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HtmlSanitizer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.", + "homepage": "https://symfony.com", + "keywords": [ + "Purifier", + "html", + "sanitizer" + ], + "support": { + "source": "https://github.com/symfony/html-sanitizer/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/http-client", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "a9034bc119fab8238f76cf49c770f3135f3ead86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/a9034bc119fab8238f76cf49c770f3135f3ead86", + "reference": "a9034bc119fab8238f76cf49c770f3135f3ead86", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^3", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.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": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T15:01:07+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "1ee70e699b41909c209a0c930f11034b93578654" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1ee70e699b41909c209a0c930f11034b93578654", + "reference": "1ee70e699b41909c209a0c930f11034b93578654", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.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": "2023-07-30T20:28:31+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5677bdf7cade4619cb17fc9e1e7b31ec392244a9", + "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9c6ec4e543044f7568a53a76ab1484ecd30637a2", + "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "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": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "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": "<6.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.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.3|^7.0", + "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-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-31T07:21:29+00:00" + }, + { + "name": "symfony/intl", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "2628ded562ca132ed7cdea72f5ec6aaf65d94414" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/2628ded562ca132ed7cdea72f5ec6aaf65d94414", + "reference": "2628ded562ca132ed7cdea72f5ec6aaf65d94414", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides access to the localization data of the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/lock", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/lock.git", + "reference": "1cabf3cc775b1aa6008ebd471fa773444af4e956" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lock/zipball/1cabf3cc775b1aa6008ebd471fa773444af4e956", + "reference": "1cabf3cc775b1aa6008ebd471fa773444af4e956", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/dbal": "<2.13", + "symfony/cache": "<6.2" + }, + "require-dev": { + "doctrine/dbal": "^2.13|^3|^4", + "predis/predis": "^1.1|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Lock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Derussé", + "email": "jeremy@derusse.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource", + "homepage": "https://symfony.com", + "keywords": [ + "cas", + "flock", + "locking", + "mutex", + "redlock", + "semaphore" + ], + "support": { + "source": "https://github.com/symfony/lock/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/74412c62f88a85a41b61f0b71ab0afcaad6f03ee", + "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^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|^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": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T15:01:07+00:00" + }, + { + "name": "symfony/messenger", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "18d3ea9ed6d1487802f3f716596a6325cdc5ef15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/18d3ea9ed6d1487802f3f716596a6325cdc5ef15", + "reference": "18d3ea9ed6d1487802f3f716596a6325cdc5ef15", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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.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": "^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": { + "psr-4": { + "Symfony\\Component\\Messenger\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Roze", + "email": "samuel.roze@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T13:33:32+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "5017e0a9398c77090b7694be46f20eb796262a34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", + "reference": "5017e0a9398c77090b7694be46f20eb796262a34", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.3.2" + }, + "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|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T08:32:12+00:00" + }, + { + "name": "symfony/monolog-bridge", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "1e1ec293f15dcc815146637ee9ee8a7f43642fa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/1e1ec293f15dcc815146637ee9ee8a7f43642fa1", + "reference": "1e1ec293f15dcc815146637ee9ee8a7f43642fa1", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1|^2|^3", + "php": ">=8.1", + "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" + }, + "require-dev": { + "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": "^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Monolog\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Monolog with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T15:01:07+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "shasum": "" + }, + "require": { + "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": "^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": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "https://symfony.com", + "keywords": [ + "log", + "logging" + ], + "support": { + "issues": "https://github.com/symfony/monolog-bundle/issues", + "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.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": "2023-11-06T17:08:13+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "22301f0e7fdeaacc14318928612dee79be99860e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", + "reference": "22301f0e7fdeaacc14318928612dee79be99860e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.4.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": "2023-08-08T10:16:24+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "5189cdfe89a9acb56cc6d6d7a5233bfb180c7268" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/5189cdfe89a9acb56cc6d6d7a5233bfb180c7268", + "reference": "5189cdfe89a9acb56cc6d6d7a5233bfb180c7268", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "symfony/security-core": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "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 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "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 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "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.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "31642b0818bfcff85930344ef93193f8c607e0a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/31642b0818bfcff85930344ef93193f8c607e0a3", + "reference": "31642b0818bfcff85930344ef93193f8c607e0a3", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/property-access", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "dd22c9247a16c712bfa128b3c90ebdd505102778" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/dd22c9247a16c712bfa128b3c90ebdd505102778", + "reference": "dd22c9247a16c712bfa128b3c90ebdd505102778", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/property-info": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony/cache": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/property-info", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/e96d740ab5ac39aa530c8eaa0720ea8169118e26", + "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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/serializer": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "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": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/rate-limiter", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/rate-limiter.git", + "reference": "5b8689fd55becd6b376ec49a542773c98985a7df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/5b8689fd55becd6b376ec49a542773c98985a7df", + "reference": "5b8689fd55becd6b376ec49a542773c98985a7df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\RateLimiter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wouter de Jong", + "email": "wouter@wouterj.nl" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a Token Bucket implementation to rate limit input and output in your application", + "homepage": "https://symfony.com", + "keywords": [ + "limiter", + "rate-limiter" + ], + "support": { + "source": "https://github.com/symfony/rate-limiter/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/3b2957ad54902f0f544df83e3d58b38d7e8e5842", + "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "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": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T13:55:02+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "a53a9e1f6695447ce613aa8c9c698cfd012bd2aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/a53a9e1f6695447ce613aa8c9c698cfd012bd2aa", + "reference": "a53a9e1f6695447ce613aa8c9c698cfd012bd2aa", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.1", + "symfony/clock": "^6.3|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.2|^7.0", + "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|^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": "<6.4", + "symfony/http-client": "<5.4", + "symfony/ldap": "<5.4", + "symfony/serializer": "<6.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-28T15:49:46+00:00" + }, + { + "name": "symfony/security-core", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "bb10f630cf5b1819ff80aa3ad57a09c61268fc48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/bb10f630cf5b1819ff80aa3ad57a09c61268fc48", + "reference": "bb10f630cf5b1819ff80aa3ad57a09c61268fc48", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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|^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": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "e10257dd26f965d75e96bbfc27e46efd943f3010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/e10257dd26f965d75e96bbfc27e46efd943f3010", + "reference": "e10257dd26f965d75e96bbfc27e46efd943f3010", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/security-core": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<5.4" + }, + "require-dev": { + "symfony/http-foundation": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/security-http", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "d1962d08e02d620dccbaa28192498642500b5043" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/d1962d08e02d620dccbaa28192498642500b5043", + "reference": "d1962d08e02d620dccbaa28192498642500b5043", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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|^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|^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": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-http/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-12-26T14:02:43+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:35:58+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "7a14736fb179876575464e4658fce0c304e8c15b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/7a14736fb179876575464e4658fce0c304e8c15b", + "reference": "7a14736fb179876575464e4658fce0c304e8c15b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/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": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-25T09:26:29+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "637c51191b6b184184bbf98937702bcf554f7d04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/637c51191b6b184184bbf98937702bcf554f7d04", + "reference": "637c51191b6b184184bbf98937702bcf554f7d04", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.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" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "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|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T13:11:52+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "06450585bf65e978026bda220cdebca3f867fde7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", + "reference": "06450585bf65e978026bda220cdebca3f867fde7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-12-26T14:02:43+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "bf6b411a5d9a0ce6ea43cca0fcf5f05f5196a957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/bf6b411a5d9a0ce6ea43cca0fcf5f05f5196a957", + "reference": "bf6b411a5d9a0ce6ea43cca0fcf5f05f5196a957", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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.3", + "symfony/http-foundation": "<5.4", + "symfony/http-kernel": "<6.4", + "symfony/mime": "<6.2", + "symfony/serializer": "<6.4", + "symfony/translation": "<5.4", + "symfony/workflow": "<5.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^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|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/security-acl": "^2.8|^3.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" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T08:32:12+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "2e63e50de2ade430191af0b5d21bfd6526fe3709" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/2e63e50de2ade430191af0b5d21bfd6526fe3709", + "reference": "2e63e50de2ade430191af0b5d21bfd6526fe3709", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "php": ">=8.1", + "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.4", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/framework-bundle": "<5.4", + "symfony/translation": "<5.4" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0435a08f69125535336177c29d56af3abc1f69da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0435a08f69125535336177c29d56af3abc1f69da", + "reference": "0435a08f69125535336177c29d56af3abc1f69da", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "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" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:53:30+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "a8c12b5448a5ac685347f5eeb2abf6a571ec16b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/a8c12b5448a5ac685347f5eeb2abf6a571ec16b8", + "reference": "a8c12b5448a5ac685347f5eeb2abf6a571ec16b8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "e78f98da7b4f842bab89368d53c962f5b2f9e49c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/e78f98da7b4f842bab89368d53c962f5b2f9e49c", + "reference": "e78f98da7b4f842bab89368d53c962f5b2f9e49c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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/twig-bundle": ">=7.0" + }, + "require-dev": { + "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": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a development tool that gives detailed information about the execution of any request", + "homepage": "https://symfony.com", + "keywords": [ + "dev" + ], + "support": { + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-28T15:49:46+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "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|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "terminal42/escargot", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/terminal42/escargot.git", + "reference": "2585a08cf3b68171a8445f9f0d0e1eb22ab6cccd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/terminal42/escargot/zipball/2585a08cf3b68171a8445f9f0d0e1eb22ab6cccd", + "reference": "2585a08cf3b68171a8445f9f0d0e1eb22ab6cccd", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "nyholm/psr7": "^1.1", + "php": "^8.1", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/clock": "^6.2", + "symfony/dom-crawler": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/http-client": "^5.4 || ^6.0", + "webignition/robots-txt-file": "^3.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6", + "fig/log-test": "^1.0", + "symfony/finder": "^5.4|| ^6.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0", + "terminal42/contao-build-tools": "@dev" + }, + "type": "library", + "autoload": { + "psr-4": { + "Terminal42\\Escargot\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yanick Witschi", + "homepage": "https://github.com/toflar", + "role": "Developer" + } + ], + "description": "A web crawler or spider library based on Symfony components", + "homepage": "https://www.terminal42.ch", + "keywords": [ + "crawl", + "escargot", + "index", + "search", + "spider" + ], + "support": { + "issues": "https://github.com/terminal42/escargot/issues", + "source": "https://github.com/terminal42/escargot" + }, + "time": "2023-11-09T16:34:27+00:00" + }, + { + "name": "terminal42/service-annotation-bundle", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/terminal42/service-annotation-bundle.git", + "reference": "f05105b65825d40234efb581f19088da0d843f6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/terminal42/service-annotation-bundle/zipball/f05105b65825d40234efb581f19088da0d843f6e", + "reference": "f05105b65825d40234efb581f19088da0d843f6e", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.6 || ^2.0", + "php": "^7.1 || ^8.0", + "symfony/dependency-injection": "^4.0 || ^5.0 || ^6.0", + "symfony/http-kernel": "^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "contao/easy-coding-standard": "^3.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Terminal42\\ServiceAnnotationBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "terminal42 gmbh", + "homepage": "https://www.terminal42.ch/" + } + ], + "description": "Add service tags from class annotations", + "support": { + "issues": "https://github.com/terminal42/service-annotation-bundle/issues", + "source": "https://github.com/terminal42/service-annotation-bundle" + }, + "funding": [ + { + "url": "https://github.com/sponsors/terminal42", + "type": "github" + }, + { + "url": "https://ko-fi.com/terminal42", + "type": "other" + } + ], + "time": "2023-03-29T06:10:00+00:00" + }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + }, + { + "name": "toflar/cronjob-supervisor", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Toflar/cronjob-supervisor.git", + "reference": "64bc57465313581584ac6215247b94fb761cb70e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Toflar/cronjob-supervisor/zipball/64bc57465313581584ac6215247b94fb761cb70e", + "reference": "64bc57465313581584ac6215247b94fb761cb70e", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/filesystem": "^6.0", + "symfony/lock": "^6.0", + "symfony/process": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "terminal42/contao-build-tools": "@dev" + }, + "type": "library", + "autoload": { + "psr-4": { + "Toflar\\CronjobSupervisor\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yanick Witschi", + "email": "yanick.witschi@terminal42.ch" + } + ], + "description": "A simple supervisor for processes that can be triggered using a minutely cronjob", + "support": { + "issues": "https://github.com/Toflar/cronjob-supervisor/issues", + "source": "https://github.com/Toflar/cronjob-supervisor/tree/1.0.0" + }, + "time": "2023-11-13T21:13:04+00:00" + }, + { + "name": "toflar/psr6-symfony-http-cache-store", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/Toflar/psr6-symfony-http-cache-store.git", + "reference": "9b3eb5b5f449a886b3ce202ddf3705e3d2ac79c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Toflar/psr6-symfony-http-cache-store/zipball/9b3eb5b5f449a886b3ce202ddf3705e3d2ac79c9", + "reference": "9b3eb5b5f449a886b3ce202ddf3705e3d2ac79c9", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/cache": "^6.0 || ^7.0", + "symfony/http-foundation": "^6.0 || ^7.0", + "symfony/http-kernel": "^6.0 || ^7.0", + "symfony/lock": "^6.0 || ^7.0", + "symfony/options-resolver": "^6.0 || ^7.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Toflar\\Psr6HttpCacheStore\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yanick Witschi", + "email": "yanick.witschi@terminal42.ch" + } + ], + "description": "An alternative store implementation for Symfony's HttpCache reverse proxy that supports auto-pruning of expired entries and cache invalidation by tags.", + "support": { + "issues": "https://github.com/Toflar/psr6-symfony-http-cache-store/issues", + "source": "https://github.com/Toflar/psr6-symfony-http-cache-store/tree/4.2.0" + }, + "time": "2023-09-18T14:46:04+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "32807183753de0388c8e59f7ac2d13bb47311140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/32807183753de0388c8e59f7ac2d13bb47311140", + "reference": "32807183753de0388c8e59f7ac2d13bb47311140", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "twig/twig": "^3.0" + }, + "require-dev": { + "league/commonmark": "^1.0|^2.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" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T14:02:01+00:00" + }, + { + "name": "twig/string-extra", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/string-extra.git", + "reference": "b0c9037d96baff79abe368dc092a59b726517548" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/string-extra/zipball/b0c9037d96baff79abe368dc092a59b726517548", + "reference": "b0c9037d96baff79abe368dc092a59b726517548", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^3.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\Extra\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Symfony String", + "homepage": "https://twig.symfony.com", + "keywords": [ + "html", + "string", + "twig", + "unicode" + ], + "support": { + "source": "https://github.com/twigphp/string-extra/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T14:02:01+00:00" + }, + { + "name": "twig/twig", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.22" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T18:54:41+00:00" + }, + { + "name": "ua-parser/uap-php", + "version": "v3.9.14", + "source": { + "type": "git", + "url": "https://github.com/ua-parser/uap-php.git", + "reference": "b796c5ea5df588e65aeb4e2c6cce3811dec4fed6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ua-parser/uap-php/zipball/b796c5ea5df588e65aeb4e2c6cce3811dec4fed6", + "reference": "b796c5ea5df588e65aeb4e2c6cce3811dec4fed6", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.1", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.33", + "phpunit/phpunit": "^8 || ^9", + "symfony/console": "^3.4 || ^4.2 || ^4.3 || ^5.0", + "symfony/filesystem": "^3.4 || ^4.2 || ^4.3 || ^5.0", + "symfony/finder": "^3.4 || ^4.2 || ^4.3 || ^5.0", + "symfony/yaml": "^3.4 || ^4.2 || ^4.3 || ^5.0", + "vimeo/psalm": "^3.12" + }, + "suggest": { + "symfony/console": "Required for CLI usage - ^3.4 || ^4.3 || ^5.0", + "symfony/filesystem": "Required for CLI usage - ^3.4 || ^4.3 || ^5.0", + "symfony/finder": "Required for CLI usage - ^3.4 || ^4.3 || ^5.0", + "symfony/yaml": "Required for CLI usage - ^3.4 || ^4.3 || ^5.0" + }, + "bin": [ + "bin/uaparser" + ], + "type": "library", + "autoload": { + "psr-4": { + "UAParser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dave Olsen", + "email": "dmolsen@gmail.com" + }, + { + "name": "Lars Strojny", + "email": "lars@strojny.net" + } + ], + "description": "A multi-language port of Browserscope's user agent parser.", + "support": { + "issues": "https://github.com/ua-parser/uap-php/issues", + "source": "https://github.com/ua-parser/uap-php/tree/v3.9.14" + }, + "time": "2020-10-02T23:36:20+00:00" + }, + { + "name": "webignition/disallowed-character-terminated-string", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/webignition/disallowed-character-terminated-string.git", + "reference": "1c35b8bacbb2e76837c0aa8538dc2468a1f10e6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webignition/disallowed-character-terminated-string/zipball/1c35b8bacbb2e76837c0aa8538dc2468a1f10e6e", + "reference": "1c35b8bacbb2e76837c0aa8538dc2468a1f10e6e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.3", + "phpunit/phpunit": "~8.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "webignition\\DisallowedCharacterTerminatedString\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jon Cram", + "email": "webignition@gmail.com" + } + ], + "description": "A string terminated by one or more disallowed characters", + "homepage": "https://github.com/webignition/disallowed-character-terminated-string", + "keywords": [ + "string", + "terminated" + ], + "support": { + "issues": "https://github.com/webignition/disallowed-character-terminated-string/issues", + "source": "https://github.com/webignition/disallowed-character-terminated-string/tree/master" + }, + "time": "2019-12-20T15:52:44+00:00" + }, + { + "name": "webignition/robots-txt-file", + "version": "3.0", + "source": { + "type": "git", + "url": "https://github.com/webignition/robots-txt-file.git", + "reference": "51bd7b1045348d94177cf6b21415385bf0923fa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webignition/robots-txt-file/zipball/51bd7b1045348d94177cf6b21415385bf0923fa6", + "reference": "51bd7b1045348d94177cf6b21415385bf0923fa6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=7.2.0", + "webignition/disallowed-character-terminated-string": ">=2,<3" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.3", + "phpunit/phpunit": "^8.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "webignition\\RobotsTxt\\": "src/", + "webignition\\RobotsTxt\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jon Cram", + "email": "webignition@gmail.com" + } + ], + "description": "Models a robots.txt file", + "homepage": "https://github.com/webignition/robots-txt-file", + "keywords": [ + "parser", + "robots.txt" + ], + "support": { + "issues": "https://github.com/webignition/robots-txt-file/issues", + "source": "https://github.com/webignition/robots-txt-file/tree/3.0" + }, + "time": "2019-12-20T17:50:44+00:00" + }, + { + "name": "wikimedia/less.php", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/less.php.git", + "reference": "e238ad228d74b6ffd38209c799b34e9826909266" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/less.php/zipball/e238ad228d74b6ffd38209c799b34e9826909266", + "reference": "e238ad228d74b6ffd38209c799b34e9826909266", + "shasum": "" + }, + "require": { + "php": ">=7.2.9" + }, + "require-dev": { + "phpunit/phpunit": "7.5.14" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + }, + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin Jantošovič", + "homepage": "https://github.com/Mordred" + } + ], + "description": "PHP port of the Javascript version of LESS http://lesscss.org (Originally maintained by Josh Schmidt)", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "support": { + "source": "https://github.com/wikimedia/less.php/tree/1.8.2" + }, + "time": "2019-11-06T18:30:11+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "contao/conflicts": 20, + "hofff/contao-navigation": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cb5bc87 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{html5,twig,js}] +indent_style = space +indent_size = 2 + +[*.{json,yaml,yml,config.js}] +indent_style = space +indent_size = 4 + +[package.json] +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..07e6592 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +/.ddev export-ignore +/.phpcq export-ignore +/.composer-require-checker.json export-ignore +/.editorconfig export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.gitlab-ci.yml export-ignore +/.phpcq.lock export-ignore +/.phpcq.yaml.dist export-ignore +/phpcs.xml.dist export-ignore +/psalm.xml export-ignore + diff --git a/.github/workflows/diagnostics.yml b/.github/workflows/diagnostics.yml new file mode 100644 index 0000000..733cff3 --- /dev/null +++ b/.github/workflows/diagnostics.yml @@ -0,0 +1,72 @@ +name: Code Quality Diagnostics + +on: + pull_request: + push: + branches: + - master + - develop + +jobs: + build: + runs-on: ubuntu-latest + + name: PHP ${{ matrix.php }} + + strategy: + fail-fast: false + matrix: + include: + - php: '8.1' + phpcq_install: 'update' + phpcq_flags: '' + - php: '8.2' + phpcq_install: 'update' + phpcq_flags: '' + + steps: + - name: Pull source + uses: actions/checkout@v4 + + - name: Setup PHP with PECL extension + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: xdebug2 + + - name: Cache composer cache directory + uses: actions/cache@v4 + env: + cache-name: composer-cache-dir-${{ matrix.php }} + with: + path: ~/.cache/composer + key: ${{ runner.os }}-build-${{ env.cache-name }} + + - name: Install composer dependencies + run: composer install + + - name: Cache vendor directory of phpcq tool runner + uses: actions/cache@v4 + env: + cache-name: vendor-${{ matrix.php }} + with: + path: $GITHUB_WORKSPACE/vendor + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + + - name: Update phpcq + run: $GITHUB_WORKSPACE/vendor/bin/phpcq self-update --unsigned + + - name: Install phpcq toolchain + run: $GITHUB_WORKSPACE/vendor/bin/phpcq ${{ matrix.phpcq_install }} -v + + - name: Run tests + run: $GITHUB_WORKSPACE/vendor/bin/phpcq run -o github-action -o default ${{ matrix.phpcq_flags }} -v + + - name: Upload build directory to artifact + uses: actions/upload-artifact@v4 + if: ${{ success() }} || ${{ failure() }} + with: + name: phpcq-builds-php-${{ matrix.php }} + path: .phpcq/build/ diff --git a/.gitignore b/.gitignore index f2870aa..0000e3b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,11 @@ !/publish/ !/build.xml !/README.md -!/composer.json \ No newline at end of file +!/composer.json +!/src +!/.phpcq.yaml.dist +!/.phpcq.lock +!/phpcs.xml.dist +!/phpunit.xml.dist +!/psalm.xml +!/.github diff --git a/.phpcq.lock b/.phpcq.lock new file mode 100644 index 0000000..a5a8d78 --- /dev/null +++ b/.phpcq.lock @@ -0,0 +1 @@ +{"plugins":{"psalm":{"api-version":"1.0.0","version":"1.2.0.0","type":"php-file","url":"https://phpcq.github.io/repository/plugin/psalm/psalm-1.2.0.0.php","signature":null,"requirements":{"php":{"php":"^7.4 || ^8.0","ext-dom":"*"},"tool":{"psalm":"^3.0 || ^4.0 || ^5.0"}},"checksum":{"type":"sha-512","value":"4a550c9226d7bca582d7c10bd87cce01190c96398936b1613421640c83df62ed1c6e0d44c1b39635414ea8cf4a892a6458d27590793238add24e7cb5547e6ffd"},"tools":{"psalm":{"version":"5.22.1","url":"https://github.com/vimeo/psalm/releases/download/5.22.1/psalm.phar","requirements":{"php":{"php":"^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0","ext-SimpleXML":"*","ext-ctype":"*","ext-dom":"*","ext-json":"*","ext-libxml":"*","ext-mbstring":"*","ext-tokenizer":"*"}},"checksum":null,"signature":"https://github.com/vimeo/psalm/releases/download/5.22.1/psalm.phar.asc"}},"composerLock":null},"composer-require-checker":{"api-version":"1.0.0","version":"1.1.1.0","type":"php-file","url":"https://phpcq.github.io/repository/plugin/composer-require-checker/composer-require-checker-1.1.1.0.php","signature":null,"requirements":{"php":{"php":"^7.4 || ^8.0"},"tool":{"composer-require-checker":"^3.8 || ^4.0"}},"checksum":{"type":"sha-512","value":"d5415bddfe024c5749d894034583882aee4e5c3e1087815d9fdd81cb5e71630f631a0e35de0ff84b97fbbf738c16ece5f83bd8c00695913eb846aa6f04577dc2"},"tools":{"composer-require-checker":{"version":"4.8.0","url":"https://github.com/maglnet/ComposerRequireChecker/releases/download/4.8.0/composer-require-checker.phar","requirements":{"php":{"php":"~8.2.0 || ~8.3.0","ext-phar":"*"}},"checksum":null,"signature":"https://github.com/maglnet/ComposerRequireChecker/releases/download/4.8.0/composer-require-checker.phar.asc"}},"composerLock":null},"phpmd":{"api-version":"1.0.0","version":"1.0.2.0","type":"php-file","url":"https://phpcq.github.io/repository/plugin/phpmd/phpmd-1.0.2.0.php","signature":null,"requirements":{"php":{"php":"^7.3 || ^8.0","ext-dom":"*"},"tool":{"phpmd":"^2.6.1"}},"checksum":{"type":"sha-512","value":"f22280a6dec8dbdd2ec1d83b294f23237fe32c34f4a298e52038e0a7a0074d541635b2b488b1a6098a42d8418a6cd8eb804406ea82b91e362be2b5d11a0915b0"},"tools":{"phpmd":{"version":"2.15.0","url":"https://github.com/phpmd/phpmd/releases/download/2.15.0/phpmd.phar","requirements":{"php":{"php":">=5.3.9","ext-xml":"*"}},"checksum":null,"signature":"https://github.com/phpmd/phpmd/releases/download/2.15.0/phpmd.phar.asc"}},"composerLock":null},"phpcpd":{"api-version":"1.0.0","version":"1.1.1.0","type":"php-file","url":"https://phpcq.github.io/repository/plugin/phpcpd/phpcpd-1.1.1.0.php","signature":null,"requirements":{"php":{"php":"^7.3 || ^8.0","ext-dom":"*"},"tool":{"phpcpd":"^6.0"}},"checksum":{"type":"sha-512","value":"1189ce0bf3fade4cb4241f1d96f915ef8fc7651f4450dc79fdf464ee3d6be3009316f0d423ce2d4af9d76ad50807b7fdf4d77bfa6d9ee2c91d6eda32ea214433"},"tools":{"phpcpd":{"version":"6.0.3","url":"https://phar.phpunit.de/phpcpd-6.0.3.phar","requirements":{"php":{"php":">=7.3","ext-dom":"*"}},"checksum":{"type":"sha-256","value":"2cbaea7cfda1bb4299d863eb075e977c3f49055dd16d88529fae5150d48a84cb"},"signature":"https://phar.phpunit.de/phpcpd-6.0.3.phar.asc"}},"composerLock":null},"phploc":{"api-version":"1.0.0","version":"1.0.0.0","type":"php-file","url":"https://phpcq.github.io/repository/plugin/phploc/phploc-1.0.0.0.php","signature":null,"requirements":{"php":{"php":"^7.3 || ^8.0","ext-dom":"*","ext-json":"*"},"tool":{"phploc":"^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"}},"checksum":{"type":"sha-512","value":"f67b02d494796adf553cb3dd13ec06c1cb8e53c799954061749424251379541637538199afb3afa3c7a01cabd1cb6f1c53eb621f015dff9644c6c7cbf10c56d1"},"tools":{"phploc":{"version":"7.0.2","url":"https://phar.phpunit.de/phploc-7.0.2.phar","requirements":{"php":{"php":">=7.3","ext-dom":"*","ext-json":"*"}},"checksum":{"type":"sha-256","value":"3d59778ec86faf25fd00e3a329b2f9ad4a3c751ca91601ea7dab70f887b0bf46"},"signature":"https://phar.phpunit.de/phploc-7.0.2.phar.asc"}},"composerLock":null},"phpcs":{"api-version":"1.0.0","version":"1.1.1.0","type":"php-file","url":"https://phpcq.github.io/repository/plugin/phpcs/phpcs-1.1.1.0.php","signature":null,"requirements":{"php":{"php":"^7.3 || ^8.0","ext-dom":"*"},"tool":{"phpcs":"^3.0 || ^2.0","phpcbf":"^3.0 || ^2.0"}},"checksum":{"type":"sha-512","value":"2737022369da1318cc4e0ea194e8a81019f7b079080d869aab878b7486052fdbe68fee3f28131f35573226def1aabd4bd005e038ee7b767c137b1107c1492a83"},"tools":{"phpcs":{"version":"3.9.0","url":"https://github.com/PHPCSStandards/PHP_CodeSniffer/releases/download/3.9.0/phpcs.phar","requirements":{"php":{"php":">=5.4.0","ext-simplexml":"*","ext-tokenizer":"*","ext-xmlwriter":"*"}},"checksum":null,"signature":"https://github.com/PHPCSStandards/PHP_CodeSniffer/releases/download/3.9.0/phpcs.phar.asc"},"phpcbf":{"version":"3.9.0","url":"https://github.com/PHPCSStandards/PHP_CodeSniffer/releases/download/3.9.0/phpcbf.phar","requirements":{"php":{"php":">=5.4.0","ext-simplexml":"*","ext-tokenizer":"*","ext-xmlwriter":"*"}},"checksum":null,"signature":"https://github.com/PHPCSStandards/PHP_CodeSniffer/releases/download/3.9.0/phpcbf.phar.asc"}},"composerLock":null},"composer-normalize":{"api-version":"1.0.0","version":"1.1.0.0","type":"php-file","url":"https://phpcq.github.io/repository/plugin/composer-normalize/composer-normalize-1.1.0.0.php","signature":null,"requirements":{"php":{"php":"^7.3 || ^8.0","ext-json":"*"},"tool":{"composer-normalize":"^2.1"}},"checksum":{"type":"sha-512","value":"d59d3557cb20630734878a9115df5dd32d5aff815e5b15be36f6fb5d6e9d83dd36efd84215ab6529edcc924f600946f739a0d9e67723deff95c88346ab502498"},"tools":{"composer-normalize":{"version":"2.42.0","url":"https://github.com/ergebnis/composer-normalize/releases/download/2.42.0/composer-normalize.phar","requirements":{"php":{"php":"~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0","ext-json":"*"}},"checksum":null,"signature":"https://github.com/ergebnis/composer-normalize/releases/download/2.42.0/composer-normalize.phar.asc"}},"composerLock":null}},"tools":[]} \ No newline at end of file diff --git a/.phpcq.yaml.dist b/.phpcq.yaml.dist new file mode 100644 index 0000000..18b0d08 --- /dev/null +++ b/.phpcq.yaml.dist @@ -0,0 +1,107 @@ +phpcq: + repositories: + - https://phpcq.github.io/repository/repository.json + directories: + - src + artifact: .phpcq/build + + plugins: + psalm: + version: ^1.0 + signed: false + composer-require-checker: + version: ^1.0 + signed: false + phpmd: + version: ^1.0 + signed: false + requirements: + phpmd: + signed: false + phpcpd: + version: ^1.1 + signed: false + phploc: + version: ^1.0 + signed: false + phpcs: + version: ^1.0 + signed: false + composer-normalize: + version: ^1.0 + signed: false + trusted-keys: + # composer-require-checker + - 033E5F8D801A2F8D + # sb@sebastian-bergmann.de + - 4AA394086372C20A + # psalm + - 8A03EA3B385DBAA1 + - 12CE0F1D262429A5 + # magl@magll.net + - D2CCAC42F6295E7D + # PHP_CodeSniffer + - 31C7E470E2138192 + - 5E6DDE998AB73B8E + # Composer normalize + - C00543248C87FB13 + # phpmd + - 0F9684B8B16B7AB0 + - 9093F8B32E4815AA + +tasks: + fix: + - composer-normalize-fix + - phpcbf + + verify: + - composer-require-checker + - composer-normalize + + analyze: + - phploc + - phpcpd + - phpmd + - phpcs + - psalm + + default: + - verify + - analyze + + phpmd: + config: + ruleset: + - codesize + - controversial + - design + - naming + - unusedcode + + composer-require-checker: + config: + config_file: '.composer-require-checker.json' + + phpcs: + config: &phpcs-config + standard: ~ + standard_paths: + - ./vendor/slevomat/coding-standard + - ./vendor/doctrine/coding-standard/lib + + phpcbf: + plugin: phpcs + config: + <<: *phpcs-config + fix: true + + composer-normalize: + config: &composer-normalize-config + ignore_output: + - '#> pre-command-run: Contao\\ManagerPlugin\\Composer\\ArtifactsPlugin->preCommandRun#' + + composer-normalize-fix: + plugin: composer-normalize + config: + <<: *composer-normalize-config + dry_run: false diff --git a/README.md b/README.md new file mode 100644 index 0000000..6306296 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Advanced navigation module for Contao CMS + +## Requirements + + - Contao `4.13 || ^5.3` + - PHP `8.1` diff --git a/TL_ROOT/system/modules/backboneit_navigation/AbstractModuleNavigation.php b/TL_ROOT/system/modules/backboneit_navigation/AbstractModuleNavigation.php deleted file mode 100644 index aae5129..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/AbstractModuleNavigation.php +++ /dev/null @@ -1,705 +0,0 @@ - the ID of the current item (optional) - * isTrail => whether this item is in the trail path - * class => CSS classes - * title => page name with Insert-Tags stripped and XML specialchars replaced by their entities - * pageTitle => page title with Insert-Tags stripped and XML specialchars replaced by their entities - * link => page name (with Insert-Tags and XML specialchars NOT replaced; as stored in the db) - * href => URL of target page - * nofollow => true, if nofollow should be set on rel attribute - * target => either ' onclick="window.open(this.href); return false;"' or empty string - * description => page description with line breaks (\r and \n) replaced by whitespaces - * - * Calculated while rendering: - * subitems => subnavigation as HTML string or empty string (rendered if subpages & items setup correctly) - * isActive => whether this item is the current active navigation item - * - * Following CSS classes are calculated while rendering: level_x, trail, sibling, submenu, first, last - * - * Additionally all page dataset values from the database are available unter their field name, - * if the field name does not collide with the listed keys. - * - * For the collisions of the Contao core page dataset fields the following keys are available: - * _type - * _title - * _pageTitle - * _target - * _description - * - * @author Oliver Hoff - */ -abstract class AbstractModuleNavigation extends Module { - - const HOOK_DISABLE = 0; - const HOOK_ENABLE = 1; - const HOOK_FORCE = 2; - - public static $arrDefaultFields = array( - 'id' => true, - 'pid' => true, - 'sorting' => true, - 'tstamp' => true, - 'type' => true, - 'alias' => true, - 'title' => true, - 'protected' => true, - 'groups' => true, - 'jumpTo' => true, - 'pageTitle' => true, - 'target' => true, - 'description' => true, - 'url' => true, - 'robots' => true, - 'cssClass' => true, - 'accesskey' => true, - 'tabindex' => true - ); - - protected $arrFields = array(); // the fields to use for navigation tpl - protected $strJumpToQuery; - protected $strJumpToFallbackQuery; - - protected $objStmt; // a reusable stmt object - - protected $arrGroups; // set of groups of the current user - protected $arrTrail; // same as trail but with current page included - - public $varActiveID; // the id of the active page - - public $arrItems = array(); // compiled page datasets - public $arrSubitems = array(); // ordered IDs of subnavigations - /** @Deprecated */ public $arrSubpages; - - protected $blnTreeHook = false; // execute tree hook? - protected $blnItemHook = false; // execute item hook? - - public function __construct($objModule, $strColumn = 'main') { - parent::__construct($objModule, $strColumn); - if(TL_MODE == 'BE') - return; - - $this->arrSubpages = &$this->arrSubitems; // for deprecated compat - - $this->import('Database'); - - $this->varActiveID = $this->backboneit_navigation_isSitemap || $this->Input->get('articles') ? false : $GLOBALS['objPage']->id; - $this->arrTrail = array_flip($GLOBALS['objPage']->trail); - - if(FE_USER_LOGGED_IN) { - $this->import('FrontendUser', 'User'); - $this->User->groups && $this->arrGroups = $this->User->groups; - } - - if(!strlen($this->navigationTpl)) - $this->navigationTpl = 'nav_default'; - - $arrFields = deserialize($this->backboneit_navigation_addFields, true); - - if(count($arrFields) > 10) { - $this->arrFields[] = '*'; - - } elseif($arrFields) { - $arrFields = array_flip($arrFields); - foreach($this->Database->listFields('tl_page') as $arrField) - if(isset($arrFields[$arrField['name']])) - $this->arrFields[$arrField['name']] = true; - - $this->arrFields = array_keys(array_merge($this->arrFields, self::$arrDefaultFields)); - - } else { - $this->arrFields = array_keys(self::$arrDefaultFields); - } - - $this->objStmt = $this->Database->prepare('*'); - - $arrConditions = array( - $this->getQueryPartGuests(), - $this->getQueryPartPublish() - ); - $strConditions = implode(' AND ', array_filter($arrConditions, 'strlen')); - $strConditions && $strConditions = ' AND (' . $strConditions . ')'; - - $this->strJumpToQuery = - 'SELECT * - FROM tl_page - WHERE id = ? - ' . $strConditions . ' - LIMIT 0, 1'; - - $this->strJumpToFallbackQuery = - 'SELECT * - FROM tl_page - WHERE pid = ? - AND type = \'regular\' - ' . $strConditions . ' - ORDER BY sorting - LIMIT 0, 1'; - - if(!$this->backboneit_navigation_disableHooks) { - $this->blnTreeHook = is_array($GLOBALS['TL_HOOKS']['backboneit_navigation_tree']); - $this->blnItemHook = is_array($GLOBALS['TL_HOOKS']['bbit_navi_item']); - } - } - - public function __get($strKey) { - switch($strKey) { - case 'strJumpToFallbackQuery': - case 'strJumpToQuery': - case 'arrFields': - case 'arrGroups': - case 'arrTrail': - return $this->$strKey; - } - return parent::__get($strKey); - } - - /** - * Filters the given array of page IDs in regard of publish state, - * required permissions (protected and guests only) and hidden state, according to - * this navigations settings. - * Maintains relative order of the input array. - * - * For permance reason $arrPages is NOT "intval"ed. Make sure $arrPages - * contains no hazardous code. - * - * @param array $arrPages An array of page IDs to filter - * @return array Filtered array of page IDs - */ - public function filterPages(array $arrPages, $strConditions = '') { - if(!$arrPages) - return $arrPages; - - $strConditions && $strConditions = 'AND (' . $strConditions . ')'; - $objPage = $this->objStmt->query( - 'SELECT ' . $this->getQuotedFieldsPart(['id', 'pid', 'protected', 'groups']) . ' - FROM tl_page - WHERE id IN (' . implode(',', array_keys(array_flip($arrPages))) . ') - ' . $strConditions - ); - - if(!$this->isPermissionCheckRequired()) - return array_intersect($arrPages, $objPage->fetchEach('id')); // restore order - - $arrPIDs = array(); - $arrValid = array(); - while($arrPage = $objPage->fetchAssoc()) { - if($this->isPermissionDenied($arrPage)) - continue; - - $arrValid[] = $arrPage['id']; - /* - * do not remove the protected check! permission denied checks for - * more, but we need to know, if we must recurse to parent pages, - * for permission check, which must not be done, when this page - * defines access rights. - */ - if(!$arrPage['protected'] && $arrPage['pid'] != 0) - $arrPIDs[$arrPage['pid']][] = $arrPage['id']; - } - - // exclude pages which are in a protected path - while(count($arrPIDs)) { - $arrIDs = $arrPIDs; - $arrPIDs = array(); - - $objPage = $this->objStmt->query( - 'SELECT ' . $this->getQuotedFieldsPart(['id', 'pid', 'protected', 'groups']) . ' - FROM tl_page - WHERE id IN (' . implode(',', array_keys($arrIDs)) . ')' - ); - - while($arrPage = $objPage->fetchAssoc()) { - if(!$arrPage['protected']) { // do not remove, see above - if($arrPage['pid'] != 0) { - $arrPIDs[$arrPage['pid']] = isset($arrPIDs[$arrPage['pid']]) - ? array_merge($arrPIDs[$arrPage['pid']], $arrIDs[$arrPage['id']]) - : $arrIDs[$arrPage['id']]; - } - } elseif($this->isPermissionDenied($arrPage)) { - $arrValid = array_diff($arrValid, $arrIDs[$arrPage['id']]); - } - } - } - - return array_intersect($arrPages, $arrValid); - } - - /** - * Retrieves the subpages of the given array of page IDs in respect of the - * given conditions, which are added to the WHERE clause of the query. - * Maintains relative order of the input array. - * - * For permance reason $arrPages is NOT "intval"ed. Make sure $arrPages - * contains no hazardous code. - * - * @param array $arrPages An array of parent IDs - * @return array The child IDs - */ - public function getNextLevel(array $arrPages, $strConditions = '') { - if(!$arrPages) - return $arrPages; - - $strConditions && $strConditions = 'AND (' . $strConditions . ')'; - $objNext = $this->objStmt->query( - 'SELECT ' . $this->getQuotedFieldsPart(['id', 'pid', 'protected', 'groups']) . ' - FROM tl_page - WHERE pid IN (' . implode(',', array_keys(array_flip($arrPages))) . ') - ' . $strConditions . ' - ORDER BY sorting' - ); - - $arrNext = array(); - if($this->isPermissionCheckRequired()) { - while($arrPage = $objNext->fetchAssoc()) - if(!$this->isPermissionDenied($arrPage)) - $arrNext[$arrPage['pid']][] = $arrPage['id']; - } else { - while($arrPage = $objNext->fetchAssoc()) - $arrNext[$arrPage['pid']][] = $arrPage['id']; - } - - $arrNextLevel = array(); - foreach($arrPages as $intID) - if(isset($arrNext[$intID])) - $arrNextLevel = array_merge($arrNextLevel, $arrNext[$intID]); - - return $arrNextLevel; - } - - /** - * Retrieves the parents of the given array of page IDs in respect of the - * given conditions, which are added to the WHERE clause of the query. - * Maintains relative order of the input array and merges subsequent parent - * IDs. - * - * For permance reason $arrPages is NOT "intval"ed. Make sure $arrPages - * contains no hazardous code. - * - * @param array $arrPages An array of child IDs - * @return array The parent IDs - */ - public function getPrevLevel(array $arrPages, $strConditions = '') { - if(!$arrPages) - return $arrPages; - - $strConditions && $strConditions = 'AND (' . $strConditions . ')'; - $objPrev = $this->objStmt->query( - 'SELECT id, pid - FROM tl_page - WHERE id IN (' . implode(',', array_keys(array_flip($arrPages))) . ') - ' . $strConditions - ); - - $arrPrev = array(); - while($objPrev->next()) - $arrPrev[$objPrev->id] = $objPrev->pid; - - $arrPrevLevel = array(); - $intPID = -1; - foreach($arrPages as $intID) - if(isset($arrPrev[$intID]) && $arrPrev[$intID] != $intPID) - $arrPrevLevel[] = $intPID = $arrPrev[$intID]; - - return $arrPrevLevel; - } - - - /** - * Renders the navigation of the given IDs into the navigation template. - * Adds CSS classes "first" and "last" to the appropriate navigation item arrays. - * If the given array is empty, the empty string is returned. - * - * @param array $arrRoots The navigation items arrays - * @param integer $intStop (optional, defaults to PHP_INT_MAX) The soft limit of depth. - * @param integer $intHard (optional, defaults to PHP_INT_MAX) The hard limit of depth. - * @param integer $intLevel (optional, defaults to 1) The current level of this navigation layer - * @return string The parsed navigation template, could be empty string. - */ - protected function renderNavigationTree(array $arrIDs, $strTemplate, $arrStop = PHP_INT_MAX, $intHard = PHP_INT_MAX, $intLevel = 1) { - if(!$arrIDs) - return ''; - - $arrStop = (array) $arrStop; - $arrStop || $arrStop = array(PHP_INT_MAX); - $intStop = $intLevel >= $arrStop[0] ? array_shift($arrStop) : $arrStop[0]; - $arrItems = array(); - - foreach($arrIDs as $varID) { - if(!$this->arrItems[$varID]) { - continue; - } - - $arrItem = $this->arrItems[$varID]; - - if($varID == $this->varActiveID) { - $blnContainsActive = true; - - if ($arrItem['href'] === Environment::get('request')) { - $arrItem['isActive'] = true; // nothing else (active class is set in template) - $arrItem['isTrail'] = false; - } else { - $arrItem['isActive'] = false; // nothing else (active class is set in template) - $arrItem['isTrail'] = true; - } - - } else { // do not flatten if/else - if($arrItem['tid'] == $this->varActiveID) { - if ($arrItem['href'] === Environment::get('request')) { - $arrItem['isActive'] = true; // nothing else (active class is set in template) - $arrItem['isTrail'] = false; - } else { - $arrItem['isActive'] = false; // nothing else (active class is set in template) - $arrItem['isTrail'] = true; - } - } - } - - if($arrItem['isTrail']) { - $arrItem['class'] .= ' trail'; - } - - if(!isset($this->arrSubitems[$varID])) { - $arrItem['class'] .= ' leaf'; - - } elseif($intLevel >= $intHard) { - // we are at hard level, never draw submenu - $arrItem['class'] .= ' submenu leaf'; - - } elseif($intLevel >= $intStop && !$arrItem['isTrail'] && $varID !== $this->varActiveID && $arrItem['tid'] != $this->varActiveID) { - // we are at stop level and not trail and not active, never draw submenu - $arrItem['class'] .= ' submenu leaf'; - - } elseif($this->arrSubitems[$varID]) { - $arrItem['class'] .= ' submenu inner'; - $arrItem['subitems'] = $this->renderNavigationTree( - $this->arrSubitems[$varID], $arrItem['template'], $arrStop, $intHard, $intLevel + 1 - ); - - } else { // should never be reached, if no hooks are used - $arrItem['class'] .= ' leaf'; - } - - $arrItems[] = $arrItem; - } - - if($blnContainsActive) - foreach($arrItems as &$arrItem) - if(!$arrItem['isActive']) - $arrItem['class'] .= ' sibling'; - - $arrItems[0]['class'] .= ' first'; - $arrItems[count($arrItems) - 1]['class'] .= ' last'; - - foreach($arrItems as &$arrItem) - $arrItem['class'] = ltrim($arrItem['class']); - - strlen($strTemplate) || $strTemplate = $this->navigationTpl; - $objTemplate = new FrontendTemplate($strTemplate); - $objTemplate->setData(array( - 'module' => $this->arrData, - 'level' => 'level_' . $intLevel, - 'items' => $arrItems, - 'type' => get_class($this) - )); - - return $objTemplate->parse(); - } - - /** - * Compiles a navigation item array from a page dataset with the given subnavi - * - * @param array $arrPage The page dataset as an array - * @return array The compiled navigation item array - */ - public function compileNavigationItem(array $arrPage, $blnForwardResolution = true, $intItemHook = self::HOOK_DISABLE) { - // fallback for dataset field collisions - $arrPage['_title'] = $arrPage['title']; - $arrPage['_pageTitle'] = $arrPage['pageTitle']; - $arrPage['_target'] = $arrPage['target']; - $arrPage['_description'] = $arrPage['description']; - - $arrPage['link'] = $arrPage['_title']; - $arrPage['class'] = $arrPage['cssClass'] . ' ' . $arrPage['type']; - $arrPage['title'] = specialchars($arrPage['_title'], true); - $arrPage['pageTitle'] = specialchars($arrPage['_pageTitle'], true); - $arrPage['target'] = ''; // overwrite DB value - $arrPage['nofollow'] = strncmp($arrPage['robots'], 'noindex', 7) === 0; - $arrPage['description'] = str_replace(array("\n", "\r"), array(' ' , ''), $arrPage['_description']); - $arrPage['isTrail'] = isset($this->arrTrail[$arrPage['id']]); - - switch($arrPage['type']) { - case 'forward': - if($blnForwardResolution) { - if($arrPage['jumpTo']) { - $intFallbackSearchID = $arrPage['id']; - $intJumpToID = $arrPage['jumpTo']; - do { - $objNext = $this->objStmt->prepare($this->strJumpToQuery)->execute($intJumpToID); - - if(!$objNext->numRows) { - $objNext = $this->objStmt->prepare($this->strJumpToFallbackQuery)->execute($intFallbackSearchID); - break; - } - - $intFallbackSearchID = $intJumpToID; - $intJumpToID = $objNext->jumpTo; - - } while($objNext->type == 'forward'); - - } else { - $objNext = $this->objStmt->prepare($this->strJumpToFallbackQuery)->execute($arrPage['id']); - } - - if(!$objNext->numRows) { - $arrPage['href'] = $this->generatePageUrl($arrPage); - - } elseif($objNext->type == 'redirect') { - $arrPage['href'] = $this->encodeEmailURL($objNext->url); - $arrPage['target'] = $objNext->target ? LINK_NEW_WINDOW : ''; - - } else { - $arrPage['tid'] = $objNext->id; - $arrPage['href'] = $this->generatePageUrl($objNext->row()); - } - } else { - $arrPage['tid'] = $arrPage['jumpTo']; - $arrPage['href'] = $this->generatePageUrl($arrPage); - } - break; - - case 'redirect': - $arrPage['href'] = $this->encodeEmailURL($arrPage['url']); - $arrPage['target'] = $arrPage['_target'] ? LINK_NEW_WINDOW : ''; - break; - - case 'root': - if(!$arrPage['dns'] - || preg_replace('/^www\./', '', $arrPage['dns']) == preg_replace('/^www\./', '', $this->Environment->httpHost)) { - $arrPage['href'] = $this->Environment->base; - break; // we only break on root pages; pages in different roots should be handled by DomainLink extension - } - // do not break - - default: - case 'regular': - case 'error_401': - case 'error_403': - case 'error_404': - $arrPage['href'] = $this->generatePageUrl($arrPage); - break; - } - - if($intItemHook != self::HOOK_DISABLE) { - $this->executeItemHook($arrPage, $intItemHook == self::HOOK_FORCE); - } - - return $arrPage; - } - - /** - * Utility method of compileNavigationItem. - * - * If the given URL starts with "mailto:", the E-Mail is encoded, - * otherwise nothing is done. - * - * @param string $strHref The URL to check and possibly encode - * @return string The modified URL - */ - public function encodeEmailURL($strHref) { - if(strncasecmp($strHref, 'mailto:', 7) !== 0) - return $strHref; - - if (version_compare(VERSION . '.' . BUILD, '3.5.5', '>=')) { - return \StringUtil::encodeEmail($strHref); - } else { - return \String::encodeEmail($strHref); - } - } - - public function isPermissionCheckRequired() { - return !BE_USER_LOGGED_IN && !$this->backboneit_navigation_showProtected; - } - - /** - * Utility method. - * - * THIS IS NOT THE OPPOSITE OF ::isPermissionGranted()! - * - * Checks if the current user has no permission to view the page of the - * given page dataset, in regards to the permission requirements of the - * page. - * - * @param array $arrPage The page dataset of the current page, with at least - * groups and protected attributes set. - * - * @return boolean If the permission is denied true, otherwise false. - */ - public function isPermissionDenied($arrPage) { - if(!$arrPage['protected']) // this page is not protected - return false; - - if(!$this->arrGroups) // the current user is not in any group - return true; - - // check if the current user is not in any group, which is allowed to access the current page - return !array_intersect($this->arrGroups, deserialize($arrPage['groups'], true)); - } - - /** - * Utility method. - * - * THIS IS NOT THE OPPOSITE OF ::isPermissionDenied()! - * - * Checks if the current user has permission to view the page of the given - * page dataset, in regards to the current navigation settings and the - * permission requirements of the page. - * - * Context property: backboneit_navigation_showProtected - * - * @param array $arrPage The page dataset of the current page, with at least - * groups and protected attributes set. - * - * @return boolean If the permission is granted true, otherwise false. - */ - public function isPermissionGranted($arrPage) { - if(BE_USER_LOGGED_IN) // be users have access everywhere - return true; - - if($this->backboneit_navigation_showProtected) // protection is ignored - return true; - - return !$this->isPermissionDenied($arrPage); - } - - /** - * Returns the part of the where condition, checking for hidden state of a page. - * - * @return string The where condition - */ - public function getQueryPartHidden($blnShowHidden = false, $blnSitemap = false) { - if($blnShowHidden) { - return ''; - } elseif($blnSitemap) { - return '(sitemap = \'map_always\' OR (hide != 1 AND sitemap != \'map_never\'))'; - } else { - return 'hide != 1'; - } - } - - /** - * Returns the part of the where condition, checking for guest visibility state of a page. - * - * @return string The where condition - */ - public function getQueryPartGuests() { - if(FE_USER_LOGGED_IN && !BE_USER_LOGGED_IN) { - return 'guests != 1'; - } else { - return ''; - } - } - - /** - * Returns the part of the where condition checking for publication state of a page. - * - * @return string The where condition - */ - public function getQueryPartPublish() { - if(BE_USER_LOGGED_IN) { - return ''; - } else { - static $intTime; if(!$intTime) $intTime = time(); - return '(start = \'\' OR start < ' . $intTime . ') AND (stop = \'\' OR stop > ' . $intTime . ') AND published = 1'; - } - } - - public function getQueryPartErrorPages($blnShowErrorPages = false) { - if($blnShowErrorPages) { - return ''; - } else { - return 'type != \'error_401\' AND type != \'error_403\' AND type != \'error_404\''; - } - } - - protected function getQuotedFieldsPart(array $fields) : string - { - return implode(', ', array_map([$this->Database, 'quoteIdentifier'], $fields)); - } - - /** - * A helper method to generate BE wildcard. - * - * @param string $strBEType (optional, defaults to "NAVIGATION") The type to be displayed in the wildcard - * @return string The wildcard HTML string - */ - protected function generateBE($strBEType = 'NAVIGATION') { - $objTemplate = new BackendTemplate('be_wildcard'); - - $objTemplate->wildcard = '### ' . $strBEType . ' ###'; - $objTemplate->title = $this->headline; - $objTemplate->id = $this->id; - $objTemplate->link = $this->name; - $objTemplate->href = 'contao/main.php?do=themes&table=tl_module&act=edit&id=' . $this->id; - - return $objTemplate->parse(); - } - - public function addForwardItem($varID, $varTargetID) { - if(is_array($this->arrItems[$varID])) { - $this->arrItems[$varID]['href'] = $this->arrItems[$varTargetID]['href']; - } else { - $this->arrItems[$varID] = $this->arrItems[$varTargetID]; - $this->arrItems[$varID]['id'] = $varID; - unset($this->arrItems[$varID]['pid']); - } - $this->arrItems[$varID]['tid'] = $varTargetID; - } - - /** - * Executes the tree hook, to dynamically add navigations items to the tree - * the navigation is rendered from. - * - * The callback receives the following parameters: - * $this - This navigation module instance - * - * @param array $arrRootIDs The root pages before hook execution - * @return array $arrRootIDs The root pages after hook execution - */ - protected function executeTreeHook($blnForce = false) { - if(!$blnForce && !$this->blnTreeHook) { - return; - } - - foreach((array) $GLOBALS['TL_HOOKS']['backboneit_navigation_tree'] as $arrCallback) { - $this->import($arrCallback[0]); - $this->{$arrCallback[0]}->{$arrCallback[1]}($this); - } - } - - protected function executeItemHook(array &$arrPage, $blnForce = false) { - if(!$blnForce && !$this->blnItemHook) { - return; - } - - foreach((array) $GLOBALS['TL_HOOKS']['bbit_navi_item'] as $arrCallback) { - $this->import($arrCallback[0]); - $this->{$arrCallback[0]}->{$arrCallback[1]}($this, $arrPage); - } - } - - private function generatePageUrl(array $arrPage) - { - $pageModel = \Contao\PageModel::findByPk($arrPage['id']); - if ($pageModel) { - return $pageModel->getFrontendUrl(); - } - - return null; - } -} diff --git a/TL_ROOT/system/modules/backboneit_navigation/ModuleNavigationChainPreorder.php b/TL_ROOT/system/modules/backboneit_navigation/ModuleNavigationChainPreorder.php deleted file mode 100644 index 6aef02f..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/ModuleNavigationChainPreorder.php +++ /dev/null @@ -1,51 +0,0 @@ -generateBE('NAVIGATION CHAIN PREORDER'); - - return $this->strNavigation ? parent::generate() : ''; - } - - protected function compile() { - $this->Template->request = $this->getIndexFreeRequest(true); - $this->Template->skipId = 'skipNavigation' . $this->id; - $this->Template->items = $this->strNavigation; - } - - /** - * Executes the navigation chain hook. - * - * The callback receives the following parameters: - * $this - This navigation module instance - * $arrChainIDs - The (ordered) IDs of the navigation chain to be rendered. - * - * And should return a new chain array or null - * - * @param array $arrRootIDs The root pages before hook execution - * @return array $arrRootIDs The root pages after hook execution - */ - protected function executeChainHook(array $arrChainIDs, $blnForce = false) { - if(!$blnForce && $this->backboneit_navigation_disableHooks) - return $arrChainIDs; - if(!is_array($GLOBALS['TL_HOOKS']['backboneit_navigation_chain'])) - return $arrChainIDs; - - foreach($GLOBALS['TL_HOOKS']['backboneit_navigation_chain'] as $arrCallback) { - $this->import($arrCallback[0]); - $arrNewChain = $this->{$arrCallback[0]}->{$arrCallback[1]}($this, $arrChainIDs); - - if($arrNewChain !== null) - $arrChainIDs = $arrNewChain; - } - - return $arrChainIDs; - } - -} diff --git a/TL_ROOT/system/modules/backboneit_navigation/ModuleNavigationMenu.php b/TL_ROOT/system/modules/backboneit_navigation/ModuleNavigationMenu.php deleted file mode 100644 index bf605b2..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/ModuleNavigationMenu.php +++ /dev/null @@ -1,288 +0,0 @@ -generateBE('NAVIGATION MENU'); - - $arrStop = $this->getStop(); - $intHard = $this->getHard(); - - $arrRootIDs = $this->calculateRootIDs($arrStop); - $this->compileNavigationTree($arrRootIDs, $arrStop, $intHard); - $this->executeTreeHook(); - $arrRootIDs = $this->executeMenuHook($arrRootIDs); - $arrFirstIDs = $this->getFirstNavigationLevel($arrRootIDs); - - if($this->backboneit_navigation_hideSingleLevel) { - foreach($arrFirstIDs as $id) { - if($this->arrSubitems[$id]) { - $hasMultipleLevels = true; - break; - } - } - if(!$hasMultipleLevels) { - return ''; - } - } - - $arrStop[0] == 0 && array_shift($arrStop); // special case renderNavigationTree cannot handle - $this->strNavigation = trim($this->renderNavigationTree($arrFirstIDs, $this->strFirstLevelTemplate, $arrStop, $intHard)); - - return $this->strNavigation ? parent::generate() : ''; - } - - public function getStop() { - if(!$this->backboneit_navigation_defineStop) { - return array(PHP_INT_MAX); - } - $intMin = -1; - foreach(array_map('intval', explode(',', $this->backboneit_navigation_stop)) as $intLevel) if($intLevel > $intMin) { - $arrStop[] = $intMin = $intLevel; - } - return $arrStop ? $arrStop : array(PHP_INT_MAX); - } - - public function getHard() { - return $this->backboneit_navigation_defineHard ? $this->backboneit_navigation_hard : PHP_INT_MAX; - } - - protected function compile() { - $this->Template->request = $this->getIndexFreeRequest(true); - $this->Template->skipId = 'skipNavigation' . $this->id; - $this->Template->items = $this->strNavigation; - $this->backboneit_navigation_addLegacyCss && $this->Template->legacyClass = ' mod_navigation'; - } - - protected function calculateRootIDs($arrStop = PHP_INT_MAX) { - $arrRootIDs = $this->backboneit_navigation_defineRoots - ? $this->getRootIds() - : array($GLOBALS['objPage']->rootId); - - $this->backboneit_navigation_currentAsRoot && array_unshift($arrRootIDs, $GLOBALS['objPage']->id); - - $arrConditions = array($this->getQueryPartHidden(!$this->backboneit_navigation_respectHidden, $this->backboneit_navigation_isSitemap)); - $this->backboneit_navigation_respectGuests && $arrConditions[] = $this->getQueryPartGuests(); - $this->backboneit_navigation_respectPublish && $arrConditions[] = $this->getQueryPartPublish(); - $strConditions = implode(' AND ', array_filter($arrConditions, 'strlen')); - - if($this->backboneit_navigation_includeStart) { - $arrStartConditions = array( - $this->getQueryPartHidden($this->backboneit_navigation_showHiddenStart, $this->backboneit_navigation_isSitemap), - $this->getQueryPartPublish(), - $this->getQueryPartErrorPages($this->backboneit_navigation_showErrorPages), - ); - !$this->backboneit_navigation_showGuests && $arrStartConditions[] = $this->getQueryPartGuests(); - $strStartConditions = implode(' AND ', array_filter($arrStartConditions, 'strlen')); - } else { - $strStartConditions = $strConditions; - } - - if($this->backboneit_navigation_start > 0) { - $arrRootIDs = $this->filterPages($arrRootIDs, $strConditions); - for($i = 1, $n = $this->backboneit_navigation_start; $i < $n; $i++) - $arrRootIDs = $this->getNextLevel($arrRootIDs, $strConditions); - $arrRootIDs = $this->getNextLevel($arrRootIDs, $strStartConditions); - - } elseif($this->backboneit_navigation_start < 0) { - for($i = 0, $n = -$this->backboneit_navigation_start; $i < $n; $i++) - $arrRootIDs = $this->getPrevLevel($arrRootIDs); - $arrRootIDs = $this->filterPages($arrRootIDs, $strStartConditions); - - } else { - $arrRootIDs = $this->filterPages($arrRootIDs, $strStartConditions); - } - - $arrStop = (array) $arrStop; - if($arrStop[0] == 0) { // special case, keep only roots within the current path - $arrPath = array_keys($this->arrTrail); - $arrPath[] = $this->varActiveID; - $arrRootIDs = array_intersect($arrRootIDs, $arrPath); - } - - return $arrRootIDs; - } - - public function compileNavigationTree(array $arrRootIDs, $arrStop = PHP_INT_MAX, $intHard = PHP_INT_MAX) { - if(!$arrRootIDs) - return; - - $arrRootIDs = array_keys(array_flip($arrRootIDs)); - $arrStop = (array) $arrStop; - - foreach($arrRootIDs as $intRootID) { - $this->arrItems[$intRootID] = (array) $this->arrItems[$intRootID]; - } - - if($this->backboneit_navigation_includeStart) { - $arrFetched = $this->fetchItems($arrRootIDs, $arrStop, $intHard, 2); - - $objRoots = $this->objStmt->query( - 'SELECT ' . $this->getQuotedFieldsPart($this->arrFields) . ' - FROM tl_page - WHERE id IN (' . implode(',', $arrRootIDs) . ')' - ); - - while($objRoots->next()) { - $this->arrItems[$objRoots->id] = $objRoots->row(); - $arrFetched[$objRoots->id] = true; - } - - } else { - $arrFetched = $this->fetchItems($arrRootIDs, $arrStop, $intHard); - } - - $blnForwardResolution = !$this->backboneit_navigation_noForwardResolution; - foreach($arrFetched as $intID => $_) { - $this->arrItems[$intID] = $this->compileNavigationItem($this->arrItems[$intID], $blnForwardResolution, self::HOOK_ENABLE); - } - } - - /** - * Fetches page data for all navigation items below the given roots. - * - * @param integer $arrPIDs The root pages of the navigation. - * @param integer $intStop (optional, defaults to PHP_INT_MAX) The soft limit of depth. - * @param integer $intHard (optional, defaults to PHP_INT_MAX) The hard limit of depth. - * @param integer $intLevel (optional, defaults to 1) The level of the PIDs. - * @return null - */ - protected function fetchItems(array $arrPIDs, $arrStop = PHP_INT_MAX, $intHard = PHP_INT_MAX, $intLevel = 1) { - $intLevel = max(1, $intLevel); - $arrStop = (array) $arrStop; - - // nothing todo - // $intLevel == $intHard + 1 requires subitem detection for css class "submenu" calculation - if(!$arrPIDs || $intLevel - 1 > $intHard) - return; - - $arrConditions = array( - $this->getQueryPartHidden($this->backboneit_navigation_showHidden, $this->backboneit_navigation_isSitemap), - $this->getQueryPartPublish(), - $this->getQueryPartErrorPages($this->backboneit_navigation_showErrorPages), - ); - !$this->backboneit_navigation_showGuests && $arrConditions[] = $this->getQueryPartGuests(); - $strConditions = implode(' AND ', array_filter($arrConditions, 'strlen')); - $strConditions && $strConditions = 'AND (' . $strConditions . ')'; - - $strLevelQueryStart = - 'SELECT ' . $this->getQuotedFieldsPart($this->arrFields) . ' - FROM tl_page - WHERE pid IN ('; - $strLevelQueryEnd = ') - AND type != \'root\' - ' . $strConditions . ' - ORDER BY sorting'; - - $arrFetched = array(); - - while($arrPIDs) { - // if $arrEndPIDs == $arrPIDs the next $arrPIDs will be empty -> leave loop - if($intLevel > $intHard) { - $arrEndPIDs = $arrPIDs; - - } elseif($intLevel > $arrStop[0]) { - count($arrStop) > 1 && array_shift($arrStop); - $arrEndPIDs = array(); - foreach($arrPIDs as $intPID) if(!isset($this->arrTrail[$intPID])) { - $arrEndPIDs[$intPID] = true; - } - - } else { - $arrEndPIDs = array(); - } - - $objSubpages = $this->objStmt->query($strLevelQueryStart . implode(',', $arrPIDs) . $strLevelQueryEnd); - - if(!$objSubpages->numRows) - break; - - $arrPIDs = array(); - while($arrPage = $objSubpages->fetchAssoc()) { - if(isset($this->arrItems[$arrPage['id']])) - continue; - - if(!$this->isPermissionGranted($arrPage)) - continue; - - if(!isset($arrEndPIDs[$arrPage['pid']])) { - $this->arrSubitems[$arrPage['pid']][] = $arrPage['id']; // for order of items - $this->arrItems[$arrPage['id']] = $arrPage; // item datasets - $arrPIDs[] = $arrPage['id']; // ids of current layer (for next layer pids) - $arrFetched[$arrPage['id']] = true; // fetched in this method - - } elseif(!isset($this->arrSubitems[$arrPage['pid']])) { - $this->arrSubitems[$arrPage['pid']] = array(); - } - } - - $intLevel++; - } - - return $arrFetched; - } - - /** - * Executes the navigation hook. - * The callback receives the following parameters: - * $this - This navigation module instance - * $arrRootIDs - The IDs of the first navigation level - * - * And should return a new root array or null - * - * @param array $arrRootIDs The root pages before hook execution - * @return array $arrRootIDs The root pages after hook execution - */ - protected function executeMenuHook(array $arrRootIDs, $blnForce = false) { - if(!$blnForce && $this->backboneit_navigation_disableHooks) - return $arrRootIDs; - if(!is_array($GLOBALS['TL_HOOKS']['backboneit_navigation_menu'])) - return $arrRootIDs; - - foreach($GLOBALS['TL_HOOKS']['backboneit_navigation_menu'] as $arrCallback) { - $this->import($arrCallback[0]); - $arrNewRoots = $this->{$arrCallback[0]}->{$arrCallback[1]}($this, $arrRootIDs); - - if($arrNewRoots !== null) - $arrRootIDs = $arrNewRoots; - } - - return $arrRootIDs; - } - - protected function getFirstNavigationLevel(array $arrRootIDs) { - if($this->backboneit_navigation_includeStart) - return $arrRootIDs; - - // if we do not want to show the root level - $arrFirstIDs = array(); - foreach($arrRootIDs as $varRootID) - if(isset($this->arrSubitems[$varRootID])) - $arrFirstIDs = array_merge($arrFirstIDs, $this->arrSubitems[$varRootID]); - - return $arrFirstIDs; - } - - protected function getRootIds() - { - return array_map( - 'intval', - array_values( - array_unique( - array_merge( - \Contao\StringUtil::deserialize($this->backboneit_navigation_roots_order, true), - \Contao\StringUtil::deserialize($this->backboneit_navigation_roots, true) - ) - ) - ) - ); - } - -} diff --git a/TL_ROOT/system/modules/backboneit_navigation/NavigationDCA.php b/TL_ROOT/system/modules/backboneit_navigation/NavigationDCA.php deleted file mode 100644 index 108d26d..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/NavigationDCA.php +++ /dev/null @@ -1,39 +0,0 @@ -loadLanguageFile('tl_page'); - $this->loadDataContainer('tl_page'); - - $arrFields = array(); - - foreach($GLOBALS['TL_DCA']['tl_page']['fields'] as $strField => $arrConfig) - if(!isset(AbstractModuleNavigation::$arrDefaultFields[$strField])) - $arrFields[$strField] = &$arrConfig['label'][0]; - - return $arrFields; - } - - public function saveStop($varValue) { - $intMin = -1; - foreach(array_map('intval', explode(',', strval($varValue))) as $intLevel) if($intLevel > $intMin) { - $arrStop[] = $intMin = $intLevel; - } - return implode(',', $arrStop); - } - - protected function __construct() { - parent::__construct(); - } - - private static $objInstance; - - public static function getInstance() { - if(!isset(self::$objInstance)) - self::$objInstance = new self(); - - return self::$objInstance; - } - -} diff --git a/TL_ROOT/system/modules/backboneit_navigation/config/.htaccess b/TL_ROOT/system/modules/backboneit_navigation/config/.htaccess deleted file mode 100644 index f239fe8..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/config/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -order deny,allow -deny from all \ No newline at end of file diff --git a/TL_ROOT/system/modules/backboneit_navigation/config/autoload.ini b/TL_ROOT/system/modules/backboneit_navigation/config/autoload.ini deleted file mode 100644 index cc8452d..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/config/autoload.ini +++ /dev/null @@ -1,19 +0,0 @@ -;; -; List modules which are required to be loaded beforehand -;; -requires[] = "core" - -;; -; Configure what you want the autoload creator to register -;; -register_namespaces = true -register_classes = true -register_templates = true - -;; -; Override the default configuration for certain sub directories -;; -[vendor/*] -register_namespaces = false -register_classes = false -register_templates = false diff --git a/TL_ROOT/system/modules/backboneit_navigation/config/autoload.php b/TL_ROOT/system/modules/backboneit_navigation/config/autoload.php deleted file mode 100644 index b9e0fe5..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/config/autoload.php +++ /dev/null @@ -1,22 +0,0 @@ - 'system/modules/backboneit_navigation/AbstractModuleNavigation.php', - 'ModuleNavigationChainPreorder' => 'system/modules/backboneit_navigation/ModuleNavigationChainPreorder.php', - 'ModuleNavigationMenu' => 'system/modules/backboneit_navigation/ModuleNavigationMenu.php', - 'NavigationDCA' => 'system/modules/backboneit_navigation/NavigationDCA.php', -)); - - -/** - * Register the templates - */ -TemplateLoader::addFiles(array -( - 'mod_backboneit_navigation_menu' => 'system/modules/backboneit_navigation/templates', - 'nav_bbit' => 'system/modules/backboneit_navigation/templates', -)); diff --git a/TL_ROOT/system/modules/backboneit_navigation/config/config.php b/TL_ROOT/system/modules/backboneit_navigation/config/config.php deleted file mode 100644 index 4487e4b..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/config/config.php +++ /dev/null @@ -1,4 +0,0 @@ - &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_roots'], - 'exclude' => true, - 'inputType' => 'pageTree', - 'eval' => array( - 'multiple' => true, - 'fieldType' => 'checkbox', - 'tl_class' => 'clr', - 'orderField' => 'backboneit_navigation_roots_order' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_roots_order'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_roots_order'], -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_start'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_start'], - 'exclude' => true, - 'inputType' => 'text', - 'eval' => array( - 'maxlength' => 5, - 'rgxp' => 'digit', - 'tl_class' => 'clr w50' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_respectHidden'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_respectHidden'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx m12' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_respectPublish'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_respectPublish'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'clr w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_respectGuests'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_respectGuests'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_includeStart'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_includeStart'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'submitOnChange'=> true, - 'tl_class' => 'clr w50 cbx', - ), -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_showHiddenStart'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_showHiddenStart'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx', - ), -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_showHidden'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_showHidden'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'clr w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_showProtected'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_showProtected'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_showGuests'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_showGuests'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'clr w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_addFields'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_addFields'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'options_callback' => array('NavigationDCA', 'getPageFields'), - 'eval' => array( - 'multiple' => true, - 'tl_class' => 'clr' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_noForwardResolution'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_noForwardResolution'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'clr w50 cbx m12' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_showErrorPages'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_showErrorPages'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'clr w50 cbx m12' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_disableHooks'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_disableHooks'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx m12' - ) -); - - - -/***** NAVIGATION MENU ********************************************************/ - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_currentAsRoot'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_currentAsRoot'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_defineRoots'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_defineRoots'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'submitOnChange' => true, - 'tl_class' => 'w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_defineStop'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_defineStop'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'submitOnChange' => true, - 'tl_class' => 'clr w50 cbx m12' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_stop'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_stop'], - 'exclude' => true, - 'inputType' => 'text', - 'eval' => array( - 'maxlength' => 255, - 'tl_class' => 'w50' - ), - 'save_callback' => array( - array('NavigationDCA', 'saveStop'), - ), -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_defineHard'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_defineHard'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'submitOnChange' => true, - 'tl_class' => 'clr w50 cbx m12' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_hard'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_hard'], - 'exclude' => true, - 'inputType' => 'text', - 'eval' => array( - 'maxlength' => 5, - 'rgxp' => 'digit', - 'tl_class' => 'w50' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_isSitemap'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_isSitemap'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_hideSingleLevel'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_hideSingleLevel'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'clr w50 cbx' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_addLegacyCss'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_addLegacyCss'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'tl_class' => 'w50 cbx m12' - ) -); - - - -/***** NAVIGATION CHAIN *******************************************************/ - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_rootSelectionType'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_rootSelectionType'], - 'exclude' => true, - 'inputType' => 'select', - 'default' => 'current', - 'options' => array('subtrees', 'single', 'current'), - 'reference' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_rootSelectionType_options'], - 'eval' => array( - 'submitOnChange' => true, - 'tl_class' => 'clr w50' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_chainDirections'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_chainDirections'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'default' => array('forward', 'backward'), - 'options' => array('forward', /*'top', */'backward'), - 'reference' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_chainDirections_options'], - 'eval' => array( - 'multiple' => true, - 'tl_class' => 'clr w50' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_defineDepth'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_defineDepth'], - 'exclude' => true, - 'inputType' => 'checkbox', - 'eval' => array( - 'submitOnChange' => true, - 'tl_class' => 'clr w50 cbx m12' - ) -); - -$GLOBALS['TL_DCA']['tl_module']['fields']['backboneit_navigation_depth'] = array( - 'label' => &$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_depth'], - 'exclude' => true, - 'inputType' => 'text', - 'eval' => array( - 'maxlength' => 5, - 'rgxp' => 'digit', - 'tl_class' => 'w50' - ) -); diff --git a/TL_ROOT/system/modules/backboneit_navigation/languages/de/.htaccess b/TL_ROOT/system/modules/backboneit_navigation/languages/de/.htaccess deleted file mode 100644 index f239fe8..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/languages/de/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -order deny,allow -deny from all \ No newline at end of file diff --git a/TL_ROOT/system/modules/backboneit_navigation/languages/de/modules.php b/TL_ROOT/system/modules/backboneit_navigation/languages/de/modules.php deleted file mode 100644 index 5a4056e..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/languages/de/modules.php +++ /dev/null @@ -1,7 +0,0 @@ -verkettete Weiterleitungen, welche die aktuelle Seite als Weiterleitungsendziel besitzen nicht mehr als aktiv gekennzeichnet werden (kein "isActive" mehr im Template und keine "active" CSS-Klasse).'); -$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_showErrorPages'] - = array('Fehlerseiten anzeigen', 'Fehlerseiten vom Typ "403" und "404" werden in der Navigation angezeigt.'); -$GLOBALS['TL_LANG']['tl_module']['backboneit_navigation_disableHooks'] - = array('Hooks deaktivieren', 'Deaktiviert das Ausführen der Navigations-Hooks. Kann zu einer besseren Performance führen, wenn Hooks für diese Navigation nicht notwendig sind.'); diff --git a/TL_ROOT/system/modules/backboneit_navigation/templates/mod_backboneit_navigation_menu.html5 b/TL_ROOT/system/modules/backboneit_navigation/templates/mod_backboneit_navigation_menu.html5 deleted file mode 100644 index 10ed943..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/templates/mod_backboneit_navigation_menu.html5 +++ /dev/null @@ -1,13 +0,0 @@ - - - \ No newline at end of file diff --git a/TL_ROOT/system/modules/backboneit_navigation/templates/mod_backboneit_navigation_menu.xhtml b/TL_ROOT/system/modules/backboneit_navigation/templates/mod_backboneit_navigation_menu.xhtml deleted file mode 100644 index 5649e25..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/templates/mod_backboneit_navigation_menu.xhtml +++ /dev/null @@ -1,13 +0,0 @@ - -
cssID; ?>style): ?> style="style; ?>"> - -headline): ?> -<hl; ?>>headline; ?>hl; ?>> - - - -items; ?> - - -
- \ No newline at end of file diff --git a/TL_ROOT/system/modules/backboneit_navigation/templates/nav_bbit.xhtml b/TL_ROOT/system/modules/backboneit_navigation/templates/nav_bbit.xhtml deleted file mode 100644 index ff1edc5..0000000 --- a/TL_ROOT/system/modules/backboneit_navigation/templates/nav_bbit.xhtml +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/build.xml b/build.xml deleted file mode 100644 index 4d9be94..0000000 --- a/build.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/composer.json b/composer.json index 0f97ba5..126ec27 100644 --- a/composer.json +++ b/composer.json @@ -1,43 +1,76 @@ { - "name": "hofff/contao-navigation", - "description": "Advanced navigation module for Contao CMS", - "keywords": [ "navigation", "module", "page", "contao" ], - "type": "contao-module", - "license": "LGPL-3.0+", - "authors": [ - { - "name": "Oliver Hoff", - "email": "oliver@hofff.com", - "homepage": "https://www.hofff.com/", - "role": "Developer" - }, - { - "name": "Nicky Hoff", - "email": "nick@hofff.com", - "homepage": "https://www.hofff.com/", - "role": "Maintainer" - } - ], - "support": { - "issues": "https://github.com/hofff/contao-navigation/issues", - "source": "https://github.com/hofff/contao-navigation" - }, - "require": { - "php": "^5.3 || ^7.0", - "contao/core-bundle": "^3.2 || ^4.2", - "contao-community-alliance/composer-plugin": "^2.0 || ^3.0" - }, - "replace": { - "contao-legacy/backboneit_navigation": "self.version", - "backboneit/contao-navigation": "self.version" - }, - "extra": { - "contao": { - "sources": { - "TL_ROOT/system/modules/backboneit_navigation": "system/modules/backboneit_navigation" - } - }, - "branch-alias": { - } - } + "name": "hofff/contao-navigation", + "description": "Advanced navigation module for Contao CMS", + "license": "LGPL-3.0-or-later", + "type": "contao-bundle", + "keywords": [ + "navigation", + "module", + "page", + "contao" + ], + "authors": [ + { + "name": "Oliver Hoff", + "email": "oliver@hofff.com", + "homepage": "https://www.hofff.com/", + "role": "Developer" + }, + { + "name": "Nicky Hoff", + "email": "nick@hofff.com", + "homepage": "https://www.hofff.com/", + "role": "Maintainer" + }, + { + "name": "David Molineus", + "email": "david@hofff.com", + "homepage": "https://www.hofff.com/", + "role": "Maintainer" + } + ], + "support": { + "issues": "https://github.com/hofff/contao-navigation/issues", + "source": "https://github.com/hofff/contao-navigation" + }, + "require": { + "php": "^8.1", + "contao/core-bundle": "^4.13 || ^5.3", + "doctrine/dbal": "^3.8", + "symfony/config": "^5.4 || ^6.4", + "symfony/dependency-injection": "^5.4 || ^6.4", + "symfony/event-dispatcher-contracts": "^1.1 || ^2.0 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.4", + "symfony/http-kernel": "^5.4 || ^6.4", + "symfony/security-core": "^5.4 || ^6.4" + }, + "require-dev": { + "contao/manager-plugin": "^2.0", + "doctrine/coding-standard": "^12.0.", + "phpcq/runner-bootstrap": "1.x-dev" + }, + "replace": { + "backboneit/contao-navigation": "self.version", + "contao-legacy/backboneit_navigation": "self.version" + }, + "autoload": { + "psr-4": { + "Hofff\\Contao\\Navigation\\": "src/" + } + }, + "config": { + "allow-plugins": { + "contao-components/installer": false, + "contao/manager-plugin": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "php-http/discovery": true + } + }, + "extra": { + "branch-alias": { + "dev-develop": "2.1.x-dev", + "dev-master": "2.0.x-dev" + }, + "contao-manager-plugin": "Hofff\\Contao\\Navigation\\ContaoManager\\Plugin" + } } diff --git a/ext/yui-compressor/yui.xml b/ext/yui-compressor/yui.xml deleted file mode 100644 index 71a253c..0000000 --- a/ext/yui-compressor/yui.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - Deleting source file. - - - - - Minify JS ${minjs.file}... - - - - - - - - - - - - - - - - - - - - - - - Done. - - - - Deleting source file. - - - - - Minify CSS ${mincss.file}... - - - - - - - - - - - - - - - - - - - - - - - - Done. - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ext/yui-compressor/yuicompressor-2.4.2.jar b/ext/yui-compressor/yuicompressor-2.4.2.jar deleted file mode 100644 index c29470b..0000000 Binary files a/ext/yui-compressor/yuicompressor-2.4.2.jar and /dev/null differ diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 0000000..8acdf1f --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,32 @@ + + + + + + + + + + vendor/autoload.php + + + + + + src + + + + + + + + + + + + + + languages/* + + diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..982c87b --- /dev/null +++ b/psalm.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/publish/changelog.txt b/publish/changelog.txt deleted file mode 100644 index c4cd068..0000000 --- a/publish/changelog.txt +++ /dev/null @@ -1,68 +0,0 @@ -h1. Changelog - -h2. 1.5.1 stable - -* 1 *Feature*: Add option to display error pages within the navigation - -h2. 1.5.0 stable - -* 1 Always create subitem arrays for root ids, for easier hook integration - -h2. 1.5.0 rc1 - -* 1 Add Contao 3 support - -h2. 1.4.0 stable - -* 1 *Feature*: Allow multiple stop levels - -h2. 1.3.0 stable - -* 1 *Feature*: Possibility to overwrite navigation template for a single level in its parent item -* 1 *Feature*: Added a compile navigation item hook "bbit_navi_item" -* 1 *Change*: Always add page type token to css classes -* 1 *Fix*: Conditions where not applied when including start level - -h2. 1.2.1 stable - -* 1 *Fix*: Fixed "target" DB value getting raw into the template -* 1 *Fix*: Fixed some variable name confusions - -h2. 1.2.0 beta1 - -* 1 *Feature*: Added a generic tree hook "backboneit_navigation_tree" to AbstractModuleNavigation, which allows to modify the navigation tree for tree-based navigation. -* 1 *Change*: The "backboneit_navigation_menu" hook should only be used to modify the root pages of the navigation menu module and overwrite different settings. Though tree modifications are still supported, it is recommended to use the new "backboneit_navigation_tree" hook. -* 1 *Change*: Lot of performance optimizations -* 1 *Fix*: Subsequent identical parent pages are canonicalized, if start level is negative -* 1 *Fix*: Removed many brainlag bugs - -h2. 1.1.0 stable - -*Note: If you update from a previous version, please check the module settings for stop and hard limit!* - -* 3 *Fix*: It is actually called "leaf", not "leave" -* 1 *Feature*: New CSS classes "forward", "redirect", "root", "inner" (all nodes with a *rendered* submenu) and "leave" (all nodes without a *rendered* submenu) -* 1 *Feature*: Option to disable forward resolution, for greater performance -* 1 *Feature*: Option to add "mod_navigation" CSS class to the modules div container -* 1 *Change*: Improved hook handling a lot -* 1 *Change*: The property "arrSubpages" is deprecated, use property "arrSubitems" now -* 1 *Fix*: CSS class "submenu" behaves now exactly like the core navigation menu uses it -* 1 *Fix*: Alot of fixes for many configurations - -h2. 1.0.0 stable - -* 5 *Feature*: CSS classes are now calculated while rendering the templates, so navigation items hooked in receive the correct css -* 5 *Change*: The amount of levels displayed is now additionally checked while rendering the templates, to apply the limits on navigation items hooked in -* 5 *Change*: Moved the hook before the calculation of the first navigation level (clearer usage, but $arrRoots are now the reference "pages" and not the first navigation level) -* 5 *Fix*: Fixed "sibling" CSS class -* 5 *Fix*: Fixed a bug which caused an additional navigation level to be rendered, when root level is displayed a soft stop limit is set -* 4 *Change*: Changed the hidden condition flag for including start level from showHidden to respectHidden, which results in a more consistent behavior -* 4 *Fix*: Fixed an error message in backend, when module is rendered in articles for preview -* 4 Tagged as stable - -h2. 1.0.0 rc1 - -* 3 *Feature*: Added a hook before rendering the navigation -* 3 *Change*: Some refactoring from protected to public to make the hook more useful -* 3 *Change*: Some clean-up -* 2 Initial release diff --git a/publish/license_php.txt b/publish/license_php.txt deleted file mode 100644 index 38fb549..0000000 --- a/publish/license_php.txt +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * backboneit_navigation - * Various navigation modules for Contao CMS - * - * PHP version 5 - * @copyright backboneIT | Oliver Hoff 2011-2012 - * @author Oliver Hoff - * @license http://opensource.org/licenses/lgpl-3.0.html - */ diff --git a/publish/releasenotes_de.txt b/publish/releasenotes_de.txt deleted file mode 100644 index d496a37..0000000 --- a/publish/releasenotes_de.txt +++ /dev/null @@ -1,55 +0,0 @@ -=== Titel -Navigationselemente - - -=== Suchbegriffe -navigation,seitenstruktur,seiten,menü, - - -=== Teaser -Verschiedene Navigationselemente (vorerst "nur" ein Navigationsmenü mit vielen neuen Möglichkeiten) - - -=== Beschreibung -

Anmerkungen zum Bestimmen der Sichtbarkeit einer Seite:

- - -

Navigationsmenü:

-

Ein Multitalent: Es ist alles möglich was mit einem Navigationsmenü oder -einer Individuellen Navigation möglich ist, Kombinationen aus beiden und -noch einiges mehr. Einfach ausprobieren.

-

Funktionen:

- - - -=== Freigabe-Notizen und Änderungs-Log -

siehe Handbuch-Link

-

Wenn Sie von einer älteren Version auf die Version 1.1.0 oder höher updaten, -überprüfen Sie bitte die Einstellungen für "Angezeigte Ebenen" und "Maximal angezeigte Ebenen".

- - -=== Handbuch-Link -http://contao-forge.org/projects/backboneitnavigation/wiki diff --git a/src/ContaoManager/Plugin.php b/src/ContaoManager/Plugin.php new file mode 100644 index 0000000..cb366dc --- /dev/null +++ b/src/ContaoManager/Plugin.php @@ -0,0 +1,24 @@ +setLoadAfter([ContaoCoreBundle::class]) + ->setReplace(['backboneit_navigation']), + ]; + } +} diff --git a/src/DependencyInjection/HofffContaoNavigationExtension.php b/src/DependencyInjection/HofffContaoNavigationExtension.php new file mode 100644 index 0000000..a6c7f18 --- /dev/null +++ b/src/DependencyInjection/HofffContaoNavigationExtension.php @@ -0,0 +1,20 @@ +load('services.xml'); + } +} diff --git a/src/Event/Event.php b/src/Event/Event.php new file mode 100644 index 0000000..790a18d --- /dev/null +++ b/src/Event/Event.php @@ -0,0 +1,20 @@ +moduleModel; + } +} diff --git a/src/Event/ItemEvent.php b/src/Event/ItemEvent.php new file mode 100644 index 0000000..47b4d25 --- /dev/null +++ b/src/Event/ItemEvent.php @@ -0,0 +1,28 @@ + $item */ + public function __construct(ModuleModel $moduleModel, private array $item) + { + parent::__construct($moduleModel); + } + + /** @param array $item */ + public function changeItem(array $item): void + { + $this->item = $item; + } + + /** @return array */ + public function item(): array + { + return $this->item; + } +} diff --git a/src/Event/MenuEvent.php b/src/Event/MenuEvent.php new file mode 100644 index 0000000..2f063e2 --- /dev/null +++ b/src/Event/MenuEvent.php @@ -0,0 +1,28 @@ + $rootIds */ + public function __construct(ModuleModel $moduleModel, private array $rootIds) + { + parent::__construct($moduleModel); + } + + /** @param list $rootIds */ + public function changeRootIds(array $rootIds): void + { + $this->rootIds = $rootIds; + } + + /** @return list */ + public function rootIds(): array + { + return $this->rootIds; + } +} diff --git a/src/Event/TreeEvent.php b/src/Event/TreeEvent.php new file mode 100644 index 0000000..7af856c --- /dev/null +++ b/src/Event/TreeEvent.php @@ -0,0 +1,21 @@ +items; + } +} diff --git a/src/EventListener/Dca/NavigationDcaListener.php b/src/EventListener/Dca/NavigationDcaListener.php new file mode 100644 index 0000000..226e3fc --- /dev/null +++ b/src/EventListener/Dca/NavigationDcaListener.php @@ -0,0 +1,65 @@ + + * + * @SuppressWarnings(PHPMD.Superglobals) + */ + #[AsCallback('tl_module', 'fields.hofff_navigation_addFields.options')] + public function getPageFields(): array + { + $controller = $this->framework->getAdapter(Controller::class); + $controller->loadLanguageFile('tl_page'); + $controller->loadDataContainer('tl_page'); + + $fields = []; + + foreach ($GLOBALS['TL_DCA']['tl_page']['fields'] as $fieldName => &$config) { + if (isset(PageQueryBuilder::DEFAULT_FIELDS[$fieldName])) { + continue; + } + + $fields[$fieldName] = sprintf('%s [%s]', $config['label'][0], $fieldName); + } + + return $fields; + } + + #[AsCallback('tl_module', 'fields.hofff_navigation_stop.save')] + public function saveStop(string $value): string + { + $minimum = -1; + $stop = []; + + foreach (array_map('intval', explode(',', $value)) as $level) { + if ($level <= $minimum) { + continue; + } + + $stop[] = $minimum = $level; + } + + return implode(',', $stop); + } +} diff --git a/src/FrontendModule/ModuleNavigationMenu.php b/src/FrontendModule/ModuleNavigationMenu.php new file mode 100644 index 0000000..4f5bbdd --- /dev/null +++ b/src/FrontendModule/ModuleNavigationMenu.php @@ -0,0 +1,127 @@ + the ID of the current item (optional) + * isInTrail => whether this item is in the trail path + * class => CSS classes + * title => page name with Insert-Tags stripped and XML specialchars replaced by their entities + * pageTitle => page title with Insert-Tags stripped and XML specialchars replaced by their entities + * link => page name (with Insert-Tags and XML specialchars NOT replaced; as stored in the db) + * href => URL of target page + * nofollow => true, if nofollow should be set on rel attribute + * target => either ' onclick="window.open(this.href); return false;"' or empty string + * description => page description with line breaks (\r and \n) replaced by whitespaces + * + * Calculated while rendering: + * subitems => subnavigation as HTML string or empty string (rendered if subpages & items setup correctly) + * isActive => whether this item is the current active navigation item + * + * Following CSS classes are calculated while rendering: level_x, trail, sibling, submenu, first, last + * + * Additionally, all page dataset values from the database are available unter their field name, + * if the field name does not collide with the listed keys. + * + * For the collisions of the Contao core page dataset fields the following keys are available: + * _type + * _title + * _pageTitle + * _target + * _description + * + * @psalm-suppress PropertyNotSetInConstructor + */ +#[AsFrontendModule('hofff_navigation_menu', 'navigation', template: 'mod_hofff_navigation_menu')] +final class ModuleNavigationMenu extends AbstractFrontendModuleController +{ + public function __construct(private readonly PageItemsLoader $loader, private readonly NavigationRenderer $renderer) + { + } + + /** + * @SuppressWarnings(PHPMD.Superglobals) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + protected function getResponse(Template $template, ModuleModel $model, Request $request): Response + { + $stopLevels = $this->getStopLevels($model); + $hardLevel = $this->getHardLevel($model); + + /** @psalm-suppress RiskyTruthyFalsyComparison */ + $activeId = $model->hofff_navigation_isSitemap || $request->query->has('articles') + ? null + : (int) $GLOBALS['objPage']->id; + + $items = $this->loader->load($model, $GLOBALS['objPage'], $stopLevels, $hardLevel, $activeId); + + $navigation = $this->renderer->render( + $model, + $items, + array_keys($items->roots), + $stopLevels, + $hardLevel, + $activeId, + ); + + if ($navigation === '') { + return new Response(); + } + + $template->items = $navigation; + $template->request = Environment::get('indexFreeRequest'); + $template->skipId = 'skipNavigation' . $model->id; + $template->items = $navigation; + $template->legacyClass = $model->hofff_navigation_addLegacyCss ? ' mod_navigation' : ''; + + return $template->getResponse(); + } + + /** @return list */ + public function getStopLevels(ModuleModel $model): array + { + if (! $model->hofff_navigation_defineStop) { + return [PHP_INT_MAX]; + } + + $minLevel = -1; + $stopLevel = []; + + foreach (array_map('intval', explode(',', $model->hofff_navigation_stop)) as $level) { + if ($level <= $minLevel) { + continue; + } + + $stopLevel[] = $minLevel = $level; + } + + return $stopLevel ?: [PHP_INT_MAX]; + } + + public function getHardLevel(ModuleModel $model): int + { + return $model->hofff_navigation_defineHard ? (int) $model->hofff_navigation_hard : PHP_INT_MAX; + } +} diff --git a/src/HofffContaoNavigationBundle.php b/src/HofffContaoNavigationBundle.php new file mode 100644 index 0000000..f68f77a --- /dev/null +++ b/src/HofffContaoNavigationBundle.php @@ -0,0 +1,11 @@ + */ + public array $roots = []; + + /** @var array> */ + public array $items = []; + + /** @var array> */ + public array $subItems = []; + + /** + * Page trail as flipped array + * + * @var array + */ + private array $trail = []; + + public function __construct(PageModel $currentPage) + { + $this->currentPage = $currentPage; + $this->trail = array_flip(array_map('intval', $currentPage->trail)); + } + + public function isInTrail(int $pageId): bool + { + return array_key_exists($pageId, $this->trail); + } + + /** + * @param list $rootIds + * + * @return list + */ + public function getFirstNavigationLevel(array $rootIds): array + { + // if we do not want to show the root level + $firstIds = []; + foreach ($rootIds as $rootId) { + if (! isset($this->subItems[$rootId])) { + continue; + } + + $firstIds[] = $this->subItems[$rootId]; + } + + return array_merge(...$firstIds); + } +} diff --git a/src/Items/PageItemsLoader.php b/src/Items/PageItemsLoader.php new file mode 100644 index 0000000..e74b38b --- /dev/null +++ b/src/Items/PageItemsLoader.php @@ -0,0 +1,399 @@ + */ + private array $stopLevels = [PHP_INT_MAX]; + + private int $hardLevel = PHP_INT_MAX; + + private int|null $activeId = null; + + public function __construct( + private readonly Connection $connection, + private readonly Security $security, + private readonly PagePermissionGuard $guard, + ) { + } + + /** @param list $stopLevels */ + public function load( + ModuleModel $moduleModel, + PageModel $currentPage, + array $stopLevels = [PHP_INT_MAX], + int $hardLevel = PHP_INT_MAX, + int|null $activeId = null, + ): PageItems { + $this->items = new PageItems($currentPage); + $this->pageQueryBuilder = new PageQueryBuilder($this->connection, $this->security, $moduleModel); + $this->moduleModel = $moduleModel; + $this->stopLevels = $stopLevels; + $this->hardLevel = $hardLevel; + $this->activeId = $activeId; + + $this->items->roots = array_fill_keys($this->calculateRootIDs(), true); + if (! $this->items->roots) { + return $this->items; + } + + $rootIds = array_keys($this->items->roots); + + if (! $moduleModel->hofff_navigation_includeStart) { + $this->fetchItems($rootIds); + + return $this->items; + } + + $this->fetchItems($rootIds, 2); + + /** @psalm-var Result $result */ + $result = $this->pageQueryBuilder->createRootInformationQuery($rootIds)->executeQuery(); + while ($row = $result->fetchAssociative()) { + $this->items->items[$row['id']] = $row; + $this->items->roots[$row['id']] = true; + } + + return $this->items; + } + + /** + * Fetches page data for all navigation items below the given roots. + * + * @param list $parentIds + * @param int $level (optional, defaults to 1) The level of the PIDs. + * + * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + */ + protected function fetchItems(array $parentIds, int $level = 1): array + { + $level = max(1, $level); + + // nothing todo + // $level == $hardStop + 1 requires subitem detection for css class "submenu" calculation + if (! $parentIds || $level - 1 > $this->hardLevel) { + return []; + } + + $fetched = []; + $stopLevels = $this->stopLevels; + + while ($parentIds) { + // if $endParentIds == $parentIds the next $parentIds will be empty -> leave loop + if ($level > $this->hardLevel) { + $endParentIds = $parentIds; + } elseif ($level > $stopLevels[0]) { + count($stopLevels) > 1 && array_shift($stopLevels); + $endParentIds = []; + foreach ($parentIds as $parentId) { + if ($this->items->isInTrail((int) $parentId)) { + continue; + } + + $endParentIds[$parentId] = true; + } + } else { + $endParentIds = []; + } + + $result = $this->pageQueryBuilder->createFetchItemsQuery($parentIds)->executeQuery(); + if ($result->rowCount() === 0) { + break; + } + + $parentIds = []; + while ($page = $result->fetchAssociative()) { + if (isset($this->items->items[$page['id']])) { + continue; + } + + if (! $this->guard->isPermissionGranted($this->moduleModel, $page)) { + continue; + } + + if (! isset($endParentIds[$page['pid']])) { + if (! in_array((int) $page['id'], $this->items->subItems[(int) $page['pid']] ?? [])) { + $this->items->subItems[(int) $page['pid']][] = (int) $page['id']; // for order of items + } + + $this->items->items[(int) $page['id']] = $page; // item datasets + $parentIds[] = $page['id']; // ids of current layer (for next layer pids) + $fetched[$page['id']] = true; // fetched in this method + } elseif (! isset($this->items->subItems[(int) $page['pid']])) { + $this->items->subItems[(int) $page['pid']] = []; + } + } + + $level++; + } + + return $fetched; + } + + /** @return list */ + private function calculateRootIDs(): array + { + $rootIds = $this->getRootIds(); + if ($this->moduleModel->hofff_navigation_currentAsRoot) { + /** @psalm-suppress RedundantCastGivenDocblockType */ + array_unshift($rootIds, (int) $this->items->currentPage->id); + } + + if ($this->moduleModel->hofff_navigation_start > 0) { + $rootIds = $this->filterPages($rootIds, $this->pageQueryBuilder->createRootIdsQuery()); + for ($i = 1, $n = $this->moduleModel->hofff_navigation_start; $i < $n; $i++) { + $rootIds = $this->getNextLevel($rootIds, $this->pageQueryBuilder->createRootIdsQuery()); + } + + $rootIds = $this->getNextLevel($rootIds, $this->pageQueryBuilder->createStartRootIdsQuery()); + } elseif ($this->moduleModel->hofff_navigation_start < 0) { + for ($i = 0, $n = -$this->moduleModel->hofff_navigation_start; $i < $n; $i++) { + $rootIds = $this->getPrevLevel($rootIds); + } + + $rootIds = $this->filterPages($rootIds, $this->pageQueryBuilder->createStartRootIdsQuery()); + } else { + $rootIds = $this->filterPages($rootIds, $this->pageQueryBuilder->createStartRootIdsQuery()); + } + + $stopLevels = $this->stopLevels; + if ($stopLevels[0] === 0) { // special case, keep only roots within the current path + $path = array_map('intval', $this->items->currentPage->trail); + $path[] = $this->activeId; + $rootIds = array_values(array_intersect($rootIds, $path)); + } + + return $rootIds; + } + + /** @return list */ + private function getRootIds(): array + { + if (! $this->moduleModel->hofff_navigation_defineRoots) { + /** @psalm-suppress RedundantCastGivenDocblockType */ + return [(int) $this->items->currentPage->rootId]; + } + + return array_map( + 'intval', + array_values( + array_unique( + array_merge( + StringUtil::deserialize($this->moduleModel->hofff_navigation_roots_order, true), + StringUtil::deserialize($this->moduleModel->hofff_navigation_roots, true), + ), + ), + ), + ); + } + + /** + * Filters the given array of page IDs in regard of publish state, + * required permissions (protected and guests only) and hidden state, according to + * this navigations settings. + * Maintains relative order of the input array. + * + * For performance reason $pageIds is NOT "intval"ed. Make sure $pageIds + * contains no hazardous code. + * + * @param list $pageIds An array of page IDs to filter + * + * @return list Filtered array of page IDs + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + private function filterPages(array $pageIds, QueryBuilder $queryBuilder): array + { + if (! $pageIds) { + return $pageIds; + } + + $queryBuilder + ->andWhere('id IN (:ids)') + ->setParameter('ids', $pageIds, ArrayParameterType::STRING); + $result = $queryBuilder->executeQuery(); + + if (! $this->guard->isPermissionCheckRequired($this->moduleModel)) { + return array_values( + array_intersect( + $pageIds, + array_map(static fn (array $row): int => (int) $row['id'], $result->fetchAllAssociative()), + ), + ); + } // restore order + + $parentIds = []; + $valid = []; + while ($page = $result->fetchAssociative()) { + if ($this->guard->isPermissionDenied($page)) { + continue; + } + + $valid[] = $page['id']; + /* + * do not remove the protected check! permission denied checks for + * more, but we need to know, if we must recurse to parent pages, + * for permission check, which must not be done, when this page + * defines access rights. + */ + if ($page['protected'] || $page['pid'] === 0) { + continue; + } + + $parentIds[$page['pid']][] = $page['id']; + } + + // exclude pages which are in a protected path + while (count($parentIds)) { + $currentIds = $parentIds; + $parentIds = []; + + $query = $this->pageQueryBuilder->createPageInformationQuery(array_keys($currentIds)); + $result = $query->executeQuery(); + + while ($page = $result->fetchAssociative()) { + if (! $page['protected']) { // do not remove, see above + if ($page['pid'] !== 0) { + $parentIds[$page['pid']] = isset($parentIds[$page['pid']]) + ? array_merge($parentIds[$page['pid']], $currentIds[$page['id']]) + : $currentIds[$page['id']]; + } + } elseif ($this->guard->isPermissionDenied($page)) { + $valid = array_diff($valid, $currentIds[$page['id']]); + } + } + } + + return array_values(array_intersect($pageIds, $valid)); + } + + /** + * Retrieves the subpages of the given array of page IDs in respect of the + * given conditions, which are added to the WHERE clause of the query. + * Maintains relative order of the input array. + * + * For performance reason $pageIds is NOT "intval"ed. Make sure $pageIds + * contains no hazardous code. + * + * @param list $pageIds An array of parent IDs + * + * @return list The child IDs + */ + public function getNextLevel(array $pageIds, QueryBuilder $queryBuilder): array + { + if (! $pageIds) { + return $pageIds; + } + + $queryBuilder->setParameter('ids', array_keys(array_flip($pageIds)), ArrayParameterType::STRING); + $result = $queryBuilder->executeQuery(); + + $next = []; + if ($this->guard->isPermissionCheckRequired($this->moduleModel)) { + while ($page = $result->fetchAssociative()) { + if ($this->guard->isPermissionDenied($page)) { + continue; + } + + $next[(int) $page['pid']][] = (int) $page['id']; + } + } else { + while ($page = $result->fetchAssociative()) { + $next[(int) $page['pid']][] = (int) $page['id']; + } + } + + $nextLevel = []; + foreach ($pageIds as $pageId) { + if (! isset($next[$pageId])) { + continue; + } + + $nextLevel = array_merge($nextLevel, $next[$pageId]); + } + + return $nextLevel; + } + + /** + * Retrieves the parents of the given array of page IDs in respect of the + * given conditions, which are added to the WHERE clause of the query. + * Maintains relative order of the input array and merges subsequent parent + * IDs. + * + * For performance reason $pageIds is NOT "intval"ed. Make sure $pageIds + * contains no hazardous code. + * + * @param list $pageIds An array of child IDs + * + * @return list The parent IDs + */ + private function getPrevLevel(array $pageIds): array + { + if (! $pageIds) { + return $pageIds; + } + + $result = $this->pageQueryBuilder->createPreviousLevelQuery($pageIds)->executeQuery(); + $previous = []; + while ($row = $result->fetchAssociative()) { + $previous[(int) $row['id']] = (int) $row['pid']; + } + + $prevLevel = []; + $parentId = -1; + foreach ($pageIds as $pageId) { + if (! isset($previous[$pageId]) || $previous[$pageId] === $parentId) { + continue; + } + + $prevLevel[] = $parentId = $previous[$pageId]; + } + + return $prevLevel; + } +} diff --git a/src/Migration/BackboneNavigationMigration.php b/src/Migration/BackboneNavigationMigration.php new file mode 100644 index 0000000..f71bc45 --- /dev/null +++ b/src/Migration/BackboneNavigationMigration.php @@ -0,0 +1,130 @@ + 'disableEvents', + 'currentAsRoot', + 'defineRoots', + 'defineStop', + 'stop', + 'defineHard', + 'hard', + 'isSitemap', + 'hideSingleLevel', + 'addLegacyCss', + ]; + + public function __construct(private readonly Connection $connection) + { + } + + public function shouldRun(): bool + { + if (! $this->connection->createSchemaManager()->tablesExist('tl_module')) { + return false; + } + + if ($this->hasBackboneItNavigationModules()) { + return true; + } + + return $this->determineAffectedFields() !== []; + } + + public function run(): MigrationResult + { + $this->renameNavigationModules(); + + $affectedFields = $this->determineAffectedFields(); + $table = $this->connection->createSchemaManager()->introspectTable('tl_module'); + foreach ($affectedFields as $oldName => $newName) { + $this->renameField($table->getColumn(self::OLD_PREFIX . $oldName), $newName); + } + + return $this->createResult(true); + } + + private function hasBackboneItNavigationModules(): bool + { + $result = $this->connection->executeQuery( + 'SELECT count(id) FROM tl_module WHERE type=:type', + ['type' => 'backboneit_navigation_menu'], + ); + + return $result->fetchOne() > 0; + } + + private function renameNavigationModules(): void + { + $this->connection->update( + 'tl_module', + ['type' => 'hofff_navigation_menu'], + ['type' => 'backboneit_navigation_menu'], + ); + } + + /** @return array */ + private function determineAffectedFields(): array + { + $table = $this->connection->createSchemaManager()->introspectTable('tl_module'); + $fields = []; + + foreach (self::FIELDS as $oldName => $newName) { + if (is_int($oldName)) { + $oldName = $newName; + } + + if (! $table->hasColumn(self::OLD_PREFIX . $oldName) || $table->hasColumn(self::NEW_PREFIX . $newName)) { + continue; + } + + $fields[$oldName] = $newName; + } + + return $fields; + } + + private function renameField(Column $column, string $newName): void + { + $platform = $this->connection->getDatabasePlatform(); + $this->connection->executeStatement( + sprintf( + 'ALTER TABLE tl_module CHANGE %s %s', + $column->getName(), + $platform->getColumnDeclarationSQL(self::NEW_PREFIX . $newName, $column->toArray()), + ), + ); + } +} diff --git a/src/QueryBuilder/BaseQueryBuilder.php b/src/QueryBuilder/BaseQueryBuilder.php new file mode 100644 index 0000000..69b06fe --- /dev/null +++ b/src/QueryBuilder/BaseQueryBuilder.php @@ -0,0 +1,64 @@ + */ + private array $queries = []; + + public function __construct(protected readonly Connection $connection, private readonly Security $security) + { + } + + protected function query(string $name, callable $builder): QueryBuilder + { + if (! isset($this->queries[$name])) { + $this->queries[$name] = $this->connection->createQueryBuilder()->from('tl_page'); + $builder($this->queries[$name]); + } + + return clone $this->queries[$name]; + } + + /** @return static */ + protected function addGuestsQueryParts(QueryBuilder $queryBuilder, bool $showGuests = false): self + { + if ($showGuests) { + return $this; + } + + if ($this->security->isGranted('ROLE_MEMBER') && ! $this->security->isGranted('ROLE_USER')) { + $queryBuilder->andWhere('guests != 1'); + } + + return $this; + } + + /** @return static */ + protected function addPublishedCondition(QueryBuilder $queryBuilder, bool $respectPublished = true): self + { + if (! $respectPublished || $this->security->isGranted('ROLE_USER')) { + return $this; + } + + static $time; + if (! $time) { + $time = time(); + } + + $queryBuilder + ->andWhere('(start = \'\' OR start < :time) AND (stop = \'\' OR stop > :time) AND published = 1') + ->setParameter('time', $time); + + return $this; + } +} diff --git a/src/QueryBuilder/PageQueryBuilder.php b/src/QueryBuilder/PageQueryBuilder.php new file mode 100644 index 0000000..894803b --- /dev/null +++ b/src/QueryBuilder/PageQueryBuilder.php @@ -0,0 +1,293 @@ + true, + 'pid' => true, + 'sorting' => true, + 'tstamp' => true, + 'type' => true, + 'alias' => true, + 'title' => true, + 'protected' => true, + 'groups' => true, + 'jumpTo' => true, + 'pageTitle' => true, + 'target' => true, + 'description' => true, + 'url' => true, + 'robots' => true, + 'cssClass' => true, + 'accesskey' => true, + ]; + + private const ERROR_PAGE_TYPES = [ + 'error_401', + 'error_403', + 'error_404', + ]; + + /** @var list */ + private array $fields = []; + + public function __construct(Connection $connection, Security $security, private readonly ModuleModel $moduleModel) + { + parent::__construct($connection, $security); + + $this->determineFields(); + } + + /** @param list $parentIds */ + public function createFetchItemsQuery(array $parentIds): QueryBuilder + { + $query = $this->query( + __FUNCTION__, + function (QueryBuilder $queryBuilder): void { + $queryBuilder + ->select( + ...array_map( + fn (string $field) => $field !== '*' ? $this->connection->quoteIdentifier($field) : $field, + $this->fields, + ), + ) + ->andWhere('type != :rootType') + ->setParameter('rootType', 'root') + ->andWhere('pid IN (:pids)') + ->orderBy('sorting'); + + $this + ->addHiddenCondition( + $queryBuilder, + (bool) $this->moduleModel->hofff_navigation_showHidden, + (bool) $this->moduleModel->hofff_navigation_isSitemap, + ) + ->addPublishedCondition($queryBuilder) + ->addErrorPagesCondition( + $queryBuilder, + (bool) $this->moduleModel->hofff_navigation_showErrorPages, + ) + ->addGuestsQueryParts( + $queryBuilder, + (bool) $this->moduleModel->backboneit_navigation_showGuests, + ); + }, + ); + + $query->setParameter('pids', $parentIds, ArrayParameterType::INTEGER); + + return $query; + } + + public function createRootIdsQuery(): QueryBuilder + { + return $this->query( + __FUNCTION__, + function (QueryBuilder $queryBuilder): void { + $queryBuilder + ->select( + ...array_map( + fn (string $field) => $this->connection->quoteIdentifier($field), + ['id', 'pid', 'protected', 'groups'], + ), + ); + + $this + ->addHiddenCondition( + $queryBuilder, + ! $this->moduleModel->hofff_navigation_respectHidden, + (bool) $this->moduleModel->hofff_navigation_isSitemap, + ) + ->addGuestsQueryParts( + $queryBuilder, + ! $this->moduleModel->hofff_navigation_respectGuests, + ) + ->addPublishedCondition( + $queryBuilder, + (bool) $this->moduleModel->hofff_navigation_respectPublish, + ); + }, + ); + } + + public function createStartRootIdsQuery(): QueryBuilder + { + if (! $this->moduleModel->hofff_navigation_includeStart) { + return $this->createRootIdsQuery(); + } + + return $this->query( + __FUNCTION__, + function (QueryBuilder $queryBuilder): void { + $queryBuilder->select( + ...array_map( + fn (string $field) => $this->connection->quoteIdentifier($field), + ['id', 'pid', 'protected', 'groups'], + ), + ); + + $this + ->addHiddenCondition( + $queryBuilder, + (bool) $this->moduleModel->hofff_navigation_showHiddenStart, + (bool) $this->moduleModel->hofff_navigation_isSitemap, + ) + ->addPublishedCondition($queryBuilder) + ->addErrorPagesCondition( + $queryBuilder, + (bool) $this->moduleModel->hofff_navigation_showErrorPages, + ) + ->addGuestsQueryParts($queryBuilder, (bool) $this->moduleModel->hofff_navigation_showGuests); + }, + ); + } + + /** @param list $pageIds */ + public function createPageInformationQuery(array $pageIds): QueryBuilder + { + $query = $this->query( + __FUNCTION__, + function (QueryBuilder $queryBuilder): void { + $queryBuilder + ->select( + ...array_map( + fn (string $field) => $this->connection->quoteIdentifier($field), + ['id', 'pid', 'protected', 'groups'], + ), + ) + ->where('id IN (:ids)'); + }, + ); + + $query->setParameter('ids', $pageIds, ArrayParameterType::STRING); + + return $query; + } + + /** @param list $rootIds */ + public function createRootInformationQuery(array $rootIds): QueryBuilder + { + $query = $this->query( + __FUNCTION__, + function (QueryBuilder $queryBuilder): void { + $queryBuilder + ->select( + ...array_map( + fn (string $field) => $this->connection->quoteIdentifier($field), + $this->fields, + ), + ) + ->where('id IN (:rootIds)'); + }, + ); + + $query->setParameter('rootIds', $rootIds, ArrayParameterType::STRING); + + return $query; + } + + /** @param list $pageIds */ + public function createPreviousLevelQuery(array $pageIds): QueryBuilder + { + $query = $this->query( + __FUNCTION__, + static function (QueryBuilder $queryBuilder): void { + $queryBuilder + ->select('id', 'pid') + ->where('id IN (:ids)'); + }, + ); + + $query->setParameter('ids', $pageIds, ArrayParameterType::STRING); + + return $query; + } + + /** + * Adds the or hidden state of a page. + */ + private function addHiddenCondition( + QueryBuilder $queryBuilder, + bool $showHidden = false, + bool $sitemap = false, + ): self { + if ($showHidden) { + return $this; + } + + if ($sitemap) { + $queryBuilder->andWhere('(sitemap = \'map_always\' OR (hide != 1 AND sitemap != \'map_never\'))'); + + return $this; + } + + $queryBuilder->andWhere('hide != 1'); + + return $this; + } + + private function addErrorPagesCondition(QueryBuilder $queryBuilder, bool $showErrorPages): self + { + if (! $showErrorPages) { + $queryBuilder + ->andWhere('type NOT IN (:errorPages)') + ->setParameter('errorPages', self::ERROR_PAGE_TYPES, ArrayParameterType::STRING); + } + + return $this; + } + + private function determineFields(): void + { + $customFields = StringUtil::deserialize($this->moduleModel->hofff_navigation_addFields, true); + + if (count($customFields) > 10) { + $this->fields[] = '*'; + + return; + } + + $schemaManager = $this->connection->createSchemaManager(); + $table = $schemaManager->introspectTable('tl_page'); + + if ($customFields === []) { + $this->fields = array_keys(self::DEFAULT_FIELDS); + + if ($table->hasColumn('tabindex')) { + $this->fields[] = 'tabindex'; + } + + return; + } + + $customFields = array_flip($customFields); + $fields = []; + + foreach ($table->getColumns() as $column) { + if (! isset($customFields[$column->getName()])) { + continue; + } + + $fields[$column->getName()] = true; + } + + $this->fields = array_keys(array_merge($fields, self::DEFAULT_FIELDS)); + } +} diff --git a/src/QueryBuilder/RedirectPageQueryBuilder.php b/src/QueryBuilder/RedirectPageQueryBuilder.php new file mode 100644 index 0000000..645971f --- /dev/null +++ b/src/QueryBuilder/RedirectPageQueryBuilder.php @@ -0,0 +1,54 @@ +query( + __FUNCTION__, + function (QueryBuilder $queryBuilder): void { + $queryBuilder + ->select('*') + ->where('id=:id') + ->setMaxResults(1); + + $this + ->addGuestsQueryParts($queryBuilder) + ->addPublishedCondition($queryBuilder); + }, + ); + + $query->setParameter('id', $jumpToId); + + return $query; + } + + public function createFallbackQuery(int $fallbackSearchId): QueryBuilder + { + $query = $this->query( + __FUNCTION__, + function (QueryBuilder $queryBuilder): void { + $queryBuilder + ->select('*') + ->where('type=:type') + ->andWhere('pid=:pid') + ->setParameter('type', 'regular') + ->orderBy('sorting') + ->setMaxResults(1); + + $this + ->addGuestsQueryParts($queryBuilder); + }, + ); + + $query->setParameter('pid', $fallbackSearchId); + + return $query; + } +} diff --git a/src/Renderer/NavigationRenderer.php b/src/Renderer/NavigationRenderer.php new file mode 100644 index 0000000..4463608 --- /dev/null +++ b/src/Renderer/NavigationRenderer.php @@ -0,0 +1,409 @@ + $itemIds The navigation items arrays + * @param list $stopLimit (optional, defaults to PHP_INT_MAX) The soft limit of depth. + * @param int $hardLevel (optional, defaults to PHP_INT_MAX) The hard limit of depth. + * @param int $currentLevel (optional, defaults to 1) The current level of this navigation layer + * + * @return string The parsed navigation template, could be empty string. + */ + public function render( + ModuleModel $moduleModel, + PageItems $items, + array $itemIds, + array $stopLimit = [PHP_INT_MAX], + int $hardLevel = PHP_INT_MAX, + int|null $activeId = null, + int $currentLevel = 1, + ): string { + $this->moduleModel = $moduleModel; + $this->items = $items; + + if ($stopLimit === []) { + $stopLimit = [PHP_INT_MAX]; + } + + $this->compileTree(); + $this->dispatchEvent(new TreeEvent($moduleModel, $items)); + + $event = new MenuEvent($moduleModel, $itemIds); + $this->dispatchEvent($event); + $itemIds = $event->rootIds(); + $firstIds = $this->moduleModel->hofff_navigation_includeStart + ? $itemIds + : $this->items->getFirstNavigationLevel($itemIds); + + if ($moduleModel->hofff_navigation_hideSingleLevel) { + $hasMultipleLevels = false; + + foreach ($firstIds as $id) { + if ($items->subItems[$id]) { + $hasMultipleLevels = true; + break; + } + } + + if (! $hasMultipleLevels) { + return ''; + } + } + + if ($stopLimit[0] === 0) { + // special case renderNavigationTree cannot handle + array_shift($stopLimit); + if ($stopLimit === []) { + $stopLimit = [PHP_INT_MAX]; + } + } + + return trim($this->renderTree($firstIds, $stopLimit, $hardLevel, $currentLevel, $activeId)); + } + + /** + * @param list $itemIds + * @param list $stopLimit + * + * @SuppressWarnings(PHPMD.NPathComplexity) + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + private function renderTree( + array $itemIds, + array $stopLimit = [PHP_INT_MAX], + int $hardLevel = PHP_INT_MAX, + int $currentLevel = 1, + int|null $activeId = null, + ): string { + if (! $itemIds) { + return ''; + } + + $stopLevel = $currentLevel >= $stopLimit[0] ? array_shift($stopLimit) : $stopLimit[0]; + $renderedItems = []; + $containsActive = false; + + foreach ($itemIds as $itemId) { + if (! isset($this->items->items[$itemId])) { + continue; + } + + $item = $this->items->items[$itemId]; + $item['rel'] ??= ''; + $item['subitems'] ??= ''; + $item['isActive'] ??= false; + $item['isInTrail'] ??= false; + $item['class'] ??= ''; + + if ($itemId === $activeId) { + $containsActive = true; + + if ($item['href'] === Environment::get('request')) { + $item['isActive'] = true; // nothing else (active class is set in template) + } else { + $item['isInTrail'] = true; + } + } else { // do not flatten if/else + /** @psalm-suppress RiskyTruthyFalsyComparison */ + if (isset($item['tid']) && $item['tid'] === $activeId) { + if ($item['href'] === Environment::get('request')) { + $item['isActive'] = true; // nothing else (active class is set in template) + } else { + $item['isInTrail'] = true; + } + } + } + + /** @psalm-suppress RiskyTruthyFalsyComparison */ + if ($item['isInTrail']) { + $item['class'] .= ' trail'; + } + + /** @psalm-suppress RiskyTruthyFalsyComparison */ + if (! isset($this->items->subItems[$itemId])) { + $item['class'] .= ' leaf'; + } elseif ($currentLevel >= $hardLevel) { + // we are at hard level, never draw submenu + $item['class'] .= ' submenu leaf'; + } elseif ( + $currentLevel >= $stopLevel + && ! $item['isInTrail'] && $itemId !== $activeId + && ($item['tid'] ?? null) !== $activeId + ) { + // we are at stop level and not trail and not active, never draw submenu + $item['class'] .= ' submenu leaf'; + } elseif ($this->items->subItems[$itemId]) { + $item['class'] .= ' submenu inner'; + $item['subitems'] = $this->renderTree( + $this->items->subItems[$itemId] ?? [], + $stopLimit, + $hardLevel, + $currentLevel + 1, + $activeId, + ); + } else { // should never be reached, if no hooks are used + $item['class'] .= ' leaf'; + } + + $renderedItems[] = $item; + } + + if ($containsActive) { + foreach ($renderedItems as &$item) { + /** @psalm-suppress RiskyTruthyFalsyComparison */ + if ($item['isActive']) { + continue; + } + + $item['class'] .= ' sibling'; + } + + unset($item); + } + + if ($renderedItems !== []) { + $renderedItems[0]['class'] .= ' first'; + $renderedItems[count($renderedItems) - 1]['class'] .= ' last'; + } + + foreach ($renderedItems as &$item) { + $item['class'] = ltrim($item['class']); + } + + unset($item); + + $objTemplate = new FrontendTemplate($this->moduleModel->navigationTpl ?: 'nav_default'); + $objTemplate->setData([ + 'module' => $this->moduleModel->row(), + 'level' => 'level_' . $currentLevel, + 'items' => $renderedItems, + 'type' => self::class, + ]); + + return $objTemplate->parse(); + } + + private function compileTree(): void + { + $forwardResolution = ! $this->moduleModel->hofff_navigation_noForwardResolution; + foreach ($this->items->items as $itemId => $item) { + if ($item === []) { + continue; + } + + $this->items->items[$itemId] = $this->compileNavigationItem( + $this->items->items[$itemId], + $forwardResolution, + ); + } + } + + /** + * Compiles a navigation item array from a page dataset with the given subnavi + * + * @param array $page The page dataset as an array + * + * @return array The compiled navigation item array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + private function compileNavigationItem(array $page, bool $forwardResolution = true): array + { + // fallback for dataset field collisions + $page['_title'] = $page['title']; + $page['_pageTitle'] = $page['pageTitle']; + $page['_target'] = $page['target']; + $page['_description'] = $page['description'] ?? ''; + + $page['link'] = $page['_title']; + $page['class'] = $page['cssClass'] . ' ' . $page['type']; + $page['title'] = StringUtil::specialchars($page['_title'], true); + $page['pageTitle'] = StringUtil::specialchars($page['_pageTitle'], true); + $page['target'] = ''; // overwrite DB value + $page['nofollow'] = strncmp($page['robots'], 'noindex', 7) === 0; + $page['description'] = str_replace(["\n", "\r"], [' ', ''], $page['_description']); + $page['isInTrail'] = $this->items->isInTrail((int) $page['id']); + + switch ($page['type']) { + case 'forward': + if ($forwardResolution) { + $redirectPage = $this->getRedirectPage($page); + if (! $redirectPage) { + $page['href'] = $this->generatePageUrl($page); + } elseif ($redirectPage['type'] === 'redirect') { + $page['href'] = $this->encodeEmailURL($redirectPage['url']); + $page['target'] = $redirectPage['target'] ? 'target="_blank"' : ''; + } else { + $page['tid'] = $redirectPage['id']; + $page['href'] = $this->generatePageUrl($redirectPage); + } + } else { + $page['tid'] = $page['jumpTo']; + $page['href'] = $this->generatePageUrl($page); + } + + break; + + case 'redirect': + $page['href'] = $this->encodeEmailURL($page['url']); + $page['target'] = $page['_target'] ? 'target="_blank"' : ''; + break; + + case 'root': + /** + * @psalm-suppress RiskyTruthyFalsyComparison + * @psalm-suppress PossiblyUndefinedArrayOffset: + */ + if ( + ! ($page['dns'] ?? false) + || preg_replace('/^www\./', '', $page['dns']) === preg_replace( + '/^www\./', + '', + (string) Environment::get('httpHost'), + ) + ) { + $page['href'] = Environment::get('base'); + // we only break on root pages; pages in different roots should be handled by DomainLink extension + break; + } + // do not break + default: + case 'regular': + case 'error_401': + case 'error_403': + case 'error_404': + $page['href'] = $this->generatePageUrl($page); + break; + } + + $event = new ItemEvent($this->moduleModel, $page); + $this->dispatchEvent($event); + + return $event->item(); + } + + /** @param array $page */ + private function generatePageUrl(array $page): string|null + { + $pageModel = PageModel::findByPk($page['id']); + if ($pageModel) { + return $pageModel->getFrontendUrl(); + } + + return null; + } + + /** + * Utility method of compileNavigationItem. + * + * If the given URL starts with "mailto:", the E-Mail is encoded, + * otherwise nothing is done. + * + * @param string $href The URL to check and possibly encode + * + * @return string The modified URL + */ + private function encodeEmailURL(string $href): string + { + if (strncasecmp($href, 'mailto:', 7) !== 0) { + return $href; + } + + return StringUtil::encodeEmail($href); + } + + /** + * @param array $page + * + * @return array + */ + private function getRedirectPage(array $page): array + { + /** @psalm-suppress RiskyTruthyFalsyComparison */ + if (! $page['jumpTo']) { + $query = $this->redirectQueryBuilder->createFallbackQuery((int) $page['id']); + $result = $query->executeQuery(); + + return $result->fetchAssociative() ?: []; + } + + $fallbackSearchId = $page['id']; + $jumpToId = $page['jumpTo']; + do { + $query = $this->redirectQueryBuilder->createJumpToQuery((int) $jumpToId); + $query->setParameter('id', $jumpToId); + $result = $query->executeQuery(); + /** @psalm-suppress RiskyTruthyFalsyComparison */ + $next = $result->fetchAssociative() ?: []; + + if (! $result->rowCount()) { + $query = $this->redirectQueryBuilder->createFallbackQuery((int) $fallbackSearchId); + $result = $query->executeQuery(); + /** @psalm-suppress RiskyTruthyFalsyComparison */ + $next = $result->fetchAssociative() ?: []; + break; + } + + $fallbackSearchId = $jumpToId; + $jumpToId = $next['jumpTo'] ?? 0; + } while ($next['type'] === 'forward'); + + return $next; + } + + private function dispatchEvent(Event $event): void + { + if ($this->moduleModel->hofff_navigation_disableHooks) { + return; + } + + $this->eventDispatcher->dispatch($event); + } +} diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml new file mode 100644 index 0000000..d45a682 --- /dev/null +++ b/src/Resources/config/services.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Resources/contao/dca/tl_module.php b/src/Resources/contao/dca/tl_module.php new file mode 100644 index 0000000..75db810 --- /dev/null +++ b/src/Resources/contao/dca/tl_module.php @@ -0,0 +1,355 @@ + true, + 'inputType' => 'pageTree', + 'eval' => [ + 'multiple' => true, + 'fieldType' => 'checkbox', + 'tl_class' => 'clr', + 'orderField' => 'hofff_navigation_roots_order', + ], + 'sql' => [ + 'type' => Types::BLOB, + 'default' => null, + 'notnull' => false, + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_roots_order'] = [ + 'sql' => [ + 'type' => Types::BLOB, + 'default' => null, + 'notnull' => false, + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_start'] = [ + 'exclude' => true, + 'inputType' => 'text', + 'eval' => [ + 'maxlength' => 5, + 'rgxp' => 'digit', + 'tl_class' => 'clr w50', + ], + 'sql' => [ + 'type' => Types::SMALLINT, + 'default' => 0, + 'length' => 5, + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_respectHidden'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50 cbx m12', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_respectPublish'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'clr w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_respectGuests'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_includeStart'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'submitOnChange' => true, + 'tl_class' => 'clr w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_showHiddenStart'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_showHidden'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'clr w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_showProtected'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_showGuests'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'clr w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_addFields'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'multiple' => true, + 'tl_class' => 'clr', + ], + 'sql' => [ + 'type' => Types::BLOB, + 'default' => null, + 'notnull' => false, + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_noForwardResolution'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'm12 w50', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_showErrorPages'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_disableEvents'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_currentAsRoot'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_defineRoots'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'submitOnChange' => true, + 'tl_class' => 'w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_defineStop'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'submitOnChange' => true, + 'tl_class' => 'clr w50 cbx m12', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_stop'] = [ + 'exclude' => true, + 'inputType' => 'text', + 'eval' => [ + 'maxlength' => 255, + 'tl_class' => 'w50', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 255, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_defineHard'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'submitOnChange' => true, + 'tl_class' => 'clr w50 cbx m12', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_hard'] = [ + 'exclude' => true, + 'inputType' => 'text', + 'eval' => [ + 'maxlength' => 5, + 'rgxp' => 'digit', + 'tl_class' => 'w50', + ], + 'sql' => [ + 'type' => Types::SMALLINT, + 'default' => 0, + 'length' => 5, + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_isSitemap'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_hideSingleLevel'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'clr w50 cbx', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; + +$GLOBALS['TL_DCA']['tl_module']['fields']['hofff_navigation_addLegacyCss'] = [ + 'exclude' => true, + 'inputType' => 'checkbox', + 'eval' => [ + 'tl_class' => 'w50 cbx m12', + ], + 'sql' => [ + 'type' => Types::STRING, + 'length' => 1, + 'default' => '', + ], +]; diff --git a/src/Resources/contao/languages/de/modules.php b/src/Resources/contao/languages/de/modules.php new file mode 100644 index 0000000..d100250 --- /dev/null +++ b/src/Resources/contao/languages/de/modules.php @@ -0,0 +1,10 @@ +verkettete Weiterleitungen, welche die aktuelle Seite als Weiterleitungsendziel besitzen nicht mehr als aktiv gekennzeichnet werden (kein "isActive" mehr im Template und keine "active" CSS-Klasse).', +]; +$GLOBALS['TL_LANG']['tl_module']['hofff_navigation_showErrorPages'] = [ + 'Fehlerseiten anzeigen', + 'Fehlerseiten vom Typ "403" und "404" werden in der Navigation angezeigt.', +]; +$GLOBALS['TL_LANG']['tl_module']['hofff_navigation_disableEvents'] = [ + 'Events deaktivieren', + 'Deaktiviert das Ausführen der Navigations-Events. Kann zu einer besseren Performance führen, wenn Events für diese Navigation nicht notwendig sind.', +]; diff --git a/src/Resources/contao/templates/mod_hofff_navigation_menu.html5 b/src/Resources/contao/templates/mod_hofff_navigation_menu.html5 new file mode 100644 index 0000000..bde1033 --- /dev/null +++ b/src/Resources/contao/templates/mod_hofff_navigation_menu.html5 @@ -0,0 +1,8 @@ +extend('block_unsearchable') ?> + +block('content') ?> + +items; ?> + +endblock() ?> + diff --git a/TL_ROOT/system/modules/backboneit_navigation/templates/nav_bbit.html5 b/src/Resources/contao/templates/nav_hofff.html5 similarity index 99% rename from TL_ROOT/system/modules/backboneit_navigation/templates/nav_bbit.html5 rename to src/Resources/contao/templates/nav_hofff.html5 index ff1edc5..30ea2e2 100644 --- a/TL_ROOT/system/modules/backboneit_navigation/templates/nav_bbit.html5 +++ b/src/Resources/contao/templates/nav_hofff.html5 @@ -13,4 +13,4 @@ > - \ No newline at end of file + diff --git a/src/Security/PagePermissionGuard.php b/src/Security/PagePermissionGuard.php new file mode 100644 index 0000000..4aa1fe5 --- /dev/null +++ b/src/Security/PagePermissionGuard.php @@ -0,0 +1,91 @@ +security->isGranted('ROLE_USER') && ! $model->hofff_navigation_showProtected; + } + + /** + * Utility method. + * + * THIS IS NOT THE OPPOSITE OF ::isPermissionDenied()! + * + * Checks if the current user has permission to view the page of the given + * page dataset, in regard to the current navigation settings and the + * permission requirements of the page. + * + * Context property: hofff_navigation_showProtected + * + * @param array $page The page dataset of the current page, with at least + * groups and protected attributes set. + * + * @return bool If the permission is granted true, otherwise false. + */ + public function isPermissionGranted(ModuleModel $model, array $page): bool + { + // be users have access everywhere + if ($this->security->isGranted('ROLE_USER')) { + return true; + } + + // protection is ignored + if ($model->hofff_navigation_showProtected) { + return true; + } + + return ! $this->isPermissionDenied($page); + } + + /** + * Utility method. + * + * THIS IS NOT THE OPPOSITE OF ::isPermissionGranted()! + * + * Checks if the current user has no permission to view the page of the + * given page dataset, in regard to the permission requirements of the + * page. + * + * @param array $page The page dataset of the current page, with at least + * groups and protected attributes set. + * + * @return bool If the permission is denied true, otherwise false. + */ + public function isPermissionDenied(array $page): bool + { + // this page is not protected + if (! $page['protected']) { + return false; + } + + $user = $this->security->getUser(); + if (! $user instanceof FrontendUser) { + return true; + } + + // the current user is not in any group + /** @psalm-suppress RiskyTruthyFalsyComparison */ + if (! $user->groups) { + return true; + } + + // check if the current user is not in any group, which is allowed to access the current page + return ! array_intersect((array) $user->groups, StringUtil::deserialize($page['groups'], true)); + } +}