lib/svelte_on_rails/renderer/renderer.rb
module SvelteOnRails class Renderer require 'open3' def initialize(compiled_file: nil, component_name: nil, base_path: SvelteOnRails::Configuration.instance.components_folder_full) @compiled_file = if compiled_file compiled_file elsif component_name utils = SvelteOnRails::Lib::Utils cf = utils.component_files(component_name, base_path: base_path) cf[:compiled_file] else raise "Either compiled_file or component_name must be given" end end # render def render(props = {}) require 'base64' require 'json' utils = SvelteOnRails::Lib::Utils cmd = [ 'node', '/Users/christian/projects-gmbh/gems/svelte-on-rails/svelte-on-rails-gem/lib/svelte_on_rails/renderer/render.js', @compiled_file + '.js', SvelteOnRails::Configuration.instance.rails_root ].join(' ') stdout, stderr, status = Open3.capture3(cmd, stdin_data: props.to_json, chdir: utils.gem_app_dir) unless status.to_s.match(/^pid [0-9]+ exit 0$/) raise "Render Svelte Server-side =>\n#{cmd}\n\nError output from render.js (stderr) =>\n+++\n" + stderr + "+++\n\n" end begin res = JSON.parse(stdout) css_file = @compiled_file + '.css' if File.exist?(css_file) res['css'] = File.read(css_file) end return res rescue JSON::ParserError => e raise "Render Svelte Server-side: Expected JSON, got: «#{stdout}»" end end end end