@ttsc/lint 0.14.0-dev.20260529.1 → 0.14.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 (380) hide show
  1. package/README.md +85 -87
  2. package/lib/defaultFormat.d.ts +10 -6
  3. package/lib/defaultFormat.js +10 -6
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/structures/ITtscLintConfig.d.ts +5 -5
  6. package/lib/structures/TtscLintRuleSetting.d.ts +19 -19
  7. package/lib/structures/{ITtscLintFormat.d.ts → format/ITtscLintFormat.d.ts} +45 -70
  8. package/lib/structures/format/ITtscLintFormat.js.map +1 -0
  9. package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +15 -0
  10. package/lib/structures/format/ITtscLintFormatJsDoc.js +3 -0
  11. package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
  12. package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
  13. package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
  14. package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
  15. package/lib/structures/format/index.d.ts +3 -0
  16. package/lib/structures/format/index.js +20 -0
  17. package/lib/structures/format/index.js.map +1 -0
  18. package/lib/structures/index.d.ts +1 -1
  19. package/lib/structures/index.js +1 -1
  20. package/lib/structures/index.js.map +1 -1
  21. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +18 -27
  22. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +4 -5
  23. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -1
  24. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +29 -33
  25. package/lib/structures/rules/ITtscLintContributorRules.d.ts +6 -7
  26. package/lib/structures/rules/ITtscLintCoreRules.d.ts +380 -408
  27. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +5 -5
  28. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +2 -2
  29. package/lib/structures/rules/ITtscLintCypressRules.d.ts +34 -38
  30. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +21 -24
  31. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +2 -2
  32. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +51 -56
  33. package/lib/structures/rules/ITtscLintJestRules.d.ts +63 -74
  34. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +47 -54
  35. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +94 -102
  36. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +50 -55
  37. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +104 -122
  38. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +62 -71
  39. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +4 -4
  40. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +17 -19
  41. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +8 -10
  42. package/lib/structures/rules/ITtscLintReactRuleOptions.js +1 -2
  43. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -1
  44. package/lib/structures/rules/ITtscLintReactRules.d.ts +91 -104
  45. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +46 -54
  46. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +7 -8
  47. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +45 -52
  48. package/lib/structures/rules/ITtscLintSolidRules.d.ts +53 -56
  49. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +3 -4
  50. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +60 -69
  51. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +31 -37
  52. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +2 -3
  53. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +102 -119
  54. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +460 -518
  55. package/lib/structures/rules/ITtscLintVitestRules.d.ts +43 -51
  56. package/linthost/config.go +89 -72
  57. package/linthost/config_format.go +265 -99
  58. package/linthost/directives.go +5 -1
  59. package/linthost/display_width.go +72 -0
  60. package/linthost/fix.go +26 -1
  61. package/linthost/format.go +222 -25
  62. package/linthost/format_editor_settings.go +262 -0
  63. package/linthost/lsp.go +8 -4
  64. package/linthost/print_dispatch.go +3 -0
  65. package/linthost/print_doc.go +13 -0
  66. package/linthost/print_engine.go +68 -11
  67. package/linthost/print_nodes_array.go +108 -5
  68. package/linthost/print_nodes_call.go +515 -74
  69. package/linthost/print_nodes_function.go +25 -0
  70. package/linthost/print_nodes_imports.go +47 -14
  71. package/linthost/print_nodes_list.go +191 -8
  72. package/linthost/print_nodes_object.go +12 -6
  73. package/linthost/print_nodes_ternary.go +106 -0
  74. package/linthost/rules_boundaries.go +400 -400
  75. package/linthost/rules_camelcase.go +81 -81
  76. package/linthost/rules_complexity.go +52 -51
  77. package/linthost/rules_consistent_return.go +81 -81
  78. package/linthost/rules_core_extra.go +472 -472
  79. package/linthost/rules_curly.go +43 -43
  80. package/linthost/rules_default_case.go +15 -15
  81. package/linthost/rules_default_case_last.go +22 -22
  82. package/linthost/rules_format_arrow_parens.go +167 -0
  83. package/linthost/rules_format_bracket_spacing.go +117 -0
  84. package/linthost/rules_format_clause_join.go +172 -0
  85. package/linthost/rules_format_declaration_header.go +664 -0
  86. package/linthost/rules_format_indent.go +616 -0
  87. package/linthost/rules_format_jsdoc.go +4 -4
  88. package/linthost/rules_format_orphan_semi.go +106 -0
  89. package/linthost/rules_format_parameter_properties.go +175 -0
  90. package/linthost/rules_format_print_width.go +185 -69
  91. package/linthost/rules_format_quote_props.go +169 -0
  92. package/linthost/rules_format_quotes.go +75 -29
  93. package/linthost/rules_format_semi.go +185 -10
  94. package/linthost/rules_format_sort_imports.go +456 -121
  95. package/linthost/rules_format_statement_split.go +368 -0
  96. package/linthost/rules_format_ternary_nullish_parens.go +77 -0
  97. package/linthost/rules_format_trailing_comma.go +21 -2
  98. package/linthost/rules_format_whitespace.go +336 -0
  99. package/linthost/rules_functional.go +688 -688
  100. package/linthost/rules_gap.go +146 -11
  101. package/linthost/rules_grouped_accessor_pairs.go +60 -60
  102. package/linthost/rules_guard_for_in.go +122 -122
  103. package/linthost/rules_id_length.go +44 -44
  104. package/linthost/rules_imports.go +11 -3
  105. package/linthost/rules_init_declarations.go +25 -25
  106. package/linthost/rules_jsx_a11y.go +844 -844
  107. package/linthost/rules_max_classes_per_file.go +24 -24
  108. package/linthost/rules_max_depth.go +43 -43
  109. package/linthost/rules_max_lines.go +53 -53
  110. package/linthost/rules_max_lines_per_function.go +28 -28
  111. package/linthost/rules_max_nested_callbacks.go +26 -26
  112. package/linthost/rules_max_params.go +20 -20
  113. package/linthost/rules_max_statements.go +29 -29
  114. package/linthost/rules_nextjs.go +5 -5
  115. package/linthost/rules_no_else_return.go +38 -38
  116. package/linthost/rules_no_empty_named_blocks.go +45 -45
  117. package/linthost/rules_no_import_assign.go +96 -96
  118. package/linthost/rules_no_invalid_this.go +19 -19
  119. package/linthost/rules_no_loop_func.go +43 -43
  120. package/linthost/rules_no_magic_numbers.go +60 -60
  121. package/linthost/rules_no_mixed_operators.go +44 -44
  122. package/linthost/rules_no_param_reassign.go +64 -64
  123. package/linthost/rules_no_restricted_imports.go +45 -45
  124. package/linthost/rules_no_restricted_syntax.go +17 -17
  125. package/linthost/rules_no_shadow.go +112 -112
  126. package/linthost/rules_no_unreachable.go +36 -36
  127. package/linthost/rules_no_useless_assignment.go +79 -79
  128. package/linthost/rules_no_useless_constructor.go +167 -167
  129. package/linthost/rules_no_useless_return.go +28 -28
  130. package/linthost/rules_prefer_arrow_callback.go +74 -74
  131. package/linthost/rules_prefer_destructuring.go +61 -61
  132. package/linthost/rules_prefer_named_capture_group.go +87 -87
  133. package/linthost/rules_prefer_rest_params.go +61 -61
  134. package/linthost/rules_promise.go +800 -800
  135. package/linthost/rules_react.go +600 -600
  136. package/linthost/rules_react_extras.go +162 -162
  137. package/linthost/rules_react_hooks.go +2 -2
  138. package/linthost/rules_react_perf.go +231 -231
  139. package/linthost/rules_regexp.go +293 -293
  140. package/linthost/rules_security.go +613 -613
  141. package/linthost/rules_sort_imports.go +37 -37
  142. package/linthost/rules_sort_keys.go +88 -88
  143. package/linthost/rules_suggestions.go +13 -0
  144. package/linthost/rules_ts.go +2 -2
  145. package/linthost/rules_ts_async.go +247 -247
  146. package/linthost/rules_ts_class_literal_property_style.go +64 -64
  147. package/linthost/rules_ts_consistent_type_exports.go +209 -209
  148. package/linthost/rules_ts_explicit_function_return_type.go +35 -35
  149. package/linthost/rules_ts_extra.go +6 -2
  150. package/linthost/rules_ts_no_base_to_string.go +140 -140
  151. package/linthost/rules_ts_no_confusing_void.go +28 -28
  152. package/linthost/rules_ts_no_deprecated.go +110 -110
  153. package/linthost/rules_ts_no_for_in_array.go +45 -45
  154. package/linthost/rules_ts_no_magic_numbers.go +67 -67
  155. package/linthost/rules_ts_no_meaningless_void_operator.go +44 -44
  156. package/linthost/rules_ts_no_misused_spread.go +64 -64
  157. package/linthost/rules_ts_no_redundant_type_constituents.go +72 -72
  158. package/linthost/rules_ts_no_restricted_types.go +28 -28
  159. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +87 -87
  160. package/linthost/rules_ts_no_unnecessary_condition.go +184 -184
  161. package/linthost/rules_ts_no_unnecessary_qualifier.go +72 -72
  162. package/linthost/rules_ts_no_unnecessary_template_expression.go +120 -120
  163. package/linthost/rules_ts_no_unnecessary_type_arguments.go +171 -171
  164. package/linthost/rules_ts_no_unnecessary_type_assertion.go +90 -90
  165. package/linthost/rules_ts_no_unsafe_argument.go +50 -50
  166. package/linthost/rules_ts_no_unsafe_assignment.go +60 -60
  167. package/linthost/rules_ts_no_unsafe_call.go +40 -40
  168. package/linthost/rules_ts_no_unsafe_enum_comparison.go +147 -147
  169. package/linthost/rules_ts_no_unsafe_member_access.go +29 -29
  170. package/linthost/rules_ts_no_unsafe_return.go +64 -64
  171. package/linthost/rules_ts_no_unsafe_unary_minus.go +42 -42
  172. package/linthost/rules_ts_no_useless_constructor.go +20 -20
  173. package/linthost/rules_ts_non_nullable_type_assertion_style.go +60 -60
  174. package/linthost/rules_ts_parameter_properties.go +10 -10
  175. package/linthost/rules_ts_prefer_find.go +116 -116
  176. package/linthost/rules_ts_prefer_includes.go +173 -173
  177. package/linthost/rules_ts_prefer_nullish_coalescing.go +54 -54
  178. package/linthost/rules_ts_prefer_optional_chain.go +156 -156
  179. package/linthost/rules_ts_prefer_promise_reject_errors.go +104 -104
  180. package/linthost/rules_ts_prefer_readonly.go +31 -31
  181. package/linthost/rules_ts_prefer_reduce_type_parameter.go +74 -74
  182. package/linthost/rules_ts_prefer_regexp_exec.go +69 -69
  183. package/linthost/rules_ts_prefer_return_this_type.go +79 -79
  184. package/linthost/rules_ts_prefer_string_starts_ends_with.go +237 -237
  185. package/linthost/rules_ts_promise_function_async.go +41 -41
  186. package/linthost/rules_ts_related_getter_setter_pairs.go +61 -61
  187. package/linthost/rules_ts_require_array_sort_compare.go +58 -58
  188. package/linthost/rules_ts_restrict_plus_operands.go +82 -82
  189. package/linthost/rules_ts_restrict_template_expressions.go +50 -50
  190. package/linthost/rules_ts_simple.go +249 -249
  191. package/linthost/rules_ts_sort_type_constituents.go +88 -88
  192. package/linthost/rules_ts_strict_boolean_expressions.go +103 -103
  193. package/linthost/rules_ts_switch_exhaustiveness_check.go +90 -90
  194. package/linthost/rules_ts_unbound_method.go +65 -65
  195. package/linthost/rules_tsdoc.go +88 -88
  196. package/linthost/rules_unicorn_better_regex.go +1 -1
  197. package/linthost/rules_unicorn_catch_error_name.go +19 -19
  198. package/linthost/rules_unicorn_consistent_assert.go +20 -20
  199. package/linthost/rules_unicorn_consistent_date_clone.go +27 -27
  200. package/linthost/rules_unicorn_consistent_destructuring.go +3 -3
  201. package/linthost/rules_unicorn_consistent_empty_array_spread.go +34 -34
  202. package/linthost/rules_unicorn_consistent_existence_index_check.go +42 -42
  203. package/linthost/rules_unicorn_consistent_function_scoping.go +3 -3
  204. package/linthost/rules_unicorn_consistent_template_literal_escape.go +3 -3
  205. package/linthost/rules_unicorn_custom_error_definition.go +92 -92
  206. package/linthost/rules_unicorn_empty_brace_spaces.go +47 -47
  207. package/linthost/rules_unicorn_error_message.go +34 -34
  208. package/linthost/rules_unicorn_escape_case.go +14 -14
  209. package/linthost/rules_unicorn_expiring_todo_comments.go +36 -36
  210. package/linthost/rules_unicorn_explicit_length_check.go +51 -51
  211. package/linthost/rules_unicorn_filename_case.go +1 -1
  212. package/linthost/rules_unicorn_import_style.go +1 -1
  213. package/linthost/rules_unicorn_isolated_functions.go +2 -2
  214. package/linthost/rules_unicorn_new_for_builtins.go +49 -49
  215. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +31 -31
  216. package/linthost/rules_unicorn_no_accessor_recursion.go +69 -69
  217. package/linthost/rules_unicorn_no_anonymous_default_export.go +40 -40
  218. package/linthost/rules_unicorn_no_array_callback_reference.go +33 -33
  219. package/linthost/rules_unicorn_no_array_for_each.go +14 -14
  220. package/linthost/rules_unicorn_no_array_method_this_argument.go +29 -29
  221. package/linthost/rules_unicorn_no_array_reduce.go +15 -15
  222. package/linthost/rules_unicorn_no_array_reverse.go +17 -17
  223. package/linthost/rules_unicorn_no_array_sort.go +17 -17
  224. package/linthost/rules_unicorn_no_await_expression_member.go +12 -12
  225. package/linthost/rules_unicorn_no_await_in_promise_methods.go +38 -38
  226. package/linthost/rules_unicorn_no_console_spaces.go +30 -30
  227. package/linthost/rules_unicorn_no_document_cookie.go +13 -13
  228. package/linthost/rules_unicorn_no_empty_file.go +16 -16
  229. package/linthost/rules_unicorn_no_for_loop.go +58 -58
  230. package/linthost/rules_unicorn_no_hex_escape.go +11 -11
  231. package/linthost/rules_unicorn_no_immediate_mutation.go +55 -55
  232. package/linthost/rules_unicorn_no_instanceof_builtins.go +34 -34
  233. package/linthost/rules_unicorn_no_invalid_fetch_options.go +52 -52
  234. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +25 -25
  235. package/linthost/rules_unicorn_no_keyword_prefix.go +56 -56
  236. package/linthost/rules_unicorn_no_lonely_if.go +21 -21
  237. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +22 -22
  238. package/linthost/rules_unicorn_no_named_default.go +25 -25
  239. package/linthost/rules_unicorn_no_negated_condition.go +54 -54
  240. package/linthost/rules_unicorn_no_negation_in_equality_check.go +23 -23
  241. package/linthost/rules_unicorn_no_nested_ternary.go +15 -15
  242. package/linthost/rules_unicorn_no_new_array.go +5 -5
  243. package/linthost/rules_unicorn_no_new_buffer.go +5 -5
  244. package/linthost/rules_unicorn_no_null.go +2 -2
  245. package/linthost/rules_unicorn_no_object_as_default_parameter.go +19 -19
  246. package/linthost/rules_unicorn_no_process_exit.go +17 -17
  247. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +29 -29
  248. package/linthost/rules_unicorn_no_static_only_class.go +27 -27
  249. package/linthost/rules_unicorn_no_thenable.go +47 -47
  250. package/linthost/rules_unicorn_no_this_assignment.go +10 -10
  251. package/linthost/rules_unicorn_no_typeof_undefined.go +31 -31
  252. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +23 -23
  253. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +37 -37
  254. package/linthost/rules_unicorn_no_unnecessary_await.go +24 -24
  255. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +22 -22
  256. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +67 -67
  257. package/linthost/rules_unicorn_no_unreadable_iife.go +22 -22
  258. package/linthost/rules_unicorn_no_useless_collection_argument.go +34 -34
  259. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +18 -18
  260. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +49 -49
  261. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +41 -41
  262. package/linthost/rules_unicorn_no_useless_length_check.go +82 -82
  263. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +42 -42
  264. package/linthost/rules_unicorn_no_useless_spread.go +38 -38
  265. package/linthost/rules_unicorn_no_useless_switch_case.go +29 -29
  266. package/linthost/rules_unicorn_no_useless_undefined.go +25 -25
  267. package/linthost/rules_unicorn_no_zero_fractions.go +17 -17
  268. package/linthost/rules_unicorn_number_literal_case.go +33 -33
  269. package/linthost/rules_unicorn_numeric_separators_style.go +36 -36
  270. package/linthost/rules_unicorn_prefer_add_event_listener.go +30 -30
  271. package/linthost/rules_unicorn_prefer_array_find.go +27 -27
  272. package/linthost/rules_unicorn_prefer_array_flat.go +25 -25
  273. package/linthost/rules_unicorn_prefer_array_flat_map.go +37 -37
  274. package/linthost/rules_unicorn_prefer_array_index_of.go +108 -108
  275. package/linthost/rules_unicorn_prefer_array_some.go +43 -43
  276. package/linthost/rules_unicorn_prefer_at.go +42 -42
  277. package/linthost/rules_unicorn_prefer_bigint_literals.go +42 -42
  278. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +15 -15
  279. package/linthost/rules_unicorn_prefer_class_fields.go +57 -57
  280. package/linthost/rules_unicorn_prefer_classlist_toggle.go +76 -76
  281. package/linthost/rules_unicorn_prefer_code_point.go +21 -21
  282. package/linthost/rules_unicorn_prefer_date_now.go +47 -47
  283. package/linthost/rules_unicorn_prefer_default_parameters.go +96 -96
  284. package/linthost/rules_unicorn_prefer_dom_node_append.go +14 -14
  285. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +27 -27
  286. package/linthost/rules_unicorn_prefer_dom_node_remove.go +17 -17
  287. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +11 -11
  288. package/linthost/rules_unicorn_prefer_event_target.go +10 -10
  289. package/linthost/rules_unicorn_prefer_export_from.go +99 -99
  290. package/linthost/rules_unicorn_prefer_global_this.go +91 -91
  291. package/linthost/rules_unicorn_prefer_import_meta_properties.go +38 -38
  292. package/linthost/rules_unicorn_prefer_includes.go +108 -108
  293. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +37 -37
  294. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +10 -10
  295. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +20 -20
  296. package/linthost/rules_unicorn_prefer_math_min_max.go +33 -33
  297. package/linthost/rules_unicorn_prefer_math_trunc.go +32 -32
  298. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +18 -18
  299. package/linthost/rules_unicorn_prefer_modern_math_apis.go +38 -38
  300. package/linthost/rules_unicorn_prefer_module.go +22 -22
  301. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +73 -73
  302. package/linthost/rules_unicorn_prefer_negative_index.go +46 -46
  303. package/linthost/rules_unicorn_prefer_node_protocol.go +90 -90
  304. package/linthost/rules_unicorn_prefer_number_properties.go +57 -57
  305. package/linthost/rules_unicorn_prefer_object_from_entries.go +26 -26
  306. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +24 -24
  307. package/linthost/rules_unicorn_prefer_prototype_methods.go +25 -25
  308. package/linthost/rules_unicorn_prefer_query_selector.go +25 -25
  309. package/linthost/rules_unicorn_prefer_reflect_apply.go +10 -10
  310. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +47 -47
  311. package/linthost/rules_unicorn_prefer_response_static_json.go +26 -26
  312. package/linthost/rules_unicorn_prefer_set_has.go +16 -16
  313. package/linthost/rules_unicorn_prefer_set_size.go +22 -22
  314. package/linthost/rules_unicorn_prefer_simple_condition_first.go +3 -3
  315. package/linthost/rules_unicorn_prefer_single_call.go +59 -59
  316. package/linthost/rules_unicorn_prefer_spread.go +24 -24
  317. package/linthost/rules_unicorn_prefer_string_raw.go +12 -12
  318. package/linthost/rules_unicorn_prefer_string_replace_all.go +46 -46
  319. package/linthost/rules_unicorn_prefer_string_slice.go +17 -17
  320. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +104 -104
  321. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +21 -21
  322. package/linthost/rules_unicorn_prefer_structured_clone.go +36 -36
  323. package/linthost/rules_unicorn_prefer_switch.go +65 -65
  324. package/linthost/rules_unicorn_prefer_ternary.go +35 -35
  325. package/linthost/rules_unicorn_prefer_top_level_await.go +34 -34
  326. package/linthost/rules_unicorn_prefer_type_error.go +84 -84
  327. package/linthost/rules_unicorn_prevent_abbreviations.go +68 -68
  328. package/linthost/rules_unicorn_relative_url_style.go +19 -19
  329. package/linthost/rules_unicorn_require_array_join_separator.go +18 -18
  330. package/linthost/rules_unicorn_require_module_attributes.go +25 -25
  331. package/linthost/rules_unicorn_require_module_specifiers.go +28 -28
  332. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +18 -18
  333. package/linthost/rules_unicorn_require_post_message_target_origin.go +18 -18
  334. package/linthost/rules_unicorn_string_content.go +1 -1
  335. package/linthost/rules_unicorn_switch_case_braces.go +16 -16
  336. package/linthost/rules_unicorn_switch_case_break_position.go +3 -3
  337. package/linthost/rules_unicorn_template_indent.go +1 -1
  338. package/linthost/rules_unicorn_text_encoding_identifier_case.go +36 -36
  339. package/linthost/rules_unicorn_throw_new_error.go +30 -30
  340. package/linthost/rules_var.go +273 -3
  341. package/package.json +3 -3
  342. package/src/defaultFormat.ts +11 -7
  343. package/src/structures/ITtscLintConfig.ts +5 -5
  344. package/src/structures/TtscLintRuleSetting.ts +19 -19
  345. package/src/structures/{ITtscLintFormat.ts → format/ITtscLintFormat.ts} +48 -75
  346. package/src/structures/format/ITtscLintFormatJsDoc.ts +16 -0
  347. package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
  348. package/src/structures/format/index.ts +3 -0
  349. package/src/structures/index.ts +1 -1
  350. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +20 -31
  351. package/src/structures/rules/ITtscLintBoundariesRules.ts +32 -36
  352. package/src/structures/rules/ITtscLintContributorRules.ts +6 -7
  353. package/src/structures/rules/ITtscLintCoreRules.ts +380 -408
  354. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +5 -5
  355. package/src/structures/rules/ITtscLintCypressRules.ts +34 -38
  356. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +28 -41
  357. package/src/structures/rules/ITtscLintFunctionalRules.ts +51 -56
  358. package/src/structures/rules/ITtscLintJestRules.ts +63 -74
  359. package/src/structures/rules/ITtscLintJsdocRules.ts +47 -54
  360. package/src/structures/rules/ITtscLintJsxA11yRules.ts +94 -102
  361. package/src/structures/rules/ITtscLintNextjsRules.ts +50 -55
  362. package/src/structures/rules/ITtscLintPlaywrightRules.ts +104 -122
  363. package/src/structures/rules/ITtscLintPromiseRules.ts +62 -71
  364. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +4 -4
  365. package/src/structures/rules/ITtscLintReactPerfRules.ts +17 -19
  366. package/src/structures/rules/ITtscLintReactRuleOptions.ts +8 -10
  367. package/src/structures/rules/ITtscLintReactRules.ts +91 -104
  368. package/src/structures/rules/ITtscLintRegexpRules.ts +46 -54
  369. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +7 -8
  370. package/src/structures/rules/ITtscLintSecurityRules.ts +45 -52
  371. package/src/structures/rules/ITtscLintSolidRules.ts +53 -56
  372. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +3 -4
  373. package/src/structures/rules/ITtscLintStorybookRules.ts +60 -69
  374. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +31 -37
  375. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +2 -3
  376. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +102 -119
  377. package/src/structures/rules/ITtscLintTypeScriptRules.ts +460 -518
  378. package/src/structures/rules/ITtscLintVitestRules.ts +43 -51
  379. package/lib/structures/ITtscLintFormat.js.map +0 -1
  380. /package/lib/structures/{ITtscLintFormat.js → format/ITtscLintFormat.js} +0 -0
