theme-check 1.10.3 → 1.11.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. data/.github/workflows/cla.yml +22 -0
  5. data/.github/workflows/theme-check.yml +1 -1
  6. data/CHANGELOG.md +41 -0
  7. data/README.md +7 -8
  8. data/config/default.yml +4 -0
  9. data/data/shopify_liquid/filters.yml +18 -0
  10. data/dev.yml +1 -1
  11. data/docs/checks/asset_preload.md +60 -0
  12. data/docs/checks/asset_size_javascript.md +2 -2
  13. data/docs/checks/missing_enable_comment.md +3 -3
  14. data/docs/checks/nested_snippet.md +8 -8
  15. data/docs/checks/translation_key_exists.md +4 -4
  16. data/docs/checks/valid_html_translation.md +1 -1
  17. data/lib/theme_check/analyzer.rb +18 -3
  18. data/lib/theme_check/check.rb +6 -1
  19. data/lib/theme_check/checks/asset_preload.rb +20 -0
  20. data/lib/theme_check/checks/deprecated_filter.rb +29 -5
  21. data/lib/theme_check/checks/missing_enable_comment.rb +4 -0
  22. data/lib/theme_check/checks/missing_required_template_files.rb +5 -1
  23. data/lib/theme_check/checks/missing_template.rb +5 -1
  24. data/lib/theme_check/checks/unused_assign.rb +6 -1
  25. data/lib/theme_check/checks/unused_snippet.rb +50 -2
  26. data/lib/theme_check/config.rb +2 -2
  27. data/lib/theme_check/disabled_checks.rb +11 -4
  28. data/lib/theme_check/file_system_storage.rb +2 -0
  29. data/lib/theme_check/in_memory_storage.rb +1 -1
  30. data/lib/theme_check/language_server/bridge.rb +31 -6
  31. data/lib/theme_check/language_server/diagnostics_engine.rb +80 -34
  32. data/lib/theme_check/language_server/diagnostics_manager.rb +27 -6
  33. data/lib/theme_check/language_server/execute_command_providers/run_checks_execute_command_provider.rb +7 -6
  34. data/lib/theme_check/language_server/handler.rb +90 -8
  35. data/lib/theme_check/language_server/server.rb +42 -14
  36. data/lib/theme_check/language_server/versioned_in_memory_storage.rb +17 -2
  37. data/lib/theme_check/liquid_file.rb +22 -1
  38. data/lib/theme_check/liquid_node.rb +33 -1
  39. data/lib/theme_check/liquid_visitor.rb +1 -1
  40. data/lib/theme_check/schema_helper.rb +1 -1
  41. data/lib/theme_check/tags.rb +2 -1
  42. data/lib/theme_check/version.rb +1 -1
  43. data/theme-check.gemspec +2 -2
  44. metadata +10 -6
  45. data/.github/probots.yml +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c2774c1d3e2e9b8fa7dab0fdd4174dbfd3e625c608af349c30f526f00a6b9123
4
- data.tar.gz: 69bdb078be8aa938b2dec75a62206840586ae1a015620ec3c9ce727e49fc2e07
3
+ metadata.gz: 99089d8a9e02b33f55c11e18d0d0dea02f8b4b9be24f548c2ba4852823d54d2e
4
+ data.tar.gz: aa7c80503782d3817fe49fd4460ff565144339c19ea87a1ec9c516573116299f
5
5
  SHA512:
