From ee9c360b318126b8712c387ace3f78ba34983a91 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Mon, 27 Jan 2025 09:35:04 +0100 Subject: [PATCH 1/8] Revert "fix: default to latest Tailwind CSS v3.x (#83)" This reverts commit 81c9e6ff2bb1a95e67fc6af04ca87fccdcf55aa4. --- doc/index.rst | 4 ---- src/DependencyInjection/TailwindExtension.php | 2 +- tests/TailwindBuilderTest.php | 4 ++-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 3069ed6..9d216e7 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,10 +1,6 @@ Tailwind CSS for Symfony! ========================= -.. caution:: - - This bundle does not yet support Tailwind CSS 4.0. - This bundle makes it easy to use `Tailwind CSS `_ with Symfony's `AssetMapper Component `_ (no Node.js required!). diff --git a/src/DependencyInjection/TailwindExtension.php b/src/DependencyInjection/TailwindExtension.php index 7fe0593..116ef86 100644 --- a/src/DependencyInjection/TailwindExtension.php +++ b/src/DependencyInjection/TailwindExtension.php @@ -70,7 +70,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->end() ->scalarNode('binary_version') ->info('Tailwind CLI version to download - null means the latest version') - ->defaultValue('v3.4.17') + ->defaultNull() ->end() ->scalarNode('postcss_config_file') ->info('Path to PostCSS config file which is passed to the Tailwind CLI') diff --git a/tests/TailwindBuilderTest.php b/tests/TailwindBuilderTest.php index 0b2a44c..f5b2054 100644 --- a/tests/TailwindBuilderTest.php +++ b/tests/TailwindBuilderTest.php @@ -94,7 +94,7 @@ public function testBuildProvidedInputFile(): void __DIR__.'/fixtures/var/tailwind', new ArrayAdapter(), null, - 'v3.4.17', + null, __DIR__.'/fixtures/tailwind.config.js' ); $process = $builder->runBuild(watch: false, poll: false, minify: true, inputFile: 'assets/styles/second.css'); @@ -115,7 +115,7 @@ public function testIntegrationWithPostcss(): void __DIR__.'/fixtures/var/tailwind', new ArrayAdapter(), null, - 'v3.4.17', + null, __DIR__.'/fixtures/tailwind.config.js', __DIR__.'/fixtures/postcss.config.js', ); From 77fb6f5f1db7bf2ad2ec4f76c8e2906ed68b5f53 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Mon, 27 Jan 2025 11:29:28 +0100 Subject: [PATCH 2/8] Fix Tailwind CSS v4 support --- src/Command/TailwindInitCommand.php | 47 ++++++++++++++++++++++------- src/TailwindBinary.php | 2 +- src/TailwindBuilder.php | 4 +++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/Command/TailwindInitCommand.php b/src/Command/TailwindInitCommand.php index 5c3e182..78a6408 100644 --- a/src/Command/TailwindInitCommand.php +++ b/src/Command/TailwindInitCommand.php @@ -94,19 +94,44 @@ private function addTailwindDirectives(SymfonyStyle $io): void { $inputFile = $this->tailwindBuilder->getInputCssPaths()[0]; $contents = is_file($inputFile) ? file_get_contents($inputFile) : ''; - if (str_contains($contents, '@tailwind base')) { - $io->note(\sprintf('Tailwind directives already exist in "%s"', $inputFile)); + $binaryVersion = $this->tailwindBuilder->getBinaryVersion(); + $versionGreaterThan4 = strpos($binaryVersion, 'v') === 0 && + version_compare(substr($binaryVersion, 1), '4') >= 0; + $tailwindGreaterThan4Directive = '@import "tailwindcss";'; + + if ($versionGreaterThan4) { + if(str_contains($contents, $tailwindGreaterThan4Directive)) { + $io->note(sprintf('New Tailwind 4 or higher directive already exist in "%s"', $inputFile)); + + return; + } + if (str_contains($contents, '@tailwind base')) { + $io->note(sprintf('Removing old Tailwind directives from "%s"', $inputFile)); + $oldDirectives = '@tailwind base;'.PHP_EOL.'@tailwind components;'.PHP_EOL.'@tailwind utilities;'.PHP_EOL.PHP_EOL; + $contents = str_replace($oldDirectives, '', $contents); + } + $io->note(sprintf('Adding Tailwind 4 or higher directive to "%s"', $inputFile)); + file_put_contents($inputFile, $tailwindGreaterThan4Directive.PHP_EOL.PHP_EOL.$contents); return; + } else { + if (str_contains($contents, '@tailwind base')) { + $io->note(\sprintf('Tailwind directives already exist in "%s"', $inputFile)); + + return; + } + if (str_contains($contents, $tailwindGreaterThan4Directive)) { + $io->note(sprintf('Removing Tailwind 4 or higher directive from "%s"', $inputFile)); + $contents = str_replace($tailwindGreaterThan4Directive.PHP_EOL.PHP_EOL, '', $contents); + } + $io->note(\sprintf('Adding Tailwind directives to "%s"', $inputFile)); + $tailwindDirectives = <<note(\sprintf('Adding Tailwind directives to "%s"', $inputFile)); - $tailwindDirectives = <<cachedVersion ??= $this->binaryVersion ?? $this->getLatestVersion(); } diff --git a/src/TailwindBuilder.php b/src/TailwindBuilder.php index 7d3fdec..b2e65fa 100644 --- a/src/TailwindBuilder.php +++ b/src/TailwindBuilder.php @@ -140,6 +140,10 @@ public function getOutputCssContent(string $inputFile): string return file_get_contents($this->getInternalOutputCssPath($inputFile)); } + public function getBinaryVersion(): string { + return $this->createBinary()->getVersion(); + } + private function validateInputFile(string $inputPath): string { if (is_file($inputPath)) { From 6011aa1377f3c02dd140aeeb648e812e51cf86b5 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Thu, 30 Jan 2025 01:36:53 +0100 Subject: [PATCH 3/8] Fix tests for Tailwind CSS v4 and specify that PostCSS is not supported anymore by the standalone version --- doc/index.rst | 5 ++ src/Command/TailwindInitCommand.php | 18 +++---- src/TailwindBuilder.php | 7 ++- tests/TailwindBuilderTest.php | 57 +++++++++++++++------- tests/fixtures/assets/styles/app-v4.css | 5 ++ tests/fixtures/assets/styles/app.css | 2 +- tests/fixtures/assets/styles/second-v4.css | 5 ++ tests/fixtures/assets/styles/second.css | 2 +- 8 files changed, 69 insertions(+), 32 deletions(-) create mode 100644 tests/fixtures/assets/styles/app-v4.css create mode 100644 tests/fixtures/assets/styles/second-v4.css diff --git a/doc/index.rst b/doc/index.rst index 9d216e7..b3233e8 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,6 +1,11 @@ Tailwind CSS for Symfony! ========================= +.. caution:: + + This bundle support Tailwind CSS 4.0 but PostCSS is not supported by the standalone binary. + Please specify a lower Tailwind binary version if you want to use PostCSS. + This bundle makes it easy to use `Tailwind CSS `_ with Symfony's `AssetMapper Component `_ (no Node.js required!). diff --git a/src/Command/TailwindInitCommand.php b/src/Command/TailwindInitCommand.php index 78a6408..7b25062 100644 --- a/src/Command/TailwindInitCommand.php +++ b/src/Command/TailwindInitCommand.php @@ -94,13 +94,11 @@ private function addTailwindDirectives(SymfonyStyle $io): void { $inputFile = $this->tailwindBuilder->getInputCssPaths()[0]; $contents = is_file($inputFile) ? file_get_contents($inputFile) : ''; - $binaryVersion = $this->tailwindBuilder->getBinaryVersion(); - $versionGreaterThan4 = strpos($binaryVersion, 'v') === 0 && - version_compare(substr($binaryVersion, 1), '4') >= 0; - $tailwindGreaterThan4Directive = '@import "tailwindcss";'; + $versionEqualsOrGreaterThan4 = $this->tailwindBuilder->isBinaryVersionEqualOrGreaterThan4(); + $tailwindEqualsOrGreaterThan4Directive = '@import "tailwindcss";'; - if ($versionGreaterThan4) { - if(str_contains($contents, $tailwindGreaterThan4Directive)) { + if ($versionEqualsOrGreaterThan4) { + if(str_contains($contents, $tailwindEqualsOrGreaterThan4Directive)) { $io->note(sprintf('New Tailwind 4 or higher directive already exist in "%s"', $inputFile)); return; @@ -111,18 +109,16 @@ private function addTailwindDirectives(SymfonyStyle $io): void $contents = str_replace($oldDirectives, '', $contents); } $io->note(sprintf('Adding Tailwind 4 or higher directive to "%s"', $inputFile)); - file_put_contents($inputFile, $tailwindGreaterThan4Directive.PHP_EOL.PHP_EOL.$contents); - - return; + file_put_contents($inputFile, $tailwindEqualsOrGreaterThan4Directive.PHP_EOL.PHP_EOL.$contents); } else { if (str_contains($contents, '@tailwind base')) { $io->note(\sprintf('Tailwind directives already exist in "%s"', $inputFile)); return; } - if (str_contains($contents, $tailwindGreaterThan4Directive)) { + if (str_contains($contents, $tailwindEqualsOrGreaterThan4Directive)) { $io->note(sprintf('Removing Tailwind 4 or higher directive from "%s"', $inputFile)); - $contents = str_replace($tailwindGreaterThan4Directive.PHP_EOL.PHP_EOL, '', $contents); + $contents = str_replace($tailwindEqualsOrGreaterThan4Directive.PHP_EOL.PHP_EOL, '', $contents); } $io->note(\sprintf('Adding Tailwind directives to "%s"', $inputFile)); $tailwindDirectives = <<getInternalOutputCssPath($inputFile)); } - public function getBinaryVersion(): string { - return $this->createBinary()->getVersion(); + public function isBinaryVersionEqualOrGreaterThan4(): bool + { + $binaryVersion = $this->createBinary()->getVersion(); + return str_starts_with($binaryVersion, 'v') && + version_compare(substr($binaryVersion, 1), '4') >= 0; } private function validateInputFile(string $inputPath): string diff --git a/tests/TailwindBuilderTest.php b/tests/TailwindBuilderTest.php index f5b2054..e090589 100644 --- a/tests/TailwindBuilderTest.php +++ b/tests/TailwindBuilderTest.php @@ -17,6 +17,7 @@ class TailwindBuilderTest extends TestCase { + protected function setUp(): void { $fs = new Filesystem(); @@ -31,7 +32,7 @@ protected function tearDown(): void // so try to clean up the dir a few times while (true) { try { - $fs->remove(__DIR__.'/fixtures/var/tailwind'); +// $fs->remove(__DIR__.'/fixtures/var/tailwind'); break; } catch (IOException $e) { if ($i++ > 5) { @@ -44,11 +45,24 @@ protected function tearDown(): void } } + protected function isTailwindBinaryEqualOrGreaterThan4(): bool + { + $versionBuilder = new TailwindBuilder( + '', + [], + '', + new ArrayAdapter(), + ); + return $versionBuilder->isBinaryVersionEqualOrGreaterThan4(); + } + public function testIntegrationWithDefaultOptions(): void { + $cssFilesSuffix = $this->isTailwindBinaryEqualOrGreaterThan4() ? '-v4' : ''; + $builder = new TailwindBuilder( __DIR__.'/fixtures', - [__DIR__.'/fixtures/assets/styles/app.css'], + [__DIR__.'/fixtures/assets/styles/app'.$cssFilesSuffix.'.css'], __DIR__.'/fixtures/var/tailwind', new ArrayAdapter(), null, @@ -59,17 +73,19 @@ public function testIntegrationWithDefaultOptions(): void $process->wait(); $this->assertTrue($process->isSuccessful()); - $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/app.built.css'); + $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/app'.$cssFilesSuffix.'.built.css'); - $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/app.built.css'); - $this->assertStringContainsString("body {\n background-color: red;\n}", $outputFileContents, 'The output file should contain non-minified CSS.'); + $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/app'.$cssFilesSuffix.'.built.css'); + $this->assertStringContainsString("body {\n background-color: #ef4444;\n}", $outputFileContents, 'The output file should contain non-minified CSS.'); } public function testIntegrationWithMinify(): void { + $cssFilesSuffix = $this->isTailwindBinaryEqualOrGreaterThan4() ? '-v4' : ''; + $builder = new TailwindBuilder( __DIR__.'/fixtures', - [__DIR__.'/fixtures/assets/styles/app.css'], + [__DIR__.'/fixtures/assets/styles/app'.$cssFilesSuffix.'.css'], __DIR__.'/fixtures/var/tailwind', new ArrayAdapter(), null, @@ -80,38 +96,45 @@ public function testIntegrationWithMinify(): void $process->wait(); $this->assertTrue($process->isSuccessful()); - $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/app.built.css'); + $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/app'.$cssFilesSuffix.'.built.css'); - $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/app.built.css'); - $this->assertStringContainsString('body{background-color:red}', $outputFileContents, 'The output file should contain minified CSS.'); + $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/app'.$cssFilesSuffix.'.built.css'); + $this->assertStringContainsString('body{background-color:#ef4444}', $outputFileContents, 'The output file should contain minified CSS.'); } public function testBuildProvidedInputFile(): void { + $cssFilesSuffix = $this->isTailwindBinaryEqualOrGreaterThan4() ? '-v4' : ''; + $builder = new TailwindBuilder( __DIR__.'/fixtures', - [__DIR__.'/fixtures/assets/styles/app.css', __DIR__.'/fixtures/assets/styles/second.css'], + [__DIR__.'/fixtures/assets/styles/app'.$cssFilesSuffix.'.css', __DIR__.'/fixtures/assets/styles/second'.$cssFilesSuffix.'.css'], __DIR__.'/fixtures/var/tailwind', new ArrayAdapter(), null, null, __DIR__.'/fixtures/tailwind.config.js' ); - $process = $builder->runBuild(watch: false, poll: false, minify: true, inputFile: 'assets/styles/second.css'); + $process = $builder->runBuild(watch: false, poll: false, minify: true, inputFile: 'assets/styles/second'.$cssFilesSuffix.'.css'); $process->wait(); $this->assertTrue($process->isSuccessful()); - $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/second.built.css'); + $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/second'.$cssFilesSuffix.'.built.css'); - $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/second.built.css'); - $this->assertStringContainsString('body{background-color:blue}', $outputFileContents, 'The output file should contain minified CSS.'); + $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/second'.$cssFilesSuffix.'.built.css'); + $this->assertStringContainsString('body{background-color:#3b82f6}', $outputFileContents, 'The output file should contain minified CSS.'); } public function testIntegrationWithPostcss(): void { + $cssFilesSuffix = $this->isTailwindBinaryEqualOrGreaterThan4() ? '-v4' : ''; + if ($cssFilesSuffix) { + $this->markTestSkipped('Postcss seems not compatible with Tailwind CLI v4!'); + } + $builder = new TailwindBuilder( __DIR__.'/fixtures', - [__DIR__.'/fixtures/assets/styles/app.css'], + [__DIR__.'/fixtures/assets/styles/app'.$cssFilesSuffix.'.css'], __DIR__.'/fixtures/var/tailwind', new ArrayAdapter(), null, @@ -123,9 +146,9 @@ public function testIntegrationWithPostcss(): void $process->wait(); $this->assertTrue($process->isSuccessful()); - $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/app.built.css'); + $this->assertFileExists(__DIR__.'/fixtures/var/tailwind/app'.$cssFilesSuffix.'.built.css'); - $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/app.built.css'); + $outputFileContents = file_get_contents(__DIR__.'/fixtures/var/tailwind/app'.$cssFilesSuffix.'.built.css'); $this->assertStringContainsString('.dummy {}', $outputFileContents, 'The output file should contain the dummy CSS added by the dummy plugin.'); } } diff --git a/tests/fixtures/assets/styles/app-v4.css b/tests/fixtures/assets/styles/app-v4.css new file mode 100644 index 0000000..5875251 --- /dev/null +++ b/tests/fixtures/assets/styles/app-v4.css @@ -0,0 +1,5 @@ +@import "tailwindcss"; + +body { + background-color: #ef4444; +} diff --git a/tests/fixtures/assets/styles/app.css b/tests/fixtures/assets/styles/app.css index f270572..814b489 100644 --- a/tests/fixtures/assets/styles/app.css +++ b/tests/fixtures/assets/styles/app.css @@ -3,5 +3,5 @@ @tailwind utilities; body { - background-color: red; + background-color: #ef4444; } diff --git a/tests/fixtures/assets/styles/second-v4.css b/tests/fixtures/assets/styles/second-v4.css new file mode 100644 index 0000000..0e2982a --- /dev/null +++ b/tests/fixtures/assets/styles/second-v4.css @@ -0,0 +1,5 @@ +@import "tailwindcss"; + +body { + background-color: #3b82f6; +} diff --git a/tests/fixtures/assets/styles/second.css b/tests/fixtures/assets/styles/second.css index e16ba4d..ac52985 100644 --- a/tests/fixtures/assets/styles/second.css +++ b/tests/fixtures/assets/styles/second.css @@ -3,5 +3,5 @@ @tailwind utilities; body { - background-color: blue; + background-color: #3b82f6; } From 6cbfdab749e9b0e79b71a6bb9116b696666ed4e3 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Thu, 30 Jan 2025 01:45:36 +0100 Subject: [PATCH 4/8] Uncomment tearDown for debug... --- tests/TailwindBuilderTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/TailwindBuilderTest.php b/tests/TailwindBuilderTest.php index e090589..808505d 100644 --- a/tests/TailwindBuilderTest.php +++ b/tests/TailwindBuilderTest.php @@ -32,7 +32,7 @@ protected function tearDown(): void // so try to clean up the dir a few times while (true) { try { -// $fs->remove(__DIR__.'/fixtures/var/tailwind'); + $fs->remove(__DIR__.'/fixtures/var/tailwind'); break; } catch (IOException $e) { if ($i++ > 5) { From a544f041fa6f48484d8bcf4b3ea8ac1729ce3946 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Thu, 30 Jan 2025 10:21:35 +0100 Subject: [PATCH 5/8] PHP-CS-FIXER fixes --- src/Command/TailwindInitCommand.php | 18 +++++++++--------- src/TailwindBuilder.php | 5 +++-- tests/TailwindBuilderTest.php | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Command/TailwindInitCommand.php b/src/Command/TailwindInitCommand.php index 7b25062..4dec9b6 100644 --- a/src/Command/TailwindInitCommand.php +++ b/src/Command/TailwindInitCommand.php @@ -98,18 +98,18 @@ private function addTailwindDirectives(SymfonyStyle $io): void $tailwindEqualsOrGreaterThan4Directive = '@import "tailwindcss";'; if ($versionEqualsOrGreaterThan4) { - if(str_contains($contents, $tailwindEqualsOrGreaterThan4Directive)) { - $io->note(sprintf('New Tailwind 4 or higher directive already exist in "%s"', $inputFile)); + if (str_contains($contents, $tailwindEqualsOrGreaterThan4Directive)) { + $io->note(\sprintf('New Tailwind 4 or higher directive already exist in "%s"', $inputFile)); return; } if (str_contains($contents, '@tailwind base')) { - $io->note(sprintf('Removing old Tailwind directives from "%s"', $inputFile)); - $oldDirectives = '@tailwind base;'.PHP_EOL.'@tailwind components;'.PHP_EOL.'@tailwind utilities;'.PHP_EOL.PHP_EOL; + $io->note(\sprintf('Removing old Tailwind directives from "%s"', $inputFile)); + $oldDirectives = '@tailwind base;'.\PHP_EOL.'@tailwind components;'.\PHP_EOL.'@tailwind utilities;'.\PHP_EOL.\PHP_EOL; $contents = str_replace($oldDirectives, '', $contents); } - $io->note(sprintf('Adding Tailwind 4 or higher directive to "%s"', $inputFile)); - file_put_contents($inputFile, $tailwindEqualsOrGreaterThan4Directive.PHP_EOL.PHP_EOL.$contents); + $io->note(\sprintf('Adding Tailwind 4 or higher directive to "%s"', $inputFile)); + file_put_contents($inputFile, $tailwindEqualsOrGreaterThan4Directive.\PHP_EOL.\PHP_EOL.$contents); } else { if (str_contains($contents, '@tailwind base')) { $io->note(\sprintf('Tailwind directives already exist in "%s"', $inputFile)); @@ -117,8 +117,8 @@ private function addTailwindDirectives(SymfonyStyle $io): void return; } if (str_contains($contents, $tailwindEqualsOrGreaterThan4Directive)) { - $io->note(sprintf('Removing Tailwind 4 or higher directive from "%s"', $inputFile)); - $contents = str_replace($tailwindEqualsOrGreaterThan4Directive.PHP_EOL.PHP_EOL, '', $contents); + $io->note(\sprintf('Removing Tailwind 4 or higher directive from "%s"', $inputFile)); + $contents = str_replace($tailwindEqualsOrGreaterThan4Directive.\PHP_EOL.\PHP_EOL, '', $contents); } $io->note(\sprintf('Adding Tailwind directives to "%s"', $inputFile)); $tailwindDirectives = <<createBinary()->getVersion(); - return str_starts_with($binaryVersion, 'v') && - version_compare(substr($binaryVersion, 1), '4') >= 0; + + return str_starts_with($binaryVersion, 'v') + && version_compare(substr($binaryVersion, 1), '4') >= 0; } private function validateInputFile(string $inputPath): string diff --git a/tests/TailwindBuilderTest.php b/tests/TailwindBuilderTest.php index 808505d..abde32e 100644 --- a/tests/TailwindBuilderTest.php +++ b/tests/TailwindBuilderTest.php @@ -17,7 +17,6 @@ class TailwindBuilderTest extends TestCase { - protected function setUp(): void { $fs = new Filesystem(); @@ -53,6 +52,7 @@ protected function isTailwindBinaryEqualOrGreaterThan4(): bool '', new ArrayAdapter(), ); + return $versionBuilder->isBinaryVersionEqualOrGreaterThan4(); } From 793d976af55846626825bcb17afb842f9dadc9c0 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Thu, 30 Jan 2025 16:18:56 +0100 Subject: [PATCH 6/8] Add a warning to the documentation in the PostCSS usage. Not supported anymore in versions highter than 4.0.0 --- doc/index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/index.rst b/doc/index.rst index b3233e8..458b753 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -247,6 +247,11 @@ set ``binary_version`` option: Using a PostCSS config file ------------------------ +.. warning:: + + Tailwind CSS standalone binary v4.0.0 or higher doesn't support PostCSS anymore. + If you want to use PostCSS, please specify a previous binary version. + If you want to use additional PostCSS plugins, you can specify the PostCSS config file to use, set ``postcss_config_file`` option or pass the ``--postcss`` option to the ``tailwind:build`` command. From 7a2bbd9885af197d60b4792d0eb6691c03024fe4 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Mon, 3 Feb 2025 14:47:53 +0100 Subject: [PATCH 7/8] Throw exception if binary equals or higher than v4 and PostCSS config file is used --- src/Exception/ExceptionInterface.php | 17 +++++++++++++++++ src/Exception/InvalidArgumentException.php | 17 +++++++++++++++++ src/TailwindBuilder.php | 11 +++++++---- 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/Exception/ExceptionInterface.php create mode 100644 src/Exception/InvalidArgumentException.php diff --git a/src/Exception/ExceptionInterface.php b/src/Exception/ExceptionInterface.php new file mode 100644 index 0000000..11f0583 --- /dev/null +++ b/src/Exception/ExceptionInterface.php @@ -0,0 +1,17 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfonycasts\TailwindBundle\Exception; + +/** + * Base ExceptionInterface for the TailwindCSS Bundle. + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..72a09ed --- /dev/null +++ b/src/Exception/InvalidArgumentException.php @@ -0,0 +1,17 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfonycasts\TailwindBundle\Exception; + +/** + * Base InvalidArgumentException for the TailwindCSS Bundle. + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/src/TailwindBuilder.php b/src/TailwindBuilder.php index c2d9168..d9637f9 100644 --- a/src/TailwindBuilder.php +++ b/src/TailwindBuilder.php @@ -13,6 +13,7 @@ use Symfony\Component\Process\InputStream; use Symfony\Component\Process\Process; use Symfony\Contracts\Cache\CacheInterface; +use Symfonycasts\TailwindBundle\Exception\InvalidArgumentException; /** * Manages the process of executing Tailwind on the input file. @@ -52,7 +53,6 @@ public function runBuild( ?string $postCssConfigFile = null, ): Process { $binary = $this->createBinary(); - $inputPath = $this->validateInputFile($inputFile ?? $this->inputPaths[0]); if (!\in_array($inputPath, $this->inputPaths)) { throw new \InvalidArgumentException(\sprintf('The input CSS file "%s" is not one of the configured input files.', $inputPath)); @@ -70,7 +70,9 @@ public function runBuild( } $postCssConfigPath = $this->validatePostCssConfigFile($postCssConfigFile ?? $this->postCssConfigPath); - if ($postCssConfigPath) { + if ($this->isBinaryVersionEqualOrGreaterThan4($binary) && $postCssConfigPath) { + throw new InvalidArgumentException('Tailwind 4+ does not support a PostCSS config file.'); + } elseif ($postCssConfigPath) { $arguments[] = '--postcss'; $arguments[] = $postCssConfigPath; } @@ -140,9 +142,10 @@ public function getOutputCssContent(string $inputFile): string return file_get_contents($this->getInternalOutputCssPath($inputFile)); } - public function isBinaryVersionEqualOrGreaterThan4(): bool + public function isBinaryVersionEqualOrGreaterThan4(?TailwindBinary $binary = null): bool { - $binaryVersion = $this->createBinary()->getVersion(); + $binary = $binary ?? $this->createBinary(); + $binaryVersion = $binary->getVersion(); return str_starts_with($binaryVersion, 'v') && version_compare(substr($binaryVersion, 1), '4') >= 0; From a6f4164538e1502b3d174c76978c26a38a2b9bf2 Mon Sep 17 00:00:00 2001 From: Nicolas Letellier Date: Mon, 3 Feb 2025 15:24:03 +0100 Subject: [PATCH 8/8] Revert default Tailwind CSS version to 3.4.17 from commit ee9c360, specify it in the doc --- doc/index.rst | 4 ++-- src/DependencyInjection/TailwindExtension.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 458b753..88643ab 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -4,7 +4,7 @@ Tailwind CSS for Symfony! .. caution:: This bundle support Tailwind CSS 4.0 but PostCSS is not supported by the standalone binary. - Please specify a lower Tailwind binary version if you want to use PostCSS. + By default, the Tailwind CSS binary v3.4.17 is used and works with PostCSS. This bundle makes it easy to use `Tailwind CSS `_ with Symfony's `AssetMapper Component `_ @@ -250,7 +250,7 @@ Using a PostCSS config file .. warning:: Tailwind CSS standalone binary v4.0.0 or higher doesn't support PostCSS anymore. - If you want to use PostCSS, please specify a previous binary version. + If you want to use PostCSS, let the default v3.4.17 binary version. If you want to use additional PostCSS plugins, you can specify the PostCSS config file to use, set ``postcss_config_file`` option or diff --git a/src/DependencyInjection/TailwindExtension.php b/src/DependencyInjection/TailwindExtension.php index 116ef86..7fe0593 100644 --- a/src/DependencyInjection/TailwindExtension.php +++ b/src/DependencyInjection/TailwindExtension.php @@ -70,7 +70,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->end() ->scalarNode('binary_version') ->info('Tailwind CLI version to download - null means the latest version') - ->defaultNull() + ->defaultValue('v3.4.17') ->end() ->scalarNode('postcss_config_file') ->info('Path to PostCSS config file which is passed to the Tailwind CLI')