module MountSvelte::ViewHelpers
def svelte_component(filename, props = {})
def svelte_component(filename, props = {}) unless filename.match(/[a-z|A-Z][a-z|A-Z|0-9]+$/) raise "FileName/TagName must be in camelCase format and without .svelte suffix. It must not start with a number." end render_server_side = if props.key?(:render_server_side) props.delete(:render_server_side) else MountSvelte::Configuration.instance.render_server_side end unless [true, false, :auto].include?(render_server_side) raise "Only true, false or auto are allowed for the argument #render_server_side" end hydrate = if props.key?(:hydrate) props[:hydrate] else true end props.delete(:hydrate) html_class = props.delete(:class).to_s + " svelte-component" is_initial_request = request.headers['X-Turbo-Request-ID'].blank? # render if render_server_side == true || (render_server_side == :auto && is_initial_request) # render server side start_time = Time.now sv = MountSvelte::RenderServerSide.new(filename + '.svelte') sv.compile_if_changes res = sv.render_compiled_file(props) time = Time.now - start_time Rails.logger.info " Rendered #{filename}.svelte server-side: #{time.round(3)}ms" data = { props: props } data[:not_hydrated_svelte_component] = filename if hydrate content_tag(:div, class: html_class, data: data) do r = content_tag(:style, res['css'], type: 'text/css') r << res['html'].html_safe #res['html'].html_safe end else # render for custom-element tag_name = filename.gsub('/','--').underscore.gsub('_', '-') + '-svelte' prp = [] props.each do |k, v| _v = if v.is_a?(Array) || v.is_a?(Hash) v.to_json else v.to_s end prp.push("#{k}='#{_v}'") end if html_class prp.push("class='#{html_class}'") end tag = "<#{tag_name} #{prp.join(' ')}></#{tag_name}>" Rails.logger.info " Rendered Tag for Svelte custom element: «#{tag}»" tag.html_safe end end