@@ -24,80 +24,80 @@ type unicornPreferSwitch struct{}
24
24
 
25
25
  func (unicornPreferSwitch) Name() string { return "unicorn/prefer-switch" }
26
26
  func (unicornPreferSwitch) Visits() []shimast.Kind {
27
- return []shimast.Kind{shimast.KindIfStatement}
27
+ return []shimast.Kind{shimast.KindIfStatement}
28
28
  }
29
29
  func (unicornPreferSwitch) Check(ctx *Context, node *shimast.Node) {
30
- // Only fire on the outermost if — if our parent is also an
31
- // `IfStatement` whose else-branch is `node`, this is a middle of the
32
- // chain and a higher-up visit will report it once.
33
- if node.Parent != nil && node.Parent.Kind == shimast.KindIfStatement {
34
- parent := node.Parent.AsIfStatement()
35
- if parent != nil && parent.ElseStatement == node {
36
- return
37
- }
38
- }
39
- stmt := node.AsIfStatement()
40
- if stmt == nil || stmt.Expression == nil {
41
- return
42
- }
43
- discriminant, ok := unicornPreferSwitchDiscriminant(ctx, stmt.Expression)
44
- if !ok {
45
- return
46
- }
47
- // Count the outermost `if` plus every well-shaped `else if` that
48
- // compares against the same discriminant.
49
- branches := 1
50
- cur := stmt.ElseStatement
51
- for cur != nil && cur.Kind == shimast.KindIfStatement {
52
- inner := cur.AsIfStatement()
53
- if inner == nil || inner.Expression == nil {
54
- return
55
- }
56
- next, ok := unicornPreferSwitchDiscriminant(ctx, inner.Expression)
57
- if !ok || next != discriminant {
58
- return
59
- }
60
- branches++
61
- cur = inner.ElseStatement
62
- }
63
- if branches >= 3 {
64
- ctx.Report(node, "Three or more `else if` clauses comparing the same value should be a `switch`.")
65
- }
30
+ // Only fire on the outermost if — if our parent is also an
31
+ // `IfStatement` whose else-branch is `node`, this is a middle of the
32
+ // chain and a higher-up visit will report it once.
33
+ if node.Parent != nil && node.Parent.Kind == shimast.KindIfStatement {
34
+ parent := node.Parent.AsIfStatement()
35
+ if parent != nil && parent.ElseStatement == node {
36
+ return
37
+ }
38
+ }
39
+ stmt := node.AsIfStatement()
40
+ if stmt == nil || stmt.Expression == nil {
41
+ return
42
+ }
43
+ discriminant, ok := unicornPreferSwitchDiscriminant(ctx, stmt.Expression)
44
+ if !ok {
45
+ return
46
+ }
47
+ // Count the outermost `if` plus every well-shaped `else if` that
48
+ // compares against the same discriminant.
49
+ branches := 1
50
+ cur := stmt.ElseStatement
51
+ for cur != nil && cur.Kind == shimast.KindIfStatement {
52
+ inner := cur.AsIfStatement()
53
+ if inner == nil || inner.Expression == nil {
54
+ return
55
+ }
56
+ next, ok := unicornPreferSwitchDiscriminant(ctx, inner.Expression)
57
+ if !ok || next != discriminant {
58
+ return
59
+ }
60
+ branches++
61
+ cur = inner.ElseStatement
62
+ }
63
+ if branches >= 3 {
64
+ ctx.Report(node, "Three or more `else if` clauses comparing the same value should be a `switch`.")
65
+ }
66
66
  }
