Class: SvelteOnRails::Configuration

Inherits:
Object
  • Object
show all
Includes:
Lib::WatchAssetChanges
Defined in:
lib/svelte_on_rails/configuration.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Lib::WatchAssetChanges

#build_status, #component_mtime_changed?, #fetch_source_files, #fingerprint, #manifest, #vite_build

Constructor Details

#initializeConfiguration

Returns a new instance of Configuration.



15
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
52
53
54
55
56
57
58
59
# File 'lib/svelte_on_rails/configuration.rb', line 15

def initialize

  @boot_key = SecureRandom.hex(3) # currently not used, more for debugging purposes
  @configs = redis_cache_store_configs
  set_config_defaults

  @component_paths_cache = {}
  @request_metrics = {}

  return unless defined?(Rails.root)

  config_path = Rails.root.join("config", "svelte_on_rails.yml")
  return unless File.exist?(config_path)

  environments = Dir[Rails.root.join('config', 'environments', '*.rb')]
                   .map { |file| File.basename(file, '.rb') }

  configs_base = YAML.load_file(config_path).deep_symbolize_keys

  # merge envrionment specific configs
  current_env = Rails.env.to_sym
  env_configs = configs_base.dup[current_env]
  merged_configs = configs_base.deep_merge(env_configs || {})

  # cleanup
  polished_configs = merged_configs.reject { |k, _| environments.include?(k.to_s) }
  @configs = @configs.merge(polished_configs)

  # DEFAULTS

  if @configs[:redis_cache_store]
    store = @configs[:redis_cache_store]
    @redis_namespace = store[:namespace]
  end
  @redis_namespace ||= "#{app_name}:svelte-on-rails:#{Rails.env rescue 'no-env'}"
  @configs[:skip_ssr_header] ||= 'X-Turbo-Request-ID'
  if defined? Redis
    @redis_instance = Redis.new(url: redis_cache_store[:url])
  end

  validate_serialized_configs
  custom_config_validations
  validate_npm_packages
  process_configs
end

Instance Attribute Details

#component_paths_cacheObject

Returns the value of attribute component_paths_cache.



13
14
15
# File 'lib/svelte_on_rails/configuration.rb', line 13

def component_paths_cache
  @component_paths_cache
end

#configsObject

Returns the value of attribute configs.



13
14
15
# File 'lib/svelte_on_rails/configuration.rb', line 13

def configs
  @configs
end

#redis_namespaceObject

Returns the value of attribute redis_namespace.



13
14
15
# File 'lib/svelte_on_rails/configuration.rb', line 13

def redis_namespace
  @redis_namespace
end

#request_metricsObject

Returns the value of attribute request_metrics.



13
14
15
# File 'lib/svelte_on_rails/configuration.rb', line 13

def request_metrics
  @request_metrics
end

Class Method Details

.instanceObject



9
10
11
# File 'lib/svelte_on_rails/configuration.rb', line 9

def self.instance
  @instance ||= new
end

Instance Method Details

#assets_folder_pathObject



128
129
130
# File 'lib/svelte_on_rails/configuration.rb', line 128

def assets_folder_path
  rails_root.join('public', 'svelte-ssr')
end

#build_status_fileObject



136
137
138
# File 'lib/svelte_on_rails/configuration.rb', line 136

def build_status_file
  assets_folder_path.join('.vite', 'build-status.json')
end

#components_rootObject



124
125
126
# File 'lib/svelte_on_rails/configuration.rb', line 124

def components_root
  File.join(@configs[:vite_source_dir], @configs[:components_subdir])
end

#debug_log(debug, component_basename, subject, show_component_name: true, &block) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/svelte_on_rails/configuration.rb', line 80

def debug_log(debug, component_basename, subject, show_component_name: true, &block)
  msg = if show_component_name
          "  [SOR] #{component_basename}.svelte #{subject}"
        else
          "  [SOR] #{subject}"
        end
  if !block_given?
    Rails.logger.debug(msg)
  else
    if debug || @configs[:debug]
      r = nil
      sec = Benchmark.realtime do
        r = block.call
      end
      Rails.logger.debug("#{msg} (#{(sec * 1000.0).round(2)}ms)")
      r
    else
      block.call
    end
  end
