diff --git a/config/v13/typo3-130.php b/config/v13/typo3-130.php index aa5979a44..8ce80e166 100644 --- a/config/v13/typo3-130.php +++ b/config/v13/typo3-130.php @@ -108,4 +108,5 @@ $rectorConfig->rule(\Ssch\TYPO3Rector\TYPO313\v0\IntroduceCapabilitiesBitSetRector::class); $rectorConfig->rule(\Ssch\TYPO3Rector\TYPO313\v0\SubstituteItemFormElIDRector::class); $rectorConfig->rule(\Ssch\TYPO3Rector\TYPO313\v0\MigrateAddPageTSConfigToPageTsConfigFileRector::class); + $rectorConfig->rule(\Ssch\TYPO3Rector\TYPO313\v0\MigrateAddUserTSConfigToUserTsConfigFileRector::class); }; diff --git a/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php b/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php index 2f2fc8fcc..c0eb581c2 100644 --- a/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php +++ b/rules/TYPO313/v0/MigrateAddPageTSConfigToPageTsConfigFileRector.php @@ -7,7 +7,6 @@ use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Expression; use PhpParser\NodeTraverser; @@ -17,6 +16,7 @@ use Ssch\TYPO3Rector\ComposerExtensionKeyResolver; use Ssch\TYPO3Rector\Contract\FilesystemInterface; use Ssch\TYPO3Rector\Filesystem\FilesFinder; +use Ssch\TYPO3Rector\Helper\ExtensionKeyResolverTrait; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,6 +26,8 @@ */ final class MigrateAddPageTSConfigToPageTsConfigFileRector extends AbstractRector { + use ExtensionKeyResolverTrait; + /** * @readonly */ @@ -41,13 +43,12 @@ final class MigrateAddPageTSConfigToPageTsConfigFileRector extends AbstractRecto */ private ValueResolver $valueResolver; - /** - * @readonly - */ - private ComposerExtensionKeyResolver $composerExtensionKeyResolver; - - public function __construct(FilesFinder $filesFinder, FilesystemInterface $filesystem, ValueResolver $valueResolver, ComposerExtensionKeyResolver $composerExtensionKeyResolver) - { + public function __construct( + FilesFinder $filesFinder, + FilesystemInterface $filesystem, + ValueResolver $valueResolver, + ComposerExtensionKeyResolver $composerExtensionKeyResolver + ) { $this->filesFinder = $filesFinder; $this->filesystem = $filesystem; $this->valueResolver = $valueResolver; @@ -140,34 +141,4 @@ private function shouldSkip(StaticCall $staticMethodCall): bool return ! $this->filesFinder->isExtLocalConf($this->file->getFilePath()); } - - /** - * @param Concat|String_ $contentArgumentValue - */ - private function resolvePotentialExtensionKey($contentArgumentValue): void - { - if ($contentArgumentValue instanceof String_) { - return; - } - - if (! $contentArgumentValue->left instanceof Concat) { - return; - } - - if (! $contentArgumentValue->left->right instanceof Variable) { - return; - } - - if (! $this->isNames($contentArgumentValue->left->right, ['_EXTKEY', 'extensionKey'])) { - return; - } - - $resolvedExtensionKey = $this->composerExtensionKeyResolver->resolveExtensionKey($this->file); - - if ($resolvedExtensionKey === null) { - return; - } - - $contentArgumentValue->left->right = new String_($resolvedExtensionKey); - } } diff --git a/rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php b/rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php new file mode 100644 index 000000000..177d7e4ab --- /dev/null +++ b/rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php @@ -0,0 +1,142 @@ +filesFinder = $filesFinder; + $this->filesystem = $filesystem; + $this->valueResolver = $valueResolver; + $this->composerExtensionKeyResolver = $composerExtensionKeyResolver; + } + + 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"' +); +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +// Move to file Configuration/user.tsconfig +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 Concat) { + return null; + } + + $this->resolvePotentialExtensionKey($contentArgumentValue); + + $directoryName = dirname($this->file->getFilePath()); + + $content = $this->valueResolver->getValue($contentArgumentValue); + $newConfigurationFile = $directoryName . '/Configuration/user.tsconfig'; + 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, 'addUserTSConfig')) { + return true; + } + + return ! $this->filesFinder->isExtLocalConf($this->file->getFilePath()); + } +} diff --git a/src/ComposerExtensionKeyResolver.php b/src/ComposerExtensionKeyResolver.php index 72f687fad..e7312560d 100644 --- a/src/ComposerExtensionKeyResolver.php +++ b/src/ComposerExtensionKeyResolver.php @@ -39,7 +39,7 @@ public function resolveExtensionKey(File $file): ?string $composerJsonFile = $directoryName . '/composer.json'; if (! $this->filesystem->fileExists($composerJsonFile)) { - return $directoryName; + return basename($directoryName); } $composerJsonContent = $this->filesystem->read($composerJsonFile); diff --git a/src/Contract/FilesystemInterface.php b/src/Contract/FilesystemInterface.php index 4d9932509..eca125d3e 100644 --- a/src/Contract/FilesystemInterface.php +++ b/src/Contract/FilesystemInterface.php @@ -13,4 +13,6 @@ public function fileExists(string $location): bool; public function read(string $location): string; public function appendToFile(string $location, string $content): void; + + public function delete(string $location): void; } diff --git a/src/Filesystem/FlysystemFilesystem.php b/src/Filesystem/FlysystemFilesystem.php index 7513392f9..77e655eb6 100644 --- a/src/Filesystem/FlysystemFilesystem.php +++ b/src/Filesystem/FlysystemFilesystem.php @@ -42,4 +42,9 @@ public function appendToFile(string $location, string $content): void $this->write($location, $existingContent); } + + public function delete(string $location): void + { + $this->filesystemOperator->delete($location); + } } diff --git a/src/Helper/ExtensionKeyResolverTrait.php b/src/Helper/ExtensionKeyResolverTrait.php new file mode 100644 index 000000000..db576a176 --- /dev/null +++ b/src/Helper/ExtensionKeyResolverTrait.php @@ -0,0 +1,48 @@ +left instanceof Concat) { + return; + } + + if (! $contentArgumentValue->left->right instanceof Variable) { + return; + } + + if (! $this->isNames($contentArgumentValue->left->right, ['_EXTKEY', 'extensionKey'])) { + return; + } + + $resolvedExtensionKey = $this->composerExtensionKeyResolver->resolveExtensionKey($this->file); + + if ($resolvedExtensionKey === null) { + return; + } + + $contentArgumentValue->left->right = new String_($resolvedExtensionKey); + } +} diff --git a/stubs/TYPO3/CMS/Core/Utility/ExtensionManagementUtility.php b/stubs/TYPO3/CMS/Core/Utility/ExtensionManagementUtility.php index b8a7f5318..97bdc5c5a 100644 --- a/stubs/TYPO3/CMS/Core/Utility/ExtensionManagementUtility.php +++ b/stubs/TYPO3/CMS/Core/Utility/ExtensionManagementUtility.php @@ -104,4 +104,8 @@ public static function allowTableOnStandardPages(string $table) public static function addPageTSConfig(string $content): void { } + + public static function addUserTSConfig(string $content): void + { + } } diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension1/Configuration/page.tsconfig b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension1/Configuration/page.tsconfig new file mode 100644 index 000000000..c51b88212 --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension1/Configuration/page.tsconfig @@ -0,0 +1 @@ +@import "EXT:extension1/Configuration/TSconfig/*/*.tsconfig" diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension1/page.tsconfig b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension1/page.tsconfig deleted file mode 100644 index e5c11af47..000000000 --- a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension1/page.tsconfig +++ /dev/null @@ -1 +0,0 @@ -@import "EXT:ext_key/Configuration/TSconfig/*/*.tsconfig" diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension2/Configuration/page.tsconfig b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension2/Configuration/page.tsconfig new file mode 100644 index 000000000..f49b2b7ab --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension2/Configuration/page.tsconfig @@ -0,0 +1,4 @@ +# page.tsconfig file exist +@import "EXT:extension2/Configuration/TSconfig/*/*.tsconfig" + +@import 'EXT:extension2/Configuration/TSconfig/Page/mod.linkvalidator.tsconfig' diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension2/page.tsconfig b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension2/page.tsconfig deleted file mode 100644 index f9fe17c86..000000000 --- a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension2/page.tsconfig +++ /dev/null @@ -1,2 +0,0 @@ -# page.tsconfig file exist -@import "EXT:ext_key/Configuration/TSconfig/*/*.tsconfig" diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension3/Configuration/page.tsconfig b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension3/Configuration/page.tsconfig new file mode 100644 index 000000000..95f3b0f20 --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension3/Configuration/page.tsconfig @@ -0,0 +1,5 @@ +@import "EXT:extension3/Configuration/TSconfig/*/*.tsconfig" + +@import "EXT:extension3/Configuration/TSconfig/*/*.tsconfig" + + diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension3/page.tsconfig b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension3/page.tsconfig deleted file mode 100644 index 67fc203d4..000000000 --- a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Assertions/extension3/page.tsconfig +++ /dev/null @@ -1,5 +0,0 @@ -@import "EXT:ext_key/Configuration/TSconfig/*/*.tsconfig" - -@import "EXT:ext_key/Configuration/TSconfig/*/*.tsconfig" - - diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension1/ext_localconf.php.inc b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension1/ext_localconf.php.inc index 4c6d369c7..73dc734d2 100644 --- a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension1/ext_localconf.php.inc +++ b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension1/ext_localconf.php.inc @@ -2,18 +2,13 @@ namespace Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddPageTSConfigToPageTsConfigFileRector\Fixture; -$variable = 'ext_key'; - \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( - '@import "EXT:ext_key/Configuration/TSconfig/*/*.tsconfig"' + '@import "EXT:extension1/Configuration/TSconfig/*/*.tsconfig"' ); - ?> ----- diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension2/ext_localconf.php.inc b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension2/ext_localconf.php.inc index d3bb647d3..a42bd6e03 100644 --- a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension2/ext_localconf.php.inc +++ b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension2/ext_localconf.php.inc @@ -3,10 +3,14 @@ namespace Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddPageTSConfigToPageTsConfigFileRector\Fixture; \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( - '@import "EXT:ext_key/Configuration/TSconfig/*/*.tsconfig"' + '@import "EXT:extension2/Configuration/TSconfig/*/*.tsconfig"' ); -$variable = 'ext_key'; +if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('linkvalidator')) { + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( + '@import \'EXT:extension2/Configuration/TSconfig/Page/mod.linkvalidator.tsconfig\'' + ); +} ?> ----- @@ -14,6 +18,9 @@ $variable = 'ext_key'; namespace Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddPageTSConfigToPageTsConfigFileRector\Fixture; -$variable = 'ext_key'; +use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; + +if (ExtensionManagementUtility::isLoaded('linkvalidator')) { +} ?> diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension3/ext_localconf.php.inc b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension3/ext_localconf.php.inc index 4551a5aed..739745334 100644 --- a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension3/ext_localconf.php.inc +++ b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/Fixture/extension3/ext_localconf.php.inc @@ -4,7 +4,8 @@ namespace Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddPageTSConfigToPageTsCon use TYPO3\CMS\Core\Utility\GeneralUtility; -$variable = 'ext_key'; +$variable = 'extension3'; +$_EXTKEY = 'extension3'; \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( '@import "EXT:' . $variable . '/Configuration/TSconfig/*/*.tsconfig"' @@ -15,10 +16,12 @@ $variable = 'ext_key'; ); \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( - '@import "EXT:ext_key/Configuration/TSconfig/*/*.tsconfig"' + '@import "EXT:extension3/Configuration/TSconfig/*/*.tsconfig"' ); -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig(''); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( + '' +); ?> ----- @@ -29,7 +32,8 @@ namespace Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddPageTSConfigToPageTsCon use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; -$variable = 'ext_key'; +$variable = 'extension3'; +$_EXTKEY = 'extension3'; ExtensionManagementUtility::addPageTSConfig( GeneralUtility::deprecationLog('foo') diff --git a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/MigrateAddPageTSConfigToPageTsConfigFileRectorTest.php b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/MigrateAddPageTSConfigToPageTsConfigFileRectorTest.php index c3441a801..599c3d4f9 100644 --- a/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/MigrateAddPageTSConfigToPageTsConfigFileRectorTest.php +++ b/tests/Rector/v13/v0/MigrateAddPageTSConfigToPageTsConfigFileRector/MigrateAddPageTSConfigToPageTsConfigFileRectorTest.php @@ -12,45 +12,77 @@ final class MigrateAddPageTSConfigToPageTsConfigFileRectorTest extends AbstractR { private FilesystemInterface $filesystem; + /** + * @var string[] + */ + private array $testFilesToDelete = []; + protected function setUp(): void { parent::setUp(); $this->initializeFilesystem(); } + protected function tearDown(): void + { + foreach ($this->testFilesToDelete as $filename) { + $this->filesystem->delete($filename); + } + + parent::tearDown(); + } + /** * @dataProvider provideData */ - public function test(string $extensionFolder, ?string $existingPageTSConfigContent = null): void + public function testWithNonExistingComposerJson(string $extensionKey, ?string $existingPageTSConfigContent = null): void { // Arrange - $this->filesystem->write(__DIR__ . '/Fixture/' . $extensionFolder . '/composer.json', '{ + if ($existingPageTSConfigContent !== null) { + $pageTsConfig = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/page.tsconfig'; + $this->testFilesToDelete[] = $pageTsConfig; + $this->filesystem->write($pageTsConfig, $existingPageTSConfigContent); + } + + // Act + $this->doTestFile(__DIR__ . '/Fixture/' . $extensionKey . '/ext_localconf.php.inc'); + $this->testFilesToDelete[] = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/page.tsconfig'; + + // Assert + $content = $this->filesystem->read(__DIR__ . '/Fixture/' . $extensionKey . '/Configuration/page.tsconfig'); + self::assertStringEqualsFile(__DIR__ . '/Assertions/' . $extensionKey . '/Configuration/page.tsconfig', $content); + } + + /** + * @dataProvider provideData + */ + public function testWithExistingComposerJson(string $extensionKey, ?string $existingPageTSConfigContent = null): void + { + // Arrange + $composerJson = __DIR__ . '/Fixture/' . $extensionKey . '/composer.json'; + $this->testFilesToDelete[] = $composerJson; + $this->filesystem->write($composerJson, '{ "extra": { "typo3/cms": { - "extension-key": "cray_special_extension_key" + "extension-key": "' . $extensionKey . '" } } } '); if ($existingPageTSConfigContent !== null) { - $this->filesystem->write( - __DIR__ . '/Fixture/' . $extensionFolder . '/Configuration/page.tsconfig', - $existingPageTSConfigContent - ); + $pageTsConfig = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/page.tsconfig'; + $this->testFilesToDelete[] = $pageTsConfig; + $this->filesystem->write($pageTsConfig, $existingPageTSConfigContent); } // Act - $this->doTestFile(__DIR__ . '/Fixture/' . $extensionFolder . '/ext_localconf.php.inc'); + $this->doTestFile(__DIR__ . '/Fixture/' . $extensionKey . '/ext_localconf.php.inc'); + $this->testFilesToDelete[] = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/page.tsconfig'; // Assert - $content = $this->filesystem->read(__DIR__ . '/Fixture/' . $extensionFolder . '/Configuration/page.tsconfig'); - self::assertStringEqualsFile(__DIR__ . '/Assertions/' . $extensionFolder . '/page.tsconfig', $content); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule.php'; + $content = $this->filesystem->read(__DIR__ . '/Fixture/' . $extensionKey . '/Configuration/page.tsconfig'); + self::assertStringEqualsFile(__DIR__ . '/Assertions/' . $extensionKey . '/Configuration/page.tsconfig', $content); } /** @@ -70,9 +102,14 @@ public static function provideData(): Iterator ]; } + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } + private function initializeFilesystem(): void { - $this->filesystem = $this->getContainer() + $this->filesystem = self::getContainer() ->get(FilesystemInterface::class); } } diff --git a/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension1/Configuration/user.tsconfig b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension1/Configuration/user.tsconfig new file mode 100644 index 000000000..2cd024f8b --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension1/Configuration/user.tsconfig @@ -0,0 +1 @@ +@import "EXT:extension1/Configuration/TSconfig/one.tsconfig" diff --git a/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension2/Configuration/user.tsconfig b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension2/Configuration/user.tsconfig new file mode 100644 index 000000000..598a39f28 --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension2/Configuration/user.tsconfig @@ -0,0 +1,2 @@ +# user.tsconfig file exist +@import "EXT:extension2/Configuration/TSconfig/*/*.tsconfig" diff --git a/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension3/Configuration/user.tsconfig b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension3/Configuration/user.tsconfig new file mode 100644 index 000000000..5ecbfeaf9 --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Assertions/extension3/Configuration/user.tsconfig @@ -0,0 +1,5 @@ +@import "EXT:extension3/Configuration/TSconfig/*/*.tsconfig" + +@import "EXT:extension3/Configuration/TSconfig/*/*.tsconfig" + + diff --git a/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension1/ext_localconf.php.inc b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension1/ext_localconf.php.inc new file mode 100644 index 000000000..62b40a040 --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension1/ext_localconf.php.inc @@ -0,0 +1,16 @@ + +----- + diff --git a/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension2/ext_localconf.php.inc b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension2/ext_localconf.php.inc new file mode 100644 index 000000000..0c9203dd9 --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension2/ext_localconf.php.inc @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension3/ext_localconf.php.inc b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension3/ext_localconf.php.inc new file mode 100644 index 000000000..f07f7921c --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/Fixture/extension3/ext_localconf.php.inc @@ -0,0 +1,42 @@ +' +); + +?> +----- + diff --git a/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/MigrateAddUserTSConfigToUserTsConfigFileRectorTest.php b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/MigrateAddUserTSConfigToUserTsConfigFileRectorTest.php new file mode 100644 index 000000000..8a0f382b1 --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/MigrateAddUserTSConfigToUserTsConfigFileRectorTest.php @@ -0,0 +1,115 @@ +initializeFilesystem(); + } + + protected function tearDown(): void + { + foreach ($this->testFilesToDelete as $filename) { + $this->filesystem->delete($filename); + } + + parent::tearDown(); + } + + /** + * @dataProvider provideData + */ + public function testWithNonExistingComposerJson(string $extensionKey, ?string $existingUserTSConfigContent = null): void + { + // Arrange + if ($existingUserTSConfigContent !== null) { + $userTsConfig = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/user.tsconfig'; + $this->testFilesToDelete[] = $userTsConfig; + $this->filesystem->write($userTsConfig, $existingUserTSConfigContent); + } + + // Act + $this->doTestFile(__DIR__ . '/Fixture/' . $extensionKey . '/ext_localconf.php.inc'); + $this->testFilesToDelete[] = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/user.tsconfig'; + + // Assert + $content = $this->filesystem->read(__DIR__ . '/Fixture/' . $extensionKey . '/Configuration/user.tsconfig'); + self::assertStringEqualsFile(__DIR__ . '/Assertions/' . $extensionKey . '/Configuration/user.tsconfig', $content); + } + + /** + * @dataProvider provideData + */ + public function testWithExistingComposerJson(string $extensionKey, ?string $existingUserTSConfigContent = null): void + { + // Arrange + $composerJson = __DIR__ . '/Fixture/' . $extensionKey . '/composer.json'; + $this->testFilesToDelete[] = $composerJson; + $this->filesystem->write($composerJson, '{ + "extra": { + "typo3/cms": { + "extension-key": "' . $extensionKey . '" + } + } +} +'); + + if ($existingUserTSConfigContent !== null) { + $userTsConfig = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/user.tsconfig'; + $this->testFilesToDelete[] = $userTsConfig; + $this->filesystem->write($userTsConfig, $existingUserTSConfigContent); + } + + // Act + $this->doTestFile(__DIR__ . '/Fixture/' . $extensionKey . '/ext_localconf.php.inc'); + $this->testFilesToDelete[] = __DIR__ . '/Fixture/' . $extensionKey . '/Configuration/user.tsconfig'; + + // Assert + $content = $this->filesystem->read(__DIR__ . '/Fixture/' . $extensionKey . '/Configuration/user.tsconfig'); + self::assertStringEqualsFile(__DIR__ . '/Assertions/' . $extensionKey . '/Configuration/user.tsconfig', $content); + } + + /** + * @return Iterator> + */ + public static function provideData(): Iterator + { + yield 'Test that new user.tsconfig is created with correct content' => ['extension1']; + + yield 'Test that content is appended to existing user.tsconfig file' => [ + 'extension2', + '# user.tsconfig file exist', + ]; + + yield 'Test that new user.tsconfig is created with correct content but unresolvable content cannot be migrated properly' => [ + '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/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/config/configured_rule.php b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/config/configured_rule.php new file mode 100644 index 000000000..6f5ceeffe --- /dev/null +++ b/tests/Rector/v13/v0/MigrateAddUserTSConfigToUserTsConfigFileRector/config/configured_rule.php @@ -0,0 +1,11 @@ +import(__DIR__ . '/../../../../../../config/config_test.php'); + $rectorConfig->rule(MigrateAddUserTSConfigToUserTsConfigFileRector::class); +};