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