Class: SvelteOnRails::RenderServerSide

Inherits:
Object
  • Object
show all
Defined in:
lib/svelte_on_rails/render_server_side.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filename) ⇒ RenderServerSide

Returns a new instance of RenderServerSide.



6
7
8
9
10
11
12
13
14
# File 'lib/svelte_on_rails/render_server_side.rb', line 6

def initialize(filename)

  @svelte_file = SvelteOnRails::Configuration.instance.components_folder + filename
  @svelte_filename = filename
  @compiled_file = "#{SvelteOnRails::Configuration.instance.dist_folder}/#{(filename.match(/\.svelte$/) ? filename[0..-8] : filename)}"

  raise "File not found: #{@svelte_file}" unless File.exist?(@svelte_file)

end

Class Method Details

.gem_app_dirObject



113
114
115
# File 'lib/svelte_on_rails/render_server_side.rb', line 113

def self.gem_app_dir
  File.expand_path('../svelte_on_rails', __dir__) + '/'
end

.reset_distObject



117
118
119
120
121
122
123
# File 'lib/svelte_on_rails/render_server_side.rb', line 117

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

Instance Method Details

#compileObject



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/svelte_on_rails/render_server_side.rb', line 89

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

#compile_if_changesObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/svelte_on_rails/render_server_side.rb', line 16

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

#compiled_css_fileObject



85
86
87
# File 'lib/svelte_on_rails/render_server_side.rb', line 85

def compiled_css_file
  @compiled_file + '.css'
end

#compiled_js_fileObject



81
82
83
# File 'lib/svelte_on_rails/render_server_side.rb', line 81

def compiled_js_file
  @compiled_file + '.js'
end

#render_compiled_file(props = {}) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/svelte_on_rails/render_server_side.rb', line 53

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