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
60
61
62
63
# 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]
    if store['expires_in'].is_a?(String)
      @configs[:redis_cache_store]['expires_in'] = parse_duration(
        store['expires_in']
      )
    end
    @redis_namespace = store[:namespace]
  end
  @redis_namespace ||= "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
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



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

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

#build_status_fileObject



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

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

#components_rootObject



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

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



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/svelte_on_rails/configuration.rb', line 84

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



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

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

#initialize_request_metrics(request_uuid) ⇒ Object



158
159
160
161
162
163
164
165
166
# File 'lib/svelte_on_rails/configuration.rb', line 158

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



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

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

#node_bin_pathObject



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

def node_bin_path
  @node_bin_path ||= resolve_node_bin_path
end

#node_version_testObject



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

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

#npm_package_version_testObject



172
173
174
175
176
# File 'lib/svelte_on_rails/configuration.rb', line 172

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

#rails_root(root_url = nil) ⇒ Object



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

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

#redis_cache_storeObject



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

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

#redis_instanceObject



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

def redis_instance
  @redis_instance
end

#set_config_defaultsObject



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

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



152
153
154
155
156
# File 'lib/svelte_on_rails/configuration.rb', line 152

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



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/svelte_on_rails/configuration.rb', line 106

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)


80
81
82
# File 'lib/svelte_on_rails/configuration.rb', line 80

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