theme-check 0.4.0 → 0.5.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/.rubocop.yml +6 -0
- data/CHANGELOG.md +10 -0
- data/CONTRIBUTING.md +5 -2
- data/README.md +9 -2
- data/RELEASING.md +1 -1
- data/config/default.yml +6 -0
- data/data/shopify_liquid/tags.yml +1 -0
- data/docs/checks/CHECK_DOCS_TEMPLATE.md +47 -0
- data/docs/checks/asset_size_javascript.md +79 -0
- data/docs/checks/convert_include_to_render.md +48 -0
- data/docs/checks/default_locale.md +46 -0
- data/docs/checks/deprecated_filter.md +46 -0
- data/docs/checks/liquid_tag.md +65 -0
- data/docs/checks/matching_schema_translations.md +93 -0
- data/docs/checks/matching_translations.md +72 -0
- data/docs/checks/missing_enable_comment.md +50 -0
- data/docs/checks/missing_required_template_files.md +26 -0
- data/docs/checks/missing_template.md +40 -0
- data/docs/checks/nested_snippet.md +69 -0
- data/docs/checks/parser_blocking_javascript.md +97 -0
- data/docs/checks/required_directories.md +25 -0
- data/docs/checks/required_layout_theme_object.md +28 -0
- data/docs/checks/space_inside_braces.md +63 -0
- data/docs/checks/syntax_error.md +49 -0
- data/docs/checks/template_length.md +50 -0
- data/docs/checks/translation_key_exists.md +63 -0
- data/docs/checks/undefined_object.md +53 -0
- data/docs/checks/unknown_filter.md +45 -0
- data/docs/checks/unused_assign.md +47 -0
- data/docs/checks/unused_snippet.md +32 -0
- data/docs/checks/valid_html_translation.md +53 -0
- data/docs/checks/valid_json.md +60 -0
- data/docs/checks/valid_schema.md +50 -0
- data/lib/theme_check.rb +3 -0
- data/lib/theme_check/asset_file.rb +34 -0
- data/lib/theme_check/check.rb +19 -9
- data/lib/theme_check/checks/asset_size_javascript.rb +74 -0
- data/lib/theme_check/checks/convert_include_to_render.rb +1 -1
- data/lib/theme_check/checks/default_locale.rb +1 -0
- data/lib/theme_check/checks/deprecated_filter.rb +1 -1
- data/lib/theme_check/checks/liquid_tag.rb +3 -3
- data/lib/theme_check/checks/matching_schema_translations.rb +1 -0
- data/lib/theme_check/checks/matching_translations.rb +1 -0
- data/lib/theme_check/checks/missing_enable_comment.rb +1 -0
- data/lib/theme_check/checks/missing_required_template_files.rb +1 -2
- data/lib/theme_check/checks/missing_template.rb +1 -0
- data/lib/theme_check/checks/nested_snippet.rb +1 -0
- data/lib/theme_check/checks/parser_blocking_javascript.rb +2 -1
- data/lib/theme_check/checks/required_directories.rb +1 -1
- data/lib/theme_check/checks/required_layout_theme_object.rb +1 -1
- data/lib/theme_check/checks/space_inside_braces.rb +1 -0
- data/lib/theme_check/checks/syntax_error.rb +1 -0
- data/lib/theme_check/checks/template_length.rb +1 -0
- data/lib/theme_check/checks/translation_key_exists.rb +1 -0
- data/lib/theme_check/checks/undefined_object.rb +10 -4
- data/lib/theme_check/checks/unknown_filter.rb +1 -0
- data/lib/theme_check/checks/unused_assign.rb +1 -0
- data/lib/theme_check/checks/unused_snippet.rb +1 -0
- data/lib/theme_check/checks/valid_html_translation.rb +1 -0
- data/lib/theme_check/checks/valid_json.rb +1 -0
- data/lib/theme_check/checks/valid_schema.rb +1 -0
- data/lib/theme_check/config.rb +2 -2
- data/lib/theme_check/language_server/completion_helper.rb +0 -10
- data/lib/theme_check/language_server/completion_provider.rb +1 -0
- data/lib/theme_check/language_server/handler.rb +11 -3
- data/lib/theme_check/language_server/server.rb +6 -1
- data/lib/theme_check/regex_helpers.rb +15 -0
- data/lib/theme_check/remote_asset_file.rb +44 -0
- data/lib/theme_check/theme.rb +7 -1
- data/lib/theme_check/version.rb +1 -1
- metadata +32 -2
@@ -3,7 +3,8 @@ module ThemeCheck
|
|
3
3
|
# Reports errors when trying to use parser-blocking script tags
|
4
4
|
class ParserBlockingJavaScript < LiquidCheck
|
5
5
|
severity :error
|
6
|
-
|
6
|
+
categories :liquid, :performance
|
7
|
+
doc docs_url(__FILE__)
|
7
8
|
|
8
9
|
PARSER_BLOCKING_SCRIPT_TAG = %r{
|
9
10
|
<script # Find the start of a script tag
|
@@ -5,7 +5,7 @@ module ThemeCheck
|
|
5
5
|
class RequiredDirectories < LiquidCheck
|
6
6
|
severity :error
|
7
7
|
category :liquid
|
8
|
-
doc
|
8
|
+
doc docs_url(__FILE__)
|
9
9
|
|
10
10
|
REQUIRED_DIRECTORIES = %w(assets config layout locales sections snippets templates)
|
11
11
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
module ThemeCheck
|
3
3
|
class UndefinedObject < LiquidCheck
|
4
4
|
category :liquid
|
5
|
-
doc
|
5
|
+
doc docs_url(__FILE__)
|
6
6
|
severity :error
|
7
7
|
|
8
8
|
class TemplateInfo
|
@@ -21,7 +21,13 @@ module ThemeCheck
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def add_variable_lookup(name:, node:)
|
24
|
-
|
24
|
+
parent = node
|
25
|
+
line_number = nil
|
26
|
+
loop do
|
27
|
+
line_number = parent.line_number
|
28
|
+
parent = parent.parent
|
29
|
+
break unless line_number.nil? && parent
|
30
|
+
end
|
25
31
|
key = [name, line_number]
|
26
32
|
@all_variable_lookups[key] = node
|
27
33
|
end
|
@@ -154,7 +160,7 @@ module ThemeCheck
|
|
154
160
|
all_variables = info.all_variables
|
155
161
|
|
156
162
|
info.each_variable_lookup(!!render_node) do |(key, node)|
|
157
|
-
name,
|
163
|
+
name, line_number = key
|
158
164
|
next if all_variables.include?(name)
|
159
165
|
next if all_global_objects.include?(name)
|
160
166
|
|
@@ -164,7 +170,7 @@ module ThemeCheck
|
|
164
170
|
if render_node
|
165
171
|
add_offense("Missing argument `#{name}`", node: render_node)
|
166
172
|
else
|
167
|
-
add_offense("Undefined object `#{name}`", node: node)
|
173
|
+
add_offense("Undefined object `#{name}`", node: node, line_number: line_number)
|
168
174
|
end
|
169
175
|
end
|
170
176
|
end
|
data/lib/theme_check/config.rb
CHANGED
@@ -83,8 +83,8 @@ module ThemeCheck
|
|
83
83
|
|
84
84
|
check_class = ThemeCheck.const_get(check_name)
|
85
85
|
|
86
|
-
next if exclude_categories.include?(
|
87
|
-
next if only_categories.any? &&
|
86
|
+
next if check_class.categories.any? { |category| exclude_categories.include?(category) }
|
87
|
+
next if only_categories.any? && check_class.categories.none? { |category| only_categories.include?(category) }
|
88
88
|
|
89
89
|
options_for_check = options.transform_keys(&:to_sym)
|
90
90
|
options_for_check.delete(:enabled)
|
@@ -20,16 +20,6 @@ module ThemeCheck
|
|
20
20
|
def first_word(content)
|
21
21
|
return content.match(WORD)[0] if content.match?(WORD)
|
22
22
|
end
|
23
|
-
|
24
|
-
def matches(s, re)
|
25
|
-
start_at = 0
|
26
|
-
matches = []
|
27
|
-
while (m = s.match(re, start_at))
|
28
|
-
matches.push(m)
|
29
|
-
start_at = m.end(0)
|
30
|
-
end
|
31
|
-
matches
|
32
|
-
end
|
33
23
|
end
|
34
24
|
end
|
35
25
|
end
|
@@ -138,12 +138,20 @@ module ThemeCheck
|
|
138
138
|
end
|
139
139
|
|
140
140
|
def offense_to_diagnostic(offense)
|
141
|
-
{
|
141
|
+
diagnostic = {
|
142
|
+
code: offense.code_name,
|
143
|
+
message: offense.message,
|
142
144
|
range: range(offense),
|
143
145
|
severity: severity(offense),
|
144
|
-
code: offense.code_name,
|
145
146
|
source: "theme-check",
|
146
|
-
|
147
|
+
}
|
148
|
+
diagnostic["codeDescription"] = code_description(offense) unless offense.doc.nil?
|
149
|
+
diagnostic
|
150
|
+
end
|
151
|
+
|
152
|
+
def code_description(offense)
|
153
|
+
{
|
154
|
+
href: offense.doc,
|
147
155
|
}
|
148
156
|
end
|
149
157
|
|
@@ -10,11 +10,13 @@ module ThemeCheck
|
|
10
10
|
|
11
11
|
class Server
|
12
12
|
attr_reader :handler
|
13
|
+
attr_reader :should_raise_errors
|
13
14
|
|
14
15
|
def initialize(
|
15
16
|
in_stream: STDIN,
|
16
17
|
out_stream: STDOUT,
|
17
|
-
err_stream: $DEBUG ? File.open('/tmp/lsp.log', 'a') : STDERR
|
18
|
+
err_stream: $DEBUG ? File.open('/tmp/lsp.log', 'a') : STDERR,
|
19
|
+
should_raise_errors: false
|
18
20
|
)
|
19
21
|
validate!([in_stream, out_stream, err_stream])
|
20
22
|
|
@@ -25,6 +27,8 @@ module ThemeCheck
|
|
25
27
|
|
26
28
|
@out.sync = true # do not buffer
|
27
29
|
@err.sync = true # do not buffer
|
30
|
+
|
31
|
+
@should_raise_errors = should_raise_errors
|
28
32
|
end
|
29
33
|
|
30
34
|
def listen
|
@@ -37,6 +41,7 @@ module ThemeCheck
|
|
37
41
|
return 0
|
38
42
|
|
39
43
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
44
|
+
raise e if should_raise_errors
|
40
45
|
log(e)
|
41
46
|
log(e.backtrace)
|
42
47
|
return 1
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "net/http"
|
3
|
+
require "pathname"
|
4
|
+
|
5
|
+
module ThemeCheck
|
6
|
+
class RemoteAssetFile
|
7
|
+
class << self
|
8
|
+
def cache
|
9
|
+
@cache ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_src(src)
|
13
|
+
key = uri(src).to_s
|
14
|
+
cache[key] = RemoteAssetFile.new(src) unless cache.key?(key)
|
15
|
+
cache[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def uri(src)
|
19
|
+
URI.parse(src.sub(%r{^//}, "https://"))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(src)
|
24
|
+
@uri = RemoteAssetFile.uri(src)
|
25
|
+
@content = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def content
|
29
|
+
return @content unless @content.nil?
|
30
|
+
|
31
|
+
res = Net::HTTP.start(@uri.hostname, @uri.port, use_ssl: @uri.scheme == 'https') do |http|
|
32
|
+
req = Net::HTTP::Get.new(@uri)
|
33
|
+
req['Accept-Encoding'] = 'gzip, deflate, br'
|
34
|
+
http.request(req)
|
35
|
+
end
|
36
|
+
|
37
|
+
@content = res.body
|
38
|
+
end
|
39
|
+
|
40
|
+
def gzipped_size
|
41
|
+
@gzipped_size ||= @content.bytesize
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/theme_check/theme.rb
CHANGED
@@ -11,6 +11,12 @@ module ThemeCheck
|
|
11
11
|
@storage = storage
|
12
12
|
end
|
13
13
|
|
14
|
+
def assets
|
15
|
+
@assets ||= @storage.files
|
16
|
+
.select { |path| path.starts_with?("assets/") }
|
17
|
+
.map { |path| AssetFile.new(path, @storage) }
|
18
|
+
end
|
19
|
+
|
14
20
|
def liquid
|
15
21
|
@liquid ||= @storage.files
|
16
22
|
.select { |path| LIQUID_REGEX.match?(path) }
|
@@ -43,7 +49,7 @@ module ThemeCheck
|
|
43
49
|
end
|
44
50
|
|
45
51
|
def all
|
46
|
-
@all ||= json + liquid
|
52
|
+
@all ||= json + liquid + assets
|
47
53
|
end
|
48
54
|
|
49
55
|
def [](name)
|
data/lib/theme_check/version.rb
CHANGED
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: 0.
|
4
|
+
version: 0.5.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-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -82,13 +82,41 @@ files:
|
|
82
82
|
- data/shopify_liquid/plus_objects.yml
|
83
83
|
- data/shopify_liquid/tags.yml
|
84
84
|
- dev.yml
|
85
|
+
- docs/checks/CHECK_DOCS_TEMPLATE.md
|
86
|
+
- docs/checks/asset_size_javascript.md
|
87
|
+
- docs/checks/convert_include_to_render.md
|
88
|
+
- docs/checks/default_locale.md
|
89
|
+
- docs/checks/deprecated_filter.md
|
90
|
+
- docs/checks/liquid_tag.md
|
91
|
+
- docs/checks/matching_schema_translations.md
|
92
|
+
- docs/checks/matching_translations.md
|
93
|
+
- docs/checks/missing_enable_comment.md
|
94
|
+
- docs/checks/missing_required_template_files.md
|
95
|
+
- docs/checks/missing_template.md
|
96
|
+
- docs/checks/nested_snippet.md
|
97
|
+
- docs/checks/parser_blocking_javascript.md
|
98
|
+
- docs/checks/required_directories.md
|
99
|
+
- docs/checks/required_layout_theme_object.md
|
100
|
+
- docs/checks/space_inside_braces.md
|
101
|
+
- docs/checks/syntax_error.md
|
102
|
+
- docs/checks/template_length.md
|
103
|
+
- docs/checks/translation_key_exists.md
|
104
|
+
- docs/checks/undefined_object.md
|
105
|
+
- docs/checks/unknown_filter.md
|
106
|
+
- docs/checks/unused_assign.md
|
107
|
+
- docs/checks/unused_snippet.md
|
108
|
+
- docs/checks/valid_html_translation.md
|
109
|
+
- docs/checks/valid_json.md
|
110
|
+
- docs/checks/valid_schema.md
|
85
111
|
- docs/preview.png
|
86
112
|
- exe/theme-check
|
87
113
|
- exe/theme-check-language-server
|
88
114
|
- lib/theme_check.rb
|
89
115
|
- lib/theme_check/analyzer.rb
|
116
|
+
- lib/theme_check/asset_file.rb
|
90
117
|
- lib/theme_check/check.rb
|
91
118
|
- lib/theme_check/checks.rb
|
119
|
+
- lib/theme_check/checks/asset_size_javascript.rb
|
92
120
|
- lib/theme_check/checks/convert_include_to_render.rb
|
93
121
|
- lib/theme_check/checks/default_locale.rb
|
94
122
|
- lib/theme_check/checks/deprecated_filter.rb
|
@@ -142,6 +170,8 @@ files:
|
|
142
170
|
- lib/theme_check/packager.rb
|
143
171
|
- lib/theme_check/parsing_helpers.rb
|
144
172
|
- lib/theme_check/printer.rb
|
173
|
+
- lib/theme_check/regex_helpers.rb
|
174
|
+
- lib/theme_check/remote_asset_file.rb
|
145
175
|
- lib/theme_check/shopify_liquid.rb
|
146
176
|
- lib/theme_check/shopify_liquid/deprecated_filter.rb
|
147
177
|
- lib/theme_check/shopify_liquid/filter.rb
|