From 9cd33376aa13ffb9d91bd9185ca87e67fe99ea27 Mon Sep 17 00:00:00 2001
From: just_like_good_vibes <mickael@meulle.com>
Date: Sun, 23 Mar 2025 21:42:38 +0100
Subject: [PATCH 1/3] fixed

---
 src/ComponentPluginManager.php           | 20 ++++++++++++++------
 src/SchemaManager/ReferencesResolver.php | 22 +++++++++++++++++++++-
 ui_patterns.services.yml                 |  2 ++
 3 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/src/ComponentPluginManager.php b/src/ComponentPluginManager.php
index c2e42d28d..adc8dfaf5 100644
--- a/src/ComponentPluginManager.php
+++ b/src/ComponentPluginManager.php
@@ -239,12 +239,7 @@ class ComponentPluginManager extends SdcPluginManager implements CategorizingPlu
   protected function annotateProp(string $prop_id, array $prop, string $fallback_prop_type_id): array {
     $prop["title"] = $prop["title"] ?? $prop_id;
 
-    if (isset($prop['$ref']) && str_starts_with($prop['$ref'], "ui-patterns://") === FALSE) {
-      // We need to resolve non ui-patterns before guessFromSchema.
-      // To load refs including "ui-patterns" leads to wrong type mapping.
-      // So we load ui patterns refs in a second step.
-      $prop = $this->referencesSolver->resolve($prop);
-    }
+    $this->resolveJsonSchemaReference($prop);
     $prop_type = $this->propTypePluginManager->guessFromSchema($prop);
     if ($prop_type->getPluginId() === $fallback_prop_type_id) {
       // Sometimes, a prop JSON schema is different enough to not be caught by
@@ -273,6 +268,19 @@ class ComponentPluginManager extends SdcPluginManager implements CategorizingPlu
     return $prop;
   }
 
+  /**
+   * Resolve a JSON schema reference.
+   */
+  protected function resolveJsonSchemaReference(&$prop) {
+    if (isset($prop['$ref']) && str_starts_with($prop['$ref'], "ui-patterns://") === FALSE) {
+      // We need to resolve non ui-patterns before guessFromSchema.
+      // To load refs including "ui-patterns" leads to wrong type mapping.
+      // So we load ui patterns refs in a second step.
+      // @todo improve error handling and logging?
+      $prop = $this->referencesSolver->resolve($prop);
+    }
+  }
+
   /**
    * Add attributes prop.
    *
diff --git a/src/SchemaManager/ReferencesResolver.php b/src/SchemaManager/ReferencesResolver.php
index f3295c1af..308d4013d 100644
--- a/src/SchemaManager/ReferencesResolver.php
+++ b/src/SchemaManager/ReferencesResolver.php
@@ -5,7 +5,9 @@ declare(strict_types=1);
 namespace Drupal\ui_patterns\SchemaManager;
 
 use JsonSchema\Constraints\BaseConstraint;
+use JsonSchema\Exception\RuntimeException;
 use JsonSchema\SchemaStorage;
+use Psr\Log\LoggerInterface;
 
 /**
  * JSON Schema References resolver.
@@ -18,6 +20,14 @@ class ReferencesResolver {
 
   const MAXIMUM_RECURSIVITY_LEVEL = 10;
 
+  /**
+   * Constructs a ComponentElementBuilder.
+   */
+  public function __construct(
+    protected LoggerInterface $logger,
+  ) {
+  }
+
   /**
    * Resolve schema references recursively.
    */
@@ -28,7 +38,17 @@ class ReferencesResolver {
     $depth = $depth + 1;
     $schema = BaseConstraint::arrayToObjectRecursive($schema);
     $storage = new SchemaStorage();
-    $schema = (array) $storage->resolveRefSchema($schema);
+    try {
+      $schema = (array) $storage->resolveRefSchema($schema);
+    }
+    catch (RuntimeException $e) {
+      $schema = (array) $schema;
+      $this->logger->error(t("Could not resolve schema referenced by \$ref property '@ref': @error", [
+        "@ref" => $schema['$ref'] ?? '',
+        "@error" => $e->getMessage(),
+      ]));
+
+    }
     foreach ($schema as $key => $value) {
       if (!is_object($value)) {
         continue;
diff --git a/ui_patterns.services.yml b/ui_patterns.services.yml
index fc03ba97b..154e8d253 100644
--- a/ui_patterns.services.yml
+++ b/ui_patterns.services.yml
@@ -68,6 +68,8 @@ services:
     class: Drupal\ui_patterns\SchemaManager\Canonicalizer
   ui_patterns.schema_reference_solver:
     class: Drupal\ui_patterns\SchemaManager\ReferencesResolver
+    arguments:
+      - "@logger.channel.ui_patterns"
 
   # Others.
   ui_patterns.twig.extension:
-- 
GitLab


From 6511c9e40cfdc7df5a5e15b04b440880dc401577 Mon Sep 17 00:00:00 2001
From: just_like_good_vibes <mickael@meulle.com>
Date: Sun, 23 Mar 2025 21:59:36 +0100
Subject: [PATCH 2/3] updated

---
 src/ComponentPluginManager.php         | 2 +-
 tests/src/Kernel/SchemaManagerTest.php | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/ComponentPluginManager.php b/src/ComponentPluginManager.php
index adc8dfaf5..d3cb845c3 100644
--- a/src/ComponentPluginManager.php
+++ b/src/ComponentPluginManager.php
@@ -271,7 +271,7 @@ class ComponentPluginManager extends SdcPluginManager implements CategorizingPlu
   /**
    * Resolve a JSON schema reference.
    */
-  protected function resolveJsonSchemaReference(&$prop) {
+  protected function resolveJsonSchemaReference(array &$prop) : void {
     if (isset($prop['$ref']) && str_starts_with($prop['$ref'], "ui-patterns://") === FALSE) {
       // We need to resolve non ui-patterns before guessFromSchema.
       // To load refs including "ui-patterns" leads to wrong type mapping.
diff --git a/tests/src/Kernel/SchemaManagerTest.php b/tests/src/Kernel/SchemaManagerTest.php
index f8759fdec..a8b717b10 100644
--- a/tests/src/Kernel/SchemaManagerTest.php
+++ b/tests/src/Kernel/SchemaManagerTest.php
@@ -40,7 +40,7 @@ final class SchemaManagerTest extends KernelTestBase {
    * @dataProvider provideResolveData
    */
   public function testResolve(array $schema, array $expected): void {
-    $resolver = new ReferencesResolver();
+    $resolver = \Drupal::service("ui_patterns.schema_reference_solver");
     $result = $resolver->resolve($schema);
 
     // Skipping everything under patternProperties keys
-- 
GitLab


From a058ea7303883fcae971093e71c739aaba218354 Mon Sep 17 00:00:00 2001
From: Mikael Meulle <21535-just_like_good_vibes@users.noreply.drupalcode.org>
Date: Sun, 23 Mar 2025 21:49:02 +0000
Subject: [PATCH 3/3] Edit SchemaManagerTest.php

---
 tests/src/Kernel/SchemaManagerTest.php | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tests/src/Kernel/SchemaManagerTest.php b/tests/src/Kernel/SchemaManagerTest.php
index a8b717b10..92bf80972 100644
--- a/tests/src/Kernel/SchemaManagerTest.php
+++ b/tests/src/Kernel/SchemaManagerTest.php
@@ -6,7 +6,6 @@ namespace Drupal\Tests\ui_patterns\Kernel;
 
 use Drupal\Component\Serialization\Yaml;
 use Drupal\KernelTests\KernelTestBase;
-use Drupal\ui_patterns\SchemaManager\ReferencesResolver;
 
 /**
  * Test SchemaManager parts.
-- 
GitLab