diff --git a/danger/tailwindcss/Dangerfile b/danger/tailwindcss/Dangerfile new file mode 100644 index 0000000000000000000000000000000000000000..2975d373abdcd3e832e1261581a3a87a5319f995 --- /dev/null +++ b/danger/tailwindcss/Dangerfile @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module Danger + class Tailwind + FRONTEND_INTERPOLATION_PATTERN = /gl-[0-9a-z-]+(\$\{|['"] ?\+)/ + BACKEND_INTERPOLATION_PATTERN = /gl-[0-9a-z-]+(#\{|['"] ?\+)/ + + def initialize(helper, git) + @helper = helper + @git = git + end + + def report_interpolated_utils + frontend_files_with_interpolated_utils = files_with_interpolated_utils( + frontend_tailwindy_files(@helper.all_changed_files), FRONTEND_INTERPOLATION_PATTERN) + backend_files_with_interpolated_utils = files_with_interpolated_utils( + backend_tailwindy_files(@helper.all_changed_files), BACKEND_INTERPOLATION_PATTERN) + + return "" if frontend_files_with_interpolated_utils.empty? && backend_files_with_interpolated_utils.empty? + + <<~MARKDOWN + ### Interpolated utils + + The following files might contain interpolated utils: + #{format_files_list(frontend_files_with_interpolated_utils + backend_files_with_interpolated_utils)} + + If you are leveraging CSS utilities, make sure they are written in full and not built via string + interpolation as that would prevent Tailwind CSS from generating them. + MARKDOWN + end + + private + + def frontend_tailwindy_files(files) + files.select do |file| + file.end_with?('.vue', '.js') + end + end + + def backend_tailwindy_files(files) + files.select do |file| + file.end_with?('.html.haml', '.rb') + end + end + + def files_with_interpolated_utils(files, pattern) + files.select do |file| + diff = @git.diff_for_file(file) + diff.patch.each_line.any? do |line| + line.start_with?('+') && line.match?(pattern) + end + end + end + + def format_files_list(files) + files.map do |file| + "- `#{file}`" + end.join("\n") + end + end +end + +danger_tailwind = Danger::Tailwind.new(helper, git) +report = danger_tailwind.report_interpolated_utils + +unless report.empty? + markdown <<~MSG + ## Tailwind CSS + + #{report} + MSG +end