Skip to content
Snippets Groups Projects
Commit cc5276ca authored by Mikael Meulle's avatar Mikael Meulle
Browse files

Issue #3514886 by just_like_good_vibes: Cope with invalid json schema...

Issue #3514886 by just_like_good_vibes: Cope with invalid json schema references in SDC components (Site error when enabled on Drupal CMS)
parent 198f9622
No related branches found
No related tags found
1 merge request!357Issue #3514886 by just_like_good_vibes: Site error when enabled on Drupal CMS
Pipeline #455555 passed
......@@ -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(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.
// So we load ui patterns refs in a second step.
// @todo improve error handling and logging?
$prop = $this->referencesSolver->resolve($prop);
}
}
/**
* Add attributes prop.
*
......
......@@ -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;
......
......@@ -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.
......@@ -40,7 +39,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
......
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment