class JsRender::Renderer

Constants

CONSOLE_POLYFILL
CONSOLE_REPLAY
GLOBAL_CONTEXT

Attributes

asset_finder[R]
component_name[R]
json_data[R]
uuid[R]

Public Class Methods

new(component_name, data) click to toggle source
# File lib/js_render/renderer.rb, line 21
def initialize(component_name, data)
  @component_name = component_name
  unless data.is_a?(String)
    transform_keys(data)
    data = data.to_json
  end
  @json_data = data
  @uuid = SecureRandom.uuid
end

Public Instance Methods

generate_client_script() click to toggle source
# File lib/js_render/renderer.rb, line 54
    def generate_client_script
      func_name = JsRender.config.client_render_function.gsub('*', @component_name)
      <<-HTML
        <script>
          typeof #{func_name} === 'function' && #{func_name}('#{@uuid}', #{@json_data});
        </script>
      HTML
    end
generate_html() click to toggle source
# File lib/js_render/renderer.rb, line 38
    def generate_html
      return "<span id=\"#{@uuid}\"></span>" unless JsRender.config.should_server_render

      func_name = JsRender.config.server_render_function.gsub('*', @component_name)
      server_code = <<-JS
        (function () {
          var serverStr = typeof #{func_name} === 'function' ? #{func_name}(#{@json_data}) : '';
          var consoleReplayStr = #{CONSOLE_REPLAY};
          return '<span id="#{@uuid}">' + serverStr + '</span>' + consoleReplayStr;
        })()
      JS
      context.eval(server_code)
    rescue ExecJS::RuntimeError, ExecJS::ProgramError => error
      raise Errors::ServerRenderError::new(@component_name, @json_data, error)
    end
render_component() click to toggle source
# File lib/js_render/renderer.rb, line 31
def render_component
  server_html = generate_html
  client_script = generate_client_script
  component = (server_html + client_script)
  component.respond_to?(:html_safe) ? component.html_safe : component
end

Private Instance Methods

context() click to toggle source
# File lib/js_render/renderer.rb, line 66
def context
  base_path = JsRender.config.base_path
  paths = JsRender.config.component_paths
  suffix = JsRender.config.component_suffix
  @@cache.getset(base_path + paths.join('') + suffix + @component_name) do
    renderer_code = asset_finder.read_files(@component_name)
    ExecJS.compile(GLOBAL_CONTEXT + CONSOLE_POLYFILL + renderer_code)
  end
end
transform_keys(data) click to toggle source
# File lib/js_render/renderer.rb, line 87
def transform_keys(data)
  JsRender.config.key_transforms.reduce(data) do |transformed_data, transform|
    transformed_data.tap do |d|
      d.keys.each { |k| d[transform.call(k.to_s)] = d.delete(k) }
    end
  end
end