diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 92298b9..5c79605 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -53,8 +53,10 @@ jobs: strategy: matrix: php-version: + - "8.1" + - "8.2" + - "8.3" - "8.4" - - "8.5" dependencies: - "lowest" @@ -87,8 +89,10 @@ jobs: strategy: matrix: php-version: + - "8.1" + - "8.2" + - "8.3" - "8.4" - - "8.5" dependencies: - "lowest" @@ -121,8 +125,10 @@ jobs: strategy: matrix: php-version: + - "8.1" + - "8.2" + - "8.3" - "8.4" - - "8.5" dependencies: - "lowest" diff --git a/composer.json b/composer.json index 7f3118c..7b681e3 100644 --- a/composer.json +++ b/composer.json @@ -10,14 +10,23 @@ } ], "require": { - "php": ">=8.4", + "php": ">=8.1", "cuyz/valinor": "^2.0", "psr/log": "^1.1 || ^2.0 || ^3.0", "setono/html-element": "^1.0", "symfony/options-resolver": "^6.4 || ^7.0 || ^8.0" }, "require-dev": { - "setono/code-quality-pack": "^3.4" + "ergebnis/composer-normalize": "^2.45", + "infection/infection": "^0.28 || ^0.29 || ^0.32", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^10.5 || ^11.5", + "rector/rector": "^2.0", + "shipmonk/composer-dependency-analyser": "^1.8", + "sylius-labs/coding-standard": "^4.5" }, "prefer-stable": true, "autoload": { diff --git a/rector.php b/rector.php index 9ee4fe1..3660d8d 100644 --- a/rector.php +++ b/rector.php @@ -12,7 +12,7 @@ __DIR__ . '/src', __DIR__ . '/tests', ]) - ->withPhpSets(php84: true) + ->withPhpSets(php81: true) ->withAttributesSets(phpunit: true) ->withSets([ PHPUnitSetList::PHPUNIT_100, diff --git a/src/Block/Image/File.php b/src/Block/Image/File.php index d798cd4..d89d419 100644 --- a/src/Block/Image/File.php +++ b/src/Block/Image/File.php @@ -5,9 +5,9 @@ namespace Setono\EditorJS\Block\Image; // todo right now it doesn't support the extra data you can set on the File object (see https://github.com/editor-js/image#providing-custom-uploading-methods) -final readonly class File +final class File { - public function __construct(public string $url) + public function __construct(public readonly string $url) { } } diff --git a/src/Block/ListBlock.php b/src/Block/ListBlock.php index 3b674c4..3c6c23a 100644 --- a/src/Block/ListBlock.php +++ b/src/Block/ListBlock.php @@ -6,9 +6,9 @@ final class ListBlock extends Block { - public const string STYLE_ORDERED = 'ordered'; + public const STYLE_ORDERED = 'ordered'; - public const string STYLE_UNORDERED = 'unordered'; + public const STYLE_UNORDERED = 'unordered'; /** * This is a helper property containing the html tag for the list (i.e. ol/ul) diff --git a/src/BlockRenderer/DelimiterBlockRenderer.php b/src/BlockRenderer/DelimiterBlockRenderer.php index 6b0ce85..b320017 100644 --- a/src/BlockRenderer/DelimiterBlockRenderer.php +++ b/src/BlockRenderer/DelimiterBlockRenderer.php @@ -18,7 +18,7 @@ public function render(Block $block): HtmlElement $tag = $this->getOption('tag'); - return new HtmlElement(is_string($tag) ? $tag : 'hr')->withClass($this->getClassOption('class')); + return (new HtmlElement(is_string($tag) ? $tag : 'hr'))->withClass($this->getClassOption('class')); } /** @@ -29,7 +29,6 @@ public function supports(Block $block): bool return $block instanceof DelimiterBlock; } - #[\Override] protected function configureOptions(OptionsResolver $optionsResolver): void { parent::configureOptions($optionsResolver); diff --git a/src/BlockRenderer/EmbedBlockRenderer.php b/src/BlockRenderer/EmbedBlockRenderer.php index 59cff9b..b73630d 100644 --- a/src/BlockRenderer/EmbedBlockRenderer.php +++ b/src/BlockRenderer/EmbedBlockRenderer.php @@ -31,7 +31,6 @@ public function render(Block $block): HtmlElement )->withClass($this->getClassOption('containerClass')); } - #[\Override] protected function configureOptions(OptionsResolver $optionsResolver): void { parent::configureOptions($optionsResolver); diff --git a/src/BlockRenderer/HeaderBlockRenderer.php b/src/BlockRenderer/HeaderBlockRenderer.php index 33810ba..abdadfa 100644 --- a/src/BlockRenderer/HeaderBlockRenderer.php +++ b/src/BlockRenderer/HeaderBlockRenderer.php @@ -18,7 +18,7 @@ public function render(Block $block): HtmlElement { UnsupportedBlockException::assert($this->supports($block), $block, $this); - return new HtmlElement(sprintf('h%d', $block->level), $block->text) + return (new HtmlElement(sprintf('h%d', $block->level), $block->text)) ->withClass($this->getClassOption('class')) ; } diff --git a/src/BlockRenderer/ImageBlockRenderer.php b/src/BlockRenderer/ImageBlockRenderer.php index 0549c52..9678384 100644 --- a/src/BlockRenderer/ImageBlockRenderer.php +++ b/src/BlockRenderer/ImageBlockRenderer.php @@ -48,7 +48,6 @@ public function render(Block $block): HtmlElement return $container; } - #[\Override] protected function configureOptions(OptionsResolver $optionsResolver): void { parent::configureOptions($optionsResolver); diff --git a/src/BlockRenderer/ListBlockRenderer.php b/src/BlockRenderer/ListBlockRenderer.php index 3f5ba20..3994fd9 100644 --- a/src/BlockRenderer/ListBlockRenderer.php +++ b/src/BlockRenderer/ListBlockRenderer.php @@ -19,15 +19,14 @@ public function render(Block $block): HtmlElement { UnsupportedBlockException::assert($this->supports($block), $block, $this); - return new HtmlElement($block->tag, ...array_map( + return (new HtmlElement($block->tag, ...array_map( fn (string $item) => HtmlElement::li($item)->withClass($this->getClassOption('itemClass')), $block->items, - )) + ))) ->withClass($this->getClassOption('class')) ; } - #[\Override] protected function configureOptions(OptionsResolver $optionsResolver): void { parent::configureOptions($optionsResolver); diff --git a/src/Parser/Parser.php b/src/Parser/Parser.php index b6a41e8..3174759 100644 --- a/src/Parser/Parser.php +++ b/src/Parser/Parser.php @@ -88,7 +88,7 @@ public function parse(string $json): ParserResult public function getMapperBuilder(): MapperBuilder { if (null === $this->mapperBuilder) { - $this->mapperBuilder = new MapperBuilder() + $this->mapperBuilder = (new MapperBuilder()) ->allowSuperfluousKeys() ->allowPermissiveTypes() ; diff --git a/src/Parser/ParserResult.php b/src/Parser/ParserResult.php index 120a064..2a80058 100644 --- a/src/Parser/ParserResult.php +++ b/src/Parser/ParserResult.php @@ -6,13 +6,13 @@ use Setono\EditorJS\Block\Block; -final readonly class ParserResult +final class ParserResult { public function __construct( - public \DateTimeImmutable $time, - public string $version, + public readonly \DateTimeImmutable $time, + public readonly string $version, /** @var list $blocks */ - public array $blocks, + public readonly array $blocks, ) { } } diff --git a/tests/Renderer/RendererTest.php b/tests/Renderer/RendererTest.php index a2286b3..2de7d54 100644 --- a/tests/Renderer/RendererTest.php +++ b/tests/Renderer/RendererTest.php @@ -39,7 +39,7 @@ public function it_throws_exception_if_block_is_not_supported(): void new HeaderBlock('id', 'Header', 1), ]); - self::assertSame('

Header

Lorem ipsum

', new Renderer()->render($parserResult)); + self::assertSame('

Header

Lorem ipsum

', (new Renderer())->render($parserResult)); } #[\PHPUnit\Framework\Attributes\Test]