class SvelteOnRails::RenderServerSide
def self.file_exist_case_sensitive?(containing_dir, filename)
def self.file_exist_case_sensitive?(containing_dir, filename) # Combine the directory path and filename full_path = File.join(containing_dir, filename) # Check if the file exists and the path matches case-sensitively File.exist?(full_path) && Dir[File.join(containing_dir, "**/*")].any? do |f| f == full_path end end
def self.gem_app_dir
def self.gem_app_dir File.expand_path('../svelte_on_rails', __dir__) + '/' end
def self.reset_dist
def self.reset_dist unless Dir.exist?(SvelteOnRails::Configuration.instance.dist_folder) FileUtils.mkdir_p(SvelteOnRails::Configuration.instance.dist_folder) end FileUtils.rm_rf Dir.glob("#{SvelteOnRails::Configuration.instance.dist_folder}/*") FileUtils.touch SvelteOnRails::Configuration.instance.dist_folder.join('reset_timestamp') end
def compile
def compile start_time = Time.now dist = SvelteOnRails::Configuration.instance.dist_folder subs = @svelte_filename.split('/')[0..-2].join('/') cmd = [ 'node', self.class.gem_app_dir + 'compile.js', @svelte_file, dist.join(subs), self.class.gem_app_dir ].join(' ') stdout, stderr, status = Open3.capture3(cmd, chdir: SvelteOnRails::Configuration.instance.rails_root) unless status.to_s.match(/^pid [0-9]+ exit 0$/) raise "Compiling «#{@svelte_filename}» Server-side, script compile.js, executed within Rails.root:\n\n#{cmd}\n\n++++++\n\n#{stderr}\n\n++++++\n\n" end time = Time.now - start_time Rails.logger.info " Compiled #{@svelte_filename}.js: #{time.round(3)}ms" rescue nil end
def compile_if_changes
def compile_if_changes # letzte Änderung innerhalb des ordners ermitteln watch_changes = SvelteOnRails::Configuration.instance.watch_changes? ts_file = SvelteOnRails::Configuration.instance.dist_folder.join('reset_timestamp') have_changes = if watch_changes && File.exist?(ts_file) # compare last modification timestamp last_modification = 100.years.ago.to_time Dir.glob("#{SvelteOnRails::Configuration.instance.components_folder}**/*").each do |path| if File.file?(path) mtime = File.mtime(path) if mtime > last_modification last_modification = mtime end end end File.mtime(ts_file) < last_modification elsif watch_changes true elsif !File.exist?(ts_file) true else false end if have_changes || !File.exist?(compiled_js_file) || !File.exist?(compiled_css_file) if have_changes || (!File.exist?(ts_file) && watch_changes) self.class.reset_dist end compile end end
def compiled_css_file
def compiled_css_file @compiled_file + '.css' end
def compiled_js_file
def compiled_js_file @compiled_file + '.js' end
def initialize(filename)
def initialize(filename) @svelte_file = SvelteOnRails::Configuration.instance.components_folder_full + filename @svelte_filename = filename @compiled_file = "#{SvelteOnRails::Configuration.instance.dist_folder}/#{(filename.match(/\.svelte$/) ? filename[0..-8] : filename)}" end
def render_compiled_file(props = {})
def render_compiled_file(props = {}) require 'base64' require 'json' props_enc = Base64.encode64(props.to_json).strip cmd = [ 'node', '/Users/christian/projects-gmbh/gems/svelte-on-rails/svelte-on-rails-gem/lib/svelte_on_rails/render.js', compiled_js_file, props_enc, SvelteOnRails::Configuration.instance.rails_root ].join(' ') stdout, stderr, status = Open3.capture3(cmd, chdir: self.class.gem_app_dir) unless status.to_s.match(/^pid [0-9]+ exit 0$/) raise "Render Svelte Server-side:\n" + stderr end begin res = JSON.parse(stdout) if File.exist?(compiled_css_file) res['css'] = File.read(compiled_css_file) end return res rescue JSON::ParserError => e raise "Render Svelte Server-side: Expected JSON, got: «#{stdout}»" end end