6
- metadata.gz: aa83efd1994e95fd12defc06b13567fac6e80fd830fb870f7a50b650424b8ed339848271ac35c608b6bc40a3e884665a3136c1f75e150be937be8b78e74df9fc
7
- data.tar.gz: 848e2752ecc6e6bb4b0954663dac298f869a191d0b4b146fd488b8a9a442a5573a1c716c84658b2654431f96db1572309c70991a2e29e37c1bf82bd337c79edd
6
+ metadata.gz: 99f92709c2d233e05f5ba79b9c83243fc3fe3cd0ce640c7b2444b24c7922f57e76d40910997fab8ac7aa10ffe553ae3fcfde68bc310e0330279f0bb4419bd9d8
7
+ data.tar.gz: 6e43b16af119f881d5ae36501d638b7bb1459fe4fdfe124f396338012d28b5e5c8f4ad9b28b8ab3e3afd83c92044391ae31af6ca3f3914f898501d08e7710ca3
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: bug
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ <!--A clear and concise description of what the bug is.-->
12
+
13
+ **Expected**
14
+ <!-- Include what you expect should happen here -->
15
+
16
+ **Actual**
17
+ <!-- Include a description of what actually happens here -->
18
+
19
+ **Stack trace**
20
+ ```
21
+ <!-- When provided, please include the entire error message in here -->
22
+ ```
23
+
24
+ **Debugging information**
25
+ - OS [e.g. Windows, Mac, Linux]
26
+ - Version (output of `theme-check --version` in a terminal)
27
+
28
+ **Additional context**
29
+ <!-- Add any other context or screenshots about the problem here. -->
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ <!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
12
+
13
+ **Describe the solution you'd like**
14
+ <!-- A clear and concise description of what you want to happen. -->
15
+
16
+ **Describe alternatives you've considered**
17
+ <!-- A clear and concise description of any alternative solutions or features you've considered. -->
18
+
19
+ **Additional context**
20
+ <!-- Add any other context or screenshots about the feature request here. -->
@@ -0,0 +1,22 @@
1
+ name: Contributor License Agreement (CLA)
2
+
3
+ on:
4
+ pull_request_target:
5
+ types: [opened, synchronize]
6
+ issue_comment:
7
+ types: [created]
8
+
9
+ jobs:
10
+ cla:
11
+ runs-on: ubuntu-latest
12
+ if: |
13
+ (github.event.issue.pull_request
14
+ && !github.event.issue.pull_request.merged_at
15
+ && contains(github.event.comment.body, 'signed')
16
+ )
17
+ || (github.event.pull_request && !github.event.pull_request.merged)
18
+ steps:
19
+ - uses: Shopify/shopify-cla-action@v1
20
+ with:
21
+ github-token: ${{ secrets.GITHUB_TOKEN }}
22
+ cla-token: ${{ secrets.CLA_TOKEN }}
@@ -13,7 +13,7 @@ jobs:
13
13
  - windows-latest
14
14
  version:
15
15
  - 3.0.0
16
- - 2.6.6
16
+ - 2.7.6
17
17
  theme:
18
18
  - Shopify/dawn
19
19
 
data/CHANGELOG.md CHANGED
@@ -1,4 +1,45 @@
1
1
 
