From 6cd79086e0c22001487e2ae30cc27a932679f7bd Mon Sep 17 00:00:00 2001 From: Simon Schaufelberger Date: Tue, 16 Apr 2024 22:37:19 +0200 Subject: [PATCH] [TASK] Add MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector Resolves: #4218 --- config/code-quality.php | 2 + ...ityAddStaticFileIntoTCAOverridesRector.php | 144 ++++++++++++++++++ ...ddPageTSConfigToPageTsConfigFileRector.php | 2 +- ...ddUserTSConfigToUserTsConfigFileRector.php | 2 +- src/Helper/ExtensionKeyResolverTrait.php | 22 ++- .../TCA/Overrides/sys_template.php | 3 + .../TCA/Overrides/sys_template.php | 4 + .../TCA/Overrides/sys_template.php | 5 + .../Fixture/extension1/ext_tables.php.inc | 12 ++ .../Fixture/extension2/ext_tables.php.inc | 14 ++ .../Fixture/extension3/ext_tables.php.inc | 23 +++ ...ddStaticFileIntoTCAOverridesRectorTest.php | 117 ++++++++++++++ .../config/configured_rule.php | 11 ++ 13 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 rules/CodeQuality/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector.php create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Assertions/extension1/Configuration/TCA/Overrides/sys_template.php create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Assertions/extension2/Configuration/TCA/Overrides/sys_template.php create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Assertions/extension3/Configuration/TCA/Overrides/sys_template.php create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension1/ext_tables.php.inc create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension2/ext_tables.php.inc create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension3/ext_tables.php.inc create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRectorTest.php create mode 100644 tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/config/configured_rule.php diff --git a/config/code-quality.php b/config/code-quality.php index 94c480710..af6639108 100644 --- a/config/code-quality.php +++ b/config/code-quality.php @@ -6,6 +6,7 @@ use Ssch\TYPO3Rector\CodeQuality\General\ConvertImplicitVariablesToExplicitGlobalsRector; use Ssch\TYPO3Rector\CodeQuality\General\ExtEmConfRector; use Ssch\TYPO3Rector\CodeQuality\General\InjectMethodToConstructorInjectionRector; +use Ssch\TYPO3Rector\CodeQuality\General\MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector; use Ssch\TYPO3Rector\CodeQuality\General\UseExtensionKeyInLocalizationUtilityRector; return static function (RectorConfig $rectorConfig): void { @@ -44,5 +45,6 @@ ]); $rectorConfig->rule(ConvertImplicitVariablesToExplicitGlobalsRector::class); $rectorConfig->rule(InjectMethodToConstructorInjectionRector::class); + $rectorConfig->rule(MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector::class); $rectorConfig->rule(UseExtensionKeyInLocalizationUtilityRector::class); }; diff --git a/rules/CodeQuality/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector.php b/rules/CodeQuality/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector.php new file mode 100644 index 000000000..8f2d22004 --- /dev/null +++ b/rules/CodeQuality/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector.php @@ -0,0 +1,144 @@ +filesFinder = $filesFinder; + $this->filesystem = $filesystem; + $this->composerExtensionKeyResolver = $composerExtensionKeyResolver; + $this->betterStandardPrinter = $betterStandardPrinter; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Move ExtensionManagementUtility::addStaticFile into Configuration/TCA/Overrides/sys_template.php', [ + new CodeSample( + <<<'CODE_SAMPLE' +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile('extensionKey', 'Configuration/TypoScript', 'Title'); +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +// Move to file Configuration/TCA/Overrides/sys_template.php +CODE_SAMPLE + ), + ]); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [Expression::class]; + } + + + /** + * @param Expression $node + */ + public function refactor(Node $node) + { + $staticMethodCall = $node->expr; + if (! $staticMethodCall instanceof StaticCall) { + return null; + } + + if ($this->shouldSkip($staticMethodCall)) { + return null; + } + + $contentArgument = $staticMethodCall->args[0] ?? null; + if ($contentArgument === null) { + return null; + } + + $contentArgumentValue = $contentArgument->value; + if (! $contentArgumentValue instanceof String_ && ! $contentArgumentValue instanceof Variable) { + return null; + } + + $extensionKey = $this->resolvePotentialExtensionKeyByExtensionKeyParameter($contentArgumentValue); + if ($extensionKey instanceof String_) { + $contentArgument->value = $extensionKey; + } + + $content = $this->betterStandardPrinter->prettyPrint([$staticMethodCall]) . ';'; + + $newConfigurationFile = dirname($this->file->getFilePath()) . '/Configuration/TCA/Overrides/sys_template.php'; + if ($this->filesystem->fileExists($newConfigurationFile)) { + $this->filesystem->appendToFile($newConfigurationFile, $content . PHP_EOL); + } else { + $this->filesystem->write($newConfigurationFile, <<nodeTypeResolver->isMethodStaticCallOrClassMethodObjectType( + $staticMethodCall, + new ObjectType('TYPO3\CMS\Core\Utility\ExtensionManagementUtility') + )) { + return true; + } + + if (! $this->isName($staticMethodCall->name, 'addStaticFile')) { + return true; + } + + return ! $this->filesFinder->isExtTables($this->file->getFilePath()); + } +} diff --git a/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php b/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php index c0eb581c2..0152b5796 100644 --- a/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php +++ b/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php @@ -61,7 +61,7 @@ public function getRuleDefinition(): RuleDefinition new CodeSample( <<<'CODE_SAMPLE' \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( - '@import "EXT:ppw_sitepackage/Configuration/TSconfig/*/*.tsconfig"' + '@import "EXT:extension_key/Configuration/TSconfig/*/*.tsconfig"' ); CODE_SAMPLE , diff --git a/rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php b/rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php index 177d7e4ab..bcae30e63 100644 --- a/rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php +++ b/rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php @@ -60,7 +60,7 @@ public function getRuleDefinition(): RuleDefinition return new RuleDefinition('Migrate method call ExtensionManagementUtility::addUserTSConfig to user.tsconfig', [new CodeSample( <<<'CODE_SAMPLE' \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addUserTSConfig( - '@import "EXT:ppw_sitepackage/Configuration/TSconfig/*/*.tsconfig"' + '@import "EXT:extension_key/Configuration/TSconfig/*/*.tsconfig"' ); CODE_SAMPLE , diff --git a/src/Helper/ExtensionKeyResolverTrait.php b/src/Helper/ExtensionKeyResolverTrait.php index db576a176..2c2c79913 100644 --- a/src/Helper/ExtensionKeyResolverTrait.php +++ b/src/Helper/ExtensionKeyResolverTrait.php @@ -16,6 +16,27 @@ trait ExtensionKeyResolverTrait */ private ComposerExtensionKeyResolver $composerExtensionKeyResolver; + /** + * @param Variable|String_ $contentArgumentValue + */ + private function resolvePotentialExtensionKeyByExtensionKeyParameter($contentArgumentValue): ?String_ + { + if ($contentArgumentValue instanceof String_) { + return null; + } + + if (!$contentArgumentValue instanceof Variable) { + return null; + } + + $resolvedExtensionKey = $this->composerExtensionKeyResolver->resolveExtensionKey($this->file); + if ($resolvedExtensionKey === null) { + return null; + } + + return new String_($resolvedExtensionKey); + } + /** * @param Concat|String_ $contentArgumentValue */ @@ -38,7 +59,6 @@ private function resolvePotentialExtensionKey($contentArgumentValue): void } $resolvedExtensionKey = $this->composerExtensionKeyResolver->resolveExtensionKey($this->file); - if ($resolvedExtensionKey === null) { return; } diff --git a/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Assertions/extension1/Configuration/TCA/Overrides/sys_template.php b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Assertions/extension1/Configuration/TCA/Overrides/sys_template.php new file mode 100644 index 000000000..f79a83b1f --- /dev/null +++ b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Assertions/extension1/Configuration/TCA/Overrides/sys_template.php @@ -0,0 +1,3 @@ + +----- + diff --git a/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension2/ext_tables.php.inc b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension2/ext_tables.php.inc new file mode 100644 index 000000000..9cbc8f590 --- /dev/null +++ b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension2/ext_tables.php.inc @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension3/ext_tables.php.inc b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension3/ext_tables.php.inc new file mode 100644 index 000000000..a8cafd61d --- /dev/null +++ b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/Fixture/extension3/ext_tables.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRectorTest.php b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRectorTest.php new file mode 100644 index 000000000..e78a2cd74 --- /dev/null +++ b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRectorTest.php @@ -0,0 +1,117 @@ +initializeFilesystem(); + } + + protected function tearDown(): void + { + foreach ($this->testFilesToDelete as $filename) { + $this->filesystem->delete($filename); + } + + parent::tearDown(); + } + + /** + * @dataProvider provideData + */ + public function testWithNonExistingComposerJson(string $extensionKey, ?string $existingSysTemplateContent = null): void + { + // Arrange + if ($existingSysTemplateContent !== null) { + $sysTemplate = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php'; + $this->testFilesToDelete[] = $sysTemplate; + $this->filesystem->write($sysTemplate, $existingSysTemplateContent); + } + + // Act + $this->doTestFile(__DIR__ . '/Fixture/' . $extensionKey . '/ext_tables.php.inc'); + $this->testFilesToDelete[] = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php'; + + // Assert + $content = $this->filesystem->read(__DIR__ . '/Fixture/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php'); + self::assertStringEqualsFile(__DIR__ . '/Assertions/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php', $content); + } + + /** + * @dataProvider provideData + */ + public function testWithExistingComposerJson(string $extensionKey, ?string $existingSysTemplateContent = null): void + { + // Arrange + $composerJson = __DIR__ . '/Fixture/' . $extensionKey . '/composer.json'; + $this->testFilesToDelete[] = $composerJson; + $this->filesystem->write($composerJson, '{ + "extra": { + "typo3/cms": { + "extension-key": "' . $extensionKey . '" + } + } +} +'); + + if ($existingSysTemplateContent !== null) { + $sysTemplate = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php'; + $this->testFilesToDelete[] = $sysTemplate; + $this->filesystem->write($sysTemplate, $existingSysTemplateContent); + } + + // Act + $this->doTestFile(__DIR__ . '/Fixture/' . $extensionKey . '/ext_tables.php.inc'); + $this->testFilesToDelete[] = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php'; + + // Assert + $content = $this->filesystem->read(__DIR__ . '/Fixture/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php'); + self::assertStringEqualsFile(__DIR__ . '/Assertions/' . $extensionKey . '/Configuration/TCA/Overrides/sys_template.php', $content); + } + + /** + * @return Iterator> + */ + public static function provideData(): Iterator + { + yield 'Test that new sys_template.php is created with correct content' => ['extension1']; + + yield 'Test that content is appended to existing sys_template.php file' => [ + 'extension2', + ' [ + 'extension3', + ]; + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } + + private function initializeFilesystem(): void + { + $this->filesystem = self::getContainer() + ->get(FilesystemInterface::class); + } +} diff --git a/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/config/configured_rule.php b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/config/configured_rule.php new file mode 100644 index 000000000..e401b7f37 --- /dev/null +++ b/tests/Rector/CodeQuality/Rector/General/MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector/config/configured_rule.php @@ -0,0 +1,11 @@ +import(__DIR__ . '/../../../../../../../config/config_test.php'); + $rectorConfig->rule(MoveExtensionManagementUtilityAddStaticFileIntoTCAOverridesRector::class); +};