Skip to content

Commit

Permalink
[TASK] Add MigrateAddUserTSConfigToUserTsConfigFileRector
Browse files Browse the repository at this point in the history
Resolves: #3702
  • Loading branch information
simonschaufi committed Apr 16, 2024
1 parent a3b62c0 commit 210b8a8
Show file tree
Hide file tree
Showing 26 changed files with 500 additions and 76 deletions.
1 change: 1 addition & 0 deletions config/v13/typo3-130.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -26,6 +26,8 @@
*/
final class MigrateAddPageTSConfigToPageTsConfigFileRector extends AbstractRector
{
use ExtensionKeyResolverTrait;

/**
* @readonly
*/
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}
}
142 changes: 142 additions & 0 deletions rules/TYPO313/v0/MigrateAddUserTSConfigToUserTsConfigFileRector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
<?php

declare(strict_types=1);

namespace Ssch\TYPO3Rector\TYPO313\v0;

use PhpParser\Node;
use PhpParser\Node\Expr\BinaryOp\Concat;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Expression;
use PhpParser\NodeTraverser;
use PHPStan\Type\ObjectType;
use Rector\PhpParser\Node\Value\ValueResolver;
use Rector\Rector\AbstractRector;
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;

/**
* @changelog https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/13.0/Deprecation-101807-ExtensionManagementUtilityaddUserTSConfig.html
* @see \Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddUserTSConfigToUserTsConfigFileRector\MigrateAddUserTSConfigToUserTsConfigFileRectorTest
*/
final class MigrateAddUserTSConfigToUserTsConfigFileRector extends AbstractRector
{
use ExtensionKeyResolverTrait;

/**
* @readonly
*/
private FilesFinder $filesFinder;

/**
* @readonly
*/
private FilesystemInterface $filesystem;

/**
* @readonly
*/
private ValueResolver $valueResolver;

public function __construct(
FilesFinder $filesFinder,
FilesystemInterface $filesystem,
ValueResolver $valueResolver,
ComposerExtensionKeyResolver $composerExtensionKeyResolver
) {
$this->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<class-string<Node>>
*/
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, <<<CODE
{$content}
CODE
);
}

return NodeTraverser::REMOVE_NODE;
}

private function shouldSkip(StaticCall $staticMethodCall): bool
{
if (! $this->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());
}
}
2 changes: 1 addition & 1 deletion src/ComposerExtensionKeyResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/Contract/FilesystemInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
5 changes: 5 additions & 0 deletions src/Filesystem/FlysystemFilesystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
48 changes: 48 additions & 0 deletions src/Helper/ExtensionKeyResolverTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);

namespace Ssch\TYPO3Rector\Helper;

use PhpParser\Node\Expr\BinaryOp\Concat;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Scalar\String_;
use Ssch\TYPO3Rector\ComposerExtensionKeyResolver;

trait ExtensionKeyResolverTrait
{
/**
* @readonly
*/
private ComposerExtensionKeyResolver $composerExtensionKeyResolver;

/**
* @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);
}
}
4 changes: 4 additions & 0 deletions stubs/TYPO3/CMS/Core/Utility/ExtensionManagementUtility.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,8 @@ public static function allowTableOnStandardPages(string $table)
public static function addPageTSConfig(string $content): void
{
}

public static function addUserTSConfig(string $content): void
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@import "EXT:extension1/Configuration/TSconfig/*/*.tsconfig"

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# page.tsconfig file exist
@import "EXT:extension2/Configuration/TSconfig/*/*.tsconfig"

@import 'EXT:extension2/Configuration/TSconfig/Page/mod.linkvalidator.tsconfig'

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@import "EXT:extension3/Configuration/TSconfig/*/*.tsconfig"

@import "EXT:extension3/Configuration/TSconfig/*/*.tsconfig"

<INCLUDE_TYPOSCRIPT: source="FILE:EXT:extension3/Configuration/TSconfig/Page.txt">

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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"'
);

?>
-----
<?php

namespace Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddPageTSConfigToPageTsConfigFileRector\Fixture;

$variable = 'ext_key';

?>
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,24 @@
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\''
);
}

?>
-----
<?php

namespace Ssch\TYPO3Rector\Tests\Rector\v13\v0\MigrateAddPageTSConfigToPageTsConfigFileRector\Fixture;

$variable = 'ext_key';
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

if (ExtensionManagementUtility::isLoaded('linkvalidator')) {
}

?>
Loading

0 comments on commit 210b8a8

Please sign in to comment.