From 878e06a0e205c4ac4bf706dd87d014c7c72d012f Mon Sep 17 00:00:00 2001 From: cs Date: Mon, 29 Sep 2025 21:58:57 +0200 Subject: [PATCH 1/6] [FEATURE] Introduce FluidFormatConfiguration and update FluidFileProcessor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🌟 Add FluidFormatConfiguration class to manage allowed file extensions. 🔧 Update FluidFileProcessor to utilize FluidFormatConfiguration for file extension handling. --- packages/fractor-fluid/config/application.php | 8 ++++- .../Configuration/FluidProcessorOption.php | 10 +++++++ .../fractor-fluid/src/FluidFileProcessor.php | 9 ++++-- .../ValueObject/FluidFormatConfiguration.php | 29 +++++++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 packages/fractor-fluid/src/Configuration/FluidProcessorOption.php create mode 100644 packages/fractor-fluid/src/ValueObject/FluidFormatConfiguration.php diff --git a/packages/fractor-fluid/config/application.php b/packages/fractor-fluid/config/application.php index 873a4ced..4dd80c09 100644 --- a/packages/fractor-fluid/config/application.php +++ b/packages/fractor-fluid/config/application.php @@ -4,8 +4,10 @@ use a9f\FractorFluid\Contract\FluidFractorRule; use a9f\FractorFluid\FluidFileProcessor; +use a9f\FractorFluid\ValueObject\FluidFormatConfiguration; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; +use function Symfony\Component\DependencyInjection\Loader\Configurator\service; use function Symfony\Component\DependencyInjection\Loader\Configurator\tagged_iterator; return static function (ContainerConfigurator $containerConfigurator, ContainerBuilder $containerBuilder): void { @@ -16,8 +18,12 @@ $services->load('a9f\\FractorFluid\\', __DIR__ . '/../src/'); + $services->set('fractor.fluid_processor.format_configuration', FluidFormatConfiguration::class) + ->factory([null, 'createFromParameterBag']); + $services->set(FluidFileProcessor::class) - ->arg('$rules', tagged_iterator('fractor.fluid_rule')); + ->arg('$rules', tagged_iterator('fractor.fluid_rule')) + ->arg('$fluidFormatConfiguration', service('fractor.fluid_processor.format_configuration')); $containerBuilder->registerForAutoconfiguration(FluidFractorRule::class)->addTag('fractor.fluid_rule'); }; diff --git a/packages/fractor-fluid/src/Configuration/FluidProcessorOption.php b/packages/fractor-fluid/src/Configuration/FluidProcessorOption.php new file mode 100644 index 00000000..dd77b3e9 --- /dev/null +++ b/packages/fractor-fluid/src/Configuration/FluidProcessorOption.php @@ -0,0 +1,10 @@ + @@ -20,7 +21,8 @@ */ public function __construct( private iterable $rules, - private ChangedFilesDetector $changedFilesDetector + private ChangedFilesDetector $changedFilesDetector, + private FluidFormatConfiguration $fluidFormatConfiguration ) { } @@ -43,9 +45,12 @@ public function handle(File $file, iterable $appliedRules): void } } + /** + * @return list + */ public function allowedFileExtensions(): array { - return ['html', 'xml', 'txt']; + return array_values($this->fluidFormatConfiguration->allowedFileExtensions); } public function getAllRules(): iterable diff --git a/packages/fractor-fluid/src/ValueObject/FluidFormatConfiguration.php b/packages/fractor-fluid/src/ValueObject/FluidFormatConfiguration.php new file mode 100644 index 00000000..f5d4d86a --- /dev/null +++ b/packages/fractor-fluid/src/ValueObject/FluidFormatConfiguration.php @@ -0,0 +1,29 @@ + $allowedFileExtensions + */ + public function __construct( + public array $allowedFileExtensions + ) { + } + + public static function createFromParameterBag(ParameterBagInterface $parameterBag): self + { + $allowedFileExtensions = $parameterBag->has(FluidProcessorOption::ALLOWED_FILE_EXTENSIONS) + ? $parameterBag->get(FluidProcessorOption::ALLOWED_FILE_EXTENSIONS) + : ['html', 'xml', 'txt']; + $allowedFileExtensions = is_array($allowedFileExtensions) ? $allowedFileExtensions : ['html', 'xml', 'txt']; + + return new self($allowedFileExtensions); + } +} From df3ed71ee7f8d34e81206f55c1899c139bd4d8c3 Mon Sep 17 00:00:00 2001 From: cs Date: Mon, 29 Sep 2025 22:00:21 +0200 Subject: [PATCH 2/6] [FEATURE] Add XmlFormatConfiguration and integrate into XmlFileProcessor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ Introduced XmlFormatConfiguration for managing allowed file extensions. 🔧 Updated XmlFileProcessor to utilize XmlFormatConfiguration for file extension validation. --- packages/fractor-xml/config/application.php | 7 ++++- .../src/Configuration/XmlProcessorOption.php | 2 ++ .../ValueObject/XmlFormatConfiguration.php | 29 +++++++++++++++++++ packages/fractor-xml/src/XmlFileProcessor.php | 11 +++++-- 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 packages/fractor-xml/src/ValueObject/XmlFormatConfiguration.php diff --git a/packages/fractor-xml/config/application.php b/packages/fractor-xml/config/application.php index e8fc2686..8b8a8d85 100644 --- a/packages/fractor-xml/config/application.php +++ b/packages/fractor-xml/config/application.php @@ -7,6 +7,7 @@ use a9f\FractorXml\Contract\XmlFractor; use a9f\FractorXml\IndentFactory; use a9f\FractorXml\PrettyXmlFormatter; +use a9f\FractorXml\ValueObject\XmlFormatConfiguration; use a9f\FractorXml\XmlFileProcessor; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; @@ -24,9 +25,13 @@ $services->set('fractor.xml_processor.indent', Indent::class) ->factory([service(IndentFactory::class), 'create']); + $services->set('fractor.xml_processor.format_configuration', XmlFormatConfiguration::class) + ->factory([null, 'createFromParameterBag']); + $services->set(XmlFileProcessor::class) ->arg('$indent', service('fractor.xml_processor.indent')) - ->arg('$rules', tagged_iterator('fractor.xml_rule')); + ->arg('$rules', tagged_iterator('fractor.xml_rule')) + ->arg('$xmlFormatConfiguration', service('fractor.xml_processor.format_configuration')); $services->set(\PrettyXml\Formatter::class); $services->alias(Formatter::class, PrettyXmlFormatter::class); diff --git a/packages/fractor-xml/src/Configuration/XmlProcessorOption.php b/packages/fractor-xml/src/Configuration/XmlProcessorOption.php index 7d5ddbbe..56555f26 100644 --- a/packages/fractor-xml/src/Configuration/XmlProcessorOption.php +++ b/packages/fractor-xml/src/Configuration/XmlProcessorOption.php @@ -9,4 +9,6 @@ final class XmlProcessorOption public const INDENT_SIZE = 'xml-processor-indent-size'; public const INDENT_CHARACTER = 'xml-processor-indent-character'; + + public const ALLOWED_FILE_EXTENSIONS = 'xml-processor-allowed-file-extensions'; } diff --git a/packages/fractor-xml/src/ValueObject/XmlFormatConfiguration.php b/packages/fractor-xml/src/ValueObject/XmlFormatConfiguration.php new file mode 100644 index 00000000..0df62489 --- /dev/null +++ b/packages/fractor-xml/src/ValueObject/XmlFormatConfiguration.php @@ -0,0 +1,29 @@ + $allowedFileExtensions + */ + public function __construct( + public array $allowedFileExtensions + ) { + } + + public static function createFromParameterBag(ParameterBagInterface $parameterBag): self + { + $allowedFileExtensions = $parameterBag->has(XmlProcessorOption::ALLOWED_FILE_EXTENSIONS) + ? $parameterBag->get(XmlProcessorOption::ALLOWED_FILE_EXTENSIONS) + : ['xml']; + $allowedFileExtensions = is_array($allowedFileExtensions) ? $allowedFileExtensions : ['xml']; + + return new self($allowedFileExtensions); + } +} diff --git a/packages/fractor-xml/src/XmlFileProcessor.php b/packages/fractor-xml/src/XmlFileProcessor.php index 41c50a56..042f37bd 100644 --- a/packages/fractor-xml/src/XmlFileProcessor.php +++ b/packages/fractor-xml/src/XmlFileProcessor.php @@ -12,6 +12,7 @@ use a9f\FractorXml\Contract\DomNodeVisitor; use a9f\FractorXml\Contract\Formatter; use a9f\FractorXml\Contract\XmlFractor; +use a9f\FractorXml\ValueObject\XmlFormatConfiguration; use a9f\FractorXml\ValueObjectFactory\DomDocumentFactory; /** @@ -27,13 +28,14 @@ public function __construct( private Formatter $formatter, private iterable $rules, private Indent $indent, - private ChangedFilesDetector $changedFilesDetector + private ChangedFilesDetector $changedFilesDetector, + private XmlFormatConfiguration $xmlFormatConfiguration ) { } public function canHandle(File $file): bool { - return $file->getFileExtension() === 'xml'; + return in_array($file->getFileExtension(), $this->allowedFileExtensions(), true); } /** @@ -72,9 +74,12 @@ public function handle(File $file, iterable $appliedRules): void } } + /** + * @return list + */ public function allowedFileExtensions(): array { - return ['xml']; + return array_values($this->xmlFormatConfiguration->allowedFileExtensions); } public function getAllRules(): iterable From c353f622b182a2982240b9b813e1d585405ffac8 Mon Sep 17 00:00:00 2001 From: cs Date: Mon, 29 Sep 2025 22:05:08 +0200 Subject: [PATCH 3/6] [FEATURE] Implement YamlFormatConfiguration and integrate into YamlFileProcessor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ Add YamlFormatConfiguration class for managing allowed file extensions. 🔧 Update YamlFileProcessor to utilize YamlFormatConfiguration for file extension handling. --- packages/fractor-yaml/config/application.php | 8 ++++- .../src/Configuration/YamlProcessorOption.php | 10 +++++++ .../ValueObject/YamlFormatConfiguration.php | 29 +++++++++++++++++++ .../fractor-yaml/src/YamlFileProcessor.php | 9 ++++-- 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 packages/fractor-yaml/src/Configuration/YamlProcessorOption.php create mode 100644 packages/fractor-yaml/src/ValueObject/YamlFormatConfiguration.php diff --git a/packages/fractor-yaml/config/application.php b/packages/fractor-yaml/config/application.php index 0edfe92e..e3bae60c 100644 --- a/packages/fractor-yaml/config/application.php +++ b/packages/fractor-yaml/config/application.php @@ -7,9 +7,11 @@ use a9f\FractorYaml\Contract\YamlParser; use a9f\FractorYaml\SymfonyYamlDumper; use a9f\FractorYaml\SymfonyYamlParser; +use a9f\FractorYaml\ValueObject\YamlFormatConfiguration; use a9f\FractorYaml\YamlFileProcessor; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; +use function Symfony\Component\DependencyInjection\Loader\Configurator\service; use function Symfony\Component\DependencyInjection\Loader\Configurator\tagged_iterator; return static function (ContainerConfigurator $containerConfigurator, ContainerBuilder $containerBuilder): void { @@ -23,8 +25,12 @@ $services->alias(YamlParser::class, SymfonyYamlParser::class); $services->alias(YamlDumper::class, SymfonyYamlDumper::class); + $services->set('fractor.yaml_processor.format_configuration', YamlFormatConfiguration::class) + ->factory([null, 'createFromParameterBag']); + $services->set(YamlFileProcessor::class) - ->arg('$rules', tagged_iterator('fractor.yaml_rule')); + ->arg('$rules', tagged_iterator('fractor.yaml_rule')) + ->arg('$yamlFormatConfiguration', service('fractor.yaml_processor.format_configuration')); $containerBuilder->registerForAutoconfiguration(YamlFractorRule::class)->addTag('fractor.yaml_rule'); }; diff --git a/packages/fractor-yaml/src/Configuration/YamlProcessorOption.php b/packages/fractor-yaml/src/Configuration/YamlProcessorOption.php new file mode 100644 index 00000000..e598edc8 --- /dev/null +++ b/packages/fractor-yaml/src/Configuration/YamlProcessorOption.php @@ -0,0 +1,10 @@ + $allowedFileExtensions + */ + public function __construct( + public array $allowedFileExtensions + ) { + } + + public static function createFromParameterBag(ParameterBagInterface $parameterBag): self + { + $allowedFileExtensions = $parameterBag->has(YamlProcessorOption::ALLOWED_FILE_EXTENSIONS) + ? $parameterBag->get(YamlProcessorOption::ALLOWED_FILE_EXTENSIONS) + : ['yaml', 'yml']; + $allowedFileExtensions = is_array($allowedFileExtensions) ? $allowedFileExtensions : ['yaml', 'yml']; + + return new self($allowedFileExtensions); + } +} diff --git a/packages/fractor-yaml/src/YamlFileProcessor.php b/packages/fractor-yaml/src/YamlFileProcessor.php index 23ebe042..299b651b 100644 --- a/packages/fractor-yaml/src/YamlFileProcessor.php +++ b/packages/fractor-yaml/src/YamlFileProcessor.php @@ -12,6 +12,7 @@ use a9f\FractorYaml\Contract\YamlDumper; use a9f\FractorYaml\Contract\YamlFractorRule; use a9f\FractorYaml\Contract\YamlParser; +use a9f\FractorYaml\ValueObject\YamlFormatConfiguration; /** * @implements FileProcessor @@ -25,7 +26,8 @@ public function __construct( private iterable $rules, private YamlParser $yamlParser, private YamlDumper $yamlDumper, - private ChangedFilesDetector $changedFilesDetector + private ChangedFilesDetector $changedFilesDetector, + private YamlFormatConfiguration $yamlFormatConfiguration ) { } @@ -59,9 +61,12 @@ public function handle(File $file, iterable $appliedRules): void $file->changeFileContent($this->yamlDumper->dump($newYaml, $indent)); } + /** + * @return list + */ public function allowedFileExtensions(): array { - return ['yaml', 'yml']; + return array_values($this->yamlFormatConfiguration->allowedFileExtensions); } public function getAllRules(): iterable From c594cf01bf72cc5ae982b0aa89937759ba24a70c Mon Sep 17 00:00:00 2001 From: cs Date: Mon, 29 Sep 2025 22:05:51 +0200 Subject: [PATCH 4/6] [FEATURE] Enhance TypoScript configuration options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ Added 'allowedFileExtensions' to TypoScriptProcessorOption for better file handling. 🔧 Updated TypoScriptFileProcessor to use strict comparison for file extension checks. --- .../TypoScriptProcessorOption.php | 2 ++ .../src/TypoScriptFileProcessor.php | 8 +++++--- ...oScriptPrettyPrinterFormatConfiguration.php | 18 ++++++++++++++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/packages/fractor-typoscript/src/Configuration/TypoScriptProcessorOption.php b/packages/fractor-typoscript/src/Configuration/TypoScriptProcessorOption.php index 5d9dd2d5..aab7242e 100644 --- a/packages/fractor-typoscript/src/Configuration/TypoScriptProcessorOption.php +++ b/packages/fractor-typoscript/src/Configuration/TypoScriptProcessorOption.php @@ -17,4 +17,6 @@ final class TypoScriptProcessorOption public const INDENT_CONDITIONS = 'typoscript-processor-indent-conditions'; public const CONDITION_TERMINATION = 'typoscript-processor-condition-termination'; + + public const ALLOWED_FILE_EXTENSIONS = 'typoscript-processor-allowed-file-extensions'; } diff --git a/packages/fractor-typoscript/src/TypoScriptFileProcessor.php b/packages/fractor-typoscript/src/TypoScriptFileProcessor.php index 6f9be58a..e34d8ce6 100644 --- a/packages/fractor-typoscript/src/TypoScriptFileProcessor.php +++ b/packages/fractor-typoscript/src/TypoScriptFileProcessor.php @@ -39,7 +39,7 @@ public function __construct( public function canHandle(File $file): bool { - return in_array($file->getFileExtension(), $this->allowedFileExtensions()); + return in_array($file->getFileExtension(), $this->allowedFileExtensions(), true); } public function handle(File $file, iterable $appliedRules): void @@ -75,10 +75,12 @@ public function handle(File $file, iterable $appliedRules): void } } + /** + * @return list + */ public function allowedFileExtensions(): array { - // TODO this should be configurable - return ['typoscript', 'tsconfig', 'ts']; + return array_values($this->typoScriptPrettyPrinterFormatConfiguration->allowedFileExtensions); } public function getAllRules(): iterable diff --git a/packages/fractor-typoscript/src/ValueObject/TypoScriptPrettyPrinterFormatConfiguration.php b/packages/fractor-typoscript/src/ValueObject/TypoScriptPrettyPrinterFormatConfiguration.php index 0cb3e793..12d764a8 100644 --- a/packages/fractor-typoscript/src/ValueObject/TypoScriptPrettyPrinterFormatConfiguration.php +++ b/packages/fractor-typoscript/src/ValueObject/TypoScriptPrettyPrinterFormatConfiguration.php @@ -10,13 +10,17 @@ final readonly class TypoScriptPrettyPrinterFormatConfiguration { + /** + * @param array $allowedFileExtensions + */ public function __construct( public int $size, public string $style, public bool $addClosingGlobal, public bool $includeEmptyLineBreaks, public bool $indentConditions, - public PrettyPrinterConditionTermination $conditionTermination + public PrettyPrinterConditionTermination $conditionTermination, + public array $allowedFileExtensions ) { } @@ -48,13 +52,23 @@ public static function createFromParameterBag(ParameterBagInterface $parameterBa ? $parameterBag->get(TypoScriptProcessorOption::CONDITION_TERMINATION) : PrettyPrinterConditionTermination::Keep; + $allowedFileExtensions = $parameterBag->has(TypoScriptProcessorOption::ALLOWED_FILE_EXTENSIONS) + ? $parameterBag->get(TypoScriptProcessorOption::ALLOWED_FILE_EXTENSIONS) + : ['typoscript', 'tsconfig', 'ts']; + $allowedFileExtensions = is_array($allowedFileExtensions) ? $allowedFileExtensions : [ + 'typoscript', + 'tsconfig', + 'ts', + ]; + return new self( $size, $style, $addClosingGlobal, $includeEmptyLineBreaks, $indentConditions, - $conditionTermination + $conditionTermination, + $allowedFileExtensions ); } } From de94eef979f0595fd61ce97fe8d65caa33466db5 Mon Sep 17 00:00:00 2001 From: cs Date: Mon, 29 Sep 2025 22:07:30 +0200 Subject: [PATCH 5/6] [CLEANUP] Apply rector rule NarrowTooWideReturnTypeRector to StatementCollectingVisitor --- .../Fixture/StatementCollectingVisitor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fractor-typoscript/tests/TypoScriptStatementsIterator/Fixture/StatementCollectingVisitor.php b/packages/fractor-typoscript/tests/TypoScriptStatementsIterator/Fixture/StatementCollectingVisitor.php index 3ca7a2ad..68ed3d9f 100644 --- a/packages/fractor-typoscript/tests/TypoScriptStatementsIterator/Fixture/StatementCollectingVisitor.php +++ b/packages/fractor-typoscript/tests/TypoScriptStatementsIterator/Fixture/StatementCollectingVisitor.php @@ -27,7 +27,7 @@ public function beforeTraversal(File $file, array $statements): void $this->calls[] = sprintf('%s:beforeTraversal:%s', $this->visitorName, count($statements)); } - public function enterNode(Statement $node): Statement|int + public function enterNode(Statement $node): Statement { $this->calls[] = sprintf('%s:enterNode:%s:l-%d', $this->visitorName, $node::class, $node->sourceLine); return $node; From 1b306bd5e99089ef40e934bc038e0e08baf9e611 Mon Sep 17 00:00:00 2001 From: cs Date: Mon, 29 Sep 2025 22:10:12 +0200 Subject: [PATCH 6/6] [TASK] Bump tivie/htaccess-parser from ^0.3.0 to ^0.4.0 ... due to local:contribute --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5704790f..7fe527b3 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "symfony/finder": "^5.4 || ^6.4 || ^7.0", "symfony/yaml": "^5.4 || ^6.4 || ^7.0", "symplify/rule-doc-generator-contracts": "^11.2", - "tivie/htaccess-parser": "^0.3.0", + "tivie/htaccess-parser": "^0.4.0", "webmozart/assert": "^1.11" }, "require-dev": {