From: =?utf-8?q?David_Pr=C3=A9vot?= <david@tilapin.org>
Date: Sun, 4 May 2025 00:21:42 +0200
Subject: Workaround the lack of InstalledVersions::getVersion

Forwarded: not-needed
---
 .../DebugBundle/DependencyInjection/Configuration.php       |  2 +-
 .../FrameworkBundle/DependencyInjection/Configuration.php   |  2 +-
 .../DependencyInjection/MainConfiguration.php               |  2 +-
 .../Bundle/TwigBundle/DependencyInjection/Configuration.php |  2 +-
 .../WebProfilerBundle/DependencyInjection/Configuration.php |  2 +-
 .../Component/Config/Definition/Builder/NodeDefinition.php  | 13 +++++++++++++
 .../Config/Tests/Definition/Builder/NodeDefinitionTest.php  |  2 +-
 7 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php
index a72034d..561f0bf 100644
--- a/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php
+++ b/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php
@@ -27,7 +27,7 @@ class Configuration implements ConfigurationInterface
 
         $rootNode = $treeBuilder->getRootNode();
         $rootNode
-            ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/debug.html', 'symfony/debug-bundle')
+            ->docUrlNoComposer('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/debug.html', 'symfony/debug-bundle', '@VERSION@')
             ->children()
                 ->integerNode('max_items')
                     ->info('Max number of displayed items past the first level, -1 means no limit.')
diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
index e8e11d0..487173d 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
@@ -77,7 +77,7 @@ class Configuration implements ConfigurationInterface
         $rootNode = $treeBuilder->getRootNode();
 
         $rootNode
-            ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/framework.html', 'symfony/framework-bundle')
+            ->docUrlNoComposer('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/framework.html', 'symfony/framework-bundle', '@VERSION@')
             ->beforeNormalization()
                 ->ifArray()
                 ->then(static function ($v) {
diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php
index 7871520..7adaafc 100644
--- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php
+++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php
@@ -55,7 +55,7 @@ class MainConfiguration implements ConfigurationInterface
         $rootNode = $tb->getRootNode();
 
         $rootNode
-            ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/security.html', 'symfony/security-bundle')
+            ->docUrlNoComposer('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/security.html', 'symfony/security-bundle', '@VERSION@')
             ->beforeNormalization()
                 ->ifArray()
                 ->then(static function ($v) {
diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php
index 36a58ba..41f10dc 100644
--- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php
+++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php
@@ -32,7 +32,7 @@ class Configuration implements ConfigurationInterface
         $rootNode = $treeBuilder->getRootNode();
 
         $rootNode
-            ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/twig.html', 'symfony/twig-bundle')
+            ->docUrlNoComposer('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/twig.html', 'symfony/twig-bundle', '@VERSION@')
         ->end();
 
         $this->addFormThemesSection($rootNode);
diff --git a/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php
index 649bf45..f3ec64c 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php
+++ b/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php
@@ -33,7 +33,7 @@ class Configuration implements ConfigurationInterface
 
         $treeBuilder
             ->getRootNode()
-            ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/web_profiler.html', 'symfony/web-profiler-bundle')
+            ->docUrlNoComposer('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/web_profiler.html', 'symfony/web-profiler-bundle', '@VERSION@')
             ->children()
                 ->arrayNode('toolbar')
                     ->info('Profiler toolbar configuration')
diff --git a/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php b/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php
index 594bcdd..a4b3958 100644
--- a/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php
+++ b/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php
@@ -118,6 +118,19 @@ abstract class NodeDefinition implements NodeParentInterface
         ]));
     }
 
+    public function docUrlNoComposer(string $uri, ?string $package = null, ?string $version = null): static
+    {
+        if ($package) {
+            preg_match('/^(\d+)\.(\d+)\.(\d+)/', $version ?? '', $m);
+        }
+
+        return $this->attribute('docUrl', strtr($uri, [
+            '{package}' => $package ?? '',
+            '{version:major}' => $m[1] ?? '',
+            '{version:minor}' => $m[2] ?? '',
+        ]));
+    }
+
     /**
      * Sets an attribute on the node.
      *
diff --git a/src/Symfony/Component/Config/Tests/Definition/Builder/NodeDefinitionTest.php b/src/Symfony/Component/Config/Tests/Definition/Builder/NodeDefinitionTest.php
index 07fd48d..149cca4 100644
--- a/src/Symfony/Component/Config/Tests/Definition/Builder/NodeDefinitionTest.php
+++ b/src/Symfony/Component/Config/Tests/Definition/Builder/NodeDefinitionTest.php
@@ -47,7 +47,7 @@ class NodeDefinitionTest extends TestCase
     public function testDocUrl()
     {
         $node = new ArrayNodeDefinition('node');
-        $node->docUrl('https://example.com/doc/{package}/{version:major}.{version:minor}', 'phpunit/phpunit');
+        $node->docUrlNoComposer('https://example.com/doc/{package}/{version:major}.{version:minor}', 'phpunit/phpunit', '12.1.4');
 
         $r = new \ReflectionObject($node);
         $p = $r->getProperty('attributes');
