diff --git a/lib/mjml.rb b/lib/mjml.rb index 6ace45e..d9c2aef 100644 --- a/lib/mjml.rb +++ b/lib/mjml.rb @@ -48,6 +48,7 @@ def self.run_mjml(args, mjml_bin: valid_mjml_binary) def self.valid_mjml_binary self.valid_mjml_binary = @@valid_mjml_binary || check_for_custom_mjml_binary || + check_for_node_modules_mjml_binary || check_for_package_mjml_binary || check_for_global_mjml_binary || check_for_mrml_binary @@ -73,6 +74,15 @@ def self.check_for_custom_mjml_binary 'it is a valid MJML binary. Please check your configuration.' end + def self.check_for_node_modules_mjml_binary + package_json = JSON.parse(Rails.root.join('node_modules/mjml/package.json').read) + if package_json['version'].start_with?(Mjml.mjml_binary_version_supported) + Rails.root.join('node_modules/.bin/mjml').to_s + end + rescue StandardError + false + end + def self.check_for_mjml_package(package_manager, bin_command, binary_path) stdout, _, status = Open3.capture3("which #{package_manager}") return unless status.success? diff --git a/test/mjml_test.rb b/test/mjml_test.rb index 86956d6..dbc48a0 100644 --- a/test/mjml_test.rb +++ b/test/mjml_test.rb @@ -159,6 +159,15 @@ class NotifierMailerTest < ActiveSupport::TestCase 'but MJML-Rails could not validate that it is a valid MJML binary')) end + it 'checks for node_modules first to avoid running the binary' do + Rails.stubs(:root).returns(Pathname.new('.')) + Mjml.stubs(:check_for_package_mjml_binary).never + Mjml.stubs(:check_for_global_mjml_binary).never + Mjml.stubs(:check_for_mrml_binary).never + + expect(Mjml.valid_mjml_binary.to_s).must_match(%r{node_modules/.bin/mjml}) + end + it 'can use MRML and check for a valid binary' do Mjml.use_mrml = true Mjml.stubs(:check_for_custom_mjml_binary).returns(false)