67
67
 
68
68
  // unicornPreferSwitchDiscriminant returns the textual form of the left
69
69
  // operand of an `===`/`==` comparison against a string-or-numeric
70
70
  // literal. Returns ok=false for any other shape.
71
71
  func unicornPreferSwitchDiscriminant(ctx *Context, expr *shimast.Node) (string, bool) {
72
- expr = stripParens(expr)
73
- if expr == nil || expr.Kind != shimast.KindBinaryExpression {
74
- return "", false
75
- }
76
- bin := expr.AsBinaryExpression()
77
- if bin == nil || bin.OperatorToken == nil {
78
- return "", false
79
- }
80
- switch bin.OperatorToken.Kind {
81
- case shimast.KindEqualsEqualsEqualsToken, shimast.KindEqualsEqualsToken:
82
- default:
83
- return "", false
84
- }
85
- right := stripParens(bin.Right)
86
- if right == nil {
87
- return "", false
88
- }
89
- switch right.Kind {
90
- case shimast.KindStringLiteral, shimast.KindNumericLiteral:
91
- default:
92
- return "", false
93
- }
94
- left := stripParens(bin.Left)
95
- if left == nil {
96
- return "", false
97
- }
98
- return nodeText(ctx.File, left), true
72
+ expr = stripParens(expr)
73
+ if expr == nil || expr.Kind != shimast.KindBinaryExpression {
74
+ return "", false
75
+ }
76
+ bin := expr.AsBinaryExpression()
77
+ if bin == nil || bin.OperatorToken == nil {
78
+ return "", false
79
+ }
80
+ switch bin.OperatorToken.Kind {
81
+ case shimast.KindEqualsEqualsEqualsToken, shimast.KindEqualsEqualsToken:
82
+ default:
83
+ return "", false
84
+ }
85
+ right := stripParens(bin.Right)
86
+ if right == nil {
87
+ return "", false
88
+ }
89
+ switch right.Kind {
90
+ case shimast.KindStringLiteral, shimast.KindNumericLiteral:
91
+ default:
92
+ return "", false
93
+ }
94
+ left := stripParens(bin.Left)
95
+ if left == nil {
96
+ return "", false
97
+ }
98
+ return nodeText(ctx.File, left), true
99
99
  }