end

#dev_module_map_pathObject



140
141
142
# File 'lib/svelte_on_rails/configuration.rb', line 140

def dev_module_map_path
  assets_folder_path.join('.vite', 'dev-module-map.json')
end

#initialize_request_metrics(request_uuid) ⇒ Object



154
155
156
157
158
159
160
161
162
# File 'lib/svelte_on_rails/configuration.rb', line 154

def initialize_request_metrics(request_uuid)
  return if request_uuid == @request_metrics[:request_uuid]

  @request_metrics = {
    request_uuid: request_uuid,
    total_time: 0.0
  }

end

#manifest_json_pathObject



132
133
134
# File 'lib/svelte_on_rails/configuration.rb', line 132

def manifest_json_path
  assets_folder_path.join('.vite', 'manifest.json')
end

#node_bin_pathObject



144
145
146
# File 'lib/svelte_on_rails/configuration.rb', line 144

def node_bin_path
  @node_bin_path ||= resolve_node_bin_path
end

#node_version_testObject



164
165
166
# File 'lib/svelte_on_rails/configuration.rb', line 164

def node_version_test
  `#{node_bin_path} --version`.chomp
end

#npm_package_version_testObject



168
169
170
171
172
# File 'lib/svelte_on_rails/configuration.rb', line 168

def npm_package_version_test
  JSON.parse(File.read(Rails.root.join('node_modules/@csedl/svelte-on-rails/package.json')))['version']
rescue
  nil
end

#process_configsObject



174
175
176
177
178
179
# File 'lib/svelte_on_rails/configuration.rb', line 174

def process_configs
  ex = @configs[:cache_expires_in]
  if ex
    @configs[:cache_expires_in] = ex.split('.').first.to_i.send(ex.split('.').last)
  end
end

#rails_root(root_url = nil) ⇒ Object



120
121
122
# File 'lib/svelte_on_rails/configuration.rb', line 120

def rails_root(root_url = nil)
  root_url || Rails.root
end

#redis_cache_storeObject



68
69
70
# File 'lib/svelte_on_rails/configuration.rb', line 68

def redis_cache_store
  (@configs[:redis_cache_store] || {}).transform_keys(&:to_sym)
end

#redis_instanceObject



72
73
74
# File 'lib/svelte_on_rails/configuration.rb', line 72

def redis_instance
  @redis_instance
end

#set_config_defaultsObject



61
62
63
64
65
66
# File 'lib/svelte_on_rails/configuration.rb', line 61

def set_config_defaults
  @configs[:ssr_server] = true
  @configs[:ssr_server_workers] = 1
  @configs[:ssr_fallback_renderer] = false
  @configs[:ssr_error_tag] = true
end

#ssr_server_bin_pathObject



148
149
150
151
152
# File 'lib/svelte_on_rails/configuration.rb', line 148

def ssr_server_bin_path
  wk = @configs[:ssr_server_workers]
  str = wk > 1 ? 'cluster' : 'server'
  Rails.root.join(Pathname("node_modules/@csedl/svelte-on-rails/bin/svelte-ssr-#{str}.js"))
end

#to_svelte_benchmark_log(subject, &block) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/svelte_on_rails/configuration.rb', line 102

def to_svelte_benchmark_log(subject, &block)
  msg = "  [SOR] to_svelte #{subject}"
  if !block_given?
    Rails.logger.debug(msg)
  else
    if @configs[:debug]
      r = nil
      sec = Benchmark.realtime do
        r = block.call
      end
      Rails.logger.debug("#{msg} (#{(sec * 1000.0).round(2)}ms)")
      r
    else
      block.call
    end
  end
end

#watch_changes?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/svelte_on_rails/configuration.rb', line 76

def watch_changes?
  @configs[:watch_changes] == true
end