svelte-on-rails 22.5.6 → 23.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/svelte-on-rails.rb +0 -1
- data/lib/svelte_on_rails/active_record_extensions.rb +3 -9
- data/lib/svelte_on_rails/configuration.rb +0 -2
- data/lib/svelte_on_rails/installer/npm.rb +1 -1
- data/lib/svelte_on_rails/lib/view_helper_support.rb +0 -3
- data/lib/svelte_on_rails/ssr_client.rb +82 -37
- data/templates/config_base/config/svelte_on_rails.yml +0 -18
- metadata +1 -2
- data/lib/svelte_on_rails/lib/to_svelte_translations.rb +0 -97
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3940962e167ef99d7a0d4c96d0d55efb4beed16497825830840c668bfa06b46d
|
|
4
|
+
data.tar.gz: 26a6cc1b3e604da9877eea62a2f8a9fd48dcba6dffcde1b988f6d65fe6b8261c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fe829b60ff8c1fb774a7c426b10f2b4736016a4e0b022daf47d76751a6f0ec27e4f46cac9960315c0c57bf3f1e35236b210184bd4bd1dea9193d314b10b04c73
|
|
7
|
+
data.tar.gz: 97e54fe0b02be5a342861e47f52d5eacb9442060af0e98b3ae152c52d3f66f708e7b7874aae4467bd7672c4f19f1ed39841bfb6c847375241bd5e1e03a4fa56f
|
data/lib/svelte-on-rails.rb
CHANGED
|
@@ -16,7 +16,6 @@ require "svelte_on_rails/lib/view_helper_support"
|
|
|
16
16
|
require "svelte_on_rails/lib/to_svelte_schema"
|
|
17
17
|
require "svelte_on_rails/lib/to_svelte_values"
|
|
18
18
|
require "svelte_on_rails/lib/to_svelte_support"
|
|
19
|
-
require "svelte_on_rails/lib/to_svelte_translations"
|
|
20
19
|
require "svelte_on_rails/lib/cache_warmer"
|
|
21
20
|
require "svelte_on_rails/lib/boot_context"
|
|
22
21
|
|
|
@@ -13,13 +13,11 @@ module SvelteOnRails
|
|
|
13
13
|
|
|
14
14
|
tsv = SvelteOnRails::Lib::ToSvelteValues
|
|
15
15
|
tsl = SvelteOnRails::Lib::ToSvelteSchema.instance
|
|
16
|
-
tnl = SvelteOnRails::Lib::ToSvelteTranslations.instance
|
|
17
16
|
|
|
18
17
|
values = tsv.extract_values(self, attributes, associations)
|
|
19
18
|
models, schema = tsl.extract_schema(self.class, attributes, associations, cache_key)
|
|
20
|
-
translations = tnl.all_cached_translations(I18n.locale, :to_svelte_props, models, self.class)
|
|
21
19
|
|
|
22
|
-
values.merge(schema)
|
|
20
|
+
values.merge(schema)
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
end
|
|
@@ -36,12 +34,10 @@ module SvelteOnRails
|
|
|
36
34
|
cache_key = (I18n.locale.to_s + self.name + attributes.to_s + associations.to_s).hash
|
|
37
35
|
|
|
38
36
|
tsl = SvelteOnRails::Lib::ToSvelteSchema.instance
|
|
39
|
-
tnl = SvelteOnRails::Lib::ToSvelteTranslations.instance
|
|
40
37
|
|
|
41
38
|
models, schema = tsl.extract_schema(self, attributes, associations, cache_key)
|
|
42
|
-
translations = tnl.all_cached_translations(I18n.locale, :to_svelte_props, models, self)
|
|
43
39
|
|
|
44
|
-
schema
|
|
40
|
+
schema
|
|
45
41
|
|
|
46
42
|
end
|
|
47
43
|
end
|
|
@@ -58,14 +54,12 @@ module SvelteOnRails
|
|
|
58
54
|
|
|
59
55
|
cl = SvelteOnRails::Lib::ToSvelteValues
|
|
60
56
|
tsl = SvelteOnRails::Lib::ToSvelteSchema.instance
|
|
61
|
-
tnl = SvelteOnRails::Lib::ToSvelteTranslations.instance
|
|
62
57
|
|
|
63
58
|
data = cl.extract_values(self, attributes, associations)
|
|
64
59
|
|
|
65
60
|
models, schema = tsl.extract_schema(self.klass, attributes, associations, cache_key)
|
|
66
|
-
translations = tnl.all_cached_translations(I18n.locale, :to_svelte_props, models, self.klass)
|
|
67
61
|
|
|
68
|
-
{ 'data' => data }.merge(schema)
|
|
62
|
+
{ 'data' => data }.merge(schema)
|
|
69
63
|
end
|
|
70
64
|
end
|
|
71
65
|
|
|
@@ -223,8 +223,6 @@ module SvelteOnRails
|
|
|
223
223
|
extra_component_paths: { optional: :array },
|
|
224
224
|
skip_ssr_header: { optional: :string },
|
|
225
225
|
cache_warmer: { optional: :boolean },
|
|
226
|
-
to_svelte_props: { optional: :hash },
|
|
227
|
-
global_props: { optional: :hash },
|
|
228
226
|
|
|
229
227
|
ssr: { options_required: [:auto, true, false] },
|
|
230
228
|
watch_changes: { options_optional: [true, false] },
|
|
@@ -140,9 +140,6 @@ module SvelteOnRails
|
|
|
140
140
|
}
|
|
141
141
|
)
|
|
142
142
|
|
|
143
|
-
tnl = SvelteOnRails::Lib::ToSvelteTranslations.instance
|
|
144
|
-
_tnl = tnl.cached_translations(I18n.locale, :to_svelte_props, nil)
|
|
145
|
-
svelte_props[:_translations] = _tnl if _tnl
|
|
146
143
|
svelte_props[:test] = 'hello'
|
|
147
144
|
|
|
148
145
|
ht_opts[:class] = "svelte-component #{ht_opts[:class]}"
|
|
@@ -13,8 +13,6 @@ module SvelteOnRails
|
|
|
13
13
|
:node_bin,
|
|
14
14
|
:initialized_by
|
|
15
15
|
|
|
16
|
-
# methods
|
|
17
|
-
|
|
18
16
|
def self.instance(caller: nil)
|
|
19
17
|
|
|
20
18
|
@instance ||= new(caller: caller)
|
|
@@ -54,6 +52,7 @@ module SvelteOnRails
|
|
|
54
52
|
at_exit do
|
|
55
53
|
shutdown(caller: 'at_exit')
|
|
56
54
|
File.delete(restart_marker_file) if File.exist?(restart_marker_file)
|
|
55
|
+
FileUtils.remove(flock_file) if File.exist?(flock_file)
|
|
57
56
|
end
|
|
58
57
|
else
|
|
59
58
|
SvelteOnRails::Lib::Utils.ssr_server_log("SSR Server NOT used => @ssr_server #{@ssr_server}")
|
|
@@ -184,46 +183,59 @@ module SvelteOnRails
|
|
|
184
183
|
restart_after_failure: false
|
|
185
184
|
)
|
|
186
185
|
|
|
187
|
-
|
|
186
|
+
# when multiple workers defined: ensure only the first start the node instance
|
|
187
|
+
if ssr_socket_exists?
|
|
188
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("SOR start_node_server! => Exit because socket-file already exists", ssr_logfile_only: !restart_after_failure)
|
|
189
|
+
return
|
|
190
|
+
end
|
|
191
|
+
with_ssr_client_flock do
|
|
192
|
+
if ssr_socket_exists?
|
|
193
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("SOR start_node_server! => Exit because concurrency process detected by flock-file", ssr_logfile_only: !restart_after_failure)
|
|
194
|
+
return
|
|
195
|
+
end
|
|
188
196
|
|
|
189
|
-
|
|
197
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("SOR start_node_server! called", ssr_logfile_only: !restart_after_failure)
|
|
198
|
+
|
|
199
|
+
start = Time.now
|
|
200
|
+
|
|
201
|
+
@node_server_output = {}
|
|
202
|
+
Thread.new do
|
|
203
|
+
stdout, stderr, status = Open3.capture3(
|
|
204
|
+
start_node_server_command(started_by),
|
|
205
|
+
chdir: Rails.root
|
|
206
|
+
)
|
|
207
|
+
@node_server_output = {
|
|
208
|
+
stdout: stdout,
|
|
209
|
+
stderr: stderr,
|
|
210
|
+
status: status
|
|
211
|
+
}
|
|
212
|
+
end
|
|
213
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Node Version: #{Configuration.instance.node_version_test}, package version: #{Configuration.instance.npm_package_version_test}")
|
|
214
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Start running Svelte-SSR-Server... (#{started_by})")
|
|
190
215
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
)
|
|
197
|
-
@node_server_output = {
|
|
198
|
-
stdout: stdout,
|
|
199
|
-
stderr: stderr,
|
|
200
|
-
status: status
|
|
201
|
-
}
|
|
202
|
-
end
|
|
203
|
-
SvelteOnRails::Lib::Utils.ssr_server_log("Node Version: #{Configuration.instance.node_version_test}, package version: #{Configuration.instance.npm_package_version_test}")
|
|
204
|
-
SvelteOnRails::Lib::Utils.ssr_server_log("Start running Svelte-SSR-Server... (#{started_by})")
|
|
216
|
+
until node_server_pid do
|
|
217
|
+
sleep 0.12
|
|
218
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Waiting for node server process-id")
|
|
219
|
+
start_server_timeout!(start)
|
|
220
|
+
end
|
|
205
221
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
222
|
+
until File.socket?(socket_path) do
|
|
223
|
+
sleep 0.1
|
|
224
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Waiting for socket to be created")
|
|
225
|
+
start_server_timeout!(start)
|
|
226
|
+
end
|
|
227
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Socket created: #{socket_path}")
|
|
211
228
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
229
|
+
until ping? do
|
|
230
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Waiting for successful server-response")
|
|
231
|
+
start_server_timeout!(start)
|
|
232
|
+
sleep 0.1
|
|
233
|
+
end
|
|
234
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Server responded successfully")
|
|
218
235
|
|
|
219
|
-
|
|
220
|
-
SvelteOnRails::Lib::Utils.ssr_server_log("Waiting for successful server-response")
|
|
221
|
-
start_server_timeout!(start)
|
|
222
|
-
sleep 0.1
|
|
236
|
+
cleanup_leftover_processes
|
|
223
237
|
end
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
cleanup_leftover_processes
|
|
238
|
+
cleanup_flock_file_later
|
|
227
239
|
end
|
|
228
240
|
|
|
229
241
|
def restart_my_server(tag = nil)
|
|
@@ -314,6 +326,37 @@ module SvelteOnRails
|
|
|
314
326
|
|
|
315
327
|
private
|
|
316
328
|
|
|
329
|
+
def ssr_socket_exists?
|
|
330
|
+
File.socket?(socket_path)
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def with_ssr_client_flock
|
|
334
|
+
File.open(flock_file, File::RDWR | File::CREAT, 0o644) do |file|
|
|
335
|
+
file.flock(File::LOCK_EX)
|
|
336
|
+
yield
|
|
337
|
+
ensure
|
|
338
|
+
file.flock(File::LOCK_UN) if file
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def flock_file
|
|
343
|
+
File.join(File.dirname(socket_path), "ssr-client-flock")
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def cleanup_flock_file_later
|
|
347
|
+
path = flock_file
|
|
348
|
+
|
|
349
|
+
Thread.new do
|
|
350
|
+
sleep 3
|
|
351
|
+
FileUtils.rm_f(path)
|
|
352
|
+
rescue => e
|
|
353
|
+
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
354
|
+
"Could not remove flock file #{path}: #{e.class}: #{e.message}",
|
|
355
|
+
ssr_logfile_only: true
|
|
356
|
+
)
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
|
|
317
360
|
def restart_marker_file
|
|
318
361
|
Rails.root.join("tmp", "ssr_server_last_restart")
|
|
319
362
|
end
|
|
@@ -464,6 +507,8 @@ module SvelteOnRails
|
|
|
464
507
|
|
|
465
508
|
# enable communication by rake task for admin purposes
|
|
466
509
|
def self.install_control_listener
|
|
510
|
+
return if @installed
|
|
511
|
+
@installed = true
|
|
467
512
|
|
|
468
513
|
path = socket_path.to_s
|
|
469
514
|
FileUtils.mkdir_p(File.dirname(path))
|
|
@@ -476,7 +521,7 @@ module SvelteOnRails
|
|
|
476
521
|
loop do
|
|
477
522
|
client = server.accept
|
|
478
523
|
begin
|
|
479
|
-
request = client.gets&.strip
|
|
524
|
+
request = client.gets&.strip&.to_sym
|
|
480
525
|
client_instance = SsrClient.instance(caller: 'rake task (manual)')
|
|
481
526
|
|
|
482
527
|
response = case request
|
|
@@ -69,24 +69,6 @@ turbo_stream:
|
|
|
69
69
|
# html-id of any element that must exist for being able to receive actions (turbo streams can only work this way)
|
|
70
70
|
channel: 'public'
|
|
71
71
|
|
|
72
|
-
to_svelte_props:
|
|
73
|
-
translations:
|
|
74
|
-
helpers:
|
|
75
|
-
submit:
|
|
76
|
-
- create
|
|
77
|
-
- update
|
|
78
|
-
- submit
|
|
79
|
-
# Theese keys must match with the keys in config/locales.
|
|
80
|
-
# If set, the key _translations will be added by the to_svelte helper to the props
|
|
81
|
-
|
|
82
|
-
global_props:
|
|
83
|
-
translations:
|
|
84
|
-
any:
|
|
85
|
-
- translations
|
|
86
|
-
# Theese keys must match with the keys in config/locales.
|
|
87
|
-
# If set, the key _translations will be added by the svelte view helper to the props of any component
|
|
88
|
-
|
|
89
|
-
|
|
90
72
|
action_cable:
|
|
91
73
|
# if you want to use it
|
|
92
74
|
channel: "svelte_on_rails_channel"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: svelte-on-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 23.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Christian Sedlmair
|
|
@@ -92,7 +92,6 @@ files:
|
|
|
92
92
|
- lib/svelte_on_rails/lib/metrics.rb
|
|
93
93
|
- lib/svelte_on_rails/lib/to_svelte_schema.rb
|
|
94
94
|
- lib/svelte_on_rails/lib/to_svelte_support.rb
|
|
95
|
-
- lib/svelte_on_rails/lib/to_svelte_translations.rb
|
|
96
95
|
- lib/svelte_on_rails/lib/to_svelte_values.rb
|
|
97
96
|
- lib/svelte_on_rails/lib/utils.rb
|
|
98
97
|
- lib/svelte_on_rails/lib/view_helper_support.rb
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
module SvelteOnRails
|
|
2
|
-
module Lib
|
|
3
|
-
class ToSvelteTranslations
|
|
4
|
-
def self.instance
|
|
5
|
-
@instance ||= new
|
|
6
|
-
if SvelteOnRails::Configuration.instance.watch_changes?
|
|
7
|
-
@cached_translations = {}
|
|
8
|
-
@all_cached_translations = {}
|
|
9
|
-
end
|
|
10
|
-
@instance
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def initialize
|
|
14
|
-
@config = SvelteOnRails::Configuration.instance
|
|
15
|
-
@cached_translations = {}
|
|
16
|
-
@all_cached_translations = {}
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def all_cached_translations(language_key, config_key, models, own_model)
|
|
20
|
-
k = "#{language_key}-#{config_key}-#{models}".hash
|
|
21
|
-
@all_cached_translations[k] ||=
|
|
22
|
-
models.each_with_object({}) do |model, memo|
|
|
23
|
-
k = own_model == model ? "_translations" : "_#{model.name.underscore}_translations"
|
|
24
|
-
memo[k] = cached_translations(language_key, config_key, model)
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def cached_translations(language_key, config_key, model)
|
|
29
|
-
k = "#{language_key}-#{config_key}-#{model.class.name}".hash
|
|
30
|
-
@cached_translations[k] ||= begin
|
|
31
|
-
config = @config.configs[config_key]
|
|
32
|
-
if config
|
|
33
|
-
source = config[:translations]
|
|
34
|
-
if source
|
|
35
|
-
calc(source, language_key, model)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
private
|
|
42
|
-
|
|
43
|
-
def calc(source, lang, model)
|
|
44
|
-
# Transform model for interpolation (human name)
|
|
45
|
-
interpolation_kwargs = model && {
|
|
46
|
-
model: model.model_name.human(locale: lang)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
translate_at = lambda do |full_path|
|
|
50
|
-
i18n_key = full_path.join('.')
|
|
51
|
-
if interpolation_kwargs
|
|
52
|
-
I18n.t(i18n_key, **interpolation_kwargs, locale: lang)
|
|
53
|
-
else
|
|
54
|
-
I18n.t(i18n_key, locale: lang)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
set_nested = lambda do |memo, segments, value|
|
|
59
|
-
current = memo
|
|
60
|
-
segments[0..-2].each do |segment|
|
|
61
|
-
current[segment] ||= {}
|
|
62
|
-
current = current[segment]
|
|
63
|
-
end
|
|
64
|
-
current[segments.last] = value
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
walk = lambda do |node, path|
|
|
68
|
-
case node
|
|
69
|
-
when Hash
|
|
70
|
-
node.each_with_object({}) do |(key, value), memo|
|
|
71
|
-
key_str = key.to_s
|
|
72
|
-
memo[key_str] = walk.call(value, path + [key_str])
|
|
73
|
-
end
|
|
74
|
-
when Array
|
|
75
|
-
node.each_with_object({}) do |entry, memo|
|
|
76
|
-
unless entry.is_a?(String) || entry.is_a?(Symbol)
|
|
77
|
-
raise ArgumentError, "Invalid translation selector at #{path.join('.')}: array entries must be String/Symbol keys"
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
segments = entry.to_s.split('.').reject(&:empty?)
|
|
81
|
-
if segments.empty?
|
|
82
|
-
raise ArgumentError, "Invalid translation selector at #{path.join('.')}: empty key path"
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
translated = translate_at.call(path + segments)
|
|
86
|
-
set_nested.call(memo, segments, translated)
|
|
87
|
-
end
|
|
88
|
-
else
|
|
89
|
-
raise ArgumentError, "Invalid translations config at #{path.join('.')}: only Hash and Array are allowed (old value-based syntax is not supported)"
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
walk.call(source, [])
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
end
|