100
100
 
101
101
  func init() {
102
- Register(unicornPreferSwitch{})
102
+ Register(unicornPreferSwitch{})
103
103
  }
@@ -21,26 +21,26 @@ type unicornPreferTernary struct{}
21
21
 
22
22
  func (unicornPreferTernary) Name() string { return "unicorn/prefer-ternary" }
23
23
  func (unicornPreferTernary) Visits() []shimast.Kind {
24
- return []shimast.Kind{shimast.KindIfStatement}
24
+ return []shimast.Kind{shimast.KindIfStatement}
25
25
  }
26
26
  func (unicornPreferTernary) Check(ctx *Context, node *shimast.Node) {
27
- stmt := node.AsIfStatement()
28
- if stmt == nil || stmt.ThenStatement == nil || stmt.ElseStatement == nil {
29
- return
30
- }
31
- // Reject `else if` — an `if`/`else if`/`else` ladder is a different
32
- // rewrite target (it becomes nested ternaries, which the upstream
33
- // rule explicitly does not require).
34
- if stmt.ElseStatement.Kind == shimast.KindIfStatement {
35
- return
36
- }
37
- if !unicornPreferTernaryIsSingleReturn(stmt.ThenStatement) {
38
- return
39
- }
40
- if !unicornPreferTernaryIsSingleReturn(stmt.ElseStatement) {
41
- return
42
- }
43
- ctx.Report(node, "Use a ternary instead of `if`/`else` whose branches differ only in the returned value.")
27
+ stmt := node.AsIfStatement()
28
+ if stmt == nil || stmt.ThenStatement == nil || stmt.ElseStatement == nil {
29
+ return
30
+ }
31
+ // Reject `else if` — an `if`/`else if`/`else` ladder is a different
32
+ // rewrite target (it becomes nested ternaries, which the upstream
33
+ // rule explicitly does not require).
34
+ if stmt.ElseStatement.Kind == shimast.KindIfStatement {
35
+ return
36
+ }
37
+ if !unicornPreferTernaryIsSingleReturn(stmt.ThenStatement) {
38
+ return
39
+ }
40
+ if !unicornPreferTernaryIsSingleReturn(stmt.ElseStatement) {
41
+ return
42
+ }
43
+ ctx.Report(node, "Use a ternary instead of `if`/`else` whose branches differ only in the returned value.")
44
44
  }
