theme-check 0.3.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.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -0
  3. data/CHANGELOG.md +50 -0
  4. data/CONTRIBUTING.md +5 -2
  5. data/README.md +9 -4
  6. data/RELEASING.md +2 -2
  7. data/config/default.yml +7 -0
  8. data/data/shopify_liquid/tags.yml +27 -0
  9. data/docs/checks/CHECK_DOCS_TEMPLATE.md +47 -0
  10. data/docs/checks/asset_size_javascript.md +79 -0
  11. data/docs/checks/convert_include_to_render.md +48 -0
  12. data/docs/checks/default_locale.md +46 -0
  13. data/docs/checks/deprecated_filter.md +46 -0
  14. data/docs/checks/liquid_tag.md +65 -0
  15. data/docs/checks/matching_schema_translations.md +93 -0
  16. data/docs/checks/matching_translations.md +72 -0
  17. data/docs/checks/missing_enable_comment.md +50 -0
  18. data/docs/checks/missing_required_template_files.md +26 -0
  19. data/docs/checks/missing_template.md +40 -0
  20. data/docs/checks/nested_snippet.md +69 -0
  21. data/docs/checks/parser_blocking_javascript.md +97 -0
  22. data/docs/checks/required_directories.md +25 -0
  23. data/docs/checks/required_layout_theme_object.md +28 -0
  24. data/docs/checks/space_inside_braces.md +63 -0
  25. data/docs/checks/syntax_error.md +49 -0
  26. data/docs/checks/template_length.md +50 -0
  27. data/docs/checks/translation_key_exists.md +63 -0
  28. data/docs/checks/undefined_object.md +53 -0
  29. data/docs/checks/unknown_filter.md +45 -0
  30. data/docs/checks/unused_assign.md +47 -0
  31. data/docs/checks/unused_snippet.md +32 -0
  32. data/docs/checks/valid_html_translation.md +53 -0
  33. data/docs/checks/valid_json.md +60 -0
  34. data/docs/checks/valid_schema.md +50 -0
  35. data/lib/theme_check.rb +4 -0
  36. data/lib/theme_check/asset_file.rb +34 -0
  37. data/lib/theme_check/check.rb +19 -9
  38. data/lib/theme_check/checks/asset_size_javascript.rb +74 -0
  39. data/lib/theme_check/checks/convert_include_to_render.rb +1 -1
  40. data/lib/theme_check/checks/default_locale.rb +1 -0
  41. data/lib/theme_check/checks/deprecated_filter.rb +1 -1
  42. data/lib/theme_check/checks/liquid_tag.rb +3 -3
  43. data/lib/theme_check/checks/matching_schema_translations.rb +1 -0
  44. data/lib/theme_check/checks/matching_translations.rb +1 -0
  45. data/lib/theme_check/checks/missing_enable_comment.rb +1 -0
  46. data/lib/theme_check/checks/missing_required_template_files.rb +1 -2
  47. data/lib/theme_check/checks/missing_template.rb +1 -0
  48. data/lib/theme_check/checks/nested_snippet.rb +1 -0
  49. data/lib/theme_check/checks/parser_blocking_javascript.rb +2 -1
  50. data/lib/theme_check/checks/required_directories.rb +1 -1
  51. data/lib/theme_check/checks/required_layout_theme_object.rb +1 -1
  52. data/lib/theme_check/checks/space_inside_braces.rb +1 -0
  53. data/lib/theme_check/checks/syntax_error.rb +1 -0
  54. data/lib/theme_check/checks/template_length.rb +1 -0
  55. data/lib/theme_check/checks/translation_key_exists.rb +1 -0
  56. data/lib/theme_check/checks/undefined_object.rb +29 -10
  57. data/lib/theme_check/checks/unknown_filter.rb +1 -0
  58. data/lib/theme_check/checks/unused_assign.rb +5 -3
  59. data/lib/theme_check/checks/unused_snippet.rb +1 -0
  60. data/lib/theme_check/checks/valid_html_translation.rb +1 -0
  61. data/lib/theme_check/checks/valid_json.rb +1 -0
  62. data/lib/theme_check/checks/valid_schema.rb +1 -0
  63. data/lib/theme_check/cli.rb +22 -6
  64. data/lib/theme_check/config.rb +2 -2
  65. data/lib/theme_check/in_memory_storage.rb +1 -1
  66. data/lib/theme_check/language_server.rb +10 -0
  67. data/lib/theme_check/language_server/completion_engine.rb +38 -0
  68. data/lib/theme_check/language_server/completion_helper.rb +25 -0
  69. data/lib/theme_check/language_server/completion_provider.rb +24 -0
  70. data/lib/theme_check/language_server/completion_providers/filter_completion_provider.rb +47 -0
  71. data/lib/theme_check/language_server/completion_providers/object_completion_provider.rb +31 -0
  72. data/lib/theme_check/language_server/completion_providers/tag_completion_provider.rb +31 -0
  73. data/lib/theme_check/language_server/handler.rb +62 -6
  74. data/lib/theme_check/language_server/position_helper.rb +27 -0
  75. data/lib/theme_check/language_server/protocol.rb +41 -0
  76. data/lib/theme_check/language_server/server.rb +6 -1
  77. data/lib/theme_check/language_server/tokens.rb +55 -0
  78. data/lib/theme_check/offense.rb +51 -14
  79. data/lib/theme_check/regex_helpers.rb +15 -0
  80. data/lib/theme_check/remote_asset_file.rb +44 -0
  81. data/lib/theme_check/shopify_liquid.rb +1 -0
  82. data/lib/theme_check/shopify_liquid/tag.rb +16 -0
  83. data/lib/theme_check/theme.rb +7 -1
  84. data/lib/theme_check/version.rb +1 -1
  85. metadata +44 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a07597b217b1f596cd5e777726950e396934726f3572bc7660129bec2b3b30c8
