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": { 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); + } +} 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 ); } } 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; 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 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