diff --git a/src/FileSystem/ComposerJsonPackageVersionUpdater.php b/src/FileSystem/ComposerJsonPackageVersionUpdater.php index 7940a6d..d378b73 100644 --- a/src/FileSystem/ComposerJsonPackageVersionUpdater.php +++ b/src/FileSystem/ComposerJsonPackageVersionUpdater.php @@ -11,12 +11,24 @@ final class ComposerJsonPackageVersionUpdater public static function update(string $composerJsonContents, string $packageName, string $newVersion): string { // replace using regex, to keep original composer.json format - return Strings::replace( + $allChanges = Strings::replace( $composerJsonContents, // find sprintf('#"%s": "(.*?)"#', $packageName), // replace sprintf('"%s": "%s"', $packageName, $newVersion) ); + + $suggestContent = Strings::match($composerJsonContents, '#"suggest"\s*:\s*{[^}]*}#'); + + if ($suggestContent !== null) { + $allChanges = Strings::replace( + $allChanges, + '#"suggest"\s*:\s*{[^}]*}#', + $suggestContent[0] + ); + } + + return $allChanges; } } diff --git a/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/skip-suggest-early-definition.json b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/skip-suggest-early-definition.json new file mode 100644 index 0000000..d4e6286 --- /dev/null +++ b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/skip-suggest-early-definition.json @@ -0,0 +1,8 @@ +{ + "suggest": { + "illuminate/container": "to use container" + }, + "require-dev": { + "illuminate/container": "^9.0" + } +} diff --git a/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/skip-suggest.json b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/skip-suggest.json new file mode 100644 index 0000000..29e3021 --- /dev/null +++ b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/Fixture/skip-suggest.json @@ -0,0 +1,8 @@ +{ + "require-dev": { + "illuminate/container": "^9.0" + }, + "suggest": { + "illuminate/container": "to use container" + } +} diff --git a/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php index a02a3c2..c7c5d32 100644 --- a/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php +++ b/tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php @@ -5,6 +5,7 @@ namespace Rector\Jack\Tests\ComposerProcessor\RaiseToInstalledComposerProcessor; use Nette\Utils\FileSystem; +use PHPUnit\Framework\Attributes\DataProvider; use Rector\Jack\ComposerProcessor\RaiseToInstalledComposerProcessor; use Rector\Jack\Tests\AbstractTestCase; use Rector\Jack\ValueObject\ChangedPackageVersion; @@ -49,6 +50,58 @@ public function testSkipDev(): void $this->assertEmpty($changedPackageVersionsResult->getChangedPackageVersions()); } + /** + * @return iterable + */ + public static function provideSkipSuggestChangeFiles(): iterable + { + yield [ + __DIR__ . '/Fixture/skip-suggest.json', + <<<'JSON' + { + "require-dev": { + "illuminate/container": "^12.19" + }, + "suggest": { + "illuminate/container": "to use container" + } + } + + JSON + ]; + + yield [ + __DIR__ . '/Fixture/skip-suggest-early-definition.json', + <<<'JSON' + { + "suggest": { + "illuminate/container": "to use container" + }, + "require-dev": { + "illuminate/container": "^12.19" + } + } + + JSON + ]; + } + + #[DataProvider('provideSkipSuggestChangeFiles')] + public function testSkipSuggestChange(string $file, string $changedFileContent): void + { + $composerJsonContents = FileSystem::read($file); + + $changedPackageVersionsResult = $this->raiseToInstalledComposerProcessor->process($composerJsonContents); + + $changedPackageVersion = $changedPackageVersionsResult->getChangedPackageVersions()[0]; + + $this->assertSame('illuminate/container', $changedPackageVersion->getPackageName()); + $this->assertSame('^9.0', $changedPackageVersion->getOldVersion()); + $this->assertSame('^12.19', $changedPackageVersion->getNewVersion()); + + $this->assertSame($changedFileContent, $changedPackageVersionsResult->getComposerJsonContents()); + } + public function testSinglePiped(): void { $composerJsonContents = FileSystem::read(__DIR__ . '/Fixture/single-piped.json');