4
- data.tar.gz: 80e54966286e332f3308021b9347feb4cdb683497991b9bb451dcf58f138a2df
3
+ metadata.gz: 7beb3a827afcd22a262b82b436ed03a7130a1237ab11351bf4e1b36769c62d1a
4
+ data.tar.gz: a92529eac6dcaa689b708ecfda3e53a6b132e61ae01f26ae3ebb0bf3ec03e962
5
5
  SHA512:
6
- metadata.gz: 4c7a1c159dd1b688618c95e1e5fb943a133b606878f57c91b12e5793b07022325c5cfb2e81c49cb45ea484cb3688c6f7c2b75af1b2a50f13da6db2ba0e8b0bb3
7
- data.tar.gz: 83fe6a74375ecf2b58f14681c99bc672a710cd6bbc70cb5f58ff06332d4123171544f6cf73c6e7f5f750c1a870d17de0ce3bd3e1f9cbfca6e1bdc7fceb767b80
6
+ metadata.gz: dd4554837884b203c2bca10cdbd09e29d0f485d814c8aff72d8680d1d7f44e82e8bef74b192953aba8a61622434ff3f466a24109f6eb3bee83500585f462672f
7
+ data.tar.gz: 75ece7d25c463748ae1d810920b488e732e50602988f3dd40bccb25a649af4d9336d4a3dc12310dbb1b53e1492728f8900da1050759e43e826457991f0bf6a11
data/.rubocop.yml CHANGED
@@ -7,6 +7,7 @@ AllCops:
7
7
  TargetRubyVersion: 2.7
8
8
  Exclude:
9
9
  - 'vendor/bundle/**/*'
10
+ - 'packaging/builds/**/*'
10
11
 
11
12
  Metrics/MethodLength:
12
13
  Enabled: false
@@ -16,3 +17,9 @@ Layout/LineLength:
16
17
 
17
18
  Lint/MissingSuper:
18
19
  Enabled: false
