theme-check 1.7.0 → 1.9.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/.gitignore +1 -0
- data/CHANGELOG.md +49 -0
- data/README.md +10 -0
- data/RELEASING.md +13 -0
- data/config/default.yml +5 -0
- data/data/shopify_liquid/deprecated_filters.yml +4 -0
- data/data/shopify_liquid/filters.yml +3 -1
- data/data/shopify_liquid/tags.yml +9 -9
- data/docs/checks/TEMPLATE.md.erb +24 -19
- data/docs/checks/schema_json_format.md +76 -0
- data/docs/language_server/code-action-command-palette.png +0 -0
- data/docs/language_server/code-action-flow.png +0 -0
- data/docs/language_server/code-action-keyboard.png +0 -0
- data/docs/language_server/code-action-light-bulb.png +0 -0
- data/docs/language_server/code-action-problem.png +0 -0
- data/docs/language_server/code-action-quickfix.png +0 -0
- data/docs/language_server/how_to_correct_code_with_code_actions_and_execute_command.md +197 -0
- data/exe/theme-check-language-server +0 -4
- data/lib/theme_check/checks/asset_size_app_block_css.rb +2 -3
- data/lib/theme_check/checks/asset_size_app_block_javascript.rb +2 -3
- data/lib/theme_check/checks/asset_url_filters.rb +2 -0
- data/lib/theme_check/checks/default_locale.rb +1 -1
- data/lib/theme_check/checks/deprecated_filter.rb +79 -4
- data/lib/theme_check/checks/deprecated_global_app_block_type.rb +2 -3
- data/lib/theme_check/checks/matching_schema_translations.rb +14 -9
- data/lib/theme_check/checks/matching_translations.rb +1 -0
- data/lib/theme_check/checks/missing_required_template_files.rb +3 -3
- data/lib/theme_check/checks/missing_template.rb +1 -1
- data/lib/theme_check/checks/pagination_size.rb +2 -3
- data/lib/theme_check/checks/remote_asset.rb +5 -0
- data/lib/theme_check/checks/required_directories.rb +1 -1
- data/lib/theme_check/checks/required_layout_theme_object.rb +9 -4
- data/lib/theme_check/checks/schema_json_format.rb +29 -0
- data/lib/theme_check/checks/space_inside_braces.rb +132 -87
- data/lib/theme_check/checks/translation_key_exists.rb +33 -25
- data/lib/theme_check/checks/unused_assign.rb +3 -2
- data/lib/theme_check/checks/unused_snippet.rb +1 -1
- data/lib/theme_check/checks/valid_html_translation.rb +1 -1
- data/lib/theme_check/checks/valid_schema.rb +2 -2
- data/lib/theme_check/corrector.rb +34 -23
- data/lib/theme_check/exceptions.rb +1 -0
- data/lib/theme_check/file_system_storage.rb +8 -3
- data/lib/theme_check/html_node.rb +99 -6
- data/lib/theme_check/html_visitor.rb +1 -32
- data/lib/theme_check/in_memory_storage.rb +9 -0
- data/lib/theme_check/json_helpers.rb +14 -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/client_capabilities.rb +27 -0
- data/lib/theme_check/language_server/code_action_engine.rb +32 -0
- data/lib/theme_check/language_server/code_action_provider.rb +42 -0
- data/lib/theme_check/language_server/code_action_providers/quickfix_code_action_provider.rb +83 -0
- data/lib/theme_check/language_server/code_action_providers/source_fix_all_code_action_provider.rb +40 -0
- data/lib/theme_check/language_server/completion_providers/tag_completion_provider.rb +3 -1
- data/lib/theme_check/language_server/configuration.rb +69 -0
- data/lib/theme_check/language_server/diagnostic.rb +124 -0
- data/lib/theme_check/language_server/diagnostics_engine.rb +80 -0
- data/lib/theme_check/language_server/diagnostics_manager.rb +136 -0
- data/lib/theme_check/language_server/document_change_corrector.rb +267 -0
- data/lib/theme_check/language_server/document_link_provider.rb +6 -6
- data/lib/theme_check/language_server/execute_command_engine.rb +19 -0
- data/lib/theme_check/language_server/execute_command_provider.rb +30 -0
- data/lib/theme_check/language_server/execute_command_providers/correction_execute_command_provider.rb +48 -0
- data/lib/theme_check/language_server/execute_command_providers/run_checks_execute_command_provider.rb +22 -0
- data/lib/theme_check/language_server/handler.rb +92 -217
- data/lib/theme_check/language_server/io_messenger.rb +112 -0
- data/lib/theme_check/language_server/messenger.rb +12 -42
- data/lib/theme_check/language_server/protocol.rb +4 -0
- data/lib/theme_check/language_server/server.rb +54 -110
- data/lib/theme_check/language_server/uri_helper.rb +1 -0
- data/lib/theme_check/language_server/versioned_in_memory_storage.rb +69 -0
- data/lib/theme_check/language_server.rb +28 -6
- data/lib/theme_check/liquid_node.rb +255 -12
- data/lib/theme_check/locale_diff.rb +48 -10
- data/lib/theme_check/node.rb +16 -0
- data/lib/theme_check/offense.rb +27 -23
- data/lib/theme_check/position.rb +4 -4
- data/lib/theme_check/regex_helpers.rb +1 -1
- data/lib/theme_check/schema_helper.rb +70 -0
- 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/storage.rb +4 -0
- data/lib/theme_check/tags.rb +0 -1
- data/lib/theme_check/theme.rb +1 -1
- data/lib/theme_check/theme_file.rb +8 -1
- data/lib/theme_check/theme_file_rewriter.rb +28 -6
- data/lib/theme_check/version.rb +1 -1
- data/lib/theme_check.rb +11 -2
- metadata +31 -3
- data/lib/theme_check/language_server/diagnostics_tracker.rb +0 -66
|
@@ -14,24 +14,55 @@ 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
|
+
SchemaHelper.delete(schema, key_prefix + k)
|
|
37
|
+
end
|
|
38
|
+
corrector.replace_inner_json(node, schema)
|
|
39
|
+
end
|
|
40
|
+
elsif theme_file.is_a?(JsonFile)
|
|
41
|
+
check.add_offense(message, theme_file: theme_file) do |corrector|
|
|
42
|
+
extra_keys.each do |k|
|
|
43
|
+
corrector.remove_translation(theme_file, key_prefix + k)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
else
|
|
47
|
+
check.add_offense(message, theme_file: theme_file)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def add_missing_keys_offense(check, cause, missing_keys, key_prefix:, node: nil, theme_file: nil, schema: {})
|
|
52
|
+
message = "#{cause}: #{format_keys(key_prefix, missing_keys)}"
|
|
53
|
+
if node
|
|
54
|
+
check.add_offense(message, node: node) do |corrector|
|
|
55
|
+
missing_keys.each do |k|
|
|
56
|
+
SchemaHelper.set(schema, key_prefix + k, "TODO")
|
|
57
|
+
end
|
|
58
|
+
corrector.replace_inner_json(node, schema)
|
|
59
|
+
end
|
|
60
|
+
elsif theme_file.is_a?(JsonFile)
|
|
61
|
+
check.add_offense(message, theme_file: theme_file) do |corrector|
|
|
62
|
+
missing_keys.each do |k|
|
|
63
|
+
corrector.add_translation(theme_file, key_prefix + k, "TODO")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
35
66
|
else
|
|
36
67
|
check.add_offense(message, theme_file: theme_file)
|
|
37
68
|
end
|
|
@@ -46,10 +77,12 @@ module ThemeCheck
|
|
|
46
77
|
other = {} unless other.is_a?(Hash)
|
|
47
78
|
return if pluralization?(default) && pluralization?(other)
|
|
48
79
|
|
|
49
|
-
|
|
80
|
+
shopify_translations = system_translations(path)
|
|
81
|
+
|
|
82
|
+
@extra_keys += (other.keys - default.keys - shopify_translations.keys).map { |key| path + [key] }
|
|
50
83
|
|
|
51
84
|
default.each do |key, default_value|
|
|
52
|
-
translated_value = other[key]
|
|
85
|
+
translated_value = other[key] || shopify_translations[key]
|
|
53
86
|
new_path = path + [key]
|
|
54
87
|
|
|
55
88
|
if translated_value.nil?
|
|
@@ -65,5 +98,10 @@ module ThemeCheck
|
|
|
65
98
|
PLURALIZATION_KEYS.include?(key) && !value.is_a?(Hash)
|
|
66
99
|
end
|
|
67
100
|
end
|
|
101
|
+
|
|
102
|
+
def system_translations(path)
|
|
103
|
+
return ShopifyLiquid::SystemTranslations.translations_hash if path.empty?
|
|
104
|
+
ShopifyLiquid::SystemTranslations.translations_hash.dig(*path) || {}
|
|
105
|
+
end
|
|
68
106
|
end
|
|
69
107
|
end
|
data/lib/theme_check/node.rb
CHANGED
|
@@ -30,8 +30,24 @@ module ThemeCheck
|
|
|
30
30
|
raise NotImplementedError
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
+
def start_row
|
|
34
|
+
raise NotImplementedError
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def start_column
|
|
38
|
+
raise NotImplementedError
|
|
39
|
+
end
|
|
40
|
+
|
|
33
41
|
def end_index
|
|
34
42
|
raise NotImplementedError
|
|
35
43
|
end
|
|
44
|
+
|
|
45
|
+
def end_row
|
|
46
|
+
raise NotImplementedError
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def end_column
|
|
50
|
+
raise NotImplementedError
|
|
51
|
+
end
|
|
36
52
|
end
|
|
37
53
|
end
|
data/lib/theme_check/offense.rb
CHANGED
|
@@ -39,26 +39,12 @@ module ThemeCheck
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
@node = node
|
|
42
|
-
@theme_file =
|
|
43
|
-
|
|
44
|
-
@theme_file = node.theme_file
|
|
45
|
-
elsif theme_file
|
|
46
|
-
@theme_file = theme_file
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
@markup = if markup
|
|
50
|
-
markup
|
|
51
|
-
else
|
|
52
|
-
node&.markup
|
|
53
|
-
end
|
|
42
|
+
@theme_file = node&.theme_file || theme_file
|
|
43
|
+
@markup = markup || node&.markup
|
|
54
44
|
|
|
55
45
|
raise ArgumentError, "Offense markup cannot be an empty string" if @markup.is_a?(String) && @markup.empty?
|
|
56
46
|
|
|
57
|
-
@line_number =
|
|
58
|
-
line_number
|
|
59
|
-
elsif @node
|
|
60
|
-
@node.line_number
|
|
61
|
-
end
|
|
47
|
+
@line_number = line_number || @node&.line_number
|
|
62
48
|
|
|
63
49
|
@position = Position.new(
|
|
64
50
|
@markup,
|
|
@@ -81,11 +67,25 @@ module ThemeCheck
|
|
|
81
67
|
end
|
|
82
68
|
end
|
|
83
69
|
|
|
70
|
+
def in_range?(other_range)
|
|
71
|
+
# Zero length ranges are OK and considered the same as size 1 ranges
|
|
72
|
+
other_range = other_range.first..other_range.end if other_range.size == 0 # rubocop:disable Style/ZeroLengthPredicate
|
|
73
|
+
range.cover?(other_range) || other_range.cover?(range)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def range
|
|
77
|
+
@range ||= if start_index == end_index
|
|
78
|
+
(start_index..end_index)
|
|
79
|
+
else
|
|
80
|
+
(start_index...end_index) # end_index is excluded
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
84
|
def start_index
|
|
85
85
|
@position.start_index
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
-
def
|
|
88
|
+
def start_row
|
|
89
89
|
@position.start_row
|
|
90
90
|
end
|
|
91
91
|
|
|
@@ -97,7 +97,7 @@ module ThemeCheck
|
|
|
97
97
|
@position.end_index
|
|
98
98
|
end
|
|
99
99
|
|
|
100
|
-
def
|
|
100
|
+
def end_row
|
|
101
101
|
@position.end_row
|
|
102
102
|
end
|
|
103
103
|
|
|
@@ -121,6 +121,10 @@ module ThemeCheck
|
|
|
121
121
|
StringHelpers.demodulize(check.class.name)
|
|
122
122
|
end
|
|
123
123
|
|
|
124
|
+
def version
|
|
125
|
+
theme_file&.version
|
|
126
|
+
end
|
|
127
|
+
|
|
124
128
|
def doc
|
|
125
129
|
check.doc
|
|
126
130
|
end
|
|
@@ -139,9 +143,9 @@ module ThemeCheck
|
|
|
139
143
|
!!correction
|
|
140
144
|
end
|
|
141
145
|
|
|
142
|
-
def correct
|
|
146
|
+
def correct(corrector = nil)
|
|
143
147
|
if correctable?
|
|
144
|
-
corrector
|
|
148
|
+
corrector ||= Corrector.new(theme_file: theme_file)
|
|
145
149
|
correction.call(corrector)
|
|
146
150
|
end
|
|
147
151
|
rescue => e
|
|
@@ -211,9 +215,9 @@ module ThemeCheck
|
|
|
211
215
|
check: check.code_name,
|
|
212
216
|
path: theme_file&.relative_path,
|
|
213
217
|
severity: check.severity_value,
|
|
214
|
-
|
|
218
|
+
start_row: start_row,
|
|
215
219
|
start_column: start_column,
|
|
216
|
-
|
|
220
|
+
end_row: end_row,
|
|
217
221
|
end_column: end_column,
|
|
218
222
|
message: message,
|
|
219
223
|
}
|
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)
|
|
@@ -5,7 +5,7 @@ module ThemeCheck
|
|
|
5
5
|
LIQUID_TAG = /#{Liquid::TagStart}.*?#{Liquid::TagEnd}/om
|
|
6
6
|
LIQUID_VARIABLE = /#{Liquid::VariableStart}.*?#{Liquid::VariableEnd}/om
|
|
7
7
|
LIQUID_TAG_OR_VARIABLE = /#{LIQUID_TAG}|#{LIQUID_VARIABLE}/om
|
|
8
|
-
HTML_LIQUID_PLACEHOLDER = /≬[0-9a-z]
|
|
8
|
+
HTML_LIQUID_PLACEHOLDER = /≬[0-9a-z\n]+[#\n]*≬/m
|
|
9
9
|
START_OR_END_QUOTE = /(^['"])|(['"]$)/
|
|
10
10
|
|
|
11
11
|
def matches(s, re)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ThemeCheck
|
|
4
|
+
class SchemaHelper
|
|
5
|
+
# Deeply sets a value in a hash. Accepts both arrays and strings for path.
|
|
6
|
+
def self.set(hash, path, value)
|
|
7
|
+
path = path.split('.') if path.is_a?(String)
|
|
8
|
+
path.each_with_index.reduce(hash) do |pointer, (token, index)|
|
|
9
|
+
if index == path.size - 1
|
|
10
|
+
pointer[token] = value
|
|
11
|
+
elsif !pointer.key?(token)
|
|
12
|
+
pointer[token] = {}
|
|
13
|
+
end
|
|
14
|
+
pointer[token]
|
|
15
|
+
end
|
|
16
|
+
hash
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Deeply delete a key from a hash
|
|
20
|
+
def self.delete(hash, path)
|
|
21
|
+
path = path.split('.') if path.is_a?(String)
|
|
22
|
+
path.each_with_index.reduce(hash) do |pointer, (token, index)|
|
|
23
|
+
break pointer.delete(token) if index == path.size - 1
|
|
24
|
+
pointer[token]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Deeply add key/values inside a hash.
|
|
29
|
+
#
|
|
30
|
+
# Handles arrays by adding the key/value to all hashes inside the array.
|
|
31
|
+
#
|
|
32
|
+
# Specially handles objects that have the "id" key like this:
|
|
33
|
+
#
|
|
34
|
+
# e.g.
|
|
35
|
+
#
|
|
36
|
+
# schema = {
|
|
37
|
+
# "deep" => [
|
|
38
|
+
# { "id" => "hi" },
|
|
39
|
+
# { "id" => "oh" },
|
|
40
|
+
# ],
|
|
41
|
+
# }
|
|
42
|
+
# assert_equal(
|
|
43
|
+
# {
|
|
44
|
+
# "deep" => [
|
|
45
|
+
# { "id" => "hi", "ho" => "ho" },
|
|
46
|
+
# { "id" => "oh" },
|
|
47
|
+
# ],
|
|
48
|
+
# },
|
|
49
|
+
# SchemaHelper.schema_corrector(schema, "deep.hi.ho", "ho")
|
|
50
|
+
# )
|
|
51
|
+
def self.schema_corrector(schema, path, value)
|
|
52
|
+
return schema unless schema.is_a?(Hash)
|
|
53
|
+
path = path.split('.') if path.is_a?(String)
|
|
54
|
+
path.each_with_index.reduce(schema) do |pointer, (token, index)|
|
|
55
|
+
case pointer
|
|
56
|
+
when Array
|
|
57
|
+
pointer.each do |item|
|
|
58
|
+
schema_corrector(item, path.drop(1), value)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
when Hash
|
|
62
|
+
break pointer[token] = value if index == path.size - 1
|
|
63
|
+
pointer[token] = {} unless pointer.key?(token) || pointer.key?("id")
|
|
64
|
+
pointer[token].nil? && pointer["id"] == token ? pointer : pointer[token]
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
schema
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -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/storage.rb
CHANGED
data/lib/theme_check/tags.rb
CHANGED
data/lib/theme_check/theme.rb
CHANGED
|
@@ -3,10 +3,13 @@ require "pathname"
|
|
|
3
3
|
|
|
4
4
|
module ThemeCheck
|
|
5
5
|
class ThemeFile
|
|
6
|
+
attr_reader :version, :storage
|
|
7
|
+
|
|
6
8
|
def initialize(relative_path, storage)
|
|
7
9
|
@relative_path = relative_path
|
|
8
10
|
@storage = storage
|
|
9
11
|
@source = nil
|
|
12
|
+
@version = nil
|
|
10
13
|
@eol = "\n"
|
|
11
14
|
end
|
|
12
15
|
|
|
@@ -36,7 +39,11 @@ module ThemeCheck
|
|
|
36
39
|
# source file.
|
|
37
40
|
def source
|
|
38
41
|
return @source if @source
|
|
39
|
-
|
|
42
|
+
if @storage.versioned?
|
|
43
|
+
@source, @version = @storage.read_version(@relative_path)
|
|
44
|
+
else
|
|
45
|
+
@source = @storage.read(@relative_path)
|
|
46
|
+
end
|
|
40
47
|
@eol = @source.include?("\r\n") ? "\r\n" : "\n"
|
|
41
48
|
@source = @source.gsub("\r\n", "\n")
|
|
42
49
|
end
|
|
@@ -11,23 +11,45 @@ module ThemeCheck
|
|
|
11
11
|
)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
def insert_before(node, content)
|
|
14
|
+
def insert_before(node, content, character_range = nil)
|
|
15
15
|
@rewriter.insert_before(
|
|
16
|
-
range(
|
|
16
|
+
range(
|
|
17
|
+
character_range&.begin || node.start_index,
|
|
18
|
+
character_range&.end || node.end_index,
|
|
19
|
+
),
|
|
17
20
|
content
|
|
18
21
|
)
|
|
19
22
|
end
|
|
20
23
|
|
|
21
|
-
def insert_after(node, content)
|
|
24
|
+
def insert_after(node, content, character_range = nil)
|
|
22
25
|
@rewriter.insert_after(
|
|
23
|
-
range(
|
|
26
|
+
range(
|
|
27
|
+
character_range&.begin || node.start_index,
|
|
28
|
+
character_range&.end || node.end_index,
|
|
29
|
+
),
|
|
24
30
|
content
|
|
25
31
|
)
|
|
26
32
|
end
|
|
27
33
|
|
|
28
|
-
def
|
|
34
|
+
def remove(node)
|
|
35
|
+
@rewriter.remove(
|
|
36
|
+
range(node.outer_markup_start_index, node.outer_markup_end_index)
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def replace(node, content, character_range = nil)
|
|
29
41
|
@rewriter.replace(
|
|
30
|
-
range(
|
|
42
|
+
range(
|
|
43
|
+
character_range&.begin || node.start_index,
|
|
44
|
+
character_range&.end || node.end_index,
|
|
45
|
+
),
|
|
46
|
+
content
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def replace_inner_markup(node, content)
|
|
51
|
+
@rewriter.replace(
|
|
52
|
+
range(node.inner_markup_start_index, node.inner_markup_end_index),
|
|
31
53
|
content
|
|
32
54
|
)
|
|
33
55
|
end
|
data/lib/theme_check/version.rb
CHANGED
data/lib/theme_check.rb
CHANGED
|
@@ -4,6 +4,7 @@ require "liquid"
|
|
|
4
4
|
require_relative "theme_check/version"
|
|
5
5
|
require_relative "theme_check/bug"
|
|
6
6
|
require_relative "theme_check/exceptions"
|
|
7
|
+
require_relative "theme_check/schema_helper"
|
|
7
8
|
require_relative "theme_check/theme_file_rewriter"
|
|
8
9
|
require_relative "theme_check/theme_file"
|
|
9
10
|
require_relative "theme_check/liquid_file"
|
|
@@ -24,10 +25,10 @@ require_relative "theme_check/regex_helpers"
|
|
|
24
25
|
require_relative "theme_check/json_helpers"
|
|
25
26
|
require_relative "theme_check/position_helper"
|
|
26
27
|
require_relative "theme_check/position"
|
|
27
|
-
require_relative "theme_check/language_server"
|
|
28
28
|
require_relative "theme_check/checks"
|
|
29
29
|
require_relative "theme_check/config"
|
|
30
30
|
require_relative "theme_check/node"
|
|
31
|
+
require_relative "theme_check/tags"
|
|
31
32
|
require_relative "theme_check/liquid_node"
|
|
32
33
|
require_relative "theme_check/html_node"
|
|
33
34
|
require_relative "theme_check/offense"
|
|
@@ -38,11 +39,11 @@ require_relative "theme_check/string_helpers"
|
|
|
38
39
|
require_relative "theme_check/storage"
|
|
39
40
|
require_relative "theme_check/file_system_storage"
|
|
40
41
|
require_relative "theme_check/in_memory_storage"
|
|
41
|
-
require_relative "theme_check/tags"
|
|
42
42
|
require_relative "theme_check/theme"
|
|
43
43
|
require_relative "theme_check/corrector"
|
|
44
44
|
require_relative "theme_check/liquid_visitor"
|
|
45
45
|
require_relative "theme_check/html_visitor"
|
|
46
|
+
require_relative "theme_check/language_server"
|
|
46
47
|
|
|
47
48
|
Dir[__dir__ + "/theme_check/checks/*.rb"].each { |file| require file }
|
|
48
49
|
|
|
@@ -51,6 +52,14 @@ Encoding.default_external = Encoding::UTF_8
|
|
|
51
52
|
Encoding.default_internal = Encoding::UTF_8
|
|
52
53
|
|
|
53
54
|
module ThemeCheck
|
|
55
|
+
def self.debug?
|
|
56
|
+
ENV["THEME_CHECK_DEBUG"] == "true"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def self.debug_log_file
|
|
60
|
+
ENV["THEME_CHECK_DEBUG_LOG_FILE"]
|
|
61
|
+
end
|
|
62
|
+
|
|
54
63
|
def self.with_liquid_c_disabled
|
|
55
64
|
if defined?(Liquid::C)
|
|
56
65
|
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.9.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-
|
|
11
|
+
date: 2021-12-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: liquid
|
|
@@ -121,6 +121,7 @@ files:
|
|
|
121
121
|
- docs/checks/remote_asset.md
|
|
122
122
|
- docs/checks/required_directories.md
|
|
123
123
|
- docs/checks/required_layout_theme_object.md
|
|
124
|
+
- docs/checks/schema_json_format.md
|
|
124
125
|
- docs/checks/space_inside_braces.md
|
|
125
126
|
- docs/checks/syntax_error.md
|
|
126
127
|
- docs/checks/template_length.md
|
|
@@ -133,6 +134,13 @@ files:
|
|
|
133
134
|
- docs/checks/valid_json.md
|
|
134
135
|
- docs/checks/valid_schema.md
|
|
135
136
|
- docs/flamegraph.svg
|
|
137
|
+
- docs/language_server/code-action-command-palette.png
|
|
138
|
+
- docs/language_server/code-action-flow.png
|
|
139
|
+
- docs/language_server/code-action-keyboard.png
|
|
140
|
+
- docs/language_server/code-action-light-bulb.png
|
|
141
|
+
- docs/language_server/code-action-problem.png
|
|
142
|
+
- docs/language_server/code-action-quickfix.png
|
|
143
|
+
- docs/language_server/how_to_correct_code_with_code_actions_and_execute_command.md
|
|
136
144
|
- docs/preview.png
|
|
137
145
|
- exe/theme-check
|
|
138
146
|
- exe/theme-check-language-server
|
|
@@ -173,6 +181,7 @@ files:
|
|
|
173
181
|
- lib/theme_check/checks/remote_asset.rb
|
|
174
182
|
- lib/theme_check/checks/required_directories.rb
|
|
175
183
|
- lib/theme_check/checks/required_layout_theme_object.rb
|
|
184
|
+
- lib/theme_check/checks/schema_json_format.rb
|
|
176
185
|
- lib/theme_check/checks/space_inside_braces.rb
|
|
177
186
|
- lib/theme_check/checks/syntax_error.rb
|
|
178
187
|
- lib/theme_check/checks/template_length.rb
|
|
@@ -201,6 +210,13 @@ files:
|
|
|
201
210
|
- lib/theme_check/json_helpers.rb
|
|
202
211
|
- lib/theme_check/json_printer.rb
|
|
203
212
|
- lib/theme_check/language_server.rb
|
|
213
|
+
- lib/theme_check/language_server/bridge.rb
|
|
214
|
+
- lib/theme_check/language_server/channel.rb
|
|
215
|
+
- lib/theme_check/language_server/client_capabilities.rb
|
|
216
|
+
- lib/theme_check/language_server/code_action_engine.rb
|
|
217
|
+
- lib/theme_check/language_server/code_action_provider.rb
|
|
218
|
+
- lib/theme_check/language_server/code_action_providers/quickfix_code_action_provider.rb
|
|
219
|
+
- lib/theme_check/language_server/code_action_providers/source_fix_all_code_action_provider.rb
|
|
204
220
|
- lib/theme_check/language_server/completion_engine.rb
|
|
205
221
|
- lib/theme_check/language_server/completion_helper.rb
|
|
206
222
|
- lib/theme_check/language_server/completion_provider.rb
|
|
@@ -208,21 +224,31 @@ files:
|
|
|
208
224
|
- lib/theme_check/language_server/completion_providers/object_completion_provider.rb
|
|
209
225
|
- lib/theme_check/language_server/completion_providers/render_snippet_completion_provider.rb
|
|
210
226
|
- lib/theme_check/language_server/completion_providers/tag_completion_provider.rb
|
|
227
|
+
- lib/theme_check/language_server/configuration.rb
|
|
211
228
|
- lib/theme_check/language_server/constants.rb
|
|
212
|
-
- lib/theme_check/language_server/
|
|
229
|
+
- lib/theme_check/language_server/diagnostic.rb
|
|
230
|
+
- lib/theme_check/language_server/diagnostics_engine.rb
|
|
231
|
+
- lib/theme_check/language_server/diagnostics_manager.rb
|
|
232
|
+
- lib/theme_check/language_server/document_change_corrector.rb
|
|
213
233
|
- lib/theme_check/language_server/document_link_engine.rb
|
|
214
234
|
- lib/theme_check/language_server/document_link_provider.rb
|
|
215
235
|
- lib/theme_check/language_server/document_link_providers/asset_document_link_provider.rb
|
|
216
236
|
- lib/theme_check/language_server/document_link_providers/include_document_link_provider.rb
|
|
217
237
|
- lib/theme_check/language_server/document_link_providers/render_document_link_provider.rb
|
|
218
238
|
- lib/theme_check/language_server/document_link_providers/section_document_link_provider.rb
|
|
239
|
+
- lib/theme_check/language_server/execute_command_engine.rb
|
|
240
|
+
- lib/theme_check/language_server/execute_command_provider.rb
|
|
241
|
+
- lib/theme_check/language_server/execute_command_providers/correction_execute_command_provider.rb
|
|
242
|
+
- lib/theme_check/language_server/execute_command_providers/run_checks_execute_command_provider.rb
|
|
219
243
|
- lib/theme_check/language_server/handler.rb
|
|
244
|
+
- lib/theme_check/language_server/io_messenger.rb
|
|
220
245
|
- lib/theme_check/language_server/messenger.rb
|
|
221
246
|
- lib/theme_check/language_server/protocol.rb
|
|
222
247
|
- lib/theme_check/language_server/server.rb
|
|
223
248
|
- lib/theme_check/language_server/tokens.rb
|
|
224
249
|
- lib/theme_check/language_server/uri_helper.rb
|
|
225
250
|
- lib/theme_check/language_server/variable_lookup_finder.rb
|
|
251
|
+
- lib/theme_check/language_server/versioned_in_memory_storage.rb
|
|
226
252
|
- lib/theme_check/liquid_check.rb
|
|
227
253
|
- lib/theme_check/liquid_file.rb
|
|
228
254
|
- lib/theme_check/liquid_node.rb
|
|
@@ -238,10 +264,12 @@ files:
|
|
|
238
264
|
- lib/theme_check/regex_helpers.rb
|
|
239
265
|
- lib/theme_check/releaser.rb
|
|
240
266
|
- lib/theme_check/remote_asset_file.rb
|
|
267
|
+
- lib/theme_check/schema_helper.rb
|
|
241
268
|
- lib/theme_check/shopify_liquid.rb
|
|
242
269
|
- lib/theme_check/shopify_liquid/deprecated_filter.rb
|
|
243
270
|
- lib/theme_check/shopify_liquid/filter.rb
|
|
244
271
|
- lib/theme_check/shopify_liquid/object.rb
|
|
272
|
+
- lib/theme_check/shopify_liquid/system_translations.rb
|
|
245
273
|
- lib/theme_check/shopify_liquid/tag.rb
|
|
246
274
|
- lib/theme_check/storage.rb
|
|
247
275
|
- lib/theme_check/string_helpers.rb
|