45
45
 
46
46
  // unicornPreferTernaryIsSingleReturn reports whether `branch` is a
@@ -48,24 +48,24 @@ func (unicornPreferTernary) Check(ctx *Context, node *shimast.Node) {
48
48
  // block. Returns false for empty returns (`return;`); ternary cannot
49
49
  // fold those because both arms have to produce a value.
50
50
  func unicornPreferTernaryIsSingleReturn(branch *shimast.Node) bool {
51
- if branch == nil {
52
- return false
53
- }
54
- stmt := branch
55
- if branch.Kind == shimast.KindBlock {
56
- block := branch.AsBlock()
57
- if block == nil || block.Statements == nil || len(block.Statements.Nodes) != 1 {
58
- return false
59
- }
60
- stmt = block.Statements.Nodes[0]
61
- }
62
- if stmt == nil || stmt.Kind != shimast.KindReturnStatement {
63
- return false
64
- }
65
- ret := stmt.AsReturnStatement()
66
- return ret != nil && ret.Expression != nil
51
+ if branch == nil {
52
+ return false
53
+ }
54
+ stmt := branch
55
+ if branch.Kind == shimast.KindBlock {
56
+ block := branch.AsBlock()
57
+ if block == nil || block.Statements == nil || len(block.Statements.Nodes) != 1 {
58
+ return false
59
+ }
60
+ stmt = block.Statements.Nodes[0]
61
+ }
62
+ if stmt == nil || stmt.Kind != shimast.KindReturnStatement {
63
+ return false
64
+ }
65
+ ret := stmt.AsReturnStatement()
66
+ return ret != nil && ret.Expression != nil
67
67
  }
68
68
 
69
69
  func init() {
70
- Register(unicornPreferTernary{})
70
+ Register(unicornPreferTernary{})
71
71
  }
@@ -21,22 +21,22 @@ type unicornPreferTopLevelAwait struct{}
21
21
 
22
22
  func (unicornPreferTopLevelAwait) Name() string { return "unicorn/prefer-top-level-await" }
23
23
  func (unicornPreferTopLevelAwait) Visits() []shimast.Kind {
24
- return []shimast.Kind{shimast.KindCallExpression}
24
+ return []shimast.Kind{shimast.KindCallExpression}
25
25
  }
26
26
  func (unicornPreferTopLevelAwait) Check(ctx *Context, node *shimast.Node) {
27
- call := node.AsCallExpression()
28
- if call == nil || call.Expression == nil ||
29
- call.Expression.Kind != shimast.KindPropertyAccessExpression {
30
- return
31
- }
32
- access := call.Expression.AsPropertyAccessExpression()
33
- if access == nil || identifierText(access.Name()) != "then" {
34
- return
35
- }
36
- if !unicornPreferTopLevelAwaitIsTopLevel(node) {
37
- return
38
- }
39
- ctx.Report(node, "Prefer top-level `await` over `.then` chains in ES modules.")
27
+ call := node.AsCallExpression()
28
+ if call == nil || call.Expression == nil ||
29
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
30
+ return
31
+ }
32
+ access := call.Expression.AsPropertyAccessExpression()
33
+ if access == nil || identifierText(access.Name()) != "then" {
34
+ return
35
+ }
36
+ if !unicornPreferTopLevelAwaitIsTopLevel(node) {
37
+ return
38
+ }
39
+ ctx.Report(node, "Prefer top-level `await` over `.then` chains in ES modules.")
40
40
  }