20
+
21
+ Style/StringLiterals:
22
+ Enabled: false
23
+
24
+ Style/StringLiteralsInInterpolation:
25
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,50 @@
1
+
2
+ 0.5.0 / 2021-03-12
3
+ ==================
4
+
5
+ * Add [AssetSizeJavaScript](/docs/checks/asset_size_javascript.md) check ([#194](https://github.com/Shopify/theme-check/pull/194))
6
+ * Add [documentation for all checks](/docs/checks)
7
+ * Make documentation for checks mandatory
8
+ * Add link to documentation from within the editor (via `codeDescription` in the Language Server) (![Demo](https://screenshot.click/10-29-cjx7r-4asor.mp4))
9
+ * Allow checks to have multiple categories
10
+ * Fix multiple occurrences of UndefinedObject not being reported ([#192](https://github.com/shopify/theme-check/issues/192))
11
+
12
+ v0.4.0 / 2021-02-25
13
+ ==================
14
+
15
+ * Add Completion Engine ([#161](https://github.com/shopify/theme-check/issues/161))
16
+ * Add init command to CLI ([#174](https://github.com/shopify/theme-check/issues/174))
17
+ * Refactor start and end Position logic ([#172](https://github.com/shopify/theme-check/issues/172))
18
+
19
+ v0.3.3 / 2021-02-18
20
+ ==================
21
+
22
+ * Fix column_end issues ([#164](https://github.com/Shopify/theme-check/issues/164))
23
+ * Fix stack overflow in UndefinedObject + UnusedAssign when snippets renders itself ([#165](https://github.com/Shopify/theme-check/issues/165))
24
+
25
+ v0.3.2 / 2021-02-17
26
+ ==================
27
+
28
+ * Ignore snippets in UndefinedObject check
29
+
30
+ v0.3.1 / 2021-02-16
31
+ ===================
32
+
33
+ * Fixup version flag
34
+
35
+ v0.3.0 / 2021-02-16
36
+ ===================
37
+
38
+ * Add ParserBlockingJavaScript Check ([#78](https://github.com/Shopify/theme-check/issues/78), [#146](https://github.com/Shopify/theme-check/issues/146))
39
+ * Internal refactor to enable running theme-check in servers ([#145](https://github.com/Shopify/theme-check/issues/145), [#148](https://github.com/Shopify/theme-check/issues/148))
40
+ * Add -v, --version flag ([#126](https://github.com/Shopify/theme-check/issues/126))
41
+ * Exclude content of {% schema %} in line count for TemplateLength ([#140](https://github.com/Shopify/theme-check/issues/140))
42
+ * Fix Language Server removed files bug ([#136](https://github.com/Shopify/theme-check/issues/136))
43
+ * Add ignore config ([#147](https://github.com/Shopify/theme-check/issues/147))
44
+ * Add ability to disable checks with comments ([#79](https://github.com/Shopify/theme-check/issues/79))
45
+ * Adding checks for shopify plus objects in checkout ([#121](https://github.com/Shopify/theme-check/issues/121))
46
+
47
+ v0.2.2 / 2021-01-22
48
+ ===================
49
+
50
+ * [Language Server] Send empty dianogstics to flush errors
data/CONTRIBUTING.md CHANGED
@@ -44,7 +44,6 @@ module ThemeCheck
44
44
  # NOTE: inherit from JsonCheck to implement a JSON based check.
45
45
  class MyCheckName < LiquidCheck
46
46
  severity :suggestion # :error or :style
47
- doc "https://..." # Optional link to doc
48
47
 
49
48
  def on_document(node)
50
49
  # Called with the root node of all templates
@@ -122,7 +121,7 @@ module ThemeCheck
122
121
  end
123
122
  ```
124
123
 
125
- Add the new check to `config/default.yml` to enable it.
124
+ Add the new check to `config/default.yml` to enable it. If the check is configurable, the `initialize` argument name and default values should also be duplicated inside `config/default.yml`.
126
125
 
127
126
  ```yaml
128
127
  MyCheckName:
@@ -131,4 +130,8 @@ MyCheckName:
131
130
 
132
131
  Add a corresponding test file under `test/checks`.
133
132
 
133
+ Add a documentation file in `docs/checks/#{name_of_check}.md` based off of the [check documentation template][doctemplate].
134
+
134
135
  When done, run the tests with `dev test`.
136
+
137
+ [doctemplate]: /docs/checks/CHECK_DOCS_TEMPLATE.md
data/README.md CHANGED
@@ -8,8 +8,6 @@ Theme Check is also available [inside some code editors](https://github.com/Shop
8
8
 
9
9
  ![](docs/preview.png)
10
10
 
11
- _Disclaimer: This tool is not supported as part of the Partners program._
12
-
13
11
  ## Supported Checks
14
12
 
15
13
  Theme Check currently checks for the following:
@@ -34,7 +32,14 @@ Theme Check currently checks for the following:
34
32
  ✅ Deprecated filters
35
33
  ✅ Missing `theme-check-enable` comment
36
34
 
37
- And many more to come! Suggestions welcome ([create an issue](https://github.com/Shopify/theme-check/issues)).
35
+ As well as checks that prevent easy to spot performance problems:
36
+
37
+ ✅ Use of [parser-blocking](/docs/checks/parser_blocking_javascript.md) JavaScript
38
+ ✅ [Too much JavaScript](/docs/checks/asset_size_javascript.md)
39
+
40
+ For detailed descriptions and configuration options, [take a look at the complete list.](/docs/checks/)
41
+
42
+ With more to come! Suggestions welcome ([create an issue](https://github.com/Shopify/theme-check/issues)).
38
43
 
39
44
  ## Requirements
40
45
 
@@ -89,7 +94,7 @@ TemplateLength:
89
94
  enabled: false
90
95
  # Or configure options
91
96
  max_length: 300
92
-
97
+
93
98
  # Enable a custom check
94
99
  MyCustomCheck
95
100
  enabled: true
data/RELEASING.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  1. Check the Semantic Versioning page for info on how to version the new release: http://semver.org
4
4
 
5
- 2. Create a PR to update the version in `lib/theme_check/version.rb`
5
+ 2. Create a PR to update the version in `lib/theme_check/version.rb` and replace the `THEME_CHECK_VERSION` placeholder in the documentation for new rules.
6
6
 
7
7
  3. Merge your PR to master
8
8
 
@@ -22,7 +22,7 @@
22
22
 
23
23
  ```bash
24
24
  VERSION=X.X.X
25
- cp packaging/builds/$VERSION/theme-check ../homebrew-shopify
25
+ cp packaging/builds/$VERSION/theme-check.rb ../homebrew-shopify
26
26
  ```
27
27
 
28
28
  4. Create a branch + a commit on the [`homebrew-shopify`](https://github.com/Shopify/homebrew-shopify) repository.
data/config/default.yml CHANGED
@@ -10,12 +10,14 @@ ConvertIncludeToRender:
10
10
 
11
11
  LiquidTag:
12
12
  enabled: true
13
+ min_consecutive_statements: 4
13
14
 
14
15
  MissingTemplate:
15
16
  enabled: true
16
17
 
17
18
  NestedSnippet:
18
19
  enabled: true
20
+ max_nesting_level: 2
19
21
 
20
22
  RequiredLayoutThemeObject:
21
23
  enabled: true
@@ -67,6 +69,7 @@ MissingRequiredTemplateFiles:
67
69
 
68
70
  UndefinedObject:
69
71
  enabled: true
72
+ exclude_snippets: true
70
73
 
71
74
  RequiredDirectories:
72
75
  enabled: true
@@ -79,3 +82,7 @@ MissingEnableComment:
79
82
 
80
83
  ParserBlockingJavaScript:
81
84
  enabled: true
85
+
86
+ AssetSizeJavaScript:
87
+ enabled: false
88
+ threshold_in_bytes: 10000
@@ -0,0 +1,27 @@
1
+ ---
2
+ - assign
3
+ - break
4
+ - capture
5
+ - case
6
+ - comment
7
+ - continue
8
+ - cycle
9
+ - decrement
10
+ - echo
11
+ - for
12
+ - form
13
+ - if
14
+ - ifchanged
15
+ - increment
16
+ - javascript
17
+ - layout
18
+ - liquid
19
+ - paginate
20
+ - raw
21
+ - render
22
+ - schema
23
+ - section
24
+ - style
25
+ - stylesheet
26
+ - tablerow
27
+ - unless
@@ -0,0 +1,47 @@
1
+ # Check Title (`CheckClassName`)
2
+
3
+ A brief paragraph explaining why the check exists.
4
+
5
+ ## Check Details
6
+
7
+ This check is aimed at eliminating ...
8
+
9
+ :-1: Examples of **incorrect** code for this check:
10
+
11
+ ```liquid
12
+ ```
13
+
14
+ :+1: Examples of **correct** code for this check:
15
+
16
+ ```liquid
17
+ ```
18
+
19
+ ## Check Options
20
+
21
+ The default configuration for this check is the following:
22
+
23
+ ```yaml
24
+ CheckClassName:
25
+ enabled: true
26
+ some_option: 10
27
+ ```
28
+
29
+ ### `some_option`
30
+
31
+ The `some_option` option (Default: `10`) determines ...
32
+
33
+ ## When Not To Use It
34
+
35
+ If you don't want to ..., then it's safe to disable this rule.
36
+
37
+ ## Version
38
+
39
+ This check has been introduced in Theme Check X.X.X.
40
+
41
+ ## Resources
42
+
43
+ - [Rule Source][codesource]
44
+ - [Documentation Source][docsource]
45
+
46
+ [codesource]: /lib/theme_check/checks/check_class_name.rb
47
+ [docsource]: /docs/checks/check_class_name.md
@@ -0,0 +1,79 @@
1
+ # Prevent JavaScript Abuse on Server Rendered Themes (`AssetSizeJavaScript`)
2
+
3
+ For server rendered pages, it is an anti-pattern to execute large JavaScript bundles on every navigation.
4
+
5
+ This doesn't mean they don't have a reason to exist. For instance, chat widgets are mini applications embedded inside web pages. Designing such an app with server rendered updates would be absurd. However, if only 10% of the users interact with the chat widget, the other 90% should not have to execute the entire bundle on every page load.
6
+
7
+ The natural solution to this problem is to implement the chat widget using the [Import on Interaction Pattern][ioip].
8
+
9
+ ## Check Details
10
+
11
+ This rule disallows the use of theme JavaScript files and external scripts to have a compressed size greater than a configured `threshold_in_bytes`.
12
+
13
+ :-1: Examples of **incorrect** code for this check:
14
+ ```liquid
15
+ <!-- Here assets/chat-widget.js is more than 10KB gzipped. -->
16
+ <script src="{{ 'chat-widget.js' | asset_url }}" defer></script>
17
+
18
+ <!-- The use of jQuery is discouraged in themes -->
19
+ <script src="https://code.jquery.com/jquery-3.6.0.min.js" defer></script>
20
+ ```
21
+
22
+ :+1: Example of **correct** code for this check:
23
+ ```liquid
24
+ <script>
25
+ const chatWidgetButton = document.getElementById('#chat-widget')
26
+
27
+ chatWidgetButton.addEventListener('click', e => {
28
+ e.preventDefault();
29
+ import("{{ 'chat-widget.js' | asset_url }}")
30
+ .then(module => module.default)
31
+ .then(ChatWidget => ChatWidget.init())
32
+ .catch(err => {
33
+ console.error(err);
34
+ });
35
+ });
36
+ </script>
37
+ ```
38
+
39
+ ## Check Options
40
+
41
+ The default configuration is the following.
42
+
43
+ ```yaml
44
+ AssetSizeJavaScript:
45
+ enabled: false
46
+ threshold_in_bytes: 10000
47
+ ```
48
+
49
+ ### `threshold_in_bytes`
50
+
51
+ The `threshold_in_bytes` option (default: `10000`) determines the maximum allowed compressed size in bytes that a single JavaScript file can take.
52
+
53
+ This includes theme and remote scripts.
54
+
55
+ ## When Not To Use It
56
+
57
+ When you can't do anything about it, it is preferable to disable this rule using the comment syntax:
58
+
59
+ ```
60
+ {% comment %}theme-check-disable AssetSizeJavaScript{% endcomment %}
61
+ <script src="https://code.jquery.com/jquery-3.6.0.min.js" defer></script>
62
+ {% comment %}theme-check-enable AssetSizeJavaScript{% endcomment %}
63
+ ```
64
+
65
+ This makes disabling the rule an explicit affair and shows that the code is smelly.
66
+
67
+ ## Version
68
+
69
+ This check has been introduced in Theme Check 0.5.0.
70
+
71
+ ## Resources
72
+
73
+ - [The Import On Interaction Pattern][ioip]
74
+ - [Rule Source][codesource]
75
+ - [Documentation Source][docsource]
76
+
77
+ [ioip]: https://addyosmani.com/blog/import-on-interaction/
78
+ [codesource]: /lib/theme_check/checks/asset_size_javascript.rb
79
+ [docsource]: /docs/checks/asset_size_javascript.md
@@ -0,0 +1,48 @@
1
+ # Discourage the use of `include` (`ConvertIncludeToRender`)
2
+
3
+ The `include` tag is [deprecated][deprecated]. This tag exists to enforce the use of the `render` tag instead of `include`.
4
+
5
+ The `include` tag works similarly to the `render` tag, but it lets the code inside of the snippet to access and overwrite the variables within its parent template. The `include` tag has been deprecated because the way that it handles variables reduces performance and makes theme code harder to both read and maintain.
6
+
7
+ ## Check Details
8
+
9
+ This check is aimed at eliminating the use of `include` tags.
10
+
11
+ :-1: Examples of **incorrect** code for this check:
12
+
13
+ ```liquid
14
+ {% include 'snippet' %}
15
+ ```
16
+
17
+ :+1: Examples of **correct** code for this check:
18
+
19
+ ```liquid
20
+ {% render 'snippet' %}
21
+ ```
22
+
23
+ ## Check Options
24
+
25
+ The default configuration for this check is the following:
26
+
27
+ ```yaml
28
+ ConvertIncludeToRender:
29
+ enabled: true
30
+ ```
31
+
32
+ ## When Not To Use It
33
+
34
+ It is discouraged to disable this rule.
35
+
36
+ ## Version
37
+
38
+ This check has been introduced in Theme Check 0.1.0.
39
+
40
+ ## Resources
41
+
42
+ - [Deprecated Tags Reference][deprecated]
43
+ - [Rule Source][codesource]
44
+ - [Documentation Source][docsource]
45
+
46
+ [deprecated]: https://shopify.dev/docs/themes/liquid/reference/tags/deprecated-tags#include
47
+ [codesource]: /lib/theme_check/checks/convert_include_to_render.rb
48
+ [docsource]: /docs/checks/convert_include_to_render.md
@@ -0,0 +1,46 @@
1
+ # Ensure theme has a default locale (`DefaultLocale`)
2
+
3
+ This check makes sure the theme has a default translation file.
4
+
5
+ ## Check Details
6
+
7
+ This check makes sure a theme has a default locale.
8
+
9
+ :-1: Example of **incorrect** theme for this check:
10
+
11
+ ```
12
+ locales/
13
+ ├── en.json
14
+ ├── fr.json
15
+ └── zh-TW.json
16
+ ```
17
+
18
+ :+1: Example of **correct** theme for this check:
19
+
20
+ ```
21
+ locales/
22
+ ├── en.default.json # a default translation file is required
23
+ ├── fr.json
24
+ └── zh-TW.json
25
+ ```
26
+
27
+ ## Check Options
28
+
29
+ The default configuration for this check is the following:
30
+
31
+ ```yaml
32
+ DefaultLocale:
33
+ enabled: true
34
+ ```
35
+
36
+ ## Version
37
+
38
+ This check has been introduced in Theme Check 0.1.0.
39
+
40
+ ## Resources
41
+
42
+ - [Rule Source][codesource]
43
+ - [Documentation Source][docsource]
44
+
45
+ [codesource]: /lib/theme_check/checks/default_locale.rb
46
+ [docsource]: /docs/checks/default_locale.md