diff --git a/assets/controllers/user_highlight_tooltip_controller.js b/assets/controllers/user_highlight_tooltip_controller.js index 3ae32e5..a1084cb 100644 --- a/assets/controllers/user_highlight_tooltip_controller.js +++ b/assets/controllers/user_highlight_tooltip_controller.js @@ -118,6 +118,43 @@ export default class extends Controller { } }; window.addEventListener('resize', this._onResize); + + this._onHashChange = () => { + this._scrollToHashHighlight(); + }; + window.addEventListener('hashchange', this._onHashChange); + this._scrollToHashHighlight(); + } + + /** + * Browsers are inconsistent about scrolling to #highlight- (inline marks, alias spans, + * late layout). Mirror native intent after paint. + */ + _scrollToHashHighlight() { + const hash = window.location.hash; + if (!hash?.startsWith('#highlight-')) { + return; + } + const id = decodeURIComponent(hash.slice(1)); + if (!/^highlight-[a-f0-9]{64}$/i.test(id)) { + return; + } + const run = () => { + const node = document.getElementById(id); + if (!(node instanceof HTMLElement)) { + return; + } + const next = node.nextElementSibling; + const target = + node.classList.contains('user-highlight__fragment-target') && + next?.classList?.contains('user-highlight__marker') + ? next + : node; + target.scrollIntoView({ block: 'start', inline: 'nearest' }); + }; + requestAnimationFrame(() => { + requestAnimationFrame(run); + }); } disconnect() { @@ -126,6 +163,9 @@ export default class extends Controller { this.element.removeEventListener('focusin', this._onFocus); this.element.removeEventListener('focusout', this._onBlur); window.removeEventListener('resize', this._onResize); + if (this._onHashChange) { + window.removeEventListener('hashchange', this._onHashChange); + } this._cancelHide(); this.tip.remove(); } diff --git a/assets/styles/article.css b/assets/styles/article.css index 9b1b080..6fbddf4 100644 --- a/assets/styles/article.css +++ b/assets/styles/article.css @@ -448,10 +448,25 @@ -webkit-box-decoration-break: clone; } -.article-main mark.user-highlight__marker { +.article-main mark.user-highlight__marker, +.article-main .user-highlight__fragment-target { scroll-margin-top: calc(var(--site-fixed-header-offset, 140px) + 0.75rem); } +/* Invisible #highlight-{eid} anchors (same group as an older mark) — zero visual footprint. */ +.article-main .user-highlight__fragment-target { + display: inline; + font-size: 0; + line-height: 0; + width: 0.01em; + height: 0; + overflow: hidden; + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; +} + /* When `content` is not a substring of `context` (rare) */ .user-highlight__marker-orphan { margin: 0.5rem 0 0; diff --git a/composer.json b/composer.json index 6944814..8fd181a 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "minimum-stability": "stable", "prefer-stable": true, "require": { - "php": ">=8.3.13", + "php": "^8.3", "ext-ctype": "*", "ext-iconv": "*", "ext-openssl": "*", @@ -23,31 +23,31 @@ "phpstan/phpdoc-parser": "^2.0", "runtime/frankenphp-symfony": "^0.2.0", "swentel/nostr-php": "^1.9.4", - "symfony/asset": "7.1.*", - "symfony/asset-mapper": "7.1.*", - "symfony/console": "7.1.*", - "symfony/dotenv": "7.1.*", + "symfony/asset": "7.3.*", + "symfony/asset-mapper": "7.3.*", + "symfony/console": "7.3.*", + "symfony/dotenv": "7.3.*", "symfony/flex": "^2", - "symfony/form": "7.1.*", - "symfony/framework-bundle": "7.1.*", - "symfony/html-sanitizer": "7.1.*", - "symfony/http-foundation": "7.1.*", - "symfony/intl": "7.1.*", - "symfony/monolog-bridge": "7.1.*", + "symfony/form": "7.3.*", + "symfony/framework-bundle": "7.3.*", + "symfony/html-sanitizer": "7.3.*", + "symfony/http-foundation": "7.3.*", + "symfony/intl": "7.3.*", + "symfony/monolog-bridge": "7.3.*", "symfony/monolog-bundle": "^3.11", - "symfony/process": "7.1.*", - "symfony/property-access": "7.1.*", - "symfony/property-info": "7.1.*", - "symfony/runtime": "7.1.*", - "symfony/security-bundle": "7.1.*", - "symfony/serializer": "7.1.*", + "symfony/process": "7.3.*", + "symfony/property-access": "7.3.*", + "symfony/property-info": "7.3.*", + "symfony/runtime": "7.3.*", + "symfony/security-bundle": "7.3.*", + "symfony/serializer": "7.3.*", "symfony/stimulus-bundle": "^2.22", - "symfony/translation": "7.1.*", - "symfony/twig-bundle": "7.1.*", + "symfony/translation": "7.3.*", + "symfony/twig-bundle": "7.3.*", "symfony/ux-icons": "^2.22", "symfony/ux-live-component": "^2.21", - "symfony/workflow": "7.1.*", - "symfony/yaml": "7.1.*", + "symfony/workflow": "7.3.*", + "symfony/yaml": "7.3.*", "twig/extra-bundle": "^2.12|^3.0", "twig/markdown-extra": "^3.21", "twig/string-extra": "^3.21", @@ -101,7 +101,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "7.1.*", + "require": "7.3.*", "docker": true }, "runtime": { @@ -110,11 +110,11 @@ }, "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/browser-kit": "7.1.*", - "symfony/css-selector": "7.1.*", + "symfony/browser-kit": "7.3.*", + "symfony/css-selector": "7.3.*", "symfony/maker-bundle": "^1.63", "symfony/phpunit-bridge": "^7.2", - "symfony/stopwatch": "7.1.*", - "symfony/web-profiler-bundle": "7.1.*" + "symfony/stopwatch": "7.3.*", + "symfony/web-profiler-bundle": "7.3.*" } } diff --git a/composer.lock b/composer.lock index 57d3523..ea248b0 100644 --- a/composer.lock +++ b/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": "de0f61141e3ff937c3c241e6b3315a88", + "content-hash": "37decb6d8e5656d920a95981bfb25c0e", "packages": [ { "name": "bitwasp/bech32", @@ -54,16 +54,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.7", + "version": "1.5.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "d665d22c417056996c59019579f1967dfe5c1e82" + "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d665d22c417056996c59019579f1967dfe5c1e82", - "reference": "d665d22c417056996c59019579f1967dfe5c1e82", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/68ff39175e8e94a4bb1d259407ce51a6a60f09e6", + "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6", "shasum": "" }, "require": { @@ -110,7 +110,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.7" + "source": "https://github.com/composer/ca-bundle/tree/1.5.11" }, "funding": [ { @@ -120,26 +120,22 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-05-26T15:08:54+00:00" + "time": "2026-03-30T09:16:10+00:00" }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -191,7 +187,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -201,13 +197,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "dflydev/dot-access-data", @@ -286,16 +278,16 @@ }, { "name": "doctrine/collections", - "version": "2.3.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d" + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d", + "url": "https://api.github.com/repos/doctrine/collections/zipball/7713da39d8e237f28411d6a616a3dce5e20d5de2", + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2", "shasum": "" }, "require": { @@ -304,11 +296,11 @@ "symfony/polyfill-php84": "^1.30" }, "require-dev": { - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^14", "ext-json": "*", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5" + "phpstan/phpstan": "^2.1.30", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpunit/phpunit": "^10.5.58 || ^11.5.42 || ^12.4" }, "type": "library", "autoload": { @@ -352,7 +344,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.3.0" + "source": "https://github.com/doctrine/collections/tree/2.6.0" }, "funding": [ { @@ -368,20 +360,20 @@ "type": "tidelift" } ], - "time": "2025-03-22T10:17:19+00:00" + "time": "2026-01-15T10:01:58+00:00" }, { "name": "doctrine/dbal", - "version": "4.3.1", + "version": "4.4.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "ac336c95ea9e13433d56ca81c308b39db0e1a2a7" + "reference": "61e730f1658814821a85f2402c945f3883407dec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/ac336c95ea9e13433d56ca81c308b39db0e1a2a7", - "reference": "ac336c95ea9e13433d56ca81c308b39db0e1a2a7", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61e730f1658814821a85f2402c945f3883407dec", + "reference": "61e730f1658814821a85f2402c945f3883407dec", "shasum": "" }, "require": { @@ -391,17 +383,17 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "13.0.0", + "doctrine/coding-standard": "14.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.17", - "phpstan/phpstan-phpunit": "2.0.6", + "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.16.2", - "squizlabs/php_codesniffer": "3.13.1", - "symfony/cache": "^6.3.8|^7.0", - "symfony/console": "^5.4|^6.3|^7.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" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -458,7 +450,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.3.1" + "source": "https://github.com/doctrine/dbal/tree/4.4.3" }, "funding": [ { @@ -474,33 +466,33 @@ "type": "tidelift" } ], - "time": "2025-07-22T10:09:51+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": { @@ -520,26 +512,27 @@ "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": "2.15.0", + "version": "2.18.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "d88294521a1bca943240adca65fa19ca8a7288c6" + "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/d88294521a1bca943240adca65fa19ca8a7288c6", - "reference": "d88294521a1bca943240adca65fa19ca8a7288c6", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0ff098b29b8b3c68307c8987dcaed7fd829c6546", + "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546", "shasum": "" }, "require": { "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/deprecations": "^1.0", "doctrine/persistence": "^3.1 || ^4", "doctrine/sql-formatter": "^1.0.1", "php": "^8.1", @@ -547,7 +540,6 @@ "symfony/config": "^6.4 || ^7.0", "symfony/console": "^6.4 || ^7.0", "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/deprecation-contracts": "^2.1 || ^3", "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", "symfony/framework-bundle": "^6.4 || ^7.0", "symfony/service-contracts": "^2.5 || ^3" @@ -562,18 +554,17 @@ "require-dev": { "doctrine/annotations": "^1 || ^2", "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^13", - "doctrine/deprecations": "^1.0", + "doctrine/coding-standard": "^14", "doctrine/orm": "^2.17 || ^3.1", "friendsofphp/proxy-manager-lts": "^1.0", "phpstan/phpstan": "2.1.1", "phpstan/phpstan-phpunit": "2.0.3", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^9.6.22", + "phpunit/phpunit": "^10.5.53 || ^12.3.10", "psr/log": "^1.1.4 || ^2.0 || ^3.0", "symfony/doctrine-messenger": "^6.4 || ^7.0", + "symfony/expression-language": "^6.4 || ^7.0", "symfony/messenger": "^6.4 || ^7.0", - "symfony/phpunit-bridge": "^7.2", "symfony/property-info": "^6.4 || ^7.0", "symfony/security-bundle": "^6.4 || ^7.0", "symfony/stopwatch": "^6.4 || ^7.0", @@ -583,7 +574,7 @@ "symfony/var-exporter": "^6.4.1 || ^7.0.1", "symfony/web-profiler-bundle": "^6.4 || ^7.0", "symfony/yaml": "^6.4 || ^7.0", - "twig/twig": "^2.13 || ^3.0.4" + "twig/twig": "^2.14.7 || ^3.0.4" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -628,7 +619,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.15.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.18.2" }, "funding": [ { @@ -644,32 +635,32 @@ "type": "tidelift" } ], - "time": "2025-06-16T19:53:58+00:00" + "time": "2025-12-20T21:35:32+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.4.2", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9" + "reference": "1e380c6dd8ac8488217f39cff6b77e367f1a644b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/1e380c6dd8ac8488217f39cff6b77e367f1a644b", + "reference": "1e380c6dd8ac8488217f39cff6b77e367f1a644b", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "^2.4", + "doctrine/doctrine-bundle": "^2.4 || ^3.0", "doctrine/migrations": "^3.2", "php": "^7.2 || ^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { "composer/semver": "^3.0", - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^12 || ^14", "doctrine/orm": "^2.6 || ^3", "phpstan/phpstan": "^1.4 || ^2", "phpstan/phpstan-deprecation-rules": "^1 || ^2", @@ -677,8 +668,8 @@ "phpstan/phpstan-strict-rules": "^1.1 || ^2", "phpstan/phpstan-symfony": "^1.3 || ^2", "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/phpunit-bridge": "^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6 || ^7" + "symfony/phpunit-bridge": "^6.3 || ^7 || ^8", + "symfony/var-exporter": "^5.4 || ^6 || ^7 || ^8" }, "type": "symfony-bundle", "autoload": { @@ -713,7 +704,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.7.0" }, "funding": [ { @@ -729,20 +720,20 @@ "type": "tidelift" } ], - "time": "2025-03-11T17:36:26+00:00" + "time": "2025-11-15T19:02:59+00:00" }, { "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": { @@ -752,10 +743,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": { @@ -804,7 +795,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": [ { @@ -820,37 +811,36 @@ "type": "tidelift" } ], - "time": "2024-05-22T20:47:39+00:00" + "time": "2026-01-29T07:11:08+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.10", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -895,7 +885,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -911,7 +901,7 @@ "type": "tidelift" } ], - "time": "2024-02-18T20:23:39+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { "name": "doctrine/instantiator", @@ -1062,16 +1052,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.1", + "version": "3.9.7", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999" + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/0f1e0c960ac29866d648a4f50142a74fe1cb6999", - "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", "shasum": "" }, "require": { @@ -1081,29 +1071,29 @@ "doctrine/event-manager": "^1.2 || ^2.0", "php": "^8.1", "psr/log": "^1.1.3 || ^2 || ^3", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^6.2 || ^7.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.2 || ^7.0 || ^8.0" }, "conflict": { "doctrine/orm": "<2.12 || >=4" }, "require-dev": { - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^14", "doctrine/orm": "^2.13 || ^3", "doctrine/persistence": "^2 || ^3 || ^4", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", "fig/log-test": "^1", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpstan/phpstan-strict-rules": "^1.4", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^10.3", - "symfony/cache": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpstan/phpstan-symfony": "^2", + "phpunit/phpunit": "^10.3 || ^11.0 || ^12.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "suggest": { "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", @@ -1145,7 +1135,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.1" + "source": "https://github.com/doctrine/migrations/tree/3.9.7" }, "funding": [ { @@ -1161,20 +1151,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T07:19:23+00:00" + "time": "2026-04-23T19:33:20+00:00" }, { "name": "doctrine/orm", - "version": "3.5.0", + "version": "3.6.3", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "6deec3655ba3e8f15280aac11e264225854d2369" + "reference": "e88cd591f0786089dee22b972c28aa2076df51c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/6deec3655ba3e8f15280aac11e264225854d2369", - "reference": "6deec3655ba3e8f15280aac11e264225854d2369", + "url": "https://api.github.com/repos/doctrine/orm/zipball/e88cd591f0786089dee22b972c28aa2076df51c0", + "reference": "e88cd591f0786089dee22b972c28aa2076df51c0", "shasum": "" }, "require": { @@ -1190,20 +1180,18 @@ "ext-ctype": "*", "php": "^8.1", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^6.3.9 || ^7.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.3.9 || ^7.0 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^13.0", + "doctrine/coding-standard": "^14.0", "phpbench/phpbench": "^1.0", - "phpdocumentor/guides-cli": "^1.4", "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "2.0.3", + "phpstan/phpstan": "2.1.23", "phpstan/phpstan-deprecation-rules": "^2", - "phpunit/phpunit": "^10.4.0", + "phpunit/phpunit": "^10.5.0 || ^11.5", "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.12.0", - "symfony/cache": "^5.4 || ^6.2 || ^7.0" + "symfony/cache": "^5.4 || ^6.2 || ^7.0 || ^8.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", @@ -1249,44 +1237,43 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.5.0" + "source": "https://github.com/doctrine/orm/tree/3.6.3" }, - "time": "2025-07-01T17:40:53+00:00" + "time": "2026-04-02T06:53:27+00:00" }, { "name": "doctrine/persistence", - "version": "4.0.0", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "45004aca79189474f113cbe3a53847c2115a55fa" + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa", - "reference": "45004aca79189474f113cbe3a53847c2115a55fa", + "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" }, - "conflict": { - "doctrine/common": "<2.10" - }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "1.12.7", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^9.6", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "doctrine/coding-standard": "^14", + "phpstan/phpstan": "2.1.30", + "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 || ^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/", @@ -1330,7 +1317,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/4.0.0" + "source": "https://github.com/doctrine/persistence/tree/4.2.0" }, "funding": [ { @@ -1346,30 +1333,30 @@ "type": "tidelift" } ], - "time": "2024-11-01T21:49:07+00:00" + "time": "2026-04-26T12:12:52+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.2", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/9563949f5cd3bd12a17d12fb980528bc141c5806", + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^12", - "ergebnis/phpunit-slow-test-detector": "^2.14", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "doctrine/coding-standard": "^14", + "ergebnis/phpunit-slow-test-detector": "^2.20", + "phpstan/phpstan": "^2.1.31", + "phpunit/phpunit": "^10.5.58" }, "bin": [ "bin/sql-formatter" @@ -1399,9 +1386,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.4" }, - "time": "2025-01-24T11:45:48+00:00" + "time": "2026-02-08T16:21:46+00:00" }, { "name": "dsbaars/chacha20", @@ -1552,20 +1539,20 @@ }, { "name": "genkgo/php-asn1", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/genkgo/php-asn1.git", - "reference": "4de712c68bbf51c00551cb45f55642e30fed1fdb" + "reference": "dc535345d0ecc69181c6a1e17e57a625bd01f891" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/genkgo/php-asn1/zipball/4de712c68bbf51c00551cb45f55642e30fed1fdb", - "reference": "4de712c68bbf51c00551cb45f55642e30fed1fdb", + "url": "https://api.github.com/repos/genkgo/php-asn1/zipball/dc535345d0ecc69181c6a1e17e57a625bd01f891", + "reference": "dc535345d0ecc69181c6a1e17e57a625bd01f891", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "php-coveralls/php-coveralls": "~2.0", @@ -1626,26 +1613,26 @@ ], "support": { "issues": "https://github.com/genkgo/php-asn1/issues", - "source": "https://github.com/genkgo/php-asn1/tree/v2.8.0" + "source": "https://github.com/genkgo/php-asn1/tree/v2.9.0" }, - "time": "2025-02-12T20:20:53+00:00" + "time": "2026-01-06T11:43:05+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "3.6.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "b068eac123f21c0e592de41deeb7403b88e0a89f" + "reference": "60c182916b2749480895601649563970f3f12ec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/b068eac123f21c0e592de41deeb7403b88e0a89f", - "reference": "b068eac123f21c0e592de41deeb7403b88e0a89f", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/60c182916b2749480895601649563970f3f12ec4", + "reference": "60c182916b2749480895601649563970f3f12ec4", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "psr/http-factory": "^1.1", "psr/http-message": "^1.1 || ^2.0" }, @@ -1662,11 +1649,11 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^2.2.0", - "laminas/laminas-coding-standard": "~3.0.0", + "laminas/laminas-coding-standard": "~3.1.0", "php-http/psr7-integration-tests": "^1.4.0", "phpunit/phpunit": "^10.5.36", - "psalm/plugin-phpunit": "^0.19.0", - "vimeo/psalm": "^5.26.1" + "psalm/plugin-phpunit": "^0.19.5", + "vimeo/psalm": "^6.13" }, "type": "library", "extra": { @@ -1716,20 +1703,20 @@ "type": "community_bridge" } ], - "time": "2025-05-05T16:03:34+00:00" + "time": "2025-10-12T15:31:36+00:00" }, { "name": "league/commonmark", - "version": "2.7.1", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", - "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", "shasum": "" }, "require": { @@ -1754,9 +1741,9 @@ "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, @@ -1766,7 +1753,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.8-dev" + "dev-main": "2.9-dev" } }, "autoload": { @@ -1823,7 +1810,7 @@ "type": "tidelift" } ], - "time": "2025-07-20T12:47:49+00:00" + "time": "2026-03-19T13:16:38+00:00" }, { "name": "league/config", @@ -1998,33 +1985,38 @@ }, { "name": "league/uri", - "version": "7.5.1", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "81fb5145d2644324614cc532b28efd0215bda430" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", - "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.5", - "php": "^8.1" + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" }, "conflict": { "league/uri-schemes": "^1.0" }, "suggest": { "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", "ext-fileinfo": "to create Data URI from file contennts", "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -2052,6 +2044,7 @@ "description": "URI manipulation library", "homepage": "https://uri.thephpleague.com", "keywords": [ + "URN", "data-uri", "file-uri", "ftp", @@ -2064,9 +2057,11 @@ "psr-7", "query-string", "querystring", + "rfc2141", "rfc3986", "rfc3987", "rfc6570", + "rfc8141", "uri", "uri-template", "url", @@ -2076,7 +2071,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.5.1" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -2084,26 +2079,25 @@ "type": "github" } ], - "time": "2024-12-08T08:40:02+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.5.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { "ext-filter": "*", "php": "^8.1", - "psr/http-factory": "^1", "psr/http-message": "^1.1 || ^2.0" }, "suggest": { @@ -2111,6 +2105,7 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -2135,7 +2130,7 @@ "homepage": "https://nyamsprod.com" } ], - "description": "Common interfaces and classes for URI representation and interaction", + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", "homepage": "https://uri.thephpleague.com", "keywords": [ "data-uri", @@ -2160,7 +2155,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -2168,7 +2163,7 @@ "type": "github" } ], - "time": "2024-12-08T08:18:47+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "masterminds/html5", @@ -2446,25 +2441,27 @@ }, { "name": "nette/schema", - "version": "v1.3.2", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", - "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", "shasum": "" }, "require": { "nette/utils": "^4.0", - "php": "8.1 - 8.4" + "php": "8.1 - 8.5" }, "require-dev": { - "nette/tester": "^2.5.2", - "phpstan/phpstan-nette": "^1.0", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -2474,6 +2471,9 @@ } }, "autoload": { + "psr-4": { + "Nette\\": "src" + }, "classmap": [ "src/" ] @@ -2502,35 +2502,37 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.2" + "source": "https://github.com/nette/schema/tree/v1.3.5" }, - "time": "2024-10-06T23:10:23+00:00" + "time": "2026-02-23T03:47:12+00:00" }, { "name": "nette/utils", - "version": "v4.0.7", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2", - "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { - "php": "8.0 - 8.4" + "php": "8.2 - 8.5" }, "conflict": { "nette/finder": "<3", "nette/schema": "<1.2.2" }, "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -2544,10 +2546,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { + "psr-4": { + "Nette\\": "src" + }, "classmap": [ "src/" ] @@ -2588,9 +2593,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.7" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2025-06-03T04:55:08+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nostriphant/nip-19", @@ -2636,6 +2641,84 @@ }, "time": "2024-11-26T15:37:43+00:00" }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" + }, { "name": "oscarotero/html-parser", "version": "v0.1.8", @@ -2781,16 +2864,16 @@ }, { "name": "paragonie/sodium_compat", - "version": "v2.1.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb" + "reference": "4714da6efdc782c06690bc72ce34fae7941c2d9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a673d5f310477027cead2e2f2b6db5d8368157cb", - "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/4714da6efdc782c06690bc72ce34fae7941c2d9f", + "reference": "4714da6efdc782c06690bc72ce34fae7941c2d9f", "shasum": "" }, "require": { @@ -2798,8 +2881,10 @@ "php-64bit": "*" }, "require-dev": { - "phpunit/phpunit": "^7|^8|^9", - "vimeo/psalm": "^4|^5" + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^7|^8|^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" }, "suggest": { "ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." @@ -2813,7 +2898,10 @@ "autoload": { "files": [ "autoload.php" - ] + ], + "psr-4": { + "ParagonIE\\Sodium\\": "namespaced/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2866,9 +2954,9 @@ ], "support": { "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v2.1.0" + "source": "https://github.com/paragonie/sodium_compat/tree/v2.5.0" }, - "time": "2024-09-04T12:51:01+00:00" + "time": "2025-12-30T16:12:18+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2925,16 +3013,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.2", + "version": "5.6.7", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + "reference": "31a105931bc8ffa3a123383829772e832fd8d903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/31a105931bc8ffa3a123383829772e832fd8d903", + "reference": "31a105931bc8ffa3a123383829772e832fd8d903", "shasum": "" }, "require": { @@ -2944,7 +3032,7 @@ "phpdocumentor/reflection-common": "^2.2", "phpdocumentor/type-resolver": "^1.7", "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" + "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { "mockery/mockery": "~1.3.5 || ~1.6.0", @@ -2983,22 +3071,22 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.7" }, - "time": "2025-04-13T19:20:35+00:00" + "time": "2026-03-18T20:47:46+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.10.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", "shasum": "" }, "require": { @@ -3041,22 +3129,22 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" }, - "time": "2024-11-09T15:12:26+00:00" + "time": "2025-11-21T15:09:14+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.2.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8", - "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -3088,32 +3176,32 @@ "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.2.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2025-07-13T07:04:09+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phrity/comparison", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/sirn-se/phrity-comparison.git", - "reference": "aedd44d59db08de7d6c31812d1490c22aab35c92" + "reference": "cf80abb822537eeaaeb4142157cd667ca6372a13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/phrity-comparison/zipball/aedd44d59db08de7d6c31812d1490c22aab35c92", - "reference": "aedd44d59db08de7d6c31812d1490c22aab35c92", + "url": "https://api.github.com/repos/sirn-se/phrity-comparison/zipball/cf80abb822537eeaaeb4142157cd667ca6372a13", + "reference": "cf80abb822537eeaaeb4142157cd667ca6372a13", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.0 | ^11.0 | ^12.0", - "squizlabs/php_codesniffer": "^3.5" + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^3.5 || ^4.0" }, "type": "library", "autoload": { @@ -3144,36 +3232,95 @@ ], "support": { "issues": "https://github.com/sirn-se/phrity-comparison/issues", - "source": "https://github.com/sirn-se/phrity-comparison/tree/1.4.0" + "source": "https://github.com/sirn-se/phrity-comparison/tree/1.4.1" + }, + "time": "2025-12-05T07:38:30+00:00" + }, + { + "name": "phrity/http", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sirn-se/phrity-http.git", + "reference": "1e7eee67359287b94aae2b7d40b730d5f5394943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirn-se/phrity-http/zipball/1e7eee67359287b94aae2b7d40b730d5f5394943", + "reference": "1e7eee67359287b94aae2b7d40b730d5f5394943", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "require-dev": { + "guzzlehttp/psr7": "^2.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^3.5 || ^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Phrity\\Http\\": "src/" + } }, - "time": "2025-05-26T20:12:39+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sören Jensen", + "email": "sirn@sirn.se", + "homepage": "https://phrity.sirn.se" + } + ], + "description": "Utilities and interfaces for handling HTTP.", + "homepage": "https://phrity.sirn.se/http", + "keywords": [ + "HTTP Factories", + "HTTP Serializer", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/sirn-se/phrity-http/issues", + "source": "https://github.com/sirn-se/phrity-http/tree/1.1.0" + }, + "time": "2025-12-22T20:22:29+00:00" }, { "name": "phrity/net-stream", - "version": "2.3.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/sirn-se/phrity-net-stream.git", - "reference": "0ecc50a8ee7a708033d391ed60878b0bd5397bf8" + "reference": "a0726a8dddf11a4cd3a9e45d17e145d78e948f43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/phrity-net-stream/zipball/0ecc50a8ee7a708033d391ed60878b0bd5397bf8", - "reference": "0ecc50a8ee7a708033d391ed60878b0bd5397bf8", + "url": "https://api.github.com/repos/sirn-se/phrity-net-stream/zipball/a0726a8dddf11a4cd3a9e45d17e145d78e948f43", + "reference": "a0726a8dddf11a4cd3a9e45d17e145d78e948f43", "shasum": "" }, "require": { "php": "^8.1", "phrity/util-errorhandler": "^1.1", + "phrity/util-interpolator": "^1.1", "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 | ^2.0" + "psr/http-message": "^1.1 || ^2.0" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.0 | ^11.0 | ^12.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0 || ^13.0", "phrity/net-uri": "^2.0", - "squizlabs/php_codesniffer": "^3.5" + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^4.0" }, "type": "library", "autoload": { @@ -3205,22 +3352,22 @@ ], "support": { "issues": "https://github.com/sirn-se/phrity-net-stream/issues", - "source": "https://github.com/sirn-se/phrity-net-stream/tree/2.3.0" + "source": "https://github.com/sirn-se/phrity-net-stream/tree/2.4.0" }, - "time": "2025-05-22T08:28:09+00:00" + "time": "2026-03-25T18:16:40+00:00" }, { "name": "phrity/net-uri", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/sirn-se/phrity-net-uri.git", - "reference": "08de4cf07e439c4708f572249659f09198ac99f0" + "reference": "0737de026b75177ae302ac9fdbbd0ffc2610f3b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/phrity-net-uri/zipball/08de4cf07e439c4708f572249659f09198ac99f0", - "reference": "08de4cf07e439c4708f572249659f09198ac99f0", + "url": "https://api.github.com/repos/sirn-se/phrity-net-uri/zipball/0737de026b75177ae302ac9fdbbd0ffc2610f3b8", + "reference": "0737de026b75177ae302ac9fdbbd0ffc2610f3b8", "shasum": "" }, "require": { @@ -3231,11 +3378,11 @@ "psr/http-message": "^1.1 | ^2.0" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.0 | ^11.0 | ^12.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", "phrity/util-errorhandler": "^1.1", - "squizlabs/php_codesniffer": "^3.5" + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^3.5 || ^4.0" }, "suggest": { "ext-intl": "Enables IDN conversion for non-ASCII domains" @@ -3267,32 +3414,84 @@ ], "support": { "issues": "https://github.com/sirn-se/phrity-net-uri/issues", - "source": "https://github.com/sirn-se/phrity-net-uri/tree/2.2.0" + "source": "https://github.com/sirn-se/phrity-net-uri/tree/2.2.1" }, - "time": "2025-05-25T13:05:13+00:00" + "time": "2025-12-05T10:39:22+00:00" + }, + { + "name": "phrity/util-accessor", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/sirn-se/phrity-util-accessor.git", + "reference": "e9741da6b532fa2da7f627fce60fa77f00f6e354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirn-se/phrity-util-accessor/zipball/e9741da6b532fa2da7f627fce60fa77f00f6e354", + "reference": "e9741da6b532fa2da7f627fce60fa77f00f6e354", + "shasum": "" + }, + "require": { + "php": "^8.1", + "phrity/util-transformer": "^1.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^3.5 || ^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Phrity\\Util\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sören Jensen", + "email": "sirn@sirn.se", + "homepage": "https://phrity.sirn.se" + } + ], + "description": "Utility to handle access to a data set by using access paths. Similar to and partly compatible with xpath and json-pointer.", + "homepage": "https://phrity.sirn.se/util-accessor", + "keywords": [ + "accessor" + ], + "support": { + "issues": "https://github.com/sirn-se/phrity-util-accessor/issues", + "source": "https://github.com/sirn-se/phrity-util-accessor/tree/1.3.1" + }, + "time": "2025-12-05T21:18:15+00:00" }, { "name": "phrity/util-errorhandler", - "version": "1.2.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sirn-se/phrity-util-errorhandler.git", - "reference": "61813189e4525fde4aecad3df849829d526d6f76" + "reference": "70a669cc22db2eed6a109ec66fd95168a4332c9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/phrity-util-errorhandler/zipball/61813189e4525fde4aecad3df849829d526d6f76", - "reference": "61813189e4525fde4aecad3df849829d526d6f76", + "url": "https://api.github.com/repos/sirn-se/phrity-util-errorhandler/zipball/70a669cc22db2eed6a109ec66fd95168a4332c9b", + "reference": "70a669cc22db2eed6a109ec66fd95168a4332c9b", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.0 | ^11.0 | ^12.0", - "squizlabs/php_codesniffer": "^3.5" + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^3.5 || ^4.0" }, "type": "library", "autoload": { @@ -3319,38 +3518,154 @@ ], "support": { "issues": "https://github.com/sirn-se/phrity-util-errorhandler/issues", - "source": "https://github.com/sirn-se/phrity-util-errorhandler/tree/1.2.0" + "source": "https://github.com/sirn-se/phrity-util-errorhandler/tree/1.2.2" + }, + "time": "2025-12-05T21:25:36+00:00" + }, + { + "name": "phrity/util-interpolator", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sirn-se/phrity-util-interpolator.git", + "reference": "18b0362d2aff60984c530808333c5e64c80c3e50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirn-se/phrity-util-interpolator/zipball/18b0362d2aff60984c530808333c5e64c80c3e50", + "reference": "18b0362d2aff60984c530808333c5e64c80c3e50", + "shasum": "" + }, + "require": { + "php": "^8.1", + "phrity/util-accessor": "^1.3", + "phrity/util-transformer": "^1.3" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^3.5 || ^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Phrity\\Util\\Interpolator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sören Jensen", + "email": "sirn@sirn.se", + "homepage": "https://phrity.sirn.se" + } + ], + "description": "Interpolator class and trait.", + "homepage": "https://phrity.sirn.se/util-interpolator", + "keywords": [ + "interpolate", + "interpolator" + ], + "support": { + "issues": "https://github.com/sirn-se/phrity-util-interpolator/issues", + "source": "https://github.com/sirn-se/phrity-util-interpolator/tree/1.1.1" + }, + "time": "2025-12-05T21:35:25+00:00" + }, + { + "name": "phrity/util-transformer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/sirn-se/phrity-util-transformer.git", + "reference": "3fd4d7fa4077deafe5130c4b9ee8146b5488abe3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirn-se/phrity-util-transformer/zipball/3fd4d7fa4077deafe5130c4b9ee8146b5488abe3", + "reference": "3fd4d7fa4077deafe5130c4b9ee8146b5488abe3", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^3.5 || ^4.0", + "symfony/property-access": "^6.0 || ^7.0 || ^8.0", + "symfony/serializer": "^6.0 || ^7.0 || ^8.0", + "symfony/translation-contracts": "^3.0", + "symfony/uid": "^6.0 || ^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Phrity\\Util\\Transformer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sören Jensen", + "email": "sirn@sirn.se", + "homepage": "https://phrity.sirn.se" + } + ], + "description": "Type transformers, normalizers and resolvers.", + "homepage": "https://phrity.sirn.se/util-transformer", + "keywords": [ + "normalizer", + "resolver", + "transformer", + "type" + ], + "support": { + "issues": "https://github.com/sirn-se/phrity-util-transformer/issues", + "source": "https://github.com/sirn-se/phrity-util-transformer/tree/1.3.1" }, - "time": "2025-05-26T18:26:51+00:00" + "time": "2025-12-05T22:07:04+00:00" }, { "name": "phrity/websocket", - "version": "3.5.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/sirn-se/websocket-php.git", - "reference": "df3b4dbe3a8741159ae5cb5735476ebc4813d909" + "reference": "01f15374987d8281dba0ca511f322a0e18229330" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/websocket-php/zipball/df3b4dbe3a8741159ae5cb5735476ebc4813d909", - "reference": "df3b4dbe3a8741159ae5cb5735476ebc4813d909", + "url": "https://api.github.com/repos/sirn-se/websocket-php/zipball/01f15374987d8281dba0ca511f322a0e18229330", + "reference": "01f15374987d8281dba0ca511f322a0e18229330", "shasum": "" }, "require": { + "nyholm/psr7": "^1.4", "php": "^8.1", - "phrity/net-stream": "^2.3", + "phrity/http": "^1.1", + "phrity/net-stream": "^2.4", "phrity/net-uri": "^2.1", - "psr/http-message": "^1.1 | ^2.0", - "psr/log": "^1.0 | ^2.0 | ^3.0" + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.0 | ^11.0 | ^12.0", - "phrity/net-mock": "^2.3", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "phrity/logger-console": "^1.0", + "phrity/net-mock": "^2.4", "phrity/util-errorhandler": "^1.1", - "squizlabs/php_codesniffer": "^3.5" + "robiningelbrecht/phpunit-coverage-tools": "^1.9", + "squizlabs/php_codesniffer": "^4.0" }, "type": "library", "autoload": { @@ -3381,9 +3696,9 @@ ], "support": { "issues": "https://github.com/sirn-se/websocket-php/issues", - "source": "https://github.com/sirn-se/websocket-php/tree/3.5.0" + "source": "https://github.com/sirn-se/websocket-php/tree/3.7.0" }, - "time": "2025-05-23T13:13:41+00:00" + "time": "2026-04-06T18:18:14+00:00" }, { "name": "psr/cache", @@ -4061,16 +4376,16 @@ }, { "name": "symfony/asset", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "0dcd51490d7fc9fbf3c8f5aec6df182920fc0426" + "reference": "da95c6aba17f7e831744c2a09fd360e32a3d0f84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/0dcd51490d7fc9fbf3c8f5aec6df182920fc0426", - "reference": "0dcd51490d7fc9fbf3c8f5aec6df182920fc0426", + "url": "https://api.github.com/repos/symfony/asset/zipball/da95c6aba17f7e831744c2a09fd360e32a3d0f84", + "reference": "da95c6aba17f7e831744c2a09fd360e32a3d0f84", "shasum": "" }, "require": { @@ -4110,7 +4425,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/v7.1.6" + "source": "https://github.com/symfony/asset/tree/v7.3.10" }, "funding": [ { @@ -4121,25 +4436,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2026-01-13T10:28:39+00:00" }, { "name": "symfony/asset-mapper", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/asset-mapper.git", - "reference": "f30a77372995afb0f9323903b52e8e6527d12451" + "reference": "8325b9e34ad1b03c9a8a8414f215ea24949e1207" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/f30a77372995afb0f9323903b52e8e6527d12451", - "reference": "f30a77372995afb0f9323903b52e8e6527d12451", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/8325b9e34ad1b03c9a8a8414f215ea24949e1207", + "reference": "8325b9e34ad1b03c9a8a8414f215ea24949e1207", "shasum": "" }, "require": { @@ -4161,6 +4480,7 @@ "symfony/framework-bundle": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0" }, "type": "library", @@ -4189,7 +4509,7 @@ "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset-mapper/tree/v7.1.11" + "source": "https://github.com/symfony/asset-mapper/tree/v7.3.10" }, "funding": [ { @@ -4200,32 +4520,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2026-01-13T08:38:55+00:00" }, { "name": "symfony/cache", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb" + "reference": "e3e76b9ba0dff3dfe08ebda500723976dd9de407" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb", - "reference": "3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb", + "url": "https://api.github.com/repos/symfony/cache/zipball/e3e76b9ba0dff3dfe08ebda500723976dd9de407", + "reference": "e3e76b9ba0dff3dfe08ebda500723976dd9de407", "shasum": "" }, "require": { "php": ">=8.2", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", + "symfony/cache-contracts": "^3.6", "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/service-contracts": "^2.5|^3", "symfony/var-exporter": "^6.4|^7.0" @@ -4246,6 +4570,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/clock": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", @@ -4286,7 +4611,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.1.11" + "source": "https://github.com/symfony/cache/tree/v7.3.11" }, "funding": [ { @@ -4297,12 +4622,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2026-01-27T16:12:03+00:00" }, { "name": "symfony/cache-contracts", @@ -4382,16 +4711,16 @@ }, { "name": "symfony/clock", - "version": "v7.1.6", + "version": "v7.3.8", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d" + "reference": "bf3ab8ea07408cb91aef86e3b2761d2d0f011e7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d", + "url": "https://api.github.com/repos/symfony/clock/zipball/bf3ab8ea07408cb91aef86e3b2761d2d0f011e7c", + "reference": "bf3ab8ea07408cb91aef86e3b2761d2d0f011e7c", "shasum": "" }, "require": { @@ -4436,7 +4765,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.6" + "source": "https://github.com/symfony/clock/tree/v7.3.8" }, "funding": [ { @@ -4447,25 +4776,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-11-12T15:21:00+00:00" }, { "name": "symfony/config", - "version": "v7.1.7", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8" + "reference": "26ddb5ea228c55986ac9dd5273bd6b4e3d07eb61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", - "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", + "url": "https://api.github.com/repos/symfony/config/zipball/26ddb5ea228c55986ac9dd5273bd6b4e3d07eb61", + "reference": "26ddb5ea228c55986ac9dd5273bd6b4e3d07eb61", "shasum": "" }, "require": { @@ -4511,7 +4844,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/v7.1.7" + "source": "https://github.com/symfony/config/tree/v7.3.10" }, "funding": [ { @@ -4522,32 +4855,37 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-04T11:34:07+00:00" + "time": "2026-01-13T10:52:41+00:00" }, { "name": "symfony/console", - "version": "v7.1.10", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7" + "reference": "a28c3e5b4df406e8fae8e9b18c40557b5dfc430c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7", - "reference": "bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7", + "url": "https://api.github.com/repos/symfony/console/zipball/a28c3e5b4df406e8fae8e9b18c40557b5dfc430c", + "reference": "a28c3e5b4df406e8fae8e9b18c40557b5dfc430c", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -4604,7 +4942,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.10" + "source": "https://github.com/symfony/console/tree/v7.3.10" }, "funding": [ { @@ -4615,25 +4953,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-09T07:30:10+00:00" + "time": "2026-01-13T10:52:14+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5ebf7d4dfda126b442450effaec421a106c010de" + "reference": "1d5596f8a5da5c27539634cd6ba769f107991234" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5ebf7d4dfda126b442450effaec421a106c010de", - "reference": "5ebf7d4dfda126b442450effaec421a106c010de", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1d5596f8a5da5c27539634cd6ba769f107991234", + "reference": "1d5596f8a5da5c27539634cd6ba769f107991234", "shasum": "" }, "require": { @@ -4641,7 +4983,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4.20|^7.2.5" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -4684,7 +5026,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/v7.1.11" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.11" }, "funding": [ { @@ -4695,12 +5037,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-10T09:29:52+00:00" + "time": "2026-01-27T16:00:40+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4771,16 +5117,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b0247c25b71409c23c0cf3e090030950a86cc61b" + "reference": "98814d5e95e382150629619fa883e775baf6f340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b0247c25b71409c23c0cf3e090030950a86cc61b", - "reference": "b0247c25b71409c23c0cf3e090030950a86cc61b", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/98814d5e95e382150629619fa883e775baf6f340", + "reference": "98814d5e95e382150629619fa883e775baf6f340", "shasum": "" }, "require": { @@ -4793,6 +5139,7 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "doctrine/collections": "<1.8", "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.15", @@ -4809,7 +5156,7 @@ "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/collections": "^1.0|^2.0", + "doctrine/collections": "^1.8|^2.0", "doctrine/data-fixtures": "^1.1|^2", "doctrine/dbal": "^3.6|^4", "doctrine/orm": "^2.15|^3", @@ -4828,7 +5175,7 @@ "symfony/security-core": "^6.4|^7.0", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0" @@ -4859,7 +5206,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.11" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.10" }, "funding": [ { @@ -4870,25 +5217,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2026-01-20T16:37:04+00:00" }, { "name": "symfony/dotenv", - "version": "v7.1.9", + "version": "v7.3.8", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "245d1afe223664d2276afb75177d8988c328fb78" + "reference": "8c53fef39685ce76f208b4ccdc1e224f7e626c3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/245d1afe223664d2276afb75177d8988c328fb78", - "reference": "245d1afe223664d2276afb75177d8988c328fb78", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/8c53fef39685ce76f208b4ccdc1e224f7e626c3f", + "reference": "8c53fef39685ce76f208b4ccdc1e224f7e626c3f", "shasum": "" }, "require": { @@ -4933,7 +5284,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.1.9" + "source": "https://github.com/symfony/dotenv/tree/v7.3.8" }, "funding": [ { @@ -4944,25 +5295,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-27T11:17:28+00:00" + "time": "2025-11-16T10:09:06+00:00" }, { "name": "symfony/error-handler", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57" + "reference": "c2ee39c0f4840971da6d4b8a1fd910ed470e2c93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57", - "reference": "f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c2ee39c0f4840971da6d4b8a1fd910ed470e2c93", + "reference": "c2ee39c0f4840971da6d4b8a1fd910ed470e2c93", "shasum": "" }, "require": { @@ -4975,9 +5330,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -5008,7 +5365,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/v7.1.11" + "source": "https://github.com/symfony/error-handler/tree/v7.3.10" }, "funding": [ { @@ -5019,25 +5376,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-07T09:23:14+00:00" + "time": "2026-01-20T16:37:04+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "87254c78dd50721cfd015b62277a8281c5589702" + "reference": "2abf563596d8af09bbbfe4c6079bdffd7ed3f9f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", - "reference": "87254c78dd50721cfd015b62277a8281c5589702", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2abf563596d8af09bbbfe4c6079bdffd7ed3f9f8", + "reference": "2abf563596d8af09bbbfe4c6079bdffd7ed3f9f8", "shasum": "" }, "require": { @@ -5088,7 +5449,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/v7.1.6" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.10" }, "funding": [ { @@ -5099,12 +5460,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2026-01-05T11:42:02+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5184,16 +5549,16 @@ }, { "name": "symfony/filesystem", - "version": "v7.1.6", + "version": "v7.3.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" + "reference": "ce0b94a0e57b7499520d9e5150da9716d729a645" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", - "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ce0b94a0e57b7499520d9e5150da9716d729a645", + "reference": "ce0b94a0e57b7499520d9e5150da9716d729a645", "shasum": "" }, "require": { @@ -5230,7 +5595,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.6" + "source": "https://github.com/symfony/filesystem/tree/v7.3.8" }, "funding": [ { @@ -5241,25 +5606,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2025-11-26T15:55:45+00:00" }, { "name": "symfony/finder", - "version": "v7.1.10", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "b8b526e051ac0b33feabbec7893adcab96b23bf3" + "reference": "38f5d6ab66f0bc43fb5a23a4e7a4f06f0d454b56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/b8b526e051ac0b33feabbec7893adcab96b23bf3", - "reference": "b8b526e051ac0b33feabbec7893adcab96b23bf3", + "url": "https://api.github.com/repos/symfony/finder/zipball/38f5d6ab66f0bc43fb5a23a4e7a4f06f0d454b56", + "reference": "38f5d6ab66f0bc43fb5a23a4e7a4f06f0d454b56", "shasum": "" }, "require": { @@ -5294,7 +5663,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.10" + "source": "https://github.com/symfony/finder/tree/v7.3.11" }, "funding": [ { @@ -5305,40 +5674,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-30T18:59:46+00:00" + "time": "2026-01-26T13:14:40+00:00" }, { "name": "symfony/flex", - "version": "v2.8.1", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "423c36e369361003dc31ef11c5f15fb589e52c01" + "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/423c36e369361003dc31ef11c5f15fb589e52c01", - "reference": "423c36e369361003dc31ef11c5f15fb589e52c01", + "url": "https://api.github.com/repos/symfony/flex/zipball/9cd384775973eabbf6e8b05784dda279fc67c28d", + "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d", "shasum": "" }, "require": { "composer-plugin-api": "^2.1", - "php": ">=8.0" + "php": ">=8.1" }, "conflict": { - "composer/semver": "<1.7.2" + "composer/semver": "<1.7.2", + "symfony/dotenv": "<5.4" }, "require-dev": { "composer/composer": "^2.1", - "symfony/dotenv": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" + "symfony/dotenv": "^6.4|^7.4|^8.0", + "symfony/filesystem": "^6.4|^7.4|^8.0", + "symfony/phpunit-bridge": "^6.4|^7.4|^8.0", + "symfony/process": "^6.4|^7.4|^8.0" }, "type": "composer-plugin", "extra": { @@ -5362,7 +5736,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.8.1" + "source": "https://github.com/symfony/flex/tree/v2.10.0" }, "funding": [ { @@ -5373,32 +5747,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-05T07:45:19+00:00" + "time": "2025-11-16T09:38:19+00:00" }, { "name": "symfony/form", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "7a48dda96fe16711fc042df38ca1a7dd4d9d6387" + "reference": "4bc84400e208bd82e3a68f88f4fe26b8d4d85181" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/7a48dda96fe16711fc042df38ca1a7dd4d9d6387", - "reference": "7a48dda96fe16711fc042df38ca1a7dd4d9d6387", + "url": "https://api.github.com/repos/symfony/form/zipball/4bc84400e208bd82e3a68f88f4fe26b8d4d85181", + "reference": "4bc84400e208bd82e3a68f88f4fe26b8d4d85181", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/options-resolver": "^6.4|^7.0", + "symfony/options-resolver": "^7.3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", @@ -5459,7 +5837,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.1.6" + "source": "https://github.com/symfony/form/tree/v7.3.10" }, "funding": [ { @@ -5470,25 +5848,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-09T08:46:59+00:00" + "time": "2026-01-23T10:44:29+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8" + "reference": "970f742064631d9d4f32e5488838781b28558515" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8", - "reference": "1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/970f742064631d9d4f32e5488838781b28558515", + "reference": "970f742064631d9d4f32e5488838781b28558515", "shasum": "" }, "require": { @@ -5496,22 +5878,22 @@ "ext-xml": "*", "php": ">=8.2", "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^7.1.5", + "symfony/config": "^7.3", + "symfony/dependency-injection": "^7.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", + "symfony/error-handler": "^7.3", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/filesystem": "^7.1", "symfony/finder": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", + "symfony/http-kernel": "^7.2", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^6.4|^7.0" }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/asset": "<6.4", "symfony/asset-mapper": "<6.4", "symfony/clock": "<6.4", @@ -5520,29 +5902,32 @@ "symfony/dotenv": "<6.4", "symfony/form": "<6.4", "symfony/http-client": "<6.4", + "symfony/json-streamer": ">=7.4", "symfony/lock": "<6.4", "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", "symfony/mime": "<6.4", + "symfony/object-mapper": ">=7.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-core": "<6.4", - "symfony/security-csrf": "<6.4", - "symfony/serializer": "<6.4", + "symfony/security-csrf": "<7.2", + "symfony/serializer": "<7.2.5", "symfony/stopwatch": "<6.4", - "symfony/translation": "<6.4", + "symfony/translation": "<7.3", "symfony/twig-bridge": "<6.4", "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", - "symfony/workflow": "<6.4" + "symfony/webhook": "<7.2", + "symfony/workflow": "<7.3.0-beta2" }, "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", "seld/jsonlint": "^1.10", "symfony/asset": "^6.4|^7.0", "symfony/asset-mapper": "^6.4|^7.0", @@ -5556,11 +5941,13 @@ "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", + "symfony/json-streamer": "7.3.*", "symfony/lock": "^6.4|^7.0", "symfony/mailer": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", "symfony/notifier": "^6.4|^7.0", + "symfony/object-mapper": "^v7.3.0-beta2", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", @@ -5568,18 +5955,19 @@ "symfony/scheduler": "^6.4.4|^7.0.4", "symfony/security-bundle": "^6.4|^7.0", "symfony/semaphore": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", + "symfony/serializer": "^7.2.5", "symfony/stopwatch": "^6.4|^7.0", "symfony/string": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", + "symfony/translation": "^7.3", "symfony/twig-bundle": "^6.4|^7.0", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", + "symfony/webhook": "^7.2", + "symfony/workflow": "^7.3", "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "type": "symfony-bundle", "autoload": { @@ -5607,7 +5995,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/v7.1.11" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.11" }, "funding": [ { @@ -5618,25 +6006,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-29T07:13:42+00:00" + "time": "2026-01-27T08:34:37+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v7.1.11", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "5d928d0dc7823d703282bded46ba80008ce40d81" + "reference": "3855e827adb1b675adcb98ad7f92681e293f2d77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/5d928d0dc7823d703282bded46ba80008ce40d81", - "reference": "5d928d0dc7823d703282bded46ba80008ce40d81", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/3855e827adb1b675adcb98ad7f92681e293f2d77", + "reference": "3855e827adb1b675adcb98ad7f92681e293f2d77", "shasum": "" }, "require": { @@ -5676,7 +6068,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.1.11" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.3.6" }, "funding": [ { @@ -5687,25 +6079,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-10-30T13:22:58+00:00" }, { "name": "symfony/http-client", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "71632c1f13b36cb4c23ccdd255946dc02753afef" + "reference": "2793f0559b19b3d45f57fd7548eb65f197a82fbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/71632c1f13b36cb4c23ccdd255946dc02753afef", - "reference": "71632c1f13b36cb4c23ccdd255946dc02753afef", + "url": "https://api.github.com/repos/symfony/http-client/zipball/2793f0559b19b3d45f57fd7548eb65f197a82fbe", + "reference": "2793f0559b19b3d45f57fd7548eb65f197a82fbe", "shasum": "" }, "require": { @@ -5713,9 +6109,12 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", "symfony/http-foundation": "<6.4" }, @@ -5726,14 +6125,13 @@ "symfony/http-client-implementation": "3.0" }, "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", @@ -5770,7 +6168,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.1.11" + "source": "https://github.com/symfony/http-client/tree/v7.3.11" }, "funding": [ { @@ -5781,12 +6179,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-28T15:50:57+00:00" + "time": "2026-01-27T16:12:03+00:00" }, { "name": "symfony/http-client-contracts", @@ -5868,20 +6270,21 @@ }, { "name": "symfony/http-foundation", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "7ced01aa123612666a7a4fb72c627f969c01fa8d" + "reference": "5347db9d709bb003722abfdc03990f3f21c53db5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7ced01aa123612666a7a4fb72c627f969c01fa8d", - "reference": "7ced01aa123612666a7a4fb72c627f969c01fa8d", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5347db9d709bb003722abfdc03990f3f21c53db5", + "reference": "5347db9d709bb003722abfdc03990f3f21c53db5", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, @@ -5893,6 +6296,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -5925,7 +6329,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.11" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.11" }, "funding": [ { @@ -5936,25 +6340,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T10:33:21+00:00" + "time": "2026-01-27T16:12:03+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "576eb3368037dd139f67b8ac71db56c3f69f7d66" + "reference": "c3b0782ca5b4a368a5fc71a46883be922df1bb39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/576eb3368037dd139f67b8ac71db56c3f69f7d66", - "reference": "576eb3368037dd139f67b8ac71db56c3f69f7d66", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c3b0782ca5b4a368a5fc71a46883be922df1bb39", + "reference": "c3b0782ca5b4a368a5fc71a46883be922df1bb39", "shasum": "" }, "require": { @@ -5962,8 +6370,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -5983,7 +6391,7 @@ "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", "symfony/var-dumper": "<6.4", - "twig/twig": "<3.0.4" + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" @@ -6011,7 +6419,7 @@ "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -6039,7 +6447,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/v7.1.11" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.11" }, "funding": [ { @@ -6050,25 +6458,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-29T07:34:05+00:00" + "time": "2026-01-28T10:19:12+00:00" }, { "name": "symfony/intl", - "version": "v7.1.8", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "e56b243fc0afa5a12bd11dace4002ada5a7d99f8" + "reference": "f5b5b91176221de5d394a15d4ecb236908a756fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/e56b243fc0afa5a12bd11dace4002ada5a7d99f8", - "reference": "e56b243fc0afa5a12bd11dace4002ada5a7d99f8", + "url": "https://api.github.com/repos/symfony/intl/zipball/f5b5b91176221de5d394a15d4ecb236908a756fe", + "reference": "f5b5b91176221de5d394a15d4ecb236908a756fe", "shasum": "" }, "require": { @@ -6125,7 +6537,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.1.8" + "source": "https://github.com/symfony/intl/tree/v7.3.10" }, "funding": [ { @@ -6136,25 +6548,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-08T15:46:42+00:00" + "time": "2026-01-12T12:03:18+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e" + "reference": "8e57eb82ea914604af3fae0df346123f6d1898c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/e1da878cf5f701df5f5c1799bdbf827acee5a76e", - "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/8e57eb82ea914604af3fae0df346123f6d1898c8", + "reference": "8e57eb82ea914604af3fae0df346123f6d1898c8", "shasum": "" }, "require": { @@ -6203,7 +6619,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.1.6" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.10" }, "funding": [ { @@ -6214,12 +6630,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-14T08:49:35+00:00" + "time": "2026-01-03T23:21:50+00:00" }, { "name": "symfony/monolog-bundle", @@ -6303,16 +6723,16 @@ }, { "name": "symfony/options-resolver", - "version": "v7.1.9", + "version": "v7.3.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "0f4099f5306a92487d13b2a4589068c36a93c447" + "reference": "772dfbe01306d03f759d492f6796dd8c9260bb5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0f4099f5306a92487d13b2a4589068c36a93c447", - "reference": "0f4099f5306a92487d13b2a4589068c36a93c447", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/772dfbe01306d03f759d492f6796dd8c9260bb5c", + "reference": "772dfbe01306d03f759d492f6796dd8c9260bb5c", "shasum": "" }, "require": { @@ -6350,7 +6770,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.1.9" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.8" }, "funding": [ { @@ -6361,25 +6781,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-20T11:08:58+00:00" + "time": "2025-11-12T15:21:00+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5" + "reference": "bfbe5a6490e9a911212c8060a22d22405684f6c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/2e618d1af51805e5a1fbda326d00b77c6c1037d5", - "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/bfbe5a6490e9a911212c8060a22d22405684f6c5", + "reference": "bfbe5a6490e9a911212c8060a22d22405684f6c5", "shasum": "" }, "require": { @@ -6422,7 +6846,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.1.6" + "source": "https://github.com/symfony/password-hasher/tree/v7.3.10" }, "funding": [ { @@ -6433,25 +6857,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2026-01-01T22:03:12+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.32.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", "shasum": "" }, "require": { @@ -6500,7 +6928,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" }, "funding": [ { @@ -6511,25 +6939,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-26T13:13:48+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.32.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811" + "reference": "3510b63d07376b04e57e27e82607d468bb134f78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3510b63d07376b04e57e27e82607d468bb134f78", + "reference": "3510b63d07376b04e57e27e82607d468bb134f78", "shasum": "" }, "require": { @@ -6584,7 +7016,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.37.0" }, "funding": [ { @@ -6595,16 +7027,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-21T18:38:29+00:00" + "time": "2026-04-10T16:50:15+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.32.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -6665,7 +7101,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" }, "funding": [ { @@ -6676,6 +7112,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -6685,16 +7125,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.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": { @@ -6746,7 +7186,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" }, "funding": [ { @@ -6757,25 +7197,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.32.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", "shasum": "" }, "require": { @@ -6822,7 +7266,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.37.0" }, "funding": [ { @@ -6830,7 +7274,11 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -6838,20 +7286,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.32.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "000df7860439609837bbe28670b0be15783b7fbf" + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", - "reference": "000df7860439609837bbe28670b0be15783b7fbf", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", "shasum": "" }, "require": { @@ -6898,7 +7346,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" }, "funding": [ { @@ -6909,25 +7357,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-20T12:04:08+00:00" + "time": "2026-04-10T18:47:49+00:00" }, { "name": "symfony/process", - "version": "v7.1.8", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" + "reference": "81fe4ea2c3b8677fa2adfd8e48ba42374ede0e3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", + "url": "https://api.github.com/repos/symfony/process/zipball/81fe4ea2c3b8677fa2adfd8e48ba42374ede0e3b", + "reference": "81fe4ea2c3b8677fa2adfd8e48ba42374ede0e3b", "shasum": "" }, "require": { @@ -6959,7 +7411,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.8" + "source": "https://github.com/symfony/process/tree/v7.3.11" }, "funding": [ { @@ -6970,30 +7422,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-06T14:23:19+00:00" + "time": "2026-01-26T13:14:40+00:00" }, { "name": "symfony/property-access", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "83e46f0266186e76929257426ddaa151248781c6" + "reference": "23cd9b9b8146bd5fcd190e7ecf46c84d18588110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/83e46f0266186e76929257426ddaa151248781c6", - "reference": "83e46f0266186e76929257426ddaa151248781c6", + "url": "https://api.github.com/repos/symfony/property-access/zipball/23cd9b9b8146bd5fcd190e7ecf46c84d18588110", + "reference": "23cd9b9b8146bd5fcd190e7ecf46c84d18588110", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/property-info": "^6.4|^7.0" + "symfony/property-info": "^6.4.32|~7.3.10|^7.4.4" }, "require-dev": { "symfony/cache": "^6.4|^7.0" @@ -7035,7 +7491,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.1.11" + "source": "https://github.com/symfony/property-access/tree/v7.3.10" }, "funding": [ { @@ -7046,34 +7502,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-10T14:50:02+00:00" + "time": "2026-01-05T08:45:46+00:00" }, { "name": "symfony/property-info", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "df9002f8381cc074300dc2bf9726075e4bf00458" + "reference": "dbb6fdca4b222146c5d753011c9ce0a691298728" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/df9002f8381cc074300dc2bf9726075e4bf00458", - "reference": "df9002f8381cc074300dc2bf9726075e4bf00458", + "url": "https://api.github.com/repos/symfony/property-info/zipball/dbb6fdca4b222146c5d753011c9ce0a691298728", + "reference": "dbb6fdca4b222146c5d753011c9ce0a691298728", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "~7.1.9|^7.2.2" + "symfony/type-info": "~7.3.10|^7.4.4" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/reflection-docblock": "<5.2|>=6", "phpdocumentor/type-resolver": "<1.5.1", "symfony/cache": "<6.4", "symfony/dependency-injection": "<6.4", @@ -7120,7 +7581,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.1.11" + "source": "https://github.com/symfony/property-info/tree/v7.3.11" }, "funding": [ { @@ -7131,25 +7592,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2026-01-27T16:12:03+00:00" }, { "name": "symfony/routing", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "07f6463a8ff4377944222b69b126bd5495e9d44e" + "reference": "f66bf4fc34db04b15033d009b3b2f986f6970a67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/07f6463a8ff4377944222b69b126bd5495e9d44e", - "reference": "07f6463a8ff4377944222b69b126bd5495e9d44e", + "url": "https://api.github.com/repos/symfony/routing/zipball/f66bf4fc34db04b15033d009b3b2f986f6970a67", + "reference": "f66bf4fc34db04b15033d009b3b2f986f6970a67", "shasum": "" }, "require": { @@ -7201,7 +7666,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.11" + "source": "https://github.com/symfony/routing/tree/v7.3.10" }, "funding": [ { @@ -7212,25 +7677,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T10:33:21+00:00" + "time": "2026-01-12T12:03:18+00:00" }, { "name": "symfony/runtime", - "version": "v7.1.7", + "version": "v7.3.8", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "9889783c17e8a68fa5e88c8e8a1a85e802558dba" + "reference": "9146981807ca9f0491dea6ccabe36a48e4b12cc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/9889783c17e8a68fa5e88c8e8a1a85e802558dba", - "reference": "9889783c17e8a68fa5e88c8e8a1a85e802558dba", + "url": "https://api.github.com/repos/symfony/runtime/zipball/9146981807ca9f0491dea6ccabe36a48e4b12cc0", + "reference": "9146981807ca9f0491dea6ccabe36a48e4b12cc0", "shasum": "" }, "require": { @@ -7280,7 +7749,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.1.7" + "source": "https://github.com/symfony/runtime/tree/v7.3.8" }, "funding": [ { @@ -7291,25 +7760,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-05T16:45:54+00:00" + "time": "2025-12-05T13:52:21+00:00" }, { "name": "symfony/security-bundle", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "4012dbc0884fc7cbf555615a5aaa16f7c0d3f222" + "reference": "03d6ba1eb048843b0b20a06eec69a681692cdd53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/4012dbc0884fc7cbf555615a5aaa16f7c0d3f222", - "reference": "4012dbc0884fc7cbf555615a5aaa16f7c0d3f222", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/03d6ba1eb048843b0b20a06eec69a681692cdd53", + "reference": "03d6ba1eb048843b0b20a06eec69a681692cdd53", "shasum": "" }, "require": { @@ -7317,15 +7790,15 @@ "ext-xml": "*", "php": ">=8.2", "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4.11|^7.1.4", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/password-hasher": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0", + "symfony/security-core": "^7.3", "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^7.1", + "symfony/security-http": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7357,7 +7830,7 @@ "symfony/twig-bundle": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.0.4", + "twig/twig": "^3.12", "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", @@ -7386,7 +7859,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/v7.1.11" + "source": "https://github.com/symfony/security-bundle/tree/v7.3.10" }, "funding": [ { @@ -7397,29 +7870,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-31T17:57:35+00:00" + "time": "2026-01-10T13:54:35+00:00" }, { "name": "symfony/security-core", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "0931c6bb15b696e1a4da8405c255b3a8673dcb3c" + "reference": "993e1cc5ae5a40eb4e27e3097aa7f242da14f3ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/0931c6bb15b696e1a4da8405c255b3a8673dcb3c", - "reference": "0931c6bb15b696e1a4da8405c255b3a8673dcb3c", + "url": "https://api.github.com/repos/symfony/security-core/zipball/993e1cc5ae5a40eb4e27e3097aa7f242da14f3ec", + "reference": "993e1cc5ae5a40eb4e27e3097aa7f242da14f3ec", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", "symfony/password-hasher": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" @@ -7472,7 +7950,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.1.11" + "source": "https://github.com/symfony/security-core/tree/v7.3.10" }, "funding": [ { @@ -7483,25 +7961,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2026-01-14T09:00:21+00:00" }, { "name": "symfony/security-csrf", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "23b460d3447fd61970e0ed5ec7a0301296a17f06" + "reference": "f885e97aa97d5f892e0fb1bf6788cdd0c6015a7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/23b460d3447fd61970e0ed5ec7a0301296a17f06", - "reference": "23b460d3447fd61970e0ed5ec7a0301296a17f06", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/f885e97aa97d5f892e0fb1bf6788cdd0c6015a7d", + "reference": "f885e97aa97d5f892e0fb1bf6788cdd0c6015a7d", "shasum": "" }, "require": { @@ -7512,7 +7994,9 @@ "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-foundation": "^6.4|^7.0" + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7540,7 +8024,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v7.1.6" + "source": "https://github.com/symfony/security-csrf/tree/v7.3.10" }, "funding": [ { @@ -7551,25 +8035,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2026-01-14T09:00:21+00:00" }, { "name": "symfony/security-http", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80" + "reference": "e38f5df17f2714505f17db2332371eb4047ab0ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80", - "reference": "c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80", + "url": "https://api.github.com/repos/symfony/security-http/zipball/e38f5df17f2714505f17db2332371eb4047ab0ae", + "reference": "e38f5df17f2714505f17db2332371eb4047ab0ae", "shasum": "" }, "require": { @@ -7579,7 +8067,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/polyfill-mbstring": "~1.0", "symfony/property-access": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0", + "symfony/security-core": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7628,7 +8116,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.1.11" + "source": "https://github.com/symfony/security-http/tree/v7.3.10" }, "funding": [ { @@ -7639,51 +8127,55 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-28T15:50:57+00:00" + "time": "2026-01-14T09:00:21+00:00" }, { "name": "symfony/serializer", - "version": "v7.1.11", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "cb88edf0d4d63472c50b5f77bcb3227a103966e6" + "reference": "fbeb7f5ebdf2e938bc7cf726decfb64924e1b785" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/cb88edf0d4d63472c50b5f77bcb3227a103966e6", - "reference": "cb88edf0d4d63472c50b5f77bcb3227a103966e6", + "url": "https://api.github.com/repos/symfony/serializer/zipball/fbeb7f5ebdf2e938bc7cf726decfb64924e1b785", + "reference": "fbeb7f5ebdf2e938bc7cf726decfb64924e1b785", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php84": "^1.30" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/dependency-injection": "<6.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", - "symfony/type-info": "<7.1.5", "symfony/uid": "<6.4", "symfony/validator": "<6.4", "symfony/yaml": "<6.4" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", "symfony/cache": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^7.2", "symfony/error-handler": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", "symfony/form": "^6.4|^7.0", @@ -7694,7 +8186,7 @@ "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1.5", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", @@ -7727,7 +8219,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.1.11" + "source": "https://github.com/symfony/serializer/tree/v7.3.11" }, "funding": [ { @@ -7738,25 +8230,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-29T07:13:42+00:00" + "time": "2026-01-27T08:34:37+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { @@ -7810,7 +8306,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -7821,41 +8317,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-25T09:37:31+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/stimulus-bundle", - "version": "v2.28.1", + "version": "v2.35.0", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "960868a682271e133a631ffb70c7e2ceb5031be6" + "reference": "05af0259f201dbbd15c103bea289989a4b483b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/960868a682271e133a631ffb70c7e2ceb5031be6", - "reference": "960868a682271e133a631ffb70c7e2ceb5031be6", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/05af0259f201dbbd15c103bea289989a4b483b5b", + "reference": "05af0259f201dbbd15c103bea289989a4b483b5b", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0|^8.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0", "symfony/deprecation-contracts": "^2.0|^3.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0|^8.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0", "twig/twig": "^2.15.3|^3.8" }, "require-dev": { - "symfony/asset-mapper": "^6.3|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.3|^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/twig-bundle": "^5.4|^6.0|^7.0|^8.0", "zenstruck/browser": "^1.4" }, "type": "symfony-bundle", @@ -7879,7 +8379,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.28.1" + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.35.0" }, "funding": [ { @@ -7890,25 +8390,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-28T19:36:26+00:00" + "time": "2026-03-22T22:21:50+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05" + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05", - "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "shasum": "" }, "require": { @@ -7941,7 +8445,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.6" + "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" }, "funding": [ { @@ -7957,20 +8461,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-02-24T10:49:57+00:00" }, { "name": "symfony/string", - "version": "v7.1.8", + "version": "v7.3.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281" + "reference": "0b1f55d79b9effb940d376799dba7cf6f2dee420" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281", + "url": "https://api.github.com/repos/symfony/string/zipball/0b1f55d79b9effb940d376799dba7cf6f2dee420", + "reference": "0b1f55d79b9effb940d376799dba7cf6f2dee420", "shasum": "" }, "require": { @@ -7985,7 +8489,6 @@ }, "require-dev": { "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", @@ -8028,7 +8531,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.8" + "source": "https://github.com/symfony/string/tree/v7.3.8" }, "funding": [ { @@ -8039,33 +8542,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-13T13:31:21+00:00" + "time": "2025-11-26T15:55:45+00:00" }, { "name": "symfony/translation", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f" + "reference": "3d2b54fe5a17110022204a1dee79ace0f375dd00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f", + "url": "https://api.github.com/repos/symfony/translation/zipball/3d2b54fe5a17110022204a1dee79ace0f375dd00", + "reference": "3d2b54fe5a17110022204a1dee79ace0f375dd00", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { + "nikic/php-parser": "<5.0", "symfony/config": "<6.4", "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", @@ -8079,7 +8588,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -8122,7 +8631,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.6" + "source": "https://github.com/symfony/translation/tree/v7.3.10" }, "funding": [ { @@ -8133,25 +8642,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-28T12:35:13+00:00" + "time": "2026-01-13T10:28:39+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { @@ -8200,7 +8713,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -8211,37 +8724,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-27T08:32:26+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/twig-bridge", - "version": "v7.1.10", + "version": "v7.3.11", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "c027c54611cd194273b924c8d24d9706695171ff" + "reference": "d89c920f73eb4aaab85f4572cf99ec3a5bed7539" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c027c54611cd194273b924c8d24d9706695171ff", - "reference": "c027c54611cd194273b924c8d24d9706695171ff", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d89c920f73eb4aaab85f4572cf99ec3a5bed7539", + "reference": "d89c920f73eb4aaab85f4572cf99ec3a5bed7539", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.9" + "twig/twig": "^3.21" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/console": "<6.4", - "symfony/form": "<6.4", + "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4", "symfony/http-foundation": "<6.4", "symfony/http-kernel": "<6.4", "symfony/mime": "<6.4", @@ -8252,7 +8770,7 @@ "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", "symfony/asset": "^6.4|^7.0", "symfony/asset-mapper": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -8260,9 +8778,9 @@ "symfony/emoji": "^7.1", "symfony/expression-language": "^6.4|^7.0", "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", + "symfony/form": "^6.4.32|~7.3.10|^7.4.4", "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/http-kernel": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", @@ -8276,12 +8794,13 @@ "symfony/serializer": "^6.4.3|^7.0.3", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, "type": "symfony-bridge", "autoload": { @@ -8309,7 +8828,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.1.10" + "source": "https://github.com/symfony/twig-bridge/tree/v7.3.11" }, "funding": [ { @@ -8320,36 +8839,40 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-19T14:23:39+00:00" + "time": "2026-01-27T08:34:37+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "af902314a71fb412ae412094f7e1d7e49594507b" + "reference": "5dfe33abdd85e23e6297a03dc4afa67d0142ae9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/af902314a71fb412ae412094f7e1d7e49594507b", - "reference": "af902314a71fb412ae412094f7e1d7e49594507b", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5dfe33abdd85e23e6297a03dc4afa67d0142ae9a", + "reference": "5dfe33abdd85e23e6297a03dc4afa67d0142ae9a", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "symfony/twig-bridge": "^7.3", + "twig/twig": "^3.12" }, "conflict": { "symfony/framework-bundle": "<6.4", @@ -8393,7 +8916,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/v7.1.6" + "source": "https://github.com/symfony/twig-bundle/tree/v7.3.10" }, "funding": [ { @@ -8404,40 +8927,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2026-01-06T12:19:16+00:00" }, { "name": "symfony/type-info", - "version": "v7.1.10", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "8f980bdd1d6a2834503afbfcf3f39de8133e48fe" + "reference": "7fe70bebb370c48a034cee53d174db5dff081103" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/8f980bdd1d6a2834503afbfcf3f39de8133e48fe", - "reference": "8f980bdd1d6a2834503afbfcf3f39de8133e48fe", + "url": "https://api.github.com/repos/symfony/type-info/zipball/7fe70bebb370c48a034cee53d174db5dff081103", + "reference": "7fe70bebb370c48a034cee53d174db5dff081103", "shasum": "" }, "require": { "php": ">=8.2", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "phpstan/phpdoc-parser": "<1.0", - "symfony/dependency-injection": "<6.4", - "symfony/property-info": "<6.4" + "phpstan/phpdoc-parser": "<1.30" }, "require-dev": { - "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0" + "phpstan/phpdoc-parser": "^1.30|^2.0" }, "type": "library", "autoload": { @@ -8475,7 +8999,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.1.10" + "source": "https://github.com/symfony/type-info/tree/v7.3.10" }, "funding": [ { @@ -8486,31 +9010,35 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-11T12:11:39+00:00" + "time": "2026-01-08T15:19:42+00:00" }, { "name": "symfony/ux-icons", - "version": "v2.28.0", + "version": "v2.35.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-icons.git", - "reference": "1b48034b46a38595d576a425976dac7b33d428b3" + "reference": "f413a434caeaab4b237d6970d424f125e2bc41cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-icons/zipball/1b48034b46a38595d576a425976dac7b33d428b3", - "reference": "1b48034b46a38595d576a425976dac7b33d428b3", + "url": "https://api.github.com/repos/symfony/ux-icons/zipball/f413a434caeaab4b237d6970d424f125e2bc41cf", + "reference": "f413a434caeaab4b237d6970d424f125e2bc41cf", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/twig-bundle": "^6.4|^7.0" + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0" }, "conflict": { "symfony/flex": "<1.13", @@ -8518,11 +9046,11 @@ }, "require-dev": { "psr/log": "^2|^3", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/http-client": "6.4|^7.0", - "symfony/phpunit-bridge": "^6.3|^7.0", - "symfony/ux-twig-component": "^2.14", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/phpunit-bridge": "^6.3|^7.0|^8.0", + "symfony/ux-twig-component": "^2.14|^3.0", "zenstruck/console-test": "^1.5" }, "type": "symfony-bundle", @@ -8564,7 +9092,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-icons/tree/v2.28.0" + "source": "https://github.com/symfony/ux-icons/tree/v2.35.0" }, "funding": [ { @@ -8575,59 +9103,65 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-25T06:20:58+00:00" + "time": "2026-04-03T05:13:59+00:00" }, { "name": "symfony/ux-live-component", - "version": "v2.26.0", + "version": "v2.35.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-live-component.git", - "reference": "fe860a47f164c4ead89b9cb5cf7d3a13835de0a3" + "reference": "6d8ee60793415ce57806f0618e575afe67dab8e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/fe860a47f164c4ead89b9cb5cf7d3a13835de0a3", - "reference": "fe860a47f164c4ead89b9cb5cf7d3a13835de0a3", + "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/6d8ee60793415ce57806f0618e575afe67dab8e1", + "reference": "6d8ee60793415ce57806f0618e575afe67dab8e1", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/property-access": "^5.4.5|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/stimulus-bundle": "^2.9", - "symfony/ux-twig-component": "^2.25.1", + "symfony/property-access": "^5.4.5|^6.0|^7.0|^8.0", + "symfony/property-info": "^5.4|^6.0|^7.0|^8.0", + "symfony/stimulus-bundle": "^2.9|^3.0", + "symfony/ux-twig-component": "^2.33.0|^3.0", "twig/twig": "^3.10.3" }, "conflict": { "symfony/config": "<5.4.0", "symfony/property-info": "~7.0.0", - "symfony/type-info": "<7.1" + "symfony/type-info": "<7.2" }, "require-dev": { - "doctrine/annotations": "^1.0", + "doctrine/annotations": "^1.0|^2.0", "doctrine/collections": "^1.6.8|^2.0", - "doctrine/doctrine-bundle": "^2.4.3", - "doctrine/orm": "^2.9.4", - "doctrine/persistence": "^2.5.2|^3.0", - "phpdocumentor/reflection-docblock": "5.x-dev", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/options-resolver": "^5.4|^6.0|^7.0", - "symfony/phpunit-bridge": "^6.1|^7.0", - "symfony/security-bundle": "^5.4|^6.0|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^5.4|^6.0|^7.0", + "doctrine/doctrine-bundle": "^2.4.3|^3.0|^4.0", + "doctrine/orm": "^2.9.4|^3.0", + "doctrine/persistence": "^2.5.2|^3.0|^4.0", + "phpdocumentor/reflection-docblock": "^5.6.2", + "symfony/config": "^6.3|^7.0|^8.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0", + "symfony/expression-language": "^5.4|^6.0|^7.0|^8.0", + "symfony/form": "^5.4|^6.0|^7.0|^8.0", + "symfony/framework-bundle": "^5.4|^6.1|^7.0|^8.0", + "symfony/http-kernel": "^6.1|^7.0|^8.0", + "symfony/options-resolver": "^5.4|^6.0|^7.0|^8.0", + "symfony/phpunit-bridge": "^6.1|^7.0|^8.0", + "symfony/security-bundle": "^5.4|^6.0|^7.0|^8.0", + "symfony/serializer": "^5.4|^6.0|^7.0|^8.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0", + "symfony/uid": "^5.4|^6.0|^7.0|^8.0", + "symfony/validator": "^5.4|^6.0|^7.0|^8.0", "zenstruck/browser": "^1.2.0", "zenstruck/foundry": "^2.0" }, @@ -8661,7 +9195,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-live-component/tree/v2.26.0" + "source": "https://github.com/symfony/ux-live-component/tree/v2.35.0" }, "funding": [ { @@ -8672,47 +9206,53 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-31T15:09:39+00:00" + "time": "2026-04-04T16:24:09+00:00" }, { "name": "symfony/ux-twig-component", - "version": "v2.28.0", + "version": "v2.35.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "8b10610f7976aee34c40b51fed2244555ce9ead0" + "reference": "d64b068d8339e905cd48974bdd6e9ba54dc8f247" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/8b10610f7976aee34c40b51fed2244555ce9ead0", - "reference": "8b10610f7976aee34c40b51fed2244555ce9ead0", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/d64b068d8339e905cd48974bdd6e9ba54dc8f247", + "reference": "d64b068d8339e905cd48974bdd6e9ba54dc8f247", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0", "symfony/deprecation-contracts": "^2.2|^3.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0|^8.0", + "symfony/property-access": "^5.4|^6.0|^7.0|^8.0", "twig/twig": "^3.10.3" }, "conflict": { "symfony/config": "<5.4.0" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/phpunit-bridge": "^6.0|^7.0", - "symfony/stimulus-bundle": "^2.9.1", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/webpack-encore-bundle": "^1.15" + "symfony/console": "^5.4|^6.0|^7.0|^8.0", + "symfony/css-selector": "^5.4|^6.0|^7.0|^8.0", + "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|^3.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.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": { @@ -8744,7 +9284,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.28.0" + "source": "https://github.com/symfony/ux-twig-component/tree/v2.35.0" }, "funding": [ { @@ -8755,41 +9295,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T09:05:08+00:00" + "time": "2026-04-03T05:13:59+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a563c5aeacb98cd46f9885a63cf241ea7794b307" + "reference": "3649e629f954658188eb1a83b616fb5a2e5688fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a563c5aeacb98cd46f9885a63cf241ea7794b307", - "reference": "a563c5aeacb98cd46f9885a63cf241ea7794b307", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3649e629f954658188eb1a83b616fb5a2e5688fe", + "reference": "3649e629f954658188eb1a83b616fb5a2e5688fe", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/console": "<6.4" }, "require-dev": { - "ext-iconv": "*", "symfony/console": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -8827,7 +9371,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.11" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.10" }, "funding": [ { @@ -8838,29 +9382,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T11:38:41+00:00" + "time": "2026-01-01T22:03:12+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.1.6", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "90173ef89c40e7c8c616653241048705f84130ef" + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/90173ef89c40e7c8c616653241048705f84130ef", - "reference": "90173ef89c40e7c8c616653241048705f84130ef", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { "symfony/property-access": "^6.4|^7.0", @@ -8903,7 +9452,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.6" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.4" }, "funding": [ { @@ -8914,35 +9463,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/workflow", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/workflow.git", - "reference": "b5dca7ecc55ec401939cd101d1a23d64bbce113b" + "reference": "69c12e250a246dc79a767beb672706ca7637c99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/workflow/zipball/b5dca7ecc55ec401939cd101d1a23d64bbce113b", - "reference": "b5dca7ecc55ec401939cd101d1a23d64bbce113b", + "url": "https://api.github.com/repos/symfony/workflow/zipball/69c12e250a246dc79a767beb672706ca7637c99b", + "reference": "69c12e250a246dc79a767beb672706ca7637c99b", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "2.5|^3" }, "conflict": { "symfony/event-dispatcher": "<6.4" }, "require-dev": { "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/error-handler": "^6.4|^7.0", "symfony/event-dispatcher": "^6.4|^7.0", @@ -8990,7 +9545,7 @@ "workflow" ], "support": { - "source": "https://github.com/symfony/workflow/tree/v7.1.6" + "source": "https://github.com/symfony/workflow/tree/v7.3.10" }, "funding": [ { @@ -9001,29 +9556,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2026-01-05T11:42:02+00:00" }, { "name": "symfony/yaml", - "version": "v7.1.11", + "version": "v7.3.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4921b8c1db90c13ba2ee0520080ef6800912b018" + "reference": "8892cb1e9925201328e19f83825bf3d2ff6c659a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4921b8c1db90c13ba2ee0520080ef6800912b018", - "reference": "4921b8c1db90c13ba2ee0520080ef6800912b018", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8892cb1e9925201328e19f83825bf3d2ff6c659a", + "reference": "8892cb1e9925201328e19f83825bf3d2ff6c659a", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -9061,7 +9621,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.11" + "source": "https://github.com/symfony/yaml/tree/v7.3.8" }, "funding": [ { @@ -9072,35 +9632,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-07T12:50:05+00:00" + "time": "2025-12-04T18:07:52+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.21.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896" + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", "shasum": "" }, "require": { "php": ">=8.1.0", - "symfony/framework-bundle": "^5.4|^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.4|^7.0", + "symfony/framework-bundle": "^5.4|^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^5.4|^6.4|^7.0|^8.0", "twig/twig": "^3.2|^4.0" }, "require-dev": { - "league/commonmark": "^1.0|^2.0", + "league/commonmark": "^2.7", "symfony/phpunit-bridge": "^6.4|^7.0", "twig/cache-extra": "^3.0", "twig/cssinliner-extra": "^3.0", @@ -9139,7 +9703,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.24.0" }, "funding": [ { @@ -9151,20 +9715,20 @@ "type": "tidelift" } ], - "time": "2025-02-19T14:29:33+00:00" + "time": "2026-02-07T08:07:38+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.21.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4" + "reference": "67a11120356e034a5bbc70c5b9b9a4d0f31ca06e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/f4616e1dd375209dacf6026f846e6b537d036ce4", - "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/67a11120356e034a5bbc70c5b9b9a4d0f31ca06e", + "reference": "67a11120356e034a5bbc70c5b9b9a4d0f31ca06e", "shasum": "" }, "require": { @@ -9174,7 +9738,7 @@ }, "require-dev": { "erusev/parsedown": "dev-master as 1.x-dev", - "league/commonmark": "^1.0|^2.0", + "league/commonmark": "^2.7", "league/html-to-markdown": "^4.8|^5.0", "michelf/php-markdown": "^1.8|^2.0", "symfony/phpunit-bridge": "^6.4|^7.0" @@ -9211,7 +9775,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.24.0" }, "funding": [ { @@ -9223,25 +9787,25 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2026-02-07T08:07:38+00:00" }, { "name": "twig/string-extra", - "version": "v3.21.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", - "reference": "4b3337544ac8f76c280def94e32b53acfaec0589" + "reference": "6ec8f2e8ca9b2193221a02cb599dc92c36384368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/string-extra/zipball/4b3337544ac8f76c280def94e32b53acfaec0589", - "reference": "4b3337544ac8f76c280def94e32b53acfaec0589", + "url": "https://api.github.com/repos/twigphp/string-extra/zipball/6ec8f2e8ca9b2193221a02cb599dc92c36384368", + "reference": "6ec8f2e8ca9b2193221a02cb599dc92c36384368", "shasum": "" }, "require": { "php": ">=8.1.0", - "symfony/string": "^5.4|^6.4|^7.0", + "symfony/string": "^5.4|^6.4|^7.0|^8.0", "symfony/translation-contracts": "^1.1|^2|^3", "twig/twig": "^3.13|^4.0" }, @@ -9278,7 +9842,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.24.0" }, "funding": [ { @@ -9290,20 +9854,20 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2025-12-02T14:45:16+00:00" }, { "name": "twig/twig", - "version": "v3.21.1", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0", + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0", "shasum": "" }, "require": { @@ -9313,7 +9877,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" }, @@ -9357,7 +9922,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.21.1" + "source": "https://github.com/twigphp/Twig/tree/v3.24.0" }, "funding": [ { @@ -9369,37 +9934,37 @@ "type": "tidelift" } ], - "time": "2025-05-03T07:21:55+00:00" + "time": "2026-03-17T21:31:11+00:00" }, { "name": "webmozart/assert", - "version": "1.11.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4", + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4", "shasum": "" }, "require": { "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" + "ext-date": "*", + "ext-filter": "*", + "php": "^8.2" }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -9415,6 +9980,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.", @@ -9425,24 +9994,24 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/webmozarts/assert/tree/2.3.0" }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2026-04-11T10:33:05+00:00" } ], "packages-dev": [ { "name": "myclabs/deep-copy", - "version": "1.13.3", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "faed855a7b5f4d4637717c2b3863e277116beb36" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36", - "reference": "faed855a7b5f4d4637717c2b3863e277116beb36", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -9481,7 +10050,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.3" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -9489,20 +10058,20 @@ "type": "tidelift" } ], - "time": "2025-07-05T12:25:42+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nikic/php-parser", - "version": "v5.6.0", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56", - "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -9521,7 +10090,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -9545,9 +10114,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2025-07-27T20:03:57+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -9988,16 +10557,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.23", + "version": "9.6.34", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95" + "reference": "b36f02317466907a230d3aa1d34467041271ef4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b36f02317466907a230d3aa1d34467041271ef4a", + "reference": "b36f02317466907a230d3aa1d34467041271ef4a", "shasum": "" }, "require": { @@ -10008,7 +10577,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", @@ -10019,11 +10588,11 @@ "phpunit/php-timer": "^5.0.3", "sebastian/cli-parser": "^1.0.2", "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", + "sebastian/comparator": "^4.0.10", "sebastian/diff": "^4.0.6", "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", + "sebastian/exporter": "^4.0.8", + "sebastian/global-state": "^5.0.8", "sebastian/object-enumerator": "^4.0.4", "sebastian/resource-operations": "^3.0.4", "sebastian/type": "^3.2.1", @@ -10071,7 +10640,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.23" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.34" }, "funding": [ { @@ -10095,7 +10664,7 @@ "type": "tidelift" } ], - "time": "2025-05-02T06:40:34+00:00" + "time": "2026-01-27T05:45:00+00:00" }, { "name": "sebastian/cli-parser", @@ -10266,16 +10835,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "4.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d", + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d", "shasum": "" }, "require": { @@ -10328,15 +10897,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10" }, "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/sebastian/comparator", + "type": "tidelift" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2026-01-24T09:22:56+00:00" }, { "name": "sebastian/complexity", @@ -10526,16 +11107,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", "shasum": "" }, "require": { @@ -10591,28 +11172,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8" }, "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/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-03-02T06:33:00+00:00" + "time": "2025-09-24T06:03:27+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.7", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { @@ -10655,15 +11248,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" }, "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/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-03-02T06:35:11+00:00" + "time": "2025-08-10T07:10:35+00:00" }, { "name": "sebastian/lines-of-code", @@ -10836,16 +11441,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { @@ -10887,15 +11492,27 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" }, "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/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T06:07:39+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", @@ -11062,16 +11679,16 @@ }, { "name": "symfony/browser-kit", - "version": "v7.1.6", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf" + "reference": "a1e115df7c86200f210814867a61694e6d304256" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/714becc9ba9b20115ffededc58f6b7172dc394cf", - "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a1e115df7c86200f210814867a61694e6d304256", + "reference": "a1e115df7c86200f210814867a61694e6d304256", "shasum": "" }, "require": { @@ -11110,7 +11727,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/v7.1.6" + "source": "https://github.com/symfony/browser-kit/tree/v7.3.10" }, "funding": [ { @@ -11121,25 +11738,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2026-01-13T10:28:39+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.6", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" + "reference": "84321188c4754e64273b46b406081ad9b18e8614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/84321188c4754e64273b46b406081ad9b18e8614", + "reference": "84321188c4754e64273b46b406081ad9b18e8614", "shasum": "" }, "require": { @@ -11175,7 +11796,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.6" + "source": "https://github.com/symfony/css-selector/tree/v7.3.6" }, "funding": [ { @@ -11186,25 +11807,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-10-29T17:24:25+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a" + "reference": "8d9b47c994701cd50d3507062501c1ac2b428aaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a", - "reference": "7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8d9b47c994701cd50d3507062501c1ac2b428aaf", + "reference": "8d9b47c994701cd50d3507062501c1ac2b428aaf", "shasum": "" }, "require": { @@ -11242,7 +11867,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.1.11" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.10" }, "funding": [ { @@ -11253,40 +11878,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2026-01-05T08:45:46+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.64.0", + "version": "v1.67.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a" + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c86da84640b0586e92aee2b276ee3638ef2f425a", - "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a", + "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", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.2|^3", - "symfony/filesystem": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0" }, "conflict": { "doctrine/doctrine-bundle": "<2.10", @@ -11294,13 +11924,14 @@ }, "require-dev": { "composer/semver": "^3.0", - "doctrine/doctrine-bundle": "^2.5.0", + "doctrine/doctrine-bundle": "^2.10|^3.0", "doctrine/orm": "^2.15|^3", - "symfony/http-client": "^6.4|^7.0", - "symfony/phpunit-bridge": "^6.4.1|^7.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/security-http": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", + "doctrine/persistence": "^3.1|^4.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/phpunit-bridge": "^6.4.1|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/security-http": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0", "twig/twig": "^3.0|^4.x-dev" }, "type": "symfony-bundle", @@ -11335,7 +11966,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.64.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.67.0" }, "funding": [ { @@ -11346,37 +11977,37 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-23T16:12:08+00:00" + "time": "2026-03-18T13:39:06+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v7.3.1", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "71624984d8bcad6acf7a790d4e3ceafe04bc2485" + "reference": "140bbbe1cd1c21a084494ccddeee33f3c3381d7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/71624984d8bcad6acf7a790d4e3ceafe04bc2485", - "reference": "71624984d8bcad6acf7a790d4e3ceafe04bc2485", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/140bbbe1cd1c21a084494ccddeee33f3c3381d7d", + "reference": "140bbbe1cd1c21a084494ccddeee33f3c3381d7d", "shasum": "" }, "require": { - "php": ">=7.2.5" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "php": ">=8.1.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.4|^7.0", - "symfony/polyfill-php81": "^1.27" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4.3|^7.0.3|^8.0" }, "bin": [ "bin/simple-phpunit" @@ -11420,7 +12051,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.1" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.4.8" }, "funding": [ { @@ -11431,40 +12062,48 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-04T10:09:06+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v7.1.11", + "version": "v7.3.10", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "328b2728bb5d85d0d38b18d1458834098202afe2" + "reference": "3f288c176f4b70d083c1b37a0b9aa0c4745b2ef3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/328b2728bb5d85d0d38b18d1458834098202afe2", - "reference": "328b2728bb5d85d0d38b18d1458834098202afe2", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3f288c176f4b70d083c1b37a0b9aa0c4745b2ef3", + "reference": "3f288c176f4b70d083c1b37a0b9aa0c4745b2ef3", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/framework-bundle": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/routing": "^6.4|^7.0", "symfony/twig-bundle": "^6.4|^7.0", - "twig/twig": "^3.10" + "twig/twig": "^3.12" }, "conflict": { "symfony/form": "<6.4", "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4" + "symfony/messenger": "<6.4", + "symfony/serializer": "<7.2", + "symfony/workflow": "<7.3" }, "require-dev": { "symfony/browser-kit": "^6.4|^7.0", @@ -11501,7 +12140,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.11" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.10" }, "funding": [ { @@ -11512,25 +12151,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-07T09:23:14+00:00" + "time": "2026-01-07T10:03:30+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -11559,7 +12202,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -11567,20 +12210,20 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.3.13", + "php": "^8.3", "ext-ctype": "*", "ext-iconv": "*", "ext-openssl": "*" }, - "platform-dev": {}, - "plugin-api-version": "2.9.0" + "platform-dev": [], + "plugin-api-version": "2.6.0" } diff --git a/config/packages/csrf.yaml b/config/packages/csrf.yaml new file mode 100644 index 0000000..40d4040 --- /dev/null +++ b/config/packages/csrf.yaml @@ -0,0 +1,11 @@ +# Enable stateless CSRF protection for forms and logins/logouts +framework: + form: + csrf_protection: + token_id: submit + + csrf_protection: + stateless_token_ids: + - submit + - authenticate + - logout diff --git a/config/packages/nyholm_psr7.yaml b/config/packages/nyholm_psr7.yaml new file mode 100644 index 0000000..ade8312 --- /dev/null +++ b/config/packages/nyholm_psr7.yaml @@ -0,0 +1,11 @@ +services: + # Register nyholm/psr7 services for autowiring with PSR-17 (HTTP factories) + Psr\Http\Message\RequestFactoryInterface: '@nyholm.psr7.psr17_factory' + Psr\Http\Message\ResponseFactoryInterface: '@nyholm.psr7.psr17_factory' + Psr\Http\Message\ServerRequestFactoryInterface: '@nyholm.psr7.psr17_factory' + Psr\Http\Message\StreamFactoryInterface: '@nyholm.psr7.psr17_factory' + Psr\Http\Message\UploadedFileFactoryInterface: '@nyholm.psr7.psr17_factory' + Psr\Http\Message\UriFactoryInterface: '@nyholm.psr7.psr17_factory' + + nyholm.psr7.psr17_factory: + class: Nyholm\Psr7\Factory\Psr17Factory diff --git a/config/packages/property_info.yaml b/config/packages/property_info.yaml new file mode 100644 index 0000000..dd31b9d --- /dev/null +++ b/config/packages/property_info.yaml @@ -0,0 +1,3 @@ +framework: + property_info: + with_constructor_extractor: true diff --git a/config/services.yaml b/config/services.yaml index 99cf22d..e675b3d 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -12,6 +12,9 @@ parameters: env(TRUSTED_PROXIES): '127.0.0.0/8,::1' services: + App\Service\HighlightAuthorMetadataProvider: + alias: App\Service\CacheService + # default configuration for services in *this* file _defaults: autowire: true # Automatically injects dependencies in your services. @@ -62,3 +65,9 @@ services: App\Service\Nip05VerificationService: arguments: $appCache: '@cache.app' + +when@test: + services: + Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler: + class: Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler + arguments: ['%kernel.project_dir%/var/sessions_test'] diff --git a/src/Security/NostrAuthenticator.php b/src/Security/NostrAuthenticator.php index 795a72f..3088b45 100644 --- a/src/Security/NostrAuthenticator.php +++ b/src/Security/NostrAuthenticator.php @@ -2,8 +2,8 @@ namespace App\Security; -use App\Entity\Event; use Mdanter\Ecc\Crypto\Signature\SchnorrSignature; +use swentel\nostr\Event\Event; use swentel\nostr\Key\Key; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -13,9 +13,6 @@ use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator; use Symfony\Component\Security\Http\Authenticator\InteractiveAuthenticatorInterface; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport; -use Symfony\Component\Serializer\Encoder\JsonEncoder; -use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; -use Symfony\Component\Serializer\Serializer; /** * Authenticator for Nostr protocol-based authentication. @@ -57,15 +54,31 @@ class NostrAuthenticator extends AbstractAuthenticator implements InteractiveAut } $eventStr = base64_decode(substr($authHeader, 6), true); - $encoders = [new JsonEncoder()]; - $normalizers = [new ObjectNormalizer()]; - $serializer = new Serializer($normalizers, $encoders); - /** @var Event $event */ - $event = $serializer->deserialize($eventStr, Event::class, 'json'); + if (false === $eventStr) { + throw new AuthenticationException('Invalid Authorization header'); + } + try { + $data = json_decode($eventStr, false, 512, \JSON_THROW_ON_ERROR); + } catch (\JsonException) { + throw new AuthenticationException('Invalid Authorization header'); + } + if (!\is_object($data) || !isset( + $data->id, $data->pubkey, $data->created_at, $data->kind, $data->content, $data->sig + )) { + throw new AuthenticationException('Invalid Authorization header'); + } + if (!isset($data->tags) || !\is_array($data->tags)) { + $data->tags = []; + } + $event = (new Event())->populate($data); if (time() > $event->getCreatedAt() + 60) { throw new AuthenticationException('Expired'); } - $validity = (new SchnorrSignature())->verify($event->getPubkey(), $event->getSig(), $event->getId()); + $validity = (new SchnorrSignature())->verify( + $event->getPublicKey(), + $event->getSignature(), + $event->getId() + ); if (!$validity) { throw new AuthenticationException('Invalid Authorization header'); } @@ -73,7 +86,7 @@ class NostrAuthenticator extends AbstractAuthenticator implements InteractiveAut $key = new Key(); return new SelfValidatingPassport( - new UserBadge($key->convertPublicKeyToBech32($event->getPubkey())) + new UserBadge($key->convertPublicKeyToBech32($event->getPublicKey())) ); } diff --git a/src/Service/ArticleBodyHighlightInjector.php b/src/Service/ArticleBodyHighlightInjector.php index 8865ff6..415814a 100644 --- a/src/Service/ArticleBodyHighlightInjector.php +++ b/src/Service/ArticleBodyHighlightInjector.php @@ -13,11 +13,17 @@ use DOMXPath; use swentel\nostr\Key\Key; /** - * Injects kind-9802 highlight ranges into the rendered article body by finding each event’s - * `content` in the visible text (the `context` tag is ignored; the article is the full context). - * Matches across inline elements (e.g. em, strong) by concatenating text in document order. - * If a literal match fails, compares a normalized form (NBSP→space, strip U+00AD / ZW, etc.), - * then maps the match back to the original HTML text (for e‑book style soft hyphens in 9802 content). + * Injects kind-9802 highlight marks into the rendered article body by searching the visible text + * in NIP-84 order: event `content` (highlighted span) first, then the `context` tag when present and + * non-empty, then `textquoteselector` passage. The first string that matches the body wins. + * Matches across inline elements (e.g. em, strong) by concatenating text in document order. Text + * inside a prior `mark.user-highlight__marker` is still considered so a narrower 9802 can + * be nested and receive its own fragment id (deep link from the landing aside). + * If a literal match fails, compares a normalized form (NBSP→space, strip U+00AD / ZW, line breaks, + * etc.) via {@see HighlightEventTags::stringForSearch}, then maps the match back to the original + * HTML text (for e‑book style soft hyphens in 9802 content). CommonMark footnote callouts + * (League CommonMark `sup#fnref…`) are ignored for matching so “realm 1 always” in the DOM does not + * block a NIP-84 passage that says “realm always”. */ final class ArticleBodyHighlightInjector { @@ -28,7 +34,7 @@ final class ArticleBodyHighlightInjector private ?DOMElement $root = null; public function __construct( - private readonly CacheService $cacheService, + private readonly HighlightAuthorMetadataProvider $highlightAuthorMetadata, ) { } @@ -186,17 +192,89 @@ final class ArticleBodyHighlightInjector return []; } $authorJson = $this->buildHighlightAuthorsJson($group); - $resolved = $this->resolveInjectionNeedle($first); - foreach ($this->needleSearchVariants($resolved) as $needle) { - if ($needle === '') { + $bases = $this->injectionNeedleBasesInPriority($first); + if ($bases === []) { + return []; + } + foreach ($bases as $base) { + foreach ($this->needleSearchVariants($base) as $needle) { + if ($needle === '') { + continue; + } + if ($this->tryWrapInDocument($root, $needle, $eid, $authorJson)) { + $this->addFragmentIdAliasesForHighlightGroup($eid, $outEids); + + return $outEids; + } + } + } + + return []; + } + + /** + * One per passage group, with id highlight-{oldest eid}. The landing aside links each + * 9802 by that row's event id, so we add zero-footprint #highlight-{id} spans for every other + * event in the same group (same place in the text as the mark). + * + * @param list $outEids lowercase 64-hex, includes $canonicalEid; first is the oldest + */ + private function addFragmentIdAliasesForHighlightGroup(string $canonicalEid, array $outEids): void + { + if (\count($outEids) < 2) { + return; + } + $mark = $this->getHighlightMarkElementById('highlight-'.$canonicalEid); + if (null === $mark) { + return; + } + $parent = $mark->parentNode; + if (null === $parent) { + return; + } + foreach ($outEids as $other) { + if ($other === $canonicalEid) { + continue; + } + if (64 !== \strlen($other) || !ctype_xdigit($other)) { continue; } - if ($this->tryWrapInDocument($root, $needle, $eid, $authorJson)) { - return $outEids; + if ($this->getHighlightMarkElementById('highlight-'.$other) !== null) { + continue; } + $span = $this->dom->createElement('span'); + if (false === $span) { + continue; + } + $span->setAttribute('id', 'highlight-'.$other); + $span->setAttribute('class', 'user-highlight__fragment-target'); + $span->setAttribute('aria-hidden', 'true'); + $span->appendChild($this->dom->createTextNode("\u{200B}")); + $parent->insertBefore($span, $mark); } + } - return []; + private function getHighlightMarkElementById(string $id): ?DOMElement + { + if (null === $this->root || $id === '') { + return null; + } + $el = $this->dom->getElementById($id); + if ($el instanceof DOMElement) { + return $el; + } + if (! \preg_match('/^highlight-[a-f0-9]{64}$/D', $id)) { + return null; + } + $xp = new DOMXPath($this->dom); + $q = '//*[@id="'.(string) $id.'"]'; + $nodes = $xp->query($q, $this->root); + if (false === $nodes || 0 === $nodes->length) { + return null; + } + $n = $nodes->item(0); + + return $n instanceof DOMElement ? $n : null; } /** @@ -208,13 +286,13 @@ final class ArticleBodyHighlightInjector { $buckets = []; foreach ($sorted as $h) { - $resolved = $this->resolveInjectionNeedle($h); - if ($resolved === '') { + $primary = $this->primaryNeedleForGrouping($h); + if ($primary === '') { continue; } - $key = HighlightEventTags::stringForSearch(\trim($resolved)); + $key = HighlightEventTags::stringForSearch($primary); if ($key === '') { - $key = 'x'.\md5($resolved); + $key = 'x'.\md5($primary); } if (!isset($buckets[$key])) { $buckets[$key] = []; @@ -264,7 +342,7 @@ final class ArticleBodyHighlightInjector $name = ''; $pic = ''; try { - $meta = $this->cacheService->getMetadata($npub); + $meta = $this->highlightAuthorMetadata->getMetadata($npub); if (isset($meta->display_name) && \is_string($meta->display_name) && $meta->display_name !== '') { $name = $meta->display_name; } elseif (isset($meta->name) && \is_string($meta->name) && $meta->name !== '') { @@ -288,14 +366,37 @@ final class ArticleBodyHighlightInjector return \json_encode(\array_values($byNpub), \JSON_UNESCAPED_UNICODE | \JSON_THROW_ON_ERROR); } - private function resolveInjectionNeedle(ArticleHighlight $h): string + /** + * Same priority as the card: event `content` (NIP-84 sub-span) first; if empty, `context` tag; if + * still empty, `textquoteselector` passage. Article injection tries each in order until one + * matches the rendered body (so a highlight with only `textquoteselector` still inlines a mark). + */ + private function primaryNeedleForGrouping(ArticleHighlight $h): string + { + $b = $this->injectionNeedleBasesInPriority($h); + + return $b[0] ?? ''; + } + + /** + * @return list unique non-empty strings, highest priority first + */ + private function injectionNeedleBasesInPriority(ArticleHighlight $h): array { $c = \trim($h->getContent()); - if ($c !== '') { - return $c; + $ctx = \trim(HighlightEventTags::contextFromTags($h->getTags())); + $tq = \trim(HighlightEventTags::textquoteselectorPassageFromTags($h->getTags())); + $out = []; + $seen = []; + foreach ([$c, $ctx, $tq] as $s) { + if ($s === '' || isset($seen[$s])) { + continue; + } + $seen[$s] = true; + $out[] = $s; } - return \trim(HighlightEventTags::contextFromTags($h->getTags())); + return $out; } /** @@ -312,6 +413,14 @@ final class ArticleBodyHighlightInjector $base, $this->replaceTypographicQuotes($base), ]; + $noLineBreaks = (string) \preg_replace('/\R/u', '', $base); + if ($noLineBreaks !== $base && $noLineBreaks !== '') { + $candidates[] = $noLineBreaks; + } + $nEnd = (string) \preg_replace('/[.!?…,;:]+$/u', '', $base); + if ($nEnd !== $base && $nEnd !== '') { + $candidates[] = $nEnd; + } if (\class_exists(\Normalizer::class)) { $c = \Normalizer::normalize($base, \Normalizer::FORM_C); if (\is_string($c) && $c !== '' && $c !== $base) { @@ -460,13 +569,47 @@ final class ArticleBodyHighlightInjector private function shouldNotDescendInto(DOMElement $c): bool { $n = $c->nodeName; - - return 'script' === $n + if ('script' === $n || 'style' === $n || 'pre' === $n || 'textarea' === $n - || 'code' === $n - || 'mark' === $n; + || 'code' === $n) { + return true; + } + if ('div' === $n && $this->isFootnotesOrEndnotesElement($c)) { + // End-of-article footnote list (League CommonMark): must not mix into the body search string + // or after main content, which would desync “flat text” from NIP-84 passages. + return true; + } + if ('sup' === $n && $this->isFootnoteCalloutElement($c)) { + // Inline [^ref] callouts: skip the superscript so "realm" + "1" + " always" does not + // break matching "realm always" from kind-9802 `content` (cards use raw Nostr, not the DOM). + return true; + } + if ('mark' === $n) { + $cl = (string) $c->getAttribute('class'); + + return ! \str_contains($cl, 'user-highlight__marker'); + } + + return false; + } + + private function isFootnoteCalloutElement(DOMElement $c): bool + { + $id = (string) $c->getAttribute('id'); + + return $id !== '' && \str_starts_with($id, 'fnref'); + } + + private function isFootnotesOrEndnotesElement(DOMElement $c): bool + { + if (\str_contains((string) $c->getAttribute('class'), 'footnotes') + || $c->getAttribute('role') === 'doc-endnotes') { + return true; + } + + return false; } private function isSafeTextContext(DOMText $textNode): bool @@ -484,11 +627,12 @@ final class ArticleBodyHighlightInjector if ('code' === $n) { return false; } - if ('mark' === $n) { - $cl = (string) $p->getAttribute('class'); - if (\str_contains($cl, 'user-highlight__marker')) { - return false; - } + if (('div' === $n && $this->isFootnotesOrEndnotesElement($p)) + || ('sup' === $n && $this->isFootnoteCalloutElement($p))) { + return false; + } + if ('a' === $n && \str_contains((string) $p->getAttribute('class'), 'footnote-ref')) { + return false; } $p = $p->parentNode; } diff --git a/src/Service/CacheService.php b/src/Service/CacheService.php index c2b7635..4c140cf 100644 --- a/src/Service/CacheService.php +++ b/src/Service/CacheService.php @@ -11,7 +11,7 @@ use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; use swentel\nostr\Key\Key; -readonly class CacheService +readonly class CacheService implements HighlightAuthorMetadataProvider { public function __construct( private NostrClient $nostrClient, diff --git a/src/Service/HighlightAuthorMetadataProvider.php b/src/Service/HighlightAuthorMetadataProvider.php new file mode 100644 index 0000000..c8e0eed --- /dev/null +++ b/src/Service/HighlightAuthorMetadataProvider.php @@ -0,0 +1,13 @@ +convertPrivateKeyToBech32((new Key())->generatePrivateKey()); + $token = 'Nostr '.$this->signedAuthEventBase64($nsec); + $request = Request::create('/login', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => $token]); - $client->request('GET', '/login', [], [], [ - 'HTTP_Authorization' => $authorizationHeader, - ]); + $out = (new NostrAuthenticator())->authenticate($request); - $response = $client->getResponse(); - $this->assertSame($expectedStatusCode, $response->getStatusCode()); - $this->assertStringContainsString($expectedContent, $response->getContent()); + $this->assertInstanceOf(SelfValidatingPassport::class, $out); } - /** - * @throws \JsonException - */ - public function provideAuthenticationData(): array + public function testInvalidAuthorizationHeaderThrows(): void { - // Boot the kernel manually - $kernel = new Kernel('local', true); - $kernel->boot(); - $container = $kernel->getContainer(); + $this->expectException(AuthenticationException::class); + $request = Request::create('/login', 'GET', [], [], [], [ + 'HTTP_AUTHORIZATION' => 'InvalidHeader', + ]); + (new NostrAuthenticator())->authenticate($request); + } - $nsec = $container->getParameter('nsec'); + public function testExpiredEventThrows(): void + { + $this->expectException(AuthenticationException::class); + $this->expectExceptionMessage('Expired'); + $expiredToken = 'Nostr eyJjcmVhdGVkX2F0IjoxNzMzMzIxMzUyLCJraW5kIjoyNzIzNSwidGFncyI6W1sidSIsImh0dHBzOi8vbG9jYWxob3N0L2xvZ2luIl0sWyJtZXRob2QiLCJHRVQiXV0sImNvbnRlbnQiOiIiLCJwdWJrZXkiOiJkNDc1Y2U0YjM5Nzc1MDcxMzBmNDJjN2Y4NjM0NmVmOTM2ODAwZjNhZTc0ZDVlY2Y4MDg5MjgwY2RjMTkyM2U5IiwiaWQiOiJhYjA4NGM1NWQ5Y2UzMDliN2UxNzIyZGI2ODNjZTc2ZDg5NGNjN2QyYTIzZTRkNWUyMTUyYTM2Y2M2ODI1MTQ5Iiwic2lnIjoiOWI1Yjk2YjhkN2U2ZGM4YWU3ZmM4NjU2ZTE0NDVlZjkwYzc1YWQxNzZkYTRmNmNhMjI0NTRkNTJjNTk3ZTBmNjYwZjAwZjE3MmIxYjMzYzM4YTg2Y2U0YTBiMTdmMDgwMWEyNzJmZmVmYWU0NmY2OTgzZGZjYjRlM2YyZDgwZGYifQ=='; + $request = Request::create('/login', 'GET', [], [], [], [ + 'HTTP_AUTHORIZATION' => $expiredToken, + ]); + (new NostrAuthenticator())->authenticate($request); + } + private function signedAuthEventBase64(string $nsec): string + { $note = new Event(); $note->setContent(''); $note->setKind(27235); $note->setTags([ - ["u", "https://localhost/login"], - ["method", "POST"] + ['u', 'https://localhost/login'], + ['method', 'POST'], ]); - $signer = new Sign(); - $signer->signEvent($note, $nsec); - $ser = $note->toJson(); - $validToken = 'Nostr ' . base64_encode($ser); - - $expiredToken = 'Nostr eyJjcmVhdGVkX2F0IjoxNzMzMzIxMzUyLCJraW5kIjoyNzIzNSwidGFncyI6W1sidSIsImh0dHBzOi8vbG9jYWxob3N0L2xvZ2luIl0sWyJtZXRob2QiLCJHRVQiXV0sImNvbnRlbnQiOiIiLCJwdWJrZXkiOiJkNDc1Y2U0YjM5Nzc1MDcxMzBmNDJjN2Y4NjM0NmVmOTM2ODAwZjNhZTc0ZDVlY2Y4MDg5MjgwY2RjMTkyM2U5IiwiaWQiOiJhYjA4NGM1NWQ5Y2UzMDliN2UxNzIyZGI2ODNjZTc2ZDg5NGNjN2QyYTIzZTRkNWUyMTUyYTM2Y2M2ODI1MTQ5Iiwic2lnIjoiOWI1Yjk2YjhkN2U2ZGM4YWU3ZmM4NjU2ZTE0NDVlZjkwYzc1YWQxNzZkYTRmNmNhMjI0NTRkNTJjNTk3ZTBmNjYwZjAwZjE3MmIxYjMzYzM4YTg2Y2U0YTBiMTdmMDgwMWEyNzJmZmVmYWU0NmY2OTgzZGZjYjRlM2YyZDgwZGYifQ=='; - - $invalidToken = 'InvalidHeader'; + (new Sign())->signEvent($note, $nsec); - return [ - // Scenario: Valid token - 'valid_token' => [ - 'authorizationHeader' => $validToken, - 'expectedStatusCode' => Response::HTTP_OK, - 'expectedContent' => 'Authentication Successful', - ], - // Scenario: Expired token - 'expired_token' => [ - 'authorizationHeader' => $expiredToken, - 'expectedStatusCode' => Response::HTTP_UNAUTHORIZED, - 'expectedContent' => 'Unauthenticated', - ], - // Scenario: Invalid header - 'invalid_token' => [ - 'authorizationHeader' => $invalidToken, - 'expectedStatusCode' => Response::HTTP_UNAUTHORIZED, - 'expectedContent' => 'Unauthenticated', - ] - ]; + return base64_encode($note->toJson()); } } diff --git a/tests/Service/ArticleBodyHighlightInjectorTest.php b/tests/Service/ArticleBodyHighlightInjectorTest.php new file mode 100644 index 0000000..d8165cb --- /dev/null +++ b/tests/Service/ArticleBodyHighlightInjectorTest.php @@ -0,0 +1,177 @@ +First passage alpha.

Second passage beta.

Third passage gamma.

'; + $e1 = '00000000000000000000000000000000000000000000000000000000000000a1'; + $e2 = '00000000000000000000000000000000000000000000000000000000000000a2'; + $e3 = '00000000000000000000000000000000000000000000000000000000000000a3'; + $highlights = [ + $this->makeHighlight($e1, 'First passage alpha.', [], 100), + $this->makeHighlight($e2, 'Second passage beta.', [], 200), + $this->makeHighlight($e3, 'Third passage gamma.', [], 300), + ]; + $injector = $this->createInjector(); + $out = $injector->inject($html, $highlights); + + $this->assertCount(3, $out['injectedEventIds'], 'Each highlight with a unique matching passage should inject.'); + $this->assertHighlightFragmentsPresent($out['html'], [$e1, $e2, $e3]); + } + + public function testSamePassageFromTwoEventsYieldsFragmentIdForEachEventId(): void + { + $html = '

Shared quote text for two readers.

'; + $older = '00000000000000000000000000000000000000000000000000000000000000b1'; + $newer = '00000000000000000000000000000000000000000000000000000000000000b2'; + $highlights = [ + $this->makeHighlight($older, 'Shared quote text for two readers.', [], 10), + $this->makeHighlight($newer, 'Shared quote text for two readers.', [], 20), + ]; + $out = $this->createInjector()->inject($html, $highlights); + + $this->assertCount(2, $out['injectedEventIds']); + $this->assertHighlightFragmentsPresent($out['html'], [$older, $newer]); + } + + public function testContextTagUsedWhenContentIsSubspanOfContext(): void + { + $html = '

Before the important bit the rest of the sentence.

'; + $eid = '00000000000000000000000000000000000000000000000000000000000000c1'; + $context = 'Before the important bit the rest of the sentence.'; + $content = 'important bit'; + $highlights = [ + $this->makeHighlight( + $eid, + $content, + [['context', $context]], + 100 + ), + ]; + $out = $this->createInjector()->inject($html, $highlights); + + $this->assertContains($eid, $out['injectedEventIds'], 'NIP-84: highlight `content` as subspan of `context` should still match the body.'); + $this->assertHighlightFragmentsPresent($out['html'], [$eid]); + } + + public function testCurlyApostropheAndEllipsisInBodyMatchAsciiNeedleFromEvent(): void + { + // Landing “highlight” cards use NIP-84 text as stored; the article body is rendered by + // CommonMark + SmartPunct, which uses U+2019 (’) and U+2026 (…) in the DOM while clients + // often send straight ASCII in 9802 `content`. stringForSearch must fold typography. + $apostrophe = "\xE2\x80\x99"; + $ellipsis = "\xE2\x80\xA6"; + // "Here" + ’ + "s" (SmartPunct), not "it" + ’ + "s" + $html = '

Here'.$apostrophe.'s the point'.$ellipsis.'

'; + $eid = '00000000000000000000000000000000000000000000000000000000000000d1'; + $highlights = [ + $this->makeHighlight($eid, "Here's the point...", [], 1), + ]; + $out = $this->createInjector()->inject($html, $highlights); + + $this->assertContains($eid, $out['injectedEventIds']); + $this->assertHighlightFragmentsPresent($out['html'], [$eid]); + } + + public function testBorisBitcoinIsTimeHighlightWithSoftHyphensInjectsDespiteFootnoteCalloutInBody(): void + { + // Real kind-9802: `content` uses U+00AD in "infor­ma­tion­al" (read.withboris / Gigi’s article). + // The article body is plain "informational"; footnotes break substring search if we keep text. + $content = 'keeping track of things in the infor'."\xC2\xAD".'ma'."\xC2\xAD".'tional realm always implies keeping track of time'; + $html = '

keeping track of things in the informational realm' + .'1' + .' always implies keeping track of time

'; + $eid = 'f56a6221e8575b051cd6df34e9b61654e08a241b4c5ced3b48c0b769b24ada7d'; + $highlights = [ + $this->makeHighlight( + $eid, + $content, + [['a', '30023:6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93:bitcoin-is-time']], + 1762697677 + ), + ]; + $out = $this->createInjector()->inject($html, $highlights); + + $this->assertContains($eid, $out['injectedEventIds']); + $this->assertHighlightFragmentsPresent($out['html'], [$eid]); + } + + public function testSoftHyphenInBodyMatchesPlainNeedleFromEvent(): void + { + $softHyphen = "\xC2\xAD"; + $html = '

Time and order have a very intimate relation'.$softHyphen.'ship.

'; + $eid = '00000000000000000000000000000000000000000000000000000000000000e1'; + $highlights = [ + $this->makeHighlight($eid, 'Time and order have a very intimate relationship.', [], 1), + ]; + $out = $this->createInjector()->inject($html, $highlights); + + $this->assertContains($eid, $out['injectedEventIds']); + $this->assertHighlightFragmentsPresent($out['html'], [$eid]); + } + + private function createInjector(): ArticleBodyHighlightInjector + { + $meta = $this->createMock(HighlightAuthorMetadataProvider::class); + $meta->method('getMetadata')->willReturn( + (object) [ + 'display_name' => 'Test', + 'name' => 'Test', + 'picture' => '', + ] + ); + + return new ArticleBodyHighlightInjector($meta); + } + + /** + * @param list $eventIdsLowerOrMixed 64-char hex event ids + */ + private function assertHighlightFragmentsPresent(string $html, array $eventIds): void + { + foreach ($eventIds as $eid) { + $eid = strtolower($eid); + $this->assertMatchesRegularExpression( + '/\bid="highlight-'.preg_quote($eid, '/').'"/', + $html, + 'Expected in-article fragment id highlight-'.$eid + ); + } + } + + private function makeHighlight( + string $eventId64, + string $content, + array $tags, + int $createdAt, + ): ArticleHighlight { + $h = new ArticleHighlight(); + $h->setEventId($eventId64); + $h->setContent($content); + $h->setTags($tags); + $h->setEventCreatedAt($createdAt); + $h->setAuthorPubkey(self::AUTHOR_HEX); + + return $h; + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 47a5855..bc0e6dd 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -8,6 +8,6 @@ if (method_exists(Dotenv::class, 'bootEnv')) { (new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); } -if ($_SERVER['APP_DEBUG']) { +if (!empty($_SERVER['APP_DEBUG'])) { umask(0000); }