41
41
 
42
42
  // unicornPreferTopLevelAwaitIsTopLevel walks ancestors and reports
@@ -46,27 +46,27 @@ func (unicornPreferTopLevelAwait) Check(ctx *Context, node *shimast.Node) {
46
46
  // class-body, block, or module-block boundary, which would push the call
47
47
  // out of module scope.
48
48
  func unicornPreferTopLevelAwaitIsTopLevel(node *shimast.Node) bool {
49
- for cur := node.Parent; cur != nil; cur = cur.Parent {
50
- switch cur.Kind {
51
- case shimast.KindSourceFile:
52
- return true
53
- case shimast.KindFunctionDeclaration,
54
- shimast.KindFunctionExpression,
55
- shimast.KindArrowFunction,
56
- shimast.KindMethodDeclaration,
57
- shimast.KindGetAccessor,
58
- shimast.KindSetAccessor,
59
- shimast.KindConstructor,
60
- shimast.KindClassDeclaration,
61
- shimast.KindClassExpression,
62
- shimast.KindModuleBlock,
63
- shimast.KindBlock:
64
- return false
65
- }
66
- }
67
- return false
49
+ for cur := node.Parent; cur != nil; cur = cur.Parent {
50
+ switch cur.Kind {
51
+ case shimast.KindSourceFile:
52
+ return true
53
+ case shimast.KindFunctionDeclaration,
54
+ shimast.KindFunctionExpression,
55
+ shimast.KindArrowFunction,
56
+ shimast.KindMethodDeclaration,
57
+ shimast.KindGetAccessor,
58
+ shimast.KindSetAccessor,
59
+ shimast.KindConstructor,
60
+ shimast.KindClassDeclaration,
61
+ shimast.KindClassExpression,
62
+ shimast.KindModuleBlock,
63
+ shimast.KindBlock:
64
+ return false
65
+ }
66
+ }
67
+ return false
68
68
  }
69
69
 
70
70
  func init() {
71
- Register(unicornPreferTopLevelAwait{})
71
+ Register(unicornPreferTopLevelAwait{})
72
72
  }
@@ -22,79 +22,79 @@ type unicornPreferTypeError struct{}
22
22
 
23
23
  func (unicornPreferTypeError) Name() string { return "unicorn/prefer-type-error" }
24
24
  func (unicornPreferTypeError) Visits() []shimast.Kind {
25
- return []shimast.Kind{shimast.KindIfStatement}
25
+ return []shimast.Kind{shimast.KindIfStatement}
26
26
  }
27
27
  func (unicornPreferTypeError) Check(ctx *Context, node *shimast.Node) {
28
- stmt := node.AsIfStatement()
29
- if stmt == nil || stmt.Expression == nil || stmt.ThenStatement == nil {
30
- return
31
- }
32
- cond := stripParens(stmt.Expression)
33
- if cond == nil {
34
- return
35
- }
36
- // Accept either the bare type check (`typeof x !== "number"`) or a
37
- // negation of one (`!(x instanceof Foo)`).
38
- if cond.Kind == shimast.KindPrefixUnaryExpression {
39
- prefix := cond.AsPrefixUnaryExpression()
40
- if prefix == nil || prefix.Operator != shimast.KindExclamationToken {
41
- return
42
- }
43
- cond = stripParens(prefix.Operand)
44
- }
45
- if !unicornPreferTypeErrorIsTypeCheck(cond) {
46
- return
47
- }
48
- throw := unicornPreferTypeErrorSingleThrow(stmt.ThenStatement)
49
- if throw == nil {
50
- return
51
- }
52
- throwStmt := throw.AsThrowStatement()
53
- if throwStmt == nil {
54
- return
55
- }
56
- expr := stripParens(throwStmt.Expression)
57
- if expr == nil || expr.Kind != shimast.KindNewExpression {
58
- return
59
- }
60
- ne := expr.AsNewExpression()
61
- if ne == nil || identifierText(ne.Expression) != "Error" {
62
- return
63
- }
64
- ctx.Report(throw, "Throw `TypeError` (not `Error`) when the surrounding check is a runtime type check.")
28
+ stmt := node.AsIfStatement()
29
+ if stmt == nil || stmt.Expression == nil || stmt.ThenStatement == nil {
30
+ return
31
+ }
32
+ cond := stripParens(stmt.Expression)
33
+ if cond == nil {
34
+ return
35
+ }
36
+ // Accept either the bare type check (`typeof x !== "number"`) or a
37
+ // negation of one (`!(x instanceof Foo)`).
38
+ if cond.Kind == shimast.KindPrefixUnaryExpression {
39
+ prefix := cond.AsPrefixUnaryExpression()
40
+ if prefix == nil || prefix.Operator != shimast.KindExclamationToken {
41
+ return
42
+ }
43
+ cond = stripParens(prefix.Operand)
44
+ }
45
+ if !unicornPreferTypeErrorIsTypeCheck(cond) {
46
+ return
47
+ }
48
+ throw := unicornPreferTypeErrorSingleThrow(stmt.ThenStatement)
49
+ if throw == nil {
50
+ return
51
+ }
52
+ throwStmt := throw.AsThrowStatement()
53
+ if throwStmt == nil {
54
+ return
55
+ }
56
+ expr := stripParens(throwStmt.Expression)
57
+ if expr == nil || expr.Kind != shimast.KindNewExpression {
58
+ return
59
+ }
60
+ ne := expr.AsNewExpression()
61
+ if ne == nil || identifierText(ne.Expression) != "Error" {
62
+ return
63
+ }
64
+ ctx.Report(throw, "Throw `TypeError` (not `Error`) when the surrounding check is a runtime type check.")
65
65
  }
66
66
 
67
67
  // unicornPreferTypeErrorIsTypeCheck reports whether `node` is a
68
68
  // `typeof x` expression or `x instanceof Y` BinaryExpression. Both
69
69
  // shapes encode a runtime type test, which is what the rule keys off.
70
70
  func unicornPreferTypeErrorIsTypeCheck(node *shimast.Node) bool {
71
- if node == nil {
72
- return false
73
- }
74
- switch node.Kind {
75
- case shimast.KindTypeOfExpression:
76
- return true
77
- case shimast.KindBinaryExpression:
78
- bin := node.AsBinaryExpression()
79
- if bin == nil || bin.OperatorToken == nil {
80
- return false
81
- }
82
- if bin.OperatorToken.Kind == shimast.KindInstanceOfKeyword {
83
- return true
84
- }
85
- // `typeof x !== "string"` style — covers the common idiom.
86
- switch bin.OperatorToken.Kind {
87
- case shimast.KindEqualsEqualsEqualsToken,
88
- shimast.KindEqualsEqualsToken,
89
- shimast.KindExclamationEqualsEqualsToken,
90
- shimast.KindExclamationEqualsToken:
91
- left := stripParens(bin.Left)
92
- right := stripParens(bin.Right)
93
- return (left != nil && left.Kind == shimast.KindTypeOfExpression) ||
94
- (right != nil && right.Kind == shimast.KindTypeOfExpression)
95
- }
96
- }
97
- return false
71
+ if node == nil {
72
+ return false
73
+ }
74
+ switch node.Kind {
75
+ case shimast.KindTypeOfExpression:
76
+ return true
77
+ case shimast.KindBinaryExpression:
78
+ bin := node.AsBinaryExpression()
79
+ if bin == nil || bin.OperatorToken == nil {
80
+ return false
81
+ }
82
+ if bin.OperatorToken.Kind == shimast.KindInstanceOfKeyword {
83
+ return true
84
+ }
85
+ // `typeof x !== "string"` style — covers the common idiom.
86
+ switch bin.OperatorToken.Kind {
87
+ case shimast.KindEqualsEqualsEqualsToken,
88
+ shimast.KindEqualsEqualsToken,
89
+ shimast.KindExclamationEqualsEqualsToken,
90
+ shimast.KindExclamationEqualsToken:
91
+ left := stripParens(bin.Left)
92
+ right := stripParens(bin.Right)
93
+ return (left != nil && left.Kind == shimast.KindTypeOfExpression) ||
94
+ (right != nil && right.Kind == shimast.KindTypeOfExpression)
95
+ }
96
+ }
97
+ return false
98
98
  }
99
99
 
100
100
  // unicornPreferTypeErrorSingleThrow returns the single `throw`
@@ -102,26 +102,26 @@ func unicornPreferTypeErrorIsTypeCheck(node *shimast.Node) bool {
102
102
  // or a Block wrapping exactly one ThrowStatement. Returns nil for any
103
103
  // other shape.
104
104
  func unicornPreferTypeErrorSingleThrow(branch *shimast.Node) *shimast.Node {
105
- if branch == nil {
106
- return nil
107
- }
108
- if branch.Kind == shimast.KindThrowStatement {
109
- return branch
110
- }
111
- if branch.Kind != shimast.KindBlock {
112
- return nil
113
- }
114
- block := branch.AsBlock()
115
- if block == nil || block.Statements == nil || len(block.Statements.Nodes) != 1 {
116
- return nil
117
- }
118
- stmt := block.Statements.Nodes[0]
119
- if stmt == nil || stmt.Kind != shimast.KindThrowStatement {
120
- return nil
121
- }
122
- return stmt
105
+ if branch == nil {
106
+ return nil
107
+ }
108
+ if branch.Kind == shimast.KindThrowStatement {
109
+ return branch
110
+ }
111
+ if branch.Kind != shimast.KindBlock {
112
+ return nil
113
+ }
114
+ block := branch.AsBlock()
115
+ if block == nil || block.Statements == nil || len(block.Statements.Nodes) != 1 {
116
+ return nil
117
+ }
118
+ stmt := block.Statements.Nodes[0]
119
+ if stmt == nil || stmt.Kind != shimast.KindThrowStatement {
120
+ return nil
121
+ }
122
+ return stmt
123
123
  }
124
124
 
125
125
  func init() {
126
- Register(unicornPreferTypeError{})
126
+ Register(unicornPreferTypeError{})
127
127
  }