theme-check 1.6.2 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +37 -0
- data/data/shopify_liquid/filters.yml +1 -0
- data/data/shopify_liquid/tags.yml +9 -9
- data/docs/checks/TEMPLATE.md.erb +24 -19
- data/exe/theme-check-language-server +0 -4
- data/lib/theme_check/analyzer.rb +29 -5
- data/lib/theme_check/checks/matching_schema_translations.rb +12 -5
- data/lib/theme_check/checks/required_layout_theme_object.rb +9 -4
- data/lib/theme_check/checks/translation_key_exists.rb +1 -13
- data/lib/theme_check/checks/unused_assign.rb +3 -2
- data/lib/theme_check/checks/unused_snippet.rb +1 -1
- data/lib/theme_check/corrector.rb +40 -3
- data/lib/theme_check/exceptions.rb +1 -0
- data/lib/theme_check/file_system_storage.rb +4 -0
- data/lib/theme_check/language_server/bridge.rb +142 -0
- data/lib/theme_check/language_server/channel.rb +69 -0
- data/lib/theme_check/language_server/completion_providers/tag_completion_provider.rb +3 -1
- data/lib/theme_check/language_server/diagnostics_engine.rb +125 -0
- data/lib/theme_check/language_server/handler.rb +24 -118
- data/lib/theme_check/language_server/io_messenger.rb +104 -0
- data/lib/theme_check/language_server/messenger.rb +27 -0
- data/lib/theme_check/language_server/protocol.rb +4 -0
- data/lib/theme_check/language_server/server.rb +111 -103
- data/lib/theme_check/language_server.rb +6 -1
- data/lib/theme_check/liquid_node.rb +33 -0
- data/lib/theme_check/locale_diff.rb +36 -10
- data/lib/theme_check/position.rb +4 -4
- data/lib/theme_check/shopify_liquid/system_translations.rb +35 -0
- data/lib/theme_check/shopify_liquid/tag.rb +19 -1
- data/lib/theme_check/shopify_liquid.rb +1 -0
- data/lib/theme_check/tags.rb +0 -1
- data/lib/theme_check/theme_file_rewriter.rb +13 -0
- data/lib/theme_check/version.rb +1 -1
- data/lib/theme_check.rb +4 -0
- metadata +8 -2
@@ -13,141 +13,149 @@ module ThemeCheck
|
|
13
13
|
attr_reader :should_raise_errors
|
14
14
|
|
15
15
|
def initialize(
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
should_raise_errors: false
|
16
|
+
messenger:,
|
17
|
+
should_raise_errors: false,
|
18
|
+
number_of_threads: 2
|
20
19
|
)
|
21
|
-
|
20
|
+
# This is what does the IO
|
21
|
+
@messenger = messenger
|
22
22
|
|
23
|
-
|
24
|
-
@
|
25
|
-
@out = out_stream
|
26
|
-
@err = err_stream
|
23
|
+
# This is what you use to communicate with the language client
|
24
|
+
@bridge = Bridge.new(@messenger)
|
27
25
|
|
28
|
-
#
|
29
|
-
|
30
|
-
# Ruby on Windows turns \n into \r\n. Which means that \r\n
|
31
|
-
# gets turned into \r\r\n. Which means that the protocol
|
32
|
-
# breaks on windows unless we turn STDOUT into binary mode.
|
33
|
-
#
|
34
|
-
# Hours wasted: 9.
|
35
|
-
@out.binmode
|
26
|
+
# The handler handles messages from the language client
|
27
|
+
@handler = Handler.new(@bridge)
|
36
28
|
|
37
|
-
|
38
|
-
@
|
29
|
+
# The queue holds the JSON RPC messages
|
30
|
+
@queue = Queue.new
|
39
31
|
|
40
|
-
|
41
|
-
|
32
|
+
# The JSON RPC thread pushes messages onto the queue
|
33
|
+
@json_rpc_thread = nil
|
42
34
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
# support ctrl+c and stuff
|
48
|
-
rescue SignalException, DoneStreaming
|
49
|
-
cleanup
|
50
|
-
return 0
|
51
|
-
|
52
|
-
rescue Exception => e # rubocop:disable Lint/RescueException
|
53
|
-
raise e if should_raise_errors
|
54
|
-
log(e)
|
55
|
-
log(e.backtrace)
|
56
|
-
return 1
|
57
|
-
end
|
58
|
-
end
|
35
|
+
# The handler threads read messages from the queue
|
36
|
+
@number_of_threads = number_of_threads
|
37
|
+
@handlers = []
|
59
38
|
|
60
|
-
|
61
|
-
|
62
|
-
log(JSON.pretty_generate(response)) if $DEBUG
|
39
|
+
# The error queue holds blocks the main thread. When filled, we exit the program.
|
40
|
+
@error = SizedQueue.new(number_of_threads)
|
63
41
|
|
64
|
-
@
|
65
|
-
@out.write("\r\n")
|
66
|
-
@out.write(response_body)
|
67
|
-
@out.flush
|
42
|
+
@should_raise_errors = should_raise_errors
|
68
43
|
end
|
69
44
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
45
|
+
def listen
|
46
|
+
start_handler_threads
|
47
|
+
start_json_rpc_thread
|
48
|
+
status_code = status_code_from_error(@error.pop)
|
49
|
+
cleanup(status_code)
|
50
|
+
rescue SignalException
|
51
|
+
0
|
73
52
|
end
|
74
53
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
54
|
+
def start_json_rpc_thread
|
55
|
+
@json_rpc_thread = Thread.new do
|
56
|
+
loop do
|
57
|
+
message = @bridge.read_message
|
58
|
+
if message['method'] == 'initialize'
|
59
|
+
handle_message(message)
|
60
|
+
elsif message.key?('result')
|
61
|
+
# Responses are handled on the main thread to prevent
|
62
|
+
# a potential deadlock caused by all handlers waiting
|
63
|
+
# for a responses.
|
64
|
+
handle_response(message)
|
65
|
+
else
|
66
|
+
@queue << message
|
67
|
+
end
|
68
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
69
|
+
break @error << e
|
70
|
+
end
|
71
|
+
end
|
79
72
|
end
|
80
73
|
|
81
|
-
def
|
82
|
-
|
83
|
-
|
84
|
-
|
74
|
+
def start_handler_threads
|
75
|
+
@number_of_threads.times do
|
76
|
+
@handlers << Thread.new do
|
77
|
+
loop do
|
78
|
+
message = @queue.pop
|
79
|
+
break if @queue.closed? && @queue.empty?
|
80
|
+
handle_message(message)
|
81
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
82
|
+
break @error << e
|
83
|
+
end
|
85
84
|
end
|
86
85
|
end
|
87
86
|
end
|
88
87
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
88
|
+
def status_code_from_error(e)
|
89
|
+
raise e
|
90
|
+
|
91
|
+
# support ctrl+c and stuff
|
92
|
+
rescue SignalException, DoneStreaming
|
93
|
+
0
|
94
|
+
|
95
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
96
|
+
raise e if should_raise_errors
|
97
|
+
@bridge.log("#{e.class}: #{e.message}\n#{e.backtrace.join("\n")}")
|
98
|
+
2
|
92
99
|
end
|
93
100
|
|
94
|
-
|
95
|
-
request_body = read_new_content
|
96
|
-
request_json = JSON.parse(request_body)
|
97
|
-
log(JSON.pretty_generate(request_json)) if $DEBUG
|
101
|
+
private
|
98
102
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
method_name
|
103
|
+
def handle_message(message)
|
104
|
+
id = message['id']
|
105
|
+
method_name = message['method']
|
106
|
+
method_name &&= "on_#{to_snake_case(method_name)}"
|
107
|
+
params = message['params']
|
103
108
|
|
104
109
|
if @handler.respond_to?(method_name)
|
105
110
|
@handler.send(method_name, id, params)
|
106
111
|
end
|
107
|
-
end
|
108
112
|
|
109
|
-
|
110
|
-
|
113
|
+
rescue DoneStreaming => e
|
114
|
+
raise e
|
115
|
+
rescue StandardError => e
|
116
|
+
is_request = id
|
117
|
+
raise e unless is_request
|
118
|
+
# Errors obtained in request handlers should be sent
|
119
|
+
# back as internal errors instead of closing the program.
|
120
|
+
@bridge.send_internal_error(id, e)
|
111
121
|
end
|
112
122
|
|
113
|
-
def
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
# gets returning nil means the stream was closed.
|
118
|
-
raise DoneStreaming if initial_line.nil?
|
119
|
-
|
120
|
-
if initial_line.match(/Content-Length: (\d+)/)
|
121
|
-
break
|
122
|
-
end
|
123
|
-
end
|
124
|
-
initial_line
|
123
|
+
def handle_response(message)
|
124
|
+
id = message['id']
|
125
|
+
result = message['result']
|
126
|
+
@bridge.receive_response(id, result)
|
125
127
|
end
|
126
128
|
|
127
|
-
def
|
128
|
-
|
129
|
-
content = ''
|
130
|
-
while content.length < length + 2
|
131
|
-
begin
|
132
|
-
# Why + 2? Because \r\n
|
133
|
-
content += @in.read(length + 2)
|
134
|
-
rescue => e
|
135
|
-
log(e)
|
136
|
-
log(e.backtrace)
|
137
|
-
# We have almost certainly been disconnected from the server
|
138
|
-
cleanup
|
139
|
-
raise DoneStreaming
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
content
|
129
|
+
def to_snake_case(method_name)
|
130
|
+
StringHelpers.underscore(method_name.gsub(/[^\w]/, '_'))
|
144
131
|
end
|
145
132
|
|
146
|
-
def cleanup
|
147
|
-
|
148
|
-
@
|
149
|
-
|
150
|
-
|
133
|
+
def cleanup(status_code)
|
134
|
+
# Stop listenting to RPC calls
|
135
|
+
@messenger.close_input
|
136
|
+
# Wait for rpc loop to close
|
137
|
+
@json_rpc_thread&.join if @json_rpc_thread&.alive?
|
138
|
+
# Close the queue
|
139
|
+
@queue.close unless @queue.closed?
|
140
|
+
# Give 10 seconds for the handlers to wrap up what they were
|
141
|
+
# doing/emptying the queue. 👀 unit tests.
|
142
|
+
@handlers.each { |thread| thread.join(10) if thread.alive? }
|
143
|
+
|
144
|
+
# Hijack the status_code if an error occurred while cleaning up.
|
145
|
+
# 👀 unit tests.
|
146
|
+
until @error.empty?
|
147
|
+
code = status_code_from_error(@error.pop)
|
148
|
+
# Promote the status_code to ERROR if one of the threads
|
149
|
+
# resulted in an error, otherwise leave the status_code as
|
150
|
+
# is. That's because one thread could end successfully in a
|
151
|
+
# DoneStreaming error while the other failed with an
|
152
|
+
# internal error. If we had an internal error, we should
|
153
|
+
# return with a status_code that fits.
|
154
|
+
status_code = code if code > status_code
|
155
|
+
end
|
156
|
+
status_code
|
157
|
+
ensure
|
158
|
+
@messenger.close_output
|
151
159
|
end
|
152
160
|
end
|
153
161
|
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require_relative "language_server/protocol"
|
3
3
|
require_relative "language_server/constants"
|
4
|
+
require_relative "language_server/channel"
|
5
|
+
require_relative "language_server/messenger"
|
6
|
+
require_relative "language_server/io_messenger"
|
7
|
+
require_relative "language_server/bridge"
|
4
8
|
require_relative "language_server/uri_helper"
|
5
9
|
require_relative "language_server/handler"
|
6
10
|
require_relative "language_server/server"
|
@@ -12,6 +16,7 @@ require_relative "language_server/completion_engine"
|
|
12
16
|
require_relative "language_server/document_link_provider"
|
13
17
|
require_relative "language_server/document_link_engine"
|
14
18
|
require_relative "language_server/diagnostics_tracker"
|
19
|
+
require_relative "language_server/diagnostics_engine"
|
15
20
|
|
16
21
|
Dir[__dir__ + "/language_server/completion_providers/*.rb"].each do |file|
|
17
22
|
require file
|
@@ -24,7 +29,7 @@ end
|
|
24
29
|
module ThemeCheck
|
25
30
|
module LanguageServer
|
26
31
|
def self.start
|
27
|
-
Server.new.listen
|
32
|
+
Server.new(messenger: IOMessenger.new).listen
|
28
33
|
end
|
29
34
|
end
|
30
35
|
end
|
@@ -74,6 +74,34 @@ module ThemeCheck
|
|
74
74
|
position.end_index
|
75
75
|
end
|
76
76
|
|
77
|
+
def start_token_index
|
78
|
+
return position.start_index if inside_liquid_tag?
|
79
|
+
position.start_index - (start_token.length + 1)
|
80
|
+
end
|
81
|
+
|
82
|
+
def end_token_index
|
83
|
+
return position.end_index if inside_liquid_tag?
|
84
|
+
position.end_index + end_token.length
|
85
|
+
end
|
86
|
+
|
87
|
+
def render_start_tag
|
88
|
+
"#{start_token} #{@value.raw}#{end_token}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def render_end_tag
|
92
|
+
"#{start_token} #{@value.block_delimiter} #{end_token}"
|
93
|
+
end
|
94
|
+
|
95
|
+
def block_body_start_index
|
96
|
+
return unless block_tag?
|
97
|
+
block_regex.begin(:body)
|
98
|
+
end
|
99
|
+
|
100
|
+
def block_body_end_index
|
101
|
+
return unless block_tag?
|
102
|
+
block_regex.end(:body)
|
103
|
+
end
|
104
|
+
|
77
105
|
# Literals are hard-coded values in the liquid file.
|
78
106
|
def literal?
|
79
107
|
@value.is_a?(String) || @value.is_a?(Integer)
|
@@ -184,6 +212,11 @@ module ThemeCheck
|
|
184
212
|
|
185
213
|
private
|
186
214
|
|
215
|
+
def block_regex
|
216
|
+
return unless block_tag?
|
217
|
+
/(?<start_token>#{render_start_tag})(?<body>.*)(?<end_token>#{render_end_tag})/m.match(source)
|
218
|
+
end
|
219
|
+
|
187
220
|
def position
|
188
221
|
@position ||= Position.new(
|
189
222
|
markup,
|
@@ -14,24 +14,43 @@ module ThemeCheck
|
|
14
14
|
visit_object(@default, @other, [])
|
15
15
|
end
|
16
16
|
|
17
|
-
def add_as_offenses(check, key_prefix: [], node: nil, theme_file: nil)
|
17
|
+
def add_as_offenses(check, key_prefix: [], node: nil, theme_file: nil, schema: {})
|
18
18
|
if extra_keys.any?
|
19
|
-
|
20
|
-
key_prefix: key_prefix, node: node, theme_file: theme_file)
|
19
|
+
remove_extra_keys_offense(check, "Extra translation keys", extra_keys,
|
20
|
+
key_prefix: key_prefix, node: node, theme_file: theme_file, schema: schema)
|
21
21
|
end
|
22
22
|
|
23
23
|
if missing_keys.any?
|
24
|
-
|
25
|
-
key_prefix: key_prefix, node: node, theme_file: theme_file)
|
24
|
+
add_missing_keys_offense(check, "Missing translation keys", missing_keys,
|
25
|
+
key_prefix: key_prefix, node: node, theme_file: theme_file, schema: schema)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
-
def
|
32
|
-
message = "#{cause}: #{format_keys(key_prefix,
|
31
|
+
def remove_extra_keys_offense(check, cause, extra_keys, key_prefix:, node: nil, theme_file: nil, schema: {})
|
32
|
+
message = "#{cause}: #{format_keys(key_prefix, extra_keys)}"
|
33
33
|
if node
|
34
|
-
check.add_offense(message, node: node)
|
34
|
+
check.add_offense(message, node: node) do |corrector|
|
35
|
+
extra_keys.each do |k|
|
36
|
+
corrector.remove_key(schema, key_prefix + k)
|
37
|
+
end
|
38
|
+
corrector.replace_block_body(node, schema)
|
39
|
+
end
|
40
|
+
else
|
41
|
+
check.add_offense(message, theme_file: theme_file)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_missing_keys_offense(check, cause, missing_keys, key_prefix:, node: nil, theme_file: nil, schema: {})
|
46
|
+
message = "#{cause}: #{format_keys(key_prefix, missing_keys)}"
|
47
|
+
if node
|
48
|
+
check.add_offense(message, node: node) do |corrector|
|
49
|
+
missing_keys.each do |k|
|
50
|
+
corrector.add_key(schema, key_prefix + k, "TODO")
|
51
|
+
end
|
52
|
+
corrector.replace_block_body(node, schema)
|
53
|
+
end
|
35
54
|
else
|
36
55
|
check.add_offense(message, theme_file: theme_file)
|
37
56
|
end
|
@@ -46,10 +65,12 @@ module ThemeCheck
|
|
46
65
|
other = {} unless other.is_a?(Hash)
|
47
66
|
return if pluralization?(default) && pluralization?(other)
|
48
67
|
|
49
|
-
|
68
|
+
shopify_translations = system_translations(path)
|
69
|
+
|
70
|
+
@extra_keys += (other.keys - default.keys - shopify_translations.keys).map { |key| path + [key] }
|
50
71
|
|
51
72
|
default.each do |key, default_value|
|
52
|
-
translated_value = other[key]
|
73
|
+
translated_value = other[key] || shopify_translations[key]
|
53
74
|
new_path = path + [key]
|
54
75
|
|
55
76
|
if translated_value.nil?
|
@@ -65,5 +86,10 @@ module ThemeCheck
|
|
65
86
|
PLURALIZATION_KEYS.include?(key) && !value.is_a?(Hash)
|
66
87
|
end
|
67
88
|
end
|
89
|
+
|
90
|
+
def system_translations(path)
|
91
|
+
return ShopifyLiquid::SystemTranslations.translations_hash if path.empty?
|
92
|
+
ShopifyLiquid::SystemTranslations.translations_hash.dig(*path) || {}
|
93
|
+
end
|
68
94
|
end
|
69
95
|
end
|
data/lib/theme_check/position.rb
CHANGED
@@ -64,6 +64,10 @@ module ThemeCheck
|
|
64
64
|
strict_position.end_column
|
65
65
|
end
|
66
66
|
|
67
|
+
def content_line_count
|
68
|
+
@content_line_count ||= contents.count("\n")
|
69
|
+
end
|
70
|
+
|
67
71
|
private
|
68
72
|
|
69
73
|
def compute_start_offset
|
@@ -78,10 +82,6 @@ module ThemeCheck
|
|
78
82
|
@contents
|
79
83
|
end
|
80
84
|
|
81
|
-
def content_line_count
|
82
|
-
@content_line_count ||= contents.count("\n")
|
83
|
-
end
|
84
|
-
|
85
85
|
def line_number
|
86
86
|
return 0 if @line_number_1_indexed.nil?
|
87
87
|
bounded(0, @line_number_1_indexed - 1, content_line_count)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module ThemeCheck
|
3
|
+
module ShopifyLiquid
|
4
|
+
module SystemTranslations
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def translations
|
8
|
+
@translations ||= YAML.load(File.read("#{__dir__}/../../../data/shopify_translation_keys.yml")).to_set
|
9
|
+
end
|
10
|
+
|
11
|
+
def translations_hash
|
12
|
+
@translations_hash ||= translations.reduce({}) do |acc, k|
|
13
|
+
dig_set(acc, k.split('.'), "")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def include?(key)
|
18
|
+
translations.include?(key)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def dig_set(obj, keys, value)
|
24
|
+
key = keys.first
|
25
|
+
if keys.length == 1
|
26
|
+
obj[key] = value
|
27
|
+
else
|
28
|
+
obj[key] = {} unless obj[key]
|
29
|
+
dig_set(obj[key], keys.slice(1..-1), value)
|
30
|
+
end
|
31
|
+
obj
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -7,10 +7,17 @@ module ThemeCheck
|
|
7
7
|
extend self
|
8
8
|
|
9
9
|
def labels
|
10
|
-
@
|
10
|
+
@labels ||= tags_file_contents
|
11
|
+
.map { |x| to_label(x) }
|
11
12
|
.to_set
|
12
13
|
end
|
13
14
|
|
15
|
+
def end_labels
|
16
|
+
@end_labels ||= tags_file_contents
|
17
|
+
.select { |x| x.is_a?(Hash) }
|
18
|
+
.map { |x| x.values[0] }
|
19
|
+
end
|
20
|
+
|
14
21
|
def tag_regex(tag)
|
15
22
|
return unless labels.include?(tag)
|
16
23
|
@tag_regexes ||= {}
|
@@ -22,6 +29,17 @@ module ThemeCheck
|
|
22
29
|
@tag_liquid_regexes ||= {}
|
23
30
|
@tag_liquid_regexes[tag] ||= /^\s*#{tag}/m
|
24
31
|
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def to_label(label)
|
36
|
+
return label if label.is_a?(String)
|
37
|
+
label.keys[0]
|
38
|
+
end
|
39
|
+
|
40
|
+
def tags_file_contents
|
41
|
+
@tags_file_contents ||= YAML.load(File.read("#{__dir__}/../../../data/shopify_liquid/tags.yml"))
|
42
|
+
end
|
25
43
|
end
|
26
44
|
end
|
27
45
|
end
|
data/lib/theme_check/tags.rb
CHANGED
@@ -25,6 +25,12 @@ module ThemeCheck
|
|
25
25
|
)
|
26
26
|
end
|
27
27
|
|
28
|
+
def remove(node)
|
29
|
+
@rewriter.remove(
|
30
|
+
range(node.start_token_index, node.end_token_index)
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
28
34
|
def replace(node, content)
|
29
35
|
@rewriter.replace(
|
30
36
|
range(node.start_index, node.end_index),
|
@@ -32,6 +38,13 @@ module ThemeCheck
|
|
32
38
|
)
|
33
39
|
end
|
34
40
|
|
41
|
+
def replace_body(node, content)
|
42
|
+
@rewriter.replace(
|
43
|
+
range(node.block_body_start_index, node.block_body_end_index),
|
44
|
+
content
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
35
48
|
def wrap(node, insert_before, insert_after)
|
36
49
|
@rewriter.wrap(
|
37
50
|
range(node.start_index, node.end_index),
|
data/lib/theme_check/version.rb
CHANGED
data/lib/theme_check.rb
CHANGED
@@ -51,6 +51,10 @@ Encoding.default_external = Encoding::UTF_8
|
|
51
51
|
Encoding.default_internal = Encoding::UTF_8
|
52
52
|
|
53
53
|
module ThemeCheck
|
54
|
+
def self.debug?
|
55
|
+
ENV["THEME_CHECK_DEBUG"] == "true"
|
56
|
+
end
|
57
|
+
|
54
58
|
def self.with_liquid_c_disabled
|
55
59
|
if defined?(Liquid::C)
|
56
60
|
was_enabled = Liquid::C.enabled
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: theme-check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc-André Cournoyer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09
|
11
|
+
date: 2021-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -201,6 +201,8 @@ files:
|
|
201
201
|
- lib/theme_check/json_helpers.rb
|
202
202
|
- lib/theme_check/json_printer.rb
|
203
203
|
- lib/theme_check/language_server.rb
|
204
|
+
- lib/theme_check/language_server/bridge.rb
|
205
|
+
- lib/theme_check/language_server/channel.rb
|
204
206
|
- lib/theme_check/language_server/completion_engine.rb
|
205
207
|
- lib/theme_check/language_server/completion_helper.rb
|
206
208
|
- lib/theme_check/language_server/completion_provider.rb
|
@@ -209,6 +211,7 @@ files:
|
|
209
211
|
- lib/theme_check/language_server/completion_providers/render_snippet_completion_provider.rb
|
210
212
|
- lib/theme_check/language_server/completion_providers/tag_completion_provider.rb
|
211
213
|
- lib/theme_check/language_server/constants.rb
|
214
|
+
- lib/theme_check/language_server/diagnostics_engine.rb
|
212
215
|
- lib/theme_check/language_server/diagnostics_tracker.rb
|
213
216
|
- lib/theme_check/language_server/document_link_engine.rb
|
214
217
|
- lib/theme_check/language_server/document_link_provider.rb
|
@@ -217,6 +220,8 @@ files:
|
|
217
220
|
- lib/theme_check/language_server/document_link_providers/render_document_link_provider.rb
|
218
221
|
- lib/theme_check/language_server/document_link_providers/section_document_link_provider.rb
|
219
222
|
- lib/theme_check/language_server/handler.rb
|
223
|
+
- lib/theme_check/language_server/io_messenger.rb
|
224
|
+
- lib/theme_check/language_server/messenger.rb
|
220
225
|
- lib/theme_check/language_server/protocol.rb
|
221
226
|
- lib/theme_check/language_server/server.rb
|
222
227
|
- lib/theme_check/language_server/tokens.rb
|
@@ -241,6 +246,7 @@ files:
|
|
241
246
|
- lib/theme_check/shopify_liquid/deprecated_filter.rb
|
242
247
|
- lib/theme_check/shopify_liquid/filter.rb
|
243
248
|
- lib/theme_check/shopify_liquid/object.rb
|
249
|
+
- lib/theme_check/shopify_liquid/system_translations.rb
|
244
250
|
- lib/theme_check/shopify_liquid/tag.rb
|
245
251
|
- lib/theme_check/storage.rb
|
246
252
|
- lib/theme_check/string_helpers.rb
|