diff --git a/vite_rails/lib/vite_rails/cli.rb b/vite_rails/lib/vite_rails/cli.rb index 31418f6a..5b83c072 100644 --- a/vite_rails/lib/vite_rails/cli.rb +++ b/vite_rails/lib/vite_rails/cli.rb @@ -31,7 +31,7 @@ def setup_app_files replace_first_line config.config_path, "app/frontend", %( "sourceCodeDir": "#{dir}",) end setup_content_security_policy root.join("config/initializers/content_security_policy.rb") - append root.join("Procfile.dev"), "web: bin/rails s" + append_unless_present root.join("Procfile.dev"), "web: bin/rails s", pattern: "web:" end # Internal: Configure CSP rules that allow to load @vite/client correctly. diff --git a/vite_ruby/lib/vite_ruby/cli/file_utils.rb b/vite_ruby/lib/vite_ruby/cli/file_utils.rb index 35afb796..36763868 100644 --- a/vite_ruby/lib/vite_ruby/cli/file_utils.rb +++ b/vite_ruby/lib/vite_ruby/cli/file_utils.rb @@ -32,8 +32,15 @@ def cp(source, destination) # @since 1.2.11 # @api private def append(path, contents) + append_unless_present(path, contents, pattern: contents) + end + + # Adds a new line at the bottom of the file, unless any line matches the pattern. + # + # @api private + def append_unless_present(path, contents, pattern:) content = read_lines(path) - return if content.join.include?(contents) + return if content.any? { |line| line.include?(pattern) } content << "\n" unless content.last&.end_with?("\n") content << "#{contents}\n" diff --git a/vite_ruby/lib/vite_ruby/cli/install.rb b/vite_ruby/lib/vite_ruby/cli/install.rb index e3f9c820..1e1fda63 100644 --- a/vite_ruby/lib/vite_ruby/cli/install.rb +++ b/vite_ruby/lib/vite_ruby/cli/install.rb @@ -61,7 +61,7 @@ def install_sample_files def_delegators "ViteRuby", :config - %i[append cp inject_line_after inject_line_after_last inject_line_before replace_first_line write].each do |util| + %i[append append_unless_present cp inject_line_after inject_line_after_last inject_line_before replace_first_line write].each do |util| define_method(util) { |*args| ViteRuby::CLI::FileUtils.send(util, *args) rescue nil }