platformos-check 0.0.1

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 (240) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +2 -0
  3. data/.gitignore +22 -0
  4. data/.rubocop.yml +555 -0
  5. data/CHANGELOG.md +5 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/CONTRIBUTING.md +209 -0
  8. data/Gemfile +33 -0
  9. data/Guardfile +7 -0
  10. data/LICENSE.md +10 -0
  11. data/Makefile +18 -0
  12. data/README.md +189 -0
  13. data/RELEASING.md +35 -0
  14. data/Rakefile +83 -0
  15. data/TROUBLESHOOTING.md +35 -0
  16. data/bin/platformos-check +29 -0
  17. data/bin/platformos-check-language-server +29 -0
  18. data/config/default.yml +98 -0
  19. data/config/nothing.yml +11 -0
  20. data/data/platformos_liquid/built_in_liquid_objects.json +66 -0
  21. data/data/platformos_liquid/deprecated_filters.json +22 -0
  22. data/data/platformos_liquid/documentation/filters.json +6 -0
  23. data/data/platformos_liquid/documentation/latest.json +2 -0
  24. data/data/platformos_liquid/documentation/objects.json +6 -0
  25. data/data/platformos_liquid/documentation/tags.json +6 -0
  26. data/docker/check.Dockerfile +3 -0
  27. data/docker/lsp.Dockerfile +21 -0
  28. data/docs/api/check.md +15 -0
  29. data/docs/api/html_check.md +46 -0
  30. data/docs/api/liquid_check.md +115 -0
  31. data/docs/api/yaml_check.md +19 -0
  32. data/docs/checks/TEMPLATE.md.erb +52 -0
  33. data/docs/checks/convert_include_to_render.md +48 -0
  34. data/docs/checks/deprecated_filter.md +30 -0
  35. data/docs/checks/html_parsing_error.md +50 -0
  36. data/docs/checks/img_lazy_loading.md +63 -0
  37. data/docs/checks/img_width_and_height.md +79 -0
  38. data/docs/checks/invalid_args.md +56 -0
  39. data/docs/checks/liquid_tag.md +65 -0
  40. data/docs/checks/missing_enable_comment.md +50 -0
  41. data/docs/checks/missing_template.md +65 -0
  42. data/docs/checks/parse_json_format.md +76 -0
  43. data/docs/checks/parser_blocking_javascript.md +97 -0
  44. data/docs/checks/required_layout_object.md +28 -0
  45. data/docs/checks/space_inside_braces.md +89 -0
  46. data/docs/checks/syntax_error.md +49 -0
  47. data/docs/checks/template_length.md +45 -0
  48. data/docs/checks/undefined_object.md +71 -0
  49. data/docs/checks/unknown_filter.md +46 -0
  50. data/docs/checks/unused_assign.md +63 -0
  51. data/docs/checks/unused_partial.md +32 -0
  52. data/docs/checks/valid_yaml.md +48 -0
  53. data/docs/flamegraph.svg +18488 -0
  54. data/docs/language_server/code-action-command-palette.png +0 -0
  55. data/docs/language_server/code-action-flow.png +0 -0
  56. data/docs/language_server/code-action-keyboard.png +0 -0
  57. data/docs/language_server/code-action-light-bulb.png +0 -0
  58. data/docs/language_server/code-action-problem.png +0 -0
  59. data/docs/language_server/code-action-quickfix.png +0 -0
  60. data/docs/language_server/how_to_correct_code_with_code_actions_and_execute_command.md +197 -0
  61. data/docs/preview.png +0 -0
  62. data/exe/platformos-check +6 -0
  63. data/exe/platformos-check-language-server +7 -0
  64. data/lib/platformos_check/analyzer.rb +178 -0
  65. data/lib/platformos_check/api_call_file.rb +9 -0
  66. data/lib/platformos_check/app.rb +138 -0
  67. data/lib/platformos_check/app_file.rb +89 -0
  68. data/lib/platformos_check/app_file_rewriter.rb +79 -0
  69. data/lib/platformos_check/asset_file.rb +34 -0
  70. data/lib/platformos_check/bug.rb +23 -0
  71. data/lib/platformos_check/check.rb +163 -0
  72. data/lib/platformos_check/checks/TEMPLATE.rb.erb +11 -0
  73. data/lib/platformos_check/checks/convert_include_to_render.rb +17 -0
  74. data/lib/platformos_check/checks/deprecated_filter.rb +123 -0
  75. data/lib/platformos_check/checks/html_parsing_error.rb +13 -0
  76. data/lib/platformos_check/checks/img_lazy_loading.rb +18 -0
  77. data/lib/platformos_check/checks/img_width_and_height.rb +46 -0
  78. data/lib/platformos_check/checks/invalid_args.rb +81 -0
  79. data/lib/platformos_check/checks/liquid_tag.rb +47 -0
  80. data/lib/platformos_check/checks/missing_enable_comment.rb +37 -0
  81. data/lib/platformos_check/checks/missing_template.rb +107 -0
  82. data/lib/platformos_check/checks/parse_json_format.rb +31 -0
  83. data/lib/platformos_check/checks/parser_blocking_javascript.rb +17 -0
  84. data/lib/platformos_check/checks/required_layout_object.rb +41 -0
  85. data/lib/platformos_check/checks/space_inside_braces.rb +150 -0
  86. data/lib/platformos_check/checks/syntax_error.rb +31 -0
  87. data/lib/platformos_check/checks/template_length.rb +20 -0
  88. data/lib/platformos_check/checks/undefined_object.rb +206 -0
  89. data/lib/platformos_check/checks/unknown_filter.rb +27 -0
  90. data/lib/platformos_check/checks/unused_assign.rb +101 -0
  91. data/lib/platformos_check/checks/unused_partial.rb +93 -0
  92. data/lib/platformos_check/checks/valid_yaml.rb +16 -0
  93. data/lib/platformos_check/checks.rb +73 -0
  94. data/lib/platformos_check/checks_tracking.rb +9 -0
  95. data/lib/platformos_check/cli.rb +239 -0
  96. data/lib/platformos_check/config.rb +219 -0
  97. data/lib/platformos_check/config_file.rb +6 -0
  98. data/lib/platformos_check/corrector.rb +68 -0
  99. data/lib/platformos_check/disabled_check.rb +44 -0
  100. data/lib/platformos_check/disabled_checks.rb +96 -0
  101. data/lib/platformos_check/email_file.rb +9 -0
  102. data/lib/platformos_check/exceptions.rb +36 -0
  103. data/lib/platformos_check/file_system_storage.rb +93 -0
  104. data/lib/platformos_check/graphql_file.rb +68 -0
  105. data/lib/platformos_check/html_check.rb +8 -0
  106. data/lib/platformos_check/html_node.rb +210 -0
  107. data/lib/platformos_check/html_visitor.rb +36 -0
  108. data/lib/platformos_check/in_memory_storage.rb +68 -0
  109. data/lib/platformos_check/json_file.rb +57 -0
  110. data/lib/platformos_check/json_helper.rb +73 -0
  111. data/lib/platformos_check/json_helpers.rb +24 -0
  112. data/lib/platformos_check/json_printer.rb +32 -0
  113. data/lib/platformos_check/language_server/bridge.rb +167 -0
  114. data/lib/platformos_check/language_server/channel.rb +69 -0
  115. data/lib/platformos_check/language_server/client_capabilities.rb +27 -0
  116. data/lib/platformos_check/language_server/code_action_engine.rb +32 -0
  117. data/lib/platformos_check/language_server/code_action_provider.rb +41 -0
  118. data/lib/platformos_check/language_server/code_action_providers/quickfix_code_action_provider.rb +85 -0
  119. data/lib/platformos_check/language_server/code_action_providers/source_fix_all_code_action_provider.rb +41 -0
  120. data/lib/platformos_check/language_server/completion_context.rb +52 -0
  121. data/lib/platformos_check/language_server/completion_engine.rb +32 -0
  122. data/lib/platformos_check/language_server/completion_helper.rb +26 -0
  123. data/lib/platformos_check/language_server/completion_provider.rb +53 -0
  124. data/lib/platformos_check/language_server/completion_providers/assignments_completion_provider.rb +40 -0
  125. data/lib/platformos_check/language_server/completion_providers/filter_completion_provider.rb +102 -0
  126. data/lib/platformos_check/language_server/completion_providers/object_attribute_completion_provider.rb +48 -0
  127. data/lib/platformos_check/language_server/completion_providers/object_completion_provider.rb +38 -0
  128. data/lib/platformos_check/language_server/completion_providers/render_snippet_completion_provider.rb +50 -0
  129. data/lib/platformos_check/language_server/completion_providers/tag_completion_provider.rb +41 -0
  130. data/lib/platformos_check/language_server/configuration.rb +89 -0
  131. data/lib/platformos_check/language_server/constants.rb +29 -0
  132. data/lib/platformos_check/language_server/diagnostic.rb +129 -0
  133. data/lib/platformos_check/language_server/diagnostics_engine.rb +131 -0
  134. data/lib/platformos_check/language_server/diagnostics_manager.rb +184 -0
  135. data/lib/platformos_check/language_server/document_change_corrector.rb +271 -0
  136. data/lib/platformos_check/language_server/document_link_engine.rb +21 -0
  137. data/lib/platformos_check/language_server/document_link_provider.rb +71 -0
  138. data/lib/platformos_check/language_server/document_link_providers/asset_document_link_provider.rb +11 -0
  139. data/lib/platformos_check/language_server/document_link_providers/include_document_link_provider.rb +11 -0
  140. data/lib/platformos_check/language_server/document_link_providers/render_document_link_provider.rb +11 -0
  141. data/lib/platformos_check/language_server/document_link_providers/section_document_link_provider.rb +11 -0
  142. data/lib/platformos_check/language_server/execute_command_engine.rb +19 -0
  143. data/lib/platformos_check/language_server/execute_command_provider.rb +30 -0
  144. data/lib/platformos_check/language_server/execute_command_providers/correction_execute_command_provider.rb +48 -0
  145. data/lib/platformos_check/language_server/execute_command_providers/run_checks_execute_command_provider.rb +28 -0
  146. data/lib/platformos_check/language_server/handler.rb +310 -0
  147. data/lib/platformos_check/language_server/hover_engine.rb +32 -0
  148. data/lib/platformos_check/language_server/hover_provider.rb +53 -0
  149. data/lib/platformos_check/language_server/hover_providers/filter_hover_provider.rb +113 -0
  150. data/lib/platformos_check/language_server/io_messenger.rb +109 -0
  151. data/lib/platformos_check/language_server/messenger.rb +27 -0
  152. data/lib/platformos_check/language_server/protocol.rb +55 -0
  153. data/lib/platformos_check/language_server/server.rb +188 -0
  154. data/lib/platformos_check/language_server/tokens.rb +55 -0
  155. data/lib/platformos_check/language_server/type_helper.rb +22 -0
  156. data/lib/platformos_check/language_server/uri_helper.rb +39 -0
  157. data/lib/platformos_check/language_server/variable_lookup_finder/assignments_finder/node_handler.rb +87 -0
  158. data/lib/platformos_check/language_server/variable_lookup_finder/assignments_finder/scope.rb +60 -0
  159. data/lib/platformos_check/language_server/variable_lookup_finder/assignments_finder/scope_visitor.rb +44 -0
  160. data/lib/platformos_check/language_server/variable_lookup_finder/assignments_finder.rb +76 -0
  161. data/lib/platformos_check/language_server/variable_lookup_finder/constants.rb +44 -0
  162. data/lib/platformos_check/language_server/variable_lookup_finder/liquid_fixer.rb +103 -0
  163. data/lib/platformos_check/language_server/variable_lookup_finder/potential_lookup.rb +10 -0
  164. data/lib/platformos_check/language_server/variable_lookup_finder/tolerant_parser.rb +94 -0
  165. data/lib/platformos_check/language_server/variable_lookup_finder.rb +262 -0
  166. data/lib/platformos_check/language_server/variable_lookup_traverser.rb +70 -0
  167. data/lib/platformos_check/language_server/versioned_in_memory_storage.rb +84 -0
  168. data/lib/platformos_check/language_server.rb +71 -0
  169. data/lib/platformos_check/layout_file.rb +15 -0
  170. data/lib/platformos_check/liquid_check.rb +10 -0
  171. data/lib/platformos_check/liquid_file.rb +102 -0
  172. data/lib/platformos_check/liquid_node.rb +570 -0
  173. data/lib/platformos_check/liquid_visitor.rb +39 -0
  174. data/lib/platformos_check/migration_file.rb +9 -0
  175. data/lib/platformos_check/node.rb +53 -0
  176. data/lib/platformos_check/offense.rb +228 -0
  177. data/lib/platformos_check/page_file.rb +9 -0
  178. data/lib/platformos_check/parsing_helpers.rb +21 -0
  179. data/lib/platformos_check/partial_file.rb +15 -0
  180. data/lib/platformos_check/platformos_liquid/deprecated_filter.rb +31 -0
  181. data/lib/platformos_check/platformos_liquid/documentation/markdown_template.rb +51 -0
  182. data/lib/platformos_check/platformos_liquid/documentation.rb +45 -0
  183. data/lib/platformos_check/platformos_liquid/filter.rb +19 -0
  184. data/lib/platformos_check/platformos_liquid/object.rb +15 -0
  185. data/lib/platformos_check/platformos_liquid/source_index/base_entry.rb +66 -0
  186. data/lib/platformos_check/platformos_liquid/source_index/base_state.rb +23 -0
  187. data/lib/platformos_check/platformos_liquid/source_index/filter_entry.rb +26 -0
  188. data/lib/platformos_check/platformos_liquid/source_index/filter_state.rb +11 -0
  189. data/lib/platformos_check/platformos_liquid/source_index/object_entry.rb +20 -0
  190. data/lib/platformos_check/platformos_liquid/source_index/object_state.rb +11 -0
  191. data/lib/platformos_check/platformos_liquid/source_index/parameter_entry.rb +25 -0
  192. data/lib/platformos_check/platformos_liquid/source_index/property_entry.rb +21 -0
  193. data/lib/platformos_check/platformos_liquid/source_index/return_type_entry.rb +41 -0
  194. data/lib/platformos_check/platformos_liquid/source_index/tag_entry.rb +24 -0
  195. data/lib/platformos_check/platformos_liquid/source_index/tag_state.rb +11 -0
  196. data/lib/platformos_check/platformos_liquid/source_index.rb +79 -0
  197. data/lib/platformos_check/platformos_liquid/source_manager.rb +116 -0
  198. data/lib/platformos_check/platformos_liquid/tag.rb +59 -0
  199. data/lib/platformos_check/platformos_liquid.rb +21 -0
  200. data/lib/platformos_check/position.rb +180 -0
  201. data/lib/platformos_check/position_helper.rb +57 -0
  202. data/lib/platformos_check/printer.rb +87 -0
  203. data/lib/platformos_check/regex_helpers.rb +21 -0
  204. data/lib/platformos_check/releaser.rb +43 -0
  205. data/lib/platformos_check/schema_file.rb +6 -0
  206. data/lib/platformos_check/sms_file.rb +9 -0
  207. data/lib/platformos_check/storage.rb +29 -0
  208. data/lib/platformos_check/string_helpers.rb +48 -0
  209. data/lib/platformos_check/tags/background.rb +67 -0
  210. data/lib/platformos_check/tags/base.rb +14 -0
  211. data/lib/platformos_check/tags/base_block.rb +14 -0
  212. data/lib/platformos_check/tags/base_tag_methods.rb +59 -0
  213. data/lib/platformos_check/tags/cache.rb +13 -0
  214. data/lib/platformos_check/tags/export.rb +30 -0
  215. data/lib/platformos_check/tags/form.rb +19 -0
  216. data/lib/platformos_check/tags/function.rb +58 -0
  217. data/lib/platformos_check/tags/graphql.rb +70 -0
  218. data/lib/platformos_check/tags/hash_assign.rb +75 -0
  219. data/lib/platformos_check/tags/log.rb +15 -0
  220. data/lib/platformos_check/tags/parse_json.rb +24 -0
  221. data/lib/platformos_check/tags/print.rb +20 -0
  222. data/lib/platformos_check/tags/redirect_to.rb +15 -0
  223. data/lib/platformos_check/tags/render.rb +60 -0
  224. data/lib/platformos_check/tags/response_headers.rb +20 -0
  225. data/lib/platformos_check/tags/response_status.rb +20 -0
  226. data/lib/platformos_check/tags/return.rb +20 -0
  227. data/lib/platformos_check/tags/session.rb +27 -0
  228. data/lib/platformos_check/tags/sign_in.rb +27 -0
  229. data/lib/platformos_check/tags/spam_protection.rb +15 -0
  230. data/lib/platformos_check/tags/theme_render.rb +58 -0
  231. data/lib/platformos_check/tags/try.rb +59 -0
  232. data/lib/platformos_check/tags.rb +65 -0
  233. data/lib/platformos_check/translation_file.rb +6 -0
  234. data/lib/platformos_check/user_schema_file.rb +6 -0
  235. data/lib/platformos_check/version.rb +5 -0
  236. data/lib/platformos_check/yaml_check.rb +11 -0
  237. data/lib/platformos_check/yaml_file.rb +57 -0
  238. data/lib/platformos_check.rb +106 -0
  239. data/platformos-check.gemspec +34 -0
  240. metadata +329 -0
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class Log < Base
6
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
7
+ def children
8
+ [
9
+ @node.value_expr
10
+ ].compact + @node.attributes_expr.values
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class ParseJson < Liquid::Block
6
+ SYNTAX = /(#{Liquid::VariableSignature}+)/o
7
+
8
+ attr_reader :to
9
+
10
+ def initialize(tag_name, markup, options)
11
+ super
12
+ raise Liquid::SyntaxError, "Syntax Error in 'parse_json' - Valid syntax: parse_json [var]" unless markup =~ SYNTAX
13
+
14
+ @to = Regexp.last_match(1)
15
+ end
16
+
17
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
18
+ def children
19
+ super + [@node.to]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class Print < Liquid::Tag
6
+ attr_reader :var
7
+
8
+ def initialize(tag_name, markup, options)
9
+ super
10
+ @var = Liquid::Variable.new(markup, options)
11
+ end
12
+
13
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
14
+ def children
15
+ [@node.var]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class RedirectTo < Base
6
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
7
+ def children
8
+ [
9
+ @node.value_expr
10
+ ].compact + @node.attributes_expr.values
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class Render < Liquid::Tag
6
+ SYNTAX = /
7
+ (
8
+ ## for {% render "snippet" %}
9
+ #{Liquid::QuotedString}+ |
10
+ ## for {% render block %}
11
+ ## We require the variable # segment to be at the beginning of the
12
+ ## string (with \A). This is to prevent code like {% render !foo! %}
13
+ ## from parsing
14
+ \A#{Liquid::VariableSegment}+
15
+ )
16
+ ## for {% render "snippet" with product as p %}
17
+ ## or {% render "snippet" for products p %}
18
+ (\s+(with|#{Liquid::Render::FOR})\s+(#{Liquid::QuotedFragment}+))?
19
+ (\s+(?:as)\s+(#{Liquid::VariableSegment}+))?
20
+ ## variables passed into the tag (e.g. {% render "snippet", var1: value1, var2: value2 %}
21
+ ## are not matched by this regex and are handled by Liquid::Render.initialize
22
+ /xo
23
+
24
+ disable_tags "include"
25
+
26
+ attr_reader :template_name_expr, :variable_name_expr, :attributes, :duplicated_attrs
27
+
28
+ def initialize(tag_name, markup, options)
29
+ super
30
+
31
+ raise Liquid::SyntaxError, options[:locale].t("errors.syntax.render") unless markup =~ SYNTAX
32
+
33
+ template_name = Regexp.last_match(1)
34
+ with_or_for = Regexp.last_match(3)
35
+ variable_name = Regexp.last_match(4)
36
+
37
+ @alias_name = Regexp.last_match(6)
38
+ @variable_name_expr = variable_name ? parse_expression(variable_name) : nil
39
+ @template_name_expr = parse_expression(template_name)
40
+ @for = (with_or_for == Liquid::Render::FOR)
41
+
42
+ @attributes = {}
43
+ @duplicated_attrs = []
44
+ markup.scan(Liquid::TagAttributes) do |key, value|
45
+ @duplicated_attrs << key if @attributes.key?(key)
46
+ @attributes[key] = parse_expression(value)
47
+ end
48
+ end
49
+
50
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
51
+ def children
52
+ [
53
+ @node.template_name_expr,
54
+ @node.variable_name_expr
55
+ ] + @node.attributes.values
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class ResponseHeaders < Liquid::Tag
6
+ attr_reader :var
7
+
8
+ def initialize(tag_name, markup, options)
9
+ super
10
+ @var = Liquid::Variable.new(markup, options)
11
+ end
12
+
13
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
14
+ def children
15
+ [@node.var]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class ResponseStatus < Liquid::Tag
6
+ attr_reader :var
7
+
8
+ def initialize(tag_name, markup, options)
9
+ super
10
+ @var = Liquid::Variable.new(markup, options)
11
+ end
12
+
13
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
14
+ def children
15
+ [@node.var]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class Return < Liquid::Tag
6
+ attr_reader :var
7
+
8
+ def initialize(tag_name, markup, options)
9
+ super
10
+ @var = Liquid::Variable.new(markup, options)
11
+ end
12
+
13
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
14
+ def children
15
+ [@node.var]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class Session < Liquid::Tag
6
+ SYNTAX = /(#{Liquid::VariableSignature}+)\s*=\s*(.*)\s*/om
7
+
8
+ attr_reader :from
9
+
10
+ def initialize(tag_name, markup, options)
11
+ super
12
+ raise Liquid::SyntaxError, "Syntax Error in 'session' - Valid syntax: session [var1] = [var2]" unless markup =~ SYNTAX
13
+
14
+ @to = Regexp.last_match(1)
15
+ @from = Liquid::Variable.new(Regexp.last_match(2), options)
16
+ end
17
+
18
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
19
+ def children
20
+ [
21
+ @node.from
22
+ ]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class SignIn < Base
6
+ SYNTAX = /\A([\w-]+[\s,]*[\w\s,]*)\s*(user_id:\s*(.+))?\z/
7
+ VALID_ATTRUBTES = %w[user_id timeout_in_minutes].freeze
8
+
9
+ def initialize(tag_name, markup, options)
10
+ super
11
+
12
+ raise Liquid::SyntaxError, "Syntax Error in 'sign_in' - Valid syntax: sign_in user_id: [user_id], timeout_in_minutes: [timeout_in_minutes]" if attributes_expr['user_id'].nil?
13
+
14
+ wrong_attributes = attributes_expr.keys - VALID_ATTRUBTES
15
+ raise Liquid::SyntaxError, "Syntax Error in 'sign_in' - Unknown argument(s): #{wrong_attributes.join(', ')}. Valid arguments: #{VALID_ATTRUBTES}" unless wrong_attributes.empty?
16
+ end
17
+
18
+ def parse_main_value(_tag_name, _markup); end
19
+
20
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
21
+ def children
22
+ @node.attributes_expr.values
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class SpamProtection < Base
6
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
7
+ def children
8
+ [
9
+ @node.value_expr
10
+ ].compact + @node.attributes_expr.values
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class ThemeRender < Liquid::Tag
6
+ SYNTAX = /
7
+ (
8
+ ## for {% render "snippet" %}
9
+ #{Liquid::QuotedString}+ |
10
+ ## for {% render block %}
11
+ ## We require the variable # segment to be at the beginning of the
12
+ ## string (with \A). This is to prevent code like {% render !foo! %}
13
+ ## from parsing
14
+ \A#{Liquid::VariableSegment}+
15
+ )
16
+ ## for {% render "snippet" with product as p %}
17
+ ## or {% render "snippet" for products p %}
18
+ (\s+(with|#{Liquid::Render::FOR})\s+(#{Liquid::QuotedFragment}+))?
19
+ (\s+(?:as)\s+(#{Liquid::VariableSegment}+))?
20
+ ## variables passed into the tag (e.g. {% render "snippet", var1: value1, var2: value2 %}
21
+ ## are not matched by this regex and are handled by Liquid::Render.initialize
22
+ /xo
23
+
24
+ disable_tags "include"
25
+
26
+ attr_reader :template_name_expr, :variable_name_expr, :attributes
27
+
28
+ def initialize(tag_name, markup, options)
29
+ super
30
+
31
+ raise Liquid::SyntaxError, options[:locale].t("errors.syntax.render") unless markup =~ SYNTAX
32
+
33
+ template_name = Regexp.last_match(1)
34
+ with_or_for = Regexp.last_match(3)
35
+ variable_name = Regexp.last_match(4)
36
+
37
+ @alias_name = Regexp.last_match(6)
38
+ @variable_name_expr = variable_name ? parse_expression(variable_name) : nil
39
+ @template_name_expr = parse_expression(template_name)
40
+ @for = (with_or_for == Liquid::Render::FOR)
41
+
42
+ @attributes = {}
43
+ markup.scan(Liquid::TagAttributes) do |key, value|
44
+ @attributes[key] = parse_expression(value)
45
+ end
46
+ end
47
+
48
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
49
+ def children
50
+ [
51
+ @node.template_name_expr,
52
+ @node.variable_name_expr
53
+ ] + @node.attributes.values
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ class Try < BaseBlock
6
+ SYNTAX = /(#{::Liquid::VariableSignature}+)/o
7
+
8
+ attr_reader :error_var
9
+
10
+ def initialize(tag_name, markup, options)
11
+ super
12
+ @try_block = new_body
13
+ @catch_block = nil
14
+ @ensure_block = nil
15
+ end
16
+
17
+ def parse(tokens)
18
+ if parse_body(@try_block, tokens)
19
+ parse_body(@catch_block, tokens) if @catch_block
20
+ parse_body(@ensure_block, tokens) if @ensure_block
21
+ end
22
+ if blank?
23
+ @try_block.remove_blank_strings
24
+ @catch_block&.remove_blank_strings
25
+ @ensure_block&.remove_blank_strings
26
+ end
27
+ @try_block.freeze
28
+ @catch_block&.freeze
29
+ @ensure_block&.freeze
30
+ end
31
+
32
+ def nodelist
33
+ [@try_block, @catch_block, @ensure_block].compact
34
+ end
35
+
36
+ def unknown_tag(tag, markup, tokens)
37
+ if tag == 'catch'
38
+ raise Liquid::SyntaxError, "Syntax Error in 'try' - Valid syntax: try ... catch [var] ... endtry" unless markup =~ SYNTAX
39
+
40
+ @error_var = Regexp.last_match(1)
41
+
42
+ @catch_block = new_body
43
+ elsif tag == 'ensure'
44
+ @ensure_block = new_body
45
+ else
46
+ super
47
+ end
48
+ end
49
+
50
+ def parse_main_value(tag_name, markup); end
51
+
52
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
53
+ def children
54
+ @node.nodelist
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ module Tags
5
+ # Copied tags parsing code from storefront-renderer
6
+
7
+ class ContentFor < BaseBlock; end
8
+
9
+ class Yield < Base; end
10
+
11
+ class IncludeForm < Base
12
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
13
+ def children
14
+ [
15
+ @node.main_value
16
+ ] + @node.attributes_expr.values
17
+ end
18
+ end
19
+ end
20
+
21
+ class << self
22
+ attr_writer :register_tags
23
+
24
+ def register_tags?
25
+ @register_tags
26
+ end
27
+
28
+ def register_tag(name, klass)
29
+ Liquid::Template.register_tag(name, klass)
30
+ end
31
+
32
+ def register_tags!
33
+ return if !register_tags? || (defined?(@registered_tags) && @registered_tags)
34
+
35
+ @registered_tags = true
36
+ register_tag('form', Form)
37
+ register_tag('include_form', IncludeForm)
38
+ register_tag('render', Render)
39
+ register_tag('theme_render', ThemeRender)
40
+ register_tag('theme_render_rc', ThemeRender)
41
+ register_tag('log', Log)
42
+ register_tag('cache', Cache)
43
+ register_tag('print', Print)
44
+ register_tag('parse_json', ParseJson)
45
+ register_tag('try_rc', Try)
46
+ register_tag('try', Try)
47
+ register_tag('export', Export)
48
+ register_tag('return', Return)
49
+ register_tag('redirect_to', RedirectTo)
50
+ register_tag('response_headers', ResponseHeaders)
51
+ register_tag('response_status', ResponseStatus)
52
+ register_tag('hash_assign', HashAssign)
53
+ register_tag('background', Background)
54
+ register_tag('content_for', ContentFor)
55
+ register_tag('session', Session)
56
+ register_tag('sign_in', SignIn)
57
+ register_tag('yield', Yield)
58
+ register_tag('graphql', Graphql)
59
+ register_tag('function', Function)
60
+ register_tag('spam_protection', SpamProtection)
61
+ end
62
+ end
63
+ self.register_tags = true
64
+ end
65
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ class TranslationFile < YamlFile
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ class UserSchemaFile < YamlFile
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ VERSION = "0.0.1"
5
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformosCheck
4
+ class YamlCheck < Check
5
+ extend ChecksTracking
6
+
7
+ def add_offense(message, markup: nil, line_number: nil, app_file: nil, &block)
8
+ offenses << Offense.new(check: self, message:, markup:, line_number:, app_file:, correction: block)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module PlatformosCheck
6
+ class YamlFile < AppFile
7
+ def initialize(relative_path, storage)
8
+ super
9
+ @loaded = false
10
+ @content = nil
11
+ @parser_error = nil
12
+ end
13
+
14
+ def content
15
+ load!
16
+ @content
17
+ end
18
+
19
+ def parse_error
20
+ load!
21
+ @parser_error
22
+ end
23
+
24
+ def update_contents(new_content = {})
25
+ raise ArgumentError if new_content.is_a?(String)
26
+
27
+ @content = new_content
28
+ end
29
+
30
+ def write
31
+ pretty = YAML.dump(@content)
32
+ return unless source.rstrip != pretty.rstrip
33
+
34
+ # Most editors add a trailing \n at the end of files. Here we
35
+ # try to maintain the convention.
36
+ eof = source.end_with?("\n") ? "\n" : ""
37
+ @storage.write(@relative_path, pretty.gsub("\n", @eol) + eof)
38
+ @source = pretty
39
+ end
40
+
41
+ def yaml?
42
+ true
43
+ end
44
+
45
+ private
46
+
47
+ def load!
48
+ return if @loaded
49
+
50
+ @content = YAML.load(source, aliases: true) || {}
51
+ rescue Psych::SyntaxError => e
52
+ @parser_error = e
53
+ ensure
54
+ @loaded = true
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "liquid"
4
+
5
+ require_relative "platformos_check/version"
6
+ require_relative "platformos_check/bug"
7
+ require_relative "platformos_check/exceptions"
8
+ require_relative "platformos_check/json_helper"
9
+ require_relative "platformos_check/app_file_rewriter"
10
+ require_relative "platformos_check/app_file"
11
+ require_relative "platformos_check/yaml_file"
12
+ require_relative "platformos_check/translation_file"
13
+ require_relative "platformos_check/schema_file"
14
+ require_relative "platformos_check/config_file"
15
+ require_relative "platformos_check/user_schema_file"
16
+ require_relative "platformos_check/graphql_file"
17
+ require_relative "platformos_check/liquid_file"
18
+ require_relative "platformos_check/page_file"
19
+ require_relative "platformos_check/partial_file"
20
+ require_relative "platformos_check/layout_file"
21
+ require_relative "platformos_check/migration_file"
22
+ require_relative "platformos_check/sms_file"
23
+ require_relative "platformos_check/email_file"
24
+ require_relative "platformos_check/api_call_file"
25
+ require_relative "platformos_check/asset_file"
26
+ require_relative "platformos_check/json_file"
27
+ require_relative "platformos_check/analyzer"
28
+ require_relative "platformos_check/check"
29
+ require_relative "platformos_check/checks_tracking"
30
+ require_relative "platformos_check/liquid_check"
31
+ require_relative "platformos_check/html_check"
32
+ require_relative "platformos_check/yaml_check"
33
+ require_relative "platformos_check/cli"
34
+ require_relative "platformos_check/disabled_check"
35
+ require_relative "platformos_check/disabled_checks"
36
+ require_relative "platformos_check/regex_helpers"
37
+ require_relative "platformos_check/json_helpers"
38
+ require_relative "platformos_check/position_helper"
39
+ require_relative "platformos_check/position"
40
+ require_relative "platformos_check/checks"
41
+ require_relative "platformos_check/config"
42
+ require_relative "platformos_check/node"
43
+ require_relative "platformos_check/tags/base_tag_methods"
44
+ require_relative "platformos_check/tags/base"
45
+ require_relative "platformos_check/tags/base_block"
46
+ require_relative "platformos_check/tags/background"
47
+ require_relative "platformos_check/tags/cache"
48
+ require_relative "platformos_check/tags/export"
49
+ require_relative "platformos_check/tags/form"
50
+ require_relative "platformos_check/tags/function"
51
+ require_relative "platformos_check/tags/graphql"
52
+ require_relative "platformos_check/tags/hash_assign"
53
+ require_relative "platformos_check/tags/log"
54
+ require_relative "platformos_check/tags/parse_json"
55
+ require_relative "platformos_check/tags/print"
56
+ require_relative "platformos_check/tags/redirect_to"
57
+ require_relative "platformos_check/tags/render"
58
+ require_relative "platformos_check/tags/response_headers"
59
+ require_relative "platformos_check/tags/response_status"
60
+ require_relative "platformos_check/tags/return"
61
+ require_relative "platformos_check/tags/session"
62
+ require_relative "platformos_check/tags/sign_in"
63
+ require_relative "platformos_check/tags/spam_protection"
64
+ require_relative "platformos_check/tags/theme_render"
65
+ require_relative "platformos_check/tags/try"
66
+ require_relative "platformos_check/tags"
67
+ require_relative "platformos_check/liquid_node"
68
+ require_relative "platformos_check/html_node"
69
+ require_relative "platformos_check/offense"
70
+ require_relative "platformos_check/printer"
71
+ require_relative "platformos_check/json_printer"
72
+ require_relative "platformos_check/platformos_liquid"
73
+ require_relative "platformos_check/string_helpers"
74
+ require_relative "platformos_check/storage"
75
+ require_relative "platformos_check/file_system_storage"
76
+ require_relative "platformos_check/in_memory_storage"
77
+ require_relative "platformos_check/app"
78
+ require_relative "platformos_check/corrector"
79
+ require_relative "platformos_check/liquid_visitor"
80
+ require_relative "platformos_check/html_visitor"
81
+ require_relative "platformos_check/language_server"
82
+
83
+ Dir[__dir__ + "/platformos_check/checks/*.rb"].each { |file| require file }
84
+
85
+ Encoding.default_external = Encoding::UTF_8
86
+ Encoding.default_internal = Encoding::UTF_8
87
+
88
+ module PlatformosCheck
89
+ def self.debug?
90
+ ENV["PLATFORMOS_CHECK_DEBUG"] == "true"
91
+ end
92
+
93
+ def self.debug_log_file
94
+ ENV.fetch("PLATFORMOS_CHECK_DEBUG_LOG_FILE", nil)
95
+ end
96
+
97
+ def self.with_liquid_c_disabled
98
+ if defined?(Liquid::C)
99
+ was_enabled = Liquid::C.enabled
100
+ Liquid::C.enabled = false if was_enabled
101
+ end
102
+ yield
103
+ ensure
104
+ Liquid::C.enabled = true if defined?(Liquid::C) && was_enabled
105
+ end
106
+ end