2
+ v1.11.0 / 2022-08-22
3
+ ====================
4
+
5
+ ## TL;DR
6
+
7
+ * New check, overdue fixes and dropped support for ruby 2.6.
8
+
9
+ ## Features
10
+
11
+ * :new: [AssetPreload](https://github.com/Shopify/theme-check/blob/main/docs/checks/asset_preload.md) check ([#605](https://github.com/shopify/theme-check/issues/605)). Thanks @krzksz!
12
+ * Encourages the use of the new platform features for some sweet 103 Early Hints gains powered by the `preload_tag` and `preload: true` media filter argument.
13
+
14
+ ## Fixes:
15
+
16
+ ### General
17
+
18
+ * Add support for new comment syntax `{% # this is an inline comment %}` ([#533](https://github.com/shopify/theme-check/issues/533))
19
+ * Fix UnusedAssign false positives from `{% render ... with|for var %}` ([#608](https://github.com/shopify/theme-check/issues/608))
20
+ * Update list of platform filters ([#626](https://github.com/shopify/theme-check/issues/626))
21
+
22
+ ### Language Server
23
+
24
+ * Make `runChecks` command respect `onlySingleFileChecks` LSP config ([#624](https://github.com/shopify/theme-check/issues/624))
25
+ * Handle file delete|rename ([#611](https://github.com/shopify/theme-check/issues/611))
26
+ * Prevent server from hanging on error ([#623](https://github.com/shopify/theme-check/issues/623))
27
+
28
+ ### Linter
29
+
30
+ * Help migrate named sizes (master|pico|etc.) in `img_url` with `DeprecatedFilter` corrector ([#619](https://github.com/shopify/theme-check/issues/619))
31
+ * Fix MissingTemplate `ignore` config interactions (#613)
32
+ * Fix MissingRequiredTemplateFiles JSON file corrector ([#616](https://github.com/shopify/theme-check/issues/616))
33
+ * Fixes theme-check-disable when disable comment is followed by another (#617)
34
+ * Fix handling of `{% render block %}` in UnusedSnippet ([#615](https://github.com/shopify/theme-check/issues/615))
35
+ * Fix IndexError: string not matched in matching translation keys fixer ([#602](https://github.com/shopify/theme-check/issues/602))
36
+ * Handle variable lookup as names in UnusedAssign ([#612](https://github.com/shopify/theme-check/issues/612))
37
+
38
+ ## Breaking change (maybe)
39
+
40
+ * Bump min version of ruby to 2.7 ([#609](https://github.com/shopify/theme-check/issues/609))
41
+ * Upstream change from Shopify/liquid as ruby 2.6 is now EOL.
42
+
2
43
  v1.10.3 / 2022-06-16
3
44
  ==================
4
45
 
data/README.md CHANGED
@@ -115,32 +115,31 @@ See [config/default.yml](config/default.yml) for available options & defaults.
115
115
  Use Liquid comments to disable and re-enable all checks for a section of your template:
116
116
 
117
117
  ```liquid
118
- {% comment %}theme-check-disable{% endcomment %}
118
+ {% # theme-check-disable %}
119
119
  {% assign x = 1 %}
120
- {% comment %}theme-check-enable{% endcomment %}
120
+ {% # theme-check-enable %}
121
121
  ```
122
122
 
123
123
  Disable a specific check by including it in the comment:
124
124
 
125
125
  ```liquid
126
- {% comment %}theme-check-disable UnusedAssign{% endcomment %}
126
+ {% # theme-check-disable UnusedAssign %}
127
127
  {% assign x = 1 %}
128
- {% comment %}theme-check-enable UnusedAssign{% endcomment %}
128
+ {% # theme-check-enable UnusedAssign %}
129
129
  ```
130
130
 
131
131
  Disable multiple checks by including them as a comma-separated list:
132
132
 
133
133
  ```liquid
134
- {% comment %}theme-check-disable UnusedAssign,SpaceInsideBraces{% endcomment %}
134
+ {% # theme-check-disable UnusedAssign,SpaceInsideBraces %}
135
135
  {%assign x = 1%}
136
- {% comment %}theme-check-enable UnusedAssign,SpaceInsideBraces{% endcomment %}
136
+ {% # theme-check-enable UnusedAssign,SpaceInsideBraces %}
137
137
  ```
138
138
 
139
139
  Disable checks for the _entire document_ by placing the comment on the first line:
140
140
 
141
141
  ```liquid
142
- {% comment %}theme-check-disable SpaceInsideBraces{% endcomment %}
143
-
142
+ {% # theme-check-disable SpaceInsideBraces %}
144
143
  {%assign x = 1%}
145
144
  ```
146
145
 
data/config/default.yml CHANGED
@@ -131,6 +131,10 @@ ParserBlockingScriptTag:
131
131
  enabled: true
132
132
  ignore: []
133
133
 
134
+ AssetPreload:
135
+ enabled: true
136
+ ignore: []
137
+
134
138
  AssetSizeJavaScript:
135
139
  enabled: false
136
140
  threshold_in_bytes: 10_000
@@ -1,4 +1,20 @@
1
1
  ---
2
+ # Here's an example workflow that's going to get ya the list of filters available
3
+ # ```bash
4
+ # spin up storefront-renderer
5
+ # spin ssh
6
+ # cd storefront-renderer
7
+ # bundle exec rake console
8
+ # ```
9
+ # ```ruby
10
+ # Pathname(ENV["HOME"]).join('filters.yml').write(YAML.dump(Liquid::StrainerFactory.global_filter_names))
11
+ # ```
12
+ # ```bash
13
+ # exit
14
+ # scp $(spin show -o fqdn):/filters.yml .
15
+ # ```
16
+ # The list of filters is now in a file named filters.yml in your $(pwd).
17
+ # Note that it'll probably need a bit of massaging before including here...
2
18
  Liquid::StandardFilters:
3
19
  - times
4
20
  - h
@@ -19,7 +35,9 @@ Liquid::StandardFilters:
19
35
  - remove
20
36
  - sort_natural
21
37
  - replace_first
38
+ - replace_last
22
39
  - remove_first
40
+ - remove_last
23
41
  - newline_to_br
24
42
  - upcase
25
43
  - downcase
data/dev.yml CHANGED
@@ -3,7 +3,7 @@ name: theme-check
3
3
  type: ruby
4
4
 
5
5
  up:
6
- - ruby: 2.6.6
6
+ - ruby: "2.7"
7
7
  - bundler
8
8
 
9
9
  commands:
@@ -0,0 +1,60 @@
1
+ # Prevent Manual Preloading of Assets (`AssetPreload`)
2
+
3
+ _Version 1.11.0+_
4
+
5
+ Preloading can be a useful way of making sure that critical assets are downloaded by the browser as soon as possible for better rendering performance.
6
+
7
+ Liquid provides multiple filters to [preload key resources][preload_key_resources] so they can be converted into `Link` headers automatically. This enables them to be discovered even faster, especially when combined with Early Hints that Shopify supports.
8
+
9
+ ## Examples
10
+
11
+ The following examples contain code snippets that either fail or pass this check.
12
+
13
+ ### &#x2717; Fail
14
+
15
+ ```liquid
16
+ <link href="{{ 'script.js' | asset_url }}" rel="preload" as="script">
17
+ <link href="{{ 'style.css' | asset_url }}" rel="preload" as="style">
18
+ <link href="{{ 'image.png' | asset_url }}" rel="preload" as="image">
19
+ ```
20
+
21
+ ### &#x2713; Pass
22
+
23
+ ```liquid
24
+ {{ 'script.js' | asset_url | preload_tag: as: 'script' }}
25
+ {{ 'style.css' | asset_url | stylesheet_tag: preload: true }}
26
+ {{
27
+ product.featured_image
28
+ | image_url: width: 600
29
+ | image_tag: preload: true
30
+ }}
31
+ ```
32
+
33
+ ## Options
34
+
35
+ The following example contains the default configuration for this check:
36
+
37
+ ```yaml
38
+ AssetPreload:
39
+ enabled: true
40
+ severity: suggestion
41
+ ```
42
+
43
+ | Parameter | Description |
44
+ | --- | --- |
45
+ | enabled | Whether the check is enabled. |
46
+ | severity | The [severity](https://shopify.dev/themes/tools/theme-check/configuration#check-severity) of the check. |
47
+
48
+ ## Disabling this check
49
+
50
+ It's safe to disable this rule. You may want to do it when trying to preload assets from external domain and it is not possible
51
+ to move them to Shopify because they change frequently or are dynamically generated.
52
+
53
+ ## Resources
54
+
55
+ - [Rule source][codesource]
56
+ - [Documentation source][docsource]
57
+
58
+ [codesource]: /lib/theme_check/checks/asset_preload.rb
59
+ [docsource]: /docs/checks/asset_preload.md
60
+ [preload_key_resources]: https://shopify.dev/themes/best-practices/performance#use-resource-hints-to-preload-key-resources
@@ -57,9 +57,9 @@ This includes theme and remote scripts.
57
57
  When you can't do anything about it, it is preferable to disable this rule using the comment syntax:
58
58
 
59
59
  ```
60
- {% comment %}theme-check-disable AssetSizeJavaScript{% endcomment %}
60
+ {% # theme-check-disable AssetSizeJavaScript %}
61
61
  <script src="https://code.jquery.com/jquery-3.6.0.min.js" defer></script>
62
- {% comment %}theme-check-enable AssetSizeJavaScript{% endcomment %}
62
+ {% # theme-check-enable AssetSizeJavaScript %}
63
63
  ```
64
64
 
65
65
  This makes disabling the rule an explicit affair and shows that the code is smelly.
@@ -12,7 +12,7 @@ This check aims at eliminating missing `theme-check-enable` comments.
12
12
  <!doctype html>
13
13
  <html>
14
14
  <head>
15
- {% comment %}theme-check-disable ParserBlockingJavaScript{% endcomment %}
15
+ {% # theme-check-disable ParserBlockingJavaScript %}
16
16
  <script src="https://cdnjs.com/jquery.min.js"></script>
17
17
  </head>
18
18
  <body>
@@ -27,9 +27,9 @@ This check aims at eliminating missing `theme-check-enable` comments.
27
27
  <!doctype html>
28
28
  <html>
29
29
  <head>
30
- {% comment %}theme-check-disable ParserBlockingJavaScript{% endcomment %}
30
+ {% # theme-check-disable ParserBlockingJavaScript %}
31
31
  <script src="https://cdnjs.com/jquery.min.js"></script>
32
- {% comment %}theme-check-enable ParserBlockingJavaScript{% endcomment %}
32
+ {% # theme-check-enable ParserBlockingJavaScript %}
33
33
  </head>
34
34
  <body>
35
35
  <!-- ... -->
@@ -9,32 +9,32 @@ This check is aimed at eliminating excessive nesting of snippets.
9
9
  :-1: Examples of **incorrect** code for this check:
10
10
 
11
11
  ```liquid
12
- {% comment %}templates/index.liquid{% endcomment %}
12
+ {% # templates/index.liquid %}
13
13
  {% render 'one' %}
14
14
 
15
- {% comment %}snippets/one.liquid{% endcomment %}
15
+ {% # snippets/one.liquid %}
16
16
  {% render 'two' %}
17
17
 
18
- {% comment %}snippets/two.liquid{% endcomment %}
18
+ {% # snippets/two.liquid %}
19
19
  {% render 'three' %}
20
20
 
21
- {% comment %}snippets/three.liquid{% endcomment %}
21
+ {% # snippets/three.liquid %}
22
22
  {% render 'four' %}
23
23
 
24
- {% comment %}snippets/four.liquid{% endcomment %}
24
+ {% # snippets/four.liquid %}
25
25
  ok
26
26
  ```
27
27
 
28
28
  :+1: Examples of **correct** code for this check:
29
29
 
30
30
  ```liquid
31
- {% comment %}templates/index.liquid{% endcomment %}
31
+ {% # templates/index.liquid %}
32
32
  {% render 'one' %}
33
33
 
34
- {% comment %}snippets/one.liquid{% endcomment %}
34
+ {% # snippets/one.liquid %}
35
35
  {% render 'two' %}
36
36
 
37
- {% comment %}snippets/two.liquid{% endcomment %}
37
+ {% # snippets/two.liquid %}
38
38
  ok
39
39
  ```
40
40
 
@@ -9,7 +9,7 @@ This check is aimed at eliminating the use of translations that do not exist.
9
9
  :-1: Examples of **incorrect** code for this check:
10
10
 
11
11
  ```liquid
12
- {% comment %}locales/en.default.json{% endcomment %}
12
+ {% # locales/en.default.json %}
13
13
  {
14
14
  "greetings": "Hello, world!",
15
15
  "general": {
@@ -17,14 +17,14 @@ This check is aimed at eliminating the use of translations that do not exist.
17
17
  }
18
18
  }
19
19
 
20
- {% comment %}templates/index.liquid{% endcomment %}
20
+ {% # templates/index.liquid %}
21
21
  {{ "notfound" | t }}
22
22
  ```
23
23
 
24
24
  :+1: Examples of **correct** code for this check:
25
25
 
26
26
  ```liquid
27
- {% comment %}locales/en.default.json{% endcomment %}
27
+ {% # locales/en.default.json %}
28
28
  {
29
29
  "greetings": "Hello, world!",
30
30
  "general": {
@@ -32,7 +32,7 @@ This check is aimed at eliminating the use of translations that do not exist.
32
32
  }
33
33
  }
34
34
 
35
- {% comment %}templates/index.liquid{% endcomment %}
35
+ {% # templates/index.liquid %}
36
36
  {{ "greetings" | t }}
37
37
  {{ "general.close" | t }}
38
38
  ```
@@ -18,7 +18,7 @@ This check is aimed at eliminating invalid HTML in translations.
18
18
  :+1: Examples of **correct** code for this check:
19
19
 
20
20
  ```liquid
21
- {% comment %}locales/en.default.json{% endcomment %}
21
+ {% # locales/en.default.json %}
22
22
  {
23
23
  "hello_html": "<h1>Hello, world</h1>",
24
24
  "image_html": "<img src='spongebob.png'>",
@@ -41,6 +41,7 @@ module ThemeCheck
41
41
  json_file_count + liquid_file_count
42
42
  end
43
43
 
44
+ # Returns all offenses for all files in theme
44
45
  def analyze_theme
45
46
  reset
46
47
 
@@ -60,9 +61,23 @@ module ThemeCheck
60
61
  @json_checks.call(:on_file, json_file)
61
62
  end
62
63
 
63
- finish
64
+ finish(false)
65
+
66
+ offenses
64
67
  end
65
68
 
69
+ # When only_single_file is false:
70
+ # Runs single file checks for each file in `files`
71
+ # Runs whole theme checks
72
+ # Returns single file checks offenses for file in `files` + whole theme checks
73
+ # When only_single_file is true:
74
+ # Runs single file checks for each file in `files`
75
+ # Does not run whole theme checks
76
+ # Returns single file checks offenses for file in `files`
77
+ # When files is empty and only_single_file is false:
78
+ # Only returns whole theme checks
79
+ # When files is empty and only_single_file is true:
80
+ # Returns empty array
66
81
  def analyze_files(files, only_single_file: false)
67
82
  reset
68
83
 
@@ -103,6 +118,8 @@ module ThemeCheck
103
118
  end
104
119
 
105
120
  finish(only_single_file)
121
+
122
+ offenses
106
123
  end
107
124
 
108
125
  def uncorrectable_offenses
@@ -158,8 +175,6 @@ module ThemeCheck
158
175
  @disabled_checks.remove_disabled_offenses(@liquid_checks)
159
176
  @disabled_checks.remove_disabled_offenses(@json_checks)
160
177
  @disabled_checks.remove_disabled_offenses(@html_checks)
161
-
162
- offenses
163
178
  end
164
179
  end
165
180
  end
@@ -6,7 +6,8 @@ module ThemeCheck
6
6
  include JsonHelpers
7
7
 
8
8
  attr_accessor :theme
9
- attr_accessor :options, :ignored_patterns
9
+ attr_accessor :options
10
+ attr_writer :ignored_patterns
10
11
  attr_writer :offenses
11
12
 
12
13
  # The order matters.
@@ -130,6 +131,10 @@ module ThemeCheck
130
131
  defined?(@ignored) && @ignored
131
132
  end
132
133
 
134
+ def ignored_patterns
135
+ @ignored_patterns ||= []
136
+ end
137
+
133
138
  def can_disable?
134
139
  self.class.can_disable
135
140
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ module ThemeCheck
3
+ class AssetPreload < HtmlCheck
4
+ severity :suggestion
5
+ categories :html, :performance
6
+ doc docs_url(__FILE__)
7
+
8
+ def on_link(node)
9
+ return if node.attributes["rel"]&.downcase != "preload"
10
+ case node.attributes["as"]&.downcase
11
+ when "style"
12
+ add_offense("For better performance, prefer using the preload argument of the stylesheet_tag filter", node: node)
13
+ when "image"
14
+ add_offense("For better performance, prefer using the preload argument of the image_tag filter", node: node)
15
+ else
16
+ add_offense("For better performance, prefer using the preload_tag filter", node: node)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module ThemeCheck
3
4
  class DeprecatedFilter < LiquidCheck
4
5
  doc docs_url(__FILE__)
@@ -8,6 +9,19 @@ module ThemeCheck
8
9
  # The image_url filter does not accept width or height values
9
10
  # greater than this numbr.
10
11
  MAX_SIZE = 5760
12
+ SIZE_REGEX = /^\d*x\d*$/
13
+ NAMED_SIZES = {
14
+ "pico" => 16,
15
+ "icon" => 32,
16
+ "thumb" => 50,
17
+ "small" => 100,
18
+ "compact" => 160,
19
+ "medium" => 240,
20
+ "large" => 480,
21
+ "grande" => 600,
22
+ "original" => 1024,
23
+ "master" => nil,
24
+ }
11
25
 
12
26
  def on_variable(node)
13
27
  used_filters = node.filters.map { |name, *_rest| name }
@@ -40,19 +54,29 @@ module ThemeCheck
40
54
 
41
55
  # Can't correct those.
42
56
  return add_default_offense(node, 'img_url', ['image_url']) unless
43
- (size_spec.nil? || size_spec.is_a?(String)) &&
44
- (scale.nil? || scale.is_a?(Numeric)) &&
45
- size_spec != 'small'
57
+ (size_spec.nil? || size_spec.is_a?(String)) &&
58
+ (scale.nil? || scale.is_a?(Numeric))
59
+
60
+ return add_default_offense(node, 'img_url', ['image_url']) if
61
+ size_spec.is_a?(String) &&
62
+ size_spec !~ SIZE_REGEX &&
63
+ !NAMED_SIZES.key?(size_spec)
46
64
 
47
65
  node_source = node.markup
66
+
48
67
  node_start_index = node.start_index
49
68
  match = node_source.match(/img_url[^|]*/)
50
69
  img_url_character_range =
51
70
  (node_start_index + match.begin(0))...(node_start_index + match.end(0))
52
71
 
53
72
  scale = (scale || 1).to_i
54
- width, height = (size_spec&.split('x') || [100, 100])
55
- .map { |v| v.to_i * scale }
73
+ width, height = if size_spec.nil?
74
+ [100, 100]
75
+ elsif NAMED_SIZES.key?(size_spec)
76
+ [NAMED_SIZES[size_spec], NAMED_SIZES[size_spec]]
77
+ else
78
+ size_spec.split('x')
79
+ end.map { |v| v.to_i * scale }
56
80
 
57
81
  image_url_filter_params = [
58
82
  width && width > 0 ? "width: #{[width, MAX_SIZE].min}" : nil,
@@ -16,6 +16,10 @@ module ThemeCheck
16
16
  @disabled_checks.update(node)
17
17
  end
18
18
 
19
+ def on_inline_comment(node)
20
+ @disabled_checks.update(node)
21
+ end
22
+
19
23
  def after_document(node)
20
24
  checks_missing_end_index = @disabled_checks.checks_missing_end_index
21
25
  return if checks_missing_end_index.empty?
@@ -33,7 +33,11 @@ module ThemeCheck
33
33
  if REQUIRED_LIQUID_TEMPLATE_FILES.include?(file)
34
34
  corrector.create_file(@theme.storage, "#{file}.liquid", "")
35
35
  else
36
- corrector.create_file(@theme.storage, "#{file}.json", "")
36
+ corrector.create_file(@theme.storage, "#{file}.json", JSON.pretty_generate({
37
+ name: "TODO",
38
+ sections: {},
39
+ order: [],
40
+ }))
37
41
  end
38
42
  end
39
43
  end
@@ -28,7 +28,11 @@ module ThemeCheck
28
28
  private
29
29
 
30
30
  def ignore?(path)
31
- @ignore_missing.any? { |pattern| File.fnmatch?(pattern, path) }
31
+ all_ignored_patterns.any? { |pattern| File.fnmatch?(pattern, path) }
32
+ end
33
+
34
+ def all_ignored_patterns
35
+ @all_ignored_patterns ||= @ignore_missing + ignored_patterns
32
36
  end
33
37
 
34
38
  def add_missing_offense(name, node:)
@@ -39,7 +39,12 @@ module ThemeCheck
39
39
  end
40
40
 
41
41
  def on_variable_lookup(node)
42
- @templates[node.theme_file.name].used_assigns << node.value.name
42
+ @templates[node.theme_file.name].used_assigns << case node.value.name
43
+ when Liquid::VariableLookup
44
+ node.value.name.name
45
+ else
46
+ node.value.name
47
+ end
43
48
  end
44
49
 
45
50
  def on_end