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