From 265bd60f04a2d176de1bd5ab2b8457d3b180b694 Mon Sep 17 00:00:00 2001 From: DeLynn Berry Date: Thu, 26 Jan 2023 16:56:11 -0700 Subject: [PATCH 1/5] Add support for multiple css files in a project. --- lib/tailwindcss/commands.rb | 23 +++++++++ lib/tasks/build.rake | 40 ++++++++++++--- test/fixtures/application.tailwind.css | 3 ++ test/fixtures/custom.tailwind.css | 4 ++ test/lib/tailwindcss/commands_test.rb | 70 ++++++++++++++++++++++++++ 5 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/application.tailwind.css create mode 100644 test/fixtures/custom.tailwind.css diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index e7f34cb5..473f8e80 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -72,6 +72,29 @@ def watch_command(poll: false, **kwargs) command << "-p" if poll end end + + def compile_file_command(file:, glob:, debug: false, **kwargs) + file = Pathname.new(file.to_s) + input = file + output = Rails.root.join("app/assets/builds", file.basename.sub(glob.sub("*", ""), ".css")) + config = input.read.include?("@config") ? nil : Rails.root.join("config/tailwind.config.js") + [ + executable(**kwargs), + "-i", input.to_s, + "-o", output.to_s + ].tap do |command| + command << "-c" if config + command << config.to_s if config + command << "--minify" unless debug + end + end + + def watch_file_command(poll: false, **kwargs) + compile_file_command(**kwargs).tap do |command| + command << "-w" + command << "-p" if poll + end + end end end end diff --git a/lib/tasks/build.rake b/lib/tasks/build.rake index bd407214..c48b8f71 100644 --- a/lib/tasks/build.rake +++ b/lib/tasks/build.rake @@ -2,18 +2,46 @@ namespace :tailwindcss do desc "Build your Tailwind CSS" task :build do |_, args| debug = args.extras.include?("debug") - command = Tailwindcss::Commands.compile_command(debug: debug) - puts command.inspect if args.extras.include?("verbose") - system(*command, exception: true) + glob = "*.tailwind.css" + + files = Rails.root.join("app/assets/stylesheets").glob(glob) + + if files.count == 1 && files.first.basename == "application.tailwind.css" + command = Tailwindcss::Commands.compile_command(debug: debug) + puts command.inspect + system(*command, exception: true) + else + files.map do |file| + Tailwindcss::Commands.compile_file_command(file: file, glob: glob, debug: debug) + end.each do |command| + puts command.join(" ") + system(*command, exception: true) + end + end end desc "Watch and build your Tailwind CSS on file changes" task :watch do |_, args| debug = args.extras.include?("debug") poll = args.extras.include?("poll") - command = Tailwindcss::Commands.watch_command(debug: debug, poll: poll) - puts command.inspect if args.extras.include?("verbose") - system(*command) + glob = args.extras.include?("glob") ? "*.tailwind.css" : nil + + if glob + trap("SIGINT") { exit } + + Rails.root.join("app/assets/stylesheets").glob(glob).map do |file| + Tailwindcss::Commands.watch_file_command(file: file, glob: glob, debug: debug, poll: poll) + end.each do |command| + fork do + puts command.join(" ") + system(*command) + end + end + else + command = Tailwindcss::Commands.watch_command(debug: debug, poll: poll) + puts command.inspect + system(*command) + end end end diff --git a/test/fixtures/application.tailwind.css b/test/fixtures/application.tailwind.css new file mode 100644 index 00000000..b5c61c95 --- /dev/null +++ b/test/fixtures/application.tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/test/fixtures/custom.tailwind.css b/test/fixtures/custom.tailwind.css new file mode 100644 index 00000000..19e4eeb8 --- /dev/null +++ b/test/fixtures/custom.tailwind.css @@ -0,0 +1,4 @@ +@config "custom.tailwind.config.js"; +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 7ff0c5c6..187471df 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -58,6 +58,38 @@ def mock_exe_directory(platform) end end + test ".compile_file_command" do + mock_exe_directory("sparc-solaris2.8") do |dir, executable| + Rails.stub(:root, Pathname.new(File.dirname(__FILE__))) do + file = Rails.root.join("../../fixtures/application.tailwind.css") + actual = Tailwindcss::Commands.compile_file_command(file: file, glob: "*.tailwind.css", exe_path: dir) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "--minify") + assert_includes(actual, "-c") + assert_includes(actual[2], "application.tailwind.css") + refute_includes(actual[4], "tailwind.css") + + actual = Tailwindcss::Commands.compile_file_command(file: file, glob: "*.tailwind.css", exe_path: dir, debug: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-c") + refute_includes(actual, "--minify") + assert_includes(actual[2], "application.tailwind.css") + refute_includes(actual[4], "tailwind.css") + + file = Rails.root.join("../../fixtures/custom.tailwind.css") + actual = Tailwindcss::Commands.compile_file_command(file: file, glob: "*.tailwind.css", exe_path: dir) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "--minify") + assert_includes(actual[2], "custom.tailwind.css") + refute_includes(actual, "-c") + refute_includes(actual[4], "tailwind.css") + end + end + end + test ".watch_command" do mock_exe_directory("sparc-solaris2.8") do |dir, executable| Rails.stub(:root, File) do # Rails.root won't work in this test suite @@ -84,4 +116,42 @@ def mock_exe_directory(platform) end end end + + test ".watch_file_command" do + mock_exe_directory("sparc-solaris2.8") do |dir, executable| + Rails.stub(:root, Pathname.new(File.dirname(__FILE__))) do + file = Rails.root.join("../../fixtures/application.tailwind.css") + actual = Tailwindcss::Commands.watch_file_command(file: file, glob: "*.tailwind.css", exe_path: dir) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + assert_includes(actual, "--minify") + assert_includes(actual, "-c") + assert_includes(actual[2], "application.tailwind.css") + refute_includes(actual, "-p") + refute_includes(actual[4], "tailwind.css") + + actual = Tailwindcss::Commands.watch_file_command(file: file, glob: "*.tailwind.css", exe_path: dir, debug: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + assert_includes(actual, "-c") + assert_includes(actual[2], "application.tailwind.css") + refute_includes(actual, "-p") + refute_includes(actual, "--minify") + refute_includes(actual[4], "tailwind.css") + + file = Rails.root.join("../../fixtures/custom.tailwind.css") + actual = Tailwindcss::Commands.watch_file_command(file: file, glob: "*.tailwind.css", exe_path: dir, poll: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + assert_includes(actual, "-p") + assert_includes(actual, "--minify") + assert_includes(actual[2], "custom.tailwind.css") + refute_includes(actual, "-c") + refute_includes(actual[4], "tailwind.css") + end + end + end end From 5e6ed8d26af9e0c683a66d50bced577d84dd162c Mon Sep 17 00:00:00 2001 From: DeLynn Berry Date: Thu, 26 Jan 2023 17:48:00 -0700 Subject: [PATCH 2/5] Get rid of the need to use the glob argument. --- lib/tailwindcss/commands.rb | 4 ++-- lib/tasks/build.rake | 24 ++++++++++++------------ test/lib/tailwindcss/commands_test.rb | 12 ++++++------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 473f8e80..15ad8d3d 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -73,10 +73,10 @@ def watch_command(poll: false, **kwargs) end end - def compile_file_command(file:, glob:, debug: false, **kwargs) + def compile_file_command(file:, debug: false, **kwargs) file = Pathname.new(file.to_s) input = file - output = Rails.root.join("app/assets/builds", file.basename.sub(glob.sub("*", ""), ".css")) + output = Rails.root.join("app/assets/builds", file.basename.sub("tailwind.", "")) config = input.read.include?("@config") ? nil : Rails.root.join("config/tailwind.config.js") [ executable(**kwargs), diff --git a/lib/tasks/build.rake b/lib/tasks/build.rake index c48b8f71..226db3d2 100644 --- a/lib/tasks/build.rake +++ b/lib/tasks/build.rake @@ -2,17 +2,16 @@ namespace :tailwindcss do desc "Build your Tailwind CSS" task :build do |_, args| debug = args.extras.include?("debug") - glob = "*.tailwind.css" - files = Rails.root.join("app/assets/stylesheets").glob(glob) + files = Rails.root.join("app/assets/stylesheets").glob("*.tailwind.css") if files.count == 1 && files.first.basename == "application.tailwind.css" command = Tailwindcss::Commands.compile_command(debug: debug) - puts command.inspect + puts command.join(" ") system(*command, exception: true) else files.map do |file| - Tailwindcss::Commands.compile_file_command(file: file, glob: glob, debug: debug) + Tailwindcss::Commands.compile_file_command(file: file, debug: debug) end.each do |command| puts command.join(" ") system(*command, exception: true) @@ -24,23 +23,24 @@ namespace :tailwindcss do task :watch do |_, args| debug = args.extras.include?("debug") poll = args.extras.include?("poll") - glob = args.extras.include?("glob") ? "*.tailwind.css" : nil - if glob + files = Rails.root.join("app/assets/stylesheets").glob("*.tailwind.css") + + if files.count == 1 && files.first.basename == "application.tailwind.css" + command = Tailwindcss::Commands.watch_command(debug: debug, poll: poll) + puts command.join(" ") + system(*command) + else trap("SIGINT") { exit } - Rails.root.join("app/assets/stylesheets").glob(glob).map do |file| - Tailwindcss::Commands.watch_file_command(file: file, glob: glob, debug: debug, poll: poll) + files.map do |file| + Tailwindcss::Commands.watch_file_command(file: file, debug: debug, poll: poll) end.each do |command| fork do puts command.join(" ") system(*command) end end - else - command = Tailwindcss::Commands.watch_command(debug: debug, poll: poll) - puts command.inspect - system(*command) end end end diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 187471df..3f3bd487 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -62,7 +62,7 @@ def mock_exe_directory(platform) mock_exe_directory("sparc-solaris2.8") do |dir, executable| Rails.stub(:root, Pathname.new(File.dirname(__FILE__))) do file = Rails.root.join("../../fixtures/application.tailwind.css") - actual = Tailwindcss::Commands.compile_file_command(file: file, glob: "*.tailwind.css", exe_path: dir) + actual = Tailwindcss::Commands.compile_file_command(file: file, exe_path: dir) assert_kind_of(Array, actual) assert_equal(executable, actual.first) assert_includes(actual, "--minify") @@ -70,7 +70,7 @@ def mock_exe_directory(platform) assert_includes(actual[2], "application.tailwind.css") refute_includes(actual[4], "tailwind.css") - actual = Tailwindcss::Commands.compile_file_command(file: file, glob: "*.tailwind.css", exe_path: dir, debug: true) + actual = Tailwindcss::Commands.compile_file_command(file: file, exe_path: dir, debug: true) assert_kind_of(Array, actual) assert_equal(executable, actual.first) assert_includes(actual, "-c") @@ -79,7 +79,7 @@ def mock_exe_directory(platform) refute_includes(actual[4], "tailwind.css") file = Rails.root.join("../../fixtures/custom.tailwind.css") - actual = Tailwindcss::Commands.compile_file_command(file: file, glob: "*.tailwind.css", exe_path: dir) + actual = Tailwindcss::Commands.compile_file_command(file: file, exe_path: dir) assert_kind_of(Array, actual) assert_equal(executable, actual.first) assert_includes(actual, "--minify") @@ -121,7 +121,7 @@ def mock_exe_directory(platform) mock_exe_directory("sparc-solaris2.8") do |dir, executable| Rails.stub(:root, Pathname.new(File.dirname(__FILE__))) do file = Rails.root.join("../../fixtures/application.tailwind.css") - actual = Tailwindcss::Commands.watch_file_command(file: file, glob: "*.tailwind.css", exe_path: dir) + actual = Tailwindcss::Commands.watch_file_command(file: file, exe_path: dir) assert_kind_of(Array, actual) assert_equal(executable, actual.first) assert_includes(actual, "-w") @@ -131,7 +131,7 @@ def mock_exe_directory(platform) refute_includes(actual, "-p") refute_includes(actual[4], "tailwind.css") - actual = Tailwindcss::Commands.watch_file_command(file: file, glob: "*.tailwind.css", exe_path: dir, debug: true) + actual = Tailwindcss::Commands.watch_file_command(file: file, exe_path: dir, debug: true) assert_kind_of(Array, actual) assert_equal(executable, actual.first) assert_includes(actual, "-w") @@ -142,7 +142,7 @@ def mock_exe_directory(platform) refute_includes(actual[4], "tailwind.css") file = Rails.root.join("../../fixtures/custom.tailwind.css") - actual = Tailwindcss::Commands.watch_file_command(file: file, glob: "*.tailwind.css", exe_path: dir, poll: true) + actual = Tailwindcss::Commands.watch_file_command(file: file, exe_path: dir, poll: true) assert_kind_of(Array, actual) assert_equal(executable, actual.first) assert_includes(actual, "-w") From 885b4c996567f3bf8c4f61e8019c7acca208f884 Mon Sep 17 00:00:00 2001 From: DeLynn Berry Date: Thu, 26 Jan 2023 17:48:30 -0700 Subject: [PATCH 3/5] Add documentation. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index db1a12cd..75e2dded 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,11 @@ If you want unminified assets, you can pass a `debug` argument to the rake task, Note that you can combine task options, e.g. `rails tailwindcss:watch[debug,poll]`. +### Multiple CSS files + +If you have a reason to break up your CSS into multiple CSS files (for example application.tailwind.css and admin.tailwind.css), as long as your files match the `*.tailwind.css` convention, then the build and watch tasks will create build files with the `tailwind.` removed. + + ### Custom inputs or outputs If you need to use a custom input or output file, you can run `bundle exec tailwindcss` to access the platform-specific executable, and give it your own build options. From 3b4c5353195e4ec9a2a269411ddad5668b4b53ec Mon Sep 17 00:00:00 2001 From: DeLynn Berry Date: Fri, 27 Jan 2023 10:40:47 -0700 Subject: [PATCH 4/5] Just read the first line instead of the entire file. --- lib/tailwindcss/commands.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 15ad8d3d..5a551d1e 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -77,7 +77,7 @@ def compile_file_command(file:, debug: false, **kwargs) file = Pathname.new(file.to_s) input = file output = Rails.root.join("app/assets/builds", file.basename.sub("tailwind.", "")) - config = input.read.include?("@config") ? nil : Rails.root.join("config/tailwind.config.js") + config = input.open(&:readline).starts_with?("@config") ? nil : Rails.root.join("config/tailwind.config.js") [ executable(**kwargs), "-i", input.to_s, From 821e8aba0697c5efd2520469ca49d588d5021fcc Mon Sep 17 00:00:00 2001 From: DeLynn Berry Date: Fri, 27 Jan 2023 10:51:27 -0700 Subject: [PATCH 5/5] Fix typo. --- lib/tailwindcss/commands.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 5a551d1e..08cbcbe4 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -77,7 +77,7 @@ def compile_file_command(file:, debug: false, **kwargs) file = Pathname.new(file.to_s) input = file output = Rails.root.join("app/assets/builds", file.basename.sub("tailwind.", "")) - config = input.open(&:readline).starts_with?("@config") ? nil : Rails.root.join("config/tailwind.config.js") + config = input.open(&:readline).start_with?("@config") ? nil : Rails.root.join("config/tailwind.config.js") [ executable(**kwargs), "-i", input.to_s,