diff --git a/.gitignore b/.gitignore index 2b98977b4..9bfaccbe5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /apps/vendor /apps/bin/ /apps/.symfony5 -/apps/config/reference.php /apps/.composer /apps/.pdepend /apps/.bash_history diff --git a/Dockerfile.messenger b/Dockerfile.messenger new file mode 100644 index 000000000..f1bed10f3 --- /dev/null +++ b/Dockerfile.messenger @@ -0,0 +1,9 @@ +FROM koromerzhin/php:8.4.13-apache-symfony + +USER root + +RUN apt-get update \ + && apt-get install -y supervisor \ + && rm -rf /var/lib/apt/lists/* + +USER www-data \ No newline at end of file diff --git a/Taskfile.yml b/Taskfile.yml index a2281008a..8f118c198 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -103,6 +103,7 @@ tasks: desc: "Deploy Docker stacks defined in docker-compose files" silent: true cmds: + - docker build -f Dockerfile.messenger -t labstag/messenger:latest . - task: docker:stack:deploy vars: COMPOSE_FILE: "{{.DOCKERCOMPOSEFILE}}" @@ -157,7 +158,6 @@ tasks: cmds: - task: docker:stack:shell vars: - STACK_NAME: "labstag" SERVICE_NAME: "www" labstag:cmd-exec: @@ -171,7 +171,6 @@ tasks: cmds: - task: docker:stack:exec vars: - STACK_NAME: "labstag" SERVICE_NAME: "www" COMMAND: "{{.COMMAND}}" INTERACTIVE: "{{.INTERACTIVE}}" @@ -338,14 +337,6 @@ tasks: vars: CMD: "run ecs-fix" - labstag:delete-oldfiles: - desc: "Delete old temporary files" - silent: true - cmds: - - task: symfony:console - vars: - CMD: "labstag:delete-oldfiles" - labstag:geocode-install: desc: "Install geocoding data" silent: true @@ -446,14 +437,6 @@ tasks: vars: CMD: "lint:twig templates" - messenger:consume: - desc: "Start Messenger message consumer" - silent: true - cmds: - - task: symfony:console - vars: - CMD: "messenger:consume --all" - messenger:stats: desc: "Show Messenger statistics" silent: true @@ -667,7 +650,6 @@ tasks: silent: true cmds: - task: doctrine:fixtures - - task: labstag:delete-oldfiles - task: star:add labstag:set-env-ids: diff --git a/apps/composer.json b/apps/composer.json index c8f0ba352..d3bd00f96 100755 --- a/apps/composer.json +++ b/apps/composer.json @@ -10,7 +10,7 @@ "ext-ctype": "*", "ext-iconv": "*", "beberlei/doctrineextensions": "1.5.*", - "doctrine/doctrine-bundle": "3.1.*", + "doctrine/doctrine-bundle": "3.2.*", "doctrine/doctrine-migrations-bundle": "4.0.*", "doctrine/orm": "^3.5", "dragonmantank/cron-expression": "3.6.*", @@ -20,13 +20,13 @@ "giggsey/libphonenumber-for-php": "9.0.*", "knplabs/knp-menu-bundle": "3.7.*", "knplabs/knp-paginator-bundle": "6.10.*", - "league/flysystem-bundle": "3.6.*", - "liip/imagine-bundle": "2.16.*", - "matomo/device-detector": "6.4.*", - "mpdf/mpdf": "8.2.*", + "league/flysystem-bundle": "3.7.*", + "liip/imagine-bundle": "2.17.*", + "matomo/device-detector": "6.5.*", + "mpdf/mpdf": "8.3.*", "nelmio/cors-bundle": "2.6.*", "nesbot/carbon": "3.11.*", - "phpoffice/phpspreadsheet": "5.3.*", + "phpoffice/phpspreadsheet": "5.7.*", "spatie/schema-org": "3.23.*", "symfony/apache-pack": "1.0.*", "symfony/bluesky-notifier": "8.0.*", @@ -54,10 +54,10 @@ "symfony/webpack-encore-bundle": "2.4.*", "symfony/workflow": "8.0.*", "symfony/yaml": "8.0.*", - "twig/extra-bundle": "3.22.*", - "twig/intl-extra": "3.22.*", - "twig/markdown-extra": "^3.22", - "twig/twig": "3.22.*", + "twig/extra-bundle": "3.24.*", + "twig/intl-extra": "3.24.*", + "twig/markdown-extra": "^3.24", + "twig/twig": "3.24.*", "vich/uploader-bundle": "2.9.*" }, "config": { @@ -132,7 +132,7 @@ "dama/doctrine-test-bundle": "*", "doctrine/doctrine-fixtures-bundle": "4.3.*", "fakerphp/faker": "1.24.*", - "friendsofphp/php-cs-fixer": "3.92.*", + "friendsofphp/php-cs-fixer": "3.95.*", "mmo/faker-images": "0.9.*", "phpstan/phpdoc-parser": "2.3.*", "phpstan/phpstan": "2.1.*", @@ -142,17 +142,17 @@ "phpstan/phpstan-phpunit": "2.0.*", "phpstan/phpstan-symfony": "2.0.*", "phpunit/phpunit": "12.5.*", - "rector/rector": "2.2.*", + "rector/rector": "2.4.*", "smknstd/fakerphp-picsum-images": "1.0.*", "squizlabs/php_codesniffer": "4.0.*", "symfony/browser-kit": "8.0.*", "symfony/css-selector": "8.0.*", "symfony/debug-bundle": "8.0.*", - "symfony/maker-bundle": "1.65.*", + "symfony/maker-bundle": "1.67.*", "symfony/phpunit-bridge": "8.0.*", "symfony/stopwatch": "8.0.*", "symfony/web-profiler-bundle": "8.0.*", - "symplify/easy-coding-standard": "13.0.*", + "symplify/easy-coding-standard": "13.1.*", "symplify/phpstan-rules": "14.9.*" } } diff --git a/apps/composer.lock b/apps/composer.lock index 5115e7f6d..c96ee2601 100755 --- a/apps/composer.lock +++ b/apps/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cd2591adfe57ef6379b8ac7d8bc305c3", + "content-hash": "e28db303d7135ae53ca52477fb48e424", "packages": [ { "name": "beberlei/doctrineextensions", @@ -218,16 +218,16 @@ }, { "name": "doctrine/collections", - "version": "2.4.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "9acfeea2e8666536edff3d77c531261c63680160" + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/9acfeea2e8666536edff3d77c531261c63680160", - "reference": "9acfeea2e8666536edff3d77c531261c63680160", + "url": "https://api.github.com/repos/doctrine/collections/zipball/7713da39d8e237f28411d6a616a3dce5e20d5de2", + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2", "shasum": "" }, "require": { @@ -284,7 +284,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.4.0" + "source": "https://github.com/doctrine/collections/tree/2.6.0" }, "funding": [ { @@ -300,20 +300,20 @@ "type": "tidelift" } ], - "time": "2025-10-25T09:18:13+00:00" + "time": "2026-01-15T10:01:58+00:00" }, { "name": "doctrine/dbal", - "version": "4.4.1", + "version": "4.4.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" + "reference": "61e730f1658814821a85f2402c945f3883407dec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61e730f1658814821a85f2402c945f3883407dec", + "reference": "61e730f1658814821a85f2402c945f3883407dec", "shasum": "" }, "require": { @@ -329,9 +329,9 @@ "phpstan/phpstan": "2.1.30", "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "11.5.23", - "slevomat/coding-standard": "8.24.0", - "squizlabs/php_codesniffer": "4.0.0", + "phpunit/phpunit": "11.5.50", + "slevomat/coding-standard": "8.27.1", + "squizlabs/php_codesniffer": "4.0.1", "symfony/cache": "^6.3.8|^7.0|^8.0", "symfony/console": "^5.4|^6.3|^7.0|^8.0" }, @@ -390,7 +390,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.4.1" + "source": "https://github.com/doctrine/dbal/tree/4.4.3" }, "funding": [ { @@ -406,33 +406,33 @@ "type": "tidelift" } ], - "time": "2025-12-04T10:11:03+00:00" + "time": "2026-03-20T08:52:12+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -452,22 +452,22 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "3.1.0", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "24417f4d508086e1a458cc7aea893853ba9e4423" + "reference": "af84173db6978c3d2688ea3bcf3a91720b0704ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/24417f4d508086e1a458cc7aea893853ba9e4423", - "reference": "24417f4d508086e1a458cc7aea893853ba9e4423", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/af84173db6978c3d2688ea3bcf3a91720b0704ce", + "reference": "af84173db6978c3d2688ea3bcf3a91720b0704ce", "shasum": "" }, "require": { @@ -486,7 +486,6 @@ }, "conflict": { "doctrine/orm": "<3.0 || >=4.0", - "symfony/var-exporter": "< 6.4.1 || 7.0.0", "twig/twig": "<3.0.4" }, "require-dev": { @@ -495,6 +494,7 @@ "phpstan/phpstan": "2.1.1", "phpstan/phpstan-phpunit": "2.0.3", "phpstan/phpstan-strict-rules": "^2", + "phpstan/phpstan-symfony": "^2.0", "phpunit/phpunit": "^12.3.10", "psr/log": "^3.0", "symfony/doctrine-messenger": "^6.4 || ^7.0 || ^8.0", @@ -506,7 +506,6 @@ "symfony/string": "^6.4 || ^7.0 || ^8.0", "symfony/twig-bridge": "^6.4 || ^7.0 || ^8.0", "symfony/validator": "^6.4 || ^7.0 || ^8.0", - "symfony/var-exporter": "^6.4.1 || ^7.0.1 || ^8.0", "symfony/web-profiler-bundle": "^6.4 || ^7.0 || ^8.0", "symfony/yaml": "^6.4 || ^7.0 || ^8.0", "twig/twig": "^3.21.1" @@ -554,7 +553,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/3.1.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/3.2.2" }, "funding": [ { @@ -570,7 +569,7 @@ "type": "tidelift" } ], - "time": "2025-11-28T22:34:19+00:00" + "time": "2025-12-24T12:24:29+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -666,16 +665,16 @@ }, { "name": "doctrine/event-manager", - "version": "2.0.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/dda33921b198841ca8dbad2eaa5d4d34769d18cf", + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf", "shasum": "" }, "require": { @@ -685,10 +684,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "doctrine/coding-standard": "^14", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/phpstan": "^2.1.32", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -737,7 +736,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + "source": "https://github.com/doctrine/event-manager/tree/2.1.1" }, "funding": [ { @@ -753,7 +752,7 @@ "type": "tidelift" } ], - "time": "2024-05-22T20:47:39+00:00" + "time": "2026-01-29T07:11:08+00:00" }, { "name": "doctrine/inflector", @@ -847,30 +846,29 @@ }, { "name": "doctrine/instantiator", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/23da848e1a2308728fe5fdddabf4be17ff9720c7", + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.4" }, "require-dev": { - "doctrine/coding-standard": "^11", + "doctrine/coding-standard": "^14", "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" + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -897,7 +895,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + "source": "https://github.com/doctrine/instantiator/tree/2.1.0" }, "funding": [ { @@ -913,7 +911,7 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:23:10+00:00" + "time": "2026-01-05T06:47:08+00:00" }, { "name": "doctrine/lexer", @@ -994,16 +992,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.5", + "version": "3.9.7", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5" + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b823afbc40f932dae8272574faee53f2755eac5", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", "shasum": "" }, "require": { @@ -1077,7 +1075,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.5" + "source": "https://github.com/doctrine/migrations/tree/3.9.7" }, "funding": [ { @@ -1093,20 +1091,20 @@ "type": "tidelift" } ], - "time": "2025-11-20T11:15:36+00:00" + "time": "2026-04-23T19:33:20+00:00" }, { "name": "doctrine/orm", - "version": "3.5.8", + "version": "3.6.3", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "78dd074266e8b47a83bcf60ab5fe06c91a639168" + "reference": "e88cd591f0786089dee22b972c28aa2076df51c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/78dd074266e8b47a83bcf60ab5fe06c91a639168", - "reference": "78dd074266e8b47a83bcf60ab5fe06c91a639168", + "url": "https://api.github.com/repos/doctrine/orm/zipball/e88cd591f0786089dee22b972c28aa2076df51c0", + "reference": "e88cd591f0786089dee22b972c28aa2076df51c0", "shasum": "" }, "require": { @@ -1179,25 +1177,26 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.5.8" + "source": "https://github.com/doctrine/orm/tree/3.6.3" }, - "time": "2025-11-29T23:11:02+00:00" + "time": "2026-04-02T06:53:27+00:00" }, { "name": "doctrine/persistence", - "version": "4.1.1", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", "shasum": "" }, "require": { + "doctrine/deprecations": "^1", "doctrine/event-manager": "^1 || ^2", "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" @@ -1208,13 +1207,13 @@ "phpstan/phpstan-phpunit": "^2", "phpstan/phpstan-strict-rules": "^2", "phpunit/phpunit": "^10.5.58 || ^12", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Persistence\\": "src/Persistence" + "Doctrine\\Persistence\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1258,7 +1257,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/4.1.1" + "source": "https://github.com/doctrine/persistence/tree/4.2.0" }, "funding": [ { @@ -1274,20 +1273,20 @@ "type": "tidelift" } ], - "time": "2025-10-16T20:13:18+00:00" + "time": "2026-04-26T12:12:52+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.3", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7" + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a8af23a8e9d622505baa2997465782cbe8bb7fc7", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/9563949f5cd3bd12a17d12fb980528bc141c5806", + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806", "shasum": "" }, "require": { @@ -1327,9 +1326,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.3" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.4" }, - "time": "2025-10-26T09:35:14+00:00" + "time": "2026-02-08T16:21:46+00:00" }, { "name": "dragonmantank/cron-expression", @@ -1397,16 +1396,16 @@ }, { "name": "easycorp/easyadmin-bundle", - "version": "v4.27.5", + "version": "v4.27.8", "source": { "type": "git", "url": "https://github.com/EasyCorp/EasyAdminBundle.git", - "reference": "4853f50f91ac6fe9b88e770292390b18fc61a1ef" + "reference": "73f474ec89a2eb6ae7299d86e59bd0b8b64c8084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/4853f50f91ac6fe9b88e770292390b18fc61a1ef", - "reference": "4853f50f91ac6fe9b88e770292390b18fc61a1ef", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/73f474ec89a2eb6ae7299d86e59bd0b8b64c8084", + "reference": "73f474ec89a2eb6ae7299d86e59bd0b8b64c8084", "shasum": "" }, "require": { @@ -1439,6 +1438,9 @@ "twig/html-extra": "^3.17", "twig/twig": "^3.20" }, + "conflict": { + "symfony/error-handler": "<5.4.35" + }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.4|3.5.x-dev|^4.0", "phpstan/extension-installer": "^1.4", @@ -1487,7 +1489,7 @@ ], "support": { "issues": "https://github.com/EasyCorp/EasyAdminBundle/issues", - "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.27.5" + "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.27.8" }, "funding": [ { @@ -1495,7 +1497,7 @@ "type": "github" } ], - "time": "2025-12-11T18:39:30+00:00" + "time": "2026-01-24T16:59:22+00:00" }, { "name": "egulias/email-validator", @@ -1895,16 +1897,16 @@ }, { "name": "giggsey/libphonenumber-for-php", - "version": "9.0.20", + "version": "9.0.29", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php.git", - "reference": "bafb1741c3bc351b39652ed570a6adeec7d8032b" + "reference": "ac6ca861830c556ed1c266de3f6fe5f983da09d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/bafb1741c3bc351b39652ed570a6adeec7d8032b", - "reference": "bafb1741c3bc351b39652ed570a6adeec7d8032b", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/ac6ca861830c556ed1c266de3f6fe5f983da09d5", + "reference": "ac6ca861830c556ed1c266de3f6fe5f983da09d5", "shasum": "" }, "require": { @@ -1967,20 +1969,20 @@ "issues": "https://github.com/giggsey/libphonenumber-for-php/issues", "source": "https://github.com/giggsey/libphonenumber-for-php" }, - "time": "2025-12-05T12:07:14+00:00" + "time": "2026-04-24T11:10:46+00:00" }, { "name": "giggsey/locale", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/giggsey/Locale.git", - "reference": "1cd8b3ad2d43e04f4c2c6a240495af44780f809b" + "reference": "fe741e99ae6ccbe8132f3d63d8ec89924e689778" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/Locale/zipball/1cd8b3ad2d43e04f4c2c6a240495af44780f809b", - "reference": "1cd8b3ad2d43e04f4c2c6a240495af44780f809b", + "url": "https://api.github.com/repos/giggsey/Locale/zipball/fe741e99ae6ccbe8132f3d63d8ec89924e689778", + "reference": "fe741e99ae6ccbe8132f3d63d8ec89924e689778", "shasum": "" }, "require": { @@ -1989,14 +1991,16 @@ "require-dev": { "ext-json": "*", "friendsofphp/php-cs-fixer": "^3.66", - "pear/pear-core-minimal": "^1.10", - "pear/pear_exception": "^1.0", - "pear/versioncontrol_git": "^0.5", - "phing/phing": "^2.17.4", + "infection/infection": "^0.29|^0.32.0", "php-coveralls/php-coveralls": "^2.7", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.7", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpstan/phpstan-strict-rules": "^2.0.3", "phpunit/phpunit": "^10.5.45", "symfony/console": "^6.4", - "symfony/filesystem": "6.4", + "symfony/filesystem": "^6.4", "symfony/finder": "^6.4", "symfony/process": "^6.4", "symfony/var-exporter": "^6.4" @@ -2021,22 +2025,22 @@ "description": "Locale functions required by libphonenumber-for-php", "support": { "issues": "https://github.com/giggsey/Locale/issues", - "source": "https://github.com/giggsey/Locale/tree/2.8.0" + "source": "https://github.com/giggsey/Locale/tree/2.9.0" }, - "time": "2025-03-20T14:25:27+00:00" + "time": "2026-02-24T15:32:13+00:00" }, { "name": "imagine/imagine", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/php-imagine/Imagine.git", - "reference": "8b130cd281efdea67e52d5f0f998572eb62d2f04" + "reference": "f9ed796eefb77c2f0f2167e1d4e36bc2b5ed6b0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-imagine/Imagine/zipball/8b130cd281efdea67e52d5f0f998572eb62d2f04", - "reference": "8b130cd281efdea67e52d5f0f998572eb62d2f04", + "url": "https://api.github.com/repos/php-imagine/Imagine/zipball/f9ed796eefb77c2f0f2167e1d4e36bc2b5ed6b0c", + "reference": "f9ed796eefb77c2f0f2167e1d4e36bc2b5ed6b0c", "shasum": "" }, "require": { @@ -2083,9 +2087,9 @@ ], "support": { "issues": "https://github.com/php-imagine/Imagine/issues", - "source": "https://github.com/php-imagine/Imagine/tree/1.5.1" + "source": "https://github.com/php-imagine/Imagine/tree/1.5.2" }, - "time": "2025-12-09T15:27:47+00:00" + "time": "2026-01-09T10:45:12+00:00" }, { "name": "jms/metadata", @@ -2458,16 +2462,16 @@ }, { "name": "league/flysystem", - "version": "3.30.2", + "version": "3.33.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277" + "reference": "570b8871e0ce693764434b29154c54b434905350" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", - "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350", + "reference": "570b8871e0ce693764434b29154c54b434905350", "shasum": "" }, "require": { @@ -2535,32 +2539,32 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.30.2" + "source": "https://github.com/thephpleague/flysystem/tree/3.33.0" }, - "time": "2025-11-10T17:13:11+00:00" + "time": "2026-03-25T07:59:30+00:00" }, { "name": "league/flysystem-bundle", - "version": "3.6.1", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-bundle.git", - "reference": "61e7f989f14080abb14d5ade80629303691555cf" + "reference": "5eb41be38fc3759f74c9e458a6a5f0ef5f49284a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/61e7f989f14080abb14d5ade80629303691555cf", - "reference": "61e7f989f14080abb14d5ade80629303691555cf", + "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/5eb41be38fc3759f74c9e458a6a5f0ef5f49284a", + "reference": "5eb41be38fc3759f74c9e458a6a5f0ef5f49284a", "shasum": "" }, "require": { "league/flysystem": "^3.0", - "php": ">=8.0", - "symfony/config": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "php": ">=8.2", + "symfony/config": "^6.0 || ^7.0 || ^8.0", + "symfony/dependency-injection": "^6.0 || ^7.0 || ^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0 || ^8.0" + "symfony/http-kernel": "^6.0 || ^7.0 || ^8.0", + "symfony/options-resolver": "^6.0 || ^7.0 || ^8.0" }, "require-dev": { "doctrine/mongodb-odm": "^2.0", @@ -2575,10 +2579,10 @@ "league/flysystem-sftp-v3": "^3.1", "league/flysystem-webdav": "^3.29", "platformcommunity/flysystem-bunnycdn": "^3.3", - "symfony/dotenv": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0 || ^8.0" + "symfony/dotenv": "^6.0 || ^7.0 || ^8.0", + "symfony/framework-bundle": "^6.0 || ^7.0 || ^8.0", + "symfony/phpunit-bridge": "^6.0 || ^7.0 || ^8.0", + "symfony/var-dumper": "^6.0 || ^7.0 || ^8.0" }, "type": "symfony-bundle", "autoload": { @@ -2605,22 +2609,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-bundle/issues", - "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.6.1" + "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.7.0" }, - "time": "2025-12-11T15:40:58+00:00" + "time": "2026-03-28T22:14:56+00:00" }, { "name": "league/flysystem-local", - "version": "3.30.2", + "version": "3.31.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d" + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ab4f9d0d672f601b102936aa728801dd1a11968d", - "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", "shasum": "" }, "require": { @@ -2654,9 +2658,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.2" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" }, - "time": "2025-11-10T11:23:37+00:00" + "time": "2026-01-23T15:30:45+00:00" }, { "name": "league/mime-type-detection", @@ -2716,22 +2720,22 @@ }, { "name": "liip/imagine-bundle", - "version": "2.16.0", + "version": "2.17.1", "source": { "type": "git", "url": "https://github.com/liip/LiipImagineBundle.git", - "reference": "335121ef65d9841af9b40a850aa143cd6b61f847" + "reference": "69d2df3c6606495d1878fa190d6c3dc4bc5623b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/liip/LiipImagineBundle/zipball/335121ef65d9841af9b40a850aa143cd6b61f847", - "reference": "335121ef65d9841af9b40a850aa143cd6b61f847", + "url": "https://api.github.com/repos/liip/LiipImagineBundle/zipball/69d2df3c6606495d1878fa190d6c3dc4bc5623b6", + "reference": "69d2df3c6606495d1878fa190d6c3dc4bc5623b6", "shasum": "" }, "require": { "ext-mbstring": "*", "imagine/imagine": "^1.3.2", - "php": "^7.2|^8.0", + "php": "^8.0", "symfony/dependency-injection": "^5.4|^6.4|^7.4|^8.0", "symfony/deprecation-contracts": "^2.5 || ^3", "symfony/filesystem": "^5.4|^6.4|^7.3|^8.0", @@ -2760,6 +2764,7 @@ "symfony/form": "^5.4|^6.4|^7.3|^8.0", "symfony/messenger": "^5.4|^6.4|^7.3|^8.0", "symfony/phpunit-bridge": "^7.3", + "symfony/runtime": "^5.4|^6.4|^7.3|^8.0", "symfony/templating": "^5.4|^6.4|^7.3|^8.0", "symfony/validator": "^5.4|^6.4|^7.3|^8.0", "symfony/yaml": "^5.4|^6.4|^7.3|^8.0" @@ -2817,22 +2822,22 @@ ], "support": { "issues": "https://github.com/liip/LiipImagineBundle/issues", - "source": "https://github.com/liip/LiipImagineBundle/tree/2.16.0" + "source": "https://github.com/liip/LiipImagineBundle/tree/2.17.1" }, - "time": "2025-12-01T10:49:05+00:00" + "time": "2026-01-06T09:34:48+00:00" }, { "name": "maennchen/zipstream-php", - "version": "3.2.1", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5" + "reference": "77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5", - "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e", + "reference": "77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e", "shasum": "" }, "require": { @@ -2889,7 +2894,7 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.2" }, "funding": [ { @@ -2897,7 +2902,7 @@ "type": "github" } ], - "time": "2025-12-10T09:58:31+00:00" + "time": "2026-04-11T18:38:28+00:00" }, { "name": "markbaker/complex", @@ -3008,16 +3013,16 @@ }, { "name": "matomo/device-detector", - "version": "6.4.8", + "version": "6.5.0", "source": { "type": "git", "url": "https://github.com/matomo-org/device-detector.git", - "reference": "56baf981af4f192e15a4f369d4975af847a81ccb" + "reference": "e0fff2309dad83eb3cfb2564e524be715cfcf3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/56baf981af4f192e15a4f369d4975af847a81ccb", - "reference": "56baf981af4f192e15a4f369d4975af847a81ccb", + "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/e0fff2309dad83eb3cfb2564e524be715cfcf3cf", + "reference": "e0fff2309dad83eb3cfb2564e524be715cfcf3cf", "shasum": "" }, "require": { @@ -3031,14 +3036,13 @@ "matthiasmullie/scrapbook": "^1.4.7", "mayflower/mo4-coding-standard": "^v9.0.0", "phpstan/phpstan": "^1.10.44", - "phpunit/phpunit": "^8.5.8", - "psr/cache": "^1.0.1", - "psr/simple-cache": "^1.0.1", + "phpunit/phpunit": "^8.5.2 || ^9 || ^10 || ^11 || ^12", + "psr/cache": "^1.0.1 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0.1 || ^2.0 || ^3.0", "slevomat/coding-standard": "<8.16.0", "symfony/yaml": "^5.1.7" }, "suggest": { - "doctrine/cache": "Can directly be used for caching purpose", "ext-yaml": "Necessary for using the Pecl YAML parser" }, "type": "library", @@ -3074,20 +3078,20 @@ "source": "https://github.com/matomo-org/matomo", "wiki": "https://dev.matomo.org/" }, - "time": "2025-11-26T16:02:47+00:00" + "time": "2026-01-21T07:53:39+00:00" }, { "name": "monolog/monolog", - "version": "3.9.0", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", "shasum": "" }, "require": { @@ -3105,7 +3109,7 @@ "graylog2/gelf-php": "^1.4.2 || ^2.0", "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", + "mongodb/mongodb": "^1.8 || ^2.0", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.8", "phpstan/phpstan": "^2", @@ -3165,7 +3169,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" }, "funding": [ { @@ -3177,20 +3181,20 @@ "type": "tidelift" } ], - "time": "2025-03-24T10:02:05+00:00" + "time": "2026-01-02T08:56:05+00:00" }, { "name": "mpdf/mpdf", - "version": "v8.2.7", + "version": "v8.3.1", "source": { "type": "git", "url": "https://github.com/mpdf/mpdf.git", - "reference": "b59670a09498689c33ce639bac8f5ba26721dab3" + "reference": "2a454ec334109911fdb323a284c19dbf3f049810" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mpdf/mpdf/zipball/b59670a09498689c33ce639bac8f5ba26721dab3", - "reference": "b59670a09498689c33ce639bac8f5ba26721dab3", + "url": "https://api.github.com/repos/mpdf/mpdf/zipball/2a454ec334109911fdb323a284c19dbf3f049810", + "reference": "2a454ec334109911fdb323a284c19dbf3f049810", "shasum": "" }, "require": { @@ -3214,6 +3218,7 @@ }, "suggest": { "ext-bcmath": "Needed for generation of some types of barcodes", + "ext-imagick": "Needed if developing the Mpdf library", "ext-xml": "Needed mainly for SVG manipulation", "ext-zlib": "Needed for compression of embedded resources, such as fonts" }, @@ -3258,7 +3263,7 @@ "type": "custom" } ], - "time": "2025-12-01T10:18:02+00:00" + "time": "2026-03-11T10:58:44+00:00" }, { "name": "mpdf/psr-http-message-shim", @@ -3468,16 +3473,16 @@ }, { "name": "nelmio/cors-bundle", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioCorsBundle.git", - "reference": "530217472204881cacd3671909f634b960c7b948" + "reference": "3d80dbcd5d1eb5f8b20ed5199e1778d44c2e4d1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/530217472204881cacd3671909f634b960c7b948", - "reference": "530217472204881cacd3671909f634b960c7b948", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/3d80dbcd5d1eb5f8b20ed5199e1778d44c2e4d1c", + "reference": "3d80dbcd5d1eb5f8b20ed5199e1778d44c2e4d1c", "shasum": "" }, "require": { @@ -3527,22 +3532,22 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.6.0" + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.6.1" }, - "time": "2025-10-23T06:57:22+00:00" + "time": "2026-01-12T15:59:08+00:00" }, { "name": "nesbot/carbon", - "version": "3.11.0", + "version": "3.11.4", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", "shasum": "" }, "require": { @@ -3566,7 +3571,7 @@ "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan": "^2.1.22", "phpunit/phpunit": "^10.5.53", - "squizlabs/php_codesniffer": "^3.13.4" + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" }, "bin": [ "bin/carbon" @@ -3609,14 +3614,14 @@ } ], "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "homepage": "https://carbonphp.github.io/carbon/", "keywords": [ "date", "datetime", "time" ], "support": { - "docs": "https://carbon.nesbot.com/docs", + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", "issues": "https://github.com/CarbonPHP/carbon/issues", "source": "https://github.com/CarbonPHP/carbon" }, @@ -3634,7 +3639,7 @@ "type": "tidelift" } ], - "time": "2025-12-02T21:04:28+00:00" + "time": "2026-04-07T09:57:54+00:00" }, { "name": "paragonie/random_compat", @@ -3688,16 +3693,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "5.3.0", + "version": "5.7.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "4d597c1aacdde1805a33c525b9758113ea0d90df" + "reference": "9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/4d597c1aacdde1805a33c525b9758113ea0d90df", - "reference": "4d597c1aacdde1805a33c525b9758113ea0d90df", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8", + "reference": "9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8", "shasum": "" }, "require": { @@ -3705,6 +3710,7 @@ "ext-ctype": "*", "ext-dom": "*", "ext-fileinfo": "*", + "ext-filter": "*", "ext-gd": "*", "ext-iconv": "*", "ext-libxml": "*", @@ -3719,13 +3725,12 @@ "markbaker/complex": "^3.0", "markbaker/matrix": "^3.0", "php": "^8.1", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "dev-main", "dompdf/dompdf": "^2.0 || ^3.0", + "ext-intl": "*", "friendsofphp/php-cs-fixer": "^3.2", "mitoteam/jpgraph": "^10.5", "mpdf/mpdf": "^8.1.1", @@ -3739,7 +3744,7 @@ }, "suggest": { "dompdf/dompdf": "Option for rendering PDF with PDF Writer", - "ext-intl": "PHP Internationalization Functions, required for NumberFormat Wizard", + "ext-intl": "PHP Internationalization Functions, required for NumberFormat Wizard and StringHelper::setLocale()", "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mpdf/mpdf": "Option for rendering PDF with PDF Writer", "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" @@ -3772,6 +3777,9 @@ }, { "name": "Adrien Crivelli" + }, + { + "name": "Owen Leibman" } ], "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", @@ -3788,9 +3796,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.3.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.7.0" }, - "time": "2025-11-24T15:47:10+00:00" + "time": "2026-04-20T02:42:17+00:00" }, { "name": "psr/cache", @@ -3992,113 +4000,6 @@ }, "time": "2019-01-08T18:20:26+00:00" }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, { "name": "psr/http-message", "version": "2.0", @@ -4255,27 +4156,27 @@ }, { "name": "setasign/fpdi", - "version": "v2.6.4", + "version": "v2.6.6", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "4b53852fde2734ec6a07e458a085db627c60eada" + "reference": "de0cf35911be3e9ea63b48e0f307883b1c7c48ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada", - "reference": "4b53852fde2734ec6a07e458a085db627c60eada", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/de0cf35911be3e9ea63b48e0f307883b1c7c48ac", + "reference": "de0cf35911be3e9ea63b48e0f307883b1c7c48ac", "shasum": "" }, "require": { "ext-zlib": "*", - "php": "^7.1 || ^8.0" + "php": ">=7.2 <=8.5.99999" }, "conflict": { "setasign/tfpdf": "<1.31" }, "require-dev": { - "phpunit/phpunit": "^7", + "phpunit/phpunit": "^8.5.52", "setasign/fpdf": "~1.8.6", "setasign/tfpdf": "~1.33", "squizlabs/php_codesniffer": "^3.5", @@ -4315,7 +4216,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.6.4" + "source": "https://github.com/Setasign/FPDI/tree/v2.6.6" }, "funding": [ { @@ -4323,7 +4224,7 @@ "type": "tidelift" } ], - "time": "2025-08-05T09:57:14+00:00" + "time": "2026-03-13T08:38:20+00:00" }, { "name": "spatie/schema-org", @@ -4426,16 +4327,16 @@ }, { "name": "symfony/asset", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "e07d70cfca384c1eabee192fdeedb6850c1c840b" + "reference": "72eca261f3af1bef741c48bb2c91a4e619dca03a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/e07d70cfca384c1eabee192fdeedb6850c1c840b", - "reference": "e07d70cfca384c1eabee192fdeedb6850c1c840b", + "url": "https://api.github.com/repos/symfony/asset/zipball/72eca261f3af1bef741c48bb2c91a4e619dca03a", + "reference": "72eca261f3af1bef741c48bb2c91a4e619dca03a", "shasum": "" }, "require": { @@ -4472,7 +4373,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v8.0.0" + "source": "https://github.com/symfony/asset/tree/v8.0.8" }, "funding": [ { @@ -4492,20 +4393,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/bluesky-notifier", - "version": "v8.0.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/bluesky-notifier.git", - "reference": "7c940372852150a7cfb35842a9e92164340f248f" + "reference": "dd5c342510ea5fcff25d3ec9bb9c31598986a464" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/bluesky-notifier/zipball/7c940372852150a7cfb35842a9e92164340f248f", - "reference": "7c940372852150a7cfb35842a9e92164340f248f", + "url": "https://api.github.com/repos/symfony/bluesky-notifier/zipball/dd5c342510ea5fcff25d3ec9bb9c31598986a464", + "reference": "dd5c342510ea5fcff25d3ec9bb9c31598986a464", "shasum": "" }, "require": { @@ -4553,7 +4454,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/bluesky-notifier/tree/v8.0.0" + "source": "https://github.com/symfony/bluesky-notifier/tree/v8.0.4" }, "funding": [ { @@ -4573,20 +4474,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-01-08T08:40:07+00:00" }, { "name": "symfony/cache", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "0e67dc8145810d4e1c0d13c0e1d29ceb930b1c8e" + "reference": "2866a183cd942bbaa81e9fdbd1ef1ea902c5ee2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/0e67dc8145810d4e1c0d13c0e1d29ceb930b1c8e", - "reference": "0e67dc8145810d4e1c0d13c0e1d29ceb930b1c8e", + "url": "https://api.github.com/repos/symfony/cache/zipball/2866a183cd942bbaa81e9fdbd1ef1ea902c5ee2d", + "reference": "2866a183cd942bbaa81e9fdbd1ef1ea902c5ee2d", "shasum": "" }, "require": { @@ -4653,7 +4554,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v8.0.1" + "source": "https://github.com/symfony/cache/tree/v8.0.9" }, "funding": [ { @@ -4673,7 +4574,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:17:06+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/cache-contracts", @@ -4753,16 +4654,16 @@ }, { "name": "symfony/clock", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f" + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f", + "url": "https://api.github.com/repos/symfony/clock/zipball/b55a638b189a6faa875e0ccdb00908fb87af95b3", + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3", "shasum": "" }, "require": { @@ -4806,7 +4707,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v8.0.0" + "source": "https://github.com/symfony/clock/tree/v8.0.8" }, "funding": [ { @@ -4826,20 +4727,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:46:48+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/config", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "a5a054e613da565d46183a845ae4c0c996a3fbce" + "reference": "7e712ee3c98ec114f674adc4fbad4c2fe7526b9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/a5a054e613da565d46183a845ae4c0c996a3fbce", - "reference": "a5a054e613da565d46183a845ae4c0c996a3fbce", + "url": "https://api.github.com/repos/symfony/config/zipball/7e712ee3c98ec114f674adc4fbad4c2fe7526b9c", + "reference": "7e712ee3c98ec114f674adc4fbad4c2fe7526b9c", "shasum": "" }, "require": { @@ -4884,7 +4785,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v8.0.1" + "source": "https://github.com/symfony/config/tree/v8.0.9" }, "funding": [ { @@ -4904,20 +4805,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/console", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fcb73f69d655b48fcb894a262f074218df08bd58" + "reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fcb73f69d655b48fcb894a262f074218df08bd58", - "reference": "fcb73f69d655b48fcb894a262f074218df08bd58", + "url": "https://api.github.com/repos/symfony/console/zipball/7113778e2e91f4709cb3194a75dfa9c0d028d94d", + "reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d", "shasum": "" }, "require": { @@ -4974,7 +4875,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.0.1" + "source": "https://github.com/symfony/console/tree/v8.0.9" }, "funding": [ { @@ -4994,20 +4895,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T15:25:33+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/dependency-injection", - "version": "v8.0.2", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "90f6c3364b8f444f85bdb6939664c80af9e0d576" + "reference": "85d359a3f72b8e1ae1466b4330149318442e3a8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/90f6c3364b8f444f85bdb6939664c80af9e0d576", - "reference": "90f6c3364b8f444f85bdb6939664c80af9e0d576", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/85d359a3f72b8e1ae1466b4330149318442e3a8c", + "reference": "85d359a3f72b8e1ae1466b4330149318442e3a8c", "shasum": "" }, "require": { @@ -5055,7 +4956,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v8.0.2" + "source": "https://github.com/symfony/dependency-injection/tree/v8.0.9" }, "funding": [ { @@ -5075,7 +4976,7 @@ "type": "tidelift" } ], - "time": "2025-12-08T06:57:48+00:00" + "time": "2026-04-30T18:39:49+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5146,16 +5047,16 @@ }, { "name": "symfony/discord-notifier", - "version": "v8.0.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/discord-notifier.git", - "reference": "4e6f718de9b67d664eaf01a70ea4ad2053a1ddf3" + "reference": "d7ca3847f933edb1c3ab7cf1a1321eca5eaa9e4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/discord-notifier/zipball/4e6f718de9b67d664eaf01a70ea4ad2053a1ddf3", - "reference": "4e6f718de9b67d664eaf01a70ea4ad2053a1ddf3", + "url": "https://api.github.com/repos/symfony/discord-notifier/zipball/d7ca3847f933edb1c3ab7cf1a1321eca5eaa9e4f", + "reference": "d7ca3847f933edb1c3ab7cf1a1321eca5eaa9e4f", "shasum": "" }, "require": { @@ -5194,7 +5095,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/discord-notifier/tree/v8.0.0" + "source": "https://github.com/symfony/discord-notifier/tree/v8.0.4" }, "funding": [ { @@ -5214,20 +5115,20 @@ "type": "tidelift" } ], - "time": "2025-09-01T09:26:06+00:00" + "time": "2026-01-05T09:27:50+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "f57b37e61ab378bca98ffa038a786a24d574bec6" + "reference": "dfe3dddc9c22756b9b145785fb5fd4b0445cd06e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/f57b37e61ab378bca98ffa038a786a24d574bec6", - "reference": "f57b37e61ab378bca98ffa038a786a24d574bec6", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/dfe3dddc9c22756b9b145785fb5fd4b0445cd06e", + "reference": "dfe3dddc9c22756b9b145785fb5fd4b0445cd06e", "shasum": "" }, "require": { @@ -5296,7 +5197,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v8.0.1" + "source": "https://github.com/symfony/doctrine-bridge/tree/v8.0.9" }, "funding": [ { @@ -5316,20 +5217,20 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:17:06+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v8.0.1", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "9d833a2f48966629956577a4acccbccfe37e9be3" + "reference": "88329a3faba5023cfb569b3fc5b8a771336c4a88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/9d833a2f48966629956577a4acccbccfe37e9be3", - "reference": "9d833a2f48966629956577a4acccbccfe37e9be3", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/88329a3faba5023cfb569b3fc5b8a771336c4a88", + "reference": "88329a3faba5023cfb569b3fc5b8a771336c4a88", "shasum": "" }, "require": { @@ -5372,7 +5273,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v8.0.1" + "source": "https://github.com/symfony/doctrine-messenger/tree/v8.0.6" }, "funding": [ { @@ -5392,20 +5293,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-02-20T07:51:53+00:00" }, { "name": "symfony/dotenv", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "460b4067a85288c59a59ce8c1bfb3942e71fd85c" + "reference": "f75c67be2c2648741c4b163546002e34265bcb91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/460b4067a85288c59a59ce8c1bfb3942e71fd85c", - "reference": "460b4067a85288c59a59ce8c1bfb3942e71fd85c", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/f75c67be2c2648741c4b163546002e34265bcb91", + "reference": "f75c67be2c2648741c4b163546002e34265bcb91", "shasum": "" }, "require": { @@ -5446,7 +5347,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v8.0.0" + "source": "https://github.com/symfony/dotenv/tree/v8.0.9" }, "funding": [ { @@ -5466,20 +5367,20 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:17:21+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/error-handler", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "d77ec7dda0c274178745d152e82baf7ea827fd73" + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d77ec7dda0c274178745d152e82baf7ea827fd73", - "reference": "d77ec7dda0c274178745d152e82baf7ea827fd73", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1119fe8dcfc3825ec74ec061b96ef0c8f281517", + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517", "shasum": "" }, "require": { @@ -5527,7 +5428,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v8.0.0" + "source": "https://github.com/symfony/error-handler/tree/v8.0.8" }, "funding": [ { @@ -5547,20 +5448,20 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "573f95783a2ec6e38752979db139f09fec033f03" + "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/573f95783a2ec6e38752979db139f09fec033f03", - "reference": "573f95783a2ec6e38752979db139f09fec033f03", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0c3c1a17604c4dbbec4b93fe162c538482096e1f", + "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f", "shasum": "" }, "require": { @@ -5612,7 +5513,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.9" }, "funding": [ { @@ -5632,7 +5533,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T14:17:19+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5712,16 +5613,16 @@ }, { "name": "symfony/filesystem", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d" + "reference": "d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40", + "reference": "d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40", "shasum": "" }, "require": { @@ -5758,7 +5659,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v8.0.1" + "source": "https://github.com/symfony/filesystem/tree/v8.0.9" }, "funding": [ { @@ -5778,20 +5679,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/finder", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291" + "reference": "8da41214757b87d97f181e3d14a4179286151007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7598dd5770580fa3517ec83e8da0c9b9e01f4291", - "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291", + "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007", + "reference": "8da41214757b87d97f181e3d14a4179286151007", "shasum": "" }, "require": { @@ -5826,7 +5727,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.0.0" + "source": "https://github.com/symfony/finder/tree/v8.0.8" }, "funding": [ { @@ -5846,7 +5747,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/flex", @@ -5923,16 +5824,16 @@ }, { "name": "symfony/form", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "02bd42a77e595298dcfef4ec259f4adda332fadb" + "reference": "dd9f73dd3b92e657c97aeeca1f47e981c635ea91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/02bd42a77e595298dcfef4ec259f4adda332fadb", - "reference": "02bd42a77e595298dcfef4ec259f4adda332fadb", + "url": "https://api.github.com/repos/symfony/form/zipball/dd9f73dd3b92e657c97aeeca1f47e981c635ea91", + "reference": "dd9f73dd3b92e657c97aeeca1f47e981c635ea91", "shasum": "" }, "require": { @@ -5994,7 +5895,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v8.0.1" + "source": "https://github.com/symfony/form/tree/v8.0.9" }, "funding": [ { @@ -6014,20 +5915,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/framework-bundle", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "194b5edd7a00703aaf836b56bbf079cd6c4d4a87" + "reference": "ec5e749f011a477d9a5d422f50ad6bdc2820c5cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/194b5edd7a00703aaf836b56bbf079cd6c4d4a87", - "reference": "194b5edd7a00703aaf836b56bbf079cd6c4d4a87", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ec5e749f011a477d9a5d422f50ad6bdc2820c5cd", + "reference": "ec5e749f011a477d9a5d422f50ad6bdc2820c5cd", "shasum": "" }, "require": { @@ -6035,8 +5936,8 @@ "ext-xml": "*", "php": ">=8.4", "symfony/cache": "^7.4|^8.0", - "symfony/config": "^7.4|^8.0", - "symfony/dependency-injection": "^7.4|^8.0", + "symfony/config": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^7.4.4|^8.0.4", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^7.4|^8.0", "symfony/event-dispatcher": "^7.4|^8.0", @@ -6050,12 +5951,13 @@ }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/console": "<7.4", "symfony/form": "<7.4", "symfony/json-streamer": "<7.4", "symfony/messenger": "<7.4", + "symfony/mime": "<7.4.9|>=8.0,<8.0.9", "symfony/security-csrf": "<7.4", "symfony/serializer": "<7.4", "symfony/translation": "<7.4", @@ -6065,7 +5967,7 @@ "require-dev": { "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", "symfony/asset": "^7.4|^8.0", @@ -6084,9 +5986,9 @@ "symfony/lock": "^7.4|^8.0", "symfony/mailer": "^7.4|^8.0", "symfony/messenger": "^7.4|^8.0", - "symfony/mime": "^7.4|^8.0", + "symfony/mime": "^7.4.9|^8.0.9", "symfony/notifier": "^7.4|^8.0", - "symfony/object-mapper": "^7.4|^8.0", + "symfony/object-mapper": "^7.4.9|^8.0.9", "symfony/polyfill-intl-icu": "^1.0", "symfony/process": "^7.4|^8.0", "symfony/property-info": "^7.4|^8.0", @@ -6134,7 +6036,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v8.0.1" + "source": "https://github.com/symfony/framework-bundle/tree/v8.0.9" }, "funding": [ { @@ -6154,20 +6056,20 @@ "type": "tidelift" } ], - "time": "2025-12-06T16:55:34+00:00" + "time": "2026-04-30T09:11:52+00:00" }, { "name": "symfony/http-client", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "727fda60d0aebfdfcc4c8bc4661f0cb8f44153c0" + "reference": "537c7f164078975b800f3f1c56810791024e4c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/727fda60d0aebfdfcc4c8bc4661f0cb8f44153c0", - "reference": "727fda60d0aebfdfcc4c8bc4661f0cb8f44153c0", + "url": "https://api.github.com/repos/symfony/http-client/zipball/537c7f164078975b800f3f1c56810791024e4c77", + "reference": "537c7f164078975b800f3f1c56810791024e4c77", "shasum": "" }, "require": { @@ -6230,7 +6132,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v8.0.1" + "source": "https://github.com/symfony/http-client/tree/v8.0.9" }, "funding": [ { @@ -6250,7 +6152,7 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/http-client-contracts", @@ -6332,16 +6234,16 @@ }, { "name": "symfony/http-foundation", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "3690740e2e8b19d877f20d4f10b7a489cddf0fe2" + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3690740e2e8b19d877f20d4f10b7a489cddf0fe2", - "reference": "3690740e2e8b19d877f20d4f10b7a489cddf0fe2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/02656f7ebeae5c155d659e946f6b3a33df24051b", + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b", "shasum": "" }, "require": { @@ -6388,7 +6290,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v8.0.1" + "source": "https://github.com/symfony/http-foundation/tree/v8.0.8" }, "funding": [ { @@ -6408,20 +6310,20 @@ "type": "tidelift" } ], - "time": "2025-12-07T11:23:24+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.0.2", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "bcef77a3c8ae8934ce7067172e2a1a6491a62a7d" + "reference": "1770f6818d83b2fddc12185025b93f39a90cb628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/bcef77a3c8ae8934ce7067172e2a1a6491a62a7d", - "reference": "bcef77a3c8ae8934ce7067172e2a1a6491a62a7d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1770f6818d83b2fddc12185025b93f39a90cb628", + "reference": "1770f6818d83b2fddc12185025b93f39a90cb628", "shasum": "" }, "require": { @@ -6492,7 +6394,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v8.0.2" + "source": "https://github.com/symfony/http-kernel/tree/v8.0.8" }, "funding": [ { @@ -6512,20 +6414,20 @@ "type": "tidelift" } ], - "time": "2025-12-08T07:59:34+00:00" + "time": "2026-03-31T21:14:05+00:00" }, { "name": "symfony/intl", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "f9eca217ae8f2be0b3ad80723d6a3b518b90cd66" + "reference": "604a1dbbd67471e885e93274379cadd80dc33535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/f9eca217ae8f2be0b3ad80723d6a3b518b90cd66", - "reference": "f9eca217ae8f2be0b3ad80723d6a3b518b90cd66", + "url": "https://api.github.com/repos/symfony/intl/zipball/604a1dbbd67471e885e93274379cadd80dc33535", + "reference": "604a1dbbd67471e885e93274379cadd80dc33535", "shasum": "" }, "require": { @@ -6581,7 +6483,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v8.0.1" + "source": "https://github.com/symfony/intl/tree/v8.0.8" }, "funding": [ { @@ -6601,20 +6503,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/mailer", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f9b546f0e28cbd08fd5d03f2472aad913a9398f9" + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f9b546f0e28cbd08fd5d03f2472aad913a9398f9", - "reference": "f9b546f0e28cbd08fd5d03f2472aad913a9398f9", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ca5f6edaf8780ece814404b58a4482b22b509c56", + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56", "shasum": "" }, "require": { @@ -6661,7 +6563,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.0.0" + "source": "https://github.com/symfony/mailer/tree/v8.0.8" }, "funding": [ { @@ -6681,7 +6583,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/mastodon-notifier", @@ -6759,16 +6661,16 @@ }, { "name": "symfony/messenger", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "c37b86c313e26291c5defe9194bcf31cbe630fbc" + "reference": "ef41ccc1f80dd2ded64ad9d765b28644964532dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/c37b86c313e26291c5defe9194bcf31cbe630fbc", - "reference": "c37b86c313e26291c5defe9194bcf31cbe630fbc", + "url": "https://api.github.com/repos/symfony/messenger/zipball/ef41ccc1f80dd2ded64ad9d765b28644964532dd", + "reference": "ef41ccc1f80dd2ded64ad9d765b28644964532dd", "shasum": "" }, "require": { @@ -6778,7 +6680,9 @@ }, "conflict": { "symfony/console": "<7.4", - "symfony/event-dispatcher-contracts": "<2.5" + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/lock": "<7.4", + "symfony/serializer": "<7.4.4|>=8.0,<8.0.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", @@ -6791,7 +6695,7 @@ "symfony/property-access": "^7.4|^8.0", "symfony/rate-limiter": "^7.4|^8.0", "symfony/routing": "^7.4|^8.0", - "symfony/serializer": "^7.4|^8.0", + "symfony/serializer": "^7.4.4|^8.0.4", "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^7.4|^8.0", "symfony/validator": "^7.4|^8.0", @@ -6823,7 +6727,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v8.0.0" + "source": "https://github.com/symfony/messenger/tree/v8.0.9" }, "funding": [ { @@ -6843,20 +6747,20 @@ "type": "tidelift" } ], - "time": "2025-11-06T11:20:17+00:00" + "time": "2026-04-30T13:47:26+00:00" }, { "name": "symfony/mime", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7576ce3b2b4d3a2a7fe7020a07a392065d6ffd40" + "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7576ce3b2b4d3a2a7fe7020a07a392065d6ffd40", - "reference": "7576ce3b2b4d3a2a7fe7020a07a392065d6ffd40", + "url": "https://api.github.com/repos/symfony/mime/zipball/a9fcb293650c054b62a5b406f4e92e7b711ea333", + "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333", "shasum": "" }, "require": { @@ -6866,13 +6770,13 @@ }, "conflict": { "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0" + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1" }, "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", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/dependency-injection": "^7.4|^8.0", "symfony/process": "^7.4|^8.0", "symfony/property-access": "^7.4|^8.0", @@ -6909,7 +6813,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v8.0.0" + "source": "https://github.com/symfony/mime/tree/v8.0.9" }, "funding": [ { @@ -6929,20 +6833,20 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:17:21+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "6dd0793eb9ebcecb0b909a5571ac6e82867d7b20" + "reference": "4b7249b1520773ad325e99231b08443017729297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/6dd0793eb9ebcecb0b909a5571ac6e82867d7b20", - "reference": "6dd0793eb9ebcecb0b909a5571ac6e82867d7b20", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/4b7249b1520773ad325e99231b08443017729297", + "reference": "4b7249b1520773ad325e99231b08443017729297", "shasum": "" }, "require": { @@ -6986,7 +6890,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v8.0.0" + "source": "https://github.com/symfony/monolog-bridge/tree/v8.0.9" }, "funding": [ { @@ -7006,20 +6910,20 @@ "type": "tidelift" } ], - "time": "2025-11-01T09:19:23+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v4.0.1", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66" + "reference": "c012c6aba13129eb02aa7dd61e66e720911d8598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/3b4ee2717ee56c5e1edb516140a175eb2a72bc66", - "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/c012c6aba13129eb02aa7dd61e66e720911d8598", + "reference": "c012c6aba13129eb02aa7dd61e66e720911d8598", "shasum": "" }, "require": { @@ -7065,7 +6969,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v4.0.1" + "source": "https://github.com/symfony/monolog-bundle/tree/v4.0.2" }, "funding": [ { @@ -7085,20 +6989,20 @@ "type": "tidelift" } ], - "time": "2025-12-08T08:00:13+00:00" + "time": "2026-04-02T18:27:21+00:00" }, { "name": "symfony/notifier", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/notifier.git", - "reference": "dad36a1aacda8c0c9f2ec2e1f70111da6cb7228f" + "reference": "e65ae16a36900c92e977733fcee22d47f79c3601" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/notifier/zipball/dad36a1aacda8c0c9f2ec2e1f70111da6cb7228f", - "reference": "dad36a1aacda8c0c9f2ec2e1f70111da6cb7228f", + "url": "https://api.github.com/repos/symfony/notifier/zipball/e65ae16a36900c92e977733fcee22d47f79c3601", + "reference": "e65ae16a36900c92e977733fcee22d47f79c3601", "shasum": "" }, "require": { @@ -7110,7 +7014,9 @@ "symfony/http-client-contracts": "<2.5" }, "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/http-client": "^7.4|^8.0", "symfony/http-client-contracts": "^2.5|^3", "symfony/http-foundation": "^7.4|^8.0", "symfony/messenger": "^7.4|^8.0" @@ -7145,7 +7051,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/notifier/tree/v8.0.0" + "source": "https://github.com/symfony/notifier/tree/v8.0.8" }, "funding": [ { @@ -7165,20 +7071,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/options-resolver", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7" + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d2b592535ffa6600c265a3893a7f7fd2bad82dd7", - "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b48bce0a70b914f6953dafbd10474df232ed4de8", + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8", "shasum": "" }, "require": { @@ -7216,7 +7122,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v8.0.0" + "source": "https://github.com/symfony/options-resolver/tree/v8.0.8" }, "funding": [ { @@ -7236,20 +7142,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:55:31+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/password-hasher", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "80e7c7e3fdb27214ba3af9fd449cb638aa98daa4" + "reference": "57ee968d3c38301ed3e5b838f850a10f2d06a7f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/80e7c7e3fdb27214ba3af9fd449cb638aa98daa4", - "reference": "80e7c7e3fdb27214ba3af9fd449cb638aa98daa4", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/57ee968d3c38301ed3e5b838f850a10f2d06a7f6", + "reference": "57ee968d3c38301ed3e5b838f850a10f2d06a7f6", "shasum": "" }, "require": { @@ -7289,7 +7195,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v8.0.0" + "source": "https://github.com/symfony/password-hasher/tree/v8.0.8" }, "funding": [ { @@ -7309,20 +7215,20 @@ "type": "tidelift" } ], - "time": "2025-08-13T16:50:52+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", "shasum": "" }, "require": { @@ -7371,7 +7277,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" }, "funding": [ { @@ -7391,20 +7297,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-04-26T13:13:48+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" + "reference": "3510b63d07376b04e57e27e82607d468bb134f78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3510b63d07376b04e57e27e82607d468bb134f78", + "reference": "3510b63d07376b04e57e27e82607d468bb134f78", "shasum": "" }, "require": { @@ -7459,7 +7365,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.37.0" }, "funding": [ { @@ -7479,11 +7385,11 @@ "type": "tidelift" } ], - "time": "2025-06-20T22:24:30+00:00" + "time": "2026-04-10T16:50:15+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -7546,7 +7452,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.37.0" }, "funding": [ { @@ -7570,7 +7476,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -7631,7 +7537,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" }, "funding": [ { @@ -7655,16 +7561,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { @@ -7716,7 +7622,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" }, "funding": [ { @@ -7736,20 +7642,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", "shasum": "" }, "require": { @@ -7796,7 +7702,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" }, "funding": [ { @@ -7816,20 +7722,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-04-10T18:47:49+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/fcfa4973a9917cef23f2e38774da74a2b7d115ee", + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee", "shasum": "" }, "require": { @@ -7876,7 +7782,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.37.0" }, "funding": [ { @@ -7896,20 +7802,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-04-26T13:10:57+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", "shasum": "" }, "require": { @@ -7959,7 +7865,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" }, "funding": [ { @@ -7979,20 +7885,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/process", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149" + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/a0a750500c4ce900d69ba4e9faf16f82c10ee149", - "reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149", + "url": "https://api.github.com/repos/symfony/process/zipball/cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", "shasum": "" }, "require": { @@ -8024,7 +7930,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.0.0" + "source": "https://github.com/symfony/process/tree/v8.0.8" }, "funding": [ { @@ -8044,25 +7950,25 @@ "type": "tidelift" } ], - "time": "2025-10-16T16:25:44+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/property-access", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "74df691dfb7f9b161b7d8cd1695bb918c68f16b5" + "reference": "704c7808116fcdd67327db7b17de56b8ef6169e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/74df691dfb7f9b161b7d8cd1695bb918c68f16b5", - "reference": "74df691dfb7f9b161b7d8cd1695bb918c68f16b5", + "url": "https://api.github.com/repos/symfony/property-access/zipball/704c7808116fcdd67327db7b17de56b8ef6169e4", + "reference": "704c7808116fcdd67327db7b17de56b8ef6169e4", "shasum": "" }, "require": { "php": ">=8.4", - "symfony/property-info": "^7.4|^8.0" + "symfony/property-info": "^7.4.4|^8.0.4" }, "require-dev": { "symfony/cache": "^7.4|^8.0", @@ -8105,7 +8011,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v8.0.0" + "source": "https://github.com/symfony/property-access/tree/v8.0.8" }, "funding": [ { @@ -8125,33 +8031,33 @@ "type": "tidelift" } ], - "time": "2025-08-12T11:06:01+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/property-info", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "afbad53529b39e4c48a3584d87d0afef2375ee31" + "reference": "c21711980653360d6ef5c26d0f9ca6f58a1135c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/afbad53529b39e4c48a3584d87d0afef2375ee31", - "reference": "afbad53529b39e4c48a3584d87d0afef2375ee31", + "url": "https://api.github.com/repos/symfony/property-info/zipball/c21711980653360d6ef5c26d0f9ca6f58a1135c6", + "reference": "c21711980653360d6ef5c26d0f9ca6f58a1135c6", "shasum": "" }, "require": { "php": ">=8.4", "symfony/string": "^7.4|^8.0", - "symfony/type-info": "^7.4.1|^8.0.1" + "symfony/type-info": "^7.4.7|^8.0.7" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "symfony/cache": "^7.4|^8.0", "symfony/dependency-injection": "^7.4|^8.0", @@ -8191,7 +8097,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v8.0.1" + "source": "https://github.com/symfony/property-info/tree/v8.0.8" }, "funding": [ { @@ -8211,20 +8117,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/rate-limiter", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "1d4e173cafccecf3fdc167536c33d599f6c1c9e0" + "reference": "6720f250f1e627043439d93754a555662144f883" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/1d4e173cafccecf3fdc167536c33d599f6c1c9e0", - "reference": "1d4e173cafccecf3fdc167536c33d599f6c1c9e0", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/6720f250f1e627043439d93754a555662144f883", + "reference": "6720f250f1e627043439d93754a555662144f883", "shasum": "" }, "require": { @@ -8265,7 +8171,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v8.0.0" + "source": "https://github.com/symfony/rate-limiter/tree/v8.0.9" }, "funding": [ { @@ -8285,20 +8191,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/redis-messenger", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/redis-messenger.git", - "reference": "c4af44773ab26e37b566260d90e6de4927c598dd" + "reference": "d3e882f7b9ce1ca93e529de7cc79f55fad9af4a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/c4af44773ab26e37b566260d90e6de4927c598dd", - "reference": "c4af44773ab26e37b566260d90e6de4927c598dd", + "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/d3e882f7b9ce1ca93e529de7cc79f55fad9af4a7", + "reference": "d3e882f7b9ce1ca93e529de7cc79f55fad9af4a7", "shasum": "" }, "require": { @@ -8341,7 +8247,7 @@ "description": "Symfony Redis extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/redis-messenger/tree/v8.0.0" + "source": "https://github.com/symfony/redis-messenger/tree/v8.0.8" }, "funding": [ { @@ -8361,20 +8267,20 @@ "type": "tidelift" } ], - "time": "2025-11-08T16:30:39+00:00" + "time": "2026-03-17T14:00:10+00:00" }, { "name": "symfony/routing", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "bc8fa314a61fb7c4190e964b18a5bd000d3b45ce" + "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/bc8fa314a61fb7c4190e964b18a5bd000d3b45ce", - "reference": "bc8fa314a61fb7c4190e964b18a5bd000d3b45ce", + "url": "https://api.github.com/repos/symfony/routing/zipball/75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038", + "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038", "shasum": "" }, "require": { @@ -8421,7 +8327,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v8.0.1" + "source": "https://github.com/symfony/routing/tree/v8.0.9" }, "funding": [ { @@ -8441,20 +8347,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/runtime", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "73b34037b23db051048ba2873031ddb89be9f19d" + "reference": "30884f00e017a26100fcd9aa281082ebf9a87dce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/73b34037b23db051048ba2873031ddb89be9f19d", - "reference": "73b34037b23db051048ba2873031ddb89be9f19d", + "url": "https://api.github.com/repos/symfony/runtime/zipball/30884f00e017a26100fcd9aa281082ebf9a87dce", + "reference": "30884f00e017a26100fcd9aa281082ebf9a87dce", "shasum": "" }, "require": { @@ -8504,7 +8410,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v8.0.1" + "source": "https://github.com/symfony/runtime/tree/v8.0.8" }, "funding": [ { @@ -8524,20 +8430,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/scheduler", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/scheduler.git", - "reference": "01eb236fda2f1a6472e3b64b41f70b862f2908b3" + "reference": "d198c648959769cbb45c9bf74dc603faf3221e0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/scheduler/zipball/01eb236fda2f1a6472e3b64b41f70b862f2908b3", - "reference": "01eb236fda2f1a6472e3b64b41f70b862f2908b3", + "url": "https://api.github.com/repos/symfony/scheduler/zipball/d198c648959769cbb45c9bf74dc603faf3221e0b", + "reference": "d198c648959769cbb45c9bf74dc603faf3221e0b", "shasum": "" }, "require": { @@ -8589,7 +8495,7 @@ "scheduler" ], "support": { - "source": "https://github.com/symfony/scheduler/tree/v8.0.0" + "source": "https://github.com/symfony/scheduler/tree/v8.0.9" }, "funding": [ { @@ -8609,20 +8515,20 @@ "type": "tidelift" } ], - "time": "2025-10-01T14:43:00+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/security-bundle", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "fa06c8b5b8e7c1290827a7ac6d16f3203b54e1b2" + "reference": "00a13be2abf3fe9baf54e1e16e7583ca9c708f09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/fa06c8b5b8e7c1290827a7ac6d16f3203b54e1b2", - "reference": "fa06c8b5b8e7c1290827a7ac6d16f3203b54e1b2", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/00a13be2abf3fe9baf54e1e16e7583ca9c708f09", + "reference": "00a13be2abf3fe9baf54e1e16e7583ca9c708f09", "shasum": "" }, "require": { @@ -8689,7 +8595,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/security-bundle/tree/v8.0.8" }, "funding": [ { @@ -8709,20 +8615,20 @@ "type": "tidelift" } ], - "time": "2025-11-14T10:04:00+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/security-core", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "a8e8cd91374f02c58e48d4d60ea30875179410b5" + "reference": "8456ed58e22f59a4c50f50d7dd82b2f41d162c5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/a8e8cd91374f02c58e48d4d60ea30875179410b5", - "reference": "a8e8cd91374f02c58e48d4d60ea30875179410b5", + "url": "https://api.github.com/repos/symfony/security-core/zipball/8456ed58e22f59a4c50f50d7dd82b2f41d162c5f", + "reference": "8456ed58e22f59a4c50f50d7dd82b2f41d162c5f", "shasum": "" }, "require": { @@ -8771,7 +8677,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v8.0.0" + "source": "https://github.com/symfony/security-core/tree/v8.0.8" }, "funding": [ { @@ -8791,20 +8697,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "symfony/security-csrf", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "ee98194163a0acd06a8079de32f06cc8e03884f6" + "reference": "83c8f60ef8d385c05ea863093c9efabe74800883" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/ee98194163a0acd06a8079de32f06cc8e03884f6", - "reference": "ee98194163a0acd06a8079de32f06cc8e03884f6", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/83c8f60ef8d385c05ea863093c9efabe74800883", + "reference": "83c8f60ef8d385c05ea863093c9efabe74800883", "shasum": "" }, "require": { @@ -8842,7 +8748,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v8.0.0" + "source": "https://github.com/symfony/security-csrf/tree/v8.0.8" }, "funding": [ { @@ -8862,20 +8768,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/security-http", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "6bd07ace6a4cf7f082bf6cf30f084068bdde07c8" + "reference": "51fff88fc8436e42b4d92cae005f86b9233e0f88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/6bd07ace6a4cf7f082bf6cf30f084068bdde07c8", - "reference": "6bd07ace6a4cf7f082bf6cf30f084068bdde07c8", + "url": "https://api.github.com/repos/symfony/security-http/zipball/51fff88fc8436e42b4d92cae005f86b9233e0f88", + "reference": "51fff88fc8436e42b4d92cae005f86b9233e0f88", "shasum": "" }, "require": { @@ -8929,7 +8835,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v8.0.1" + "source": "https://github.com/symfony/security-http/tree/v8.0.9" }, "funding": [ { @@ -8949,7 +8855,7 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/service-contracts", @@ -9040,16 +8946,16 @@ }, { "name": "symfony/stopwatch", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942" + "reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/67df1914c6ccd2d7b52f70d40cf2aea02159d942", - "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/85954ed72d5440ea4dc9a10b7e49e01df766ffa3", + "reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3", "shasum": "" }, "require": { @@ -9082,7 +8988,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v8.0.0" + "source": "https://github.com/symfony/stopwatch/tree/v8.0.8" }, "funding": [ { @@ -9102,20 +9008,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/string", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc" + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ba65a969ac918ce0cc3edfac6cdde847eba231dc", - "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc", + "url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963", + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963", "shasum": "" }, "require": { @@ -9172,7 +9078,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.0.1" + "source": "https://github.com/symfony/string/tree/v8.0.8" }, "funding": [ { @@ -9192,20 +9098,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/telegram-notifier", - "version": "v8.0.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/telegram-notifier.git", - "reference": "baedbebe9081855bcc5dc73f66abff3e903f0864" + "reference": "d167b836e1b3151da30b3c52d4d0579ccc235306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/telegram-notifier/zipball/baedbebe9081855bcc5dc73f66abff3e903f0864", - "reference": "baedbebe9081855bcc5dc73f66abff3e903f0864", + "url": "https://api.github.com/repos/symfony/telegram-notifier/zipball/d167b836e1b3151da30b3c52d4d0579ccc235306", + "reference": "d167b836e1b3151da30b3c52d4d0579ccc235306", "shasum": "" }, "require": { @@ -9244,7 +9150,7 @@ "telegram" ], "support": { - "source": "https://github.com/symfony/telegram-notifier/tree/v8.0.0" + "source": "https://github.com/symfony/telegram-notifier/tree/v8.0.4" }, "funding": [ { @@ -9264,20 +9170,20 @@ "type": "tidelift" } ], - "time": "2025-09-01T09:26:06+00:00" + "time": "2026-01-05T09:27:50+00:00" }, { "name": "symfony/translation", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "770e3b8b0ba8360958abedcabacd4203467333ca" + "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/770e3b8b0ba8360958abedcabacd4203467333ca", - "reference": "770e3b8b0ba8360958abedcabacd4203467333ca", + "url": "https://api.github.com/repos/symfony/translation/zipball/27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", + "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", "shasum": "" }, "require": { @@ -9337,7 +9243,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.1" + "source": "https://github.com/symfony/translation/tree/v8.0.8" }, "funding": [ { @@ -9357,7 +9263,7 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/translation-contracts", @@ -9443,16 +9349,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "a5d2d4fdd63a0c96fe9dd28e7c3cf21512689f7b" + "reference": "a892d0b7f3d5d51b35895467e48aafbd1f2612a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/a5d2d4fdd63a0c96fe9dd28e7c3cf21512689f7b", - "reference": "a5d2d4fdd63a0c96fe9dd28e7c3cf21512689f7b", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/a892d0b7f3d5d51b35895467e48aafbd1f2612a0", + "reference": "a892d0b7f3d5d51b35895467e48aafbd1f2612a0", "shasum": "" }, "require": { @@ -9461,13 +9367,15 @@ "twig/twig": "^3.21" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0" + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/form": "<7.4.4|>8.0,<8.0.4", + "symfony/mime": "<7.4.8|>8.0,<8.0.8" }, "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", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/asset": "^7.4|^8.0", "symfony/asset-mapper": "^7.4|^8.0", "symfony/console": "^7.4|^8.0", @@ -9475,12 +9383,12 @@ "symfony/emoji": "^7.4|^8.0", "symfony/expression-language": "^7.4|^8.0", "symfony/finder": "^7.4|^8.0", - "symfony/form": "^7.4.1|^8.0.1", + "symfony/form": "^7.4.4|^8.0.4", "symfony/html-sanitizer": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", "symfony/http-kernel": "^7.4|^8.0", "symfony/intl": "^7.4|^8.0", - "symfony/mime": "^7.4|^8.0", + "symfony/mime": "^7.4.8|^8.0.8", "symfony/polyfill-intl-icu": "^1.0", "symfony/property-info": "^7.4|^8.0", "symfony/routing": "^7.4|^8.0", @@ -9525,7 +9433,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v8.0.1" + "source": "https://github.com/symfony/twig-bridge/tree/v8.0.8" }, "funding": [ { @@ -9545,20 +9453,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/twig-bundle", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "4505b860fb07951521ae55eec43007eef67222a5" + "reference": "f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4505b860fb07951521ae55eec43007eef67222a5", - "reference": "4505b860fb07951521ae55eec43007eef67222a5", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1", + "reference": "f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1", "shasum": "" }, "require": { @@ -9609,7 +9517,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/twig-bundle/tree/v8.0.8" }, "funding": [ { @@ -9629,20 +9537,20 @@ "type": "tidelift" } ], - "time": "2025-10-07T12:38:08+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/type-info", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "bb091cec1f70383538c7d000699781813f8d1a6a" + "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/bb091cec1f70383538c7d000699781813f8d1a6a", - "reference": "bb091cec1f70383538c7d000699781813f8d1a6a", + "url": "https://api.github.com/repos/symfony/type-info/zipball/08723aceb8c3271e8cb3db8b2565728b0c88e866", + "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866", "shasum": "" }, "require": { @@ -9691,7 +9599,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v8.0.1" + "source": "https://github.com/symfony/type-info/tree/v8.0.9" }, "funding": [ { @@ -9711,20 +9619,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/uid", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "8395a2cc2ed49aa68f602c5c489f60ab853893df" + "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/8395a2cc2ed49aa68f602c5c489f60ab853893df", - "reference": "8395a2cc2ed49aa68f602c5c489f60ab853893df", + "url": "https://api.github.com/repos/symfony/uid/zipball/4d9d6510bbe88ebb4608b7200d18606cdf80825c", + "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c", "shasum": "" }, "require": { @@ -9769,7 +9677,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v8.0.0" + "source": "https://github.com/symfony/uid/tree/v8.0.9" }, "funding": [ { @@ -9789,20 +9697,20 @@ "type": "tidelift" } ], - "time": "2025-09-26T07:52:19+00:00" + "time": "2026-04-30T16:10:06+00:00" }, { "name": "symfony/ux-twig-component", - "version": "v2.31.0", + "version": "v2.35.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "6f7ecc103cdb51adb6d76d32e374fcd1d33ff2fa" + "reference": "d64b068d8339e905cd48974bdd6e9ba54dc8f247" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/6f7ecc103cdb51adb6d76d32e374fcd1d33ff2fa", - "reference": "6f7ecc103cdb51adb6d76d32e374fcd1d33ff2fa", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/d64b068d8339e905cd48974bdd6e9ba54dc8f247", + "reference": "d64b068d8339e905cd48974bdd6e9ba54dc8f247", "shasum": "" }, "require": { @@ -9822,9 +9730,11 @@ "symfony/dom-crawler": "^5.4|^6.0|^7.0|^8.0", "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0", "symfony/phpunit-bridge": "^6.0|^7.0|^8.0", - "symfony/stimulus-bundle": "^2.9.1", + "symfony/stimulus-bundle": "^2.9.1|^3.0", "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0", - "symfony/webpack-encore-bundle": "^1.15|^2.3.0" + "symfony/webpack-encore-bundle": "^1.15|^2.3.0", + "twig/extra-bundle": "^3.10.3", + "twig/html-extra": "^3.10.3" }, "type": "symfony-bundle", "extra": { @@ -9856,7 +9766,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.31.0" + "source": "https://github.com/symfony/ux-twig-component/tree/v2.35.0" }, "funding": [ { @@ -9876,20 +9786,20 @@ "type": "tidelift" } ], - "time": "2025-10-17T06:14:35+00:00" + "time": "2026-04-03T05:13:59+00:00" }, { "name": "symfony/validator", - "version": "v8.0.2", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "9a98d365b29a4f6116a2e2b6ca62d8a7179a86e1" + "reference": "131dc8322c06595a6c98185787fa756deada20df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/9a98d365b29a4f6116a2e2b6ca62d8a7179a86e1", - "reference": "9a98d365b29a4f6116a2e2b6ca62d8a7179a86e1", + "url": "https://api.github.com/repos/symfony/validator/zipball/131dc8322c06595a6c98185787fa756deada20df", + "reference": "131dc8322c06595a6c98185787fa756deada20df", "shasum": "" }, "require": { @@ -9900,7 +9810,8 @@ }, "conflict": { "doctrine/lexer": "<1.1", - "symfony/doctrine-bridge": "<7.4" + "symfony/doctrine-bridge": "<7.4", + "symfony/expression-language": "<7.4" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", @@ -9950,7 +9861,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v8.0.2" + "source": "https://github.com/symfony/validator/tree/v8.0.9" }, "funding": [ { @@ -9970,20 +9881,20 @@ "type": "tidelift" } ], - "time": "2025-12-08T06:57:48+00:00" + "time": "2026-04-30T16:10:06+00:00" }, { "name": "symfony/var-dumper", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d2a2476c93b58ac5292145e9fac1ff76a21d1ce2" + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d2a2476c93b58ac5292145e9fac1ff76a21d1ce2", - "reference": "d2a2476c93b58ac5292145e9fac1ff76a21d1ce2", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", "shasum": "" }, "require": { @@ -10037,7 +9948,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.0.0" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.8" }, "funding": [ { @@ -10057,20 +9968,20 @@ "type": "tidelift" } ], - "time": "2025-10-28T09:34:19+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "symfony/var-exporter", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04" + "reference": "24cf67be4dd0926e4413635418682f4fff831412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", - "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/24cf67be4dd0926e4413635418682f4fff831412", + "reference": "24cf67be4dd0926e4413635418682f4fff831412", "shasum": "" }, "require": { @@ -10117,7 +10028,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v8.0.0" + "source": "https://github.com/symfony/var-exporter/tree/v8.0.9" }, "funding": [ { @@ -10137,7 +10048,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T18:53:00+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -10217,16 +10128,16 @@ }, { "name": "symfony/workflow", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/workflow.git", - "reference": "7aaded92cb25a22083e26a9e3813f69da7f18418" + "reference": "5b299aa29f72217b4cf6a11ebb76bcc32574a4f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/workflow/zipball/7aaded92cb25a22083e26a9e3813f69da7f18418", - "reference": "7aaded92cb25a22083e26a9e3813f69da7f18418", + "url": "https://api.github.com/repos/symfony/workflow/zipball/5b299aa29f72217b4cf6a11ebb76bcc32574a4f9", + "reference": "5b299aa29f72217b4cf6a11ebb76bcc32574a4f9", "shasum": "" }, "require": { @@ -10283,7 +10194,7 @@ "workflow" ], "support": { - "source": "https://github.com/symfony/workflow/tree/v8.0.0" + "source": "https://github.com/symfony/workflow/tree/v8.0.9" }, "funding": [ { @@ -10303,20 +10214,20 @@ "type": "tidelift" } ], - "time": "2025-11-21T13:19:49+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/yaml", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14" + "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14", - "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14", + "url": "https://api.github.com/repos/symfony/yaml/zipball/54174ab48c0c0f9e21512b304be17f8150ccf8f1", + "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1", "shasum": "" }, "require": { @@ -10358,7 +10269,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v8.0.1" + "source": "https://github.com/symfony/yaml/tree/v8.0.8" }, "funding": [ { @@ -10378,20 +10289,20 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:17:06+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.22.2", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "09de9be7f6c0d19ede7b5a1dbfcfb2e9d1e0ea9e" + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/09de9be7f6c0d19ede7b5a1dbfcfb2e9d1e0ea9e", - "reference": "09de9be7f6c0d19ede7b5a1dbfcfb2e9d1e0ea9e", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", "shasum": "" }, "require": { @@ -10440,7 +10351,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.22.2" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.24.0" }, "funding": [ { @@ -10452,20 +10363,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T08:51:53+00:00" + "time": "2026-02-07T08:07:38+00:00" }, { "name": "twig/html-extra", - "version": "v3.22.1", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/html-extra.git", - "reference": "d56d33315bce2b19ed815f8feedce85448736568" + "reference": "313900fb98b371b006a55b1a29241a192634be13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/html-extra/zipball/d56d33315bce2b19ed815f8feedce85448736568", - "reference": "d56d33315bce2b19ed815f8feedce85448736568", + "url": "https://api.github.com/repos/twigphp/html-extra/zipball/313900fb98b371b006a55b1a29241a192634be13", + "reference": "313900fb98b371b006a55b1a29241a192634be13", "shasum": "" }, "require": { @@ -10508,7 +10419,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.22.1" + "source": "https://github.com/twigphp/html-extra/tree/v3.24.0" }, "funding": [ { @@ -10520,20 +10431,20 @@ "type": "tidelift" } ], - "time": "2025-11-02T11:00:49+00:00" + "time": "2026-03-17T07:24:08+00:00" }, { "name": "twig/intl-extra", - "version": "v3.22.1", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1" + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", - "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", "shasum": "" }, "require": { @@ -10572,7 +10483,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.22.1" + "source": "https://github.com/twigphp/intl-extra/tree/v3.24.0" }, "funding": [ { @@ -10584,20 +10495,20 @@ "type": "tidelift" } ], - "time": "2025-11-02T11:00:49+00:00" + "time": "2026-01-17T13:57:47+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.22.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "fb6f952082e3a7d62a75c8be2c8c47242d3925fb" + "reference": "67a11120356e034a5bbc70c5b9b9a4d0f31ca06e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/fb6f952082e3a7d62a75c8be2c8c47242d3925fb", - "reference": "fb6f952082e3a7d62a75c8be2c8c47242d3925fb", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/67a11120356e034a5bbc70c5b9b9a4d0f31ca06e", + "reference": "67a11120356e034a5bbc70c5b9b9a4d0f31ca06e", "shasum": "" }, "require": { @@ -10644,7 +10555,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.22.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.24.0" }, "funding": [ { @@ -10656,20 +10567,20 @@ "type": "tidelift" } ], - "time": "2025-09-15T05:57:37+00:00" + "time": "2026-02-07T08:07:38+00:00" }, { "name": "twig/twig", - "version": "v3.22.2", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2" + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/946ddeafa3c9f4ce279d1f34051af041db0e16f2", - "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0", + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0", "shasum": "" }, "require": { @@ -10679,7 +10590,8 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpstan/phpstan": "^2.0", + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -10723,7 +10635,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.22.2" + "source": "https://github.com/twigphp/Twig/tree/v3.24.0" }, "funding": [ { @@ -10735,20 +10647,20 @@ "type": "tidelift" } ], - "time": "2025-12-14T11:28:47+00:00" + "time": "2026-03-17T21:31:11+00:00" }, { "name": "vich/uploader-bundle", - "version": "v2.9.1", + "version": "v2.9.2", "source": { "type": "git", "url": "https://github.com/dustin10/VichUploaderBundle.git", - "reference": "945939a04a33c0b78c5fbb7ead31533d85112df5" + "reference": "4b88b23cb859a121413df4a831d960a46d6fe27f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dustin10/VichUploaderBundle/zipball/945939a04a33c0b78c5fbb7ead31533d85112df5", - "reference": "945939a04a33c0b78c5fbb7ead31533d85112df5", + "url": "https://api.github.com/repos/dustin10/VichUploaderBundle/zipball/4b88b23cb859a121413df4a831d960a46d6fe27f", + "reference": "4b88b23cb859a121413df4a831d960a46d6fe27f", "shasum": "" }, "require": { @@ -10841,9 +10753,9 @@ ], "support": { "issues": "https://github.com/dustin10/VichUploaderBundle/issues", - "source": "https://github.com/dustin10/VichUploaderBundle/tree/v2.9.1" + "source": "https://github.com/dustin10/VichUploaderBundle/tree/v2.9.2" }, - "time": "2025-12-10T08:23:38+00:00" + "time": "2026-03-12T08:18:50+00:00" } ], "packages-dev": [ @@ -11105,34 +11017,34 @@ }, { "name": "dama/doctrine-test-bundle", - "version": "v8.4.1", + "version": "v8.6.0", "source": { "type": "git", "url": "https://github.com/dmaicher/doctrine-test-bundle.git", - "reference": "d9f4fb01a43da2e279ca190fa25ab9e26f15a0c8" + "reference": "f7e3487643e685432f7e27c50cac64e9f8c515a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/d9f4fb01a43da2e279ca190fa25ab9e26f15a0c8", - "reference": "d9f4fb01a43da2e279ca190fa25ab9e26f15a0c8", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/f7e3487643e685432f7e27c50cac64e9f8c515a4", + "reference": "f7e3487643e685432f7e27c50cac64e9f8c515a4", "shasum": "" }, "require": { "doctrine/dbal": "^3.3 || ^4.0", "doctrine/doctrine-bundle": "^2.11.0 || ^3.0", - "php": ">= 8.1", + "php": ">= 8.2", "psr/cache": "^2.0 || ^3.0", "symfony/cache": "^6.4 || ^7.3 || ^8.0", "symfony/framework-bundle": "^6.4 || ^7.3 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<10.0" + "phpunit/phpunit": "<11.0" }, "require-dev": { "behat/behat": "^3.0", "friendsofphp/php-cs-fixer": "^3.27", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.5.57 || ^11.5.41|| ^12.3.14", + "phpunit/phpunit": "^11.5.41|| ^12.3.14", "symfony/dotenv": "^6.4 || ^7.3 || ^8.0", "symfony/process": "^6.4 || ^7.3 || ^8.0" }, @@ -11168,22 +11080,22 @@ ], "support": { "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", - "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.4.1" + "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.6.0" }, - "time": "2025-12-07T21:48:15+00:00" + "time": "2026-01-21T07:39:44+00:00" }, { "name": "doctrine/data-fixtures", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97" + "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7a615ba135e45d67674bb623d90f34f6c7b6bd97", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bf7ac3a050b54b261cedfb3d0a44733819062275", + "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275", "shasum": "" }, "require": { @@ -11201,12 +11113,14 @@ "doctrine/dbal": "^3.5 || ^4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.14 || ^3", + "doctrine/phpcr-odm": "^1.8 || ^2.0", "ext-sqlite3": "*", "fig/log-test": "^1", - "phpstan/phpstan": "2.1.31", - "phpunit/phpunit": "10.5.45 || 12.4.0", - "symfony/cache": "^6.4 || ^7", - "symfony/var-exporter": "^6.4 || ^7" + "jackalope/jackalope-fs": "*", + "phpstan/phpstan": "2.1.46", + "phpunit/phpunit": "10.5.63 || 12.5.12", + "symfony/cache": "^6.4 || ^7 || ^8", + "symfony/var-exporter": "^6.4 || ^7 || ^8" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -11237,7 +11151,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.2.0" + "source": "https://github.com/doctrine/data-fixtures/tree/2.2.1" }, "funding": [ { @@ -11253,7 +11167,7 @@ "type": "tidelift" } ], - "time": "2025-10-17T20:06:20+00:00" + "time": "2026-04-01T13:56:01+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -11341,6 +11255,75 @@ ], "time": "2025-12-03T16:05:42+00:00" }, + { + "name": "ergebnis/agent-detector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/agent-detector.git", + "reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64", + "reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64", + "shasum": "" + }, + "require": { + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.50.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.60.2", + "ergebnis/phpstan-rules": "^2.13.1", + "ergebnis/phpunit-slow-test-detector": "^2.24.0", + "ergebnis/rector-rules": "^1.16.0", + "fakerphp/faker": "^1.24.1", + "infection/infection": "^0.26.6", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.46", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "phpunit/phpunit": "^9.6.34", + "rector/rector": "^2.4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\AgentDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a detector for detecting the presence of an agent.", + "homepage": "https://github.com/ergebnis/agent-detector", + "support": { + "issues": "https://github.com/ergebnis/agent-detector/issues", + "security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/agent-detector" + }, + "time": "2026-04-10T13:45:13+00:00" + }, { "name": "evenement/evenement", "version": "v3.0.2", @@ -11514,22 +11497,23 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.92.2", + "version": "v3.95.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "64fab3553dce507ce247f7d1a7d65f74ef658c3f" + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/64fab3553dce507ce247f7d1a7d65f74ef658c3f", - "reference": "64fab3553dce507ce247f7d1a7d65f74ef658c3f", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a9727678fbd12997f1d9de8f4a37824ed9df1065", + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065", "shasum": "" }, "require": { "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.5", + "ergebnis/agent-detector": "^1.1.1", "ext-filter": "*", "ext-hash": "*", "ext-json": "*", @@ -11540,7 +11524,7 @@ "react/event-loop": "^1.5", "react/socket": "^1.16", "react/stream": "^1.4", - "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0", "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", @@ -11554,18 +11538,18 @@ "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.31.0", - "justinrainbow/json-schema": "^6.5", - "keradus/cli-executor": "^2.2", + "facile-it/paraunit": "^1.3.1 || ^2.8.0", + "infection/infection": "^0.32.6", + "justinrainbow/json-schema": "^6.8.0", + "keradus/cli-executor": "^2.3", "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.9", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55", "symfony/polyfill-php85": "^1.33", - "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2 || ^8.0", - "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2 || ^8.0" + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -11606,7 +11590,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.2" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.1" }, "funding": [ { @@ -11614,20 +11598,20 @@ "type": "github" } ], - "time": "2025-12-17T00:04:16+00:00" + "time": "2026-04-12T17:00:09+00:00" }, { "name": "mmo/faker-images", - "version": "v0.9.1", + "version": "v0.9.2", "source": { "type": "git", "url": "https://github.com/morawskim/faker-images.git", - "reference": "0c1a0807fe01dd060591a18cba37d5bf9c677bf2" + "reference": "3ac8ba8ead88a1038cedbf3d657cc328bd353977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/morawskim/faker-images/zipball/0c1a0807fe01dd060591a18cba37d5bf9c677bf2", - "reference": "0c1a0807fe01dd060591a18cba37d5bf9c677bf2", + "url": "https://api.github.com/repos/morawskim/faker-images/zipball/3ac8ba8ead88a1038cedbf3d657cc328bd353977", + "reference": "3ac8ba8ead88a1038cedbf3d657cc328bd353977", "shasum": "" }, "require": { @@ -11668,22 +11652,22 @@ ], "support": { "issues": "https://github.com/morawskim/faker-images/issues", - "source": "https://github.com/morawskim/faker-images/tree/v0.9.1" + "source": "https://github.com/morawskim/faker-images/tree/v0.9.2" }, - "time": "2025-08-15T07:16:51+00:00" + "time": "2026-02-02T20:16:42+00:00" }, { "name": "nette/utils", - "version": "v4.1.0", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { @@ -11695,8 +11679,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -11757,9 +11743,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.0" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2025-12-01T17:49:23+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nikic/php-parser", @@ -11939,16 +11925,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -11980,17 +11966,17 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2025-08-30T15:50:23+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpstan/phpstan", - "version": "2.1.33", + "version": "2.1.54", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9e800e6bee7d5bd02784d4c6069b48032d16224f", - "reference": "9e800e6bee7d5bd02784d4c6069b48032d16224f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8be50c3992107dc837b17da4d140fbbdf9a5c5bd", + "reference": "8be50c3992107dc837b17da4d140fbbdf9a5c5bd", "shasum": "" }, "require": { @@ -12035,25 +12021,25 @@ "type": "github" } ], - "time": "2025-12-05T10:24:31+00:00" + "time": "2026-04-29T13:31:09+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "468e02c9176891cc901143da118f09dc9505fc2f" + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f", - "reference": "468e02c9176891cc901143da118f09dc9505fc2f", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc", + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.15" + "phpstan/phpstan": "^2.1.39" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", @@ -12078,29 +12064,32 @@ "MIT" ], "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4" }, - "time": "2025-05-14T10:56:57+00:00" + "time": "2026-02-09T13:21:14+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "2.0.12", + "version": "2.0.21", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "d20ee0373d22735271f1eb4d631856b5f847d399" + "reference": "81dac0ee4363c2359128aec844df31efb215dddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/d20ee0373d22735271f1eb4d631856b5f847d399", - "reference": "d20ee0373d22735271f1eb4d631856b5f847d399", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/81dac0ee4363c2359128aec844df31efb215dddc", + "reference": "81dac0ee4363c2359128aec844df31efb215dddc", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.13" + "phpstan/phpstan": "^2.1.34" }, "conflict": { "doctrine/collections": "<1.0", @@ -12120,7 +12109,7 @@ "doctrine/lexer": "^2.0 || ^3.0", "doctrine/mongodb-odm": "^2.4.3", "doctrine/orm": "^2.16.0", - "doctrine/persistence": "^2.2.1 || ^3.2", + "doctrine/persistence": "^2.2.1 || ^3.4.3", "gedmo/doctrine-extensions": "^3.8", "nesbot/carbon": "^2.49", "php-parallel-lint/php-parallel-lint": "^1.2", @@ -12151,11 +12140,14 @@ "MIT" ], "description": "Doctrine extensions for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.12" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.21" }, - "time": "2025-12-01T11:34:02+00:00" + "time": "2026-04-17T13:00:39+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -12208,16 +12200,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.10", + "version": "2.0.16", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7" + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/8d61a5854e7497d95bc85188e13537e99bd7aae7", - "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32", + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32", "shasum": "" }, "require": { @@ -12253,24 +12245,27 @@ "MIT" ], "description": "PHPUnit extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.10" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16" }, - "time": "2025-12-06T11:15:39+00:00" + "time": "2026-02-14T09:05:21+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.9", + "version": "2.0.15", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "24d8c157aa483141b0579d705ef0aac9e1b95436" + "reference": "9b85ab476969b87bbe2253b69e265a9359b2f395" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/24d8c157aa483141b0579d705ef0aac9e1b95436", - "reference": "24d8c157aa483141b0579d705ef0aac9e1b95436", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/9b85ab476969b87bbe2253b69e265a9359b2f395", + "reference": "9b85ab476969b87bbe2253b69e265a9359b2f395", "shasum": "" }, "require": { @@ -12324,24 +12319,27 @@ } ], "description": "Symfony Framework extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.9" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.15" }, - "time": "2025-11-29T11:17:28+00:00" + "time": "2026-02-26T10:15:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "12.5.1", + "version": "12.5.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57" + "reference": "876099a072646c7745f673d7aeab5382c4439691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c467c59a4f6e04b942be422844e7a6352fa01b57", - "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/876099a072646c7745f673d7aeab5382c4439691", + "reference": "876099a072646c7745f673d7aeab5382c4439691", "shasum": "" }, "require": { @@ -12350,13 +12348,12 @@ "ext-xmlwriter": "*", "nikic/php-parser": "^5.7.0", "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", "phpunit/php-text-template": "^5.0", "sebastian/complexity": "^5.0", "sebastian/environment": "^8.0.3", "sebastian/lines-of-code": "^4.0", "sebastian/version": "^6.0", - "theseer/tokenizer": "^2.0" + "theseer/tokenizer": "^2.0.1" }, "require-dev": { "phpunit/phpunit": "^12.5.1" @@ -12397,7 +12394,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.1" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.6" }, "funding": [ { @@ -12417,20 +12414,20 @@ "type": "tidelift" } ], - "time": "2025-12-08T07:17:58+00:00" + "time": "2026-04-15T08:23:17+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { @@ -12470,15 +12467,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", @@ -12666,16 +12675,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.4", + "version": "12.5.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4ba0e923f9d3fc655de22f9547c01d15a41fc93a" + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4ba0e923f9d3fc655de22f9547c01d15a41fc93a", - "reference": "4ba0e923f9d3fc655de22f9547c01d15a41fc93a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d75dd30597caa80e72fad2ef7904601a30ef1046", + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046", "shasum": "" }, "require": { @@ -12689,18 +12698,19 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.1", - "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-code-coverage": "^12.5.6", + "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.2.0", - "sebastian/comparator": "^7.1.3", + "sebastian/comparator": "^7.1.6", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", + "sebastian/environment": "^8.1.0", "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", "sebastian/type": "^6.0.3", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" @@ -12743,31 +12753,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.4" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.24" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2025-12-15T06:05:34+00:00" + "time": "2026-05-01T04:21:04+00:00" }, { "name": "react/cache", @@ -12843,16 +12837,16 @@ }, { "name": "react/child-process", - "version": "v0.6.6", + "version": "v0.6.7", "source": { "type": "git", "url": "https://github.com/reactphp/child-process.git", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3", "shasum": "" }, "require": { @@ -12906,7 +12900,7 @@ ], "support": { "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + "source": "https://github.com/reactphp/child-process/tree/v0.6.7" }, "funding": [ { @@ -12914,7 +12908,7 @@ "type": "open_collective" } ], - "time": "2025-01-01T16:37:48+00:00" + "time": "2025-12-23T15:25:20+00:00" }, { "name": "react/dns", @@ -13297,21 +13291,21 @@ }, { "name": "rector/rector", - "version": "2.2.14", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "6d56bb0e94d4df4f57a78610550ac76ab403657d" + "reference": "e645b6463c6a88ea5b44b17d3387d35a912c7946" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/6d56bb0e94d4df4f57a78610550ac76ab403657d", - "reference": "6d56bb0e94d4df4f57a78610550ac76ab403657d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/e645b6463c6a88ea5b44b17d3387d35a912c7946", + "reference": "e645b6463c6a88ea5b44b17d3387d35a912c7946", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.33" + "phpstan/phpstan": "^2.1.48" }, "conflict": { "rector/rector-doctrine": "*", @@ -13345,7 +13339,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.2.14" + "source": "https://github.com/rectorphp/rector/tree/2.4.2" }, "funding": [ { @@ -13353,7 +13347,7 @@ "type": "github" } ], - "time": "2025-12-09T10:57:55+00:00" + "time": "2026-04-16T13:07:34+00:00" }, { "name": "sebastian/cli-parser", @@ -13426,16 +13420,16 @@ }, { "name": "sebastian/comparator", - "version": "7.1.3", + "version": "7.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c769009dee98f494e0edc3fd4f4087501688f11e", + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e", "shasum": "" }, "require": { @@ -13494,7 +13488,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.6" }, "funding": [ { @@ -13514,7 +13508,7 @@ "type": "tidelift" } ], - "time": "2025-08-20T11:27:00+00:00" + "time": "2026-04-14T08:23:15+00:00" }, { "name": "sebastian/complexity", @@ -13643,16 +13637,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "8.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b121608b28a13f721e76ffbbd386d08eff58f3f6", + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6", "shasum": "" }, "require": { @@ -13667,7 +13661,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -13695,7 +13689,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.0" }, "funding": [ { @@ -13715,7 +13709,7 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2026-04-15T12:13:01+00:00" }, { "name": "sebastian/exporter", @@ -14449,16 +14443,16 @@ }, { "name": "symfony/browser-kit", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "b9758c6dfa7e821980bc5bb50812831e80060b2a" + "reference": "f5a28fca785416cf489dd579011e74c831100cc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b9758c6dfa7e821980bc5bb50812831e80060b2a", - "reference": "b9758c6dfa7e821980bc5bb50812831e80060b2a", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f5a28fca785416cf489dd579011e74c831100cc3", + "reference": "f5a28fca785416cf489dd579011e74c831100cc3", "shasum": "" }, "require": { @@ -14497,7 +14491,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v8.0.0" + "source": "https://github.com/symfony/browser-kit/tree/v8.0.8" }, "funding": [ { @@ -14517,20 +14511,20 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/css-selector", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b" + "reference": "3665cfade90565430909b906394c73c8739e57d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/6225bd458c53ecdee056214cb4a2ffaf58bd592b", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/3665cfade90565430909b906394c73c8739e57d0", + "reference": "3665cfade90565430909b906394c73c8739e57d0", "shasum": "" }, "require": { @@ -14566,7 +14560,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.0.0" + "source": "https://github.com/symfony/css-selector/tree/v8.0.9" }, "funding": [ { @@ -14586,20 +14580,20 @@ "type": "tidelift" } ], - "time": "2025-10-30T14:17:19+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/debug-bundle", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "02665efd40733372a4b4bdd78722426a6f95849b" + "reference": "d9d127d61fb2aa7f7f324a8b1928767e2211d1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/02665efd40733372a4b4bdd78722426a6f95849b", - "reference": "02665efd40733372a4b4bdd78722426a6f95849b", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/d9d127d61fb2aa7f7f324a8b1928767e2211d1bc", + "reference": "d9d127d61fb2aa7f7f324a8b1928767e2211d1bc", "shasum": "" }, "require": { @@ -14641,7 +14635,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/debug-bundle/tree/v8.0.8" }, "funding": [ { @@ -14661,20 +14655,20 @@ "type": "tidelift" } ], - "time": "2025-10-24T14:30:40+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/dom-crawler", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "11a3dbe6f6c0ae03ae71f879cf5c2e28db107179" + "reference": "284ace90732b445b027728b5e0eec6418a17a364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/11a3dbe6f6c0ae03ae71f879cf5c2e28db107179", - "reference": "11a3dbe6f6c0ae03ae71f879cf5c2e28db107179", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/284ace90732b445b027728b5e0eec6418a17a364", + "reference": "284ace90732b445b027728b5e0eec6418a17a364", "shasum": "" }, "require": { @@ -14711,7 +14705,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v8.0.1" + "source": "https://github.com/symfony/dom-crawler/tree/v8.0.8" }, "funding": [ { @@ -14731,23 +14725,24 @@ "type": "tidelift" } ], - "time": "2025-12-06T17:00:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.65.1", + "version": "v1.67.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "eba30452d212769c9a5bcf0716959fd8ba1e54e3" + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/eba30452d212769c9a5bcf0716959fd8ba1e54e3", - "reference": "eba30452d212769c9a5bcf0716959fd8ba1e54e3", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/6ce8b313845f16bcf385ee3cb31d8b24e30d5516", + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516", "shasum": "" }, "require": { + "composer-runtime-api": "^2.1", "doctrine/inflector": "^2.0", "nikic/php-parser": "^5.0", "php": ">=8.1", @@ -14767,7 +14762,7 @@ }, "require-dev": { "composer/semver": "^3.0", - "doctrine/doctrine-bundle": "^2.5.0|^3.0.0", + "doctrine/doctrine-bundle": "^2.10|^3.0", "doctrine/orm": "^2.15|^3", "doctrine/persistence": "^3.1|^4.0", "symfony/http-client": "^6.4|^7.0|^8.0", @@ -14809,7 +14804,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.65.1" + "source": "https://github.com/symfony/maker-bundle/tree/v1.67.0" }, "funding": [ { @@ -14829,20 +14824,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T07:14:37+00:00" + "time": "2026-03-18T13:39:06+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161" + "reference": "723ea96810135e776110bddb25aeb32b462134c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/51b2adaf2cdb00cdab11e6b593e37ef76358e161", - "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/723ea96810135e776110bddb25aeb32b462134c8", + "reference": "723ea96810135e776110bddb25aeb32b462134c8", "shasum": "" }, "require": { @@ -14894,7 +14889,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.8" }, "funding": [ { @@ -14914,20 +14909,20 @@ "type": "tidelift" } ], - "time": "2025-10-29T07:48:08+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "82503c06aa67202092a3bc06c6ea6aaec53a2fd2" + "reference": "5c3d84efc47982dcce766092ba63d4435ed9f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/82503c06aa67202092a3bc06c6ea6aaec53a2fd2", - "reference": "82503c06aa67202092a3bc06c6ea6aaec53a2fd2", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/5c3d84efc47982dcce766092ba63d4435ed9f11e", + "reference": "5c3d84efc47982dcce766092ba63d4435ed9f11e", "shasum": "" }, "require": { @@ -14979,7 +14974,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.0.9" }, "funding": [ { @@ -14999,29 +14994,29 @@ "type": "tidelift" } ], - "time": "2025-11-20T12:42:53+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "13.0.0", + "version": "13.1.3", "source": { "type": "git", - "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "24708c6673871e342245c692e1bb304f119ffc58" + "url": "https://github.com/easy-coding-standard/ecs.git", + "reference": "d894d088d7ebb9326f9eed28bf251481c813b89f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/24708c6673871e342245c692e1bb304f119ffc58", - "reference": "24708c6673871e342245c692e1bb304f119ffc58", + "url": "https://api.github.com/repos/easy-coding-standard/ecs/zipball/d894d088d7ebb9326f9eed28bf251481c813b89f", + "reference": "d894d088d7ebb9326f9eed28bf251481c813b89f", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { - "friendsofphp/php-cs-fixer": "<3.46", - "phpcsstandards/php_codesniffer": "<3.8", - "symplify/coding-standard": "<12.1" + "friendsofphp/php-cs-fixer": "<3.95.1", + "phpcsstandards/php_codesniffer": "<4.0.1", + "symplify/coding-standard": "<13.0" }, "suggest": { "ext-dom": "Needed to support checkstyle output format in class CheckstyleOutputFormatter" @@ -15047,40 +15042,29 @@ "static analysis" ], "support": { - "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/13.0.0" + "source": "https://github.com/easy-coding-standard/ecs/tree/13.1.3" }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2025-11-06T14:47:06+00:00" + "time": "2026-05-04T21:45:57+00:00" }, { "name": "symplify/phpstan-rules", - "version": "14.9.5", + "version": "14.9.11", "source": { "type": "git", "url": "https://github.com/symplify/phpstan-rules.git", - "reference": "8557736b5e7b8c10f68e6c6f0692b5dce305d307" + "reference": "5ea4bbd9357cba253aada506dd96d37d7069ac3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/phpstan-rules/zipball/8557736b5e7b8c10f68e6c6f0692b5dce305d307", - "reference": "8557736b5e7b8c10f68e6c6f0692b5dce305d307", + "url": "https://api.github.com/repos/symplify/phpstan-rules/zipball/5ea4bbd9357cba253aada506dd96d37d7069ac3b", + "reference": "5ea4bbd9357cba253aada506dd96d37d7069ac3b", "shasum": "" }, "require": { "nette/utils": "^3.2|^4.0", "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.22", - "webmozart/assert": "^1.11" + "phpstan/phpstan": "^2.1.33", + "webmozart/assert": "^1.12 || ^2.0" }, "type": "phpstan-extension", "extra": { @@ -15105,7 +15089,7 @@ "description": "Set of Symplify rules for PHPStan", "support": { "issues": "https://github.com/symplify/phpstan-rules/issues", - "source": "https://github.com/symplify/phpstan-rules/tree/14.9.5" + "source": "https://github.com/symplify/phpstan-rules/tree/14.9.11" }, "funding": [ { @@ -15117,7 +15101,7 @@ "type": "github" } ], - "time": "2025-12-08T15:34:48+00:00" + "time": "2026-01-05T13:53:59+00:00" }, { "name": "theseer/tokenizer", @@ -15171,23 +15155,23 @@ }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4", + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -15197,7 +15181,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -15213,6 +15197,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -15223,9 +15211,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.3.0" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2026-04-11T10:33:05+00:00" } ], "aliases": [], diff --git a/apps/config/packages/flysystem.yaml b/apps/config/packages/flysystem.yaml index b3d982181..e92813e16 100644 --- a/apps/config/packages/flysystem.yaml +++ b/apps/config/packages/flysystem.yaml @@ -13,6 +13,10 @@ flysystem: adapter: 'local' options: directory: '%kernel.project_dir%/public/assets' + person.storage: + adapter: 'local' + options: + directory: '%kernel.project_dir%/public/uploads/person' game.storage: adapter: 'local' options: diff --git a/apps/config/packages/framework.yaml b/apps/config/packages/framework.yaml index bb2e18572..05a9ed737 100644 --- a/apps/config/packages/framework.yaml +++ b/apps/config/packages/framework.yaml @@ -1,6 +1,6 @@ # see https://symfony.com/doc/current/reference/configuration/framework.html framework: - error_controller: Labstag\Controller\FrontController::error + # error_controller: Labstag\Controller\FrontController::error cache: pools: doctrine.result_cache_pool: diff --git a/apps/config/packages/messenger.yaml b/apps/config/packages/messenger.yaml index 7c717d356..9b5201235 100644 --- a/apps/config/packages/messenger.yaml +++ b/apps/config/packages/messenger.yaml @@ -20,6 +20,11 @@ framework: # Route your messages to the transports # 'Labstag\Message\YourMessage': async + # buses: + # messenger.bus.default: + # middleware: + # - Labstag\Middleware\DeduplicationMiddleware + # when@test: # framework: # messenger: diff --git a/apps/config/packages/vich_uploader.yaml b/apps/config/packages/vich_uploader.yaml index 8b047c519..cfed4d471 100644 --- a/apps/config/packages/vich_uploader.yaml +++ b/apps/config/packages/vich_uploader.yaml @@ -13,6 +13,16 @@ vich_uploader: inject_on_load: false delete_on_update: true delete_on_remove: true + person: + uri_prefix: /uploads/person + upload_destination: person.storage + namer: + service: Vich\UploaderBundle\Naming\PropertyNamer + options: + property: slug + inject_on_load: false + delete_on_update: true + delete_on_remove: true media: uri_prefix: /uploads/media upload_destination: media.storage diff --git a/apps/config/preload.php b/apps/config/preload.php index dc678e4ef..85df1e027 100644 --- a/apps/config/preload.php +++ b/apps/config/preload.php @@ -1,5 +1,5 @@ - * @psalm-type ParametersConfig = array|null>|null> + * @psalm-type ParametersConfig = array|Param|null>|Param|null> * @psalm-type ArgumentsType = list|array * @psalm-type CallType = array|array{0:string, 1?:ArgumentsType, 2?:bool}|array{method:string, arguments?:ArgumentsType, returns_clone?:bool} * @psalm-type TagsType = list>> // arrays inside the list must have only one element, with the tag name as the key - * @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator|ExpressionConfigurator + * @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator * @psalm-type DeprecationType = array{package: string, version: string, message?: string} * @psalm-type DefaultsType = array{ * public?: bool, @@ -124,1558 +126,1678 @@ * } * @psalm-type ExtensionType = array * @psalm-type FrameworkConfig = array{ - * secret?: scalar|null, - * http_method_override?: bool, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false - * allowed_http_method_override?: list|null, - * trust_x_sendfile_type_header?: scalar|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" - * ide?: scalar|null, // Default: "%env(default::SYMFONY_IDE)%" - * test?: bool, - * default_locale?: scalar|null, // Default: "en" - * set_locale_from_accept_language?: bool, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false - * set_content_language_from_locale?: bool, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false - * enabled_locales?: list, - * trusted_hosts?: list, + * secret?: scalar|Param|null, + * http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false + * allowed_http_method_override?: null|list, + * trust_x_sendfile_type_header?: scalar|Param|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" + * ide?: scalar|Param|null, // Default: "%env(default::SYMFONY_IDE)%" + * test?: bool|Param, + * default_locale?: scalar|Param|null, // Default: "en" + * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false + * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false + * enabled_locales?: list, + * trusted_hosts?: string|list, * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] - * trusted_headers?: list, - * error_controller?: scalar|null, // Default: "error_controller" - * handle_all_throwables?: bool, // HttpKernel will handle all kinds of \Throwable. // Default: true + * trusted_headers?: string|list, + * error_controller?: scalar|Param|null, // Default: "error_controller" + * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true * csrf_protection?: bool|array{ - * enabled?: scalar|null, // Default: null - * stateless_token_ids?: list, - * check_header?: scalar|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false - * cookie_name?: scalar|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" + * enabled?: scalar|Param|null, // Default: null + * stateless_token_ids?: list, + * check_header?: scalar|Param|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false + * cookie_name?: scalar|Param|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" * }, * form?: bool|array{ // Form configuration - * enabled?: bool, // Default: true - * csrf_protection?: array{ - * enabled?: scalar|null, // Default: null - * token_id?: scalar|null, // Default: null - * field_name?: scalar|null, // Default: "_token" - * field_attr?: array, + * enabled?: bool|Param, // Default: true + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * token_id?: scalar|Param|null, // Default: null + * field_name?: scalar|Param|null, // Default: "_token" + * field_attr?: array, * }, * }, * http_cache?: bool|array{ // HTTP cache configuration - * enabled?: bool, // Default: false - * debug?: bool, // Default: "%kernel.debug%" - * trace_level?: "none"|"short"|"full", - * trace_header?: scalar|null, - * default_ttl?: int, - * private_headers?: list, - * skip_response_headers?: list, - * allow_reload?: bool, - * allow_revalidate?: bool, - * stale_while_revalidate?: int, - * stale_if_error?: int, - * terminate_on_cache_hit?: bool, + * enabled?: bool|Param, // Default: false + * debug?: bool|Param, // Default: "%kernel.debug%" + * trace_level?: "none"|"short"|"full"|Param, + * trace_header?: scalar|Param|null, + * default_ttl?: int|Param, + * private_headers?: list, + * skip_response_headers?: list, + * allow_reload?: bool|Param, + * allow_revalidate?: bool|Param, + * stale_while_revalidate?: int|Param, + * stale_if_error?: int|Param, + * terminate_on_cache_hit?: bool|Param, * }, * esi?: bool|array{ // ESI configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * ssi?: bool|array{ // SSI configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * fragments?: bool|array{ // Fragments configuration - * enabled?: bool, // Default: false - * hinclude_default_template?: scalar|null, // Default: null - * path?: scalar|null, // Default: "/_fragment" + * enabled?: bool|Param, // Default: false + * hinclude_default_template?: scalar|Param|null, // Default: null + * path?: scalar|Param|null, // Default: "/_fragment" * }, * profiler?: bool|array{ // Profiler configuration - * enabled?: bool, // Default: false - * collect?: bool, // Default: true - * collect_parameter?: scalar|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null - * only_exceptions?: bool, // Default: false - * only_main_requests?: bool, // Default: false - * dsn?: scalar|null, // Default: "file:%kernel.cache_dir%/profiler" - * collect_serializer_data?: true, // Default: true + * enabled?: bool|Param, // Default: false + * collect?: bool|Param, // Default: true + * collect_parameter?: scalar|Param|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null + * only_exceptions?: bool|Param, // Default: false + * only_main_requests?: bool|Param, // Default: false + * dsn?: scalar|Param|null, // Default: "file:%kernel.cache_dir%/profiler" + * collect_serializer_data?: true|Param, // Default: true * }, * workflows?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * workflows?: array, - * definition_validators?: list, - * support_strategy?: scalar|null, - * initial_marking?: list, - * events_to_dispatch?: list|null, - * places?: list, - * }>, - * transitions: list, - * to?: list, - * weight?: int, // Default: 1 - * metadata?: list, + * audit_trail?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * type?: "workflow"|"state_machine"|Param, // Default: "state_machine" + * marking_store?: array{ + * type?: "method"|Param, + * property?: scalar|Param|null, + * service?: scalar|Param|null, + * }, + * supports?: string|list, + * definition_validators?: list, + * support_strategy?: scalar|Param|null, + * initial_marking?: backed-enum|string|list, + * events_to_dispatch?: null|list, + * places?: string|list, + * }>, + * transitions?: list, + * to?: backed-enum|string|list, + * weight?: int|Param, // Default: 1 + * metadata?: array, + * }>, + * metadata?: array, * }>, - * metadata?: list, - * }>, * }, * router?: bool|array{ // Router configuration - * enabled?: bool, // Default: false - * resource: scalar|null, - * type?: scalar|null, - * default_uri?: scalar|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null - * http_port?: scalar|null, // Default: 80 - * https_port?: scalar|null, // Default: 443 - * strict_requirements?: scalar|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true - * utf8?: bool, // Default: true + * enabled?: bool|Param, // Default: false + * resource?: scalar|Param|null, + * type?: scalar|Param|null, + * default_uri?: scalar|Param|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null + * http_port?: scalar|Param|null, // Default: 80 + * https_port?: scalar|Param|null, // Default: 443 + * strict_requirements?: scalar|Param|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true + * utf8?: bool|Param, // Default: true * }, * session?: bool|array{ // Session configuration - * enabled?: bool, // Default: false - * storage_factory_id?: scalar|null, // Default: "session.storage.factory.native" - * handler_id?: scalar|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. - * name?: scalar|null, - * cookie_lifetime?: scalar|null, - * cookie_path?: scalar|null, - * cookie_domain?: scalar|null, - * cookie_secure?: true|false|"auto", // Default: "auto" - * cookie_httponly?: bool, // Default: true - * cookie_samesite?: null|"lax"|"strict"|"none", // Default: "lax" - * use_cookies?: bool, - * gc_divisor?: scalar|null, - * gc_probability?: scalar|null, - * gc_maxlifetime?: scalar|null, - * save_path?: scalar|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. - * metadata_update_threshold?: int, // Seconds to wait between 2 session metadata updates. // Default: 0 + * enabled?: bool|Param, // Default: false + * storage_factory_id?: scalar|Param|null, // Default: "session.storage.factory.native" + * handler_id?: scalar|Param|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. + * name?: scalar|Param|null, + * cookie_lifetime?: scalar|Param|null, + * cookie_path?: scalar|Param|null, + * cookie_domain?: scalar|Param|null, + * cookie_secure?: true|false|"auto"|Param, // Default: "auto" + * cookie_httponly?: bool|Param, // Default: true + * cookie_samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" + * use_cookies?: bool|Param, + * gc_divisor?: scalar|Param|null, + * gc_probability?: scalar|Param|null, + * gc_maxlifetime?: scalar|Param|null, + * save_path?: scalar|Param|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. + * metadata_update_threshold?: int|Param, // Seconds to wait between 2 session metadata updates. // Default: 0 * }, * request?: bool|array{ // Request configuration - * enabled?: bool, // Default: false - * formats?: array>, + * enabled?: bool|Param, // Default: false + * formats?: array>, * }, * assets?: bool|array{ // Assets configuration - * enabled?: bool, // Default: true - * strict_mode?: bool, // Throw an exception if an entry is missing from the manifest.json. // Default: false - * version_strategy?: scalar|null, // Default: null - * version?: scalar|null, // Default: null - * version_format?: scalar|null, // Default: "%%s?%%s" - * json_manifest_path?: scalar|null, // Default: null - * base_path?: scalar|null, // Default: "" - * base_urls?: list, + * enabled?: bool|Param, // Default: true + * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false + * version_strategy?: scalar|Param|null, // Default: null + * version?: scalar|Param|null, // Default: null + * version_format?: scalar|Param|null, // Default: "%%s?%%s" + * json_manifest_path?: scalar|Param|null, // Default: null + * base_path?: scalar|Param|null, // Default: "" + * base_urls?: string|list, * packages?: array, - * }>, + * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false + * version_strategy?: scalar|Param|null, // Default: null + * version?: scalar|Param|null, + * version_format?: scalar|Param|null, // Default: null + * json_manifest_path?: scalar|Param|null, // Default: null + * base_path?: scalar|Param|null, // Default: "" + * base_urls?: string|list, + * }>, * }, * asset_mapper?: bool|array{ // Asset Mapper configuration - * enabled?: bool, // Default: false - * paths?: array, - * excluded_patterns?: list, - * exclude_dotfiles?: bool, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true - * server?: bool, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true - * public_prefix?: scalar|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" - * missing_import_mode?: "strict"|"warn"|"ignore", // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" - * extensions?: array, - * importmap_path?: scalar|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" - * importmap_polyfill?: scalar|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" - * importmap_script_attributes?: array, - * vendor_dir?: scalar|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" + * enabled?: bool|Param, // Default: false + * paths?: string|array, + * excluded_patterns?: list, + * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true + * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true + * public_prefix?: scalar|Param|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" + * missing_import_mode?: "strict"|"warn"|"ignore"|Param, // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" + * extensions?: array, + * importmap_path?: scalar|Param|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" + * importmap_polyfill?: scalar|Param|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" + * importmap_script_attributes?: array, + * vendor_dir?: scalar|Param|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" * precompress?: bool|array{ // Precompress assets with Brotli, Zstandard and gzip. - * enabled?: bool, // Default: false - * formats?: list, - * extensions?: list, + * enabled?: bool|Param, // Default: false + * formats?: list, + * extensions?: list, * }, * }, * translator?: bool|array{ // Translator configuration - * enabled?: bool, // Default: true - * fallbacks?: list, - * logging?: bool, // Default: false - * formatter?: scalar|null, // Default: "translator.formatter.default" - * cache_dir?: scalar|null, // Default: "%kernel.cache_dir%/translations" - * default_path?: scalar|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" - * paths?: list, + * enabled?: bool|Param, // Default: true + * fallbacks?: string|list, + * logging?: bool|Param, // Default: false + * formatter?: scalar|Param|null, // Default: "translator.formatter.default" + * cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations" + * default_path?: scalar|Param|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" + * paths?: list, * pseudo_localization?: bool|array{ - * enabled?: bool, // Default: false - * accents?: bool, // Default: true - * expansion_factor?: float, // Default: 1.0 - * brackets?: bool, // Default: true - * parse_html?: bool, // Default: false - * localizable_html_attributes?: list, + * enabled?: bool|Param, // Default: false + * accents?: bool|Param, // Default: true + * expansion_factor?: float|Param, // Default: 1.0 + * brackets?: bool|Param, // Default: true + * parse_html?: bool|Param, // Default: false + * localizable_html_attributes?: list, * }, * providers?: array, - * locales?: list, - * }>, + * dsn?: scalar|Param|null, + * domains?: list, + * locales?: list, + * }>, * globals?: array, - * domain?: string, - * }>, + * value?: mixed, + * message?: string|Param, + * parameters?: array, + * domain?: string|Param, + * }>, * }, * validation?: bool|array{ // Validation configuration - * enabled?: bool, // Default: true - * enable_attributes?: bool, // Default: true - * static_method?: list, - * translation_domain?: scalar|null, // Default: "validators" - * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict", // Default: "html5" + * enabled?: bool|Param, // Default: true + * enable_attributes?: bool|Param, // Default: true + * static_method?: string|list, + * translation_domain?: scalar|Param|null, // Default: "validators" + * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|Param, // Default: "html5" * mapping?: array{ - * paths?: list, + * paths?: list, * }, * not_compromised_password?: bool|array{ - * enabled?: bool, // When disabled, compromised passwords will be accepted as valid. // Default: true - * endpoint?: scalar|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null + * enabled?: bool|Param, // When disabled, compromised passwords will be accepted as valid. // Default: true + * endpoint?: scalar|Param|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null * }, - * disable_translation?: bool, // Default: false + * disable_translation?: bool|Param, // Default: false * auto_mapping?: array, - * }>, + * services?: list, + * }>, * }, * serializer?: bool|array{ // Serializer configuration - * enabled?: bool, // Default: false - * enable_attributes?: bool, // Default: true - * name_converter?: scalar|null, - * circular_reference_handler?: scalar|null, - * max_depth_handler?: scalar|null, + * enabled?: bool|Param, // Default: false + * enable_attributes?: bool|Param, // Default: true + * name_converter?: scalar|Param|null, + * circular_reference_handler?: scalar|Param|null, + * max_depth_handler?: scalar|Param|null, * mapping?: array{ - * paths?: list, + * paths?: list, * }, - * default_context?: list, + * default_context?: array, * named_serializers?: array, - * include_built_in_normalizers?: bool, // Whether to include the built-in normalizers // Default: true - * include_built_in_encoders?: bool, // Whether to include the built-in encoders // Default: true - * }>, + * name_converter?: scalar|Param|null, + * default_context?: array, + * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true + * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true + * }>, * }, * property_access?: bool|array{ // Property access configuration - * enabled?: bool, // Default: true - * magic_call?: bool, // Default: false - * magic_get?: bool, // Default: true - * magic_set?: bool, // Default: true - * throw_exception_on_invalid_index?: bool, // Default: false - * throw_exception_on_invalid_property_path?: bool, // Default: true + * enabled?: bool|Param, // Default: true + * magic_call?: bool|Param, // Default: false + * magic_get?: bool|Param, // Default: true + * magic_set?: bool|Param, // Default: true + * throw_exception_on_invalid_index?: bool|Param, // Default: false + * throw_exception_on_invalid_property_path?: bool|Param, // Default: true * }, * type_info?: bool|array{ // Type info configuration - * enabled?: bool, // Default: true - * aliases?: array, + * enabled?: bool|Param, // Default: true + * aliases?: array, * }, * property_info?: bool|array{ // Property info configuration - * enabled?: bool, // Default: true - * with_constructor_extractor?: bool, // Registers the constructor extractor. // Default: true + * enabled?: bool|Param, // Default: true + * with_constructor_extractor?: bool|Param, // Registers the constructor extractor. // Default: true * }, * cache?: array{ // Cache configuration - * prefix_seed?: scalar|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" - * app?: scalar|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem" - * system?: scalar|null, // System related cache pools configuration. // Default: "cache.adapter.system" - * directory?: scalar|null, // Default: "%kernel.share_dir%/pools/app" - * default_psr6_provider?: scalar|null, - * default_redis_provider?: scalar|null, // Default: "redis://localhost" - * default_valkey_provider?: scalar|null, // Default: "valkey://localhost" - * default_memcached_provider?: scalar|null, // Default: "memcached://localhost" - * default_doctrine_dbal_provider?: scalar|null, // Default: "database_connection" - * default_pdo_provider?: scalar|null, // Default: null + * prefix_seed?: scalar|Param|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" + * app?: scalar|Param|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem" + * system?: scalar|Param|null, // System related cache pools configuration. // Default: "cache.adapter.system" + * directory?: scalar|Param|null, // Default: "%kernel.share_dir%/pools/app" + * default_psr6_provider?: scalar|Param|null, + * default_redis_provider?: scalar|Param|null, // Default: "redis://localhost" + * default_valkey_provider?: scalar|Param|null, // Default: "valkey://localhost" + * default_memcached_provider?: scalar|Param|null, // Default: "memcached://localhost" + * default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection" + * default_pdo_provider?: scalar|Param|null, // Default: null * pools?: array, - * tags?: scalar|null, // Default: null - * public?: bool, // Default: false - * default_lifetime?: scalar|null, // Default lifetime of the pool. - * provider?: scalar|null, // Overwrite the setting from the default provider for this adapter. - * early_expiration_message_bus?: scalar|null, - * clearer?: scalar|null, - * }>, + * adapters?: string|list, + * tags?: scalar|Param|null, // Default: null + * public?: bool|Param, // Default: false + * default_lifetime?: scalar|Param|null, // Default lifetime of the pool. + * provider?: scalar|Param|null, // Overwrite the setting from the default provider for this adapter. + * early_expiration_message_bus?: scalar|Param|null, + * clearer?: scalar|Param|null, + * }>, * }, * php_errors?: array{ // PHP errors handling configuration * log?: mixed, // Use the application logger instead of the PHP logger for logging PHP errors. // Default: true - * throw?: bool, // Throw PHP errors as \ErrorException instances. // Default: true + * throw?: bool|Param, // Throw PHP errors as \ErrorException instances. // Default: true * }, * exceptions?: array, + * log_level?: scalar|Param|null, // The level of log message. Null to let Symfony decide. // Default: null + * status_code?: scalar|Param|null, // The status code of the response. Null or 0 to let Symfony decide. // Default: null + * log_channel?: scalar|Param|null, // The channel of log message. Null to let Symfony decide. // Default: null + * }>, * web_link?: bool|array{ // Web links configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * lock?: bool|string|array{ // Lock configuration - * enabled?: bool, // Default: false - * resources?: array>, + * enabled?: bool|Param, // Default: false + * resources?: string|array>, * }, * semaphore?: bool|string|array{ // Semaphore configuration - * enabled?: bool, // Default: false - * resources?: array, + * enabled?: bool|Param, // Default: false + * resources?: string|array, * }, * messenger?: bool|array{ // Messenger configuration - * enabled?: bool, // Default: true - * routing?: array, - * }>, + * enabled?: bool|Param, // Default: true + * routing?: array, + * }>, * serializer?: array{ - * default_serializer?: scalar|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" + * default_serializer?: scalar|Param|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" * symfony_serializer?: array{ - * format?: scalar|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" + * format?: scalar|Param|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" * context?: array, * }, * }, * transports?: array, - * failure_transport?: scalar|null, // Transport name to send failed messages to (after all retries have failed). // Default: null - * retry_strategy?: string|array{ - * service?: scalar|null, // Service id to override the retry strategy entirely. // Default: null - * max_retries?: int, // Default: 3 - * delay?: int, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 - * max_delay?: int, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 - * }, - * rate_limiter?: scalar|null, // Rate limiter name to use when processing messages. // Default: null - * }>, - * failure_transport?: scalar|null, // Transport name to send failed messages to (after all retries have failed). // Default: null - * stop_worker_on_signals?: list, - * default_bus?: scalar|null, // Default: null + * dsn?: scalar|Param|null, + * serializer?: scalar|Param|null, // Service id of a custom serializer to use. // Default: null + * options?: array, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * retry_strategy?: string|array{ + * service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 + * }, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null + * }>, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * stop_worker_on_signals?: int|string|list, + * default_bus?: scalar|Param|null, // Default: null * buses?: array, + * default_middleware?: bool|string|array{ + * enabled?: bool|Param, // Default: true + * allow_no_handlers?: bool|Param, // Default: false + * allow_no_senders?: bool|Param, // Default: true + * }, + * middleware?: string|list, + * }>, * }>, - * }>, * }, * scheduler?: bool|array{ // Scheduler configuration - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, - * disallow_search_engine_index?: bool, // Enabled by default when debug is enabled. // Default: true + * disallow_search_engine_index?: bool|Param, // Enabled by default when debug is enabled. // Default: true * http_client?: bool|array{ // HTTP Client configuration - * enabled?: bool, // Default: true - * max_host_connections?: int, // The maximum number of connections to a single host. + * enabled?: bool|Param, // Default: true + * max_host_connections?: int|Param, // The maximum number of connections to a single host. * default_options?: array{ * headers?: array, * vars?: array, - * max_redirects?: int, // The maximum number of redirects to follow. - * http_version?: scalar|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. - * resolve?: array, - * proxy?: scalar|null, // The URL of the proxy to pass requests through or null for automatic detection. - * no_proxy?: scalar|null, // A comma separated list of hosts that do not require a proxy to be reached. - * timeout?: float, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. - * max_duration?: float, // The maximum execution time for the request+response as a whole. - * bindto?: scalar|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. - * verify_peer?: bool, // Indicates if the peer should be verified in a TLS context. - * verify_host?: bool, // Indicates if the host should exist as a certificate common name. - * cafile?: scalar|null, // A certificate authority file. - * capath?: scalar|null, // A directory that contains multiple certificate authority files. - * local_cert?: scalar|null, // A PEM formatted certificate file. - * local_pk?: scalar|null, // A private key file. - * passphrase?: scalar|null, // The passphrase used to encrypt the "local_pk" file. - * ciphers?: scalar|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). * sha1?: mixed, * pin-sha256?: mixed, * md5?: mixed, * }, - * crypto_method?: scalar|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. * extra?: array, - * rate_limiter?: scalar|null, // Rate limiter name to use for throttling requests. // Default: null + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null * caching?: bool|array{ // Caching configuration. - * enabled?: bool, // Default: false - * cache_pool?: string, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" - * shared?: bool, // Indicates whether the cache is shared (public) or private. // Default: true - * max_ttl?: int, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null * }, * retry_failed?: bool|array{ - * enabled?: bool, // Default: false - * retry_strategy?: scalar|null, // service id to override the retry strategy. // Default: null - * http_codes?: array, - * }>, - * max_retries?: int, // Default: 3 - * delay?: int, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 - * max_delay?: int, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 * }, * }, - * mock_response_factory?: scalar|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. + * mock_response_factory?: scalar|Param|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. * scoped_clients?: array, - * headers?: array, - * max_redirects?: int, // The maximum number of redirects to follow. - * http_version?: scalar|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. - * resolve?: array, - * proxy?: scalar|null, // The URL of the proxy to pass requests through or null for automatic detection. - * no_proxy?: scalar|null, // A comma separated list of hosts that do not require a proxy to be reached. - * timeout?: float, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. - * max_duration?: float, // The maximum execution time for the request+response as a whole. - * bindto?: scalar|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. - * verify_peer?: bool, // Indicates if the peer should be verified in a TLS context. - * verify_host?: bool, // Indicates if the host should exist as a certificate common name. - * cafile?: scalar|null, // A certificate authority file. - * capath?: scalar|null, // A directory that contains multiple certificate authority files. - * local_cert?: scalar|null, // A PEM formatted certificate file. - * local_pk?: scalar|null, // A private key file. - * passphrase?: scalar|null, // The passphrase used to encrypt the "local_pk" file. - * ciphers?: scalar|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). - * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). - * sha1?: mixed, - * pin-sha256?: mixed, - * md5?: mixed, - * }, - * crypto_method?: scalar|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. - * extra?: array, - * rate_limiter?: scalar|null, // Rate limiter name to use for throttling requests. // Default: null - * caching?: bool|array{ // Caching configuration. - * enabled?: bool, // Default: false - * cache_pool?: string, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" - * shared?: bool, // Indicates whether the cache is shared (public) or private. // Default: true - * max_ttl?: int, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null - * }, - * retry_failed?: bool|array{ - * enabled?: bool, // Default: false - * retry_strategy?: scalar|null, // service id to override the retry strategy. // Default: null - * http_codes?: array, - * }>, - * max_retries?: int, // Default: 3 - * delay?: int, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 - * max_delay?: int, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 - * }, - * }>, + * scope?: scalar|Param|null, // The regular expression that the request URL must match before adding the other options. When none is provided, the base URI is used instead. + * base_uri?: scalar|Param|null, // The URI to resolve relative URLs, following rules in RFC 3985, section 2. + * auth_basic?: scalar|Param|null, // An HTTP Basic authentication "username:password". + * auth_bearer?: scalar|Param|null, // A token enabling HTTP Bearer authorization. + * auth_ntlm?: scalar|Param|null, // A "username:password" pair to use Microsoft NTLM authentication (requires the cURL extension). + * query?: array, + * headers?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }>, * }, * mailer?: bool|array{ // Mailer configuration - * enabled?: bool, // Default: true - * message_bus?: scalar|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null - * dsn?: scalar|null, // Default: null - * transports?: array, + * enabled?: bool|Param, // Default: true + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * dsn?: scalar|Param|null, // Default: null + * transports?: array, * envelope?: array{ // Mailer Envelope configuration - * sender?: scalar|null, - * recipients?: list, - * allowed_recipients?: list, + * sender?: scalar|Param|null, + * recipients?: string|list, + * allowed_recipients?: string|list, * }, * headers?: array, + * value?: mixed, + * }>, * dkim_signer?: bool|array{ // DKIM signer configuration - * enabled?: bool, // Default: false - * key?: scalar|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" - * domain?: scalar|null, // Default: "" - * select?: scalar|null, // Default: "" - * passphrase?: scalar|null, // The private key passphrase // Default: "" + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" + * domain?: scalar|Param|null, // Default: "" + * select?: scalar|Param|null, // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: "" * options?: array, * }, * smime_signer?: bool|array{ // S/MIME signer configuration - * enabled?: bool, // Default: false - * key?: scalar|null, // Path to key (in PEM format) // Default: "" - * certificate?: scalar|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" - * passphrase?: scalar|null, // The private key passphrase // Default: null - * extra_certificates?: scalar|null, // Default: null - * sign_options?: int, // Default: null + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Path to key (in PEM format) // Default: "" + * certificate?: scalar|Param|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: null + * extra_certificates?: scalar|Param|null, // Default: null + * sign_options?: int|Param, // Default: null * }, * smime_encrypter?: bool|array{ // S/MIME encrypter configuration - * enabled?: bool, // Default: false - * repository?: scalar|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" - * cipher?: int, // A set of algorithms used to encrypt the message // Default: null + * enabled?: bool|Param, // Default: false + * repository?: scalar|Param|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" + * cipher?: int|Param, // A set of algorithms used to encrypt the message // Default: null * }, * }, * secrets?: bool|array{ - * enabled?: bool, // Default: true - * vault_directory?: scalar|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" - * local_dotenv_file?: scalar|null, // Default: "%kernel.project_dir%/.env.%kernel.runtime_environment%.local" - * decryption_env_var?: scalar|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" + * enabled?: bool|Param, // Default: true + * vault_directory?: scalar|Param|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" + * local_dotenv_file?: scalar|Param|null, // Default: "%kernel.project_dir%/.env.%kernel.environment%.local" + * decryption_env_var?: scalar|Param|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" * }, * notifier?: bool|array{ // Notifier configuration - * enabled?: bool, // Default: true - * message_bus?: scalar|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null - * chatter_transports?: array, - * texter_transports?: array, - * notification_on_failed_messages?: bool, // Default: false - * channel_policy?: array>, + * enabled?: bool|Param, // Default: true + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * chatter_transports?: array, + * texter_transports?: array, + * notification_on_failed_messages?: bool|Param, // Default: false + * channel_policy?: array>, * admin_recipients?: list, + * email?: scalar|Param|null, + * phone?: scalar|Param|null, // Default: "" + * }>, * }, * rate_limiter?: bool|array{ // Rate limiter configuration - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * limiters?: array, - * limit?: int, // The maximum allowed hits in a fixed interval or burst. - * interval?: scalar|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). - * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". - * interval?: scalar|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). - * amount?: int, // Amount of tokens to add each interval. // Default: 1 - * }, - * }>, + * lock_factory?: scalar|Param|null, // The service ID of the lock factory used by this limiter (or null to disable locking). // Default: "auto" + * cache_pool?: scalar|Param|null, // The cache pool to use for storing the current limiter state. // Default: "cache.rate_limiter" + * storage_service?: scalar|Param|null, // The service ID of a custom storage implementation, this precedes any configured "cache_pool". // Default: null + * policy?: "fixed_window"|"token_bucket"|"sliding_window"|"compound"|"no_limit"|Param, // The algorithm to be used by this limiter. + * limiters?: string|list, + * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. + * interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". + * interval?: scalar|Param|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 + * }, + * }>, * }, * uid?: bool|array{ // Uid configuration - * enabled?: bool, // Default: true - * default_uuid_version?: 7|6|4|1, // Default: 7 - * name_based_uuid_version?: 5|3, // Default: 5 - * name_based_uuid_namespace?: scalar|null, - * time_based_uuid_version?: 7|6|1, // Default: 7 - * time_based_uuid_node?: scalar|null, + * enabled?: bool|Param, // Default: true + * default_uuid_version?: 7|6|4|1|Param, // Default: 7 + * name_based_uuid_version?: 5|3|Param, // Default: 5 + * name_based_uuid_namespace?: scalar|Param|null, + * time_based_uuid_version?: 7|6|1|Param, // Default: 7 + * time_based_uuid_node?: scalar|Param|null, * }, * html_sanitizer?: bool|array{ // HtmlSanitizer configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * sanitizers?: array, - * block_elements?: list, - * drop_elements?: list, - * allow_attributes?: array, - * drop_attributes?: array, - * force_attributes?: array>, - * force_https_urls?: bool, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false - * allowed_link_schemes?: list, - * allowed_link_hosts?: list|null, - * allow_relative_links?: bool, // Allows relative URLs to be used in links href attributes. // Default: false - * allowed_media_schemes?: list, - * allowed_media_hosts?: list|null, - * allow_relative_medias?: bool, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false - * with_attribute_sanitizers?: list, - * without_attribute_sanitizers?: list, - * max_input_length?: int, // The maximum length allowed for the sanitized input. // Default: 0 - * }>, + * allow_safe_elements?: bool|Param, // Allows "safe" elements and attributes. // Default: false + * allow_static_elements?: bool|Param, // Allows all static elements and attributes from the W3C Sanitizer API standard. // Default: false + * allow_elements?: array, + * block_elements?: string|list, + * drop_elements?: string|list, + * allow_attributes?: array, + * drop_attributes?: array, + * force_attributes?: array>, + * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false + * allowed_link_schemes?: string|list, + * allowed_link_hosts?: null|string|list, + * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false + * allowed_media_schemes?: string|list, + * allowed_media_hosts?: null|string|list, + * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false + * with_attribute_sanitizers?: string|list, + * without_attribute_sanitizers?: string|list, + * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 + * }>, * }, * webhook?: bool|array{ // Webhook configuration - * enabled?: bool, // Default: false - * message_bus?: scalar|null, // The message bus to use. // Default: "messenger.default_bus" + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus" * routing?: array, + * service?: scalar|Param|null, + * secret?: scalar|Param|null, // Default: "" + * }>, * }, * remote-event?: bool|array{ // RemoteEvent configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * json_streamer?: bool|array{ // JSON streamer configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * } * @psalm-type DoctrineConfig = array{ * dbal?: array{ - * default_connection?: scalar|null, + * default_connection?: scalar|Param|null, * types?: array, - * driver_schemes?: array, + * class?: scalar|Param|null, + * }>, + * driver_schemes?: array, * connections?: array, - * mapping_types?: array, - * default_table_options?: array, - * schema_manager_factory?: scalar|null, // Default: "doctrine.dbal.default_schema_manager_factory" - * result_cache?: scalar|null, - * replicas?: array, + * mapping_types?: array, + * default_table_options?: array, + * schema_manager_factory?: scalar|Param|null, // Default: "doctrine.dbal.default_schema_manager_factory" + * result_cache?: scalar|Param|null, + * replicas?: array, * }>, - * }>, * }, * orm?: array{ - * default_entity_manager?: scalar|null, - * enable_native_lazy_objects?: bool, // Deprecated: The "enable_native_lazy_objects" option is deprecated and will be removed in DoctrineBundle 4.0, as native lazy objects are now always enabled. // Default: true + * default_entity_manager?: scalar|Param|null, + * enable_native_lazy_objects?: bool|Param, // Deprecated: The "enable_native_lazy_objects" option is deprecated and will be removed in DoctrineBundle 4.0, as native lazy objects are now always enabled. // Default: true * controller_resolver?: bool|array{ - * enabled?: bool, // Default: true - * auto_mapping?: bool, // Deprecated: The "auto_mapping" option is deprecated and will be removed in DoctrineBundle 4.0, as it only accepts `false` since 3.0. // Set to true to enable using route placeholders as lookup criteria when the primary key doesn't match the argument name // Default: false - * evict_cache?: bool, // Set to true to fetch the entity from the database instead of using the cache, if any // Default: false + * enabled?: bool|Param, // Default: true + * auto_mapping?: bool|Param, // Deprecated: The "doctrine.orm.controller_resolver.auto_mapping.auto_mapping" option is deprecated and will be removed in DoctrineBundle 4.0, as it only accepts `false` since 3.0. // Set to true to enable using route placeholders as lookup criteria when the primary key doesn't match the argument name // Default: false + * evict_cache?: bool|Param, // Set to true to fetch the entity from the database instead of using the cache, if any // Default: false * }, * entity_managers?: array, + * }>, * }>, - * }>, - * }>, - * }, - * connection?: scalar|null, - * class_metadata_factory_name?: scalar|null, // Default: "Doctrine\\ORM\\Mapping\\ClassMetadataFactory" - * default_repository_class?: scalar|null, // Default: "Doctrine\\ORM\\EntityRepository" - * auto_mapping?: scalar|null, // Default: false - * naming_strategy?: scalar|null, // Default: "doctrine.orm.naming_strategy.default" - * quote_strategy?: scalar|null, // Default: "doctrine.orm.quote_strategy.default" - * typed_field_mapper?: scalar|null, // Default: "doctrine.orm.typed_field_mapper.default" - * entity_listener_resolver?: scalar|null, // Default: null - * fetch_mode_subselect_batch_size?: scalar|null, - * repository_factory?: scalar|null, // Default: "doctrine.orm.container_repository_factory" - * schema_ignore_classes?: list, - * validate_xml_mapping?: bool, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/6728. // Default: false - * second_level_cache?: array{ - * region_cache_driver?: string|array{ - * type?: scalar|null, // Default: null - * id?: scalar|null, - * pool?: scalar|null, * }, - * region_lock_lifetime?: scalar|null, // Default: 60 - * log_enabled?: bool, // Default: true - * region_lifetime?: scalar|null, // Default: 3600 - * enabled?: bool, // Default: true - * factory?: scalar|null, - * regions?: array, + * validate_xml_mapping?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/6728. // Default: false + * second_level_cache?: array{ + * region_cache_driver?: string|array{ + * type?: scalar|Param|null, // Default: null + * id?: scalar|Param|null, + * pool?: scalar|Param|null, * }, - * lock_path?: scalar|null, // Default: "%kernel.cache_dir%/doctrine/orm/slc/filelock" - * lock_lifetime?: scalar|null, // Default: 60 - * type?: scalar|null, // Default: "default" - * lifetime?: scalar|null, // Default: 0 - * service?: scalar|null, - * name?: scalar|null, - * }>, - * loggers?: array, - * }, - * hydrators?: array, - * mappings?: array, - * dql?: array{ - * string_functions?: array, - * numeric_functions?: array, - * datetime_functions?: array, - * }, - * filters?: array, + * region_lock_lifetime?: scalar|Param|null, // Default: 60 + * log_enabled?: bool|Param, // Default: true + * region_lifetime?: scalar|Param|null, // Default: 3600 + * enabled?: bool|Param, // Default: true + * factory?: scalar|Param|null, + * regions?: array, + * loggers?: array, + * }, + * hydrators?: array, + * mappings?: array, + * dql?: array{ + * string_functions?: array, + * numeric_functions?: array, + * datetime_functions?: array, + * }, + * filters?: array, + * }>, + * identity_generation_preferences?: array, * }>, - * identity_generation_preferences?: array, - * }>, - * resolve_target_entities?: array, + * resolve_target_entities?: array, * }, * } * @psalm-type DoctrineMigrationsConfig = array{ - * enable_service_migrations?: bool, // Whether to enable fetching migrations from the service container. // Default: false - * migrations_paths?: array, - * services?: array, - * factories?: array, + * enable_service_migrations?: bool|Param, // Whether to enable fetching migrations from the service container. // Default: false + * migrations_paths?: array, + * services?: array, + * factories?: array, * storage?: array{ // Storage to use for migration status metadata. * table_storage?: array{ // The default metadata storage, implemented as a table in the database. - * table_name?: scalar|null, // Default: null - * version_column_name?: scalar|null, // Default: null - * version_column_length?: scalar|null, // Default: null - * executed_at_column_name?: scalar|null, // Default: null - * execution_time_column_name?: scalar|null, // Default: null + * table_name?: scalar|Param|null, // Default: null + * version_column_name?: scalar|Param|null, // Default: null + * version_column_length?: scalar|Param|null, // Default: null + * executed_at_column_name?: scalar|Param|null, // Default: null + * execution_time_column_name?: scalar|Param|null, // Default: null * }, * }, - * migrations?: list, - * connection?: scalar|null, // Connection name to use for the migrations database. // Default: null - * em?: scalar|null, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null - * all_or_nothing?: scalar|null, // Run all migrations in a transaction. // Default: false - * check_database_platform?: scalar|null, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true - * custom_template?: scalar|null, // Custom template path for generated migration classes. // Default: null - * organize_migrations?: scalar|null, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false - * enable_profiler?: bool, // Whether or not to enable the profiler collector to calculate and visualize migration status. This adds some queries overhead. // Default: false - * transactional?: bool, // Whether or not to wrap migrations in a single transaction. // Default: true + * migrations?: list, + * connection?: scalar|Param|null, // Connection name to use for the migrations database. // Default: null + * em?: scalar|Param|null, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null + * all_or_nothing?: scalar|Param|null, // Run all migrations in a transaction. // Default: false + * check_database_platform?: scalar|Param|null, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true + * custom_template?: scalar|Param|null, // Custom template path for generated migration classes. // Default: null + * organize_migrations?: scalar|Param|null, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false + * enable_profiler?: bool|Param, // Whether or not to enable the profiler collector to calculate and visualize migration status. This adds some queries overhead. // Default: false + * transactional?: bool|Param, // Whether or not to wrap migrations in a single transaction. // Default: true * } * @psalm-type TwigConfig = array{ - * form_themes?: list, + * form_themes?: list, * globals?: array, - * autoescape_service?: scalar|null, // Default: null - * autoescape_service_method?: scalar|null, // Default: null - * cache?: scalar|null, // Default: true - * charset?: scalar|null, // Default: "%kernel.charset%" - * debug?: bool, // Default: "%kernel.debug%" - * strict_variables?: bool, // Default: "%kernel.debug%" - * auto_reload?: scalar|null, - * optimizations?: int, - * default_path?: scalar|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" - * file_name_pattern?: list, + * id?: scalar|Param|null, + * type?: scalar|Param|null, + * value?: mixed, + * }>, + * autoescape_service?: scalar|Param|null, // Default: null + * autoescape_service_method?: scalar|Param|null, // Default: null + * cache?: scalar|Param|null, // Default: true + * charset?: scalar|Param|null, // Default: "%kernel.charset%" + * debug?: bool|Param, // Default: "%kernel.debug%" + * strict_variables?: bool|Param, // Default: "%kernel.debug%" + * auto_reload?: scalar|Param|null, + * optimizations?: int|Param, + * default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" + * file_name_pattern?: string|list, * paths?: array, * date?: array{ // The default format options used by the date filter. - * format?: scalar|null, // Default: "F j, Y H:i" - * interval_format?: scalar|null, // Default: "%d days" - * timezone?: scalar|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null + * format?: scalar|Param|null, // Default: "F j, Y H:i" + * interval_format?: scalar|Param|null, // Default: "%d days" + * timezone?: scalar|Param|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null * }, * number_format?: array{ // The default format options for the number_format filter. - * decimals?: int, // Default: 0 - * decimal_point?: scalar|null, // Default: "." - * thousands_separator?: scalar|null, // Default: "," + * decimals?: int|Param, // Default: 0 + * decimal_point?: scalar|Param|null, // Default: "." + * thousands_separator?: scalar|Param|null, // Default: "," * }, * mailer?: array{ - * html_to_text_converter?: scalar|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null + * html_to_text_converter?: scalar|Param|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null * }, * } * @psalm-type SecurityConfig = array{ - * access_denied_url?: scalar|null, // Default: null - * session_fixation_strategy?: "none"|"migrate"|"invalidate", // Default: "migrate" - * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All, // Default: "none" - * erase_credentials?: bool, // Default: true + * access_denied_url?: scalar|Param|null, // Default: null + * session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate" + * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All|Param, // Default: "none" + * erase_credentials?: bool|Param, // Default: true * access_decision_manager?: array{ - * strategy?: "affirmative"|"consensus"|"unanimous"|"priority", - * service?: scalar|null, - * strategy_service?: scalar|null, - * allow_if_all_abstain?: bool, // Default: false - * allow_if_equal_granted_denied?: bool, // Default: true + * strategy?: "affirmative"|"consensus"|"unanimous"|"priority"|Param, + * service?: scalar|Param|null, + * strategy_service?: scalar|Param|null, + * allow_if_all_abstain?: bool|Param, // Default: false + * allow_if_equal_granted_denied?: bool|Param, // Default: true * }, * password_hashers?: array, - * hash_algorithm?: scalar|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" - * key_length?: scalar|null, // Default: 40 - * ignore_case?: bool, // Default: false - * encode_as_base64?: bool, // Default: true - * iterations?: scalar|null, // Default: 5000 - * cost?: int, // Default: null - * memory_cost?: scalar|null, // Default: null - * time_cost?: scalar|null, // Default: null - * id?: scalar|null, - * }>, + * algorithm?: scalar|Param|null, + * migrate_from?: string|list, + * hash_algorithm?: scalar|Param|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" + * key_length?: scalar|Param|null, // Default: 40 + * ignore_case?: bool|Param, // Default: false + * encode_as_base64?: bool|Param, // Default: true + * iterations?: scalar|Param|null, // Default: 5000 + * cost?: int|Param, // Default: null + * memory_cost?: scalar|Param|null, // Default: null + * time_cost?: scalar|Param|null, // Default: null + * id?: scalar|Param|null, + * }>, * providers?: array, - * }, - * entity?: array{ - * class: scalar|null, // The full entity class name of your user class. - * property?: scalar|null, // Default: null - * manager_name?: scalar|null, // Default: null - * }, - * memory?: array{ - * users?: array, - * }>, - * }, - * ldap?: array{ - * service: scalar|null, - * base_dn: scalar|null, - * search_dn?: scalar|null, // Default: null - * search_password?: scalar|null, // Default: null - * extra_fields?: list, - * default_roles?: list, - * role_fetcher?: scalar|null, // Default: null - * uid_key?: scalar|null, // Default: "sAMAccountName" - * filter?: scalar|null, // Default: "({uid_key}={user_identifier})" - * password_attribute?: scalar|null, // Default: null - * }, - * }>, - * firewalls: array, - * security?: bool, // Default: true - * user_checker?: scalar|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" - * request_matcher?: scalar|null, - * access_denied_url?: scalar|null, - * access_denied_handler?: scalar|null, - * entry_point?: scalar|null, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". - * provider?: scalar|null, - * stateless?: bool, // Default: false - * lazy?: bool, // Default: false - * context?: scalar|null, - * logout?: array{ - * enable_csrf?: bool|null, // Default: null - * csrf_token_id?: scalar|null, // Default: "logout" - * csrf_parameter?: scalar|null, // Default: "_csrf_token" - * csrf_token_manager?: scalar|null, - * path?: scalar|null, // Default: "/logout" - * target?: scalar|null, // Default: "/" - * invalidate_session?: bool, // Default: true - * clear_site_data?: list<"*"|"cache"|"cookies"|"storage"|"executionContexts">, - * delete_cookies?: array, - * }, - * switch_user?: array{ - * provider?: scalar|null, - * parameter?: scalar|null, // Default: "_switch_user" - * role?: scalar|null, // Default: "ROLE_ALLOWED_TO_SWITCH" - * target_route?: scalar|null, // Default: null - * }, - * required_badges?: list, - * custom_authenticators?: list, - * login_throttling?: array{ - * limiter?: scalar|null, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". - * max_attempts?: int, // Default: 5 - * interval?: scalar|null, // Default: "1 minute" - * lock_factory?: scalar|null, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null - * cache_pool?: string, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" - * storage_service?: string, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null - * }, - * x509?: array{ - * provider?: scalar|null, - * user?: scalar|null, // Default: "SSL_CLIENT_S_DN_Email" - * credentials?: scalar|null, // Default: "SSL_CLIENT_S_DN" - * user_identifier?: scalar|null, // Default: "emailAddress" - * }, - * remote_user?: array{ - * provider?: scalar|null, - * user?: scalar|null, // Default: "REMOTE_USER" - * }, - * login_link?: array{ - * check_route: scalar|null, // Route that will validate the login link - e.g. "app_login_link_verify". - * check_post_only?: scalar|null, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false - * signature_properties: list, - * lifetime?: int, // The lifetime of the login link in seconds. // Default: 600 - * max_uses?: int, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null - * used_link_cache?: scalar|null, // Cache service id used to expired links of max_uses is set. - * success_handler?: scalar|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. - * failure_handler?: scalar|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. - * provider?: scalar|null, // The user provider to load users from. - * secret?: scalar|null, // Default: "%kernel.secret%" - * always_use_default_target_path?: bool, // Default: false - * default_target_path?: scalar|null, // Default: "/" - * login_path?: scalar|null, // Default: "/login" - * target_path_parameter?: scalar|null, // Default: "_target_path" - * use_referer?: bool, // Default: false - * failure_path?: scalar|null, // Default: null - * failure_forward?: bool, // Default: false - * failure_path_parameter?: scalar|null, // Default: "_failure_path" - * }, - * form_login?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_parameter?: scalar|null, // Default: "_username" - * password_parameter?: scalar|null, // Default: "_password" - * csrf_parameter?: scalar|null, // Default: "_csrf_token" - * csrf_token_id?: scalar|null, // Default: "authenticate" - * enable_csrf?: bool, // Default: false - * post_only?: bool, // Default: true - * form_only?: bool, // Default: false - * always_use_default_target_path?: bool, // Default: false - * default_target_path?: scalar|null, // Default: "/" - * target_path_parameter?: scalar|null, // Default: "_target_path" - * use_referer?: bool, // Default: false - * failure_path?: scalar|null, // Default: null - * failure_forward?: bool, // Default: false - * failure_path_parameter?: scalar|null, // Default: "_failure_path" - * }, - * form_login_ldap?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_parameter?: scalar|null, // Default: "_username" - * password_parameter?: scalar|null, // Default: "_password" - * csrf_parameter?: scalar|null, // Default: "_csrf_token" - * csrf_token_id?: scalar|null, // Default: "authenticate" - * enable_csrf?: bool, // Default: false - * post_only?: bool, // Default: true - * form_only?: bool, // Default: false - * always_use_default_target_path?: bool, // Default: false - * default_target_path?: scalar|null, // Default: "/" - * target_path_parameter?: scalar|null, // Default: "_target_path" - * use_referer?: bool, // Default: false - * failure_path?: scalar|null, // Default: null - * failure_forward?: bool, // Default: false - * failure_path_parameter?: scalar|null, // Default: "_failure_path" - * service?: scalar|null, // Default: "ldap" - * dn_string?: scalar|null, // Default: "{user_identifier}" - * query_string?: scalar|null, - * search_dn?: scalar|null, // Default: "" - * search_password?: scalar|null, // Default: "" - * }, - * json_login?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_path?: scalar|null, // Default: "username" - * password_path?: scalar|null, // Default: "password" - * }, - * json_login_ldap?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_path?: scalar|null, // Default: "username" - * password_path?: scalar|null, // Default: "password" - * service?: scalar|null, // Default: "ldap" - * dn_string?: scalar|null, // Default: "{user_identifier}" - * query_string?: scalar|null, - * search_dn?: scalar|null, // Default: "" - * search_password?: scalar|null, // Default: "" - * }, - * access_token?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * realm?: scalar|null, // Default: null - * token_extractors?: list, - * token_handler: string|array{ - * id?: scalar|null, - * oidc_user_info?: string|array{ - * base_uri: scalar|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). - * discovery?: array{ // Enable the OIDC discovery. - * cache?: array{ - * id: scalar|null, // Cache service id to use to cache the OIDC discovery configuration. + * id?: scalar|Param|null, + * chain?: array{ + * providers?: string|list, + * }, + * entity?: array{ + * class?: scalar|Param|null, // The full entity class name of your user class. + * property?: scalar|Param|null, // Default: null + * manager_name?: scalar|Param|null, // Default: null + * }, + * memory?: array{ + * users?: array, + * }>, + * }, + * ldap?: array{ + * service?: scalar|Param|null, + * base_dn?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: null + * search_password?: scalar|Param|null, // Default: null + * extra_fields?: list, + * default_roles?: string|list, + * role_fetcher?: scalar|Param|null, // Default: null + * uid_key?: scalar|Param|null, // Default: "sAMAccountName" + * filter?: scalar|Param|null, // Default: "({uid_key}={user_identifier})" + * password_attribute?: scalar|Param|null, // Default: null + * }, + * }>, + * firewalls?: array, + * security?: bool|Param, // Default: true + * user_checker?: scalar|Param|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" + * request_matcher?: scalar|Param|null, + * access_denied_url?: scalar|Param|null, + * access_denied_handler?: scalar|Param|null, + * entry_point?: scalar|Param|null, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". + * provider?: scalar|Param|null, + * stateless?: bool|Param, // Default: false + * lazy?: bool|Param, // Default: false + * context?: scalar|Param|null, + * logout?: array{ + * enable_csrf?: bool|Param|null, // Default: null + * csrf_token_id?: scalar|Param|null, // Default: "logout" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_manager?: scalar|Param|null, + * path?: scalar|Param|null, // Default: "/logout" + * target?: scalar|Param|null, // Default: "/" + * invalidate_session?: bool|Param, // Default: true + * clear_site_data?: string|list<"*"|"cache"|"cookies"|"storage"|"executionContexts"|Param>, + * delete_cookies?: string|array, + * }, + * switch_user?: array{ + * provider?: scalar|Param|null, + * parameter?: scalar|Param|null, // Default: "_switch_user" + * role?: scalar|Param|null, // Default: "ROLE_ALLOWED_TO_SWITCH" + * target_route?: scalar|Param|null, // Default: null + * }, + * required_badges?: list, + * custom_authenticators?: list, + * login_throttling?: array{ + * limiter?: scalar|Param|null, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". + * max_attempts?: int|Param, // Default: 5 + * interval?: scalar|Param|null, // Default: "1 minute" + * lock_factory?: scalar|Param|null, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null + * cache_pool?: string|Param, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" + * storage_service?: string|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null + * }, + * x509?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN_Email" + * credentials?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN" + * user_identifier?: scalar|Param|null, // Default: "emailAddress" + * }, + * remote_user?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "REMOTE_USER" + * }, + * login_link?: array{ + * check_route?: scalar|Param|null, // Route that will validate the login link - e.g. "app_login_link_verify". + * check_post_only?: scalar|Param|null, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false + * signature_properties?: list, + * lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600 + * max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null + * used_link_cache?: scalar|Param|null, // Cache service id used to expired links of max_uses is set. + * success_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. + * failure_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. + * provider?: scalar|Param|null, // The user provider to load users from. + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * login_path?: scalar|Param|null, // Default: "/login" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * json_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * }, + * json_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * access_token?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: null + * token_extractors?: string|list, + * token_handler?: string|array{ + * id?: scalar|Param|null, + * oidc_user_info?: string|array{ + * base_uri?: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). + * discovery?: array{ // Enable the OIDC discovery. + * cache?: array{ + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" + * client?: scalar|Param|null, // HttpClient service id to use to call the OIDC server. * }, - * claim?: scalar|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" - * client?: scalar|null, // HttpClient service id to use to call the OIDC server. - * }, - * oidc?: array{ - * discovery?: array{ // Enable the OIDC discovery. - * base_uri: list, - * cache?: array{ - * id: scalar|null, // Cache service id to use to cache the OIDC discovery configuration. + * oidc?: array{ + * discovery?: array{ // Enable the OIDC discovery. + * base_uri?: string|list, + * cache?: array{ + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, + * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" + * audience?: scalar|Param|null, // Audience set in the token, for validation purpose. + * issuers?: list, + * algorithms?: list, + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). + * encryption?: bool|array{ + * enabled?: bool|Param, // Default: false + * enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false + * algorithms?: list, + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). * }, * }, - * claim?: scalar|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" - * audience: scalar|null, // Audience set in the token, for validation purpose. - * issuers: list, - * algorithms: list, - * keyset?: scalar|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). - * encryption?: bool|array{ - * enabled?: bool, // Default: false - * enforce?: bool, // When enabled, the token shall be encrypted. // Default: false - * algorithms: list, - * keyset: scalar|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). + * cas?: array{ + * validation_url?: scalar|Param|null, // CAS server validation URL + * prefix?: scalar|Param|null, // CAS prefix // Default: "cas" + * http_client?: scalar|Param|null, // HTTP Client service // Default: null * }, + * oauth2?: scalar|Param|null, * }, - * cas?: array{ - * validation_url: scalar|null, // CAS server validation URL - * prefix?: scalar|null, // CAS prefix // Default: "cas" - * http_client?: scalar|null, // HTTP Client service // Default: null - * }, - * oauth2?: scalar|null, * }, - * }, - * http_basic?: array{ - * provider?: scalar|null, - * realm?: scalar|null, // Default: "Secured Area" - * }, - * http_basic_ldap?: array{ - * provider?: scalar|null, - * realm?: scalar|null, // Default: "Secured Area" - * service?: scalar|null, // Default: "ldap" - * dn_string?: scalar|null, // Default: "{user_identifier}" - * query_string?: scalar|null, - * search_dn?: scalar|null, // Default: "" - * search_password?: scalar|null, // Default: "" - * }, - * remember_me?: array{ - * secret?: scalar|null, // Default: "%kernel.secret%" - * service?: scalar|null, - * user_providers?: list, - * catch_exceptions?: bool, // Default: true - * signature_properties?: list, - * token_provider?: string|array{ - * service?: scalar|null, // The service ID of a custom remember-me token provider. - * doctrine?: bool|array{ - * enabled?: bool, // Default: false - * connection?: scalar|null, // Default: null + * http_basic?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * }, + * http_basic_ldap?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * remember_me?: array{ + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * service?: scalar|Param|null, + * user_providers?: string|list, + * catch_exceptions?: bool|Param, // Default: true + * signature_properties?: list, + * token_provider?: string|array{ + * service?: scalar|Param|null, // The service ID of a custom remember-me token provider. + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: false + * connection?: scalar|Param|null, // Default: null + * }, * }, + * token_verifier?: scalar|Param|null, // The service ID of a custom rememberme token verifier. + * name?: scalar|Param|null, // Default: "REMEMBERME" + * lifetime?: int|Param, // Default: 31536000 + * path?: scalar|Param|null, // Default: "/" + * domain?: scalar|Param|null, // Default: null + * secure?: true|false|"auto"|Param, // Default: null + * httponly?: bool|Param, // Default: true + * samesite?: null|"lax"|"strict"|"none"|Param, // Default: "strict" + * always_remember_me?: bool|Param, // Default: false + * remember_me_parameter?: scalar|Param|null, // Default: "_remember_me" * }, - * token_verifier?: scalar|null, // The service ID of a custom rememberme token verifier. - * name?: scalar|null, // Default: "REMEMBERME" - * lifetime?: int, // Default: 31536000 - * path?: scalar|null, // Default: "/" - * domain?: scalar|null, // Default: null - * secure?: true|false|"auto", // Default: null - * httponly?: bool, // Default: true - * samesite?: null|"lax"|"strict"|"none", // Default: "strict" - * always_remember_me?: bool, // Default: false - * remember_me_parameter?: scalar|null, // Default: "_remember_me" - * }, - * }>, + * }>, * access_control?: list, - * attributes?: array, - * route?: scalar|null, // Default: null - * methods?: list, - * allow_if?: scalar|null, // Default: null - * roles?: list, - * }>, - * role_hierarchy?: array>, + * request_matcher?: scalar|Param|null, // Default: null + * requires_channel?: scalar|Param|null, // Default: null + * path?: scalar|Param|null, // Use the urldecoded format. // Default: null + * host?: scalar|Param|null, // Default: null + * port?: int|Param, // Default: null + * ips?: string|list, + * attributes?: array, + * route?: scalar|Param|null, // Default: null + * methods?: string|list, + * allow_if?: scalar|Param|null, // Default: null + * roles?: string|list, + * }>, + * role_hierarchy?: array>, * } * @psalm-type KnpMenuConfig = array{ * providers?: array{ - * builder_alias?: bool, // Default: true + * builder_alias?: bool|Param, // Default: true * }, * twig?: array{ - * template?: scalar|null, // Default: "@KnpMenu/menu.html.twig" + * template?: scalar|Param|null, // Default: "@KnpMenu/menu.html.twig" * }, - * templating?: bool, // Default: false - * default_renderer?: scalar|null, // Default: "twig" + * templating?: bool|Param, // Default: false + * default_renderer?: scalar|Param|null, // Default: "twig" * } * @psalm-type KnpPaginatorConfig = array{ * default_options?: array{ - * sort_field_name?: scalar|null, // Default: "sort" - * sort_direction_name?: scalar|null, // Default: "direction" - * filter_field_name?: scalar|null, // Default: "filterField" - * filter_value_name?: scalar|null, // Default: "filterValue" - * page_name?: scalar|null, // Default: "page" - * distinct?: bool, // Default: true - * page_out_of_range?: scalar|null, // Default: "ignore" - * default_limit?: scalar|null, // Default: 10 + * sort_field_name?: scalar|Param|null, // Default: "sort" + * sort_direction_name?: scalar|Param|null, // Default: "direction" + * filter_field_name?: scalar|Param|null, // Default: "filterField" + * filter_value_name?: scalar|Param|null, // Default: "filterValue" + * page_name?: scalar|Param|null, // Default: "page" + * distinct?: bool|Param, // Default: true + * page_out_of_range?: scalar|Param|null, // Default: "ignore" + * default_limit?: scalar|Param|null, // Default: 10 * }, * template?: array{ - * pagination?: scalar|null, // Default: "@KnpPaginator/Pagination/sliding.html.twig" - * rel_links?: scalar|null, // Default: "@KnpPaginator/Pagination/rel_links.html.twig" - * filtration?: scalar|null, // Default: "@KnpPaginator/Pagination/filtration.html.twig" - * sortable?: scalar|null, // Default: "@KnpPaginator/Pagination/sortable_link.html.twig" - * }, - * page_range?: scalar|null, // Default: 5 - * page_limit?: scalar|null, // Default: null - * convert_exception?: bool, // Default: false - * remove_first_page_param?: bool, // Default: false + * pagination?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/sliding.html.twig" + * rel_links?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/rel_links.html.twig" + * filtration?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/filtration.html.twig" + * sortable?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/sortable_link.html.twig" + * }, + * page_range?: scalar|Param|null, // Default: 5 + * page_limit?: scalar|Param|null, // Default: null + * convert_exception?: bool|Param, // Default: false + * remove_first_page_param?: bool|Param, // Default: false * } * @psalm-type TwigExtraConfig = array{ * cache?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * html?: bool|array{ - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, * markdown?: bool|array{ - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, * intl?: bool|array{ - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, * cssinliner?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * inky?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * string?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * commonmark?: array{ * renderer?: array{ // Array of options for rendering HTML. - * block_separator?: scalar|null, - * inner_separator?: scalar|null, - * soft_break?: scalar|null, + * block_separator?: scalar|Param|null, + * inner_separator?: scalar|Param|null, + * soft_break?: scalar|Param|null, * }, - * html_input?: "strip"|"allow"|"escape", // How to handle HTML input. - * allow_unsafe_links?: bool, // Remove risky link and image URLs by setting this to false. // Default: true - * max_nesting_level?: int, // The maximum nesting level for blocks. // Default: 9223372036854775807 - * max_delimiters_per_line?: int, // The maximum number of strong/emphasis delimiters per line. // Default: 9223372036854775807 + * html_input?: "strip"|"allow"|"escape"|Param, // How to handle HTML input. + * allow_unsafe_links?: bool|Param, // Remove risky link and image URLs by setting this to false. // Default: true + * max_nesting_level?: int|Param, // The maximum nesting level for blocks. // Default: 9223372036854775807 + * max_delimiters_per_line?: int|Param, // The maximum number of strong/emphasis delimiters per line. // Default: 9223372036854775807 * slug_normalizer?: array{ // Array of options for configuring how URL-safe slugs are created. * instance?: mixed, - * max_length?: int, // Default: 255 + * max_length?: int|Param, // Default: 255 * unique?: mixed, * }, * commonmark?: array{ // Array of options for configuring the CommonMark core extension. - * enable_em?: bool, // Default: true - * enable_strong?: bool, // Default: true - * use_asterisk?: bool, // Default: true - * use_underscore?: bool, // Default: true - * unordered_list_markers?: list, + * enable_em?: bool|Param, // Default: true + * enable_strong?: bool|Param, // Default: true + * use_asterisk?: bool|Param, // Default: true + * use_underscore?: bool|Param, // Default: true + * unordered_list_markers?: list, * }, - * ... + * ... * }, * } * @psalm-type MakerConfig = array{ - * root_namespace?: scalar|null, // Default: "App" - * generate_final_classes?: bool, // Default: true - * generate_final_entities?: bool, // Default: false + * root_namespace?: scalar|Param|null, // Default: "App" + * generate_final_classes?: bool|Param, // Default: true + * generate_final_entities?: bool|Param, // Default: false * } * @psalm-type WebProfilerConfig = array{ * toolbar?: bool|array{ // Profiler toolbar configuration - * enabled?: bool, // Default: false - * ajax_replace?: bool, // Replace toolbar on AJAX requests // Default: false + * enabled?: bool|Param, // Default: false + * ajax_replace?: bool|Param, // Replace toolbar on AJAX requests // Default: false * }, - * intercept_redirects?: bool, // Default: false - * excluded_ajax_paths?: scalar|null, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" + * intercept_redirects?: bool|Param, // Default: false + * excluded_ajax_paths?: scalar|Param|null, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" * } * @psalm-type NelmioCorsConfig = array{ * defaults?: array{ - * allow_credentials?: bool, // Default: false - * allow_origin?: list, - * allow_headers?: list, - * allow_methods?: list, - * allow_private_network?: bool, // Default: false - * expose_headers?: list, - * max_age?: scalar|null, // Default: 0 - * hosts?: list, - * origin_regex?: bool, // Default: false - * forced_allow_origin_value?: scalar|null, // Default: null - * skip_same_as_origin?: bool, // Default: true + * allow_credentials?: bool|Param, // Default: false + * allow_origin?: list, + * allow_headers?: list, + * allow_methods?: list, + * allow_private_network?: bool|Param, // Default: false + * expose_headers?: list, + * max_age?: scalar|Param|null, // Default: 0 + * hosts?: list, + * origin_regex?: bool|Param, // Default: false + * forced_allow_origin_value?: scalar|Param|null, // Default: null + * skip_same_as_origin?: bool|Param, // Default: true * }, * paths?: array, - * allow_headers?: list, - * allow_methods?: list, - * allow_private_network?: bool, - * expose_headers?: list, - * max_age?: scalar|null, // Default: 0 - * hosts?: list, - * origin_regex?: bool, - * forced_allow_origin_value?: scalar|null, // Default: null - * skip_same_as_origin?: bool, - * }>, + * allow_credentials?: bool|Param, + * allow_origin?: list, + * allow_headers?: list, + * allow_methods?: list, + * allow_private_network?: bool|Param, + * expose_headers?: list, + * max_age?: scalar|Param|null, // Default: 0 + * hosts?: list, + * origin_regex?: bool|Param, + * forced_allow_origin_value?: scalar|Param|null, // Default: null + * skip_same_as_origin?: bool|Param, + * }>, * } * @psalm-type DebugConfig = array{ - * max_items?: int, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500 - * min_depth?: int, // Minimum tree depth to clone all the items, 1 is default. // Default: 1 - * max_string_length?: int, // Max length of displayed strings, -1 means no limit. // Default: -1 - * dump_destination?: scalar|null, // A stream URL where dumps should be written to. // Default: null - * theme?: "dark"|"light", // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark" + * max_items?: int|Param, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500 + * min_depth?: int|Param, // Minimum tree depth to clone all the items, 1 is default. // Default: 1 + * max_string_length?: int|Param, // Max length of displayed strings, -1 means no limit. // Default: -1 + * dump_destination?: scalar|Param|null, // A stream URL where dumps should be written to. // Default: null + * theme?: "dark"|"light"|Param, // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark" * } * @psalm-type VichUploaderConfig = array{ - * default_filename_attribute_suffix?: scalar|null, // Default: "_name" - * db_driver: scalar|null, - * storage?: scalar|null, // Default: "file_system" - * use_flysystem_to_resolve_uri?: bool, // Default: false - * twig?: scalar|null, // twig requires templating // Default: true - * form?: scalar|null, // Default: true + * default_filename_attribute_suffix?: scalar|Param|null, // Default: "_name" + * db_driver?: scalar|Param|null, + * storage?: scalar|Param|null, // Default: "file_system" + * use_flysystem_to_resolve_uri?: bool|Param, // Default: false + * twig?: scalar|Param|null, // twig requires templating // Default: true + * form?: scalar|Param|null, // Default: true * metadata?: array{ - * cache?: scalar|null, // Default: "file" - * type?: scalar|null, // Default: "attribute" + * cache?: scalar|Param|null, // Default: "file" + * type?: scalar|Param|null, // Default: "attribute" * file_cache?: array{ - * dir?: scalar|null, // Default: "%kernel.cache_dir%/vich_uploader" + * dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/vich_uploader" * }, - * auto_detection?: bool, // Default: true + * auto_detection?: bool|Param, // Default: true * directories?: list, + * path?: scalar|Param|null, + * namespace_prefix?: scalar|Param|null, // Default: "" + * }>, * }, * mappings?: array, + * uri_prefix?: scalar|Param|null, // Default: "/uploads" + * upload_destination?: scalar|Param|null, // Default: null + * namer?: string|array{ + * service?: scalar|Param|null, // Default: null + * options?: mixed, // Default: null + * }, + * directory_namer?: string|array{ + * service?: scalar|Param|null, // Default: null + * options?: mixed, // Default: null + * }, + * delete_on_remove?: scalar|Param|null, // Default: true + * erase_fields?: scalar|Param|null, // Default: true + * delete_on_update?: scalar|Param|null, // Default: true + * inject_on_load?: scalar|Param|null, // Default: false + * namer_keep_extension?: scalar|Param|null, // Default: false + * db_driver?: scalar|Param|null, // Default: null + * }>, * } * @psalm-type FlysystemConfig = array{ * storages?: array, - * visibility?: scalar|null, // Default: null - * directory_visibility?: scalar|null, // Default: null - * retain_visibility?: bool|null, // Default: null - * case_sensitive?: bool, // Default: true - * disable_asserts?: bool, // Default: false - * public_url?: list, - * path_normalizer?: scalar|null, // Default: null - * public_url_generator?: scalar|null, // Default: null - * temporary_url_generator?: scalar|null, // Default: null - * read_only?: bool, // Default: false - * }>, + * adapter?: scalar|Param|null, // DEPRECATED: Use the new config format instead (e.g. "local:" instead of "adapter: local") + * options?: list, + * asyncaws?: array{ + * client?: scalar|Param|null, // The AsyncAws S3 client service name + * bucket?: scalar|Param|null, // The name of the AWS S3 bucket + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all object keys // Default: "" + * }, + * aws?: array{ + * client?: scalar|Param|null, // The AWS S3 client service name + * bucket?: scalar|Param|null, // The name of the AWS S3 bucket + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all object keys // Default: "" + * options?: list, + * streamReads?: bool|Param, // Whether to use streaming for file reads // Default: true + * }, + * azure?: array{ + * client?: scalar|Param|null, // The Azure Blob Storage client service name + * container?: scalar|Param|null, // The name of the Azure Blob Storage container + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all blob names // Default: "" + * }, + * ftp?: array{ + * host?: scalar|Param|null, // FTP host + * username?: scalar|Param|null, // FTP username + * password?: scalar|Param|null, // FTP password + * port?: int|Param, // FTP port number // Default: 21 + * root?: scalar|Param|null, // FTP root directory // Default: "" + * passive?: bool|Param, // Use passive mode // Default: true + * ssl?: bool|Param, // Use SSL/TLS encryption // Default: false + * timeout?: int|Param, // Connection timeout in seconds // Default: 90 + * ignore_passive_address?: scalar|Param|null, // Ignore passive address // Default: null + * utf8?: bool|Param, // Enable UTF8 mode // Default: false + * transfer_mode?: scalar|Param|null, // Transfer mode (FTP_ASCII or FTP_BINARY constante on ftp extension) // Default: null + * system_type?: null|"windows"|"unix"|Param, // FTP system type // Default: null + * timestamps_on_unix_listings_enabled?: bool|Param, // Enable timestamps on Unix listings // Default: false + * recurse_manually?: bool|Param, // Recurse directories manually // Default: true + * use_raw_list_options?: bool|Param|null, // Use raw list options // Default: null + * connectivityChecker?: scalar|Param|null, // Connectivity checker service name // Default: null + * permissions?: array{ // Unix permissions configuration for files and directories + * file?: array{ // File permissions + * public?: int|Param, // Public file permissions // Default: 420 + * private?: int|Param, // Private file permissions // Default: 384 + * }, + * dir?: array{ // Directory permissions + * public?: int|Param, // Public directory permissions // Default: 493 + * private?: int|Param, // Private directory permissions // Default: 448 + * }, + * }, + * }, + * gcloud?: array{ + * client?: scalar|Param|null, // The Google Cloud Storage client service name + * bucket?: scalar|Param|null, // The name of the Google Cloud Storage bucket + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all object keys // Default: "" + * visibility_handler?: scalar|Param|null, // Optional visibility handler service name // Default: null + * streamReads?: bool|Param, // Whether to use streaming for file reads // Default: false + * }, + * gridfs?: array{ + * bucket?: scalar|Param|null, // GridFS bucket service name (if using an existing bucket service) // Default: null + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all file names // Default: "" + * database?: scalar|Param|null, // MongoDB database name // Default: null + * doctrine_connection?: scalar|Param|null, // Doctrine MongoDB connection name (mutually exclusive with mongodb_uri) + * mongodb_uri?: scalar|Param|null, // MongoDB connection URI (mutually exclusive with doctrine_connection) + * mongodb_uri_options?: list, + * mongodb_driver_options?: list, + * }, + * lazy?: array{ // Lazy adapter for runtime storage selection + * source?: scalar|Param|null, // The service name of the storage to use at runtime + * }, + * local?: array{ + * directory?: scalar|Param|null, // Directory path for local storage + * lock?: int|Param, // Lock flags for file operations // Default: 0 + * skip_links?: bool|Param, // Whether to skip symbolic links // Default: false + * lazy_root_creation?: bool|Param, // Whether to create the root directory lazily // Default: false + * permissions?: array{ // Unix permissions configuration for files and directories + * file?: array{ // File permissions + * public?: int|Param, // Public file permissions // Default: 420 + * private?: int|Param, // Private file permissions // Default: 384 + * }, + * dir?: array{ // Directory permissions + * public?: int|Param, // Public directory permissions // Default: 493 + * private?: int|Param, // Private directory permissions // Default: 448 + * }, + * }, + * }, + * memory?: array, + * sftp?: array{ + * host?: scalar|Param|null, // SFTP host + * username?: scalar|Param|null, // SFTP username + * password?: scalar|Param|null, // SFTP password (optional if using private key) // Default: null + * privateKey?: scalar|Param|null, // Path to private key file or private key content // Default: null + * passphrase?: scalar|Param|null, // Private key passphrase // Default: null + * port?: int|Param, // SFTP port number // Default: 22 + * timeout?: int|Param, // Connection timeout in seconds // Default: 90 + * hostFingerprint?: scalar|Param|null, // Host fingerprint for verification // Default: null + * connectivityChecker?: scalar|Param|null, // Connectivity checker service name // Default: null + * preferredAlgorithms?: list, + * root?: scalar|Param|null, // SFTP root directory // Default: "" + * permissions?: array{ // Unix permissions configuration for files and directories + * file?: array{ // File permissions + * public?: int|Param, // Public file permissions // Default: 420 + * private?: int|Param, // Private file permissions // Default: 384 + * }, + * dir?: array{ // Directory permissions + * public?: int|Param, // Public directory permissions // Default: 493 + * private?: int|Param, // Private directory permissions // Default: 448 + * }, + * }, + * }, + * webdav?: array{ + * client?: scalar|Param|null, // The WebDAV client service name + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all paths // Default: "" + * visibility_handling?: "throw"|"ignore"|Param, // How to handle visibility operations // Default: "throw" + * manual_copy?: bool|Param, // Whether to handle copy operations manually // Default: false + * manual_move?: bool|Param, // Whether to handle move operations manually // Default: false + * }, + * bunnycdn?: array{ + * client?: scalar|Param|null, // The BunnyCDN client service name + * pull_zone?: scalar|Param|null, // The BunnyCDN pull zone name // Default: "" + * }, + * service?: scalar|Param|null, // Reference to a custom adapter service (alternative to registered adapter types) + * visibility?: scalar|Param|null, // Default visibility for files // Default: null + * directory_visibility?: scalar|Param|null, // Default visibility for directories // Default: null + * retain_visibility?: scalar|Param|null, // Keeps the original file visibility (public/private) when copying or moving. // Default: null + * case_sensitive?: bool|Param, // Deprecated: The "case_sensitive" option is deprecated and will be removed in 4.0. // Default: true + * disable_asserts?: bool|Param, // Deprecated: The "disable_asserts" option is deprecated and will be removed in 4.0. // Default: false + * public_url?: list, + * path_normalizer?: scalar|Param|null, // Path normalizer service name (should implement League\Flysystem\PathNormalizer) // Default: null + * public_url_generator?: scalar|Param|null, // For adapter that do not provide public URLs or override adapter capabilities and public_url option, a public URL generator service name can be configured in the main Filesystem configuration (should implement League\Flysystem\PublicUrlGenerator) // Default: null + * temporary_url_generator?: scalar|Param|null, // For adapter that do not provide public URLs or override adapter capabilities, a temporary URL generator service name can be configured in the main Filesystem configuration (should implement League\Flysystem\TemporaryUrlGenerator) // Default: null + * read_only?: bool|Param, // Converts a file system to read-only // Default: false + * }>, * } * @psalm-type LiipImagineConfig = array{ * resolvers?: array, - * get_options?: array, - * put_options?: array, - * proxies?: array, - * }, - * flysystem?: array{ - * filesystem_service: scalar|null, - * cache_prefix?: scalar|null, // Default: "" - * root_url: scalar|null, - * visibility?: "public"|"private"|"noPredefinedVisibility", // Default: "public" - * }, - * }>, + * web_path?: array{ + * web_root?: scalar|Param|null, // Default: "%kernel.project_dir%/public" + * cache_prefix?: scalar|Param|null, // Default: "media/cache" + * }, + * aws_s3?: array{ + * bucket?: scalar|Param|null, + * cache?: scalar|Param|null, // Default: false + * use_psr_cache?: bool|Param, // Default: false + * acl?: scalar|Param|null, // Default: "public-read" + * cache_prefix?: scalar|Param|null, // Default: "" + * client_id?: scalar|Param|null, // Default: null + * client_config?: list, + * get_options?: array, + * put_options?: array, + * proxies?: array, + * }, + * flysystem?: array{ + * filesystem_service?: scalar|Param|null, + * cache_prefix?: scalar|Param|null, // Default: "" + * root_url?: scalar|Param|null, + * visibility?: "public"|"private"|"noPredefinedVisibility"|Param, // Default: "public" + * }, + * }>, * loaders?: array, - * allow_unresolvable_data_roots?: bool, // Default: false - * bundle_resources?: array{ - * enabled?: bool, // Default: false - * access_control_type?: "blacklist"|"whitelist", // Sets the access control method applied to bundle names in "access_control_list" into a blacklist or whitelist. // Default: "blacklist" - * access_control_list?: list, + * stream?: array{ + * wrapper?: scalar|Param|null, + * context?: scalar|Param|null, // Default: null * }, - * }, - * flysystem?: array{ - * filesystem_service: scalar|null, - * }, - * chain?: array{ - * loaders: list, - * }, - * }>, - * driver?: scalar|null, // Default: "gd" - * cache?: scalar|null, // Default: "default" - * cache_base_path?: scalar|null, // Default: "" - * data_loader?: scalar|null, // Default: "default" - * default_image?: scalar|null, // Default: null + * filesystem?: array{ + * locator?: "filesystem"|"filesystem_insecure"|Param, // Using the "filesystem_insecure" locator is not recommended due to a less secure resolver mechanism, but is provided for those using heavily symlinked projects. // Default: "filesystem" + * data_root?: string|list, + * allow_unresolvable_data_roots?: bool|Param, // Default: false + * bundle_resources?: array{ + * enabled?: bool|Param, // Default: false + * access_control_type?: "blacklist"|"whitelist"|Param, // Sets the access control method applied to bundle names in "access_control_list" into a blacklist or whitelist. // Default: "blacklist" + * access_control_list?: list, + * }, + * }, + * flysystem?: array{ + * filesystem_service?: scalar|Param|null, + * }, + * asset_mapper?: array, + * chain?: array{ + * loaders?: list, + * }, + * }>, + * driver?: scalar|Param|null, // Default: "gd" + * cache?: scalar|Param|null, // Default: "default" + * cache_base_path?: scalar|Param|null, // Default: "" + * data_loader?: scalar|Param|null, // Default: "default" + * default_image?: scalar|Param|null, // Default: null * default_filter_set_settings?: array{ - * quality?: scalar|null, // Default: 100 - * jpeg_quality?: scalar|null, // Default: null - * png_compression_level?: scalar|null, // Default: null - * png_compression_filter?: scalar|null, // Default: null - * format?: scalar|null, // Default: null - * animated?: bool, // Default: false - * cache?: scalar|null, // Default: null - * data_loader?: scalar|null, // Default: null - * default_image?: scalar|null, // Default: null + * quality?: scalar|Param|null, // Default: 100 + * jpeg_quality?: scalar|Param|null, // Default: null + * png_compression_level?: scalar|Param|null, // Default: null + * png_compression_filter?: scalar|Param|null, // Default: null + * format?: scalar|Param|null, // Default: null + * animated?: bool|Param, // Default: false + * cache?: scalar|Param|null, // Default: null + * data_loader?: scalar|Param|null, // Default: null + * default_image?: scalar|Param|null, // Default: null * filters?: array>, * post_processors?: array>, * }, * controller?: array{ - * filter_action?: scalar|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterAction" - * filter_runtime_action?: scalar|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterRuntimeAction" - * redirect_response_code?: int, // Default: 302 + * filter_action?: scalar|Param|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterAction" + * filter_runtime_action?: scalar|Param|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterRuntimeAction" + * redirect_response_code?: int|Param, // Default: 302 * }, * filter_sets?: array>, - * post_processors?: array>, - * }>, + * quality?: scalar|Param|null, + * jpeg_quality?: scalar|Param|null, + * png_compression_level?: scalar|Param|null, + * png_compression_filter?: scalar|Param|null, + * format?: scalar|Param|null, + * animated?: bool|Param, + * cache?: scalar|Param|null, + * data_loader?: scalar|Param|null, + * default_image?: scalar|Param|null, + * filters?: array>, + * post_processors?: array>, + * }>, * twig?: array{ - * mode?: "none"|"lazy"|"legacy", // Twig mode: none/lazy/legacy (default) // Default: "legacy" - * assets_version?: scalar|null, // Default: null + * mode?: "none"|"lazy"|"legacy"|Param, // Twig mode: none/lazy/legacy (default) // Default: "legacy" + * assets_version?: scalar|Param|null, // Default: null * }, - * enqueue?: bool, // Enables integration with enqueue if set true. Allows resolve image caches in background by sending messages to MQ. // Default: false + * enqueue?: bool|Param, // Enables integration with enqueue if set true. Allows resolve image caches in background by sending messages to MQ. // Default: false * messenger?: bool|array{ // Enables integration with symfony/messenger if set true. Warmup image caches in background by sending messages to MQ. - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, - * templating?: bool, // Enables integration with symfony/templating component // Default: true + * templating?: bool|Param, // Enables integration with symfony/templating component // Default: true * webp?: array{ - * generate?: bool, // Default: false - * quality?: int, // Default: 100 - * cache?: scalar|null, // Default: null - * data_loader?: scalar|null, // Default: null + * generate?: bool|Param, // Default: false + * quality?: int|Param, // Default: 100 + * cache?: scalar|Param|null, // Default: null + * data_loader?: scalar|Param|null, // Default: null * post_processors?: array>, * }, * } * @psalm-type WebpackEncoreConfig = array{ - * output_path: scalar|null, // The path where Encore is building the assets - i.e. Encore.setOutputPath() - * crossorigin?: false|"anonymous"|"use-credentials", // crossorigin value when Encore.enableIntegrityHashes() is used, can be false (default), anonymous or use-credentials // Default: false - * preload?: bool, // preload all rendered script and link tags automatically via the http2 Link header. // Default: false - * cache?: bool, // Enable caching of the entry point file(s) // Default: false - * strict_mode?: bool, // Throw an exception if the entrypoints.json file is missing or an entry is missing from the data // Default: true - * builds?: array, - * script_attributes?: array, - * link_attributes?: array, + * output_path?: scalar|Param|null, // The path where Encore is building the assets - i.e. Encore.setOutputPath() + * crossorigin?: false|"anonymous"|"use-credentials"|Param, // crossorigin value when Encore.enableIntegrityHashes() is used, can be false (default), anonymous or use-credentials // Default: false + * preload?: bool|Param, // preload all rendered script and link tags automatically via the http2 Link header. // Default: false + * cache?: bool|Param, // Enable caching of the entry point file(s) // Default: false + * strict_mode?: bool|Param, // Throw an exception if the entrypoints.json file is missing or an entry is missing from the data // Default: true + * builds?: array, + * script_attributes?: array, + * link_attributes?: array, * } * @psalm-type TwigComponentConfig = array{ * defaults?: array, - * anonymous_template_directory?: scalar|null, // Defaults to `components` - * profiler?: bool, // Enables the profiler for Twig Component (in debug mode) // Default: "%kernel.debug%" - * controllers_json?: scalar|null, // Deprecated: The "twig_component.controllers_json" config option is deprecated, and will be removed in 3.0. // Default: null + * template_directory?: scalar|Param|null, // Default: "components" + * name_prefix?: scalar|Param|null, // Default: "" + * }>, + * anonymous_template_directory?: scalar|Param|null, // Defaults to `components` + * profiler?: bool|array{ // Enables the profiler for Twig Component + * enabled?: bool|Param, // Default: "%kernel.debug%" + * collect_components?: bool|Param, // Collect components instances // Default: true + * }, + * controllers_json?: scalar|Param|null, // Deprecated: The "twig_component.controllers_json" config option is deprecated, and will be removed in 3.0. // Default: null * } * @psalm-type MonologConfig = array{ - * use_microseconds?: scalar|null, // Default: true - * channels?: list, + * use_microseconds?: scalar|Param|null, // Default: true + * channels?: list, * handlers?: array, + * type?: scalar|Param|null, + * id?: scalar|Param|null, + * enabled?: bool|Param, // Default: true + * priority?: scalar|Param|null, // Default: 0 + * level?: scalar|Param|null, // Default: "DEBUG" + * bubble?: bool|Param, // Default: true + * interactive_only?: bool|Param, // Default: false + * app_name?: scalar|Param|null, // Default: null + * include_stacktraces?: bool|Param, // Default: false + * process_psr_3_messages?: array{ + * enabled?: bool|Param|null, // Default: null + * date_format?: scalar|Param|null, + * remove_used_context_fields?: bool|Param, + * }, + * path?: scalar|Param|null, // Default: "%kernel.logs_dir%/%kernel.environment%.log" + * file_permission?: scalar|Param|null, // Default: null + * use_locking?: bool|Param, // Default: false + * filename_format?: scalar|Param|null, // Default: "{filename}-{date}" + * date_format?: scalar|Param|null, // Default: "Y-m-d" + * ident?: scalar|Param|null, // Default: false + * logopts?: scalar|Param|null, // Default: 1 + * facility?: scalar|Param|null, // Default: "user" + * max_files?: scalar|Param|null, // Default: 0 + * action_level?: scalar|Param|null, // Default: "WARNING" + * activation_strategy?: scalar|Param|null, // Default: null + * stop_buffering?: bool|Param, // Default: true + * passthru_level?: scalar|Param|null, // Default: null + * excluded_http_codes?: list, + * }>, + * accepted_levels?: list, + * min_level?: scalar|Param|null, // Default: "DEBUG" + * max_level?: scalar|Param|null, // Default: "EMERGENCY" + * buffer_size?: scalar|Param|null, // Default: 0 + * flush_on_overflow?: bool|Param, // Default: false + * handler?: scalar|Param|null, + * url?: scalar|Param|null, + * exchange?: scalar|Param|null, + * exchange_name?: scalar|Param|null, // Default: "log" + * channel?: scalar|Param|null, // Default: null + * bot_name?: scalar|Param|null, // Default: "Monolog" + * use_attachment?: scalar|Param|null, // Default: true + * use_short_attachment?: scalar|Param|null, // Default: false + * include_extra?: scalar|Param|null, // Default: false + * icon_emoji?: scalar|Param|null, // Default: null + * webhook_url?: scalar|Param|null, + * exclude_fields?: list, + * token?: scalar|Param|null, + * region?: scalar|Param|null, + * source?: scalar|Param|null, + * use_ssl?: bool|Param, // Default: true + * user?: mixed, + * title?: scalar|Param|null, // Default: null + * host?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 514 + * config?: list, + * members?: list, + * connection_string?: scalar|Param|null, + * timeout?: scalar|Param|null, + * time?: scalar|Param|null, // Default: 60 + * deduplication_level?: scalar|Param|null, // Default: 400 + * store?: scalar|Param|null, // Default: null + * connection_timeout?: scalar|Param|null, + * persistent?: bool|Param, + * message_type?: scalar|Param|null, // Default: 0 + * parse_mode?: scalar|Param|null, // Default: null + * disable_webpage_preview?: bool|Param|null, // Default: null + * disable_notification?: bool|Param|null, // Default: null + * split_long_messages?: bool|Param, // Default: false + * delay_between_messages?: bool|Param, // Default: false + * topic?: int|Param, // Default: null + * factor?: int|Param, // Default: 1 + * tags?: string|list, + * console_formatter_options?: mixed, // Default: [] + * formatter?: scalar|Param|null, + * nested?: bool|Param, // Default: false + * publisher?: string|array{ + * id?: scalar|Param|null, + * hostname?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 12201 + * chunk_size?: scalar|Param|null, // Default: 1420 + * encoder?: "json"|"compressed_json"|Param, + * }, + * mongodb?: string|array{ + * id?: scalar|Param|null, // ID of a MongoDB\Client service + * uri?: scalar|Param|null, + * username?: scalar|Param|null, + * password?: scalar|Param|null, + * database?: scalar|Param|null, // Default: "monolog" + * collection?: scalar|Param|null, // Default: "logs" + * }, + * elasticsearch?: string|array{ + * id?: scalar|Param|null, + * hosts?: list, + * host?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 9200 + * transport?: scalar|Param|null, // Default: "Http" + * user?: scalar|Param|null, // Default: null + * password?: scalar|Param|null, // Default: null + * }, + * index?: scalar|Param|null, // Default: "monolog" + * document_type?: scalar|Param|null, // Default: "logs" + * ignore_error?: scalar|Param|null, // Default: false + * redis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * password?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 6379 + * database?: scalar|Param|null, // Default: 0 + * key_name?: scalar|Param|null, // Default: "monolog_redis" + * }, + * predis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * }, + * from_email?: scalar|Param|null, + * to_email?: string|list, + * subject?: scalar|Param|null, + * content_type?: scalar|Param|null, // Default: null + * headers?: list, + * mailer?: scalar|Param|null, // Default: null + * email_prototype?: string|array{ + * id?: scalar|Param|null, + * method?: scalar|Param|null, // Default: null + * }, + * verbosity_levels?: array{ + * VERBOSITY_QUIET?: scalar|Param|null, // Default: "ERROR" + * VERBOSITY_NORMAL?: scalar|Param|null, // Default: "WARNING" + * VERBOSITY_VERBOSE?: scalar|Param|null, // Default: "NOTICE" + * VERBOSITY_VERY_VERBOSE?: scalar|Param|null, // Default: "INFO" + * VERBOSITY_DEBUG?: scalar|Param|null, // Default: "DEBUG" + * }, + * channels?: string|array{ + * type?: scalar|Param|null, + * elements?: list, + * }, * }>, - * accepted_levels?: list, - * min_level?: scalar|null, // Default: "DEBUG" - * max_level?: scalar|null, // Default: "EMERGENCY" - * buffer_size?: scalar|null, // Default: 0 - * flush_on_overflow?: bool, // Default: false - * handler?: scalar|null, - * url?: scalar|null, - * exchange?: scalar|null, - * exchange_name?: scalar|null, // Default: "log" - * channel?: scalar|null, // Default: null - * bot_name?: scalar|null, // Default: "Monolog" - * use_attachment?: scalar|null, // Default: true - * use_short_attachment?: scalar|null, // Default: false - * include_extra?: scalar|null, // Default: false - * icon_emoji?: scalar|null, // Default: null - * webhook_url?: scalar|null, - * exclude_fields?: list, - * token?: scalar|null, - * region?: scalar|null, - * source?: scalar|null, - * use_ssl?: bool, // Default: true - * user?: mixed, - * title?: scalar|null, // Default: null - * host?: scalar|null, // Default: null - * port?: scalar|null, // Default: 514 - * config?: list, - * members?: list, - * connection_string?: scalar|null, - * timeout?: scalar|null, - * time?: scalar|null, // Default: 60 - * deduplication_level?: scalar|null, // Default: 400 - * store?: scalar|null, // Default: null - * connection_timeout?: scalar|null, - * persistent?: bool, - * message_type?: scalar|null, // Default: 0 - * parse_mode?: scalar|null, // Default: null - * disable_webpage_preview?: bool|null, // Default: null - * disable_notification?: bool|null, // Default: null - * split_long_messages?: bool, // Default: false - * delay_between_messages?: bool, // Default: false - * topic?: int, // Default: null - * factor?: int, // Default: 1 - * tags?: list, - * console_formatter_options?: mixed, // Default: [] - * formatter?: scalar|null, - * nested?: bool, // Default: false - * publisher?: string|array{ - * id?: scalar|null, - * hostname?: scalar|null, - * port?: scalar|null, // Default: 12201 - * chunk_size?: scalar|null, // Default: 1420 - * encoder?: "json"|"compressed_json", - * }, - * mongodb?: string|array{ - * id?: scalar|null, // ID of a MongoDB\Client service - * uri?: scalar|null, - * username?: scalar|null, - * password?: scalar|null, - * database?: scalar|null, // Default: "monolog" - * collection?: scalar|null, // Default: "logs" - * }, - * elasticsearch?: string|array{ - * id?: scalar|null, - * hosts?: list, - * host?: scalar|null, - * port?: scalar|null, // Default: 9200 - * transport?: scalar|null, // Default: "Http" - * user?: scalar|null, // Default: null - * password?: scalar|null, // Default: null - * }, - * index?: scalar|null, // Default: "monolog" - * document_type?: scalar|null, // Default: "logs" - * ignore_error?: scalar|null, // Default: false - * redis?: string|array{ - * id?: scalar|null, - * host?: scalar|null, - * password?: scalar|null, // Default: null - * port?: scalar|null, // Default: 6379 - * database?: scalar|null, // Default: 0 - * key_name?: scalar|null, // Default: "monolog_redis" - * }, - * predis?: string|array{ - * id?: scalar|null, - * host?: scalar|null, - * }, - * from_email?: scalar|null, - * to_email?: list, - * subject?: scalar|null, - * content_type?: scalar|null, // Default: null - * headers?: list, - * mailer?: scalar|null, // Default: null - * email_prototype?: string|array{ - * id: scalar|null, - * method?: scalar|null, // Default: null - * }, - * verbosity_levels?: array{ - * VERBOSITY_QUIET?: scalar|null, // Default: "ERROR" - * VERBOSITY_NORMAL?: scalar|null, // Default: "WARNING" - * VERBOSITY_VERBOSE?: scalar|null, // Default: "NOTICE" - * VERBOSITY_VERY_VERBOSE?: scalar|null, // Default: "INFO" - * VERBOSITY_DEBUG?: scalar|null, // Default: "DEBUG" - * }, - * channels?: string|array{ - * type?: scalar|null, - * elements?: list, - * }, - * }>, * } * @psalm-type DamaDoctrineTestConfig = array{ * enable_static_connection?: mixed, // Default: true - * enable_static_meta_data_cache?: bool, // Default: true - * enable_static_query_cache?: bool, // Default: true + * enable_static_meta_data_cache?: bool|Param, // Default: true + * enable_static_query_cache?: bool|Param, // Default: true * connection_keys?: list, * } * @psalm-type ConfigType = array{ @@ -1779,7 +1901,10 @@ final class App */ public static function config(array $config): array { - return AppReference::config($config); + /** @var ConfigType $config */ + $config = AppReference::config($config); + + return $config; } } diff --git a/apps/migrations/2025/12/Version20251217202932.php b/apps/migrations/2025/12/Version20251217202932.php new file mode 100644 index 000000000..929e11d76 --- /dev/null +++ b/apps/migrations/2025/12/Version20251217202932.php @@ -0,0 +1,55 @@ +addSql('CREATE TABLE casting (id CHAR(36) NOT NULL, known_for_department LONGTEXT DEFAULT NULL, figure LONGTEXT DEFAULT NULL, ref_person_id CHAR(36) DEFAULT NULL, ref_season_id CHAR(36) DEFAULT NULL, ref_episode_id CHAR(36) DEFAULT NULL, ref_movie_id CHAR(36) DEFAULT NULL, ref_serie_id CHAR(36) DEFAULT NULL, INDEX IDX_D11BBA505221BA02 (ref_person_id), INDEX IDX_D11BBA503D9A0094 (ref_season_id), INDEX IDX_D11BBA5030EE8DBE (ref_episode_id), INDEX IDX_D11BBA50984707B (ref_movie_id), INDEX IDX_D11BBA505F544E3A (ref_serie_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); + $this->addSql('CREATE TABLE person (id CHAR(36) NOT NULL, slug VARCHAR(255) DEFAULT NULL, title VARCHAR(255) NOT NULL, birthday DATE DEFAULT NULL, deathday DATE DEFAULT NULL, gender SMALLINT DEFAULT NULL, biography LONGTEXT DEFAULT NULL, tmdb VARCHAR(255) DEFAULT NULL, place_of_birth VARCHAR(255) DEFAULT NULL, profile VARCHAR(255) DEFAULT NULL, deleted_at DATETIME DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, meta_id CHAR(36) DEFAULT NULL, UNIQUE INDEX UNIQ_34DCD17639FCA6F9 (meta_id), INDEX IDX_PERSORN_SLUG (slug), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA505221BA02 FOREIGN KEY (ref_person_id) REFERENCES person (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA503D9A0094 FOREIGN KEY (ref_season_id) REFERENCES season (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA5030EE8DBE FOREIGN KEY (ref_episode_id) REFERENCES episode (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA50984707B FOREIGN KEY (ref_movie_id) REFERENCES movie (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA505F544E3A FOREIGN KEY (ref_serie_id) REFERENCES serie (id)'); + $this->addSql('ALTER TABLE person ADD CONSTRAINT FK_34DCD17639FCA6F9 FOREIGN KEY (meta_id) REFERENCES meta (id)'); + $this->addSql('ALTER TABLE configuration ADD person_placeholder VARCHAR(255) DEFAULT NULL;'); + $this->addSql('ALTER TABLE paragraph ADD person_id CHAR(36) DEFAULT NULL'); + $this->addSql('ALTER TABLE paragraph ADD CONSTRAINT FK_7DD39862217BBB47 FOREIGN KEY (person_id) REFERENCES person (id)'); + $this->addSql('CREATE INDEX IDX_7DD39862217BBB47 ON paragraph (person_id)'); + $this->addSql('ALTER TABLE person ADD enable TINYINT DEFAULT 1 NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA505221BA02'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA503D9A0094'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA5030EE8DBE'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA50984707B'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA505F544E3A'); + $this->addSql('ALTER TABLE person DROP FOREIGN KEY FK_34DCD17639FCA6F9'); + $this->addSql('DROP TABLE casting'); + $this->addSql('DROP TABLE person'); + $this->addSql('ALTER TABLE configuration DROP person_placeholder'); + $this->addSql('ALTER TABLE paragraph DROP FOREIGN KEY FK_7DD39862217BBB47'); + $this->addSql('DROP INDEX IDX_7DD39862217BBB47 ON paragraph'); + $this->addSql('ALTER TABLE paragraph DROP person_id'); + $this->addSql('ALTER TABLE person DROP enable'); + } +} diff --git a/apps/public/index.php b/apps/public/index.php index 2298899f8..c7b375574 100755 --- a/apps/public/index.php +++ b/apps/public/index.php @@ -2,6 +2,6 @@ use Labstag\Kernel; -require_once dirname(__DIR__) . '/vendor/autoload_runtime.php'; +require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return fn (array $context): Kernel => new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); diff --git a/apps/src/Api/IgdbApi.php b/apps/src/Api/IgdbApi.php index ecc02df84..6841ceace 100644 --- a/apps/src/Api/IgdbApi.php +++ b/apps/src/Api/IgdbApi.php @@ -50,7 +50,7 @@ public function buildImageUrl(string $imageId, string $size = 'cover_big'): stri */ public function getGameDetails(int $gameId): ?array { - $cacheKey = 'igdb_game_' . $gameId; + $cacheKey = 'igdb_game_'.$gameId; return $this->getCached( $cacheKey, @@ -106,22 +106,22 @@ public function setBody( $body[] = sprintf('search "%s"', $search); } - $body[] = ([] === $fields) ? 'fields *' : 'fields ' . implode(',', $fields); + $body[] = ([] === $fields) ? 'fields *' : 'fields '.implode(',', $fields); if ([] !== $where) { - $body[] = 'where ' . implode(' & ', $where); + $body[] = 'where '.implode(' & ', $where); } - $body[] = 'limit ' . min($limit, 500); + $body[] = 'limit '.min($limit, 500); if (0 !== $offset) { - $body[] = 'offset ' . $offset; + $body[] = 'offset '.$offset; } - return implode(';', $body) . ';'; + return implode(';', $body).';'; } public function setUrl(string $url, string $body): mixed { - $cacheKey = 'igdb_' . $url . '_' . md5($body); + $cacheKey = 'igdb_'.$url.'_'.md5($body); return $this->getCached( $cacheKey, @@ -231,11 +231,11 @@ private function makeRequest(string $endpoint, string $body): ?array try { $response = $this->httpClient->request( 'POST', - self::BASE_URL . '/' . $endpoint, + self::BASE_URL.'/'.$endpoint, [ 'headers' => [ 'Client-ID' => $this->igdbClientId, - 'Authorization' => 'Bearer ' . $token, + 'Authorization' => 'Bearer '.$token, ], 'body' => $body, ] diff --git a/apps/src/Api/LibreTranslationApi.php b/apps/src/Api/LibreTranslationApi.php index e981fa54e..0b2500e38 100644 --- a/apps/src/Api/LibreTranslationApi.php +++ b/apps/src/Api/LibreTranslationApi.php @@ -33,7 +33,7 @@ public function __construct( */ public function detectLanguage(string $text): array { - $cacheKey = 'language_detect_' . md5($text); + $cacheKey = 'language_detect_'.md5($text); return $this->cacheService->get( $cacheKey, @@ -41,7 +41,7 @@ function () use ($text): array { $headers = ['Content-Type' => 'application/json']; if (null !== $this->translationApiKey) { - $headers['Authorization'] = 'Basic ' . $this->translationApiKey; + $headers['Authorization'] = 'Basic '.$this->translationApiKey; } try { @@ -61,7 +61,7 @@ function () use ($text): array { 'language' => '', 'confidence' => 0.0, 'success' => false, - 'error' => 'HTTP Error: ' . $statusCode, + 'error' => 'HTTP Error: '.$statusCode, ]; } @@ -102,7 +102,7 @@ function (): array { $headers = []; if (null !== $this->translationApiKey) { - $headers['Authorization'] = 'Basic ' . $this->translationApiKey; + $headers['Authorization'] = 'Basic '.$this->translationApiKey; } try { @@ -118,7 +118,7 @@ function (): array { return [ 'languages' => [], 'success' => false, - 'error' => 'HTTP Error: ' . $statusCode, + 'error' => 'HTTP Error: '.$statusCode, ]; } @@ -160,7 +160,7 @@ function () use ($text, $sourceLanguage, $targetLanguage): array { $headers = ['Content-Type' => 'application/json']; if (null !== $this->translationApiKey) { - $headers['Authorization'] = 'Basic ' . $this->translationApiKey; + $headers['Authorization'] = 'Basic '.$this->translationApiKey; } try { @@ -182,7 +182,7 @@ function () use ($text, $sourceLanguage, $targetLanguage): array { return [ 'translatedText' => '', 'success' => false, - 'error' => 'HTTP Error: ' . $statusCode, + 'error' => 'HTTP Error: '.$statusCode, ]; } diff --git a/apps/src/Api/TheMovieDbApi.php b/apps/src/Api/TheMovieDbApi.php index c374fe028..3c8d60ea4 100644 --- a/apps/src/Api/TheMovieDbApi.php +++ b/apps/src/Api/TheMovieDbApi.php @@ -5,10 +5,12 @@ use Labstag\Api\Tmdb\TmdbImagesApi; use Labstag\Api\Tmdb\TmdbMoviesApi; use Labstag\Api\Tmdb\TmdbOtherApi; +use Labstag\Api\Tmdb\TmdbPersonApi; use Labstag\Api\Tmdb\TmdbTvApi; use Labstag\Entity\Company; use Labstag\Entity\Episode; use Labstag\Entity\Movie; +use Labstag\Entity\Person; use Labstag\Entity\Saga; use Labstag\Entity\Season; use Labstag\Entity\Serie; @@ -33,6 +35,8 @@ class TheMovieDbApi private TmdbOtherApi $tmdbOtherApi; + private TmdbPersonApi $tmdbPersonApi; + private TmdbTvApi $tmdbTvApi; public function __construct( @@ -47,6 +51,22 @@ public function __construct( $this->tmdbMoviesApi = new TmdbMoviesApi($cacheService, $httpClient, $tmdbBearerToken); $this->tmdbImagesApi = new TmdbImagesApi($cacheService, $httpClient, $tmdbBearerToken); $this->tmdbTvApi = new TmdbTvApi($cacheService, $httpClient, $tmdbBearerToken); + $this->tmdbPersonApi = new TmdbPersonApi($cacheService, $httpClient, $tmdbBearerToken); + } + + public function getDetailPerson(Person $person): ?array + { + $json = $this->getJson($person); + if (0 !== count($json)) { + return $json; + } + + $locale = $this->configurationService->getLocaleTmdb(); + $details['tmdb'] = $this->tmdbPersonApi->getDetails($person->getTmdb(), $locale); + + $this->setJson($person, $details); + + return $details; } public function getDetailsCompany(Company $company): array @@ -74,11 +94,12 @@ public function getDetailsEpisode(Episode $episode): array $details = []; $tmdb = $episode->getRefseason()->getRefserie()->getTmdb(); $seasonNumber = $episode->getRefseason()->getNumber(); - $episodeNumber = $episode->getNumber(); - $locale = $this->configurationService->getLocaleTmdb(); - $details['tmdb'] = $this->tvserie()->getEpisodeDetails($tmdb, $seasonNumber, $episodeNumber, $locale); - $details['other'] = $this->tvserie()->getEpisodeExternalIds($tmdb, $seasonNumber, $episodeNumber); - $details['images'] = $this->tvserie()->getEpisodeImages($tmdb, $seasonNumber, $episodeNumber, $locale); + $episodeNumber = $episode->getNumber(); + $locale = $this->configurationService->getLocaleTmdb(); + $details['tmdb'] = $this->tvserie()->getEpisodeDetails($tmdb, $seasonNumber, $episodeNumber, $locale); + $details['other'] = $this->tvserie()->getEpisodeExternalIds($tmdb, $seasonNumber, $episodeNumber); + $details['images'] = $this->tvserie()->getEpisodeImages($tmdb, $seasonNumber, $episodeNumber, $locale); + $details['credits'] = $this->tvserie()->getEpisodeCredits($tmdb, $seasonNumber, $episodeNumber, $locale); $this->setJson($episode, $details); return $details; @@ -159,11 +180,12 @@ public function getDetailsSeason(Season $season): array $details = []; $tmdb = $season->getRefserie()->getTmdb(); - $numberSeason = $season->getNumber(); - $locale = $this->configurationService->getLocaleTmdb(); - $details['tmdb'] = $this->tvserie()->getSeasonDetails($tmdb, $numberSeason, $locale); - $details['videos'] = $this->getVideosSeason($tmdb, $numberSeason); - $details['other'] = $this->tvserie()->getTvExternalIds($tmdb); + $numberSeason = $season->getNumber(); + $locale = $this->configurationService->getLocaleTmdb(); + $details['tmdb'] = $this->tvserie()->getSeasonDetails($tmdb, $numberSeason, $locale); + $details['videos'] = $this->getVideosSeason($tmdb, $numberSeason); + $details['other'] = $this->tvserie()->getTvExternalIds($tmdb); + $details['credits'] = $this->tvserie()->getSeasonCredits($tmdb, $numberSeason, $locale); $this->setJson($season, $details); return $details; @@ -204,6 +226,7 @@ public function getDetailsSerie(Serie $serie): array $tmdbId, ['language' => $locale] ); + $details['credits'] = $this->tvserie()->getCredits($tmdbId, $locale); $this->setJson($serie, $details); return $details; @@ -262,7 +285,7 @@ public function tvserie(): TmdbTvApi private function getJson(object $object) { - $cacheKey = 'api_tmdb_' . $object->getId(); + $cacheKey = 'api_tmdb_'.$object->getId(); $cacheItem = $this->filesystemAdapter->getItem($cacheKey); if ($cacheItem->isHit()) { return $cacheItem->get(); @@ -284,7 +307,7 @@ private function getVideosSerie(string $tmdbId): ?array private function setJson(object $object, array $data, int $ttl = 3600): void { - $cacheKey = 'api_tmdb_' . $object->getId(); + $cacheKey = 'api_tmdb_'.$object->getId(); $cacheItem = $this->filesystemAdapter->getItem($cacheKey); $cacheItem->set($data); $cacheItem->expiresAfter($ttl); diff --git a/apps/src/Api/Tmdb/AbstractTmdbApi.php b/apps/src/Api/Tmdb/AbstractTmdbApi.php index ff7f5e744..84dd6317c 100644 --- a/apps/src/Api/Tmdb/AbstractTmdbApi.php +++ b/apps/src/Api/Tmdb/AbstractTmdbApi.php @@ -34,7 +34,7 @@ protected function buildQueryParams(array $params): string { $filtered = array_filter($params, fn ($value): bool => null !== $value && '' !== $value); - return [] === $filtered ? '' : '?' . http_build_query($filtered); + return [] === $filtered ? '' : '?'.http_build_query($filtered); } /** @@ -67,7 +67,7 @@ protected function makeRequest(string $url): ?array $url, [ 'headers' => [ - 'Authorization' => 'Bearer ' . $this->tmdbBearerToken, + 'Authorization' => 'Bearer '.$this->tmdbBearerToken, 'accept' => 'application/json', ], ] diff --git a/apps/src/Api/Tmdb/TmdbImagesApi.php b/apps/src/Api/Tmdb/TmdbImagesApi.php index 6ea18daf1..65d07fb21 100644 --- a/apps/src/Api/Tmdb/TmdbImagesApi.php +++ b/apps/src/Api/Tmdb/TmdbImagesApi.php @@ -52,7 +52,7 @@ public function getOptimizedUrl(string $imagePath, string $imageType, int $targe } $sizes = $this->getAvailableSizes(); - $typeSizes = $sizes[$imageType . '_sizes'] ?? []; + $typeSizes = $sizes[$imageType.'_sizes'] ?? []; if (empty($typeSizes)) { return $this->getUrl($imagePath, 'w500'); @@ -76,6 +76,19 @@ public function getPosterUrl(string $posterPath, int $targetWidth = 342): ?strin return $this->getOptimizedUrl($posterPath, 'poster', $targetWidth); } + /** + * Get poster URL with optimal size. + * + * @param string $profilePath The profile path from TMDB API + * @param int $targetWidth Desired width (default: 185px) + * + * @return string|null Complete profile URL + */ + public function getProfileUrl(string $profilePath, int $targetWidth = 185): ?string + { + return $this->getOptimizedUrl($profilePath, 'profile', $targetWidth); + } + /** * Get episode still image URL with optimal size. * @@ -106,10 +119,10 @@ public function getUrl(string $imagePath, string $size = 'w500'): ?string $config = $this->getConfiguration(); if (null === $config || !isset($config['images']['secure_base_url'])) { // Fallback to known TMDB base URL if config fails - return 'https://image.tmdb.org/t/p/' . $size . $imagePath; + return 'https://image.tmdb.org/t/p/'.$size.$imagePath; } - return $config['images']['secure_base_url'] . $size . $imagePath; + return $config['images']['secure_base_url'].$size.$imagePath; } /** @@ -214,7 +227,7 @@ private function getConfiguration(): ?array return $this->getCached( $cacheKey, function (ItemInterface $item): ?array { - $url = self::BASE_URL . '/configuration'; + $url = self::BASE_URL.'/configuration'; $data = $this->makeRequest($url); if (null === $data) { diff --git a/apps/src/Api/Tmdb/TmdbMoviesApi.php b/apps/src/Api/Tmdb/TmdbMoviesApi.php index 99f38f6db..87df8e47e 100644 --- a/apps/src/Api/Tmdb/TmdbMoviesApi.php +++ b/apps/src/Api/Tmdb/TmdbMoviesApi.php @@ -39,12 +39,12 @@ public function discover( ); $query = http_build_query($params); - $cacheKey = 'tmdb_movies_' . md5($query); + $cacheKey = 'tmdb_movies_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/discover/movie?' . $query; + $url = self::BASE_URL.'/discover/movie?'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { @@ -108,12 +108,12 @@ public function getCredits(string $movieId, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_credits_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_credits_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/credits' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/credits'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['cast']) && empty($data['crew']))) { @@ -148,12 +148,12 @@ public function getDetails(string $movieId, ?string $language = null, ?string $a ]; $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_details_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_details_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query) { - $url = self::BASE_URL . '/movie/' . $movieId . $query; + $url = self::BASE_URL.'/movie/'.$movieId.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['title'])) { @@ -186,12 +186,12 @@ public function getImages(string $movieId, ?string $includeImageLanguage = null) ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_images_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_images_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/images' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/images'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['backdrops']) && empty($data['posters']))) { @@ -230,12 +230,12 @@ public function getMovieCollection(string $collectionId, ?string $language = nul ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_collection_' . $collectionId . '_' . md5($query); + $cacheKey = 'tmdb_collection_'.$collectionId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($collectionId, $query) { - $url = self::BASE_URL . '/collection/' . $collectionId . $query; + $url = self::BASE_URL.'/collection/'.$collectionId.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -266,12 +266,12 @@ public function getMovieExternalIds(string $movieId): ?array return null; } - $cacheKey = 'tmdb_movie_external_ids_' . $movieId; + $cacheKey = 'tmdb_movie_external_ids_'.$movieId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/external_ids'; + $url = self::BASE_URL.'/movie/'.$movieId.'/external_ids'; $data = $this->makeRequest($url); if (null === $data) { @@ -300,12 +300,12 @@ function (ItemInterface $item) use ($movieId): ?array { public function getMovieRecommendations(string $movieId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_movie_recommendations_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_recommendations_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/recommendations?' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/recommendations?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -336,12 +336,12 @@ public function getMovieReleasesDates(string $movieId): ?array return null; } - $cacheKey = 'tmdb_movie_release_dates_' . $movieId; + $cacheKey = 'tmdb_movie_release_dates_'.$movieId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId) { - $url = self::BASE_URL . '/movie/' . $movieId . '/release_dates'; + $url = self::BASE_URL.'/movie/'.$movieId.'/release_dates'; $data = $this->makeRequest($url); if (null === $data || empty($data['results'])) { @@ -370,12 +370,12 @@ function (ItemInterface $item) use ($movieId) { public function getMovieSimilar(string $movieId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_movie_similar_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_similar_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/similar?' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/similar?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -413,12 +413,12 @@ public function getPopular(int $page = 1, ?string $language = null, ?string $reg ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_popular_movies_' . md5($query); + $cacheKey = 'tmdb_popular_movies_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/movie/popular' . $query; + $url = self::BASE_URL.'/movie/popular'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { @@ -451,12 +451,12 @@ public function getVideos(string $movieId, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_videos_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_videos_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/videos' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/videos'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -520,12 +520,12 @@ public function search( $params['page'] = $page; } - $cacheKey = 'tmdb_search_movies_' . md5(serialize($params)); + $cacheKey = 'tmdb_search_movies_'.md5(serialize($params)); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($params): ?array { - $url = self::BASE_URL . '/search/movie?' . http_build_query($params); + $url = self::BASE_URL.'/search/movie?'.http_build_query($params); $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { diff --git a/apps/src/Api/Tmdb/TmdbOtherApi.php b/apps/src/Api/Tmdb/TmdbOtherApi.php index 985f413cd..8ddf90478 100644 --- a/apps/src/Api/Tmdb/TmdbOtherApi.php +++ b/apps/src/Api/Tmdb/TmdbOtherApi.php @@ -33,12 +33,12 @@ public function findByImdb(string $externalId, ?string $language = null, string ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_find_' . $externalId . '_' . md5($query); + $cacheKey = 'tmdb_find_'.$externalId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($externalId, $query): ?array { - $url = self::BASE_URL . '/find/' . $externalId . $query; + $url = self::BASE_URL.'/find/'.$externalId.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -69,12 +69,12 @@ public function getCompanyDetails(string $companyId): ?array return null; } - $cacheKey = 'tmdb_company_details_' . $companyId; + $cacheKey = 'tmdb_company_details_'.$companyId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($companyId): ?array { - $url = self::BASE_URL . '/company/' . $companyId; + $url = self::BASE_URL.'/company/'.$companyId; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { diff --git a/apps/src/Api/Tmdb/TmdbPersonApi.php b/apps/src/Api/Tmdb/TmdbPersonApi.php new file mode 100644 index 000000000..8300ed7d7 --- /dev/null +++ b/apps/src/Api/Tmdb/TmdbPersonApi.php @@ -0,0 +1,56 @@ +|null + */ + public function getDetails(string $personId, ?string $language = null, ?string $appendToResponse = null): ?array + { + if ('' === trim($personId)) { + return null; + } + + $params = [ + 'language' => $language ?? 'fr-FR', + 'append_to_response' => $appendToResponse, + ]; + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_person_details_'.$personId.'_'.md5($query); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($personId, $query): ?array { + $url = self::BASE_URL.'/person/'.$personId.$query; + $data = $this->makeRequest($url); + + if (null === $data || empty($data['name'])) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } +} diff --git a/apps/src/Api/Tmdb/TmdbTvApi.php b/apps/src/Api/Tmdb/TmdbTvApi.php index 198c2f760..1096151ca 100644 --- a/apps/src/Api/Tmdb/TmdbTvApi.php +++ b/apps/src/Api/Tmdb/TmdbTvApi.php @@ -32,12 +32,12 @@ public function discover(array $filters = [], ?string $language = null, int $pag ); $query = http_build_query($params); - $cacheKey = 'tmdb_tv_' . md5($query); + $cacheKey = 'tmdb_tv_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/discover/tv?' . $query; + $url = self::BASE_URL.'/discover/tv?'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { @@ -69,6 +69,46 @@ public function discovers(array $filters = [], ?string $language = null, int $pa return $data; } + /** + * Get TV series credits (cast and crew). + * + * @param string $seriesId TV series ID + * @param string|null $language Language (e.g., 'en-US', 'fr-FR') + * + * @return array|null + */ + public function getCredits(string $seriesId, ?string $language = null): ?array + { + $params = array_filter( + [ + 'language' => $language ?? 'fr-FR', + ] + ); + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_tv_credits_'.$seriesId.'_'.md5($query); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($seriesId, $query): ?array { + $url = self::BASE_URL.'/tv/'.$seriesId.'/credits'.$query; + $data = $this->makeRequest($url); + + if (null === $data || (empty($data['cast']) && empty($data['crew']))) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } + /** * Get TV series details by ID. * @@ -86,12 +126,12 @@ public function getDetails(string $seriesId, ?string $language = null, ?string $ ]; $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_series_details_' . $seriesId . '_' . md5($query); + $cacheKey = 'tmdb_tv_series_details_'.$seriesId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $query) { - $url = self::BASE_URL . '/tv/' . $seriesId . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -109,6 +149,55 @@ function (ItemInterface $item) use ($seriesId, $query) { ); } + /** + * Get episode credits (cast and crew). + * + * @param string $seriesId TV series ID + * @param int $seasonNumber Season number + * @param int $episodeNumber Episode number + * @param string|null $language Language (e.g., 'en-US', 'fr-FR') + * + * @return array|null + */ + public function getEpisodeCredits( + string $seriesId, + int $seasonNumber, + int $episodeNumber, + ?string $language = null, + ): ?array + { + $params = array_filter( + [ + 'language' => $language ?? 'en-US', + ] + ); + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_tv_episode_credits_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber.'_'.md5( + $query + ); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $query): ?array { + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.'/credits'.$query; + $data = $this->makeRequest($url); + + if (null === $data || (empty($data['cast']) && empty($data['crew']) && empty($data['guest_stars']))) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } + /** * @param string $seriesId TV series ID * @param int $seasonNumber Season number @@ -131,12 +220,12 @@ public function getEpisodeDetails( ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_episode_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber . '_' . md5($query); + $cacheKey = 'tmdb_tv_episode_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $query) { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -165,12 +254,12 @@ function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $q */ public function getEpisodeExternalIds(string $seriesId, int $seasonNumber, int $episodeNumber): ?array { - $cacheKey = 'tmdb_tv_episode_external_ids_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber; + $cacheKey = 'tmdb_tv_episode_external_ids_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . '/external_ids'; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.'/external_ids'; $data = $this->makeRequest($url); if (null === $data) { @@ -210,14 +299,14 @@ public function getEpisodeImages( ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_episode_images_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber . '_' . md5( + $cacheKey = 'tmdb_tv_episode_images_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber.'_'.md5( $query ); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . '/images' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.'/images'.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['stills'])) { @@ -250,12 +339,12 @@ public function getImages(string $seriesId, ?string $includeImageLanguage = null ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_images_' . $seriesId . '_' . md5($query); + $cacheKey = 'tmdb_tv_images_'.$seriesId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/images' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/images'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['backdrops']) && empty($data['posters']))) { @@ -291,12 +380,12 @@ public function getPopular(int $page = 1, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_popular_tv_' . md5($query); + $cacheKey = 'tmdb_popular_tv_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/tv/popular' . $query; + $url = self::BASE_URL.'/tv/popular'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -314,6 +403,47 @@ function (ItemInterface $item) use ($query): ?array { ); } + /** + * Get TV season credits (cast and crew). + * + * @param string $seriesId TV series ID + * @param int $seasonNumber Season number + * @param string|null $language Language (e.g., 'en-US', 'fr-FR') + * + * @return array|null + */ + public function getSeasonCredits(string $seriesId, int $seasonNumber, ?string $language = null): ?array + { + $params = array_filter( + [ + 'language' => $language ?? 'fr-FR', + ] + ); + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_tv_season_credits_'.$seriesId.'_s'.$seasonNumber.'_'.md5($query); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($seriesId, $seasonNumber, $query): ?array { + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/credits'.$query; + $data = $this->makeRequest($url); + + if (null === $data || (empty($data['cast']) && empty($data['crew']))) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } + /** * Get TV season details. * @@ -330,12 +460,12 @@ public function getSeasonDetails(string $seriesId, int $seasonNumber, ?string $l ]; $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_season_' . $seriesId . '_' . $seasonNumber . '_' . md5($query); + $cacheKey = 'tmdb_tv_season_'.$seriesId.'_'.$seasonNumber.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $query) { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -369,12 +499,12 @@ public function getSeasonVideos(string $seriesId, int $seasonNumber, ?string $la ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_season_videos_' . $seriesId . '_s' . $seasonNumber . '_' . md5($query); + $cacheKey = 'tmdb_tv_season_videos_'.$seriesId.'_s'.$seasonNumber.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/videos' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/videos'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -401,12 +531,12 @@ function (ItemInterface $item) use ($seriesId, $seasonNumber, $query): ?array { */ public function getTvExternalIds(string $tvId): ?array { - $cacheKey = 'tmdb_tv_external_ids_' . $tvId; + $cacheKey = 'tmdb_tv_external_ids_'.$tvId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($tvId): ?array { - $url = self::BASE_URL . '/tv/' . $tvId . '/external_ids'; + $url = self::BASE_URL.'/tv/'.$tvId.'/external_ids'; $data = $this->makeRequest($url); if (null === $data) { @@ -435,12 +565,12 @@ function (ItemInterface $item) use ($tvId): ?array { public function getTvRecommendations(string $tvId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_tv_recommendations_' . $tvId . '_' . md5($query); + $cacheKey = 'tmdb_tv_recommendations_'.$tvId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($tvId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $tvId . '/recommendations?' . $query; + $url = self::BASE_URL.'/tv/'.$tvId.'/recommendations?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -469,12 +599,12 @@ function (ItemInterface $item) use ($tvId, $query): ?array { public function getTvSimilar(string $tvId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_tv_similar_' . $tvId . '_' . md5($query); + $cacheKey = 'tmdb_tv_similar_'.$tvId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($tvId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $tvId . '/similar?' . $query; + $url = self::BASE_URL.'/tv/'.$tvId.'/similar?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -507,12 +637,12 @@ public function getVideos(string $seriesId, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_videos_' . $seriesId . '_' . md5($query); + $cacheKey = 'tmdb_tv_videos_'.$seriesId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/videos' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/videos'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -570,12 +700,12 @@ public function search( $params['page'] = $page; } - $cacheKey = 'tmdb_search_tv_' . md5(serialize($params)); + $cacheKey = 'tmdb_search_tv_'.md5(serialize($params)); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($params): ?array { - $url = self::BASE_URL . '/search/tv?' . http_build_query($params); + $url = self::BASE_URL.'/search/tv?'.http_build_query($params); $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { diff --git a/apps/src/Block/BlockAbstract.php b/apps/src/Block/BlockAbstract.php index ffcaceabc..08e767240 100644 --- a/apps/src/Block/BlockAbstract.php +++ b/apps/src/Block/BlockAbstract.php @@ -159,8 +159,8 @@ protected function getTemplateContent(string $folder, string $type): array $htmltwig = '.html.twig'; $files = [ - 'blocks/' . $folder . '/' . $type . $htmltwig, - 'blocks/' . $folder . '/default' . $htmltwig, + 'blocks/'.$folder.'/'.$type.$htmltwig, + 'blocks/'.$folder.'/default'.$htmltwig, ]; $view = end($files); diff --git a/apps/src/Block/HtmlBlock.php b/apps/src/Block/HtmlBlock.php index 90de15226..289053fcc 100644 --- a/apps/src/Block/HtmlBlock.php +++ b/apps/src/Block/HtmlBlock.php @@ -24,8 +24,8 @@ public function getClass(): string public function getFields(Block $block, string $pageName): mixed { unset($block, $pageName); - $wysiwygTranslation = new TranslatableMessage('Content'); - $wysiwygField = WysiwygField::new('content', $wysiwygTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Content'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Block/LinksBlock.php b/apps/src/Block/LinksBlock.php index f558ace05..0d536525b 100644 --- a/apps/src/Block/LinksBlock.php +++ b/apps/src/Block/LinksBlock.php @@ -84,10 +84,15 @@ public function getFields(Block $block, string $pageName): mixed yield FormField::addColumn(12); $collectionField = CollectionField::new('links', new TranslatableMessage('Links')); $collectionField->setEntryToStringMethod( - function ($link): TranslatableMessage { + function ($link): string { unset($link); - return new TranslatableMessage('Link'); + $translatableMessage = new TranslatableMessage('Link'); + + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index 0a9bb2959..c1a9fa3c2 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -3,21 +3,24 @@ namespace Labstag\Command; use Labstag\Message\BanIpMessage; -use Labstag\Message\FilesMessage; -use Labstag\Message\MetaMessage; +use Labstag\Message\DeleteOldFileMessage; +use Labstag\Message\MetaAllMessage; +use Labstag\Message\MovieAllMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\PageCinemaMessage; +use Labstag\Message\PersonAllMessage; +use Labstag\Message\SerieAllMessage; use Labstag\Message\UpdateSerieMessage; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; #[AsCommand(name: 'labstag:execute:message', description: 'Execute selected messages',)] class ExecuteMessageCommand { public function __construct( - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, ) { } @@ -25,42 +28,49 @@ public function __construct( public function __invoke(SymfonyStyle $symfonyStyle): int { $choices = [ - 'PageCinema' => 'Generate cinema pages', - 'BanIp' => 'Ban IP addresses', - 'UpdateSerie' => 'Update series', + 'PageCinema' => 'Generate cinema pages', + 'BanIp' => 'Ban IP addresses', + 'Series' => 'Update series', 'Notification' => 'Send notifications', - 'Meta' => 'Clean meta entries', - 'Files' => 'Clean files', - 'All' => 'Execute all tasks', - 'Cancel' => 'Cancel execution', + 'Meta' => 'Clean meta entries', + 'Person' => 'Update persons', + 'Movie' => 'Update movies', + 'Files' => 'Clean files', + 'All' => 'Execute all tasks', + 'Cancel' => 'Cancel execution', ]; - $selected = $symfonyStyle->choice( - 'Which task do you want to execute?', - array_values($choices), - 6 - ); + $selected = $symfonyStyle->choice('Which task do you want to execute?', array_values($choices), 8); - $selectedKey = array_search($selected, $choices); + $selectedKey = array_search($selected, $choices, true); $messages = [ - 'PageCinema' => PageCinemaMessage::class, - 'BanIp' => BanIpMessage::class, - 'UpdateSerie' => UpdateSerieMessage::class, - 'Meta' => MetaMessage::class, - 'Files' => FilesMessage::class, + 'PageCinema' => PageCinemaMessage::class, + 'BanIp' => BanIpMessage::class, + 'Series' => [ + UpdateSerieMessage::class, + SerieAllMessage::class, + ], + 'Meta' => MetaAllMessage::class, + 'Person' => PersonAllMessage::class, + 'Movie' => MovieAllMessage::class, + 'Files' => DeleteOldFileMessage::class, 'Notification' => NotificationMessage::class, ]; - $toExecute = $selectedKey === 'All' ? array_keys($messages) : [$selectedKey]; - if ($selectedKey === 'Cancel') { + $toExecute = 'All' === $selectedKey ? array_keys($messages) : [$selectedKey]; + if ('Cancel' === $selectedKey) { $symfonyStyle->warning('Execution cancelled by user.'); + return Command::SUCCESS; } foreach ($toExecute as $key) { - $symfonyStyle->section("Dispatching {$key}Message"); - $this->messageBus->dispatch(new $messages[$key]()); + $symfonyStyle->section(sprintf('Dispatching %sMessage', $key)); + $messageClasses = is_array($messages[$key]) ? $messages[$key] : [$messages[$key]]; + foreach ($messageClasses as $messageClass) { + $this->messageBus->dispatch(new $messageClass()); + } } return Command::SUCCESS; diff --git a/apps/src/Command/GeocodeInstallCommand.php b/apps/src/Command/GeocodeInstallCommand.php index a8052b0a0..ca9ed26c4 100644 --- a/apps/src/Command/GeocodeInstallCommand.php +++ b/apps/src/Command/GeocodeInstallCommand.php @@ -6,6 +6,7 @@ use Labstag\Entity\GeoCode; use Labstag\Message\GeocodeMessage; use Labstag\Service\GeocodeService; +use Labstag\Service\MessageDispatcherService; use NumberFormatter; use Symfony\Component\Console\Attribute\Argument; use Symfony\Component\Console\Attribute\AsCommand; @@ -13,7 +14,6 @@ use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; #[AsCommand(name: 'labstag:geocode-install', description: 'Retrieve geocodes')] class GeocodeInstallCommand @@ -25,7 +25,7 @@ class GeocodeInstallCommand public function __construct( private readonly GeocodeService $geocodeService, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, ) { } diff --git a/apps/src/Command/RegenerateSlugCommand.php b/apps/src/Command/RegenerateSlugCommand.php index f42ccc1b7..b371e9aa6 100644 --- a/apps/src/Command/RegenerateSlugCommand.php +++ b/apps/src/Command/RegenerateSlugCommand.php @@ -41,7 +41,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int ]; foreach ($entities as $entity) { - $symfonyStyle->section('Regenerating slugs for ' . $entity); + $symfonyStyle->section('Regenerating slugs for '.$entity); $repository = $this->entityManager->getRepository($entity); $items = $repository->findAll(); @@ -51,7 +51,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int $count = 0; foreach ($items as $item) { $title = $item->getTitle(); - $item->setTitle($title . ' '); + $item->setTitle($title.' '); $this->entityManager->persist($item); ++$count; @@ -75,7 +75,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int continue; } - $symfonyStyle->info('ℹ️ No slugs to regenerate for ' . $entity); + $symfonyStyle->info('ℹ️ No slugs to regenerate for '.$entity); } $symfonyStyle->success('🎉 All slugs have been successfully regenerated!'); diff --git a/apps/src/Command/StarAddCommand.php b/apps/src/Command/StarAddCommand.php index c8191d2f4..1ca259dfc 100644 --- a/apps/src/Command/StarAddCommand.php +++ b/apps/src/Command/StarAddCommand.php @@ -6,12 +6,12 @@ use Labstag\Message\StarMessage; use Labstag\Repository\StarRepository; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; #[AsCommand(name: 'labstag:star-add', description: 'Get all star github with npm run star:get')] class StarAddCommand @@ -23,7 +23,7 @@ class StarAddCommand public function __construct( protected FileService $fileService, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected StarRepository $starRepository, ) { @@ -34,7 +34,7 @@ public function __invoke(SymfonyStyle $symfonyStyle, OutputInterface $output): i $filename = 'stars.json'; $file = $this->fileService->getFileInAdapter('private', $filename); if (!is_file($file)) { - $symfonyStyle->error('File not found ' . $filename); + $symfonyStyle->error('File not found '.$filename); return Command::SUCCESS; } diff --git a/apps/src/Command/StoryPdfCommand.php b/apps/src/Command/StoryPdfCommand.php index aa4eea347..60330ee9e 100644 --- a/apps/src/Command/StoryPdfCommand.php +++ b/apps/src/Command/StoryPdfCommand.php @@ -4,13 +4,13 @@ use Labstag\Message\StoryMessage; use Labstag\Repository\StoryRepository; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\StoryService; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Translation\TranslatableMessage; #[AsCommand(name: 'labstag:story-pdf', description: 'Generate PDF for story',)] @@ -18,7 +18,7 @@ class StoryPdfCommand { public function __construct( protected StoryRepository $storyRepository, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected StoryService $storyService, ) { diff --git a/apps/src/Controller/Admin/BanIpCrudController.php b/apps/src/Controller/Admin/BanIpCrudController.php index 46f13b0ce..f47db46cc 100644 --- a/apps/src/Controller/Admin/BanIpCrudController.php +++ b/apps/src/Controller/Admin/BanIpCrudController.php @@ -38,11 +38,11 @@ public function configureCrud(Crud $crud): Crud public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $wysiwygTranslation = new TranslatableMessage('Reason'); - $fields = [ + $translatableMessage = new TranslatableMessage('Reason'); + $fields = [ $this->crudFieldFactory->booleanField('enable', new TranslatableMessage('Enable')), TextField::new('InternetProtocol', new TranslatableMessage('IP')), - WysiwygField::new('reason', $wysiwygTranslation->getMessage()), + WysiwygField::new('reason', $translatableMessage->getMessage()), ]; $this->crudFieldFactory->addFieldsToTab('principal', $fields); $this->crudFieldFactory->setTabDate($pageName); diff --git a/apps/src/Controller/Admin/BlockCrudController.php b/apps/src/Controller/Admin/BlockCrudController.php index c23a8a945..1ab9ec6d4 100644 --- a/apps/src/Controller/Admin/BlockCrudController.php +++ b/apps/src/Controller/Admin/BlockCrudController.php @@ -172,8 +172,8 @@ public function configureFilters(Filters $filters): Filters return $filters; } - $typeTranslation = new TranslatableMessage('Type'); - $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $typeTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Type'); + $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $translatableMessage->getMessage()); $discriminatorTypeFilter->setBlockService($this->blockService); $discriminatorTypeFilter->setChoices( array_merge( diff --git a/apps/src/Controller/Admin/ChapterCrudController.php b/apps/src/Controller/Admin/ChapterCrudController.php index 263388f1a..ff6edeb46 100644 --- a/apps/src/Controller/Admin/ChapterCrudController.php +++ b/apps/src/Controller/Admin/ChapterCrudController.php @@ -47,14 +47,14 @@ public function configureCrud(Crud $crud): Crud public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $wysiwygTranslation = new TranslatableMessage('resume'); - $fields = [ + $translatableMessage = new TranslatableMessage('resume'); + $fields = [ $this->crudFieldFactory->slugField(readOnly: true), $this->crudFieldFactory->booleanField('enable', new TranslatableMessage('Enable')), $this->crudFieldFactory->titleField(), $this->crudFieldFactory->imageField('img', $pageName, self::getEntityFqcn()), $this->addFieldRefStory(), - WysiwygField::new('resume', $wysiwygTranslation->getMessage())->hideOnIndex(), + WysiwygField::new('resume', $translatableMessage->getMessage())->hideOnIndex(), ]; $this->crudFieldFactory->addFieldsToTab('principal', $fields); diff --git a/apps/src/Controller/Admin/ConfigurationCrudController.php b/apps/src/Controller/Admin/ConfigurationCrudController.php index cb33eb074..8028b168f 100644 --- a/apps/src/Controller/Admin/ConfigurationCrudController.php +++ b/apps/src/Controller/Admin/ConfigurationCrudController.php @@ -38,7 +38,7 @@ public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); $copyrightTranslation = new TranslatableMessage('Copyright'); - $fields = [ + $fields = [ TextField::new('titleFormat', new TranslatableMessage('Title format')), TextField::new('name', new TranslatableMessage('Site name')), EmailField::new('email', new TranslatableMessage('Email')), @@ -83,7 +83,8 @@ public function configureFields(string $pageName): iterable ); $this->crudFieldFactory->addTab('medias', FormField::addTab(new TranslatableMessage('Medias'))); - $logoTranslation = new TranslatableMessage('Logo'); + + $logoTranslation = new TranslatableMessage('Logo'); $placeHolderTranslation = new TranslatableMessage('Placeholder'); $this->crudFieldFactory->addFieldsToTab( 'medias', @@ -119,120 +120,36 @@ public static function getEntityFqcn(): string private function addConfigureFieldsPlaceHolders(string $pageName): array { - $chapterTranslation = new TranslatableMessage('Chapter'); - $editoTranslation = new TranslatableMessage('Edito'); - $episodeTranslation = new TranslatableMessage('Episode'); - $memoTranslation = new TranslatableMessage('Memo'); - $movieTranslation = new TranslatableMessage('Movie'); - $gameTranslation = new TranslatableMessage('Game'); - $pageTranslation = new TranslatableMessage('Page'); - $postTranslation = new TranslatableMessage('Post'); - $sagaTranslation = new TranslatableMessage('Saga'); - $seasonTranslation = new TranslatableMessage('Season'); - $serieTranslation = new TranslatableMessage('Serie'); - $starTranslation = new TranslatableMessage('Star'); - $storyTranslation = new TranslatableMessage('Story'); - $userTranslation = new TranslatableMessage('User'); - return [ - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'chapterPlaceholder', - $pageName, - self::getEntityFqcn(), - $chapterTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'editoPlaceholder', - $pageName, - self::getEntityFqcn(), - $editoTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'episodePlaceholder', - $pageName, - self::getEntityFqcn(), - $episodeTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'memoPlaceholder', - $pageName, - self::getEntityFqcn(), - $memoTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'moviePlaceholder', - $pageName, - self::getEntityFqcn(), - $movieTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'gamePlaceholder', - $pageName, - self::getEntityFqcn(), - $gameTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'pagePlaceholder', - $pageName, - self::getEntityFqcn(), - $pageTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'postPlaceholder', - $pageName, - self::getEntityFqcn(), - $postTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'sagaPlaceholder', - $pageName, - self::getEntityFqcn(), - $sagaTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'seasonPlaceholder', - $pageName, - self::getEntityFqcn(), - $seasonTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'seriePlaceholder', - $pageName, - self::getEntityFqcn(), - $serieTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'starPlaceholder', - $pageName, - self::getEntityFqcn(), - $starTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'storyPlaceholder', - $pageName, - self::getEntityFqcn(), - $storyTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'userPlaceholder', + $placeholders = [ + 'chapter' => new TranslatableMessage('Chapter'), + 'edito' => new TranslatableMessage('Edito'), + 'episode' => new TranslatableMessage('Episode'), + 'memo' => new TranslatableMessage('Memo'), + 'movie' => new TranslatableMessage('Movie'), + 'game' => new TranslatableMessage('Game'), + 'page' => new TranslatableMessage('Page'), + 'post' => new TranslatableMessage('Post'), + 'saga' => new TranslatableMessage('Saga'), + 'season' => new TranslatableMessage('Season'), + 'serie' => new TranslatableMessage('Serie'), + 'star' => new TranslatableMessage('Star'), + 'story' => new TranslatableMessage('Story'), + 'user' => new TranslatableMessage('User'), + 'person' => new TranslatableMessage('Person'), + ]; + + $fields = []; + foreach ($placeholders as $key => $label) { + $fields[] = FormField::addColumn(6); + $fields[] = $this->crudFieldFactory->imageField( + $key.'Placeholder', $pageName, self::getEntityFqcn(), - $userTranslation->getMessage() - ), - ]; + $label->getMessage() + ); + } + + return $fields; } /** diff --git a/apps/src/Controller/Admin/CrudControllerAbstract.php b/apps/src/Controller/Admin/CrudControllerAbstract.php index 54e56a0cf..e7dbadb0c 100644 --- a/apps/src/Controller/Admin/CrudControllerAbstract.php +++ b/apps/src/Controller/Admin/CrudControllerAbstract.php @@ -34,6 +34,7 @@ use Labstag\Service\Imdb\SagaService; use Labstag\Service\Imdb\SeasonService; use Labstag\Service\Imdb\SerieService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\ParagraphService; use Labstag\Service\SecurityService; use Labstag\Service\SiteService; @@ -45,7 +46,6 @@ use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Translation\TranslatableMessage; use Symfony\Contracts\Translation\TranslatorInterface; @@ -71,7 +71,7 @@ public function __construct( protected FileService $fileService, protected SiteService $siteService, protected SlugService $slugService, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected SeasonService $seasonService, protected SecurityService $securityService, protected BlockService $blockService, @@ -161,7 +161,7 @@ public function linkw3CValidator(AdminContext $adminContext): RedirectResponse $params = $this->slugService->forEntity($entity); return $this->redirect( - 'https://validator.w3.org/nu/?doc=' . $this->generateUrl( + 'https://validator.w3.org/nu/?doc='.$this->generateUrl( 'front', $params, UrlGeneratorInterface::ABSOLUTE_URL diff --git a/apps/src/Controller/Admin/DashboardController.php b/apps/src/Controller/Admin/DashboardController.php index fb9d36cf6..f53428995 100644 --- a/apps/src/Controller/Admin/DashboardController.php +++ b/apps/src/Controller/Admin/DashboardController.php @@ -133,7 +133,7 @@ public function configureUserMenu(UserInterface $user): UserMenu $avatar = $user->getAvatar(); if ('' != $avatar) { $basePath = $this->fileService->getBasePath($user, 'avatarFile'); - $userMenu->setAvatarUrl($basePath . '/' . $avatar); + $userMenu->setAvatarUrl($basePath.'/'.$avatar); return $userMenu; } @@ -150,6 +150,8 @@ public function index(): Response $memos = $repositoryAbstract->findBy( ['enable' => true] ); + + $paragraphs = []; foreach ($memos as $memo) { $idMemo = $memo->getId(); $paragraphs = $memo->getParagraphs()->getValues(); @@ -369,6 +371,11 @@ private function buildContentMenus(array $categories, array $tags): iterable private function buildSimpleCrudMenus(): iterable { $items = [ + [ + new TranslatableMessage('Person'), + 'fas fa-users', + PersonCrudController::getEntityFqcn(), + ], [ new TranslatableMessage('Company'), 'fas fa-building', diff --git a/apps/src/Controller/Admin/EpisodeCrudController.php b/apps/src/Controller/Admin/EpisodeCrudController.php index 320ef9c68..cd117bf5a 100644 --- a/apps/src/Controller/Admin/EpisodeCrudController.php +++ b/apps/src/Controller/Admin/EpisodeCrudController.php @@ -79,9 +79,13 @@ function ($value, $entity) { $integerField = IntegerField::new('runtime', new TranslatableMessage('Runtime')); $integerField->setTemplatePath('admin/field/runtime-episode.html.twig'); - $wysiwgTranslation = new TranslatableMessage('Overview'); - $wysiwgField = WysiwygField::new('overview', $wysiwgTranslation->getMessage()); - $wysiwgField->hideOnIndex(); + $translatableMessage = new TranslatableMessage('Overview'); + $wysiwygField = WysiwygField::new('overview', $translatableMessage->getMessage()); + $wysiwygField->hideOnIndex(); + + $associationField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $associationField->setTemplatePath('admin/field/castings.html.twig'); + $associationField->onlyOnDetail(); $this->crudFieldFactory->addFieldsToTab( 'principal', @@ -96,6 +100,7 @@ function ($value, $entity) { DateField::new('air_date', new TranslatableMessage('Air date')), $integerField, $wysiwygField, + $associationField, ] ); diff --git a/apps/src/Controller/Admin/Factory/CrudFieldFactory.php b/apps/src/Controller/Admin/Factory/CrudFieldFactory.php index 14986c5af..35730b45e 100644 --- a/apps/src/Controller/Admin/Factory/CrudFieldFactory.php +++ b/apps/src/Controller/Admin/Factory/CrudFieldFactory.php @@ -283,11 +283,12 @@ public function fileField( ): TextField|UploadFileField { if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $fileTranslation = new TranslatableMessage('File'); - return UploadFileField::new($type . 'File', $label ?? $fileTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('File'); + + return UploadFileField::new($type.'File', $label ?? $translatableMessage->getMessage()); } - $this->fileService->getBasePath($entityFqcn, $type . 'File'); + $this->fileService->getBasePath($entityFqcn, $type.'File'); return TextField::new($type, $label ?? new TranslatableMessage('File')); } @@ -324,14 +325,14 @@ public function imageField( ): ImageField|UploadImageField { if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $fileTranslation = new TranslatableMessage('Image'); - $uploadImageField = UploadImageField::new($type . 'File', $label ?? $fileTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Image'); + $uploadImageField = UploadImageField::new($type.'File', $label ?? $translatableMessage->getMessage()); $uploadImageField->setTranslator($this->translator); return $uploadImageField; } - $basePath = $this->fileService->getBasePath($entityFqcn, $type . 'File'); + $basePath = $this->fileService->getBasePath($entityFqcn, $type.'File'); $imageField = ImageField::new($type, $label ?? new TranslatableMessage('Image')); $imageField->setBasePath($basePath); @@ -579,8 +580,8 @@ private function setTabParagraphs(string $pageName): void $key = 'paragraphs'; $this->addTab($key, FormField::addTab(new TranslatableMessage('Paragraphs'))); - $paragraphsTranslation = new TranslatableMessage('Paragraphs'); - $paragraphsField = ParagraphsField::new('paragraphs', $paragraphsTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Paragraphs'); + $paragraphsField = ParagraphsField::new('paragraphs', $translatableMessage->getMessage()); $paragraphsField->hideWhenCreating(); $paragraphsField->hideOnIndex(); $this->addFieldsToTab($key, [$paragraphsField]); diff --git a/apps/src/Controller/Admin/GameCrudController.php b/apps/src/Controller/Admin/GameCrudController.php index 10233810f..89476f53c 100644 --- a/apps/src/Controller/Admin/GameCrudController.php +++ b/apps/src/Controller/Admin/GameCrudController.php @@ -98,7 +98,10 @@ public function addByApi(Request $request): JsonResponse [ 'status' => 'success', 'id' => $id, - 'message' => $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()), + 'message' => $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ), ] ); } @@ -202,8 +205,8 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->setTabDate($pageName); - $wysiwgTranslation = new TranslatableMessage('Summary'); - $wysiwygField = WysiwygField::new('summary', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Summary'); + $wysiwygField = WysiwygField::new('summary', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); $this->crudFieldFactory->addFieldsToTab( @@ -273,7 +276,7 @@ public function importFileGame(Request $request): JsonResponse $content = file_get_contents($file->getPathname()); $extension = $file->getClientOriginalExtension(); - $filename = uniqid('import_', true) . '.' . $extension; + $filename = uniqid('import_', true).'.'.$extension; $this->fileService->saveFileInAdapter('private', $filename, $content); $this->messageBus->dispatch(new ImportMessage($filename, 'game', $data)); diff --git a/apps/src/Controller/Admin/MediaCrudController.php b/apps/src/Controller/Admin/MediaCrudController.php index 098ccdc7a..6f7c07c74 100644 --- a/apps/src/Controller/Admin/MediaCrudController.php +++ b/apps/src/Controller/Admin/MediaCrudController.php @@ -48,8 +48,8 @@ function ($value, Media $media): string { ); $integerField->hideOnForm(); - $fileTranslation = new TranslatableMessage('File'); - $uploadFileField = UploadFileField::new('file', $fileTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('File'); + $uploadFileField = UploadFileField::new('file', $translatableMessage->getMessage()); $uploadFileField->setTranslator($this->translator); $uploadFileField->onlyOnForms(); diff --git a/apps/src/Controller/Admin/MetaCrudController.php b/apps/src/Controller/Admin/MetaCrudController.php index 453dc22fe..092cbc86c 100644 --- a/apps/src/Controller/Admin/MetaCrudController.php +++ b/apps/src/Controller/Admin/MetaCrudController.php @@ -26,14 +26,14 @@ public function configureActions(Actions $actions): Actions public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $metaParentTranslation = new TranslatableMessage('Parent'); + $translatableMessage = new TranslatableMessage('Parent'); $this->crudFieldFactory->addFieldsToTab( 'principal', [ $this->crudFieldFactory->titleField(), TextField::new('keywords', new TranslatableMessage('Keywords')), TextField::new('description', new TranslatableMessage('Description')), - MetaParentField::new('parent', $metaParentTranslation->getMessage()), + MetaParentField::new('parent', $translatableMessage->getMessage()), ] ); diff --git a/apps/src/Controller/Admin/MovieCrudController.php b/apps/src/Controller/Admin/MovieCrudController.php index 2a3aa16e6..b0e572675 100644 --- a/apps/src/Controller/Admin/MovieCrudController.php +++ b/apps/src/Controller/Admin/MovieCrudController.php @@ -175,18 +175,23 @@ public function configureFields(string $pageName): iterable $trailerField->hideOnIndex(); $wysiwgTranslation = new TranslatableMessage('Citation'); - $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); $descriptionTranslation = new TranslatableMessage('Description'); - $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); + $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); $descriptionField->hideOnIndex(); $booleanField = $this->crudFieldFactory->booleanField('file', new TranslatableMessage('File')); $booleanField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); + + $associationField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $associationField->setTemplatePath('admin/field/castings.html.twig'); + $associationField->onlyOnDetail(); + $this->crudFieldFactory->addFieldsToTab( 'principal', [ @@ -221,6 +226,7 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->companiesFieldForPage(self::getEntityFqcn(), $pageName), // image field déjà incluse dans baseIdentitySet $booleanField, + $associationField, $this->crudFieldFactory->booleanField('adult', new TranslatableMessage('Adult')), ] ); @@ -238,8 +244,8 @@ public function configureFilters(Filters $filters): Filters $filters->add('releaseDate'); $countries = $repositoryAbstract->getCountries(); if ([] != $countries) { - $countriesTranslation = new TranslatableMessage('Countries'); - $countriesFilter = CountriesFilter::new('countries', $countriesTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Countries'); + $countriesFilter = CountriesFilter::new('countries', $translatableMessage->getMessage()); $countriesFilter->setChoices( array_merge( ['' => ''], @@ -278,7 +284,7 @@ public function imdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $movie = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.imdb.com/title/' . $movie->getImdb() . '/'); + return $this->redirect('https://www.imdb.com/title/'.$movie->getImdb().'/'); } public function importFileMovie(Request $request): JsonResponse @@ -296,7 +302,7 @@ public function importFileMovie(Request $request): JsonResponse $content = file_get_contents($file->getPathname()); $extension = $file->getClientOriginalExtension(); - $filename = uniqid('import_', true) . '.' . $extension; + $filename = uniqid('import_', true).'.'.$extension; $this->fileService->saveFileInAdapter('private', $filename, $content); $this->messageBus->dispatch(new ImportMessage($filename, 'movie', [])); @@ -352,7 +358,7 @@ public function tmdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $movie = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.themoviedb.org/movie/' . $movie->getTmdb()); + return $this->redirect('https://www.themoviedb.org/movie/'.$movie->getTmdb()); } public function updateAllMovie(): RedirectResponse diff --git a/apps/src/Controller/Admin/NotificationCrudController.php b/apps/src/Controller/Admin/NotificationCrudController.php index 77504d7be..b8bf818ad 100644 --- a/apps/src/Controller/Admin/NotificationCrudController.php +++ b/apps/src/Controller/Admin/NotificationCrudController.php @@ -43,6 +43,7 @@ public function configureCrud(Crud $crud): Crud #[Override] public function configureFields(string $pageName): iterable { + unset($pageName); yield TextField::new('title', new TranslatableMessage('Title')); yield TextEditorField::new('message', new TranslatableMessage('Message')); yield DateTimeField::new('createdAt', new TranslatableMessage('Created At')); diff --git a/apps/src/Controller/Admin/PageCrudController.php b/apps/src/Controller/Admin/PageCrudController.php index 0a1030da7..8284e15be 100644 --- a/apps/src/Controller/Admin/PageCrudController.php +++ b/apps/src/Controller/Admin/PageCrudController.php @@ -44,9 +44,9 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->setTabPrincipal($this->getContext()); $this->crudFieldFactory->addFieldsToTab('principal', $this->getIdEntity($pageName, $currentEntity)); - $fieldChoice = $this->addFieldIsHome($currentEntity, $pageName); - $wysiwgTranslation = new TranslatableMessage('resume'); - $wysiwygField = WysiwygField::new('resume', $wysiwgTranslation->getMessage()); + $fieldChoice = $this->addFieldIsHome($currentEntity, $pageName); + $translatableMessage = new TranslatableMessage('resume'); + $wysiwygField = WysiwygField::new('resume', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); if ($fieldChoice instanceof ChoiceField) { $this->crudFieldFactory->addFieldsToTab('principal', [$fieldChoice, $wysiwygField]); diff --git a/apps/src/Controller/Admin/ParagraphCrudController.php b/apps/src/Controller/Admin/ParagraphCrudController.php index f25e227d1..59467ac85 100644 --- a/apps/src/Controller/Admin/ParagraphCrudController.php +++ b/apps/src/Controller/Admin/ParagraphCrudController.php @@ -70,10 +70,10 @@ public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); $currentEntity = $this->getContext()->getEntity()->getInstance(); - $parentTranslation = new TranslatableMessage('Parent'); + $translatableMessage = new TranslatableMessage('Parent'); $this->crudFieldFactory->addFieldsToTab( 'principal', - [ParagraphParentField::new('parent', $parentTranslation->getMessage())] + [ParagraphParentField::new('parent', $translatableMessage->getMessage())] ); $this->crudFieldFactory->addFieldsToTab( 'principal', @@ -117,8 +117,8 @@ public function configureFilters(Filters $filters): Filters return $filters; } - $typeTranslation = new TranslatableMessage('Type'); - $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $typeTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Type'); + $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $translatableMessage->getMessage()); $discriminatorTypeFilter->setParagraphService($this->paragraphService); $discriminatorTypeFilter->setChoices( array_merge( diff --git a/apps/src/Controller/Admin/PersonCrudController.php b/apps/src/Controller/Admin/PersonCrudController.php new file mode 100644 index 000000000..9169f9052 --- /dev/null +++ b/apps/src/Controller/Admin/PersonCrudController.php @@ -0,0 +1,199 @@ +actionsFactory->init($actions, self::getEntityFqcn(), static::class); + $this->actionsFactory->remove(Crud::PAGE_INDEX, Action::NEW); + $this->actionsFactory->setLinkTmdbAction(); + $this->setUpdateAction(); + $this->actionsFactory->setActionUpdateAll('updateAllPerson'); + + return $this->actionsFactory->show(); + } + + #[Override] + public function configureCrud(Crud $crud): Crud + { + $crud = parent::configureCrud($crud); + $crud->setEntityLabelInSingular(new TranslatableMessage('Person')); + $crud->setEntityLabelInPlural(new TranslatableMessage('Persons')); + $crud->setDefaultSort( + ['title' => 'ASC'] + ); + + return $crud; + } + + #[Override] + public function configureFields(string $pageName): iterable + { + $this->crudFieldFactory->setTabPrincipal($this->getContext()); + $choiceField = ChoiceField::new('gender', new TranslatableMessage('Gender')); + $choices = [ + 0 => new TranslatableMessage('Not set / not specified'), + 1 => new TranslatableMessage('Female'), + 2 => new TranslatableMessage('Male'), + 3 => new TranslatableMessage('Non-binary'), + ]; + $data = []; + foreach ($choices as $value => $label) { + $data[$label->getMessage()] = $value; + } + + $choiceField->setChoices($data); + $choiceField->hideOnIndex(); + + $wysiwgTranslation = new TranslatableMessage('Biography'); + $wysiwygField = WysiwygField::new('biography', $wysiwgTranslation->getMessage()); + $wysiwygField->hideOnIndex(); + + $textField = TextField::new('placeOfBirth', new TranslatableMessage('Place of birth')); + $textField->hideOnIndex(); + + $associationField = AssociationField::new('castings', new TranslatableMessage('Series')); + $associationField->setTemplatePath('admin/field/casting-series.html.twig'); + $associationField->onlyOnDetail(); + + $movieField = AssociationField::new('castings', new TranslatableMessage('Movies')); + $movieField->setTemplatePath('admin/field/casting-movies.html.twig'); + $movieField->onlyOnDetail(); + + $seasonField = AssociationField::new('castings', new TranslatableMessage('Seasons')); + $seasonField->setTemplatePath('admin/field/casting-seasons.html.twig'); + $seasonField->onlyOnDetail(); + + $episodeField = AssociationField::new('castings', new TranslatableMessage('Episodes')); + $episodeField->setTemplatePath('admin/field/casting-episodes.html.twig'); + $episodeField->onlyOnDetail(); + + $profileTranslation = new TranslatableMessage('Profile'); + $this->crudFieldFactory->addFieldsToTab( + 'principal', + [ + $this->crudFieldFactory->booleanField('enable', new TranslatableMessage('Enable')), + $this->crudFieldFactory->slugField(), + $this->crudFieldFactory->titleField(), + $choiceField, + $this->crudFieldFactory->imageField( + 'profile', + $pageName, + self::getEntityFqcn(), + $profileTranslation->getMessage() + ), + DateField::new('birthday', new TranslatableMessage('Birthday')), + DateField::new('deathday', new TranslatableMessage('Deathday')), + $textField, + $wysiwygField, + ] + ); + $this->crudFieldFactory->addTab('casting', FormField::addTab(new TranslatableMessage('Casting'))); + $this->crudFieldFactory->addFieldsToTab( + 'casting', + [ + $associationField, + $movieField, + $seasonField, + $episodeField, + ] + ); + $this->crudFieldFactory->setTabDate($pageName); + + yield from $this->crudFieldFactory->getConfigureFields($pageName); + } + + public static function getEntityFqcn(): string + { + return Person::class; + } + + public function jsonPerson(Request $request): JsonResponse + { + $entityId = $request->query->get('entityId'); + $repositoryAbstract = $this->getRepository(); + $person = $repositoryAbstract->find($entityId); + $details = $this->theMovieDbApi->getDetailPerson($person); + + return new JsonResponse($details); + } + + public function tmdb(Request $request): RedirectResponse + { + $entityId = $request->query->get('entityId'); + $repositoryAbstract = $this->getRepository(); + $movie = $repositoryAbstract->find($entityId); + + return $this->redirect('https://www.themoviedb.org/person/'.$movie->getTmdb()); + } + + public function updateAllPerson(): RedirectResponse + { + $this->messageBus->dispatch(new PersonAllMessage()); + + return $this->redirectToRoute('admin_person_index'); + } + + public function updatePerson(Request $request): RedirectResponse + { + $entityId = $request->query->get('entityId'); + $repositoryAbstract = $this->getRepository(); + $person = $repositoryAbstract->find($entityId); + $this->messageBus->dispatch(new PersonMessage($person->getId())); + if ($request->headers->has('referer')) { + $url = $request->headers->get('referer'); + if (is_string($url) && '' !== $url) { + return $this->redirect($url); + } + } + + return $this->redirectToRoute('admin_person_index'); + } + + private function setUpdateAction(): void + { + if (!$this->actionsFactory->isTrash()) { + return; + } + + $action = Action::new('updatePerson', new TranslatableMessage('Update'), 'fas fa-sync-alt'); + $action->linkToCrudAction('updatePerson'); + $action->displayIf(static fn ($entity): bool => is_null($entity->getDeletedAt())); + + $this->actionsFactory->add(Crud::PAGE_DETAIL, $action); + $this->actionsFactory->add(Crud::PAGE_EDIT, $action); + $this->actionsFactory->add(Crud::PAGE_INDEX, $action); + + $action = Action::new('jsonPerson', new TranslatableMessage('Json'), 'fas fa-server'); + $action->linkToCrudAction('jsonPerson'); + $action->setHtmlAttributes( + ['target' => '_blank'] + ); + $action->displayIf(static fn ($entity): bool => is_null($entity->getDeletedAt())); + + $this->actionsFactory->add(Crud::PAGE_DETAIL, $action); + $this->actionsFactory->add(Crud::PAGE_EDIT, $action); + $this->actionsFactory->add(Crud::PAGE_INDEX, $action); + } +} diff --git a/apps/src/Controller/Admin/PlatformCrudController.php b/apps/src/Controller/Admin/PlatformCrudController.php index ca47a1986..eda345f41 100644 --- a/apps/src/Controller/Admin/PlatformCrudController.php +++ b/apps/src/Controller/Admin/PlatformCrudController.php @@ -29,7 +29,10 @@ public function addByApi(Request $request): JsonResponse [ 'status' => 'success', 'id' => $id, - 'message' => $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()), + 'message' => $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ), ] ); } diff --git a/apps/src/Controller/Admin/PostCrudController.php b/apps/src/Controller/Admin/PostCrudController.php index 55a6b9417..1a789d964 100644 --- a/apps/src/Controller/Admin/PostCrudController.php +++ b/apps/src/Controller/Admin/PostCrudController.php @@ -53,8 +53,8 @@ public function configureFields(string $pageName): iterable ); // Additional specific field (resume) not yet in factory bundle - placed at end of principal tab - $wysiwgTranslation = new TranslatableMessage('resume'); - $wysiwygField = WysiwygField::new('resume', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('resume'); + $wysiwygField = WysiwygField::new('resume', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); $this->crudFieldFactory->addFieldsToTab('principal', [$wysiwygField]); diff --git a/apps/src/Controller/Admin/RedirectionCrudController.php b/apps/src/Controller/Admin/RedirectionCrudController.php index 92c8c78d0..691232a97 100644 --- a/apps/src/Controller/Admin/RedirectionCrudController.php +++ b/apps/src/Controller/Admin/RedirectionCrudController.php @@ -195,7 +195,7 @@ protected function sendToExport(array $header, array $rows): Response try { foreach (['Xlsx', 'Xls', 'Ods'] as $writerType) { - $path = $this->getFilename($now->format('Ymd') . '-export.', mb_strtolower($writerType)); + $path = $this->getFilename($now->format('Ymd').'-export.', mb_strtolower($writerType)); $writer = IOFactory::createWriter($spreadsheet, $writerType); $writer->save($path); $zipArchive->addFile($path, basename($path)); @@ -211,10 +211,10 @@ protected function sendToExport(array $header, array $rows): Response Response::HTTP_OK, [ 'Content-Type' => 'application/x-zip', - 'Content-Disposition' => 'attachment; filename="' . $now->format('Ymd') . '-export.zip"', + 'Content-Disposition' => 'attachment; filename="'.$now->format('Ymd').'-export.zip"', 'Cache:Control' => 'no-cache, must-revalidate', 'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT', - 'Last-Modified' => gmdate('D, d M Y H:i:s') . ' GMT', + 'Last-Modified' => gmdate('D, d M Y H:i:s').' GMT', 'Pragma' => 'no-cache', ] ); @@ -269,9 +269,9 @@ private function getFilename(string $filename, string $extension = 'xlsx'): stri { $originalExtension = pathinfo($filename, PATHINFO_EXTENSION); - return $this->getTemporaryFolder() . '/' . str_replace( - '.' . $originalExtension, - '.' . $extension, + return $this->getTemporaryFolder().'/'.str_replace( + '.'.$originalExtension, + '.'.$extension, basename($filename) ); } @@ -310,7 +310,7 @@ private function importCsv(UploadedFile $uploadedFile): array $source = parse_url((string) $row[$head['Source']]); $destination = $row[$head['Destination']]; $source = $source['path']; - $source .= isset($source['query']) ? '?' . $source['query'] : ''; + $source .= isset($source['query']) ? '?'.$source['query'] : ''; $redirection = $this->getRepository(Redirection::class)->findOneBy( ['source' => $source] ); diff --git a/apps/src/Controller/Admin/SagaCrudController.php b/apps/src/Controller/Admin/SagaCrudController.php index a1168d9a4..af7600999 100644 --- a/apps/src/Controller/Admin/SagaCrudController.php +++ b/apps/src/Controller/Admin/SagaCrudController.php @@ -53,9 +53,10 @@ public function configureFields(string $pageName): iterable $textField = TextField::new('tmdb', new TranslatableMessage('Tmdb')); $wysiwgTranslation = new TranslatableMessage('Description'); - $wysiwygField = WysiwygField::new('description', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('description', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); $this->crudFieldFactory->addFieldsToTab( 'principal', @@ -149,7 +150,7 @@ public function tmdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $saga = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.themoviedb.org/collection/' . $saga->getTmdb()); + return $this->redirect('https://www.themoviedb.org/collection/'.$saga->getTmdb()); } public function updateAllSaga(): RedirectResponse diff --git a/apps/src/Controller/Admin/SeasonCrudController.php b/apps/src/Controller/Admin/SeasonCrudController.php index 6a2e1ea07..966f4f4f6 100644 --- a/apps/src/Controller/Admin/SeasonCrudController.php +++ b/apps/src/Controller/Admin/SeasonCrudController.php @@ -62,10 +62,16 @@ public function configureFields(string $pageName): iterable $collectionField->hideOnForm(); $wysiwgTranslation = new TranslatableMessage('Overview'); - $wysiwygField = WysiwygField::new('overview', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('overview', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); + + $associationField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $associationField->setTemplatePath('admin/field/castings.html.twig'); + $associationField->onlyOnDetail(); + $this->crudFieldFactory->addFieldsToTab( 'principal', [ @@ -91,6 +97,7 @@ public function configureFields(string $pageName): iterable $this->episodesFieldForPage(self::getEntityFqcn(), $pageName), $collectionField, $wysiwygField, + $associationField, ] ); $this->crudFieldFactory->setTabDate($pageName); @@ -174,7 +181,7 @@ public function tmdb(Request $request): RedirectResponse $season = $repositoryAbstract->find($entityId); return $this->redirect( - 'https://www.themoviedb.org/tv/' . $season->getRefserie()->getTmdb() . '/season/' . $season->getNumber() + 'https://www.themoviedb.org/tv/'.$season->getRefserie()->getTmdb().'/season/'.$season->getNumber() ); } diff --git a/apps/src/Controller/Admin/SerieCrudController.php b/apps/src/Controller/Admin/SerieCrudController.php index 2903d5ce5..2f8e83b3c 100644 --- a/apps/src/Controller/Admin/SerieCrudController.php +++ b/apps/src/Controller/Admin/SerieCrudController.php @@ -169,7 +169,6 @@ public function configureFields(string $pageName): iterable $associationField = AssociationField::new('seasons', new TranslatableMessage('Seasons')); $associationField->setTemplatePath('admin/field/seasons.html.twig'); - $associationField->onlyOnDetail(); $collectionField = CollectionField::new('runtime', new TranslatableMessage('Runtime')); $collectionField->setTemplatePath('admin/field/runtime-serie.html.twig'); @@ -180,18 +179,23 @@ public function configureFields(string $pageName): iterable $trailerField->hideOnIndex(); $wysiwgTranslation = new TranslatableMessage('Citation'); - $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); $descriptionTranslation = new TranslatableMessage('Description'); - $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); + $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); $descriptionField->hideOnIndex(); $booleanField = $this->crudFieldFactory->booleanField('file', new TranslatableMessage('File')); $booleanField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); + $castingField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $castingField->setTemplatePath('admin/field/castings.html.twig'); + $castingField->onlyOnDetail(); + $this->crudFieldFactory->addFieldsToTab( 'principal', [ @@ -227,6 +231,7 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->companiesFieldForPage(self::getEntityFqcn(), $pageName), $associationField, $booleanField, + $castingField, $this->crudFieldFactory->booleanField('adult', new TranslatableMessage('Adult')), ] ); @@ -243,8 +248,8 @@ public function configureFilters(Filters $filters): Filters $filters->add('releaseDate'); $countries = $this->getRepository()->getCountries(); if ([] != $countries) { - $countriesTranslation = new TranslatableMessage('Countries'); - $countriesFilter = CountriesFilter::new('countries', $countriesTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Countries'); + $countriesFilter = CountriesFilter::new('countries', $translatableMessage->getMessage()); $countriesFilter->setChoices( array_merge( ['' => ''], @@ -276,7 +281,7 @@ public function imdb(Request $request): RedirectResponse return $this->redirectToRoute('admin_serie_index'); } - return $this->redirect('https://www.imdb.com/title/' . $serie->getImdb() . '/'); + return $this->redirect('https://www.imdb.com/title/'.$serie->getImdb().'/'); } public function importFileSerie(Request $request): JsonResponse @@ -294,7 +299,7 @@ public function importFileSerie(Request $request): JsonResponse $content = file_get_contents($file->getPathname()); $extension = $file->getClientOriginalExtension(); - $filename = uniqid('import_', true) . '.' . $extension; + $filename = uniqid('import_', true).'.'.$extension; $this->fileService->saveFileInAdapter('private', $filename, $content); $this->messageBus->dispatch(new ImportMessage($filename, 'serie', [])); @@ -350,7 +355,7 @@ public function tmdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $serie = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.themoviedb.org/tv/' . $serie->getTmdb()); + return $this->redirect('https://www.themoviedb.org/tv/'.$serie->getTmdb()); } public function updateAllSerie(): RedirectResponse diff --git a/apps/src/Controller/Admin/StoryCrudController.php b/apps/src/Controller/Admin/StoryCrudController.php index 13859153d..7929651e0 100644 --- a/apps/src/Controller/Admin/StoryCrudController.php +++ b/apps/src/Controller/Admin/StoryCrudController.php @@ -97,8 +97,8 @@ public function configureCrud(Crud $crud): Crud public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $wysiwgTranslation = new TranslatableMessage('resume'); - $wysiwygField = WysiwygField::new('resume', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('resume'); + $wysiwygField = WysiwygField::new('resume', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); $this->crudFieldFactory->addFieldsToTab( diff --git a/apps/src/Controller/Admin/TemplateCrudController.php b/apps/src/Controller/Admin/TemplateCrudController.php index 5ea322a33..48b8d8bf5 100644 --- a/apps/src/Controller/Admin/TemplateCrudController.php +++ b/apps/src/Controller/Admin/TemplateCrudController.php @@ -45,8 +45,8 @@ public function configureFields(string $pageName): iterable $textField->setDisabled(true); } - $wysiwgTranslation = new TranslatableMessage('HTML'); - $wysiwygField = WysiwygField::new('html', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('HTML'); + $wysiwygField = WysiwygField::new('html', $translatableMessage->getMessage()); $wysiwygField->onlyOnForms(); $textareaField = TextareaField::new('text', new TranslatableMessage('Texte brut')); diff --git a/apps/src/Controller/BackController.php b/apps/src/Controller/BackController.php index 1329c3592..6df39e9d9 100644 --- a/apps/src/Controller/BackController.php +++ b/apps/src/Controller/BackController.php @@ -12,6 +12,7 @@ use Labstag\Message\DeleteOldFileMessage; use Labstag\Repository\RepositoryAbstract; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\SiteService; use Labstag\Service\UserService; use Labstag\Service\WorkflowService; @@ -19,7 +20,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Translation\TranslatableMessage; @@ -32,7 +32,7 @@ public function __construct( protected WorkflowService $workflowService, protected SiteService $siteService, protected IgdbApi $igdbApi, - private readonly MessageBusInterface $messageBus, + private readonly MessageDispatcherService $messageDispatcherService, ) { } @@ -54,8 +54,8 @@ public function blank(): Response )] public function cacheclear(Request $request): Response { - $this->messageBus->dispatch(new ClearCacheMessage()); - $this->messageBus->dispatch(new DeleteOldFileMessage()); + $this->messageDispatcherService->dispatch(new ClearCacheMessage()); + $this->messageDispatcherService->dispatch(new DeleteOldFileMessage()); $this->addFlash('success', new TranslatableMessage('Cache cleared')); if ($request->headers->has('referer')) { $url = $request->headers->get('referer'); @@ -102,9 +102,7 @@ public function emptyOrRestore(Request $request): Response name: 'admin_permission', defaults: ['_locale' => 'fr'] )] - public function permission( - Request $request, - ): Response + public function permission(Request $request): Response { if ($request->isMethod('POST')) { $groupId = $request->query->get('groupId'); diff --git a/apps/src/Data/ChapterData.php b/apps/src/Data/ChapterData.php index 2eda8ef20..3bbb44e57 100644 --- a/apps/src/Data/ChapterData.php +++ b/apps/src/Data/ChapterData.php @@ -24,11 +24,17 @@ public function asset(mixed $entity, string $field): string public function generateSlug(object $entity): array { $slug = parent::generateSlug($entity->getRefstory()); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { @@ -59,7 +65,7 @@ public function getTitle(object $entity): string #[Override] public function getTitleMeta(object $entity): string { - return parent::getTitleMeta($entity->getRefstory()) . ' - ' . $this->getTitle($entity); + return parent::getTitleMeta($entity->getRefstory()).' - '.$this->getTitle($entity); } #[Override] diff --git a/apps/src/Data/DataAbstract.php b/apps/src/Data/DataAbstract.php index 38be6bf29..935133d84 100644 --- a/apps/src/Data/DataAbstract.php +++ b/apps/src/Data/DataAbstract.php @@ -135,6 +135,6 @@ protected function getHome(): ?object protected function globalPlaceholder(string $key): string { - return $this->fileService->asset($this->configurationService->getConfiguration(), $key . 'Placeholder'); + return $this->fileService->asset($this->configurationService->getConfiguration(), $key.'Placeholder'); } } diff --git a/apps/src/Data/EditoData.php b/apps/src/Data/EditoData.php index c38c86f5c..ea9960bbc 100644 --- a/apps/src/Data/EditoData.php +++ b/apps/src/Data/EditoData.php @@ -7,6 +7,11 @@ class EditoData extends DataAbstract implements DataInterface { + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { diff --git a/apps/src/Data/EpisodeData.php b/apps/src/Data/EpisodeData.php index 7545d728f..0b7531f62 100644 --- a/apps/src/Data/EpisodeData.php +++ b/apps/src/Data/EpisodeData.php @@ -18,6 +18,12 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefseason(), 'backdrop'); } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { @@ -34,4 +40,10 @@ public function supportsAsset(object $entity): bool { return $entity instanceof Episode; } + + #[Override] + public function supportsData(object $entity): bool + { + return $entity instanceof Episode; + } } diff --git a/apps/src/Data/GameData.php b/apps/src/Data/GameData.php index cbe30ffee..cfd5a8f60 100644 --- a/apps/src/Data/GameData.php +++ b/apps/src/Data/GameData.php @@ -20,11 +20,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlugPage($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/MemoData.php b/apps/src/Data/MemoData.php index 3ff380cfd..6ca040d1f 100644 --- a/apps/src/Data/MemoData.php +++ b/apps/src/Data/MemoData.php @@ -7,6 +7,11 @@ class MemoData extends DataAbstract implements DataInterface { + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { diff --git a/apps/src/Data/MovieData.php b/apps/src/Data/MovieData.php index 02a6b73db..e4206d995 100644 --- a/apps/src/Data/MovieData.php +++ b/apps/src/Data/MovieData.php @@ -34,11 +34,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlugPage($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/PageData.php b/apps/src/Data/PageData.php index 79c991b5d..19a004fcd 100644 --- a/apps/src/Data/PageData.php +++ b/apps/src/Data/PageData.php @@ -25,6 +25,11 @@ public function generateSlugPage(object $entity): array return $slug; } + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/PersonData.php b/apps/src/Data/PersonData.php new file mode 100644 index 000000000..9958886fb --- /dev/null +++ b/apps/src/Data/PersonData.php @@ -0,0 +1,94 @@ +entityManager->getRepository(Page::class)->findOneBy( + [ + 'type' => PageEnum::PERSONS->value, + ] + ); + + $slug = parent::generateSlugPage($page); + $slug['slug'] .= '/'.$entity->getSlug(); + + return $slug; + } + + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getProfile(); + } + + #[Override] + public function getEntity(?string $slug): object + { + return $this->getEntityBySlugPerson($slug); + } + + #[Override] + public function match(?string $slug): bool + { + $page = $this->getEntityBySlugPerson($slug); + + return $page instanceof Person; + } + + #[Override] + public function placeholder(): string + { + $placeholder = $this->globalPlaceholder('person'); + if ('' !== $placeholder) { + return $placeholder; + } + + return parent::placeholder(); + } + + #[Override] + public function supportsAsset(object $entity): bool + { + return $entity instanceof Person; + } + + #[Override] + public function supportsData(object $entity): bool + { + return $entity instanceof Person; + } + + protected function getEntityBySlugPerson(?string $slug): ?object + { + if (0 === substr_count((string) $slug, '/')) { + return null; + } + + $slugSecond = basename((string) $slug); + $slugFirst = dirname((string) $slug); + + $page = $this->entityManager->getRepository(Page::class)->findOneBy( + ['slug' => $slugFirst] + ); + if (!$page instanceof Page) { + return null; + } + + if ($page->getType() != PageEnum::PERSONS->value) { + return null; + } + + return $this->entityManager->getRepository(Person::class)->findOneBy( + ['slug' => $slugSecond] + ); + } +} diff --git a/apps/src/Data/PostData.php b/apps/src/Data/PostData.php index b0bf24083..a3eb98c8a 100644 --- a/apps/src/Data/PostData.php +++ b/apps/src/Data/PostData.php @@ -23,11 +23,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/SagaData.php b/apps/src/Data/SagaData.php index d29277fe8..7104fe0e9 100644 --- a/apps/src/Data/SagaData.php +++ b/apps/src/Data/SagaData.php @@ -37,11 +37,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { @@ -82,6 +88,9 @@ public function getJsonLdMovie(Movie $entity): object $movie->image($img); } + $actors = $this->getJsonLdActors($entity); + $movie->actor($actors); + return $movie; } @@ -169,4 +178,36 @@ protected function getEntityBySlugSaga(?string $slug): ?object ['slug' => $slugSecond] ); } + + private function getJsonLdActors(Movie $movie): array + { + $actors = []; + foreach ($movie->getCastings() as $casting) { + $person = $casting->getRefPerson(); + $knownForDepartment = $casting->getKnownForDepartment(); + if ('Acting' !== $knownForDepartment || false === $person->isEnable()) { + continue; + } + + $actors[] = $this->getJsonLdPerson($person); + } + + return $actors; + } + + private function getJsonLdPerson(object $entity): object + { + $person = Schema::person(); + $person->name($entity->getTitle()); + + $img = $this->siteService->asset($entity, 'profile', true, true); + $person->url( + $this->router->generate('front', $this->slugService->forEntity($entity), RouterInterface::ABSOLUTE_URL) + ); + if ('' !== $img) { + $person->image($img); + } + + return $person; + } } diff --git a/apps/src/Data/SeasonData.php b/apps/src/Data/SeasonData.php index 0a24e08c5..7d94e26b6 100644 --- a/apps/src/Data/SeasonData.php +++ b/apps/src/Data/SeasonData.php @@ -26,11 +26,17 @@ public function asset(mixed $entity, string $field): string public function generateSlug(object $entity): array { $slug = parent::generateSlug($entity->getRefserie()); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { @@ -76,7 +82,7 @@ public function getTitle(object $entity): string #[Override] public function getTitleMeta(object $entity): string { - return parent::getTitle($entity->getRefserie()) . ' - ' . $this->getTitle($entity); + return parent::getTitle($entity->getRefserie()).' - '.$this->getTitle($entity); } #[Override] diff --git a/apps/src/Data/SerieData.php b/apps/src/Data/SerieData.php index d284eadd0..ad8da466e 100644 --- a/apps/src/Data/SerieData.php +++ b/apps/src/Data/SerieData.php @@ -36,11 +36,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/StarData.php b/apps/src/Data/StarData.php index 52af85934..74f2ad46a 100644 --- a/apps/src/Data/StarData.php +++ b/apps/src/Data/StarData.php @@ -7,6 +7,11 @@ class StarData extends DataAbstract implements DataInterface { + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { diff --git a/apps/src/Data/StoryData.php b/apps/src/Data/StoryData.php index 00deb7b58..788772fab 100644 --- a/apps/src/Data/StoryData.php +++ b/apps/src/Data/StoryData.php @@ -23,11 +23,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/DataFixtures/BlockFixtures.php b/apps/src/DataFixtures/BlockFixtures.php index 873fccd68..7a47021ae 100644 --- a/apps/src/DataFixtures/BlockFixtures.php +++ b/apps/src/DataFixtures/BlockFixtures.php @@ -198,7 +198,7 @@ private function newBlock(?string $code): Block { $block = $this->blockService->getByCode($code); if (is_null($block)) { - throw new Exception('Block ' . $code . ' not found'); + throw new Exception('Block '.$code.' not found'); } $blockClass = $block->getClass(); @@ -218,7 +218,7 @@ private function setLink(?Page $page, ?array &$data): void $data[] = [ 'title' => $page->getTitle(), - 'url' => '[pageurl:' . $page->getId() . ']', + 'url' => '[pageurl:'.$page->getId().']', 'classes' => null, 'blank' => false, ]; diff --git a/apps/src/DataFixtures/CategoryFixtures.php b/apps/src/DataFixtures/CategoryFixtures.php index 0e9c9f94a..50a120692 100644 --- a/apps/src/DataFixtures/CategoryFixtures.php +++ b/apps/src/DataFixtures/CategoryFixtures.php @@ -40,14 +40,14 @@ protected function addCategory(Generator $generator, ObjectManager $objectManage $parent = random_int(0, 1); if (1 === $parent) { - $categories = $this->getParent('category' . $code); + $categories = $this->getParent('category'.$code); if ([] !== $categories) { $parentCategory = $this->getReference(array_rand($categories), $class); $category->setParent($parentCategory); } } - $id = 'category' . $code . '_' . md5(uniqid()); + $id = 'category'.$code.'_'.md5(uniqid()); $this->addReference($id, $category); $this->categories[$id] = $category; $objectManager->persist($category); diff --git a/apps/src/DataFixtures/ChapterFixtures.php b/apps/src/DataFixtures/ChapterFixtures.php index c5e12caf4..a7c8437de 100644 --- a/apps/src/DataFixtures/ChapterFixtures.php +++ b/apps/src/DataFixtures/ChapterFixtures.php @@ -70,7 +70,7 @@ protected function addChapter(Generator $generator, ObjectManager $objectManager } $this->setImage($chapter, 'imgFile'); - $this->addReference('chapter_' . md5(uniqid()), $chapter); + $this->addReference('chapter_'.md5(uniqid()), $chapter); $this->position[$storyId][] = $chapter; $objectManager->persist($chapter); } diff --git a/apps/src/DataFixtures/ConfigFixtures.php b/apps/src/DataFixtures/ConfigFixtures.php index 37ebdca94..fe0cd4538 100644 --- a/apps/src/DataFixtures/ConfigFixtures.php +++ b/apps/src/DataFixtures/ConfigFixtures.php @@ -40,17 +40,21 @@ public function load(ObjectManager $objectManager): void $configuration->setDisableEmptyAgent(false); $this->setImage($configuration, 'logoFile'); $this->setImage($configuration, 'placeholderFile'); - $this->setImage($configuration, 'chapterPlaceholder'); - $this->setImage($configuration, 'editoPlaceholder'); - $this->setImage($configuration, 'episodePlaceholder'); - $this->setImage($configuration, 'memoPlaceholder'); - $this->setImage($configuration, 'moviePlaceholder'); - $this->setImage($configuration, 'gamePlaceholder'); - $this->setImage($configuration, 'postPlaceholder'); - $this->setImage($configuration, 'sagaPlaceholder'); - $this->setImage($configuration, 'starPlaceholder'); - $this->setImage($configuration, 'storyPlaceholder'); - $this->setImage($configuration, 'userPlaceholder'); + $this->setImage($configuration, 'chapterPlaceholderFile'); + $this->setImage($configuration, 'editoPlaceholderFile'); + $this->setImage($configuration, 'episodePlaceholderFile'); + $this->setImage($configuration, 'gamePlaceholderFile'); + $this->setImage($configuration, 'memoPlaceholderFile'); + $this->setImage($configuration, 'moviePlaceholderFile'); + $this->setImage($configuration, 'pagePlaceholderFile'); + $this->setImage($configuration, 'personPlaceholderFile'); + $this->setImage($configuration, 'postPlaceholderFile'); + $this->setImage($configuration, 'sagaPlaceholderFile'); + $this->setImage($configuration, 'seasonPlaceholderFile'); + $this->setImage($configuration, 'seriePlaceholderFile'); + $this->setImage($configuration, 'starPlaceholderFile'); + $this->setImage($configuration, 'storyPlaceholderFile'); + $this->setImage($configuration, 'userPlaceholderFile'); $objectManager->persist($configuration); diff --git a/apps/src/DataFixtures/EditoFixtures.php b/apps/src/DataFixtures/EditoFixtures.php index 955e8000e..89ec0440f 100644 --- a/apps/src/DataFixtures/EditoFixtures.php +++ b/apps/src/DataFixtures/EditoFixtures.php @@ -47,7 +47,7 @@ protected function addEdito(Generator $generator, ObjectManager $objectManager, $edito->setTitle($generator->unique()->colorName()); $this->addParagraphText($edito); $this->setImage($edito, 'imgFile'); - $this->addReference('edito_' . md5(uniqid()), $edito); + $this->addReference('edito_'.md5(uniqid()), $edito); $objectManager->persist($edito); } } diff --git a/apps/src/DataFixtures/MemoFixtures.php b/apps/src/DataFixtures/MemoFixtures.php index f2f1c4f9b..1839eec58 100644 --- a/apps/src/DataFixtures/MemoFixtures.php +++ b/apps/src/DataFixtures/MemoFixtures.php @@ -49,7 +49,7 @@ protected function addMemo(Generator $generator, ObjectManager $objectManager, i $this->paragraphService->addParagraph($memo, 'head'); $this->addParagraphText($memo); $this->setImage($memo, 'imgFile'); - $this->addReference('memo_' . md5(uniqid()), $memo); + $this->addReference('memo_'.md5(uniqid()), $memo); $objectManager->persist($memo); } } diff --git a/apps/src/DataFixtures/PageFixtures.php b/apps/src/DataFixtures/PageFixtures.php index 3ae66e13f..41fe0e7ec 100644 --- a/apps/src/DataFixtures/PageFixtures.php +++ b/apps/src/DataFixtures/PageFixtures.php @@ -313,7 +313,7 @@ private function setPage(ObjectManager $objectManager, Generator $generator, Pag $this->addTagToEntity($page, PageTag::class); $this->addCategoryToEntity($page, PageCategory::class); - $this->addReference('page_' . md5(uniqid()), $page); + $this->addReference('page_'.md5(uniqid()), $page); $objectManager->persist($page); } diff --git a/apps/src/DataFixtures/PostFixtures.php b/apps/src/DataFixtures/PostFixtures.php index a747af668..b04b91d8e 100644 --- a/apps/src/DataFixtures/PostFixtures.php +++ b/apps/src/DataFixtures/PostFixtures.php @@ -58,7 +58,7 @@ protected function addPost(Generator $generator, ObjectManager $objectManager): $this->addParagraphText($post); $this->addTagToEntity($post, PostTag::class); $this->addCategoryToEntity($post, PostCategory::class); - $this->addReference('post_' . md5(uniqid()), $post); + $this->addReference('post_'.md5(uniqid()), $post); $objectManager->persist($post); } } diff --git a/apps/src/DataFixtures/StoryFixtures.php b/apps/src/DataFixtures/StoryFixtures.php index 8be52e6ce..983537622 100644 --- a/apps/src/DataFixtures/StoryFixtures.php +++ b/apps/src/DataFixtures/StoryFixtures.php @@ -58,7 +58,7 @@ protected function addStory(Generator $generator, ObjectManager $objectManager): $this->setImage($story, 'imgFile'); $this->addTagToEntity($story, StoryTag::class); $this->addCategoryToEntity($story, StoryCategory::class); - $this->addReference('story_' . md5(uniqid()), $story); + $this->addReference('story_'.md5(uniqid()), $story); $objectManager->persist($story); } } diff --git a/apps/src/DataFixtures/TagFixtures.php b/apps/src/DataFixtures/TagFixtures.php index f390a762d..59b5c25bb 100644 --- a/apps/src/DataFixtures/TagFixtures.php +++ b/apps/src/DataFixtures/TagFixtures.php @@ -33,7 +33,7 @@ protected function addTag(Generator $generator, ObjectManager $objectManager): v foreach ($tab as $code => $class) { $tag = new $class(); $tag->setTitle($generator->unique()->colorName()); - $this->addReference('tag' . $code . '_' . md5(uniqid()), $tag); + $this->addReference('tag'.$code.'_'.md5(uniqid()), $tag); $objectManager->persist($tag); } } diff --git a/apps/src/DataFixtures/TemplateFixtures.php b/apps/src/DataFixtures/TemplateFixtures.php index 48d6345ae..1e289ad5e 100644 --- a/apps/src/DataFixtures/TemplateFixtures.php +++ b/apps/src/DataFixtures/TemplateFixtures.php @@ -37,7 +37,7 @@ public function load(ObjectManager $objectManager): void foreach ($this->templates as $row) { $template = new Template(); $template->setCode($row->getCode()); - $template->setTitle('Template ' . $row->getCode()); + $template->setTitle('Template '.$row->getCode()); $template->setText($row->getContent('txt')); $template->setHtml($row->getContent('html')); $objectManager->persist($template); diff --git a/apps/src/DataFixtures/UserFixtures.php b/apps/src/DataFixtures/UserFixtures.php index faeff2844..72837a7da 100644 --- a/apps/src/DataFixtures/UserFixtures.php +++ b/apps/src/DataFixtures/UserFixtures.php @@ -67,7 +67,7 @@ private function setUser(ObjectManager $objectManager, User $user, array $data): $user->setPassword($hash); $this->setImage($user, 'avatarFile'); - $this->addReference('user_' . $user->getUsername(), $user); + $this->addReference('user_'.$user->getUsername(), $user); $objectManager->persist($user); } diff --git a/apps/src/Email/EmailAbstract.php b/apps/src/Email/EmailAbstract.php index b2f50bc3a..afcac4e54 100644 --- a/apps/src/Email/EmailAbstract.php +++ b/apps/src/Email/EmailAbstract.php @@ -164,10 +164,10 @@ protected function getTemplateContent(string $folder, string $type): array return $this->templates[$type]; } - $twig = '.' . $type . '.twig'; + $twig = '.'.$type.'.twig'; $files = [ - 'emails/' . $folder . $twig, - 'emails/default' . $twig, + 'emails/'.$folder.$twig, + 'emails/default'.$twig, ]; $view = end($files); @@ -210,7 +210,7 @@ private function replace(string $content): string { foreach ($this->replaces as $replace) { $replace->setData($this->data); - $content = str_replace('%' . $replace->getCode() . '%', $replace->exec(), $content); + $content = str_replace('%'.$replace->getCode().'%', $replace->exec(), $content); } return $content; diff --git a/apps/src/Entity/Casting.php b/apps/src/Entity/Casting.php new file mode 100644 index 000000000..add860e05 --- /dev/null +++ b/apps/src/Entity/Casting.php @@ -0,0 +1,129 @@ +figure; + } + + public function getId(): ?string + { + return $this->id; + } + + public function getKnownForDepartment(): ?string + { + return $this->knownForDepartment; + } + + public function getRefEpisode(): ?Episode + { + return $this->refEpisode; + } + + public function getRefMovie(): ?Movie + { + return $this->refMovie; + } + + public function getRefPerson(): ?Person + { + return $this->refPerson; + } + + public function getRefSeason(): ?Season + { + return $this->refSeason; + } + + public function getRefSerie(): ?Serie + { + return $this->refSerie; + } + + public function setFigure(?string $figure): static + { + $this->figure = $figure; + + return $this; + } + + public function setKnownForDepartment(?string $knownForDepartment): static + { + $this->knownForDepartment = $knownForDepartment; + + return $this; + } + + public function setRefEpisode(?Episode $refEpisode): static + { + $this->refEpisode = $refEpisode; + + return $this; + } + + public function setRefMovie(?Movie $refMovie): static + { + $this->refMovie = $refMovie; + + return $this; + } + + public function setRefPerson(?Person $refPerson): static + { + $this->refPerson = $refPerson; + + return $this; + } + + public function setRefSeason(?Season $refSeason): static + { + $this->refSeason = $refSeason; + + return $this; + } + + public function setRefSerie(?Serie $refSerie): static + { + $this->refSerie = $refSerie; + + return $this; + } +} diff --git a/apps/src/Entity/Configuration.php b/apps/src/Entity/Configuration.php index f5cb6bad1..bc7ef2918 100644 --- a/apps/src/Entity/Configuration.php +++ b/apps/src/Entity/Configuration.php @@ -93,6 +93,12 @@ class Configuration #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'pagePlaceholder')] protected ?File $pagePlaceholderFile = null; + #[ORM\Column(name: 'person_placeholder', length: 255, nullable: true)] + protected ?string $personPlaceholder = null; + + #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'personPlaceholder')] + protected ?File $personPlaceholderFile = null; + #[ORM\Column(length: 255, nullable: true)] protected ?string $placeholder = null; @@ -468,6 +474,16 @@ public function getPagePlaceholderFile(): ?File return $this->pagePlaceholderFile; } + public function getPersonPlaceholder(): ?string + { + return $this->personPlaceholder; + } + + public function getPersonPlaceholderFile(): ?File + { + return $this->personPlaceholderFile; + } + public function getPlaceholder(): ?string { return $this->placeholder; @@ -955,6 +971,22 @@ public function setPagePlaceholderFile(?File $pagePlaceholderFile = null): void } } + public function setPersonPlaceholder(?string $personPlaceholder): void + { + $this->personPlaceholder = $personPlaceholder; + } + + public function setPersonPlaceholderFile(?File $personPlaceholderFile = null): void + { + $this->personPlaceholderFile = $personPlaceholderFile; + + if ($personPlaceholderFile instanceof File) { + // It is required that at least one field changes if you are using doctrine + // otherwise the event listeners won't be called and the file is lost + $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); + } + } + public function setPlaceholder(?string $placeholder): void { $this->placeholder = $placeholder; diff --git a/apps/src/Entity/Episode.php b/apps/src/Entity/Episode.php index c6ee37066..9e162ddf9 100644 --- a/apps/src/Entity/Episode.php +++ b/apps/src/Entity/Episode.php @@ -4,6 +4,8 @@ use DateTime; use DateTimeImmutable; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; @@ -69,16 +71,45 @@ class Episode implements Stringable #[ORM\Column(name: 'vote_count', nullable: true)] protected ?int $voteCount = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refEpisode')] + private Collection $castings; + + public function __construct() + { + $this->castings = new ArrayCollection(); + } + public function __toString(): string { return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefEpisode($this); + } + + return $this; + } + public function getAirDate(): ?DateTime { return $this->airDate; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + public function getId(): ?string { return $this->id; @@ -139,6 +170,16 @@ public function isEnable(): ?bool return $this->enable; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefEpisode() === $this) { + $casting->setRefEpisode(null); + } + + return $this; + } + public function setAirDate(?DateTime $airDate): static { $this->airDate = $airDate; diff --git a/apps/src/Entity/HeadPersonParagraph.php b/apps/src/Entity/HeadPersonParagraph.php new file mode 100644 index 000000000..b85b93c28 --- /dev/null +++ b/apps/src/Entity/HeadPersonParagraph.php @@ -0,0 +1,10 @@ +page; } + public function getPerson(): ?Person + { + return $this->person; + } + public function getPost(): ?Post { return $this->post; @@ -194,6 +202,18 @@ public function setPage(Page $page): static return $this; } + public function setPerson(Person $person): static + { + // set the owning side of the relation if necessary + if ($person->getMeta() !== $this) { + $person->setMeta($this); + } + + $this->person = $person; + + return $this; + } + public function setPost(Post $post): static { // set the owning side of the relation if necessary diff --git a/apps/src/Entity/Movie.php b/apps/src/Entity/Movie.php index 77761107c..3fefff2fb 100644 --- a/apps/src/Entity/Movie.php +++ b/apps/src/Entity/Movie.php @@ -135,6 +135,12 @@ class Movie implements Stringable, EntityWithParagraphsInterface #[ORM\Column(nullable: true)] protected ?int $votes = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refMovie')] + private Collection $castings; + /** * @var Collection */ @@ -149,6 +155,7 @@ public function __construct() $this->categories = new ArrayCollection(); $this->paragraphs = new ArrayCollection(); $this->companies = new ArrayCollection(); + $this->castings = new ArrayCollection(); } #[Override] @@ -157,6 +164,16 @@ public function __toString(): string return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefMovie($this); + } + + return $this; + } + public function addCategory(MovieCategory $movieCategory): static { if (!$this->categories->contains($movieCategory)) { @@ -197,6 +214,14 @@ public function getBackdropFile(): ?File return $this->backdropFile; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + /** * @return Collection */ @@ -329,6 +354,16 @@ public function isFile(): ?bool return $this->file; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefMovie() === $this) { + $casting->setRefMovie(null); + } + + return $this; + } + public function removeCategory(MovieCategory $movieCategory): static { if ($this->categories->removeElement($movieCategory)) { diff --git a/apps/src/Entity/Paragraph.php b/apps/src/Entity/Paragraph.php index 0c1fc9818..a073b3628 100644 --- a/apps/src/Entity/Paragraph.php +++ b/apps/src/Entity/Paragraph.php @@ -31,6 +31,7 @@ 'head-cv' => HeadCvParagraph::class, 'head-game' => HeadGameParagraph::class, 'head-movie' => HeadMovieParagraph::class, + 'head-person' => HeadPersonParagraph::class, 'head-post' => HeadPostParagraph::class, 'head-saga' => HeadSagaParagraph::class, 'head-season' => HeadSeasonParagraph::class, @@ -47,6 +48,7 @@ 'movie-slider' => MovieSliderParagraph::class, 'movie' => MovieParagraph::class, 'news-list' => NewsListParagraph::class, + 'person' => PersonParagraph::class, 'saga-list' => SagaListParagraph::class, 'saga' => SagaParagraph::class, 'season-list' => SeasonListParagraph::class, @@ -107,6 +109,9 @@ abstract class Paragraph implements Stringable #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] protected ?Page $page = null; + #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] + protected ?Person $person = null; + #[ORM\Column] protected ?int $position = null; @@ -181,6 +186,11 @@ public function getPage(): ?Page return $this->page; } + public function getPerson(): ?Person + { + return $this->person; + } + public function getPosition(): ?int { return $this->position; @@ -286,6 +296,13 @@ public function setPage(?Page $page): static return $this; } + public function setPerson(?Person $person): static + { + $this->person = $person; + + return $this; + } + public function setPosition(int $position): static { $this->position = $position; diff --git a/apps/src/Entity/Person.php b/apps/src/Entity/Person.php new file mode 100644 index 000000000..78689690d --- /dev/null +++ b/apps/src/Entity/Person.php @@ -0,0 +1,315 @@ + 1] + )] + protected ?bool $enable = null; + + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'CUSTOM')] + #[ORM\Column(type: Types::GUID, unique: true)] + #[ORM\CustomIdGenerator(class: UuidGenerator::class)] + protected ?string $id = null; + + #[ORM\OneToOne(inversedBy: 'person', cascade: ['persist', 'remove'], orphanRemoval: true)] + #[ORM\JoinColumn(nullable: true)] + protected ?Meta $meta = null; + + /** + * @var Collection + */ + #[ORM\OneToMany( + targetEntity: Paragraph::class, + mappedBy: 'person', + cascade: [ + 'persist', + 'remove', + ], + orphanRemoval: true + )] + #[ORM\OrderBy( + ['position' => 'ASC'] + )] + protected Collection $paragraphs; + + #[ORM\Column(length: 255, nullable: true)] + protected ?string $profile = null; + + #[Vich\UploadableField(mapping: 'person', fileNameProperty: 'profile')] + protected ?File $profileFile = null; + + #[Gedmo\Slug(fields: ['title'], updatable: true, unique: false)] + #[ORM\Column(type: Types::STRING, length: 255, nullable: true)] + protected ?string $slug = null; + + #[ORM\Column(type: Types::TEXT, nullable: true)] + private ?string $biography = null; + + #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] + private ?DateTime $birthday = null; + + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refPerson')] + private Collection $castings; + + #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] + private ?DateTime $deathday = null; + + #[ORM\Column(type: Types::SMALLINT, nullable: true)] + private ?int $gender = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $placeOfBirth = null; + + #[ORM\Column(length: 255)] + private ?string $title = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $tmdb = null; + + public function __construct() + { + $this->castings = new ArrayCollection(); + $this->paragraphs = new ArrayCollection(); + } + + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefPerson($this); + } + + return $this; + } + + public function addParagraph(Paragraph $paragraph): static + { + if (!$this->paragraphs->contains($paragraph)) { + $this->paragraphs->add($paragraph); + $paragraph->setPerson($this); + } + + return $this; + } + + public function getBiography(): ?string + { + return $this->biography; + } + + public function getBirthday(): ?DateTime + { + return $this->birthday; + } + + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + + public function getDeathday(): ?DateTime + { + return $this->deathday; + } + + public function getGender(): ?int + { + return $this->gender; + } + + public function getId(): ?string + { + return $this->id; + } + + public function getMeta(): ?Meta + { + return $this->meta; + } + + /** + * @return Collection + */ + public function getParagraphs(): Collection + { + return $this->paragraphs; + } + + public function getPlaceOfBirth(): ?string + { + return $this->placeOfBirth; + } + + public function getProfile(): ?string + { + return $this->profile; + } + + public function getProfileFile(): ?File + { + return $this->profileFile; + } + + public function getSlug(): ?string + { + return $this->slug; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function getTmdb(): ?string + { + return $this->tmdb; + } + + public function isEnable(): ?bool + { + return $this->enable; + } + + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefPerson() === $this) { + $casting->setRefPerson(null); + } + + return $this; + } + + public function removeParagraph(Paragraph $paragraph): static + { + // set the owning side to null (unless already changed) + if ($this->paragraphs->removeElement($paragraph) && $paragraph->getPerson() === $this + ) { + $paragraph->setPerson(null); + } + + return $this; + } + + public function setBiography(?string $biography): static + { + $this->biography = $biography; + + return $this; + } + + public function setBirthday(?DateTime $birthday): static + { + $this->birthday = $birthday; + + return $this; + } + + public function setDeathday(?DateTime $deathday): static + { + $this->deathday = $deathday; + + return $this; + } + + public function setEnable(bool $enable): static + { + $this->enable = $enable; + + return $this; + } + + public function setGender(?int $gender): static + { + $this->gender = $gender; + + return $this; + } + + public function setMeta(Meta $meta): static + { + $this->meta = $meta; + + return $this; + } + + public function setPlaceOfBirth(?string $placeOfBirth): static + { + $this->placeOfBirth = $placeOfBirth; + + return $this; + } + + public function setProfile(?string $profile): void + { + $this->profile = $profile; + + if (null === $profile) { + $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); + } + } + + public function setProfileFile(?File $profileFile = null): void + { + $this->profileFile = $profileFile; + + if ($profileFile instanceof File) { + // It is required that at least one field changes if you are using doctrine + // otherwise the event listeners won't be called and the file is lost + $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); + } + } + + public function setSlug(?string $slug): static + { + $this->slug = $slug; + + return $this; + } + + public function setTitle(string $title): static + { + $this->title = $title; + + return $this; + } + + public function setTmdb(?string $tmdb): static + { + $this->tmdb = $tmdb; + + return $this; + } +} diff --git a/apps/src/Entity/PersonParagraph.php b/apps/src/Entity/PersonParagraph.php new file mode 100644 index 000000000..6259ec5f0 --- /dev/null +++ b/apps/src/Entity/PersonParagraph.php @@ -0,0 +1,25 @@ +nbr; + } + + public function setNbr(?int $nbr): static + { + $this->nbr = $nbr; + + return $this; + } +} diff --git a/apps/src/Entity/Saga.php b/apps/src/Entity/Saga.php index 06f99ab6e..3c79c99c4 100644 --- a/apps/src/Entity/Saga.php +++ b/apps/src/Entity/Saga.php @@ -31,7 +31,7 @@ class Saga implements Stringable, EntityWithParagraphsInterface #[ORM\Column(length: 255, nullable: true)] protected ?string $backdrop = null; - #[Vich\UploadableField(mapping: 'movie', fileNameProperty: 'backdrop')] + #[Vich\UploadableField(mapping: 'saga', fileNameProperty: 'backdrop')] protected ?File $backdropFile = null; #[ORM\Column(type: Types::TEXT, nullable: true)] diff --git a/apps/src/Entity/Season.php b/apps/src/Entity/Season.php index 48019fc3f..d615cc871 100644 --- a/apps/src/Entity/Season.php +++ b/apps/src/Entity/Season.php @@ -115,10 +115,17 @@ class Season implements Stringable, EntityWithParagraphsInterface #[ORM\Column(name: 'vote_average', nullable: true)] protected ?float $voteAverage = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refSeason')] + private Collection $castings; + public function __construct() { $this->paragraphs = new ArrayCollection(); $this->episodes = new ArrayCollection(); + $this->castings = new ArrayCollection(); } public function __toString(): string @@ -126,6 +133,16 @@ public function __toString(): string return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefSeason($this); + } + + return $this; + } + public function addEpisode(Episode $episode): static { if (!$this->episodes->contains($episode)) { @@ -161,6 +178,14 @@ public function getBackdropFile(): ?File return $this->backdropFile; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + /** * @return Collection */ @@ -237,6 +262,16 @@ public function isEnable(): ?bool return $this->enable; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefSeason() === $this) { + $casting->setRefSeason(null); + } + + return $this; + } + public function removeEpisode(Episode $episode): static { // set the owning side to null (unless already changed) diff --git a/apps/src/Entity/Serie.php b/apps/src/Entity/Serie.php index 2c4b7079d..2b84aee6c 100644 --- a/apps/src/Entity/Serie.php +++ b/apps/src/Entity/Serie.php @@ -33,7 +33,7 @@ class Serie implements Stringable, EntityWithParagraphsInterface #[ORM\Column(length: 255, nullable: true)] protected ?string $backdrop = null; - #[Vich\UploadableField(mapping: 'movie', fileNameProperty: 'backdrop')] + #[Vich\UploadableField(mapping: 'serie', fileNameProperty: 'backdrop')] protected ?File $backdropFile = null; /** @@ -150,6 +150,12 @@ class Serie implements Stringable, EntityWithParagraphsInterface #[ORM\Column(nullable: true)] protected ?int $votes = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refSerie')] + private Collection $castings; + /** * @var Collection */ @@ -165,6 +171,7 @@ public function __construct() $this->seasons = new ArrayCollection(); $this->paragraphs = new ArrayCollection(); $this->companies = new ArrayCollection(); + $this->castings = new ArrayCollection(); } #[Override] @@ -173,6 +180,16 @@ public function __toString(): string return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefSerie($this); + } + + return $this; + } + public function addCategory(SerieCategory $serieCategory): static { if (!$this->categories->contains($serieCategory)) { @@ -223,6 +240,14 @@ public function getBackdropFile(): ?File return $this->backdropFile; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + /** * @return Collection */ @@ -363,6 +388,16 @@ public function isInProduction(): ?bool return $this->inProduction; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefSerie() === $this) { + $casting->setRefSerie(null); + } + + return $this; + } + public function removeCategory(SerieCategory $serieCategory): static { if ($this->categories->removeElement($serieCategory)) { diff --git a/apps/src/Enum/PageEnum.php b/apps/src/Enum/PageEnum.php index d7d3b2d63..e6c5da5eb 100644 --- a/apps/src/Enum/PageEnum.php +++ b/apps/src/Enum/PageEnum.php @@ -13,6 +13,7 @@ enum PageEnum: string case LOSTPASSWORD = 'lostpassword'; case MOVIES = 'movie'; case PAGE = 'page'; + case PERSONS = 'person'; case POSTS = 'post'; case SERIES = 'series'; case STORIES = 'story'; diff --git a/apps/src/Event/Abstract/EventEntityLib.php b/apps/src/Event/Abstract/EventEntityLib.php index 613f14f1a..598a01005 100644 --- a/apps/src/Event/Abstract/EventEntityLib.php +++ b/apps/src/Event/Abstract/EventEntityLib.php @@ -22,11 +22,11 @@ use Labstag\Message\StoryMessage; use Labstag\Service\BlockService; use Labstag\Service\Imdb\MovieService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\ParagraphService; use Labstag\Service\WorkflowService; use ReflectionClass; use Symfony\Component\DependencyInjection\Attribute\Autowire; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Workflow\Registry; abstract class EventEntityLib @@ -34,7 +34,7 @@ abstract class EventEntityLib public function __construct( #[Autowire(service: 'workflow.registry')] private Registry $workflowRegistry, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected WorkflowService $workflowService, protected EntityManagerInterface $entityManager, protected ParagraphService $paragraphService, diff --git a/apps/src/Event/Subscriber/SiteSubscriber.php b/apps/src/Event/Subscriber/SiteSubscriber.php index 65064ed41..798dd2674 100644 --- a/apps/src/Event/Subscriber/SiteSubscriber.php +++ b/apps/src/Event/Subscriber/SiteSubscriber.php @@ -83,7 +83,7 @@ public function onKernelRequest(RequestEvent $requestEvent): void sprintf( 'Your IP "%s" is banned
', $this->securityService->getCurrentClientIp() - ) . $banIp->getReason(), + ).$banIp->getReason(), Response::HTTP_FORBIDDEN ) ); diff --git a/apps/src/Event/Workflow/WorkflowAbstract.php b/apps/src/Event/Workflow/WorkflowAbstract.php index 075785242..ff04346de 100644 --- a/apps/src/Event/Workflow/WorkflowAbstract.php +++ b/apps/src/Event/Workflow/WorkflowAbstract.php @@ -2,12 +2,12 @@ namespace Labstag\Event\Workflow; -use Symfony\Component\Messenger\MessageBusInterface; +use Labstag\Service\MessageDispatcherService; abstract class WorkflowAbstract { public function __construct( - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, ) { } diff --git a/apps/src/EventListener/MessageDispatcherResetListener.php b/apps/src/EventListener/MessageDispatcherResetListener.php new file mode 100644 index 000000000..8d027c935 --- /dev/null +++ b/apps/src/EventListener/MessageDispatcherResetListener.php @@ -0,0 +1,30 @@ +isMainRequest()) { + return; + } + + $this->messageDispatcherService->reset(); + } +} diff --git a/apps/src/Field/Configurator/ParagraphsConfigurator.php b/apps/src/Field/Configurator/ParagraphsConfigurator.php index cf9e1b4fc..013c10e30 100644 --- a/apps/src/Field/Configurator/ParagraphsConfigurator.php +++ b/apps/src/Field/Configurator/ParagraphsConfigurator.php @@ -63,7 +63,7 @@ public function configure(FieldDto $fieldDto, EntityDto $entityDto, AdminContext $fieldDto->setFormTypeOption( 'row_attr.class', - $fieldDto->getFormTypeOption('row_attr.class') . ' ' . $cssClasses + $fieldDto->getFormTypeOption('row_attr.class').' '.$cssClasses ); } diff --git a/apps/src/Field/Configurator/WysiwygConfigurator.php b/apps/src/Field/Configurator/WysiwygConfigurator.php index 85f59dee6..a05e640b6 100644 --- a/apps/src/Field/Configurator/WysiwygConfigurator.php +++ b/apps/src/Field/Configurator/WysiwygConfigurator.php @@ -19,7 +19,7 @@ public function configure(FieldDto $fieldDto, EntityDto $entityDto, AdminContext 'attr.rows', $fieldDto->getCustomOption(WysiwygField::OPTION_NUM_OF_ROWS) ); - $fieldDto->setFormTypeOption('attr.class', $fieldDto->getFormTypeOption('attr.class') . ' wysiwyg'); + $fieldDto->setFormTypeOption('attr.class', $fieldDto->getFormTypeOption('attr.class').' wysiwyg'); } #[Override] diff --git a/apps/src/Field/ParagraphsField.php b/apps/src/Field/ParagraphsField.php index 464e64e09..c4c8860ca 100644 --- a/apps/src/Field/ParagraphsField.php +++ b/apps/src/Field/ParagraphsField.php @@ -48,7 +48,7 @@ public static function new($label = false, ?string $icon = null): self { $field = new self(); $field->setFieldFqcn(self::class); - $field->setProperty('ea_form_panel_' . (new Ulid())); + $field->setProperty('ea_form_panel_'.(new Ulid())); $field->setLabel($label); $field->setFormType(ParagraphType::class); $field->setFormTypeOptions([ diff --git a/apps/src/Field/UploadImageField.php b/apps/src/Field/UploadImageField.php index e48f5188f..838c5b3c0 100644 --- a/apps/src/Field/UploadImageField.php +++ b/apps/src/Field/UploadImageField.php @@ -51,14 +51,14 @@ public function setTranslator(TranslatorInterface $translator): void new File( maxSize: ini_get('upload_max_filesize'), mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'], - mimeTypesMessage: $translator->trans( - $mimeTypesMessage->getMessage(), - $mimeTypesMessage->getParameters() - ), maxSizeMessage: $translator->trans( $maxSizeMessage->getMessage(), $maxSizeMessage->getParameters() ), + mimeTypesMessage: $translator->trans( + $mimeTypesMessage->getMessage(), + $mimeTypesMessage->getParameters() + ), ), ], ] diff --git a/apps/src/FileStorage/FileStorageAbstract.php b/apps/src/FileStorage/FileStorageAbstract.php index a81381e7f..eb9cdb936 100644 --- a/apps/src/FileStorage/FileStorageAbstract.php +++ b/apps/src/FileStorage/FileStorageAbstract.php @@ -97,14 +97,14 @@ protected function setType(string $type): self private function getFolder(): mixed { - $config = Yaml::parse(file_get_contents($this->kernel->getProjectDir() . '/config/packages/flysystem.yaml')); + $config = Yaml::parse(file_get_contents($this->kernel->getProjectDir().'/config/packages/flysystem.yaml')); $storages = $config['flysystem']['storages']; - if (!array_key_exists($this->type . '.storage', $storages)) { + if (!array_key_exists($this->type.'.storage', $storages)) { throw new Exception('Type not found'); } - $storage = $storages[$this->type . '.storage']; + $storage = $storages[$this->type.'.storage']; return $storage['options']['directory']; } diff --git a/apps/src/FileStorage/PersonFileStorage.php b/apps/src/FileStorage/PersonFileStorage.php new file mode 100644 index 000000000..2ff33e23b --- /dev/null +++ b/apps/src/FileStorage/PersonFileStorage.php @@ -0,0 +1,29 @@ +setAdapter($localFilesystemAdapter); + $this->setType('person'); + } + + #[Override] + public function getEntity(): array + { + return [Person::class]; + } +} diff --git a/apps/src/FileStorage/SerieFileStorage.php b/apps/src/FileStorage/SerieFileStorage.php new file mode 100644 index 000000000..cd022a15e --- /dev/null +++ b/apps/src/FileStorage/SerieFileStorage.php @@ -0,0 +1,29 @@ +setAdapter($localFilesystemAdapter); + $this->setType('serie'); + } + + #[Override] + public function getEntity(): array + { + return [Serie::class]; + } +} diff --git a/apps/src/Filter/CountriesFilter.php b/apps/src/Filter/CountriesFilter.php index c902546af..9caa1401a 100644 --- a/apps/src/Filter/CountriesFilter.php +++ b/apps/src/Filter/CountriesFilter.php @@ -31,7 +31,7 @@ public function apply( $value = $filterDataDto->getValue(); $search = ('=' === $comparison) ? 'JSON_CONTAINS(%s.%s, :%s) = 1' : 'JSON_CONTAINS(%s.%s, :%s) = 0'; $queryBuilder->andWhere(sprintf($search, $alias, $property, $parameterName)); - $queryBuilder->setParameter($parameterName, '"' . $value . '"'); + $queryBuilder->setParameter($parameterName, '"'.$value.'"'); } /** diff --git a/apps/src/Filter/SeasonEpisodeFilter.php b/apps/src/Filter/SeasonEpisodeFilter.php index d1c5e7144..2fdc50935 100644 --- a/apps/src/Filter/SeasonEpisodeFilter.php +++ b/apps/src/Filter/SeasonEpisodeFilter.php @@ -29,7 +29,7 @@ public function apply( $alias = $filterDataDto->getEntityAlias(); if (!$this->hasJoin($queryBuilder, 'season')) { - $queryBuilder->join($alias . '.refseason', 'season'); + $queryBuilder->join($alias.'.refseason', 'season'); } if (!$this->hasJoin($queryBuilder, 'serie')) { diff --git a/apps/src/Filter/SerieEpisodeFilter.php b/apps/src/Filter/SerieEpisodeFilter.php index 40ae9e263..2702c9ba0 100644 --- a/apps/src/Filter/SerieEpisodeFilter.php +++ b/apps/src/Filter/SerieEpisodeFilter.php @@ -29,7 +29,7 @@ public function apply( $alias = $filterDataDto->getEntityAlias(); if (!$this->hasJoin($queryBuilder, 'season')) { - $queryBuilder->join($alias . '.refseason', 'season'); + $queryBuilder->join($alias.'.refseason', 'season'); } $queryBuilder->andWhere('season.number = :number'); diff --git a/apps/src/Form/Front/MovieType.php b/apps/src/Form/Front/MovieType.php index 1155bdf79..3a0b14fd8 100644 --- a/apps/src/Form/Front/MovieType.php +++ b/apps/src/Form/Front/MovieType.php @@ -37,9 +37,11 @@ public function __construct( public function buildForm(FormBuilderInterface $formBuilder, array $options): void { unset($options); - $formBuilder->add('title', TextType::class, [ - 'required' => false, - ]); + $formBuilder->add( + 'title', + TextType::class, + ['required' => false] + ); $formBuilder->add( 'country', ChoiceType::class, @@ -73,9 +75,21 @@ public function buildForm(FormBuilderInterface $formBuilder, array $options): vo 'choices' => $this->movieService->getYearForForm(), ] ); - $title = new TranslatableMessage('Title'); - $releaseDate = new TranslatableMessage('Release date'); - $dateAdded = new TranslatableMessage('Date added'); + $titleTranslation = new TranslatableMessage('Title'); + $title = $this->translator->trans( + $titleTranslation->getMessage(), + $titleTranslation->getParameters() + ); + $releaseDateTranslation = new TranslatableMessage('Release date'); + $releaseDate = $this->translator->trans( + $releaseDateTranslation->getMessage(), + $releaseDateTranslation->getParameters() + ); + $dateAddedTranslation = new TranslatableMessage('Date added'); + $dateAdded = $this->translator->trans( + $dateAddedTranslation->getMessage(), + $dateAddedTranslation->getParameters() + ); $formBuilder->add( 'order', ChoiceType::class, @@ -83,17 +97,22 @@ public function buildForm(FormBuilderInterface $formBuilder, array $options): vo 'required' => false, 'label' => new TranslatableMessage('Order'), 'choices' => [ - $this->translator->trans($title->getMessage(), $title->getParameters()) => 'title', - $this->translator->trans( - $releaseDate->getMessage(), - $releaseDate->getParameters() - ) => 'releaseDate', - $this->translator->trans($dateAdded->getMessage(), $dateAdded->getParameters()) => 'createdAt', + $title => 'title', + $releaseDate => 'releaseDate', + $dateAdded => 'createdAt', ], ] ); - $ascending = new TranslatableMessage('Ascending'); - $descending = new TranslatableMessage('Descending'); + $ascendingTranslation = new TranslatableMessage('Ascending'); + $ascending = $this->translator->trans( + $ascendingTranslation->getMessage(), + $ascendingTranslation->getParameters() + ); + $descendingTranslation = new TranslatableMessage('Descending'); + $descending = $this->translator->trans( + $descendingTranslation->getMessage(), + $descendingTranslation->getParameters() + ); $formBuilder->add( 'orderby', ChoiceType::class, @@ -101,17 +120,25 @@ public function buildForm(FormBuilderInterface $formBuilder, array $options): vo 'required' => false, 'label' => new TranslatableMessage('Sort'), 'choices' => [ - $this->translator->trans($ascending->getMessage(), $ascending->getParameters()) => 'ASC', - $this->translator->trans($descending->getMessage(), $descending->getParameters()) => 'DESC', + $ascending => 'ASC', + $descending => 'DESC', ], ] ); - $formBuilder->add('submit', SubmitType::class, [ + $formBuilder->add( + 'submit', + SubmitType::class, + [ 'label' => new TranslatableMessage('Search'), - ]); - $formBuilder->add('reset', ResetType::class, [ + ] + ); + $formBuilder->add( + 'reset', + ResetType::class, + [ 'label' => new TranslatableMessage('Reset'), - ]); + ] + ); } public function configureOptions(OptionsResolver $optionsResolver): void @@ -122,9 +149,10 @@ public function configureOptions(OptionsResolver $optionsResolver): void $optionsResolver->setDefaults( [ 'csrf_protection' => false, - 'action' => $this->router->generate('front', [ - 'slug' => $slug, - ]), + 'action' => $this->router->generate( + 'front', + ['slug' => $slug] + ), 'method' => 'GET', 'data_class' => null, ] diff --git a/apps/src/Generate/CinemaGenerate.php b/apps/src/Generate/CinemaGenerate.php index 475d5223c..b5559a660 100644 --- a/apps/src/Generate/CinemaGenerate.php +++ b/apps/src/Generate/CinemaGenerate.php @@ -153,7 +153,7 @@ private function setMovie(Page $page, array $movieData, string $locale, array &$ $paragraph->setLeftposition(($key % 2) === 0); $html = $this->pageMovieInfoTemplate->getTemplate()->getHtml(); $casts = $cast['cast'] ?? []; - $html = str_replace( + $html = str_replace( [ '%title%', '%release_date%', @@ -166,7 +166,7 @@ private function setMovie(Page $page, array $movieData, string $locale, array &$ $releaseDate->format('d/m/Y'), (string) $movieData['overview'], implode(', ', array_map(fn (array $actor) => $actor['name'], array_slice($casts, 0, 5))), - 'https://www.themoviedb.org/movie/' . $movieData['id'], + 'https://www.themoviedb.org/movie/'.$movieData['id'], ], $html ); @@ -191,7 +191,7 @@ private function setMovies(Page $page, array $movies, string $locale): void private function setVideo(Page $page, array $movieData): void { - $videos = $this->theMovieDbApi->getVideosMovie($movieData['id']); + $videos = $this->theMovieDbApi->getVideosMovie($movieData['id']); $backdrop = $this->theMovieDbApi->images()->getBackdropUrl($movieData['backdrop_path'] ?? ''); $trailer = $this->videoService->getTrailer($videos); if (is_null($trailer)) { diff --git a/apps/src/Message/MetaAllMessage.php b/apps/src/Message/MetaAllMessage.php new file mode 100644 index 000000000..d84018324 --- /dev/null +++ b/apps/src/Message/MetaAllMessage.php @@ -0,0 +1,19 @@ +entity; + } + + public function getType(): string + { + return $this->type; + } } diff --git a/apps/src/Message/FilesMessage.php b/apps/src/Message/PersonAllMessage.php similarity index 91% rename from apps/src/Message/FilesMessage.php rename to apps/src/Message/PersonAllMessage.php index 6da2094e7..5afddbcc2 100644 --- a/apps/src/Message/FilesMessage.php +++ b/apps/src/Message/PersonAllMessage.php @@ -5,7 +5,7 @@ use Symfony\Component\Messenger\Attribute\AsMessage; #[AsMessage('async')] -final class FilesMessage +final class PersonAllMessage { /* * Add whatever properties and methods you need diff --git a/apps/src/Message/PersonMessage.php b/apps/src/Message/PersonMessage.php new file mode 100644 index 000000000..c189c056f --- /dev/null +++ b/apps/src/Message/PersonMessage.php @@ -0,0 +1,20 @@ +person; + } +} diff --git a/apps/src/MessageHandler/AddMovieMessageHandler.php b/apps/src/MessageHandler/AddMovieMessageHandler.php index 7ff807ea6..dfea6b483 100644 --- a/apps/src/MessageHandler/AddMovieMessageHandler.php +++ b/apps/src/MessageHandler/AddMovieMessageHandler.php @@ -6,14 +6,14 @@ use Labstag\Message\AddMovieMessage; use Labstag\Message\MovieMessage; use Labstag\Repository\MovieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class AddMovieMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private MovieRepository $movieRepository, ) { @@ -48,7 +48,7 @@ public function __invoke(AddMovieMessage $addMovieMessage): void $movie->setFile(true); $this->movieRepository->save($movie); - $this->messageBus->dispatch(new MovieMessage($movie->getId())); + $this->messageDispatcherService->dispatch(new MovieMessage($movie->getId())); // do something with your message } } diff --git a/apps/src/MessageHandler/AddSerieMessageHandler.php b/apps/src/MessageHandler/AddSerieMessageHandler.php index 9edb098c9..06d4d3b44 100644 --- a/apps/src/MessageHandler/AddSerieMessageHandler.php +++ b/apps/src/MessageHandler/AddSerieMessageHandler.php @@ -6,14 +6,14 @@ use Labstag\Message\AddSerieMessage; use Labstag\Message\SerieMessage; use Labstag\Repository\SerieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class AddSerieMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private SerieRepository $serieRepository, ) { @@ -46,6 +46,6 @@ public function __invoke(AddSerieMessage $addSerieMessage): void $serie->setFile(true); $this->serieRepository->save($serie); - $this->messageBus->dispatch(new SerieMessage($serie->getId())); + $this->messageDispatcherService->dispatch(new SerieMessage($serie->getId())); } } diff --git a/apps/src/MessageHandler/CompanyAllMessageHandler.php b/apps/src/MessageHandler/CompanyAllMessageHandler.php index 1bcb22efe..8cf7e59f8 100644 --- a/apps/src/MessageHandler/CompanyAllMessageHandler.php +++ b/apps/src/MessageHandler/CompanyAllMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\CompanyAllMessage; use Labstag\Message\CompanyMessage; use Labstag\Repository\CompanyRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class CompanyAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private CompanyRepository $companyRepository, ) { @@ -23,7 +23,7 @@ public function __invoke(CompanyAllMessage $companyAllMessage): void unset($companyAllMessage); $companies = $this->companyRepository->findAll(); foreach ($companies as $company) { - $this->messageBus->dispatch(new CompanyMessage($company->getId())); + $this->messageDispatcherService->dispatch(new CompanyMessage($company->getId())); } } } diff --git a/apps/src/MessageHandler/FilesMessageHandler.php b/apps/src/MessageHandler/FilesMessageHandler.php deleted file mode 100644 index 0e8178d5c..000000000 --- a/apps/src/MessageHandler/FilesMessageHandler.php +++ /dev/null @@ -1,23 +0,0 @@ -fileService->deletedFileByEntities(); - } -} diff --git a/apps/src/MessageHandler/GameAllMessageHandler.php b/apps/src/MessageHandler/GameAllMessageHandler.php index da58c1dd0..633be8204 100644 --- a/apps/src/MessageHandler/GameAllMessageHandler.php +++ b/apps/src/MessageHandler/GameAllMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\GameAllMessage; use Labstag\Message\GameMessage; use Labstag\Repository\GameRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class GameAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private GameRepository $gameRepository, ) { @@ -23,7 +23,7 @@ public function __invoke(GameAllMessage $gameAllMessage): void unset($gameAllMessage); $games = $this->gameRepository->findAll(); foreach ($games as $game) { - $this->messageBus->dispatch(new GameMessage($game->getId())); + $this->messageDispatcherService->dispatch(new GameMessage($game->getId())); } } } diff --git a/apps/src/MessageHandler/ImportMessageHandler.php b/apps/src/MessageHandler/ImportMessageHandler.php index 1cc5079c3..3dd6eef74 100644 --- a/apps/src/MessageHandler/ImportMessageHandler.php +++ b/apps/src/MessageHandler/ImportMessageHandler.php @@ -7,15 +7,15 @@ use Labstag\Message\ImportMessage; use Labstag\Message\SearchGameMessage; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class ImportMessageHandler { public function __construct( private FileService $fileService, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, ) { } @@ -83,7 +83,7 @@ private function importCsvFile(string $path, array $data, string $type): void $message = $this->createMessage($type, $row, $data); if (!is_null($message)) { - $this->messageBus->dispatch($message); + $this->messageDispatcherService->dispatch($message); } } } @@ -100,7 +100,7 @@ private function importXmlFile(string $path, array $data, string $type): void $message = $this->createMessage($type, $row, $data); if (!is_null($message)) { - $this->messageBus->dispatch($message); + $this->messageDispatcherService->dispatch($message); } } } diff --git a/apps/src/MessageHandler/MetaAllMessageHandler.php b/apps/src/MessageHandler/MetaAllMessageHandler.php new file mode 100644 index 000000000..de2123108 --- /dev/null +++ b/apps/src/MessageHandler/MetaAllMessageHandler.php @@ -0,0 +1,48 @@ +messageDispatcherService->dispatch(new MetaMessage('delete')); + $entities = [ + Game::class, + Movie::class, + Page::class, + Person::class, + Post::class, + Saga::class, + Season::class, + Serie::class, + Story::class, + ]; + foreach ($entities as $entity) { + $this->messageDispatcherService->dispatch(new MetaMessage('check', $entity)); + } + } +} diff --git a/apps/src/MessageHandler/MetaMessageHandler.php b/apps/src/MessageHandler/MetaMessageHandler.php index 2f30d8e39..9f25f14f8 100644 --- a/apps/src/MessageHandler/MetaMessageHandler.php +++ b/apps/src/MessageHandler/MetaMessageHandler.php @@ -3,17 +3,9 @@ namespace Labstag\MessageHandler; use Doctrine\ORM\EntityManagerInterface; -use Labstag\Entity\Game; +use Exception; use Labstag\Entity\Meta; -use Labstag\Entity\Movie; -use Labstag\Entity\Page; -use Labstag\Entity\Post; -use Labstag\Entity\Saga; -use Labstag\Entity\Season; -use Labstag\Entity\Serie; -use Labstag\Entity\Story; use Labstag\Message\MetaMessage; -use Labstag\Repository\MetaRepository; use Labstag\Service\MetaService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; @@ -21,51 +13,28 @@ final class MetaMessageHandler { public function __construct( - protected MetaService $metaService, - protected EntityManagerInterface $entityManager, - protected MetaRepository $metaRepository, + private MetaService $metaService, + private EntityManagerInterface $entityManager, ) { } - public function __invoke(MetaMessage $message): void + public function __invoke(MetaMessage $metaMessage): void { - unset($message); - $this->deleteUselessMeta(); - $this->correctionMeta(); + $type = $metaMessage->getType(); + $entity = $metaMessage->getEntity(); + match ($type) { + 'delete' => $this->deleteUselessMeta(), + 'check' => $this->correctionMeta($entity), + default => null, + }; } - private function deleteUselessMeta(): void - { - $repository = $this->entityManager->getRepository(Meta::class); - $metas = $repository->findAll(); - foreach ($metas as $meta) { - $object = $this->metaService->getEntityParent($meta); - if (is_null($object->value) || is_null($object->name) || is_null($object)) { - $repository->delete($meta); - } - } - } - - private function correctionMeta(): void + private function correctionMeta(string $entity): void { - $entities = [ - Game::class, - Movie::class, - Page::class, - Post::class, - Saga::class, - Season::class, - Serie::class, - Story::class, - ]; - - foreach ($entities as $entity) { - + try { $repository = $this->entityManager->getRepository($entity); $items = $repository->findAll(); - - $count = 0; foreach ($items as $item) { $meta = $item->getMeta(); if (!$meta instanceof Meta) { @@ -74,15 +43,14 @@ private function correctionMeta(): void $meta = new Meta(); $item->setMeta($meta); - $this->entityManager->persist($item); - - ++$count; - } - - if (0 < $count) { - $this->entityManager->flush(); - continue; + $repository->save($item); } + } catch (Exception $exception) { + echo $exception->getMessage(); } } + + private function deleteUselessMeta(): void + { + } } diff --git a/apps/src/MessageHandler/MovieAllMessageHandler.php b/apps/src/MessageHandler/MovieAllMessageHandler.php index cb79693b9..f15611588 100644 --- a/apps/src/MessageHandler/MovieAllMessageHandler.php +++ b/apps/src/MessageHandler/MovieAllMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\MovieAllMessage; use Labstag\Message\MovieMessage; use Labstag\Repository\MovieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class MovieAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private MovieRepository $movieRepository, ) { @@ -23,7 +23,7 @@ public function __invoke(MovieAllMessage $movieAllMessage): void unset($movieAllMessage); $movies = $this->movieRepository->findAll(); foreach ($movies as $movie) { - $this->messageBus->dispatch(new MovieMessage($movie->getId())); + $this->messageDispatcherService->dispatch(new MovieMessage($movie->getId())); } } } diff --git a/apps/src/MessageHandler/NotificationMessageHandler.php b/apps/src/MessageHandler/NotificationMessageHandler.php index 76a5b418c..d3fa15053 100644 --- a/apps/src/MessageHandler/NotificationMessageHandler.php +++ b/apps/src/MessageHandler/NotificationMessageHandler.php @@ -10,15 +10,14 @@ final class NotificationMessageHandler { public function __construct( - private NotificationRepository $notificationRepository + private NotificationRepository $notificationRepository, ) { - } - public function __invoke(NotificationMessage $message): void + public function __invoke(NotificationMessage $notificationMessage): void { - unset($message); + unset($notificationMessage); $notifications = $this->notificationRepository->getAllBefore1week(); foreach ($notifications as $notification) { diff --git a/apps/src/MessageHandler/PersonAllMessageHandler.php b/apps/src/MessageHandler/PersonAllMessageHandler.php new file mode 100644 index 000000000..19ac8cb55 --- /dev/null +++ b/apps/src/MessageHandler/PersonAllMessageHandler.php @@ -0,0 +1,29 @@ +personRepository->findAll(); + foreach ($persons as $person) { + $this->messageDispatcherService->dispatch(new PersonMessage($person->getId())); + } + } +} diff --git a/apps/src/MessageHandler/PersonMessageHandler.php b/apps/src/MessageHandler/PersonMessageHandler.php new file mode 100644 index 000000000..737faf4fe --- /dev/null +++ b/apps/src/MessageHandler/PersonMessageHandler.php @@ -0,0 +1,32 @@ +getPerson(); + $person = $this->personRepository->find($personId); + if (!$person instanceof Person) { + return; + } + + $this->personService->update($person); + $this->personRepository->save($person); + } +} diff --git a/apps/src/MessageHandler/SagaAllMessageHandler.php b/apps/src/MessageHandler/SagaAllMessageHandler.php index f8240568c..ee38f6f17 100644 --- a/apps/src/MessageHandler/SagaAllMessageHandler.php +++ b/apps/src/MessageHandler/SagaAllMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\SagaAllMessage; use Labstag\Message\SagaMessage; use Labstag\Repository\SagaRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SagaAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private SagaRepository $sagaRepository, ) { @@ -23,7 +23,7 @@ public function __invoke(SagaAllMessage $sagaAllMessage): void unset($sagaAllMessage); $sagas = $this->sagaRepository->findAll(); foreach ($sagas as $saga) { - $this->messageBus->dispatch(new SagaMessage($saga->getId())); + $this->messageDispatcherService->dispatch(new SagaMessage($saga->getId())); } } } diff --git a/apps/src/MessageHandler/SearchGameMessageHandler.php b/apps/src/MessageHandler/SearchGameMessageHandler.php index cc008edfe..530fac364 100644 --- a/apps/src/MessageHandler/SearchGameMessageHandler.php +++ b/apps/src/MessageHandler/SearchGameMessageHandler.php @@ -8,15 +8,15 @@ use Labstag\Message\AddGameMessage; use Labstag\Message\SearchGameMessage; use Labstag\Service\Igdb\GameService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\NotificationService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SearchGameMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private GameService $gameService, private NotificationService $notificationService, private EntityManagerInterface $entityManager, @@ -51,7 +51,7 @@ public function __invoke(SearchGameMessage $searchGameMessage): void ); } - $this->messageBus->dispatch(new AddGameMessage($result['id'], 'game', $platform)); + $this->messageDispatcherService->dispatch(new AddGameMessage($result['id'], 'game', $platform)); } private function getGameByData(string $name): ?Game diff --git a/apps/src/MessageHandler/SeasonAllMessageHandler.php b/apps/src/MessageHandler/SeasonAllMessageHandler.php index d50b945a2..c404dc504 100644 --- a/apps/src/MessageHandler/SeasonAllMessageHandler.php +++ b/apps/src/MessageHandler/SeasonAllMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\SeasonAllMessage; use Labstag\Message\SeasonMessage; use Labstag\Repository\SeasonRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SeasonAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private SeasonRepository $seasonRepository, ) { @@ -23,7 +23,7 @@ public function __invoke(SeasonAllMessage $seasonAllMessage): void unset($seasonAllMessage); $seasons = $this->seasonRepository->findAll(); foreach ($seasons as $season) { - $this->messageBus->dispatch(new SeasonMessage($season->getId())); + $this->messageDispatcherService->dispatch(new SeasonMessage($season->getId())); } } } diff --git a/apps/src/MessageHandler/SerieAllMessageHandler.php b/apps/src/MessageHandler/SerieAllMessageHandler.php index ecd6ea4aa..811595c48 100644 --- a/apps/src/MessageHandler/SerieAllMessageHandler.php +++ b/apps/src/MessageHandler/SerieAllMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\SerieAllMessage; use Labstag\Message\SerieMessage; use Labstag\Repository\SerieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SerieAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private SerieRepository $serieRepository, ) { @@ -23,7 +23,7 @@ public function __invoke(SerieAllMessage $serieAllMessage): void unset($serieAllMessage); $series = $this->serieRepository->findAll(); foreach ($series as $serie) { - $this->messageBus->dispatch(new SerieMessage($serie->getId())); + $this->messageDispatcherService->dispatch(new SerieMessage($serie->getId())); } } } diff --git a/apps/src/MessageHandler/StoryAllMessageHandler.php b/apps/src/MessageHandler/StoryAllMessageHandler.php index 1a9add5e3..a45f1f2e6 100644 --- a/apps/src/MessageHandler/StoryAllMessageHandler.php +++ b/apps/src/MessageHandler/StoryAllMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\StoryAllMessage; use Labstag\Message\StoryMessage; use Labstag\Repository\StoryRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class StoryAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private StoryRepository $storyRepository, ) { @@ -23,7 +23,7 @@ public function __invoke(StoryAllMessage $storyAllMessage): void unset($storyAllMessage); $stories = $this->storyRepository->findAll(); foreach ($stories as $story) { - $this->messageBus->dispatch(new StoryMessage($story->getId())); + $this->messageDispatcherService->dispatch(new StoryMessage($story->getId())); } } } diff --git a/apps/src/MessageHandler/UpdateSerieMessageHandler.php b/apps/src/MessageHandler/UpdateSerieMessageHandler.php index bc4bd7286..d788e1b8a 100644 --- a/apps/src/MessageHandler/UpdateSerieMessageHandler.php +++ b/apps/src/MessageHandler/UpdateSerieMessageHandler.php @@ -5,14 +5,14 @@ use Labstag\Message\SerieMessage; use Labstag\Message\UpdateSerieMessage; use Labstag\Repository\SerieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class UpdateSerieMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private SerieRepository $serieRepository, ) { @@ -25,7 +25,7 @@ public function __invoke(UpdateSerieMessage $updateSerieMessage): void ['inProduction' => true] ); foreach ($series as $serie) { - $this->messageBus->dispatch(new SerieMessage($serie->getId())); + $this->messageDispatcherService->dispatch(new SerieMessage($serie->getId())); } } } diff --git a/apps/src/Middleware/DeduplicationMiddleware.php b/apps/src/Middleware/DeduplicationMiddleware.php new file mode 100644 index 000000000..ef37f5235 --- /dev/null +++ b/apps/src/Middleware/DeduplicationMiddleware.php @@ -0,0 +1,63 @@ +getMessage(); + $messageKey = $this->getMessageKey($message); + + // Si le message a déjà été dispatché, on ne le traite pas + if ($this->messageDispatcherService->isAlreadyDispatched($messageKey)) { + return $envelope; + } + + // Marquer comme dispatché + $this->messageDispatcherService->markAsDispatched($messageKey); + + // Continuer le traitement + return $stack->next()->handle($envelope, $stack); + } + + private function getMessageKey(object $message): string + { + $className = $message::class; + $reflectionClass = new ReflectionClass($message); + $properties = []; + + foreach ($reflectionClass->getProperties() as $reflectionProperty) { + $value = $reflectionProperty->getValue($message); + $properties[$reflectionProperty->getName()] = $this->serializeValue($value); + } + + ksort($properties); + + return $className.'::'.md5(serialize($properties)); + } + + private function serializeValue(mixed $value): mixed + { + if (is_object($value)) { + return spl_object_hash($value); + } + + return $value; + } +} diff --git a/apps/src/Paragraph/ExperiencesParagraph.php b/apps/src/Paragraph/ExperiencesParagraph.php index d39064a78..d46985af4 100644 --- a/apps/src/Paragraph/ExperiencesParagraph.php +++ b/apps/src/Paragraph/ExperiencesParagraph.php @@ -63,7 +63,10 @@ function ($link): string { unset($link); $translatableMessage = new TranslatableMessage('Skill'); - return $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( diff --git a/apps/src/Paragraph/FormParagraph.php b/apps/src/Paragraph/FormParagraph.php index 9897eadb4..e1f7b777a 100644 --- a/apps/src/Paragraph/FormParagraph.php +++ b/apps/src/Paragraph/FormParagraph.php @@ -65,8 +65,8 @@ public function getFields(Paragraph $paragraph, string $pageName): mixed $choiceField->setChoices($this->formService->all()); yield $choiceField; yield BooleanField::new('save', new TranslatableMessage('Save data in database')); - $wysiwgTranslation = new TranslatableMessage('Confirm message'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Confirm message'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } @@ -99,7 +99,7 @@ public function templates(Paragraph $paragraph, string $type): array return []; } - $templates = $this->getTemplateContent($type, $this->getType() . '/' . $paragraph->getForm()); + $templates = $this->getTemplateContent($type, $this->getType().'/'.$paragraph->getForm()); if ($templates['view'] != end($templates['files'])) { return $templates; diff --git a/apps/src/Paragraph/HeadPersonParagraph.php b/apps/src/Paragraph/HeadPersonParagraph.php new file mode 100644 index 000000000..42982f4b0 --- /dev/null +++ b/apps/src/Paragraph/HeadPersonParagraph.php @@ -0,0 +1,63 @@ +setShow($paragraph, false); + + return; + } + + $this->setData( + $paragraph, + [ + 'person' => $data['entity'], + 'paragraph' => $paragraph, + 'data' => $data, + ] + ); + } + + public function getClass(): string + { + return EntityHeadPersonParagraph::class; + } + + #[Override] + public function getName(): TranslatableMessage + { + return new TranslatableMessage('Head person'); + } + + #[Override] + public function getType(): string + { + return 'head-person'; + } + + #[Override] + public function supports(?object $object): bool + { + if (is_null($object)) { + return true; + } + + return $object instanceof Block; + } +} diff --git a/apps/src/Paragraph/HtmlParagraph.php b/apps/src/Paragraph/HtmlParagraph.php index 27f69a8d6..3d77a1f99 100644 --- a/apps/src/Paragraph/HtmlParagraph.php +++ b/apps/src/Paragraph/HtmlParagraph.php @@ -48,8 +48,8 @@ public function getFields(Paragraph $paragraph, string $pageName): mixed unset($paragraph, $pageName); yield TextField::new('title', new TranslatableMessage('Title')); - $wysiwgTranslation = new TranslatableMessage('Content'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Content'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/ParagraphAbstract.php b/apps/src/Paragraph/ParagraphAbstract.php index f992efdc6..24033f827 100644 --- a/apps/src/Paragraph/ParagraphAbstract.php +++ b/apps/src/Paragraph/ParagraphAbstract.php @@ -93,7 +93,7 @@ public function addFieldFileUpload(string $type, string $pageName, Paragraph $pa { $label = new TranslatableMessage('File'); if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $textField = TextField::new($type . 'File', $label); + $textField = TextField::new($type.'File', $label); $textField->setFormType(VichFileType::class); $deleteLabel = new TranslatableMessage('Delete file'); $downloadLabel = new TranslatableMessage('Download'); @@ -129,7 +129,7 @@ public function addFieldFileUpload(string $type, string $pageName, Paragraph $pa return $textField; } - $this->fileService->getBasePath($paragraph::class, $type . 'File'); + $this->fileService->getBasePath($paragraph::class, $type.'File'); $imageField = TextField::new($type, $label); $imageField->setTemplatePath('admin/field/file-upload.html.twig'); @@ -140,7 +140,7 @@ public function addFieldImageUpload(string $type, string $pageName, Paragraph $p { $label = new TranslatableMessage('Image'); if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $textField = TextField::new($type . 'File', $label); + $textField = TextField::new($type.'File', $label); $textField->setFormType(VichImageType::class); $deleteLabel = new TranslatableMessage('Delete image'); $downloadLabel = new TranslatableMessage('Download'); @@ -172,14 +172,14 @@ public function addFieldImageUpload(string $type, string $pageName, Paragraph $p 'image/gif', 'image/webp', ], - mimeTypesMessage: $this->translator->trans( - $mimeTypesMessage->getMessage(), - $mimeTypesMessage->getParameters() - ), maxSizeMessage: $this->translator->trans( $maxSizeMessage->getMessage(), $maxSizeMessage->getParameters() ), + mimeTypesMessage: $this->translator->trans( + $mimeTypesMessage->getMessage(), + $mimeTypesMessage->getParameters() + ), ), ], ] @@ -188,7 +188,7 @@ public function addFieldImageUpload(string $type, string $pageName, Paragraph $p return $textField; } - $basePath = $this->fileService->getBasePath($paragraph::class, $type . 'File'); + $basePath = $this->fileService->getBasePath($paragraph::class, $type.'File'); $imageField = ImageField::new($type, $label); $imageField->setBasePath($basePath); @@ -352,8 +352,8 @@ protected function getTemplateContent(string $folder, string $type): array $htmltwig = '.html.twig'; $files = [ - 'paragraphs/' . $folder . '/' . $type . $htmltwig, - 'paragraphs/' . $folder . '/default' . $htmltwig, + 'paragraphs/'.$folder.'/'.$type.$htmltwig, + 'paragraphs/'.$folder.'/default'.$htmltwig, ]; $view = end($files); diff --git a/apps/src/Paragraph/PersonParagraph.php b/apps/src/Paragraph/PersonParagraph.php new file mode 100644 index 000000000..bbb9c8de3 --- /dev/null +++ b/apps/src/Paragraph/PersonParagraph.php @@ -0,0 +1,105 @@ +requestStack->getCurrentRequest(); + $entityRepository = $this->getRepository(Person::class); + $query = $this->setQuery($request->query->all()); + + $pagination = $this->getPaginator($entityRepository->getQueryPaginator($query), $paragraph->getNbr()); + + $templates = $this->templates($paragraph, 'header'); + $this->setHeader( + $paragraph, + $this->render( + $templates['view'], + ['pagination' => $pagination] + ) + ); + + $this->setData( + $paragraph, + [ + 'pagination' => $pagination, + 'paragraph' => $paragraph, + 'data' => $data, + ] + ); + } + + public function getClass(): string + { + return EntityPersonParagraph::class; + } + + /** + * @return Generator + */ + #[Override] + public function getFields(Paragraph $paragraph, string $pageName): mixed + { + unset($paragraph, $pageName); + yield $this->addFieldIntegerNbr(); + } + + #[Override] + public function getName(): TranslatableMessage + { + return new TranslatableMessage('Person'); + } + + #[Override] + public function getType(): string + { + return 'person'; + } + + #[Override] + public function supports(?object $object): bool + { + if (is_null($object)) { + return true; + } + + $entityRepository = $this->getRepository($this->getClass()); + $paragraph = $entityRepository->findOneBy([]); + + return !$paragraph instanceof Paragraph; + } + + /** + * @param array $query + * + * @return array + */ + private function setQuery(array $query): array + { + if (!isset($query['order'])) { + $query['order'] = 'title'; + } + + if (!isset($query['orderby'])) { + $query['orderby'] = 'ASC'; + } + + return $query; + } +} diff --git a/apps/src/Paragraph/SiblingParagraph.php b/apps/src/Paragraph/SiblingParagraph.php index f551ad8b0..ff034bf24 100644 --- a/apps/src/Paragraph/SiblingParagraph.php +++ b/apps/src/Paragraph/SiblingParagraph.php @@ -58,8 +58,8 @@ public function getClass(): string public function getFields(Paragraph $paragraph, string $pageName): mixed { unset($paragraph, $pageName); - $wysiwgTranslation = new TranslatableMessage('Description'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Description'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/SkillsParagraph.php b/apps/src/Paragraph/SkillsParagraph.php index 5252a110b..8b12e25ea 100644 --- a/apps/src/Paragraph/SkillsParagraph.php +++ b/apps/src/Paragraph/SkillsParagraph.php @@ -62,7 +62,10 @@ function ($link): string { unset($link); $translatableMessage = new TranslatableMessage('Skill'); - return $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( diff --git a/apps/src/Paragraph/TextImgParagraph.php b/apps/src/Paragraph/TextImgParagraph.php index 8f50f9d3f..142546a99 100644 --- a/apps/src/Paragraph/TextImgParagraph.php +++ b/apps/src/Paragraph/TextImgParagraph.php @@ -58,8 +58,8 @@ public function getFields(Paragraph $paragraph, string $pageName): Generator { yield $this->addFieldImageUpload('img', $pageName, $paragraph); yield BooleanField::new('leftposition', new TranslatableMessage('Image on the left')); - $wysiwgTranslation = new TranslatableMessage('Text'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Text'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/TextMediaParagraph.php b/apps/src/Paragraph/TextMediaParagraph.php index cbf9b5ddf..4c5ecc90e 100644 --- a/apps/src/Paragraph/TextMediaParagraph.php +++ b/apps/src/Paragraph/TextMediaParagraph.php @@ -81,8 +81,8 @@ public function getFields(Paragraph $paragraph, string $pageName): Generator yield BooleanField::new('leftposition', new TranslatableMessage('Media on the left')); yield UrlField::new('url', new TranslatableMessage('Url')); - $wysiwgTranslation = new TranslatableMessage('Text'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Text'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/TextParagraph.php b/apps/src/Paragraph/TextParagraph.php index a9cbe9d7b..9317e17f3 100644 --- a/apps/src/Paragraph/TextParagraph.php +++ b/apps/src/Paragraph/TextParagraph.php @@ -48,8 +48,8 @@ public function getClass(): string public function getFields(Paragraph $paragraph, string $pageName): mixed { unset($paragraph, $pageName); - $wysiwgTranslation = new TranslatableMessage('Text'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Text'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/TrainingCoursesParagraph.php b/apps/src/Paragraph/TrainingCoursesParagraph.php index 7c8a0cdf3..471165f15 100644 --- a/apps/src/Paragraph/TrainingCoursesParagraph.php +++ b/apps/src/Paragraph/TrainingCoursesParagraph.php @@ -62,7 +62,10 @@ function ($link): string { unset($link); $translatableMessage = new TranslatableMessage('Training course'); - return $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( diff --git a/apps/src/Replace/LinkApprovalReplace.php b/apps/src/Replace/LinkApprovalReplace.php index 173efbb3c..9ac46ae34 100644 --- a/apps/src/Replace/LinkApprovalReplace.php +++ b/apps/src/Replace/LinkApprovalReplace.php @@ -17,7 +17,7 @@ public function exec(): string return '#linkdisabled'; } - return $configuration->getUrl() . $this->router->generate( + return $configuration->getUrl().$this->router->generate( 'admin_workflow', [ '_locale' => 'fr', diff --git a/apps/src/Replace/LinkChangePasswordReplace.php b/apps/src/Replace/LinkChangePasswordReplace.php index 075c8a6c2..8b44517dd 100644 --- a/apps/src/Replace/LinkChangePasswordReplace.php +++ b/apps/src/Replace/LinkChangePasswordReplace.php @@ -34,7 +34,7 @@ public function exec(): string $params = $this->slugService->forEntity($page); $params['uid'] = $entity->getId(); - return $configuration->getUrl() . $this->router->generate('front', $params); + return $configuration->getUrl().$this->router->generate('front', $params); } public function getCode(): string diff --git a/apps/src/Replace/LinkLoginReplace.php b/apps/src/Replace/LinkLoginReplace.php index a27fefd8e..94559dae2 100644 --- a/apps/src/Replace/LinkLoginReplace.php +++ b/apps/src/Replace/LinkLoginReplace.php @@ -22,7 +22,7 @@ public function exec(): string $params = $this->slugService->forEntity($login); - return $configuration->getUrl() . $this->router->generate('front', $params); + return $configuration->getUrl().$this->router->generate('front', $params); } public function getCode(): string diff --git a/apps/src/Repository/BlockRepository.php b/apps/src/Repository/BlockRepository.php index f26e6fe90..0066e70a6 100644 --- a/apps/src/Repository/BlockRepository.php +++ b/apps/src/Repository/BlockRepository.php @@ -25,13 +25,13 @@ public function findAllOrderedByRegion(?QueryBuilder $queryBuilder): void $alias = $queryBuilder->getRootAliases()[0] ?? 'entity'; $queryBuilder->resetDQLPart('orderBy'); $caseExpr = 'CASE ' - . 'WHEN ' . $alias . ".region = 'header' THEN 1 " - . 'WHEN ' . $alias . ".region = 'main' THEN 2 " - . 'WHEN ' . $alias . ".region = 'footer' THEN 3 " - . 'ELSE 4 ' - . 'END'; + .'WHEN '.$alias.".region = 'header' THEN 1 " + .'WHEN '.$alias.".region = 'main' THEN 2 " + .'WHEN '.$alias.".region = 'footer' THEN 3 " + .'ELSE 4 ' + .'END'; $queryBuilder->orderBy($caseExpr, 'ASC'); - $queryBuilder->addOrderBy($alias . '.position', 'ASC'); + $queryBuilder->addOrderBy($alias.'.position', 'ASC'); } public function getMaxPositionByRegion(string $region): ?int @@ -42,7 +42,7 @@ public function getMaxPositionByRegion(string $region): ?int $queryBuilder->setParameter('region', $region); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'block-maxposition-' . md5($region)); + $query->enableResultCache(3600, 'block-maxposition-'.md5($region)); $data = $query->getOneOrNullResult(); diff --git a/apps/src/Repository/CastingRepository.php b/apps/src/Repository/CastingRepository.php new file mode 100644 index 000000000..565f64482 --- /dev/null +++ b/apps/src/Repository/CastingRepository.php @@ -0,0 +1,62 @@ + + */ +class CastingRepository extends RepositoryAbstract +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Casting::class); + } + + public function findWithActiveCastings(mixed $data): mixed + { + $queryBuilder = $this->createQueryBuilder('c'); + $queryBuilder->innerJoin('c.refPerson', 'p'); + $queryBuilder->addSelect('p'); + $queryBuilder->andWhere('p.deletedAt IS NULL'); + + $entityMap = [ + Person::class => [ + 'refPerson', + 'person', + ], + Movie::class => [ + 'refMovie', + 'movie', + ], + Serie::class => [ + 'refSerie', + 'serie', + ], + Season::class => [ + 'refSeason', + 'season', + ], + Episode::class => [ + 'refEpisode', + 'episode', + ], + ]; + foreach ($entityMap as $class => [$field, $param]) { + if ($data instanceof $class) { + $queryBuilder->andWhere(sprintf('c.%s = :%s', $field, $param)); + $queryBuilder->setParameter($param, $data); + break; + } + } + + return $queryBuilder->getQuery()->getResult(); + } +} diff --git a/apps/src/Repository/ChapterRepository.php b/apps/src/Repository/ChapterRepository.php index aec999327..58ca40ca3 100644 --- a/apps/src/Repository/ChapterRepository.php +++ b/apps/src/Repository/ChapterRepository.php @@ -31,7 +31,7 @@ public function getAllActivateByStory(Story $story): mixed $queryBuilder->orderBy('c.position', 'ASC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'chapter-activate-story-' . $story->getId()); + $query->enableResultCache(3600, 'chapter-activate-story-'.$story->getId()); return $query->getResult(); } diff --git a/apps/src/Repository/EpisodeRepository.php b/apps/src/Repository/EpisodeRepository.php index ec1bb1174..1f3f3c78d 100644 --- a/apps/src/Repository/EpisodeRepository.php +++ b/apps/src/Repository/EpisodeRepository.php @@ -39,7 +39,7 @@ public function getQueryPaginator(Season $season): Query $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'movies-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'movies-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/GameRepository.php b/apps/src/Repository/GameRepository.php index 120cdb54d..0c714d796 100644 --- a/apps/src/Repository/GameRepository.php +++ b/apps/src/Repository/GameRepository.php @@ -50,7 +50,7 @@ public function getQueryBuilder(array $query): QueryBuilder $queryBuilder->setParameter('enable', true); $queryBuilder->leftJoin('g.categories', 'c')->addSelect('c'); - return $queryBuilder->orderBy('g.' . $query['order'], $query['orderby']); + return $queryBuilder->orderBy('g.'.$query['order'], $query['orderby']); } /** @@ -68,7 +68,7 @@ public function getQueryPaginator(array $query, ?string $categorySlug): Query $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'movies-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'movies-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/GeoCodeRepository.php b/apps/src/Repository/GeoCodeRepository.php index bb5c073de..de895dd1a 100644 --- a/apps/src/Repository/GeoCodeRepository.php +++ b/apps/src/Repository/GeoCodeRepository.php @@ -19,11 +19,11 @@ public function findAllData(string $type): mixed { $queryBuilder = $this->createQueryBuilder('g'); - $queryBuilder->select('g.' . $type . ', count(g.id) as count'); - $queryBuilder->groupBy('g.' . $type); + $queryBuilder->select('g.'.$type.', count(g.id) as count'); + $queryBuilder->groupBy('g.'.$type); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'geocode-' . md5($type)); + $query->enableResultCache(3600, 'geocode-'.md5($type)); return $query->getResult(); } diff --git a/apps/src/Repository/HttpErrorLogsRepository.php b/apps/src/Repository/HttpErrorLogsRepository.php index f5472949a..5778c465c 100644 --- a/apps/src/Repository/HttpErrorLogsRepository.php +++ b/apps/src/Repository/HttpErrorLogsRepository.php @@ -29,7 +29,7 @@ public function getAllinternetProtocolWithNbr(int $nbr): array $queryBuilder->orderBy('nbr', 'DESC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'http-error-logs-ip-nbr-' . $nbr); + $query->enableResultCache(3600, 'http-error-logs-ip-nbr-'.$nbr); return $query->getResult(); } diff --git a/apps/src/Repository/MovieRepository.php b/apps/src/Repository/MovieRepository.php index 64cac070e..26927b0b1 100644 --- a/apps/src/Repository/MovieRepository.php +++ b/apps/src/Repository/MovieRepository.php @@ -89,7 +89,7 @@ public function findLastByNbr(int $nbr): mixed $queryBuilder->setMaxResults($nbr); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'movies-last-' . $nbr); + $query->enableResultCache(3600, 'movies-last-'.$nbr); return $query->getResult(); } @@ -134,7 +134,7 @@ public function getAllActivateBySaga(Saga $saga): array $queryBuilder->orderBy('m.releaseDate', 'ASC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'movies-activate-by-saga-' . $saga->getId()); + $query->enableResultCache(3600, 'movies-activate-by-saga-'.$saga->getId()); return $query->getResult(); } @@ -233,7 +233,7 @@ public function getQueryBuilder(array $query): QueryBuilder $this->getQueryBuilderCategories($queryBuilder, $query); $this->getQueryBuilderYear($queryBuilder, $query); - return $queryBuilder->orderBy('m.' . $query['order'], $query['orderby']); + return $queryBuilder->orderBy('m.'.$query['order'], $query['orderby']); } /** @@ -246,7 +246,7 @@ public function getQueryPaginator(array $query): Query $queryBuilder = $this->getQueryBuilder($query); $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'movies-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'movies-query-paginator-'.md5((string) $dql)); return $query; } @@ -300,7 +300,7 @@ private function getQueryBuilderTitle(QueryBuilder $queryBuilder, array $query): } $queryBuilder->andWhere('m.title LIKE :title'); - $queryBuilder->setParameter('title', '%' . $query['title'] . '%'); + $queryBuilder->setParameter('title', '%'.$query['title'].'%'); } /** diff --git a/apps/src/Repository/NotificationRepository.php b/apps/src/Repository/NotificationRepository.php index 59f48f5a0..484377a89 100644 --- a/apps/src/Repository/NotificationRepository.php +++ b/apps/src/Repository/NotificationRepository.php @@ -16,12 +16,12 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Notification::class); } - public function getAllBefore1week() + public function getAllBefore1week(): mixed { - $qb = $this->createQueryBuilder('n'); - $qb->where('n.createdAt <= :date'); - $qb->setParameter('date', new DateTime('-7 days')); + $queryBuilder = $this->createQueryBuilder('n'); + $queryBuilder->where('n.createdAt <= :date'); + $queryBuilder->setParameter('date', new DateTime('-7 days')); - return $qb->getQuery()->getResult(); + return $queryBuilder->getQuery()->getResult(); } } diff --git a/apps/src/Repository/PageRepository.php b/apps/src/Repository/PageRepository.php index 6b868a376..96014d824 100644 --- a/apps/src/Repository/PageRepository.php +++ b/apps/src/Repository/PageRepository.php @@ -37,7 +37,7 @@ public function getOneBySlug(string $slug): ?Page $queryBuilder->setParameter('slug', $slug); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'page-slug_' . md5($slug)); + $query->enableResultCache(3600, 'page-slug_'.md5($slug)); return $query->getOneOrNullResult(); } @@ -49,7 +49,7 @@ public function getOneByType(string $type): ?Page $queryBuilder->setParameter('type', $type); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'page-type_' . md5($type)); + $query->enableResultCache(3600, 'page-type_'.md5($type)); return $query->getOneOrNullResult(); } diff --git a/apps/src/Repository/ParagraphRepository.php b/apps/src/Repository/ParagraphRepository.php index dcde8b42c..30f8cc641 100644 --- a/apps/src/Repository/ParagraphRepository.php +++ b/apps/src/Repository/ParagraphRepository.php @@ -23,7 +23,7 @@ public function findOnByType(string $class): ?Paragraph $queryBuilder->setMaxResults(1); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'paragraph-' . $class); + $query->enableResultCache(3600, 'paragraph-'.$class); return $query->getOneOrNullResult(); } diff --git a/apps/src/Repository/PersonRepository.php b/apps/src/Repository/PersonRepository.php new file mode 100644 index 000000000..b9c31d491 --- /dev/null +++ b/apps/src/Repository/PersonRepository.php @@ -0,0 +1,58 @@ + + */ +class PersonRepository extends RepositoryAbstract +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Person::class); + } + + /** + * @param array $query + */ + public function getQueryBuilder(array $query): QueryBuilder + { + $queryBuilder = $this->createQueryBuilder('p'); + $queryBuilder->distinct(); + $queryBuilder->innerJoin('p.castings', 'c'); + $queryBuilder->leftJoin('c.refMovie', 'm', 'WITH', 'm.enable = :enable'); + $queryBuilder->leftJoin('c.refSerie', 's', 'WITH', 's.enable = :enable'); + $queryBuilder->leftJoin('c.refSeason', 'sea', 'WITH', 'sea.enable = :enable'); + $queryBuilder->leftJoin('sea.refserie', 's2', 'WITH', 's2.enable = :enable'); + $queryBuilder->leftJoin('c.refEpisode', 'e', 'WITH', 'e.enable = :enable'); + $queryBuilder->leftJoin('e.refseason', 'sea2', 'WITH', 'sea2.enable = :enable'); + $queryBuilder->leftJoin('sea2.refserie', 's3', 'WITH', 's3.enable = :enable'); + $queryBuilder->where('m.id IS NOT NULL'); + $queryBuilder->orWhere('s.id IS NOT NULL'); + $queryBuilder->orWhere('sea.id IS NOT NULL AND s2.id IS NOT NULL'); + $queryBuilder->orWhere('e.id IS NOT NULL AND sea2.id IS NOT NULL AND s3.id IS NOT NULL'); + $queryBuilder->setParameter('enable', true); + + return $queryBuilder->orderBy('p.'.$query['order'], $query['orderby']); + } + + /** + * @param array $query + * + * @return Query + */ + public function getQueryPaginator(array $query): Query + { + $queryBuilder = $this->getQueryBuilder($query); + $query = $queryBuilder->getQuery(); + $dql = $query->getDQL(); + $query->enableResultCache(3600, 'sagas-query-paginator-'.md5((string) $dql)); + + return $query; + } +} diff --git a/apps/src/Repository/PostRepository.php b/apps/src/Repository/PostRepository.php index 3811736e2..443fbc223 100644 --- a/apps/src/Repository/PostRepository.php +++ b/apps/src/Repository/PostRepository.php @@ -25,7 +25,7 @@ public function findLastByNbr(int $nbr): mixed $query = $queryBuilder->getQuery(); - $query->enableResultCache(600, 'post-last-' . $nbr); + $query->enableResultCache(600, 'post-last-'.$nbr); return $query->getResult(); } @@ -85,7 +85,7 @@ public function getQueryPaginator(?string $categorySlug, ?string $tagSlug): Quer } $query = $queryBuilder->getQuery(); - $query->enableResultCache(300, 'post-query-paginator-' . $categorySlug . '-' . $tagSlug); + $query->enableResultCache(300, 'post-query-paginator-'.$categorySlug.'-'.$tagSlug); return $query; } diff --git a/apps/src/Repository/SagaRepository.php b/apps/src/Repository/SagaRepository.php index 77f6e2225..2ffedd123 100644 --- a/apps/src/Repository/SagaRepository.php +++ b/apps/src/Repository/SagaRepository.php @@ -79,7 +79,7 @@ public function getQueryBuilder(array $query): QueryBuilder $queryBuilder->setParameter('enable', true); $queryBuilder->andWhere($queryBuilder->expr()->in('s.id', $subQuery->getDQL())); - return $queryBuilder->orderBy('s.' . $query['order'], $query['orderby']); + return $queryBuilder->orderBy('s.'.$query['order'], $query['orderby']); } /** @@ -92,7 +92,7 @@ public function getQueryPaginator(array $query): Query $queryBuilder = $this->getQueryBuilder($query); $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'sagas-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'sagas-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/SeasonRepository.php b/apps/src/Repository/SeasonRepository.php index 7267d6ab3..02cdd13c0 100644 --- a/apps/src/Repository/SeasonRepository.php +++ b/apps/src/Repository/SeasonRepository.php @@ -34,7 +34,7 @@ public function getAllActivateBySerie(Serie $serie): mixed $queryBuilder->orderBy('s.number', 'ASC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'seasons-activate-serie-' . $serie->getId()); + $query->enableResultCache(3600, 'seasons-activate-serie-'.$serie->getId()); return $query->getResult(); } @@ -55,7 +55,7 @@ public function getOneBySerieAndPosition(Serie $serie, int $position): ?Season $queryBuilder->setParameters($data); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'season-serie-' . $serie->getId() . '-position-' . $position); + $query->enableResultCache(3600, 'season-serie-'.$serie->getId().'-position-'.$position); return $query->getOneOrNullResult(); } diff --git a/apps/src/Repository/SerieRepository.php b/apps/src/Repository/SerieRepository.php index f189bcfbe..c27d1f5cc 100644 --- a/apps/src/Repository/SerieRepository.php +++ b/apps/src/Repository/SerieRepository.php @@ -184,7 +184,7 @@ public function getQueryPaginator(?string $categorySlug): Query $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'series-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'series-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/StarRepository.php b/apps/src/Repository/StarRepository.php index fcd881bc9..ed12b4259 100644 --- a/apps/src/Repository/StarRepository.php +++ b/apps/src/Repository/StarRepository.php @@ -21,11 +21,11 @@ public function findAllData(string $type): mixed { $queryBuilder = $this->createQueryBuilder('s'); - $queryBuilder = $queryBuilder->select('s.' . $type . ', count(s.id) as count'); - $queryBuilder->groupBy('s.' . $type); + $queryBuilder = $queryBuilder->select('s.'.$type.', count(s.id) as count'); + $queryBuilder->groupBy('s.'.$type); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'star-' . md5($type)); + $query->enableResultCache(3600, 'star-'.md5($type)); return $query->getResult(); } diff --git a/apps/src/Repository/StoryRepository.php b/apps/src/Repository/StoryRepository.php index 990ce98cc..f2399945e 100644 --- a/apps/src/Repository/StoryRepository.php +++ b/apps/src/Repository/StoryRepository.php @@ -23,7 +23,7 @@ public function findLastByNbr(int $nbr): mixed $queryBuilder->setMaxResults($nbr); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'stories-last-' . $nbr); + $query->enableResultCache(3600, 'stories-last-'.$nbr); return $query->getResult(); } diff --git a/apps/src/Repository/UserRepository.php b/apps/src/Repository/UserRepository.php index 457eef150..37c702507 100644 --- a/apps/src/Repository/UserRepository.php +++ b/apps/src/Repository/UserRepository.php @@ -33,7 +33,7 @@ public function findUserName(string $field): ?User $queryBuilder->setParameters($data); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'user-by-username-' . md5($field)); + $query->enableResultCache(3600, 'user-by-username-'.md5($field)); return $query->getOneOrNullResult(); } diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 0f3e02627..3aa23dbee 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -3,8 +3,7 @@ namespace Labstag\Scheduler; use Labstag\Message\BanIpMessage; -use Labstag\Message\FilesMessage; -use Labstag\Message\MetaMessage; +use Labstag\Message\DeleteOldFileMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\UpdateSerieMessage; use Symfony\Component\Scheduler\Attribute\AsSchedule; @@ -29,9 +28,8 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 */1 * * *', new BanIpMessage()), RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), - RecurringMessage::cron('0 0 * * 6', new FilesMessage()), - RecurringMessage::cron('0 20 * * *', new MetaMessage()), - // RecurringMessage::every('1 minute', new PageCinemaMessage()), + RecurringMessage::cron('0 0 * * 6', new DeleteOldFileMessage()), + // RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), ); $schedule->stateful($this->cache); diff --git a/apps/src/Scheduler/GenerateSchedule.php b/apps/src/Scheduler/GenerateSchedule.php index 07f0d218a..2b7335e73 100644 --- a/apps/src/Scheduler/GenerateSchedule.php +++ b/apps/src/Scheduler/GenerateSchedule.php @@ -21,10 +21,7 @@ public function __construct( public function getSchedule(): Schedule { $schedule = new Schedule(); - $schedule->add( - RecurringMessage::cron('0 0 * * 1', new PageCinemaMessage()), - // RecurringMessage::every('1 minute', new PageCinemaMessage()), - ); + $schedule->add(RecurringMessage::cron('0 0 * * 1', new PageCinemaMessage())); $schedule->stateful($this->cache); return $schedule; diff --git a/apps/src/Security/Voter/EasyadminVoter.php b/apps/src/Security/Voter/EasyadminVoter.php index 1d555fe00..bffe7eaab 100644 --- a/apps/src/Security/Voter/EasyadminVoter.php +++ b/apps/src/Security/Voter/EasyadminVoter.php @@ -48,6 +48,7 @@ protected function voteOnAttribute( ?Vote $vote = null, ): bool { + unset($vote); $user = $token->getUser(); // if the user is anonymous, do not grant access if (!$user instanceof UserInterface) { diff --git a/apps/src/Service/EtagCacheService.php b/apps/src/Service/EtagCacheService.php index 507e0f74a..61718291c 100644 --- a/apps/src/Service/EtagCacheService.php +++ b/apps/src/Service/EtagCacheService.php @@ -102,11 +102,11 @@ public function getCacheHeaders(object $entity): array $headers = [ 'Cache-Control' => 'public, max-age=3600, must-revalidate', - 'ETag' => '"' . $etag . '"', + 'ETag' => '"'.$etag.'"', ]; if ($lastModified instanceof DateTimeInterface) { - $headers['Last-Modified'] = $lastModified->format('D, d M Y H:i:s') . ' GMT'; + $headers['Last-Modified'] = $lastModified->format('D, d M Y H:i:s').' GMT'; } return [ @@ -215,7 +215,7 @@ public function shouldSendNotModified( return true; } } catch (Exception) { - throw new Exception('Invalid If-Modified-Since date: ' . $ifModifiedSince); + throw new Exception('Invalid If-Modified-Since date: '.$ifModifiedSince); // Date invalide, ignorer } } @@ -288,7 +288,7 @@ private function extractCriticalProperties(object $entity): array } } } catch (ReflectionException) { - throw new Exception('Reflection error on entity: ' . $entity::class); + throw new Exception('Reflection error on entity: '.$entity::class); } return $properties; @@ -338,7 +338,7 @@ private function getCacheKey(object $entity): string $className = $entity::class; $id = $this->extractEntityId($entity); - return $className . ':' . ($id ?? 'no-id') . ':' . spl_object_hash($entity); + return $className.':'.($id ?? 'no-id').':'.spl_object_hash($entity); } /** diff --git a/apps/src/Service/FileService.php b/apps/src/Service/FileService.php index 7a4fdac30..360088a14 100644 --- a/apps/src/Service/FileService.php +++ b/apps/src/Service/FileService.php @@ -15,7 +15,6 @@ use Symfony\Component\DependencyInjection\Attribute\AutowireIterator; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\HttpFoundation\File\UploadedFile; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyPathInterface; @@ -28,7 +27,7 @@ final class FileService public function __construct( #[AutowireIterator('labstag.filestorage')] private readonly iterable $fileStorages, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private LoggerInterface $logger, private EntityManagerInterface $entityManager, private ParameterBagInterface $parameterBag, @@ -51,7 +50,7 @@ public function asset(mixed $entity, string $field): string $basePath = $this->getBasePath($entity, $mapping->getFilePropertyName()); $content = $propertyAccessor->getValue($entity, $mapping->getFileNamePropertyName()); if ('' != $content) { - $file = $basePath . '/' . $content; + $file = $basePath.'/'.$content; } } @@ -74,49 +73,26 @@ public function deleteAll(): void } } - public function deletedFileByEntities(): int + public function deletedFileByEntities(): void { - $total = 0; $this->entityManager->getFilters()->disable('softdeleteable'); foreach ($this->fileStorages as $fileStorage) { - $deletes = []; - $entities = $fileStorage->getEntity(); + $deletes = []; + $entities = $fileStorage->getEntity(); if (0 === count($entities)) { continue; } - foreach ($entities as $entityClass) { - $repository = $this->getRepository($entityClass); - $mappings = $this->propertyMappingFactory->fromObject(new $entityClass()); - $files = $fileStorage->getFilesByDirectory($fileStorage->getFilesystem(), ''); - foreach ($files as $row) { - $file = $row['path']; - $find = 0; - foreach ($mappings as $mapping) { - $field = $mapping->getFileNamePropertyName(); - $entity = $repository->findOneBy( - [$field => $file] - ); - if (!$entity instanceof $entityClass) { - continue; - } - - $find = 1; - - break; - } - - if (0 === $find) { - $deletes[] = $file; - } + $files = $fileStorage->getFilesByDirectory($fileStorage->getFilesystem(), ''); + foreach ($files as $file) { + $find = $this->findInEntities($entities, $file['path']); + if (!$find) { + $deletes[] = $file['path']; } - - $total += count($deletes); - $fileStorage->deleteFilesByType($deletes); } - } - return $total; + $fileStorage->deleteFilesByType($deletes); + } } public function getBasePath(mixed $entity, string $type): string @@ -185,7 +161,7 @@ public function getFullBasePath(mixed $entity, string $type): string { $basePath = $this->getBasePath($entity, $type); - return $this->parameterBag->get('kernel.project_dir') . '/public' . $basePath; + return $this->parameterBag->get('kernel.project_dir').'/public'.$basePath; } public function getimportCsvFile(string $path, string $delimiter = ','): array @@ -233,7 +209,7 @@ public function getInfoImage(string $file): array $mimetype = 'image/jpeg'; } - $public = str_replace($this->parameterBag->get('kernel.project_dir') . '/public', '', $file); + $public = str_replace($this->parameterBag->get('kernel.project_dir').'/public', '', $file); return [ 'src' => $file, @@ -298,10 +274,10 @@ public function getSizeFormat(int $size): string } if (0 === $unitIndex) { - return (int) $bytes . ' ' . $units[$unitIndex]; + return (int) $bytes.' '.$units[$unitIndex]; } - return number_format($bytes, 2) . ' ' . $units[$unitIndex]; + return number_format($bytes, 2).' '.$units[$unitIndex]; } public function saveFileInAdapter(string $type, string $fileName, $content): null @@ -356,15 +332,15 @@ public function setUploadedFile(string $filePath, object $entity, string|Propert $tempPath = tempnam(sys_get_temp_dir(), 'download_'); $content = file_get_contents($filePath); if (false === $content) { - $this->logger->error('Failed to download file from URL: ' . $filePath); - throw new Exception('Failed to download file from URL: ' . $filePath); + $this->logger->error('Failed to download file from URL: '.$filePath); + throw new Exception('Failed to download file from URL: '.$filePath); } file_put_contents($tempPath, $content); $filePath = $tempPath; } - $this->messageBus->dispatch(new FileDeleteMessage($filePath), [new DelayStamp(60_000)]); + $this->messageDispatcherService->dispatch(new FileDeleteMessage($filePath), [new DelayStamp(60_000)]); $uploadedFile = new UploadedFile( path: $filePath, @@ -376,9 +352,9 @@ public function setUploadedFile(string $filePath, object $entity, string|Propert $propertyAccessor = PropertyAccess::createPropertyAccessor(); $propertyAccessor->setValue($entity, $type, $uploadedFile); } catch (Exception $exception) { - $this->logger->error('Error setting uploaded file: ' . $exception->getMessage()); + $this->logger->error('Error setting uploaded file: '.$exception->getMessage()); throw new Exception( - 'Error setting uploaded file: ' . $exception->getMessage(), + 'Error setting uploaded file: '.$exception->getMessage(), $exception->getCode(), $exception ); @@ -423,6 +399,47 @@ private function fillGridFiles(array $files): array return $files; } + private function findInEntities(array $entities, string $file): bool + { + $find = false; + foreach ($entities as $entity) { + $find = $this->findInEntity($entity, $file); + if ($find) { + break; + } + } + + return $find; + } + + private function findInEntity(string $entityClass, string $file): bool + { + $entityRepository = $this->getRepository($entityClass); + $mappings = $this->propertyMappingFactory->fromObject(new $entityClass()); + $search = []; + foreach ($mappings as $mapping) { + $field = $mapping->getFileNamePropertyName(); + $search[$field] = $file; + } + + $entity = $this->findInFields($entityRepository, $search); + + return 0 !== count($entity); + } + + private function findInFields(EntityRepository $entityRepository, array $fields): mixed + { + $queryBuilder = $entityRepository->createQueryBuilder('entity'); + foreach ($fields as $field => $value) { + $queryBuilder->orWhere(sprintf('entity.%s = :%s', $field, $field)); + $queryBuilder->setParameter($field, $value); + } + + $query = $queryBuilder->getQuery(); + + return $query->getResult(); + } + /** * @return list */ diff --git a/apps/src/Service/FrontService.php b/apps/src/Service/FrontService.php index 24184892b..21dbb28ea 100644 --- a/apps/src/Service/FrontService.php +++ b/apps/src/Service/FrontService.php @@ -11,7 +11,6 @@ use Symfony\Component\DependencyInjection\Attribute\AutowireIterator; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; class FrontService extends AbstractController @@ -21,7 +20,7 @@ public function __construct( private readonly iterable $datas, protected CacheService $cacheService, protected EntityManagerInterface $entityManager, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected FileService $fileService, protected ConfigurationService $configurationService, protected SlugService $slugService, diff --git a/apps/src/Service/GeocodeService.php b/apps/src/Service/GeocodeService.php index 36e7e1bae..553571c36 100644 --- a/apps/src/Service/GeocodeService.php +++ b/apps/src/Service/GeocodeService.php @@ -21,7 +21,7 @@ public function __construct( public function csv(string $country): array { $country = strtoupper($country); - $file = 'http://download.geonames.org/export/zip/' . $country . '.zip'; + $file = 'http://download.geonames.org/export/zip/'.$country.'.zip'; $response = $this->httpClient->request('GET', $file); $statusCode = $response->getStatusCode(); if (self::HTTP_OK !== $statusCode) { @@ -38,7 +38,7 @@ public function csv(string $country): array return []; } - $content = (string) $zipArchive->getFromName($country . '.txt'); + $content = (string) $zipArchive->getFromName($country.'.txt'); $csv = str_getcsv($content, "\n", escape: '\\'); $zipArchive->close(); diff --git a/apps/src/Service/Igdb/GameService.php b/apps/src/Service/Igdb/GameService.php index d76e8b850..5c405dec5 100644 --- a/apps/src/Service/Igdb/GameService.php +++ b/apps/src/Service/Igdb/GameService.php @@ -48,7 +48,7 @@ public function addByApi(string $id, $platformId): ?Game public function getApiGameId(string $id): ?array { - $where = ['id = ' . $id]; + $where = ['id = '.$id]; $fields = [ '*', 'cover.*', @@ -155,7 +155,7 @@ public function updateGame(Game $game, array $data): bool } } - $summary = '

' . implode('

', $new) . '

'; + $summary = '

'.implode('

', $new).'

'; $game->setSummary($summary); return true; @@ -165,19 +165,19 @@ private function buildDateFilter(array $data, bool $withSearch): array { $where = []; if (isset($data['platform']) && !empty($data['platform'])) { - $where[] = 'platforms = (' . $data['platform']->getIgdb() . ')'; + $where[] = 'platforms = ('.$data['platform']->getIgdb().')'; } if (isset($data['franchise']) && !empty($data['franchise'])) { - $where[] = 'franchises.name ~ "' . $data['franchise'] . '"'; + $where[] = 'franchises.name ~ "'.$data['franchise'].'"'; } if (isset($data['type']) && '' != $data['type']) { - $where[] = 'game_type = ' . $data['type']; + $where[] = 'game_type = '.$data['type']; } if (isset($data['number']) && !empty($data['number'])) { - $where[] = 'id = ' . $data['number']; + $where[] = 'id = '.$data['number']; } if (!$withSearch) { @@ -334,7 +334,7 @@ private function setWhereName($name): string $where[] = sprintf('%s ~ "%s"', $code, $name); } - return '(' . implode(' | ', $where) . ')'; + return '('.implode(' | ', $where).')'; } private function updateArtworks(Game $game, array $data): bool diff --git a/apps/src/Service/Igdb/PlatformService.php b/apps/src/Service/Igdb/PlatformService.php index fe3416dd4..69c276df1 100644 --- a/apps/src/Service/Igdb/PlatformService.php +++ b/apps/src/Service/Igdb/PlatformService.php @@ -55,7 +55,7 @@ public function getPlatformApi(array $data, int $limit, int $offset): array if (isset($data['family']) && !empty($data['family'])) { $family = $data['family']; - $where[] = 'platform_family.name ~ "' . $family . '"'; + $where[] = 'platform_family.name ~ "'.$family.'"'; } $fields = [ @@ -91,7 +91,7 @@ public function update(Platform $platform): ?bool private function getApiPlatformFamilyId(string $id): ?array { - $where = ['id = ' . $id]; + $where = ['id = '.$id]; $body = $this->igdbApi->setBody(where: $where, limit: 1); $results = $this->igdbApi->setUrl('platform_families', $body); @@ -104,7 +104,7 @@ private function getApiPlatformFamilyId(string $id): ?array private function getApiPlatformId(string $id): ?array { - $where = ['id = ' . $id]; + $where = ['id = '.$id]; $fields = [ '*', 'platform_logo.*', diff --git a/apps/src/Service/Imdb/CompanyService.php b/apps/src/Service/Imdb/CompanyService.php index 28e22fd44..30254a7a7 100644 --- a/apps/src/Service/Imdb/CompanyService.php +++ b/apps/src/Service/Imdb/CompanyService.php @@ -7,14 +7,14 @@ use Labstag\Message\CompanyMessage; use Labstag\Repository\CompanyRepository; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Psr\Log\LoggerInterface; -use Symfony\Component\Messenger\MessageBusInterface; final class CompanyService { public function __construct( private LoggerInterface $logger, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private CompanyRepository $companyRepository, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, @@ -34,7 +34,7 @@ public function getCompany(array $data): Company $company->setTitle($data['name']); $company->setTmdb($data['id']); $this->companyRepository->save($company); - $this->messageBus->dispatch(new CompanyMessage($company->getId())); + $this->messageDispatcherService->dispatch(new CompanyMessage($company->getId())); } return $company; @@ -45,7 +45,7 @@ public function update(Company $company): bool $details = $this->theMovieDbApi->getDetailsCompany($company); if (is_null($details['tmdb'])) { $this->companyRepository->delete($company); - $this->logger->error('Company not found TMDB id ' . $company->getTmdb()); + $this->logger->error('Company not found TMDB id '.$company->getTmdb()); return false; } diff --git a/apps/src/Service/Imdb/EpisodeService.php b/apps/src/Service/Imdb/EpisodeService.php index c84fde32d..8088f1c47 100644 --- a/apps/src/Service/Imdb/EpisodeService.php +++ b/apps/src/Service/Imdb/EpisodeService.php @@ -15,6 +15,7 @@ public function __construct( private FileService $fileService, private EpisodeRepository $episodeRepository, private TheMovieDbApi $theMovieDbApi, + private PersonService $personService, ) { } @@ -70,12 +71,38 @@ public function update(Episode $episode): bool $statuses = [ $this->updateEpisode($episode, $details), + $this->updateCredits($episode, $details), $this->updateImage($episode, $details), ]; return in_array(true, $statuses, true); } + private function updateCredits(Episode $episode, array $details): bool + { + foreach ($episode->getCastings() as $casting) { + $episode->removeCasting($casting); + } + + if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $casting = $this->personService->addToCastingEpisode($person, $episode, $cast); + $episode->addCasting($casting); + } + } + + if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $casting = $this->personService->addToCastingEpisode($person, $episode, $crew); + $episode->addCasting($casting); + } + } + + return true; + } + private function updateEpisode(Episode $episode, array $details): bool { $episode->setOverview($details['tmdb']['overview']); diff --git a/apps/src/Service/Imdb/MovieService.php b/apps/src/Service/Imdb/MovieService.php index 36f14eb91..d6ef91117 100644 --- a/apps/src/Service/Imdb/MovieService.php +++ b/apps/src/Service/Imdb/MovieService.php @@ -7,18 +7,11 @@ use Labstag\Api\TheMovieDbApi; use Labstag\Entity\Movie; use Labstag\Entity\MovieCategory; -use Labstag\Message\MovieMessage; use Labstag\Repository\MovieRepository; use Labstag\Service\CategoryService; use Labstag\Service\ConfigurationService; use Labstag\Service\FileService; use Labstag\Service\VideoService; -use Symfony\Component\HttpFoundation\RedirectResponse; -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; -use Symfony\Component\Messenger\MessageBusInterface; -use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Translation\TranslatableMessage; final class MovieService { @@ -36,16 +29,14 @@ final class MovieService public function __construct( private ConfigurationService $configurationService, private FileService $fileService, + private PersonService $personService, private CompanyService $companyService, private CategoryService $categoryService, private SagaService $sagaService, private EntityManagerInterface $entityManager, private MovieRepository $movieRepository, private VideoService $videoService, - private MessageBusInterface $messageBus, private TheMovieDbApi $theMovieDbApi, - private RequestStack $requestStack, - private RouterInterface $router, ) { } @@ -135,17 +126,36 @@ public function update(Movie $movie): bool $this->updateSaga($movie, $details), $this->updateCategory($movie, $details), $this->updateCompany($movie, $details), + $this->updateCredits($movie, $details), $this->updateTrailer($movie, $details), ]; return in_array(true, $statuses, true); } - private function getFlashBag(): FlashBagInterface + public function updateCredits(Movie $movie, array $details): bool { - $session = $this->requestStack->getSession(); + foreach ($movie->getCastings() as $casting) { + $movie->removeCasting($casting); + } + + if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $casting = $this->personService->addToCastingMovie($person, $movie, $cast); + $movie->addCasting($casting); + } + } - return $session->getFlashBag(); + if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $casting = $this->personService->addToCastingMovie($person, $movie, $crew); + $movie->addCasting($casting); + } + } + + return true; } /** diff --git a/apps/src/Service/Imdb/PersonService.php b/apps/src/Service/Imdb/PersonService.php new file mode 100644 index 000000000..08cdebf74 --- /dev/null +++ b/apps/src/Service/Imdb/PersonService.php @@ -0,0 +1,189 @@ +entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refEpisode' => $episode, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefEpisode($episode); + $casting->setRefPerson($person); + } + + return $this->addToCasting($casting, $data); + } + + public function addToCastingMovie(Person $person, Movie $movie, array $data): Casting + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refMovie' => $movie, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefMovie($movie); + $casting->setRefPerson($person); + } + + return $this->addToCasting($casting, $data); + } + + public function addToCastingSeason(Person $person, Season $season, array $data): Casting + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refSeason' => $season, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefSeason($season); + $casting->setRefPerson($person); + } + + return $this->addToCasting($casting, $data); + } + + public function addToCastingSerie(Person $person, Serie $serie, array $data): Casting + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refSerie' => $serie, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefSerie($serie); + $casting->setRefPerson($person); + } + + return $this->addToCasting($casting, $data); + } + + public function getPerson(array $data): Person + { + $entityRepository = $this->entityManager->getRepository(Person::class); + $person = $entityRepository->findOneBy( + [ + 'tmdb' => $data['id'], + ] + ); + if (!$person instanceof Person) { + $person = new Person(); + $person->setEnable(true); + $person->setTmdb($data['id']); + $person->setTitle($data['name']); + $entityRepository->save($person); + $this->messageDispatcherService->dispatch(new PersonMessage($person->getId())); + } + + return $person; + } + + public function update(Person $person): bool + { + $entityRepository = $this->entityManager->getRepository(Person::class); + $details = $this->theMovieDbApi->getDetailPerson($person); + if (!isset($details['tmdb']) || is_null($details['tmdb'])) { + $entityRepository->delete($person); + + return false; + } + + $statuses = [ + $this->updatePerson($person, $details), + $this->updateImageProfile($person, $details), + ]; + + return in_array(true, $statuses, true); + } + + private function addToCasting(Casting $casting, array $data): Casting + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting->setKnownForDepartment($data['known_for_department'] ?? null); + $casting->setFigure($data['character'] ?? null); + + $entityRepository->save($casting); + + return $casting; + } + + /** + * @param array $details + */ + private function updateImageProfile(Person $person, array $details): bool + { + $poster = $this->theMovieDbApi->images()->getProfileUrl($details['tmdb']['profile_path'] ?? ''); + if (is_null($poster)) { + $person->setProfileFile(); + $person->setProfile(null); + + return false; + } + + $this->fileService->setUploadedFile($poster, $person, 'profileFile'); + + return true; + } + + private function updatePerson(Person $person, array $data): bool + { + if (!isset($data['tmdb'])) { + return false; + } + + $person->setGender($data['tmdb']['gender'] ?? null); + $person->setPlaceOfBirth($data['tmdb']['place_of_birth'] ?: null); + $person->setBiography($data['tmdb']['biography'] ?? null); + if (!is_null($data['tmdb']['birthday'])) { + $birthday = new DateTime($data['tmdb']['birthday']); + $person->setBirthday($birthday); + } + + if (!is_null($data['tmdb']['deathday'])) { + $deathday = new DateTime($data['tmdb']['deathday']); + $person->setDeathday($deathday); + } + + return true; + } +} diff --git a/apps/src/Service/Imdb/SagaService.php b/apps/src/Service/Imdb/SagaService.php index 1c58960d0..d0d4c8440 100644 --- a/apps/src/Service/Imdb/SagaService.php +++ b/apps/src/Service/Imdb/SagaService.php @@ -7,14 +7,14 @@ use Labstag\Message\SagaMessage; use Labstag\Repository\SagaRepository; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Psr\Log\LoggerInterface; -use Symfony\Component\Messenger\MessageBusInterface; final class SagaService { public function __construct( private LoggerInterface $logger, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private SagaRepository $sagaRepository, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, @@ -35,7 +35,7 @@ public function getSaga(array $data): Saga $saga->setTitle($this->setName($data['name'])); $saga->setTmdb($data['id']); $this->sagaRepository->save($saga); - $this->messageBus->dispatch(new SagaMessage($saga->getId())); + $this->messageDispatcherService->dispatch(new SagaMessage($saga->getId())); } return $saga; @@ -65,7 +65,7 @@ public function update(Saga $saga): bool $details = $this->theMovieDbApi->getDetailsSaga($saga); if (!isset($details['tmdb']) || is_null($details['tmdb'])) { $this->sagaRepository->delete($saga); - $this->logger->error('Saga not found TMDB id ' . $saga->getTmdb()); + $this->logger->error('Saga not found TMDB id '.$saga->getTmdb()); return false; } diff --git a/apps/src/Service/Imdb/SeasonService.php b/apps/src/Service/Imdb/SeasonService.php index 86da95789..6a0456214 100644 --- a/apps/src/Service/Imdb/SeasonService.php +++ b/apps/src/Service/Imdb/SeasonService.php @@ -9,16 +9,17 @@ use Labstag\Message\EpisodeMessage; use Labstag\Repository\SeasonRepository; use Labstag\Service\FileService; -use Symfony\Component\Messenger\MessageBusInterface; +use Labstag\Service\MessageDispatcherService; final class SeasonService { public function __construct( private FileService $fileService, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private SeasonRepository $seasonRepository, private EpisodeService $episodeService, private TheMovieDbApi $theMovieDbApi, + private PersonService $personService, ) { } @@ -100,12 +101,38 @@ public function update(Season $season): bool $this->updateSeason($season, $details), $this->updateImagePoster($season, $details), $this->updateImageBackdrop($season), + $this->updateCredits($season, $details), $this->updateEpisodes($season, $details), ]; return in_array(true, $statuses, true); } + private function updateCredits(Season $season, array $details): bool + { + foreach ($season->getCastings() as $casting) { + $season->removeCasting($casting); + } + + if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $casting = $this->personService->addToCastingSeason($person, $season, $cast); + $season->addCasting($casting); + } + } + + if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $casting = $this->personService->addToCastingSeason($person, $season, $crew); + $season->addCasting($casting); + } + } + + return true; + } + private function updateEpisodes(Season $season, array $details): bool { if (isset($details['tmdb']['episodes']) && is_array($details['tmdb']['episodes'])) { @@ -117,7 +144,7 @@ private function updateEpisodes(Season $season, array $details): bool $episodes = $this->episodeService->getEpisodes($season); foreach ($episodes as $episode) { - $this->messageBus->dispatch(new EpisodeMessage($episode->getId())); + $this->messageDispatcherService->dispatch(new EpisodeMessage($episode->getId())); } return true; diff --git a/apps/src/Service/Imdb/SerieService.php b/apps/src/Service/Imdb/SerieService.php index af3d497d5..ad5019c18 100644 --- a/apps/src/Service/Imdb/SerieService.php +++ b/apps/src/Service/Imdb/SerieService.php @@ -8,18 +8,12 @@ use Labstag\Entity\Serie; use Labstag\Entity\SerieCategory; use Labstag\Message\SeasonMessage; -use Labstag\Message\SerieMessage; use Labstag\Repository\SerieRepository; use Labstag\Service\CategoryService; use Labstag\Service\ConfigurationService; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\VideoService; -use Symfony\Component\HttpFoundation\RedirectResponse; -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; -use Symfony\Component\Messenger\MessageBusInterface; -use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Translation\TranslatableMessage; final class SerieService { @@ -35,7 +29,7 @@ final class SerieService private array $year = []; public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageDispatcherService, private ConfigurationService $configurationService, private FileService $fileService, private CompanyService $companyService, @@ -43,9 +37,8 @@ public function __construct( private SerieRepository $serieRepository, private CategoryService $categoryService, private TheMovieDbApi $theMovieDbApi, - private RequestStack $requestStack, private VideoService $videoService, - private RouterInterface $router, + private PersonService $personService, ) { } @@ -155,19 +148,13 @@ public function update(Serie $serie): bool $this->updateCategory($serie, $details), $this->updateTrailer($serie, $details), $this->updateCompany($serie, $details), + $this->updateCredits($serie, $details), $this->updateSeasons($serie, $details), ]; return in_array(true, $statuses, true); } - private function getFlashBag(): FlashBagInterface - { - $session = $this->requestStack->getSession(); - - return $session->getFlashBag(); - } - /** * @param array $details */ @@ -277,6 +264,31 @@ private function updateCompany(Serie $serie, array $details): bool return true; } + private function updateCredits(Serie $serie, array $details): bool + { + foreach ($serie->getCastings() as $casting) { + $serie->removeCasting($casting); + } + + if (isset($details['credits']['cast']) || is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $casting = $this->personService->addToCastingSerie($person, $serie, $cast); + $serie->addCasting($casting); + } + } + + if (isset($details['credits']['crew']) || is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $casting = $this->personService->addToCastingSerie($person, $serie, $crew); + $serie->addCasting($casting); + } + } + + return true; + } + /** * @param array $details */ @@ -352,7 +364,7 @@ private function updateSeasons(Serie $serie, array $details): bool $seasons = $this->seasonService->getSeasons($serie); foreach ($seasons as $season) { - $this->messageBus->dispatch(new SeasonMessage($season->getId())); + $this->messageDispatcherService->dispatch(new SeasonMessage($season->getId())); } return true; diff --git a/apps/src/Service/MessageDispatcherService.php b/apps/src/Service/MessageDispatcherService.php new file mode 100644 index 000000000..f4a47be31 --- /dev/null +++ b/apps/src/Service/MessageDispatcherService.php @@ -0,0 +1,131 @@ +> + */ + private array $dispatchedMessages = []; + + public function __construct( + private MessageBusInterface $messageBus, + ) + { + } + + /** + * Dispatch un message seulement s'il n'a pas déjà été dispatché. + * + * @param object $message Le message à dispatcher + * @param array $stamps Les stamps Symfony Messenger optionnels + * @param bool $forceDispatch Force le dispatch même si déjà dispatché + */ + public function dispatch(object $message, array $stamps = [], bool $forceDispatch = false): void + { + $messageKey = $this->getMessageKey($message); + + if (!$forceDispatch && $this->isAlreadyDispatched($messageKey)) { + return; + } + + $this->markAsDispatched($messageKey); + $this->messageBus->dispatch($message, $stamps); + } + + /** + * Retourne le nombre de messages dispatchés par type. + * + * @return array + */ + public function getDispatchStats(): array + { + $stats = []; + foreach ($this->dispatchedMessages as $className => $messages) { + $stats[$className] = count($messages); + } + + return $stats; + } + + /** + * Vérifie si un message a déjà été dispatché. + */ + public function isAlreadyDispatched(string $messageKey): bool + { + $className = $this->extractClassName($messageKey); + + return isset($this->dispatchedMessages[$className][$messageKey]); + } + + /** + * Marque un message comme dispatché. + */ + public function markAsDispatched(string $messageKey): void + { + $className = $this->extractClassName($messageKey); + if (!isset($this->dispatchedMessages[$className])) { + $this->dispatchedMessages[$className] = []; + } + + $this->dispatchedMessages[$className][$messageKey] = true; + } + + /** + * Réinitialise le cache des messages dispatchés. + * Utile pour les tests ou pour réinitialiser l'état entre différentes requêtes. + */ + public function reset(): void + { + $this->dispatchedMessages = []; + } + + /** + * Extrait le nom de classe depuis une clé de message. + */ + private function extractClassName(string $messageKey): string + { + return explode('::', $messageKey)[0]; + } + + /** + * Génère une clé unique pour un message basée sur sa classe et ses propriétés. + */ + private function getMessageKey(object $message): string + { + $className = $message::class; + $reflectionClass = new ReflectionClass($message); + $properties = []; + + foreach ($reflectionClass->getProperties() as $reflectionProperty) { + $value = $reflectionProperty->getValue($message); + // Convertir les valeurs en string pour la comparaison + $properties[$reflectionProperty->getName()] = $this->serializeValue($value); + } + + ksort($properties); + + return $className.'::'.md5(serialize($properties)); + } + + /** + * Sérialise une valeur pour la comparaison. + */ + private function serializeValue(mixed $value): mixed + { + if (is_object($value)) { + return spl_object_hash($value); + } + + return $value; + } +} diff --git a/apps/src/Service/SecurityService.php b/apps/src/Service/SecurityService.php index 276870915..8984832ea 100644 --- a/apps/src/Service/SecurityService.php +++ b/apps/src/Service/SecurityService.php @@ -50,7 +50,7 @@ public function get(): ?RedirectResponse } $pathinfo = $request->getPathInfo(); - $slug = '/' . $request->attributes->get('slug'); + $slug = '/'.$request->attributes->get('slug'); if ($slug !== $pathinfo) { $pathinfo = $slug; } @@ -125,7 +125,7 @@ public function set(int $httpCode = 404): void $server = $request->server; $httpErrorLogs = new HttpErrorLogs(); - $domain = $server->get('REQUEST_SCHEME') . '://' . $server->get('SERVER_NAME'); + $domain = $server->get('REQUEST_SCHEME').'://'.$server->get('SERVER_NAME'); $url = $server->get('REQUEST_URI'); if ($this->isDisableUrl($url)) { return; @@ -272,7 +272,7 @@ private function testRedirectRegex(string $pathinfo, array $redirections): ?Redi if (str_starts_with((string) $newUrl, '/')) { $request = $this->requestStack->getCurrentRequest(); if (!is_null($request)) { - $newUrl = $request->getSchemeAndHttpHost() . $newUrl; + $newUrl = $request->getSchemeAndHttpHost().$newUrl; } } diff --git a/apps/src/Service/SiteService.php b/apps/src/Service/SiteService.php index 7b0b9e664..ad0a39b18 100644 --- a/apps/src/Service/SiteService.php +++ b/apps/src/Service/SiteService.php @@ -26,13 +26,13 @@ public function asset(mixed $entity, string $field, bool $placeholder = true, bo $configuration = $this->configurationService->getConfiguration(); $data = $this->getAsset($entity); if (is_null($entity) || is_null($data)) { - return ($placeholder) ? 'https://picsum.photos/1200/1200?md5=' . bin2hex(random_bytes(16)) : ''; + return ($placeholder) ? 'https://picsum.photos/1200/1200?md5='.bin2hex(random_bytes(16)) : ''; } $file = $data->asset($entity, $field); if ('' !== $file) { - return $absolute ? $configuration->getUrl() . $file : $file; + return $absolute ? $configuration->getUrl().$file : $file; } if (!$placeholder) { @@ -41,10 +41,10 @@ public function asset(mixed $entity, string $field, bool $placeholder = true, bo $dataPlaceholder = $data->placeholder(); if ('' !== $dataPlaceholder) { - return $absolute ? $configuration->getUrl() . $dataPlaceholder : $dataPlaceholder; + return $absolute ? $configuration->getUrl().$dataPlaceholder : $dataPlaceholder; } - return 'https://picsum.photos/1200/1200?md5=' . md5((string) $entity->getId()); + return 'https://picsum.photos/1200/1200?md5='.md5((string) $entity->getId()); } /** diff --git a/apps/src/Service/SitemapService.php b/apps/src/Service/SitemapService.php index a2e77c3c2..7ca2752e7 100644 --- a/apps/src/Service/SitemapService.php +++ b/apps/src/Service/SitemapService.php @@ -76,7 +76,7 @@ private function formatData(object $entity): array $url = $this->urlGenerator->generate('front', $params); return [ - '/' . $url => ['entity' => $entity], + '/'.$url => ['entity' => $entity], ]; } @@ -242,7 +242,7 @@ private function setTabsByParent(array $urls, string $parent): array ) ) { $this->parent[$url] = true; - $data['parent'] = $this->setTabsByParent($urls, $url . '/'); + $data['parent'] = $this->setTabsByParent($urls, $url.'/'); $tabs[$url] = $data; } } diff --git a/apps/src/Service/StoryService.php b/apps/src/Service/StoryService.php index 731e9a64f..1066521f8 100644 --- a/apps/src/Service/StoryService.php +++ b/apps/src/Service/StoryService.php @@ -47,11 +47,11 @@ public function getUpdates(): array public function update(Story $story): bool { - $tempPath = $this->getTemporaryFolder() . '/' . $story->getSlug() . '.pdf'; + $tempPath = $this->getTemporaryFolder().'/'.$story->getSlug().'.pdf'; $mpdf = new Mpdf( [ - 'tempDir' => $this->getTemporaryFolder() . '/tmp', + 'tempDir' => $this->getTemporaryFolder().'/tmp', ] ); $mpdf->SetAuthor($story->getRefuser()->getUsername()); @@ -65,10 +65,10 @@ public function update(Story $story): bool $translatableMessage = new TranslatableMessage('Table of Contents'); $mpdf->TOCpagebreakByArray( [ - 'toc-preHTML' => '

' . $this->translator->trans( + 'toc-preHTML' => '

'.$this->translator->trans( $translatableMessage->getMessage(), $translatableMessage->getParameters() - ) . '

', + ).'', 'links' => true, ] ); @@ -90,8 +90,8 @@ private function addCoverPage(Mpdf $mpdf, Story $story): void $mpdf->WriteHTML( '
-

' . $story->getTitle() . '

-

Auteur : ' . $story->getRefuser()->getUsername() . '

+

'.$story->getTitle().'

+

Auteur : '.$story->getRefuser()->getUsername().'

' ); @@ -105,7 +105,7 @@ private function addCoverPage(Mpdf $mpdf, Story $story): void private function getChapters(Story $story): array { return $this->cacheService->get( - 'story_chapters_' . $story->getId(), + 'story_chapters_'.$story->getId(), function () use ($story): array { $chapters = []; $data = $story->getChapters(); @@ -141,7 +141,7 @@ private function setChapter(Mpdf $mpdf, Chapter $chapter): void foreach ($paragraphs as $paragraph) { if ($paragraph instanceof TextParagraph) { if (0 === $position) { - $mpdf->WriteHTML('

' . $chapter->getTitle() . '

'); + $mpdf->WriteHTML('

'.$chapter->getTitle().'

'); } $mpdf->WriteHTML($paragraph->getContent()); diff --git a/apps/src/Service/VideoService.php b/apps/src/Service/VideoService.php index d1b6a331d..b9293a182 100644 --- a/apps/src/Service/VideoService.php +++ b/apps/src/Service/VideoService.php @@ -39,8 +39,8 @@ private function setVideo(array $data) { $type = strtolower((string) $data['site']); $video = match ($type) { - 'youtube' => 'https://www.youtube.com/watch?v=' . $data['key'], - 'vimeo' => 'https://vimeo.com/' . $data['key'], + 'youtube' => 'https://www.youtube.com/watch?v='.$data['key'], + 'vimeo' => 'https://vimeo.com/'.$data['key'], default => null, }; diff --git a/apps/src/Service/ViewResolverService.php b/apps/src/Service/ViewResolverService.php index 00d3e3136..cba7f2a87 100644 --- a/apps/src/Service/ViewResolverService.php +++ b/apps/src/Service/ViewResolverService.php @@ -6,6 +6,7 @@ use Labstag\Entity\Meta; use Labstag\Repository\BlockRepository; use ReflectionClass; +use Symfony\Component\DependencyInjection\Attribute\AutowireIterator; use Twig\Environment; final class ViewResolverService @@ -17,6 +18,8 @@ final class ViewResolverService private array $requestCache = []; public function __construct( + #[AutowireIterator('labstag.datas')] + private iterable $datas, private EntityManagerInterface $entityManager, private ConfigurationService $configurationService, private BlockService $blockService, @@ -31,18 +34,18 @@ public function __construct( */ public function getDataByEntity(object $entity, bool $disable = false): array { - $cacheKey = 'data:' . spl_object_hash($entity) . ':' . ($disable ? '1' : '0'); + $cacheKey = 'data:'.spl_object_hash($entity).':'.($disable ? '1' : '0'); if (isset($this->requestCache[$cacheKey])) { return $this->requestCache[$cacheKey]; } - $reflectionClass = new ReflectionClass($entity); + new ReflectionClass($entity); $data = [ 'entity' => $entity, 'paragraphs' => $entity->getParagraphs()->getValues(), ]; - $data['img'] = $reflectionClass->hasMethod('getImg') ? $entity->getImg() : $entity->getPoster(); + $data['img'] = $this->getDefaultImageEntity($entity); if (method_exists($entity, 'getTags')) { $data['tags'] = $entity->getTags(); @@ -138,6 +141,18 @@ private function getBlocks(array $data, bool $disable): array ]; } + private function getDefaultImageEntity(object $entity) + { + $image = ''; + foreach ($this->datas as $data) { + if ($data->supportsData($entity)) { + $image = $data->getDefaultImage($entity); + } + } + + return $image; + } + private function getMetaByEntity(Meta $meta): Meta { return $meta; @@ -145,7 +160,7 @@ private function getMetaByEntity(Meta $meta): Meta private function getViewByEntity(object $entity): string { - $cacheKey = 'view:' . spl_object_hash($entity); + $cacheKey = 'view:'.spl_object_hash($entity); if (isset($this->requestCache[$cacheKey])) { return $this->requestCache[$cacheKey]; } @@ -160,7 +175,7 @@ private function getViewByEntityName(string $entityName): string { $loader = $this->twigEnvironment->getLoader(); $files = [ - 'views/' . $entityName . '.html.twig', + 'views/'.$entityName.'.html.twig', 'views/default.html.twig', ]; diff --git a/apps/src/SlugHandler/ChapterSlugHandler.php b/apps/src/SlugHandler/ChapterSlugHandler.php index a1d989de6..629be42a0 100644 --- a/apps/src/SlugHandler/ChapterSlugHandler.php +++ b/apps/src/SlugHandler/ChapterSlugHandler.php @@ -88,7 +88,7 @@ public function setSlugForObject($objectRepository, $object) break; } - $slug = $unicodeString . '-' . $number; + $slug = $unicodeString.'-'.$number; ++$number; } diff --git a/apps/src/SlugHandler/MovieSlugHandler.php b/apps/src/SlugHandler/MovieSlugHandler.php index 696db87e1..2a63ef007 100644 --- a/apps/src/SlugHandler/MovieSlugHandler.php +++ b/apps/src/SlugHandler/MovieSlugHandler.php @@ -60,13 +60,13 @@ public function onSlugCompletion(SluggableAdapter $sluggableAdapter, array &$con } $date = $object->getReleaseDate(); - $newSlug = $date ? $originalSlug . '-' . $date->format('Y') : $originalSlug . '-' . uniqid(); + $newSlug = $date ? $originalSlug.'-'.$date->format('Y') : $originalSlug.'-'.uniqid(); $existingMovie->setSlug($newSlug); $objectManager->persist($existingMovie); } $date = $object->getReleaseDate(); - $slug = $date ? $originalSlug . '-' . $date->format('Y') : $originalSlug . '-' . uniqid(); + $slug = $date ? $originalSlug.'-'.$date->format('Y') : $originalSlug.'-'.uniqid(); } public function postSlugBuild(SluggableAdapter $sluggableAdapter, array &$config, $object, &$slug): void diff --git a/apps/src/SlugHandler/PageSlugHandler.php b/apps/src/SlugHandler/PageSlugHandler.php index 30d7f0886..c99131c06 100644 --- a/apps/src/SlugHandler/PageSlugHandler.php +++ b/apps/src/SlugHandler/PageSlugHandler.php @@ -114,7 +114,7 @@ public function onSlugCompletion(SluggableAdapter $sluggableAdapter, array &$con $classMetadata = $wrapper->getMetadata(); $target = $wrapper->getPropertyValue($config['slug']); $config['pathSeparator'] = $this->usedPathSeparator; - $sluggableAdapter->replaceRelative($object, $config, $target . $config['pathSeparator'], $slug); + $sluggableAdapter->replaceRelative($object, $config, $target.$config['pathSeparator'], $slug); $uow = $this->objectManager->getUnitOfWork(); // update in memory objects foreach ($uow->getIdentityMap() as $className => $objects) { @@ -155,14 +155,14 @@ public function postSlugBuild(SluggableAdapter $sluggableAdapter, array &$config public function transliterate(string $text, $separator, $object): string { unset($separator, $object); - $slug = $text . $this->suffix; + $slug = $text.$this->suffix; if (0 !== strlen($this->parentSlug)) { - return $this->parentSlug . $this->usedPathSeparator . $slug; + return $this->parentSlug.$this->usedPathSeparator.$slug; } // if no parentSlug, apply our prefix - return $this->prefix . $slug; + return $this->prefix.$slug; } /** diff --git a/apps/src/SlugHandler/SagaSlugHandler.php b/apps/src/SlugHandler/SagaSlugHandler.php index 8dc2c0439..3006f0825 100644 --- a/apps/src/SlugHandler/SagaSlugHandler.php +++ b/apps/src/SlugHandler/SagaSlugHandler.php @@ -50,7 +50,7 @@ public function onSlugCompletion(SluggableAdapter $sluggableAdapter, array &$con ); if ($existingMovies) { - $slug = $originalSlug . '-saga'; + $slug = $originalSlug.'-saga'; } } diff --git a/apps/src/Template/TemplateAbstract.php b/apps/src/Template/TemplateAbstract.php index 5755817e4..79726fb9a 100644 --- a/apps/src/Template/TemplateAbstract.php +++ b/apps/src/Template/TemplateAbstract.php @@ -54,7 +54,7 @@ public function getTemplate() $template = new Template(); $template->setCode($code); - $template->setTitle('Template ' . $code); + $template->setTitle('Template '.$code); $template->setHtml($html); $template->setText($text); @@ -72,10 +72,10 @@ protected function getTemplateContent(string $code, string $type): string return $this->templates[$code][$type]; } - $extension = '.' . $type . '.twig'; + $extension = '.'.$type.'.twig'; $files = [ - 'template/' . $code . $extension, - 'template/default' . $extension, + 'template/'.$code.$extension, + 'template/default'.$extension, ]; $view = end($files); diff --git a/apps/src/Twig/Extension/CastingExtension.php b/apps/src/Twig/Extension/CastingExtension.php new file mode 100644 index 000000000..e4e5fe10e --- /dev/null +++ b/apps/src/Twig/Extension/CastingExtension.php @@ -0,0 +1,26 @@ +controllers as $controller) { $entityClass = $controller->getEntityFqcn(); if ($entityClass == $entity::class || $entity instanceof $entityClass) { - $crud = $controller->configureCrud(Crud::new()); + $crud = $controller->configureCrud(Crud::new()); + $singular = $crud->getAsDto()->getEntityLabelInSingular(); - return $this->translator->trans($crud->getAsDto()->getEntityLabelInSingular()); + return $this->translator->trans($singular->getMessage()); } } diff --git a/apps/src/Twig/Runtime/BlockExtensionRuntime.php b/apps/src/Twig/Runtime/BlockExtensionRuntime.php index 0619c8f17..a2a6e20ea 100644 --- a/apps/src/Twig/Runtime/BlockExtensionRuntime.php +++ b/apps/src/Twig/Runtime/BlockExtensionRuntime.php @@ -33,7 +33,7 @@ public function getContextMenu(Block $block): array return $data; } - $data['data-context_url'] = $urlAdmin; + $data['data-context_url'] = $urlAdmin; $translatableMessage = new TranslatableMessage( 'Update block (%name%) #%type%', [ @@ -41,7 +41,10 @@ public function getContextMenu(Block $block): array '%type%' => $this->blockService->getType($block), ] ); - $data['data-context_text'] = $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + $data['data-context_text'] = $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); return $data; } @@ -87,7 +90,7 @@ private function getClass(Block $block): string $type = $this->blockService->getType($block); $tab = [ 'block', - 'block_' . $type, + 'block_'.$type, ]; $classes = explode(' ', (string) $block->getClasses()); @@ -101,6 +104,6 @@ private function getId(Block $block): string { $type = $this->blockService->getType($block); - return 'block_' . $type . '-' . $block->getId(); + return 'block_'.$type.'-'.$block->getId(); } } diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php new file mode 100644 index 000000000..8a964bfed --- /dev/null +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -0,0 +1,115 @@ +getByType('Acting', $data); + } + + public function cast($data): mixed + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + + return $entityRepository->findWithActiveCastings($data); + } + + public function directing($data): array + { + return $this->getByType('Directing', $data); + } + + public function editing($data): array + { + return $this->getByType('Editing', $data); + } + + public function movies($data): array + { + $tab = []; + foreach ($data as $row) { + if ($row->getRefMovie() instanceof Movie) { + $id = $row->getRefMovie()->getId(); + $tab[$id] = $row->getRefMovie(); + } + } + + foreach ($tab as $key => $movie) { + if ($movie->isEnable()) { + continue; + } + + unset($tab[$key]); + } + + return $tab; + } + + public function production($data): array + { + return $this->getByType('Production', $data); + } + + public function series($data): array + { + $tab = []; + foreach ($data as $row) { + if ($row->getRefSerie() instanceof Serie) { + $id = $row->getRefSerie()->getId(); + $tab[$id] = $row->getRefSerie(); + } elseif ($row->getRefEpisode() instanceof Episode) { + $id = $row->getRefEpisode()->getRefseason()->getRefserie()->getId(); + $tab[$id] = $row->getRefEpisode()->getRefseason()->getRefserie(); + } elseif ($row->getRefSeason() instanceof Season) { + $id = $row->getRefSeason()->getRefserie()->getId(); + $tab[$id] = $row->getRefSeason()->getRefserie(); + } + } + + foreach ($tab as $key => $serie) { + if ($serie->isEnable()) { + continue; + } + + unset($tab[$key]); + } + + return $tab; + } + + public function writing($data): array + { + return $this->getByType('Writing', $data); + } + + private function getByType(string $type, $data): array + { + $casting = []; + foreach ($data as $row) { + if ($row->getKnownForDepartment() != $type) { + continue; + } + + $casting[] = $row; + } + + return $casting; + } +} diff --git a/apps/src/Twig/Runtime/DebugExtensionRuntime.php b/apps/src/Twig/Runtime/DebugExtensionRuntime.php index 39b3a19e2..97961feac 100644 --- a/apps/src/Twig/Runtime/DebugExtensionRuntime.php +++ b/apps/src/Twig/Runtime/DebugExtensionRuntime.php @@ -22,16 +22,16 @@ public function begin(array $data): string } $html = "\n"); + return $html.("BEGIN OUTPUT from '".$templates['view']."' -->\n"); } /** @@ -44,6 +44,6 @@ public function end(array $data): string return ''; } - return "\n\n"; + return "\n\n"; } } diff --git a/apps/src/Twig/Runtime/FrontExtensionRuntime.php b/apps/src/Twig/Runtime/FrontExtensionRuntime.php index de6b224da..e2b885407 100644 --- a/apps/src/Twig/Runtime/FrontExtensionRuntime.php +++ b/apps/src/Twig/Runtime/FrontExtensionRuntime.php @@ -155,7 +155,7 @@ public function title(array $data): string $contentTitle = $this->siteService->getTitleMeta($data['entity']); $page = $request->attributes->getInt('page', 1); if (1 != $page) { - $contentTitle .= ' - Page ' . $page; + $contentTitle .= ' - Page '.$page; } return str_replace(['%content_title%', '%site_name%'], [$contentTitle, $siteTitle], $format); diff --git a/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php b/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php index 3c05726eb..5640f54b0 100644 --- a/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php +++ b/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php @@ -33,7 +33,7 @@ public function getContextMenu(Paragraph $paragraph): array return $data; } - $data['data-context_url'] = $urlAdmin; + $data['data-context_url'] = $urlAdmin; $translatableMessage = new TranslatableMessage( 'Update paragraph (%name%) #%type%', [ @@ -41,7 +41,10 @@ public function getContextMenu(Paragraph $paragraph): array '%type%' => $this->paragraphService->getType($paragraph), ] ); - $data['data-context_text'] = $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + $data['data-context_text'] = $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); return $data; } @@ -92,7 +95,7 @@ private function getClass(Paragraph $paragraph): string $type = $this->paragraphService->getType($paragraph); $tab = [ 'paragraph', - 'paragraph_' . $type, + 'paragraph_'.$type, ]; $tab = array_merge($tab, $this->paragraphService->getClasses($paragraph)); @@ -104,6 +107,6 @@ private function getId(Paragraph $paragraph): string { $type = $this->paragraphService->getType($paragraph); - return 'paragraph_' . $type . '-' . $paragraph->getId(); + return 'paragraph_'.$type.'-'.$paragraph->getId(); } } diff --git a/apps/src/Twig/Runtime/TimeExtensionRuntime.php b/apps/src/Twig/Runtime/TimeExtensionRuntime.php index 2dd803647..822bc0329 100644 --- a/apps/src/Twig/Runtime/TimeExtensionRuntime.php +++ b/apps/src/Twig/Runtime/TimeExtensionRuntime.php @@ -28,23 +28,23 @@ public function runtime($minutes): string $parts = []; if (0 !== $years) { - $parts[] = $years . 'a'; + $parts[] = $years.'a'; } if (0 !== $months) { - $parts[] = $months . 'm'; + $parts[] = $months.'m'; } if (0 !== $days) { - $parts[] = $days . 'j'; + $parts[] = $days.'j'; } if (0 !== $hours) { - $parts[] = $hours . 'h'; + $parts[] = $hours.'h'; } if (0 !== $mins) { - $parts[] = $mins . 'min'; + $parts[] = $mins.'min'; } return implode(' ', $parts); diff --git a/apps/templates/admin/field/casting-episodes.html.twig b/apps/templates/admin/field/casting-episodes.html.twig new file mode 100644 index 000000000..3d8c5072e --- /dev/null +++ b/apps/templates/admin/field/casting-episodes.html.twig @@ -0,0 +1,47 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + + + + + + + + + + + + {% for casting in instance.castings %} + {% if casting.refEpisode is not null %} + + + + + + + + + {% endif %} + {% endfor %} + +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Serie'|trans }}{{ 'Season'|trans }}{{ 'Episode'|trans }}
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refEpisode.refseason.refserie.title }} + + + + {{ casting.refEpisode.refseason.title }} + + + + {{ casting.refEpisode.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/admin/field/casting-movies.html.twig b/apps/templates/admin/field/casting-movies.html.twig new file mode 100644 index 000000000..04048b5b6 --- /dev/null +++ b/apps/templates/admin/field/casting-movies.html.twig @@ -0,0 +1,35 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + + + + + + + + + + {% for casting in instance.castings %} + {% if casting.refMovie is not null %} + + + + + + + {% endif %} + {% endfor %} + +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Movie'|trans }}
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refMovie.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/admin/field/casting-seasons.html.twig b/apps/templates/admin/field/casting-seasons.html.twig new file mode 100644 index 000000000..a03249a0d --- /dev/null +++ b/apps/templates/admin/field/casting-seasons.html.twig @@ -0,0 +1,41 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + + + + + + + + + + + {% for casting in instance.castings %} + {% if casting.refSeason is not null %} + + + + + + + + {% endif %} + {% endfor %} + +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Serie'|trans }}{{ 'Season'|trans }}
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refSeason.refserie.title }} + + + + {{ casting.refSeason.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/admin/field/casting-series.html.twig b/apps/templates/admin/field/casting-series.html.twig new file mode 100644 index 000000000..e8c87530b --- /dev/null +++ b/apps/templates/admin/field/casting-series.html.twig @@ -0,0 +1,35 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + + + + + + + + + + {% for casting in instance.castings %} + {% if casting.refSerie is not null %} + + + + + + + {% endif %} + {% endfor %} + +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Serie'|trans }}
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refSerie.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/admin/field/castings.html.twig b/apps/templates/admin/field/castings.html.twig new file mode 100644 index 000000000..9b557699b --- /dev/null +++ b/apps/templates/admin/field/castings.html.twig @@ -0,0 +1,19 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + {% set castings = casting_cast(instance) %} + + {% for casting in castings %} + + + + + + {% endfor %} +
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }}
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/paragraphs/content/chapter-list.html.twig b/apps/templates/paragraphs/content/chapter-list.html.twig index f6519dee2..44106bb17 100644 --- a/apps/templates/paragraphs/content/chapter-list.html.twig +++ b/apps/templates/paragraphs/content/chapter-list.html.twig @@ -9,7 +9,7 @@
    {% for row in chapters %}
  • - {% include "teasers/chapter.html.twig" with {'chapter': row} %} + {% include "teasers/chapter.html.twig" with {'chapter': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/episode-list.html.twig b/apps/templates/paragraphs/content/episode-list.html.twig index eb926d7a1..1397ff76e 100644 --- a/apps/templates/paragraphs/content/episode-list.html.twig +++ b/apps/templates/paragraphs/content/episode-list.html.twig @@ -15,7 +15,7 @@
    {% for row in pagination %}
  • - {% include "teasers/episode.html.twig" with {'episode': row} %} + {% include "teasers/episode.html.twig" with {'episode': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/experiences.html.twig b/apps/templates/paragraphs/content/experiences.html.twig index 1a20bbd5f..cc6ae5704 100644 --- a/apps/templates/paragraphs/content/experiences.html.twig +++ b/apps/templates/paragraphs/content/experiences.html.twig @@ -5,7 +5,7 @@
    {% for item in paragraph.skills %}
  • - {% include "teasers/experience.html.twig" with {'item': item} %} + {% include "teasers/experience.html.twig" with {'item': item} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/game.html.twig b/apps/templates/paragraphs/content/game.html.twig index c71d6b656..1eeb0cab4 100644 --- a/apps/templates/paragraphs/content/game.html.twig +++ b/apps/templates/paragraphs/content/game.html.twig @@ -10,7 +10,7 @@
    {% for row in pagination %}
  • - {% include "teasers/game.html.twig" with {'game': row} %} + {% include "teasers/game.html.twig" with {'game': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/head-movie.html.twig b/apps/templates/paragraphs/content/head-movie.html.twig index d769d58c8..182d825a7 100644 --- a/apps/templates/paragraphs/content/head-movie.html.twig +++ b/apps/templates/paragraphs/content/head-movie.html.twig @@ -112,5 +112,23 @@ {% endif %} {% endif %} + {% set castings = casting_cast(movie) %} + {% set actings = casting_acting(castings) %} + {% if actings|length > 0 %} +
+

+ {{ 'Cast'|trans }} +

+
+
    + {% for acting in actings %} +
  • + {% include "teasers/person.html.twig" with {'person': acting.refperson, 'figure': acting.figure} %} +
  • + {% endfor %} +
+
+
+ {% endif %} diff --git a/apps/templates/paragraphs/content/head-person.html.twig b/apps/templates/paragraphs/content/head-person.html.twig new file mode 100644 index 000000000..d6d3cbdc3 --- /dev/null +++ b/apps/templates/paragraphs/content/head-person.html.twig @@ -0,0 +1,59 @@ +{% use "elements.html.twig" %} +{% set castings = casting_cast(person) %} +{% set series = casting_series(castings) %} +{% set movies = casting_movies(castings) %} + +
+
+
+
+

+ {{ person.title }} +

+
+ {{ 'Date of birth : %date%'|trans({ '%date%': person.birthday|format_date(locale: 'fr_FR', dateFormat: 'full') }) }} +
+ {% if person.deathday %} +
+ {{ 'Date of death : %date%'|trans({ '%date%': person.deathday|format_date(locale: 'fr_FR', dateFormat: 'full') }) }} +
+ {% endif %} +
+
+
+
+
+
+ {{ person.biography|raw }} +
+
+ {% if series|length != 0 or movies|length != 0 %} +
+
+
+ {% if series|length != 0 %} +

{{ 'Series'|trans }}

+
    + {% for serie in series %} +
  • + {% include "teasers/serie.html.twig" with {'serie': serie} %} +
  • + {% endfor %} +
+ {% endif %} + {% if movies|length != 0 %} +

{{ 'Movies'|trans }}

+
    + {% for movie in movies %} +
  • + {% include "teasers/movie.html.twig" with {'movie': movie} %} +
  • + {% endfor %} +
+ {% endif %} +
+
+
+ {% endif %} +
+ diff --git a/apps/templates/paragraphs/content/last-news.html.twig b/apps/templates/paragraphs/content/last-news.html.twig index c3621e28f..fa853a3da 100644 --- a/apps/templates/paragraphs/content/last-news.html.twig +++ b/apps/templates/paragraphs/content/last-news.html.twig @@ -13,7 +13,7 @@
    {% for row in news %}
  • - {% include "teasers/post.html.twig" with {'post': row} %} + {% include "teasers/post.html.twig" with {'post': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/last-story.html.twig b/apps/templates/paragraphs/content/last-story.html.twig index d07174ad7..6e039875f 100644 --- a/apps/templates/paragraphs/content/last-story.html.twig +++ b/apps/templates/paragraphs/content/last-story.html.twig @@ -13,7 +13,7 @@
    {% for story in stories %}
  • - {% include "teasers/story.html.twig" with {'story': story} %} + {% include "teasers/story.html.twig" with {'story': story} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/movie.html.twig b/apps/templates/paragraphs/content/movie.html.twig index 1d85cb381..86738c2b5 100644 --- a/apps/templates/paragraphs/content/movie.html.twig +++ b/apps/templates/paragraphs/content/movie.html.twig @@ -10,7 +10,7 @@
    {% for row in pagination %}
  • - {% include "teasers/movie.html.twig" with {'movie': row} %} + {% include "teasers/movie.html.twig" with {'movie': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/news-list.html.twig b/apps/templates/paragraphs/content/news-list.html.twig index 02d51efac..2c894c489 100644 --- a/apps/templates/paragraphs/content/news-list.html.twig +++ b/apps/templates/paragraphs/content/news-list.html.twig @@ -4,7 +4,7 @@
    {% for row in pagination %}
  • - {% include "teasers/post.html.twig" with {'post': row} %} + {% include "teasers/post.html.twig" with {'post': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/person.html.twig b/apps/templates/paragraphs/content/person.html.twig new file mode 100644 index 000000000..108ce0d17 --- /dev/null +++ b/apps/templates/paragraphs/content/person.html.twig @@ -0,0 +1,23 @@ +{% use "elements.html.twig" %} + +
+
+ {% if pagination|length == 0 %} +
+ {{ 'No artists match your search.'|trans }} +
+ {% else %} +
    + {% for person in pagination %} +
  • + {% include "teasers/person.html.twig" with {'person': person} %} +
  • + {% endfor %} +
+ {% endif %} +
+ +
+ \ No newline at end of file diff --git a/apps/templates/paragraphs/content/saga-list.html.twig b/apps/templates/paragraphs/content/saga-list.html.twig index 33641f667..ed14402dd 100644 --- a/apps/templates/paragraphs/content/saga-list.html.twig +++ b/apps/templates/paragraphs/content/saga-list.html.twig @@ -16,7 +16,7 @@
    {% for row in movies %}
  • - {% include "teasers/movie.html.twig" with {'movie': row} %} + {% include "teasers/movie.html.twig" with {'movie': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/saga.html.twig b/apps/templates/paragraphs/content/saga.html.twig index f7a708262..719f2cc3b 100644 --- a/apps/templates/paragraphs/content/saga.html.twig +++ b/apps/templates/paragraphs/content/saga.html.twig @@ -4,7 +4,7 @@
    {% for saga in pagination %}
  • - {% include "teasers/saga.html.twig" with {'saga': saga} %} + {% include "teasers/saga.html.twig" with {'saga': saga} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/season-list.html.twig b/apps/templates/paragraphs/content/season-list.html.twig index 07e5c68c0..08afd9208 100644 --- a/apps/templates/paragraphs/content/season-list.html.twig +++ b/apps/templates/paragraphs/content/season-list.html.twig @@ -9,7 +9,7 @@
    {% for row in seasons %}
  • - {% include "teasers/season.html.twig" with {'season': row} %} + {% include "teasers/season.html.twig" with {'season': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/serie.html.twig b/apps/templates/paragraphs/content/serie.html.twig index 99a19dd8c..f7b772c52 100644 --- a/apps/templates/paragraphs/content/serie.html.twig +++ b/apps/templates/paragraphs/content/serie.html.twig @@ -10,7 +10,7 @@
    {% for row in pagination %}
  • - {% include "teasers/serie.html.twig" with {'serie': row} %} + {% include "teasers/serie.html.twig" with {'serie': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/sibling.html.twig b/apps/templates/paragraphs/content/sibling.html.twig index 8d084a3f9..1f2a0a76f 100644 --- a/apps/templates/paragraphs/content/sibling.html.twig +++ b/apps/templates/paragraphs/content/sibling.html.twig @@ -7,7 +7,7 @@
    {% for page in childs %}
  • - {% include "teasers/page.html.twig" with {'page': page} %} + {% include "teasers/page.html.twig" with {'page': page} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/sitemap.html.twig b/apps/templates/paragraphs/content/sitemap.html.twig index f99ab7844..727ae9988 100644 --- a/apps/templates/paragraphs/content/sitemap.html.twig +++ b/apps/templates/paragraphs/content/sitemap.html.twig @@ -1,6 +1,6 @@ {% use "elements.html.twig" %}
- {% include "paragraphs/scripts/sitemap.html.twig" with {'key': '/', 'sitemap': sitemap} %} + {% include "paragraphs/scripts/sitemap.html.twig" with {'key': '/', 'sitemap': sitemap} %}
\ No newline at end of file diff --git a/apps/templates/paragraphs/content/skills.html.twig b/apps/templates/paragraphs/content/skills.html.twig index d6c88bae9..00dbb3c3d 100644 --- a/apps/templates/paragraphs/content/skills.html.twig +++ b/apps/templates/paragraphs/content/skills.html.twig @@ -5,7 +5,7 @@
    {% for item in skills %}
  • - {% include "teasers/skills.html.twig" with {'item': item} %} + {% include "teasers/skills.html.twig" with {'item': item} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/star.html.twig b/apps/templates/paragraphs/content/star.html.twig index 6d393222c..5bcbed0d4 100644 --- a/apps/templates/paragraphs/content/star.html.twig +++ b/apps/templates/paragraphs/content/star.html.twig @@ -4,7 +4,7 @@
    {% for row in pagination %}
  • - {% include "teasers/star.html.twig" with {'star': row} %} + {% include "teasers/star.html.twig" with {'star': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/story-list.html.twig b/apps/templates/paragraphs/content/story-list.html.twig index a421ed239..db31b1be4 100644 --- a/apps/templates/paragraphs/content/story-list.html.twig +++ b/apps/templates/paragraphs/content/story-list.html.twig @@ -4,7 +4,7 @@
    {% for story in pagination %}
  • - {% include "teasers/story.html.twig" with {'story': story} %} + {% include "teasers/story.html.twig" with {'story': story} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/header/person.html.twig b/apps/templates/paragraphs/header/person.html.twig new file mode 100644 index 000000000..cf9909807 --- /dev/null +++ b/apps/templates/paragraphs/header/person.html.twig @@ -0,0 +1 @@ +{{ knp_pagination_rel_links(pagination) }} \ No newline at end of file diff --git a/apps/templates/paragraphs/scripts/sitemap.html.twig b/apps/templates/paragraphs/scripts/sitemap.html.twig index cd152c669..30334ef38 100644 --- a/apps/templates/paragraphs/scripts/sitemap.html.twig +++ b/apps/templates/paragraphs/scripts/sitemap.html.twig @@ -3,7 +3,7 @@
  • {{ data.entity.title }} {% if data.parent|length != 0 %} - {% include "paragraphs/scripts/sitemap.html.twig" with {'key': url, 'sitemap': data.parent} %} + {% include "paragraphs/scripts/sitemap.html.twig" with {'key': url, 'sitemap': data.parent} %} {% endif %}
  • {% endfor %} diff --git a/apps/templates/teasers/person.html.twig b/apps/templates/teasers/person.html.twig new file mode 100644 index 000000000..7f69451ef --- /dev/null +++ b/apps/templates/teasers/person.html.twig @@ -0,0 +1,16 @@ + +
    +
    +
    +

    + {{ person.title }} +

    +
    + {% if figure is defined %} +
    +

    + {{ figure }} +

    +
    + {% endif %} +
    \ No newline at end of file diff --git a/apps/tests/Fixtures/PerformanceFixtures.php b/apps/tests/Fixtures/PerformanceFixtures.php index 459370ba2..542fac784 100644 --- a/apps/tests/Fixtures/PerformanceFixtures.php +++ b/apps/tests/Fixtures/PerformanceFixtures.php @@ -38,7 +38,7 @@ public function load(ObjectManager $manager): void for ($i = 1; self::PERFORMANCE_USERS_COUNT >= $i; ++$i) { $user = new User(); $user->setEmail(sprintf('perf.user.%d@labstag.test', $i)); - $user->setUsername('perfuser' . $i); + $user->setUsername('perfuser'.$i); $user->setEnable(true); $user->setLanguage('fr'); diff --git a/apps/tests/Performance/CachePerformanceTest.php b/apps/tests/Performance/CachePerformanceTest.php index d1ff7c557..59c9bd13d 100644 --- a/apps/tests/Performance/CachePerformanceTest.php +++ b/apps/tests/Performance/CachePerformanceTest.php @@ -45,7 +45,7 @@ public function cacheInvalidationPerformance(): void for ($i = 0; self::CACHE_INVALIDATION_TEST_ENTITIES > $i; ++$i) { $user = new User(); $user->setEmail(sprintf('invalidation%d@example.com', $i)); - $user->setUsername('invaliduser' . $i); + $user->setUsername('invaliduser'.$i); $user->setPassword('password'); $user->setEnable(true); $user->setLanguage('fr'); @@ -82,7 +82,7 @@ public function cacheValidationPerformance(): void $posts = []; for ($i = 0; self::CACHE_VALIDATION_TEST_ENTITIES > $i; ++$i) { $post = new Post(); - $post->setTitle('Cache Validation Post ' . $i); + $post->setTitle('Cache Validation Post '.$i); $post->setEnable(true); $this->persistAndFlush($post); $posts[] = $post; @@ -114,7 +114,7 @@ public function collectionEtagPerformance(): void $entities = []; for ($i = 0; self::COLLECTION_ETAG_TEST_ENTITIES > $i; ++$i) { $post = new Post(); - $post->setTitle('Performance Post ' . $i); + $post->setTitle('Performance Post '.$i); $post->setEnable(true); $this->persistAndFlush($post); $entities[] = $post; @@ -204,7 +204,7 @@ public function etagGenerationPerformance(): void for ($i = 0; self::ETAG_GENERATION_TEST_ENTITIES > $i; ++$i) { $user = new User(); $user->setEmail(sprintf('performance%d@example.com', $i)); - $user->setUsername('perfuser' . $i); + $user->setUsername('perfuser'.$i); $user->setPassword('password'); $user->setEnable(true); $user->setLanguage('fr'); @@ -242,7 +242,7 @@ public function memoryLeakPrevention(): void for ($i = 0; self::MEMORY_LEAK_TEST_ENTITIES > $i; ++$i) { $user = new User(); $user->setEmail(sprintf('leak%d@example.com', $i)); - $user->setUsername('leakuser' . $i); + $user->setUsername('leakuser'.$i); $user->setPassword('password'); $user->setEnable(true); $user->setLanguage('fr'); diff --git a/apps/tests/Unit/Service/EtagCacheServiceTest.php b/apps/tests/Unit/Service/EtagCacheServiceTest.php index d0a774137..4e2c3d083 100644 --- a/apps/tests/Unit/Service/EtagCacheServiceTest.php +++ b/apps/tests/Unit/Service/EtagCacheServiceTest.php @@ -285,7 +285,7 @@ private function createMockUser( $idProperty->setValue($user, $id); $user->setEmail($email); - $user->setUsername('test_user_' . substr($id, 0, 8)); + $user->setUsername('test_user_'.substr($id, 0, 8)); if ($createdAt instanceof DateTimeImmutable) { $createdAtProperty = new ReflectionProperty(User::class, 'createdAt'); diff --git a/apps/tests/bootstrap.php b/apps/tests/bootstrap.php index b3c92e432..70b5dc3a6 100755 --- a/apps/tests/bootstrap.php +++ b/apps/tests/bootstrap.php @@ -4,7 +4,7 @@ use Symfony\Component\Dotenv\Dotenv; -require dirname(__DIR__) . '/vendor/autoload.php'; +require dirname(__DIR__).'/vendor/autoload.php'; // Force test env before loading .env chain so that .env.test is used if (!isset($_SERVER['APP_ENV']) && !isset($_ENV['APP_ENV'])) { @@ -12,11 +12,11 @@ $_ENV['APP_ENV'] = 'test'; } -if (file_exists(dirname(__DIR__) . '/config/bootstrap.php')) { - include dirname(__DIR__) . '/config/bootstrap.php'; +if (file_exists(dirname(__DIR__).'/config/bootstrap.php')) { + include dirname(__DIR__).'/config/bootstrap.php'; } elseif (method_exists(Dotenv::class, 'bootEnv')) { $dotenv = new Dotenv(); - $dotenv->bootEnv(dirname(__DIR__) . '/.env'); + $dotenv->bootEnv(dirname(__DIR__).'/.env'); } if (!empty($_SERVER['APP_DEBUG'])) { diff --git a/apps/tests/object-manager.php b/apps/tests/object-manager.php index 2ea8e79fd..4496e4db0 100755 --- a/apps/tests/object-manager.php +++ b/apps/tests/object-manager.php @@ -6,9 +6,9 @@ use Labstag\Kernel; use Symfony\Component\Dotenv\Dotenv; -require __DIR__ . '/../vendor/autoload.php'; +require __DIR__.'/../vendor/autoload.php'; $dotenv = new Dotenv(); -$dotenv->bootEnv(__DIR__ . '/../.env'); +$dotenv->bootEnv(__DIR__.'/../.env'); $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); $kernel->boot(); diff --git a/apps/translations/EasyAdminBundle.fr.xlf b/apps/translations/EasyAdminBundle.fr.xlf index acbe91c3b..b24507dff 100644 --- a/apps/translations/EasyAdminBundle.fr.xlf +++ b/apps/translations/EasyAdminBundle.fr.xlf @@ -173,6 +173,10 @@ action.save_and_continue Sauvegarder et continuer + + action.toggle_dropdown + Basculer le menu déroulant + batch_action_modal.title Vous allez appliquer l'action "%action_name%" à %num_items% élément(s). diff --git a/apps/translations/messages.fr.xlf b/apps/translations/messages.fr.xlf index e4b0d4c4f..a30ce7247 100644 --- a/apps/translations/messages.fr.xlf +++ b/apps/translations/messages.fr.xlf @@ -2293,6 +2293,90 @@ No episodes found. Aucun épisode trouvé. + + Person + Personne + + + Persons + Personnes + + + Gender + Genre + + + Not set / not specified + Non défini / non spécifié + + + Female + Féminin + + + Male + Masculin + + + Non-binary + Non-binaire + + + Biography + Biographie + + + Place of birth + Lieu de naissance + + + Profile + Profil + + + Birthday + Date de naissance + + + Deathday + Date de décès + + + Reason + Raison + + + Serie is being added + La série est en cours d'ajout + + + Casting + Distribution + + + Cast + Acteurs + + + Known For Department + Connu pour + + + Figure + Personnage + + + Head person + En-tête personne + + + Date of birth : %date% + Date de naissance : %date% + + + Date of death : %date% + Date de décès : %date% + diff --git a/assets/front/index.scss b/assets/front/index.scss index e9a0ae4fd..87f6ae570 100644 --- a/assets/front/index.scss +++ b/assets/front/index.scss @@ -30,6 +30,7 @@ @use 'paragraphs/experiences' as paragraphexperiences; @use 'paragraphs/form' as paragraphform; @use 'paragraphs/head-chapter' as paragraphhead-chapter; +@use 'paragraphs/head-person' as paragraphhead-person; @use 'paragraphs/head-cv' as paragraphhead-cv; @use 'paragraphs/head-game' as paragraphhead-game; @use 'paragraphs/head-movie' as paragraphhead-movie; @@ -40,6 +41,7 @@ @use 'paragraphs/head-story' as paragraphhead-story; @use 'paragraphs/head' as paragraphhead; @use 'paragraphs/error' as paragrapherror; +@use 'paragraphs/person' as paragraphperson; @use 'paragraphs/hero' as paragraphhero; @use 'paragraphs/html' as paragraphhtml; @use 'paragraphs/img' as paragraphimg; @@ -66,6 +68,7 @@ @use 'paragraphs/video' as paragraphvideo; @use 'teasers/chapter' as teaserchapter; +@use 'teasers/person' as teaserperson; @use 'teasers/skill' as teaserskill; @use 'teasers/experience' as teaserexperience; @use 'teasers/game' as teasergame; diff --git a/assets/front/paragraphs/_head-movie.scss b/assets/front/paragraphs/_head-movie.scss index 26fd33e0a..9d4cbd75d 100644 --- a/assets/front/paragraphs/_head-movie.scss +++ b/assets/front/paragraphs/_head-movie.scss @@ -1,4 +1,6 @@ @use "../placeholders" as *; +@use "../mixins"; +@use "../variables"; @use "../icons"; .paragraph_head-movie { @@ -32,4 +34,16 @@ margin-bottom: 11px; @extend %video; } + + .actings { + ul { + display: grid; + grid-template-columns: 1fr; + gap: 12px; + + @include mixins.respond-to(md) { + grid-template-columns: repeat(8, 1fr); + } + } + } } \ No newline at end of file diff --git a/assets/front/paragraphs/_head-person.scss b/assets/front/paragraphs/_head-person.scss new file mode 100644 index 000000000..e856f5e25 --- /dev/null +++ b/assets/front/paragraphs/_head-person.scss @@ -0,0 +1,56 @@ +@use "../mixins"; +@use "../placeholders" as *; +@use "../variables"; +@use "../icons"; + +@use "sass:color"; + +.paragraph_head-person { + .first { + @extend %head; + height: 300px; + + } + .casting{ + ul { + grid-area: list; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + align-items: start; + grid-template-rows: 1fr; + gap: 12px; + height: auto; + + @include mixins.respond-to(md) { + grid-template-columns: repeat(3, 1fr); + } + } + + li { + display: flex; + flex-direction: column; + height: 550px; + + &.teaser-movie { + background-color: color.scale(variables.$colorbg, $lightness: 15%); + + &:nth-child(even) { + background-color: color.scale(variables.$colorbg, $lightness: 10%); + } + + .background { + background-position: center; + background-repeat: no-repeat; + background-size: contain; + background-color: #000; + min-height: 324px; + display: flex; + } + } + + .wrapper { + padding: 1rem; + } + } + } +} \ No newline at end of file diff --git a/assets/front/paragraphs/_person.scss b/assets/front/paragraphs/_person.scss new file mode 100644 index 000000000..66347c86a --- /dev/null +++ b/assets/front/paragraphs/_person.scss @@ -0,0 +1,20 @@ +@use "../mixins"; +@use "../variables"; + +@use "sass:color"; + +.paragraph_person { + .wrapper {} + + .title {} + + ul { + display: grid; + grid-template-columns: 1fr; + gap: 12px; + + @include mixins.respond-to(md) { + grid-template-columns: repeat(8, 1fr); + } + } +} \ No newline at end of file diff --git a/assets/front/teasers/_person.scss b/assets/front/teasers/_person.scss new file mode 100644 index 000000000..8752d1ebe --- /dev/null +++ b/assets/front/teasers/_person.scss @@ -0,0 +1,20 @@ +@use "../placeholders" as *; + +.teaser-person { + @extend %teaser; + + .background { + width: 120px; + height: 120px; + border-radius: 50%; + align-items: flex-end; + justify-content: flex-start; + + .movies { + background-color: #363636; + color: yellow; + padding: 5px; + margin: 5px; + } + } +} \ No newline at end of file diff --git a/docker-compose-lampy.yml b/docker-compose-lampy.yml index a72d84740..31213d9c7 100644 --- a/docker-compose-lampy.yml +++ b/docker-compose-lampy.yml @@ -1,13 +1,37 @@ networks: - net: - driver: overlay - attachable: true proxylampy: external: true serverlampy: external: true services: + messenger: + image: labstag/messenger:latest + command: ["/usr/local/bin/start-messenger.sh"] + user: "${UID:-1000}:${GID:-1000}" + environment: + TZ: Europe/Paris + APP_SECRET: "CHANGEME" + MAILER_DSN: "smtp://mailtest:1025" + MESSENGER_TRANSPORT_DSN: "doctrine://default" + LOCK_DNS: semaphore + DATABASE_BDD: labstag_bdd + DATABASE_USER: labstag + DATABASE_PASSWORD: password + DATABASE_URL: "mysqli://labstag:password@mariadb:3306/labstag_bdd" + HOME: "/var/www" + volumes: + - ${PWD}/apps:/var/www/:rw + - ${PWD}/docker/start-messenger.sh:/usr/local/bin/start-messenger.sh:ro + - ${PWD}/conf/php.ini-development://usr/local/etc/php/conf.d/php.ini + - ${PWD}/conf/apache2/000-default.conf:/etc/apache2/sites-available/000-default.conf:ro + - ${PWD}/docker/supervisor:/etc/supervisor:ro + deploy: + replicas: 1 + restart_policy: + condition: any + networks: + - serverlampy www: image: koromerzhin/php:8.4.13-apache-symfony user: "${UID:-1000}:${GID:-1000}" @@ -29,7 +53,6 @@ services: - ${PWD}/conf/apache2/apache2.conf:/etc/apache2/apache2.conf:ro networks: - serverlampy - - net - proxylampy deploy: labels: diff --git a/docker/start-messenger.sh b/docker/start-messenger.sh new file mode 100755 index 000000000..2ab3e3ac5 --- /dev/null +++ b/docker/start-messenger.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +echo "🚀 Démarrage Messenger" + +# Attente base de données +until symfony console about >/dev/null 2>&1; do + echo "⏳ Attente DB..." + sleep 2 +done + +echo "▶️ Lancement Supervisor" +exec /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf \ No newline at end of file diff --git a/docker/supervisor/conf.d/messenger.conf b/docker/supervisor/conf.d/messenger.conf new file mode 100644 index 000000000..e073f82fe --- /dev/null +++ b/docker/supervisor/conf.d/messenger.conf @@ -0,0 +1,10 @@ +[program:messenger] +command=symfony console messenger:consume --all +directory=/var/www +autostart=true +autorestart=true +startsecs=0 +numprocs=1 + +stdout_logfile=/dev/stdout +stderr_logfile=/dev/stderr \ No newline at end of file diff --git a/docker/supervisor/supervisord.conf b/docker/supervisor/supervisord.conf new file mode 100644 index 000000000..4c2329522 --- /dev/null +++ b/docker/supervisor/supervisord.conf @@ -0,0 +1,5 @@ +[supervisord] +nodaemon=true + +[include] +files = /etc/supervisor/conf.d/*.conf \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 375df59aa..10e9e425e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,13 +57,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -72,9 +72,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "dev": true, "license": "MIT", "engines": { @@ -82,21 +82,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -113,14 +113,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -143,13 +143,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -160,18 +160,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", + "@babel/traverse": "^7.29.0", "semver": "^6.3.1" }, "engines": { @@ -200,17 +200,17 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" + "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -241,29 +241,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -286,9 +286,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -314,15 +314,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -376,42 +376,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -488,14 +488,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -518,13 +518,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -534,13 +534,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -583,15 +583,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -601,14 +601,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { @@ -635,13 +635,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -651,14 +651,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -668,14 +668,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -685,18 +685,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -706,14 +706,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -740,14 +740,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -773,14 +773,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -806,14 +806,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -823,13 +823,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -890,13 +890,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -922,13 +922,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -971,14 +971,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -988,16 +988,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1024,14 +1024,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1057,13 +1057,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1073,13 +1073,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1089,17 +1089,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1126,13 +1126,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1142,13 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1175,14 +1175,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1192,15 +1192,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1226,13 +1226,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1242,14 +1242,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1291,13 +1291,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1372,14 +1372,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1406,14 +1406,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1423,76 +1423,76 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", + "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/compat-data": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.6", + "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.6", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", @@ -1523,33 +1523,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -1557,9 +1557,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -1570,49 +1570,40 @@ "node": ">=6.9.0" } }, - "node_modules/@cacheable/memoize": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.3.tgz", - "integrity": "sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cacheable/utils": "^2.0.3" - } - }, "node_modules/@cacheable/memory": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.4.tgz", - "integrity": "sha512-cCmJKCKlT1t7hNBI1+gFCwmKFd9I4pS3zqBeNGXTSODnpa0EeDmORHY8oEMTuozfdg3cgsVh8ojLaPYb6eC7Cg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.8.tgz", + "integrity": "sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/utils": "^2.2.0", - "@keyv/bigmap": "^1.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.3" + "@cacheable/utils": "^2.4.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" } }, "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.1.0.tgz", - "integrity": "sha512-MX7XIUNwVRK+hjZcAbNJ0Z8DREo+Weu9vinBOjGU1thEi9F6vPhICzBbk4CCf3eEefKRz7n6TfZXwUFZTSgj8Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.12.2" + "hashery": "^1.4.0", + "hookified": "^1.15.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "keyv": "^5.5.3" + "keyv": "^5.6.0" } }, "node_modules/@cacheable/memory/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -1620,19 +1611,20 @@ } }, "node_modules/@cacheable/utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.2.0.tgz", - "integrity": "sha512-7xaQayO3msdVcxXLYcLU5wDqJBNdQcPPPHr6mdTEIQI7N7TbtSVVTpWOTfjyhg0L6AQwQdq7miKdWtTDBoBldQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-eiFgzCbIneyMlLOmNG4g9xzF7Hv3Mga4LjxjcSC/ues6VYq2+gUbQI8JqNuw/ZM8tJIeIaBGpswAsqV2V7ApgA==", "dev": true, "license": "MIT", "dependencies": { - "keyv": "^5.5.3" + "hashery": "^1.5.1", + "keyv": "^5.6.0" } }, "node_modules/@cacheable/utils/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -2507,6 +2499,13 @@ "es-toolkit": "1.39.5" } }, + "node_modules/@colordx/core": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.4.3.tgz", + "integrity": "sha512-kIxYSfA5T8HXjav55UaaH/o/cKivF6jCCGIb8eqtcsfI46wsvlSiT8jMDyrl779qLec3c2c2oHBZo4oAhvbjrQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2609,9 +2608,9 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.9.tgz", - "integrity": "sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", + "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2628,7 +2627,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.14.0", + "qs": "~6.14.1", "safe-buffer": "^5.1.2", "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", @@ -2642,6 +2641,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -2691,9 +2691,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", - "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", "optional": true, @@ -2703,10 +2703,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -2725,7 +2724,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2738,22 +2736,20 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2763,7 +2759,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2773,7 +2768,6 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -2783,20 +2777,19 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -2810,7 +2803,6 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2823,7 +2815,6 @@ "version": "9.36.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", - "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2836,7 +2827,6 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2846,7 +2836,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.15.2", @@ -2875,34 +2864,44 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -2916,7 +2915,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -3336,14 +3334,14 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.1.tgz", - "integrity": "sha512-rOcLotrptYIy59SGQhKlU0xBg1vvcVl2FdPIEclUvKHh0wo12OfGkId/01PIMJ/V+EimJ77t085YabgnQHBa5A==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" @@ -3361,13 +3359,13 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.20.tgz", - "integrity": "sha512-HDGiWh2tyRZa0M1ZnEIUCQro25gW/mN8ODByicQrbR1yHx4hT+IOpozCMi5TgBtUdklLwRI2mv14eNpftDluEw==", + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3383,9 +3381,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.1.tgz", - "integrity": "sha512-hzGKIkfomGFPgxKmnKEKeA+uCYBqC+TKtRx5LgyHRCrF6S2MliwRIjp3sUaWwVzMp7ZXVs8elB0Tfe682Rpg4w==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { @@ -3393,7 +3391,7 @@ "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", - "mute-stream": "^3.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.3" @@ -3446,16 +3444,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", - "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3485,13 +3473,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.22", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.22.tgz", - "integrity": "sha512-8yYZ9TCbBKoBkzHtVNMF6PV1RJEUvMlhvmS3GxH4UvXMEHlS45jFyqFy0DU+K42jBs5slOaA78xGqqqWAx3u6A==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", "@inquirer/type": "^3.0.10" }, @@ -3508,13 +3496,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.22.tgz", - "integrity": "sha512-9XOjCjvioLjwlq4S4yXzhvBmAXj5tG+jvva0uqedEsQ9VD8kZ+YT7ap23i0bIXOtow+di4+u3i6u26nDqEfY4Q==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, @@ -3563,13 +3551,13 @@ } }, "node_modules/@inquirer/input": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.0.tgz", - "integrity": "sha512-h4fgse5zeGsBSW3cRQqu9a99OXRdRsNCvHoBqVmz40cjYjYFzcfwD0KA96BHIPlT7rZw0IpiefQIqXrjbzjS4Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3585,13 +3573,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.22.tgz", - "integrity": "sha512-oAdMJXz++fX58HsIEYmvuf5EdE8CfBHHXjoi9cTcQzgFoHGZE+8+Y3P38MlaRMeBvAVnkWtAxMUF6urL2zYsbg==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3607,14 +3595,14 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.22.tgz", - "integrity": "sha512-CbdqK1ioIr0Y3akx03k/+Twf+KSlHjn05hBL+rmubMll7PsDTGH0R4vfFkr+XrkB0FOHrjIwVP9crt49dgt+1g==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3630,22 +3618,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.0.tgz", - "integrity": "sha512-X2HAjY9BClfFkJ2RP3iIiFxlct5JJVdaYYXhA7RKxsbc9KL+VbId79PSoUGH/OLS011NFbHHDMDcBKUj3T89+Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.3.1", - "@inquirer/confirm": "^5.1.20", - "@inquirer/editor": "^4.2.22", - "@inquirer/expand": "^4.0.22", - "@inquirer/input": "^4.3.0", - "@inquirer/number": "^3.0.22", - "@inquirer/password": "^4.0.22", - "@inquirer/rawlist": "^4.1.10", - "@inquirer/search": "^3.2.1", - "@inquirer/select": "^4.4.1" + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" }, "engines": { "node": ">=18" @@ -3660,13 +3648,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.10.tgz", - "integrity": "sha512-Du4uidsgTMkoH5izgpfyauTL/ItVHOLsVdcY+wGeoGaG56BV+/JfmyoQGniyhegrDzXpfn3D+LFHaxMDRygcAw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, @@ -3683,13 +3671,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.1.tgz", - "integrity": "sha512-cKiuUvETublmTmaOneEermfG2tI9ABpb7fW/LqzZAnSv4ZaJnbEis05lOkiBuYX5hNdnX0Q9ryOQyrNidb55WA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" @@ -3707,14 +3695,14 @@ } }, "node_modules/@inquirer/select": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.1.tgz", - "integrity": "sha512-E9hbLU4XsNe2SAOSsFrtYtYQDVi1mfbqJrPDvXKnGlnRiApBdWMJz7r3J2Ff38AqULkPUD3XjQMD4492TymD7Q==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" @@ -3749,35 +3737,50 @@ } } }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { @@ -3917,10 +3920,37 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jscpd/badge-reporter": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/badge-reporter/-/badge-reporter-4.0.5.tgz", + "integrity": "sha512-SLVhP00R9lkQ//Ivaanfm7k0L9sewpBven670kk1uGec2SWUOa7MVQcuad/TV59KEZ73UIC1lXvi6O9hAnbpUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "badgen": "^3.2.3", + "colors": "^1.4.0", + "fs-extra": "^11.2.0" + } + }, + "node_modules/@jscpd/badge-reporter/node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@jscpd/core": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/core/-/core-4.0.1.tgz", - "integrity": "sha512-6Migc68Z8p7q5xqW1wbF3SfIbYHPQoiLHPbJb1A1Z1H9DwImwopFkYflqRDpuamLd0Jfg2jx3ZBmHQt21NbD1g==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/core/-/core-4.0.5.tgz", + "integrity": "sha512-Udvym21nWzxjYRVXwwpYNBqZ6b50QV2zHN3fFNzOPPg4cfQVYOZerILB7xNDUsXHC1PCr/N52Tq3q7AElvjWWA==", "dev": true, "license": "MIT", "dependencies": { @@ -3928,14 +3958,14 @@ } }, "node_modules/@jscpd/finder": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/finder/-/finder-4.0.1.tgz", - "integrity": "sha512-TcCT28686GeLl87EUmrBXYmuOFELVMDwyjKkcId+qjNS1zVWRd53Xd5xKwEDzkCEgen/vCs+lorLLToolXp5oQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/finder/-/finder-4.0.5.tgz", + "integrity": "sha512-/2VkRoVrrfya+51sitZo5I9MdwsRaPKB8X3L3khAYoHFXk4L/mUuG81RmGazDHjUIGg22ItlkQtwzorNZ2+aPw==", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", - "@jscpd/tokenizer": "4.0.1", + "@jscpd/core": "4.0.5", + "@jscpd/tokenizer": "4.0.5", "blamer": "^1.0.6", "bytes": "^3.1.2", "cli-table3": "^0.6.5", @@ -3963,9 +3993,9 @@ } }, "node_modules/@jscpd/finder/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -3978,9 +4008,9 @@ } }, "node_modules/@jscpd/html-reporter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/html-reporter/-/html-reporter-4.0.1.tgz", - "integrity": "sha512-M9fFETNvXXuy4fWv0M2oMluxwrQUBtubxCHaWw21lb2G8A6SE19moe3dUkluZ/3V4BccywfeF9lSEUg84heLww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/html-reporter/-/html-reporter-4.0.5.tgz", + "integrity": "sha512-drK2J8KyPIW9wvaElSIobZFp4dBO9GA++JW4gx3oihvLdDSp8qSo/CNqH47Dw0XkjQTxND3j/+Wz5JWvYRBgFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3990,9 +4020,9 @@ } }, "node_modules/@jscpd/html-reporter/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -4005,13 +4035,13 @@ } }, "node_modules/@jscpd/tokenizer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/tokenizer/-/tokenizer-4.0.1.tgz", - "integrity": "sha512-l/CPeEigadYcQUsUxf1wdCBfNjyAxYcQU04KciFNmSZAMY+ykJ8fZsiuyfjb+oOuDgsIPZZ9YvbvsCr6NBXueg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/tokenizer/-/tokenizer-4.0.5.tgz", + "integrity": "sha512-WzRujQtN5WedxZVDKuoanxmKAFrxcLrHpcA6kaM4z8AhGtWXZ325yseqgL5TZ8OK7Auwu7kQLlqhfk05fGYG7A==", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", + "@jscpd/core": "4.0.5", "reprism": "^0.0.11", "spark-md5": "^3.0.2" } @@ -4063,9 +4093,9 @@ "license": "ISC" }, "node_modules/@mapbox/tiny-sdf": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", - "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", + "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", "license": "BSD-2-Clause" }, "node_modules/@mapbox/unitbezier": { @@ -4094,10 +4124,16 @@ "node": ">=6.0.0" } }, + "node_modules/@maplibre/geojson-vt": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz", + "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==", + "license": "ISC" + }, "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "23.3.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-23.3.0.tgz", - "integrity": "sha512-IGJtuBbaGzOUgODdBRg66p8stnwj9iDXkgbYKoYcNiiQmaez5WVRfXm4b03MCDwmZyX93csbfHFWEJJYHnn5oA==", + "version": "24.4.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.4.1.tgz", + "integrity": "sha512-UKhA4qv1h30XT768ccSv5NjNCX+dgfoq2qlLVmKejspPcSQTYD4SrVucgqegmYcKcmwf06wcNAa/kRd0NHWbUg==", "license": "ISC", "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", @@ -4114,25 +4150,34 @@ "gl-style-validate": "dist/gl-style-validate.mjs" } }, + "node_modules/@maplibre/mlt": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.1.9.tgz", + "integrity": "sha512-g/tD8EYJB97udq33ipuJ9a4Q7fcbZnTEnUrgnEc/tLMmEL+zaCbR+X5fkDBO2dgpaAMsLH179qE3UXg2N0Nc/g==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0" + } + }, "node_modules/@maplibre/vt-pbf": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.0.3.tgz", - "integrity": "sha512-YsW99BwnT+ukJRkseBcLuZHfITB4puJoxnqPVjo72rhW/TaawVYsgQHcqWLzTxqknttYoDpgyERzWSa/XrETdA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.0.tgz", + "integrity": "sha512-jIvp8F5hQCcreqOOpEt42TJMUlsrEcpf/kI1T2v85YrQRV6PPXUcEXUg5karKtH6oh47XJZ4kHu56pUkOuqA7w==", "license": "MIT", "dependencies": { "@mapbox/point-geometry": "^1.1.0", "@mapbox/vector-tile": "^2.0.4", - "@types/geojson-vt": "3.2.5", + "@maplibre/geojson-vt": "^5.0.4", + "@types/geojson": "^7946.0.16", "@types/supercluster": "^7.1.3", - "geojson-vt": "^4.0.2", "pbf": "^4.0.1", "supercluster": "^8.0.1" } }, "node_modules/@maptiler/client": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@maptiler/client/-/client-2.5.1.tgz", - "integrity": "sha512-2rveqohOu3xv16EX65rFUQF8fpPppefrGkvUEtZOx50EDHFxrhEVjKM0p95TuT0RLygxF/sw4vAqUFCBOnPbiw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@maptiler/client/-/client-2.7.0.tgz", + "integrity": "sha512-bA6hed48LBDxDZBw4rzoWEn4PC64u4qc4uybzEsluN5U65+OwM2ZBPkWxVGBzJAb7oAeyqjYtGLL2H1wJez2Ow==", "license": "BSD-3-Clause", "dependencies": { "quick-lru": "^7.0.0" @@ -4149,20 +4194,27 @@ } }, "node_modules/@maptiler/sdk": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@maptiler/sdk/-/sdk-3.8.0.tgz", - "integrity": "sha512-oXLlSyJhKADB1KTfxj5bhnRml3nrvBerhuuo1v+rDJKrUHqQpVPj6PS+z809D/+UB9ZwzzHOBeFZP3vYCK3U5g==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@maptiler/sdk/-/sdk-3.11.2.tgz", + "integrity": "sha512-GCjamP5xnQ7l5MduUjd/zsxWv8sw48MV+pg7WBbhZeQu2aS2ayyTr1gEnWFmvT4REZnhhg2S7wJW0M70BiwXoA==", "license": "BSD-3-Clause", "dependencies": { - "@maplibre/maplibre-gl-style-spec": "~23.3.0", - "@maptiler/client": "~2.5.1", + "@maplibre/maplibre-gl-style-spec": "~24.4.1", + "@maptiler/client": "~2.6.0 || ~2.7.0", + "eslint-plugin-compat": "^6.1.0", "events": "^3.3.0", - "gl-matrix": "^3.4.3", + "gl-matrix": "^3.4.4", "js-base64": "^3.7.7", - "maplibre-gl": "~5.6.0", + "maplibre-gl": "~5.16.0", "uuid": "^11.0.5" } }, + "node_modules/@mdn/browser-compat-data": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.1.5.tgz", + "integrity": "sha512-PzdZZzRhcXvKB0begee28n5lvwAcinGKYuLZOVxHAZm+n7y01ddEGfdS1ZXRuVcV+ndG6mSEAE8vgudom5UjYg==", + "license": "CC0-1.0" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4261,9 +4313,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", - "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -4376,16 +4428,17 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.6.tgz", - "integrity": "sha512-FO+UgZCUu+pPnZAR+iKdUt64kPE7QW7ciqpldaMXaNzixz5Jld8dJ31LAUewk0cfSRkNSRKyqG438ba9c/qDlQ==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", + "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^11.0.2", + "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, "engines": { @@ -4393,9 +4446,9 @@ } }, "node_modules/@octokit/request-error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.2.tgz", - "integrity": "sha512-U8piOROoQQUyExw5c6dTkU3GKxts5/ERRThIauNL7yaRoeXW0q/5bgHWT7JfWBw1UyrbK8ERId2wVkcB32n0uQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "dev": true, "license": "MIT", "dependencies": { @@ -4447,18 +4500,18 @@ "license": "Apache-2.0" }, "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.3", "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">= 10.0.0" @@ -4468,25 +4521,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", "cpu": [ "arm64" ], @@ -4505,9 +4558,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", "cpu": [ "arm64" ], @@ -4526,9 +4579,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", "cpu": [ "x64" ], @@ -4547,9 +4600,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", "cpu": [ "x64" ], @@ -4568,9 +4621,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", "cpu": [ "arm" ], @@ -4589,9 +4642,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", "cpu": [ "arm" ], @@ -4610,9 +4663,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", "cpu": [ "arm64" ], @@ -4631,9 +4684,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", "cpu": [ "arm64" ], @@ -4652,9 +4705,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", "cpu": [ "x64" ], @@ -4673,9 +4726,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", "cpu": [ "x64" ], @@ -4694,9 +4747,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", "cpu": [ "arm64" ], @@ -4715,9 +4768,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", "cpu": [ "ia32" ], @@ -4736,9 +4789,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", "cpu": [ "x64" ], @@ -4771,9 +4824,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -4927,9 +4980,9 @@ } }, "node_modules/@symfony/webpack-encore/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -4962,9 +5015,9 @@ "license": "MIT" }, "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -4996,7 +5049,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/geojson": { @@ -5073,7 +5125,6 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, "license": "MIT" }, "node_modules/@types/leaflet": { @@ -5108,13 +5159,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", - "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/parse-path": { @@ -5168,9 +5219,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", - "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -5196,9 +5247,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", "license": "ISC" }, "node_modules/@webassemblyjs/ast": { @@ -5424,19 +5475,18 @@ "license": "Apache-2.0" }, "node_modules/a11y-dialog": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/a11y-dialog/-/a11y-dialog-8.1.4.tgz", - "integrity": "sha512-CgaQfoTg9t+O8vArlNAYN7Gzv6h1bpWRqggzCtng6TQ2im6XCpUQI+GWlPvQdovQtwzJN6MydxipXKB8qP5Zxw==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/a11y-dialog/-/a11y-dialog-8.1.5.tgz", + "integrity": "sha512-SlFk3QSqeuvmN/anaIteUkB6ipBHoG1jq5gfQZU2kqvbkDW3Iab7SNufj4io4e8StvuIshD+loJnsQgTEvq6dA==", "license": "MIT", "dependencies": { "focusable-selectors": "^0.8.0" } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5449,7 +5499,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -5494,10 +5543,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -5529,9 +5577,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -5666,7 +5714,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/array-union": { @@ -5726,6 +5773,21 @@ "node": ">=0.8" } }, + "node_modules/ast-metadata-inferer": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz", + "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==", + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^5.6.19" + } + }, + "node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz", + "integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==", + "license": "CC0-1.0" + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -5787,9 +5849,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "dev": true, "funding": [ { @@ -5807,10 +5869,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -5860,14 +5921,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { @@ -5889,13 +5950,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5914,6 +5975,13 @@ "node": ">= 10.0.0" } }, + "node_modules/badgen": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/badgen/-/badgen-3.2.3.tgz", + "integrity": "sha512-svDuwkc63E/z0ky3drpUppB83s/nlgDciH9m+STwwQoWyq7yCgew1qEfJ+9axkKdNq7MskByptWUN9j1PGMwFA==", + "dev": true, + "license": "MIT" + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -5928,7 +5996,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -5953,19 +6020,21 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.26", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.26.tgz", - "integrity": "sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==", - "dev": true, + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", + "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", "dev": true, "license": "MIT", "engines": { @@ -6041,10 +6110,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -6065,10 +6133,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", - "dev": true, + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -6085,11 +6152,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -6196,24 +6263,23 @@ } }, "node_modules/cacheable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.1.1.tgz", - "integrity": "sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.4.tgz", + "integrity": "sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/memoize": "^2.0.3", - "@cacheable/memory": "^2.0.3", - "@cacheable/utils": "^2.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.3", - "qified": "^0.5.0" + "@cacheable/memory": "^2.0.8", + "@cacheable/utils": "^2.4.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.9.0" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -6265,7 +6331,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -6297,10 +6362,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", - "dev": true, + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", "funding": [ { "type": "opencollective", @@ -6423,9 +6487,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -6571,9 +6635,9 @@ } }, "node_modules/cli-spinners": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.3.0.tgz", - "integrity": "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, "license": "MIT", "engines": { @@ -6682,9 +6746,9 @@ } }, "node_modules/color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -6819,13 +6883,12 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true, "license": "MIT" }, @@ -6870,13 +6933,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", - "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.26.3" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", @@ -6891,9 +6954,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6921,7 +6984,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -6933,9 +6995,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", - "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", "dev": true, "license": "ISC", "engines": { @@ -6946,30 +7008,30 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12 || >=16" + "node": ">=12" } }, "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", + "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.33", + "postcss": "^8.4.40", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "semver": "^7.6.3" }, "engines": { "node": ">= 18.12.0" @@ -6979,7 +7041,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "webpack": "^5.27.0" }, "peerDependenciesMeta": { @@ -6992,9 +7054,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -7005,15 +7067,15 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.2.tgz", - "integrity": "sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.4.tgz", + "integrity": "sha512-2iACis+P8qdLj1tHcShtztkGhCNIRUajJj7iX0IM9a5FA0wXGwjV8Nf6+HsBjBfb4LO8TTAVoetBbM54V6f3+Q==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "cssnano": "^7.0.4", - "jest-worker": "^29.7.0", + "jest-worker": "^30.0.5", "postcss": "^8.4.40", "schema-utils": "^4.2.0", "serialize-javascript": "^6.0.2" @@ -7067,14 +7129,14 @@ } }, "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" @@ -7107,13 +7169,13 @@ } }, "node_modules/cssnano": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.2.tgz", - "integrity": "sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.9.tgz", + "integrity": "sha512-uPR75+5Dk/WJ/YSPR1/YDHdwMM9c5FsaARljfKWgeCKLKOtJ0we21xy/RcCjn53fZnD/f6yYEIZ8pu18+GnbNQ==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-preset-default": "^7.0.10", + "cssnano-preset-default": "^7.0.17", "lilconfig": "^3.1.3" }, "engines": { @@ -7124,65 +7186,65 @@ "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/cssnano-preset-default": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz", - "integrity": "sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA==", + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.17.tgz", + "integrity": "sha512-11qO63A+czwguQFJCaTdICvbaxn0pJzz/XghLlv+OT7WyToDxAMR0Xb3/26/l0y0hQJywwNbj/SLSQlGBHE1OA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.1", + "cssnano-utils": "^5.0.3", "postcss-calc": "^10.1.1", - "postcss-colormin": "^7.0.5", - "postcss-convert-values": "^7.0.8", - "postcss-discard-comments": "^7.0.5", - "postcss-discard-duplicates": "^7.0.2", - "postcss-discard-empty": "^7.0.1", - "postcss-discard-overridden": "^7.0.1", - "postcss-merge-longhand": "^7.0.5", - "postcss-merge-rules": "^7.0.7", - "postcss-minify-font-values": "^7.0.1", - "postcss-minify-gradients": "^7.0.1", - "postcss-minify-params": "^7.0.5", - "postcss-minify-selectors": "^7.0.5", - "postcss-normalize-charset": "^7.0.1", - "postcss-normalize-display-values": "^7.0.1", - "postcss-normalize-positions": "^7.0.1", - "postcss-normalize-repeat-style": "^7.0.1", - "postcss-normalize-string": "^7.0.1", - "postcss-normalize-timing-functions": "^7.0.1", - "postcss-normalize-unicode": "^7.0.5", - "postcss-normalize-url": "^7.0.1", - "postcss-normalize-whitespace": "^7.0.1", - "postcss-ordered-values": "^7.0.2", - "postcss-reduce-initial": "^7.0.5", - "postcss-reduce-transforms": "^7.0.1", - "postcss-svgo": "^7.1.0", - "postcss-unique-selectors": "^7.0.4" + "postcss-colormin": "^7.0.10", + "postcss-convert-values": "^7.0.12", + "postcss-discard-comments": "^7.0.8", + "postcss-discard-duplicates": "^7.0.4", + "postcss-discard-empty": "^7.0.3", + "postcss-discard-overridden": "^7.0.3", + "postcss-merge-longhand": "^7.0.7", + "postcss-merge-rules": "^7.0.11", + "postcss-minify-font-values": "^7.0.3", + "postcss-minify-gradients": "^7.0.5", + "postcss-minify-params": "^7.0.9", + "postcss-minify-selectors": "^7.1.2", + "postcss-normalize-charset": "^7.0.3", + "postcss-normalize-display-values": "^7.0.3", + "postcss-normalize-positions": "^7.0.4", + "postcss-normalize-repeat-style": "^7.0.4", + "postcss-normalize-string": "^7.0.3", + "postcss-normalize-timing-functions": "^7.0.3", + "postcss-normalize-unicode": "^7.0.9", + "postcss-normalize-url": "^7.0.3", + "postcss-normalize-whitespace": "^7.0.3", + "postcss-ordered-values": "^7.0.4", + "postcss-reduce-initial": "^7.0.9", + "postcss-reduce-transforms": "^7.0.3", + "postcss-svgo": "^7.1.3", + "postcss-unique-selectors": "^7.0.7" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/cssnano-utils": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", - "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.3.tgz", + "integrity": "sha512-ynIREMICLxkxm7e9bCR9sh75s4Q5drICi0ua1yxo5jH2XPBqSKkl4dOh4EbFqtUmnTMhRffHgYL0EKKkMjtJTg==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/csso": { @@ -7357,9 +7419,9 @@ } }, "node_modules/cypress/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -7409,9 +7471,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "dev": true, "license": "MIT" }, @@ -7433,9 +7495,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -7449,13 +7511,12 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, "license": "MIT" }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -7470,9 +7531,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "engines": { @@ -7496,9 +7557,9 @@ } }, "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "dev": true, "license": "MIT" }, @@ -7563,17 +7624,13 @@ "license": "MIT" }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/devlop": { @@ -7701,9 +7758,9 @@ } }, "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "version": "17.2.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz", + "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7782,10 +7839,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.250", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz", - "integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==", - "dev": true, + "version": "1.5.351", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.351.tgz", + "integrity": "sha512-9D7Iqx8RImSvCnOsj86rCH6eQjZFQoM04Jn6HnZVM0Nu/G58/gmKYQ1d12MZTbjQbQSTGI8nwEy07ErsA2slLA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7816,14 +7872,14 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -7867,9 +7923,9 @@ } }, "node_modules/envinfo": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.20.0.tgz", - "integrity": "sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -7969,7 +8025,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -8019,7 +8074,6 @@ "version": "9.36.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", - "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", @@ -8076,11 +8130,43 @@ } } }, + "node_modules/eslint-plugin-compat": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.2.1.tgz", + "integrity": "sha512-gLKqUH+lQcCL+HzsROUjBDvakc5Zaga51Y4ZAkPCXc41pzKBfyluqTr2j8zOx8QQQb7zyglu1LVoL5aSNWf2SQ==", + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^6.1.1", + "ast-metadata-inferer": "^0.8.1", + "browserslist": "^4.25.2", + "find-up": "^5.0.0", + "globals": "^15.7.0", + "lodash.memoize": "^4.1.2", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=18.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-compat/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -8097,7 +8183,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8110,7 +8195,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -8126,7 +8210,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -8143,7 +8226,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -8156,14 +8238,12 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -8176,7 +8256,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8186,7 +8265,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -8199,7 +8277,6 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", @@ -8228,10 +8305,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -8244,7 +8320,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -8257,7 +8332,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -8267,7 +8341,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -8294,9 +8367,9 @@ "license": "MIT" }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "dev": true, "license": "MIT" }, @@ -8421,7 +8494,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -8458,20 +8530,18 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -8496,9 +8566,9 @@ } }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -8553,6 +8623,24 @@ "pend": "~1.2.0" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -8573,7 +8661,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" @@ -8663,7 +8750,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -8696,7 +8782,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -8707,10 +8792,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "license": "ISC" }, "node_modules/focusable-selectors": { @@ -8730,9 +8814,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -8816,9 +8900,9 @@ "license": "ISC" }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { @@ -8947,16 +9031,6 @@ "git-up": "^8.1.0" } }, - "node_modules/gitignore-to-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz", - "integrity": "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.4 <5 || >=6.9" - } - }, "node_modules/gl-matrix": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", @@ -8967,7 +9041,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -8989,7 +9063,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -9073,7 +9146,6 @@ "version": "15.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -9195,14 +9267,27 @@ "engines": { "node": ">=8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dev": true, "license": "MIT", "dependencies": { @@ -9449,9 +9534,9 @@ } }, "node_modules/hookified": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", - "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", "dev": true, "license": "MIT" }, @@ -9513,9 +9598,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", - "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", "dev": true, "license": "MIT", "optional": true, @@ -9630,9 +9715,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "dependencies": { @@ -9684,16 +9769,15 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true, "license": "MIT" }, @@ -9701,7 +9785,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -9807,7 +9890,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -9890,9 +9972,9 @@ } }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "dev": true, "license": "MIT", "engines": { @@ -9907,13 +9989,13 @@ "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -9966,7 +10048,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9986,7 +10067,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -10224,7 +10304,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/isobject": { @@ -10261,22 +10340,32 @@ "node": "^18.17 || >=20.6.1" } }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.3.0", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-util/node_modules/ansi-styles": { @@ -10312,22 +10401,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10372,19 +10445,20 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^8.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-worker/node_modules/has-flag": { @@ -10414,10 +10488,10 @@ } }, "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -10444,10 +10518,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -10464,42 +10537,42 @@ "license": "MIT" }, "node_modules/jscpd": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/jscpd/-/jscpd-4.0.5.tgz", - "integrity": "sha512-AzJlSLvKtXYkQm93DKE1cRN3rf6pkpv3fm5TVuvECwoqljQlCM/56ujHn9xPcE7wyUnH5+yHr7tcTiveIoMBoQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/jscpd/-/jscpd-4.0.9.tgz", + "integrity": "sha512-fp6Sh42W3mIPoQgZmgYmKDLQzEDnnX2vaGlTN4haILkB2vsi+ewcCHEtWR/2CR/QbsBvAvsNo8U5Sa+p9aHiGw==", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", - "@jscpd/finder": "4.0.1", - "@jscpd/html-reporter": "4.0.1", - "@jscpd/tokenizer": "4.0.1", + "@jscpd/badge-reporter": "4.0.5", + "@jscpd/core": "4.0.5", + "@jscpd/finder": "4.0.5", + "@jscpd/html-reporter": "4.0.5", + "@jscpd/tokenizer": "4.0.5", "colors": "^1.4.0", "commander": "^5.0.0", "fs-extra": "^11.2.0", - "gitignore-to-glob": "^0.3.0", - "jscpd-sarif-reporter": "4.0.3" + "jscpd-sarif-reporter": "4.0.7" }, "bin": { "jscpd": "bin/jscpd" } }, "node_modules/jscpd-sarif-reporter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jscpd-sarif-reporter/-/jscpd-sarif-reporter-4.0.3.tgz", - "integrity": "sha512-0T7KiWiDIVArvlBkvCorn2NFwQe7p7DJ37o4YFRuPLDpcr1jNHQlEfbFPw8hDdgJ4hpfby6A5YwyHqASKJ7drA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/jscpd-sarif-reporter/-/jscpd-sarif-reporter-4.0.7.tgz", + "integrity": "sha512-Q/VlfTI/Nbjc8dZ/2pDVIf1aRi2bM2CTYujcAoeYr7brRnS4o5ZeW86W8q7MM7cQu40gezlNckl+E9wKFSMFiA==", "dev": true, "license": "MIT", "dependencies": { "colors": "^1.4.0", "fs-extra": "^11.2.0", - "node-sarif-builder": "^2.0.3" + "node-sarif-builder": "^3.4.0" } }, "node_modules/jscpd-sarif-reporter/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -10522,9 +10595,9 @@ } }, "node_modules/jscpd/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -10553,7 +10626,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -10574,14 +10646,12 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, "license": "MIT" }, "node_modules/json-stringify-pretty-compact": { @@ -10597,6 +10667,13 @@ "dev": true, "license": "ISC" }, + "node_modules/json-with-bigint": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10611,9 +10688,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10660,7 +10737,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -10702,7 +10778,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -10777,9 +10852,9 @@ } }, "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "dev": true, "license": "MIT", "engines": { @@ -10809,7 +10884,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -10822,15 +10896,15 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, "node_modules/lodash.capitalize": { @@ -10872,14 +10946,12 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, "license": "MIT" }, "node_modules/lodash.once": { @@ -11136,9 +11208,9 @@ } }, "node_modules/maplibre-gl": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.6.2.tgz", - "integrity": "sha512-SEqYThhUCFf6Lm0TckpgpKnto5u4JsdPYdFJb6g12VtuaFsm3nYdBO+fOmnUYddc8dXihgoGnuXvPPooUcRv5w==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.16.0.tgz", + "integrity": "sha512-/VDY89nr4jgLJyzmhy325cG6VUI02WkZ/UfVuDbG/piXzo6ODnM+omDFIwWY8tsEsBG26DNDmNMn3Y2ikHsBiA==", "license": "BSD-3-Clause", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", @@ -11148,14 +11220,15 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^23.3.0", - "@maplibre/vt-pbf": "^4.0.3", + "@maplibre/maplibre-gl-style-spec": "^24.4.1", + "@maplibre/mlt": "^1.1.2", + "@maplibre/vt-pbf": "^4.2.0", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "3.2.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.2", "geojson-vt": "^4.0.2", - "gl-matrix": "^3.4.3", + "gl-matrix": "^3.4.4", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^4.0.1", @@ -11236,9 +11309,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -11399,9 +11472,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -11454,9 +11527,9 @@ } }, "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, @@ -12067,6 +12140,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -12114,9 +12200,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", - "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", "dev": true, "license": "MIT", "dependencies": { @@ -12135,10 +12221,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -12179,9 +12264,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "dev": true, "funding": [ { @@ -12201,7 +12286,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, "license": "MIT" }, "node_modules/neo-async": { @@ -12212,9 +12296,9 @@ "license": "MIT" }, "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", "dev": true, "license": "MIT", "engines": { @@ -12293,9 +12377,9 @@ } }, "node_modules/node-notifier/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -12309,6 +12393,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -12316,30 +12401,29 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "license": "MIT" }, "node_modules/node-sarif-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-2.0.3.tgz", - "integrity": "sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", + "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", "dev": true, "license": "MIT", "dependencies": { - "@types/sarif": "^2.1.4", - "fs-extra": "^10.0.0" + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/node-sarif-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -12348,7 +12432,7 @@ "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/normalize-path": { @@ -12361,16 +12445,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -12398,25 +12472,30 @@ } }, "node_modules/nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz", + "integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==", "dev": true, "license": "MIT", "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.2", + "citty": "^0.2.2", "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" + "tinyexec": "^1.1.1" }, "bin": { "nypm": "dist/cli.mjs" }, "engines": { - "node": "^14.16.0 || >=16.10.0" + "node": ">=18" } }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "dev": true, + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -12502,7 +12581,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -12659,14 +12737,14 @@ } }, "node_modules/ora/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { "node": ">=20" @@ -12676,13 +12754,13 @@ } }, "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -12719,7 +12797,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -12735,7 +12812,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -12817,7 +12893,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -12911,7 +12986,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12938,7 +13012,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12988,9 +13061,9 @@ "license": "MIT" }, "node_modules/perfect-debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", - "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", "dev": true, "license": "MIT" }, @@ -13005,17 +13078,16 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -13159,21 +13231,21 @@ } }, "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", + "confbox": "^0.2.4", + "exsolve": "^1.0.8", "pathe": "^2.0.3" } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "dev": true, "funding": [ { @@ -13217,100 +13289,100 @@ } }, "node_modules/postcss-colormin": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.5.tgz", - "integrity": "sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.10.tgz", + "integrity": "sha512-yFr6JezOolHLta/buLE71VKPh2mXursp4saVe98/ol8ZnEWhL+racShqPKlvd/DKWLre/39B6HhcMXf7RZ3hxg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "@colordx/core": "^5.4.3", + "browserslist": "^4.28.2", "caniuse-api": "^3.0.0", - "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-convert-values": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz", - "integrity": "sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.12.tgz", + "integrity": "sha512-xurKu5qqk4viR3Cp3p4xBR4KfnZm4w4ys6+UBwBmeuBSNkH7+DtLnYOYnOffgtE4yx8sH9S1VZ6RAAvROXzP2Q==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-comments": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz", - "integrity": "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.8.tgz", + "integrity": "sha512-CvvS5S9WrXblFXCEJ9nVo+4z+eA7zSC7Z88V1HEJuwlQhlFnYTIjg1xJY+BCUiG2bvICap2tXii4mP22BD108Q==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-duplicates": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", - "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.4.tgz", + "integrity": "sha512-VBNn1+EuMZkeGVVtz0gRfbNGtx9IFgAsAV+E2pHtXPrp4qfGBkhTIiAuE/wrb+Y6Pakg9NewAlfTpYIFAWODtw==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-empty": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", - "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.3.tgz", + "integrity": "sha512-M2pyjQCU+/7cMHVtL6bKTHjv0lZnPLMpicgr67Dlth7AbuV9gjVTtUqaRwn6Pp6BwSDspUzhz8SaUrRykJU5Dw==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-overridden": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", - "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.3.tgz", + "integrity": "sha512-aNovXo9UsZuRNLzHJtp13lHIvinDPfiXBPePpXkSjCbgp++iU2FqE+YxvjIsg6EdyPZsASFbfu+JcBFVsErXIQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-loader": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.0.tgz", - "integrity": "sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.1.tgz", + "integrity": "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow==", "dev": true, "license": "MIT", "dependencies": { @@ -13326,7 +13398,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" }, @@ -13340,9 +13412,9 @@ } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -13353,45 +13425,45 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", - "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.7.tgz", + "integrity": "sha512-b3mfYUxR388u5Pt0HPcVIUtUDn/k15UfTY9M+ORW+meCR6JLNxoZffiYvXyOYQoRYQNZyX/UFkMCM/mNHxe1qA==", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.5" + "stylehacks": "^7.0.11" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-merge-rules": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz", - "integrity": "sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.11.tgz", + "integrity": "sha512-SJUPM18g2BmPhf8BVlbwqWz4aK3pLu6u6xjfwEzra7xL6IBR10sUaiB++EzqcVfadPHrKBSMlNdP+XieykhI+Q==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.1", - "postcss-selector-parser": "^7.1.0" + "cssnano-utils": "^5.0.3", + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-font-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", - "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.3.tgz", + "integrity": "sha512-yilG/VOaNI74IylQvAQQxm3/wZVBkXyYUqNUAdxqwtbWUXPsbK1q8Ms0mL83v+f8YicgcyfYCRZtWACUdYajpA==", "dev": true, "license": "MIT", "dependencies": { @@ -13401,60 +13473,62 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-gradients": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", - "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.5.tgz", + "integrity": "sha512-YraROyQRg3BI1+Hg8E05B/JPdnTm8EDSVu4P2BxdM+CRiOyfmou809+chGIqo6fQqwjPGQ947nbGncSjmTU1WQ==", "dev": true, "license": "MIT", "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.1", + "@colordx/core": "^5.4.3", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-params": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz", - "integrity": "sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.9.tgz", + "integrity": "sha512-R8itbB8BhlpoYyBm1ou0dD+vJnQ3F6adQipR4UnkCHUwlo+S9WXJaDRg1RHjC8YVAtIdrQzSWvJl40HnGDTKjA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "cssnano-utils": "^5.0.1", + "browserslist": "^4.28.2", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-selectors": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", - "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.1.2.tgz", + "integrity": "sha512-aQtrEWKwqafNlExcKHQvPGsXR2+vlUqqJtf5XsCQcgsSb5PL4wlujWBYDJuWsP4UnQX1YHDHU8qRlD+1PzTQ+Q==", "dev": true, "license": "MIT", "dependencies": { + "browserslist": "^4.28.1", + "caniuse-api": "^3.0.0", "cssesc": "^3.0.0", - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-modules-extract-imports": { @@ -13521,22 +13595,22 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", - "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.3.tgz", + "integrity": "sha512-NoBfZu8PR4c2NlmjvrqQTzCzLY79hwcSRgNQ3ZiNK0ABzf9kYKloE/jNj+/8GQY1wsm8pRRgANk6ydLH8cwo0Q==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-display-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", - "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.3.tgz", + "integrity": "sha512-ldsCX0QIt05pKIOobZtVQ48wXJecr+czw4+e1/YjVhLMqslShgpVxgPtI2CefURR8oyVoYaU/l829MMwExDMLw==", "dev": true, "license": "MIT", "dependencies": { @@ -13546,13 +13620,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-positions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", - "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.4.tgz", + "integrity": "sha512-VEvlpeGd3Ju1Hqa/oN4jaP3+ms4laYwkEL9N9u+B6k54PZjXbW1n6wI+aVprf1BQXlCYpS5+1pl/7/vHiKgARg==", "dev": true, "license": "MIT", "dependencies": { @@ -13562,13 +13636,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", - "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.4.tgz", + "integrity": "sha512-6mPKlY/8cSaDHxX502wERADarJsccwlky6yIrOapHH2ZgfoKAV94SbiTKfKEs4EEpdazuc3J72WsqeYk7hp9+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13578,13 +13652,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-string": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", - "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.3.tgz", + "integrity": "sha512-HnEQPUchi1eznmDKEYrKUTqrprEq97SrpUYClgUkv7V2zRODD9DFoUsYU+m9ZOetmD5ku7fEMZB/lwy8IT6xVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13594,13 +13668,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", - "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.3.tgz", + "integrity": "sha512-zmEzHdvpZBZu0OKlbJSfgASQvaayyAoVuWtvyr34IJ/LyS+DaOKvvR3EvFJ9RWWtNIx+CMvO125OVophaxNYew==", "dev": true, "license": "MIT", "dependencies": { @@ -13610,30 +13684,30 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-unicode": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz", - "integrity": "sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.9.tgz", + "integrity": "sha512-DRAdWfeh/TjmhLJsw91vdiWCnUod9iwvM7xyS02/nF/sLsCR3A8l3pztrSUrWG8DSBqfX7yEk9FM0USaVJ2mSg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-url": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", - "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.3.tgz", + "integrity": "sha512-CL93wmloq5qsffmFv+bw24MIRbmhHrp53qoh1LDAb/5TtjWEXI/np4xcP/Gw9oWCb2XyWnqHYLDUwiKRoJBA1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13643,13 +13717,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-whitespace": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", - "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.3.tgz", + "integrity": "sha512-FdHjjn+Ht5Z2ZRjNOmeCbNq6lq09sUYKpmlF/Aq0XjVNSLTL6fmHlA/3swN2wP2caY9GV/tjSDcIIyS7aN7W0A==", "dev": true, "license": "MIT", "dependencies": { @@ -13659,47 +13733,47 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-ordered-values": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", - "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.4.tgz", + "integrity": "sha512-nubSi49hDHQk4E8KIj+IbLY8Bg+8OcSUEhgyolgM+atnOvXjV7EjaR6bac4YGZoFyPa9mWoAF3EaYbWdFkKqVg==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-utils": "^5.0.1", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-reduce-initial": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz", - "integrity": "sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.9.tgz", + "integrity": "sha512-ztTNPdIxXTxtBcG03E9u8v44M4ElXbMIRT7pf2onlquGula0Y83nKKxqM22FA/hMgkfCjN7ohevkVlaNwI8iOQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "caniuse-api": "^3.0.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-reduce-transforms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", - "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.3.tgz", + "integrity": "sha512-FXsnN9ZwcZTT8Yf8cAHA8qIGUXcX6WfLd9JoYhrdDfmvsVhhfqkkv7m4AC3rwFOfz+GzkUa87OCKF9dUcicd+g==", "dev": true, "license": "MIT", "dependencies": { @@ -13709,7 +13783,7 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-resolve-nested-selector": { @@ -13747,9 +13821,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -13761,36 +13835,36 @@ } }, "node_modules/postcss-svgo": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", - "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.3.tgz", + "integrity": "sha512-2QfoFOYMcj8lwcVEf9WeTlkVIAm7u2QvOEhMzkQU3KUhhGX/l8hVV9EtjMv4iq3E9iI3OeeMN0YoMLbGusuigw==", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^4.0.0" + "svgo": "^4.0.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >= 18" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-unique-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", - "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.7.tgz", + "integrity": "sha512-d+sCkaRnSefghOUdH8CMJZV9yUQhj2ojpe8Nw/lA+LV1UOfeleGkLTl6XdCFFSai9UJ+DJPb69FFuqthXYsY8w==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-value-parser": { @@ -13810,7 +13884,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -13871,9 +13944,9 @@ } }, "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", + "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", "license": "MIT" }, "node_modules/protocols": { @@ -13928,13 +14001,13 @@ "license": "MIT" }, "node_modules/pug": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", - "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.4.tgz", + "integrity": "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==", "dev": true, "license": "MIT", "dependencies": { - "pug-code-gen": "^3.0.3", + "pug-code-gen": "^3.0.4", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", @@ -13957,9 +14030,9 @@ } }, "node_modules/pug-code-gen": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", - "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.4.tgz", + "integrity": "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==", "dev": true, "license": "MIT", "dependencies": { @@ -14064,9 +14137,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -14078,29 +14151,35 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qified": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.1.tgz", - "integrity": "sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.9.1.tgz", + "integrity": "sha512-n7mar4T0xQ+39dE2vGTAlbxUEpndwPANH0kDef1/MYsB8Bba9wshkybIRx74qgcvKQPEWErf9AqAdYjhzY2Ilg==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.12.2" + "hookified": "^2.1.1" }, "engines": { "node": ">=20" } }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14260,9 +14339,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14553,12 +14632,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -14600,7 +14680,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -14808,9 +14887,9 @@ } }, "node_modules/sass-loader": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.6.tgz", - "integrity": "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.7.tgz", + "integrity": "sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==", "dev": true, "license": "MIT", "dependencies": { @@ -14824,7 +14903,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", @@ -14849,11 +14928,14 @@ } }, "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "dev": true, - "license": "BlueOak-1.0.0" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -14876,9 +14958,9 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -14986,21 +15068,10 @@ "@img/sharp-win32-x64": "0.33.5" } }, - "node_modules/sharp/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/sharp/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "peer": true, @@ -15015,7 +15086,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -15028,7 +15098,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15062,14 +15131,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -15235,13 +15304,13 @@ } }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz", + "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -15265,9 +15334,9 @@ } }, "node_modules/sortablejs": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", - "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.7.tgz", + "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==", "license": "MIT" }, "node_modules/source-map": { @@ -15420,7 +15489,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15447,20 +15515,20 @@ } }, "node_modules/stylehacks": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.7.tgz", - "integrity": "sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.11.tgz", + "integrity": "sha512-iODNfhXVLqc5LADs+Y6Oh5wJuK5ZcHbVng8aiK3y9pjMQdc5hLrBW0eFU6FtnpNrE6PoEg/MmFTU4waotj5WNg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "postcss-selector-parser": "^7.1.0" + "browserslist": "^4.28.2", + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/stylelint": { @@ -15603,15 +15671,15 @@ } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.18", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.18.tgz", - "integrity": "sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==", + "version": "6.1.22", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.22.tgz", + "integrity": "sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^2.1.0", - "flatted": "^3.3.3", - "hookified": "^1.12.0" + "cacheable": "^2.3.4", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/stylelint/node_modules/globby": { @@ -15756,9 +15824,9 @@ } }, "node_modules/svgo": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dev": true, "license": "MIT", "dependencies": { @@ -15768,7 +15836,7 @@ "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.4.1" + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo.js" @@ -15931,9 +15999,9 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -16009,9 +16077,9 @@ } }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -16029,9 +16097,9 @@ "license": "MIT" }, "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", + "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -16048,16 +16116,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -16148,9 +16215,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", "dev": true, "license": "MIT", "engines": { @@ -16174,37 +16241,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -16262,9 +16298,9 @@ "license": "MIT" }, "node_modules/tom-select": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.3.tgz", - "integrity": "sha512-MFFrMxP1bpnAMPbdvPCZk0KwYxLqhYZso39torcdoefeV/NThNyDu8dV96/INJ5XQVTL3O55+GqQ78Pkj5oCfw==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.6.tgz", + "integrity": "sha512-Hhqi15AiTl0+FjaHVTXvUkF3t7x4W5LXUHxLYlzp7r8bcIgGJyz9M+3ZvrHdTRvEmV4EmNyJPbHJJnZOjr5Iig==", "license": "Apache-2.0", "dependencies": { "@orchidjs/sifter": "^1.1.0", @@ -16362,7 +16398,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -16392,9 +16427,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "dev": true, "license": "MIT" }, @@ -16571,10 +16606,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -16605,7 +16639,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -16636,9 +16669,9 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -16708,9 +16741,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -16876,9 +16909,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "dev": true, "license": "MIT", "engines": { @@ -16932,7 +16965,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -17138,7 +17170,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17249,9 +17280,9 @@ } }, "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -17322,7 +17353,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10"