@ttsc/lint 0.14.0-dev.20260529.2 → 0.14.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 (380) hide show
  1. package/README.md +23 -25
  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 +167 -5
  68. package/linthost/print_nodes_call.go +786 -77
  69. package/linthost/print_nodes_function.go +43 -0
  70. package/linthost/print_nodes_imports.go +64 -14
  71. package/linthost/print_nodes_list.go +214 -8
  72. package/linthost/print_nodes_object.go +14 -6
  73. package/linthost/print_nodes_ternary.go +147 -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 +213 -0
  83. package/linthost/rules_format_bracket_spacing.go +117 -0
  84. package/linthost/rules_format_clause_join.go +179 -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 +180 -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 +517 -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
@@ -15,35 +15,35 @@
15
15
  package linthost
16
16
 
17
17
  import (
18
- shimast "github.com/microsoft/typescript-go/shim/ast"
19
- shimchecker "github.com/microsoft/typescript-go/shim/checker"
18
+ shimast "github.com/microsoft/typescript-go/shim/ast"
19
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
20
20
  )
21
21
 
22
22
  type noUnsafeUnaryMinus struct{}
23
23
 
24
24
  func (noUnsafeUnaryMinus) Name() string { return "typescript/no-unsafe-unary-minus" }
25
25
  func (noUnsafeUnaryMinus) NeedsTypeChecker() bool {
26
- return true
26
+ return true
27
27
  }
28
28
  func (noUnsafeUnaryMinus) Visits() []shimast.Kind {
29
- return []shimast.Kind{shimast.KindPrefixUnaryExpression}
29
+ return []shimast.Kind{shimast.KindPrefixUnaryExpression}
30
30
  }
31
31
  func (noUnsafeUnaryMinus) Check(ctx *Context, node *shimast.Node) {
32
- if ctx.Checker == nil {
33
- return
34
- }
35
- expr := node.AsPrefixUnaryExpression()
36
- if expr == nil || expr.Operator != shimast.KindMinusToken || expr.Operand == nil {
37
- return
38
- }
39
- t := ctx.Checker.GetTypeAtLocation(expr.Operand)
40
- if t == nil {
41
- return
42
- }
43
- if noUnsafeUnaryMinusIsNumeric(t) {
44
- return
45
- }
46
- ctx.Report(node, "Unary `-` requires a number-like or bigint-like operand. Other shapes are silently coerced via `Number(x)` and almost always indicate a bug.")
32
+ if ctx.Checker == nil {
33
+ return
34
+ }
35
+ expr := node.AsPrefixUnaryExpression()
36
+ if expr == nil || expr.Operator != shimast.KindMinusToken || expr.Operand == nil {
37
+ return
38
+ }
39
+ t := ctx.Checker.GetTypeAtLocation(expr.Operand)
40
+ if t == nil {
41
+ return
42
+ }
43
+ if noUnsafeUnaryMinusIsNumeric(t) {
44
+ return
45
+ }
46
+ ctx.Report(node, "Unary `-` requires a number-like or bigint-like operand. Other shapes are silently coerced via `Number(x)` and almost always indicate a bug.")
47
47
  }
48
48
 
49
49
  // noUnsafeUnaryMinusIsNumeric reports whether t is provably number-like
@@ -52,30 +52,30 @@ func (noUnsafeUnaryMinus) Check(ctx *Context, node *shimast.Node) {
52
52
  // matching the upstream `allowAny` posture. Unions and intersections
53
53
  // must have every constituent numeric for the whole type to count.
54
54
  func noUnsafeUnaryMinusIsNumeric(t *shimchecker.Type) bool {
55
- if t == nil {
56
- return true
57
- }
58
- flags := t.Flags()
59
- if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0 {
60
- return true
61
- }
62
- if flags&(shimchecker.TypeFlagsNumberLike|shimchecker.TypeFlagsBigIntLike) != 0 {
63
- return true
64
- }
65
- if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
66
- for _, part := range t.Types() {
67
- if part == nil {
68
- continue
69
- }
70
- if !noUnsafeUnaryMinusIsNumeric(part) {
71
- return false
72
- }
73
- }
74
- return true
75
- }
76
- return false
55
+ if t == nil {
56
+ return true
57
+ }
58
+ flags := t.Flags()
59
+ if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0 {
60
+ return true
61
+ }
62
+ if flags&(shimchecker.TypeFlagsNumberLike|shimchecker.TypeFlagsBigIntLike) != 0 {
63
+ return true
64
+ }
65
+ if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
66
+ for _, part := range t.Types() {
67
+ if part == nil {
68
+ continue
69
+ }
70
+ if !noUnsafeUnaryMinusIsNumeric(part) {
71
+ return false
72
+ }
73
+ }
74
+ return true
75
+ }
76
+ return false
77
77
  }
78
78
 
79
79
  func init() {
80
- Register(noUnsafeUnaryMinus{})
80
+ Register(noUnsafeUnaryMinus{})
81
81
  }
@@ -18,35 +18,35 @@
18
18
  package linthost
19
19
 
20
20
  import (
21
- shimast "github.com/microsoft/typescript-go/shim/ast"
21
+ shimast "github.com/microsoft/typescript-go/shim/ast"
22
22
  )
23
23
 
24
24
  type tsNoUselessConstructor struct{}
25
25
 
26
26
  func (tsNoUselessConstructor) Name() string { return "typescript/no-useless-constructor" }
27
27
  func (tsNoUselessConstructor) Visits() []shimast.Kind {
28
- return []shimast.Kind{shimast.KindConstructor}
28
+ return []shimast.Kind{shimast.KindConstructor}
29
29
  }
30
30
  func (tsNoUselessConstructor) Check(ctx *Context, node *shimast.Node) {
31
- ctor := node.AsConstructorDeclaration()
32
- if ctor == nil || ctor.Body == nil {
33
- return
34
- }
35
- body := ctor.Body.AsBlock()
36
- if body == nil || body.Statements == nil || len(body.Statements.Nodes) != 0 {
37
- return
38
- }
39
- // Any parameter property keeps the constructor meaningful: the
40
- // shorthand IS the field declaration. Removing the constructor
41
- // would silently delete the field, so this is not "useless".
42
- for _, param := range node.Parameters() {
43
- if isParameterProperty(param) {
44
- return
45
- }
46
- }
47
- ctx.Report(node, "Useless constructor with no parameter properties.")
31
+ ctor := node.AsConstructorDeclaration()
32
+ if ctor == nil || ctor.Body == nil {
33
+ return
34
+ }
35
+ body := ctor.Body.AsBlock()
36
+ if body == nil || body.Statements == nil || len(body.Statements.Nodes) != 0 {
37
+ return
38
+ }
39
+ // Any parameter property keeps the constructor meaningful: the
40
+ // shorthand IS the field declaration. Removing the constructor
41
+ // would silently delete the field, so this is not "useless".
42
+ for _, param := range node.Parameters() {
43
+ if isParameterProperty(param) {
44
+ return
45
+ }
46
+ }
47
+ ctx.Report(node, "Useless constructor with no parameter properties.")
48
48
  }
49
49
 
50
50
  func init() {
51
- Register(tsNoUselessConstructor{})
51
+ Register(tsNoUselessConstructor{})
52
52
  }
@@ -8,8 +8,8 @@
8
8
  package linthost
9
9
 
10
10
  import (
11
- shimast "github.com/microsoft/typescript-go/shim/ast"
12
- shimchecker "github.com/microsoft/typescript-go/shim/checker"
11
+ shimast "github.com/microsoft/typescript-go/shim/ast"
12
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
13
13
  )
14
14
 
15
15
  // nonNullableTypeAssertionStyle reports `expr as T` where `T` equals the
@@ -32,77 +32,77 @@ import (
32
32
  type nonNullableTypeAssertionStyle struct{}
33
33
 
34
34
  func (nonNullableTypeAssertionStyle) Name() string {
35
- return "typescript/non-nullable-type-assertion-style"
35
+ return "typescript/non-nullable-type-assertion-style"
36
36
  }
37
37
  func (nonNullableTypeAssertionStyle) NeedsTypeChecker() bool {
38
- return true
38
+ return true
39
39
  }
40
40
  func (nonNullableTypeAssertionStyle) Visits() []shimast.Kind {
41
- return []shimast.Kind{shimast.KindAsExpression}
41
+ return []shimast.Kind{shimast.KindAsExpression}
42
42
  }
43
43
  func (nonNullableTypeAssertionStyle) Check(ctx *Context, node *shimast.Node) {
44
- if ctx.Checker == nil {
45
- return
46
- }
47
- as := node.AsAsExpression()
48
- if as == nil || as.Expression == nil || as.Type == nil {
49
- return
50
- }
51
- sourceType := ctx.Checker.GetTypeAtLocation(as.Expression)
52
- if sourceType == nil {
53
- return
54
- }
55
- // Only consider expressions whose static type actually carries
56
- // `null` or `undefined`; otherwise `x!` is not the same as `x as T`.
57
- if !nonNullableTypeAssertionStyleIsNullable(sourceType) {
58
- return
59
- }
60
- nonNullable := ctx.Checker.GetNonNullableType(sourceType)
61
- if nonNullable == nil {
62
- return
63
- }
64
- assertedType := ctx.Checker.GetTypeFromTypeNode(as.Type)
65
- if assertedType == nil {
66
- return
67
- }
68
- // Bidirectional assignability stands in for type identity: the
69
- // stripped source type must coincide with the asserted type up to
70
- // structural equivalence. Both sides have to hold so that
71
- // `x as SomeSupertype` or `x as SomeSubtype` does not get rewritten
72
- // to `x!` and silently lose information.
73
- if !ctx.Checker.IsTypeAssignableTo(nonNullable, assertedType) {
74
- return
75
- }
76
- if !ctx.Checker.IsTypeAssignableTo(assertedType, nonNullable) {
77
- return
78
- }
79
- ctx.Report(node, "Use a `!` assertion to more succinctly remove `null` and `undefined` from the type.")
44
+ if ctx.Checker == nil {
45
+ return
46
+ }
47
+ as := node.AsAsExpression()
48
+ if as == nil || as.Expression == nil || as.Type == nil {
49
+ return
50
+ }
51
+ sourceType := ctx.Checker.GetTypeAtLocation(as.Expression)
52
+ if sourceType == nil {
53
+ return
54
+ }
55
+ // Only consider expressions whose static type actually carries
56
+ // `null` or `undefined`; otherwise `x!` is not the same as `x as T`.
57
+ if !nonNullableTypeAssertionStyleIsNullable(sourceType) {
58
+ return
59
+ }
60
+ nonNullable := ctx.Checker.GetNonNullableType(sourceType)
61
+ if nonNullable == nil {
62
+ return
63
+ }
64
+ assertedType := ctx.Checker.GetTypeFromTypeNode(as.Type)
65
+ if assertedType == nil {
66
+ return
67
+ }
68
+ // Bidirectional assignability stands in for type identity: the
69
+ // stripped source type must coincide with the asserted type up to
70
+ // structural equivalence. Both sides have to hold so that
71
+ // `x as SomeSupertype` or `x as SomeSubtype` does not get rewritten
72
+ // to `x!` and silently lose information.
73
+ if !ctx.Checker.IsTypeAssignableTo(nonNullable, assertedType) {
74
+ return
75
+ }
76
+ if !ctx.Checker.IsTypeAssignableTo(assertedType, nonNullable) {
77
+ return
78
+ }
79
+ ctx.Report(node, "Use a `!` assertion to more succinctly remove `null` and `undefined` from the type.")
80
80
  }
81
81
 
82
82
  // nonNullableTypeAssertionStyleIsNullable reports whether t carries
83
83
  // `null` or `undefined` either at the top level (for direct
84
84
  // `T | null` / `T | undefined` shapes) or inside a union constituent.
85
85
  func nonNullableTypeAssertionStyleIsNullable(t *shimchecker.Type) bool {
86
- if t == nil {
87
- return false
88
- }
89
- flags := t.Flags()
90
- if flags&(shimchecker.TypeFlagsNull|shimchecker.TypeFlagsUndefined) != 0 {
91
- return true
92
- }
93
- if flags&shimchecker.TypeFlagsUnion != 0 {
94
- for _, part := range t.Types() {
95
- if part == nil {
96
- continue
97
- }
98
- if nonNullableTypeAssertionStyleIsNullable(part) {
99
- return true
100
- }
101
- }
102
- }
103
- return false
86
+ if t == nil {
87
+ return false
88
+ }
89
+ flags := t.Flags()
90
+ if flags&(shimchecker.TypeFlagsNull|shimchecker.TypeFlagsUndefined) != 0 {
91
+ return true
92
+ }
93
+ if flags&shimchecker.TypeFlagsUnion != 0 {
94
+ for _, part := range t.Types() {
95
+ if part == nil {
96
+ continue
97
+ }
98
+ if nonNullableTypeAssertionStyleIsNullable(part) {
99
+ return true
100
+ }
101
+ }
102
+ }
103
+ return false
104
104
  }
105
105
 
106
106
  func init() {
107
- Register(nonNullableTypeAssertionStyle{})
107
+ Register(nonNullableTypeAssertionStyle{})
108
108
  }
@@ -14,25 +14,25 @@
14
14
  package linthost
15
15
 
16
16
  import (
17
- shimast "github.com/microsoft/typescript-go/shim/ast"
17
+ shimast "github.com/microsoft/typescript-go/shim/ast"
18
18
  )
19
19
 
20
20
  type parameterProperties struct{}
21
21
 
22
22
  func (parameterProperties) Name() string { return "typescript/parameter-properties" }
23
23
  func (parameterProperties) Visits() []shimast.Kind {
24
- return []shimast.Kind{shimast.KindParameter}
24
+ return []shimast.Kind{shimast.KindParameter}
25
25
  }
26
26
  func (parameterProperties) Check(ctx *Context, node *shimast.Node) {
27
- if node == nil || node.Parent == nil || node.Parent.Kind != shimast.KindConstructor {
28
- return
29
- }
30
- if !isParameterProperty(node) {
31
- return
32
- }
33
- ctx.Report(node, "Prefer a plain class field declaration over a constructor parameter property.")
27
+ if node == nil || node.Parent == nil || node.Parent.Kind != shimast.KindConstructor {
28
+ return
29
+ }
30
+ if !isParameterProperty(node) {
31
+ return
32
+ }
33
+ ctx.Report(node, "Prefer a plain class field declaration over a constructor parameter property.")
34
34
  }
35
35
 
36
36
  func init() {
37
- Register(parameterProperties{})
37
+ Register(parameterProperties{})
38
38
  }
@@ -16,61 +16,61 @@
16
16
  package linthost
17
17
 
18
18
  import (
19
- shimast "github.com/microsoft/typescript-go/shim/ast"
20
- shimchecker "github.com/microsoft/typescript-go/shim/checker"
19
+ shimast "github.com/microsoft/typescript-go/shim/ast"
20
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
21
21
  )
22
22
 
23
23
  type preferFind struct{}
24
24
 
25
25
  func (preferFind) Name() string { return "typescript/prefer-find" }
26
26
  func (preferFind) NeedsTypeChecker() bool {
27
- return true
27
+ return true
28
28
  }
29
29
  func (preferFind) Visits() []shimast.Kind {
30
- return []shimast.Kind{
31
- shimast.KindElementAccessExpression,
32
- shimast.KindCallExpression,
33
- }
30
+ return []shimast.Kind{
31
+ shimast.KindElementAccessExpression,
32
+ shimast.KindCallExpression,
33
+ }
34
34
  }
35
35
  func (preferFind) Check(ctx *Context, node *shimast.Node) {
36
- if ctx.Checker == nil {
37
- return
38
- }
39
- switch node.Kind {
40
- case shimast.KindElementAccessExpression:
41
- access := node.AsElementAccessExpression()
42
- if access == nil || access.Expression == nil || access.ArgumentExpression == nil {
43
- return
44
- }
45
- // Index must be the literal `0`.
46
- if !preferFindIsZeroLiteral(access.ArgumentExpression) {
47
- return
48
- }
49
- if !preferFindIsArrayFilterCall(ctx, access.Expression) {
50
- return
51
- }
52
- ctx.Report(node, preferFindMessage)
53
- case shimast.KindCallExpression:
54
- call := node.AsCallExpression()
55
- if call == nil || call.Expression == nil {
56
- return
57
- }
58
- // Match `<filter-call>.at(0)`.
59
- receiver, method, ok := promisePropertyAccessParts(call.Expression)
60
- if !ok || method != "at" {
61
- return
62
- }
63
- if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
64
- return
65
- }
66
- if !preferFindIsZeroLiteral(call.Arguments.Nodes[0]) {
67
- return
68
- }
69
- if !preferFindIsArrayFilterCall(ctx, receiver) {
70
- return
71
- }
72
- ctx.Report(node, preferFindMessage)
73
- }
36
+ if ctx.Checker == nil {
37
+ return
38
+ }
39
+ switch node.Kind {
40
+ case shimast.KindElementAccessExpression:
41
+ access := node.AsElementAccessExpression()
42
+ if access == nil || access.Expression == nil || access.ArgumentExpression == nil {
43
+ return
44
+ }
45
+ // Index must be the literal `0`.
46
+ if !preferFindIsZeroLiteral(access.ArgumentExpression) {
47
+ return
48
+ }
49
+ if !preferFindIsArrayFilterCall(ctx, access.Expression) {
50
+ return
51
+ }
52
+ ctx.Report(node, preferFindMessage)
53
+ case shimast.KindCallExpression:
54
+ call := node.AsCallExpression()
55
+ if call == nil || call.Expression == nil {
56
+ return
57
+ }
58
+ // Match `<filter-call>.at(0)`.
59
+ receiver, method, ok := promisePropertyAccessParts(call.Expression)
60
+ if !ok || method != "at" {
61
+ return
62
+ }
63
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
64
+ return
65
+ }
66
+ if !preferFindIsZeroLiteral(call.Arguments.Nodes[0]) {
67
+ return
68
+ }
69
+ if !preferFindIsArrayFilterCall(ctx, receiver) {
70
+ return
71
+ }
72
+ ctx.Report(node, preferFindMessage)
73
+ }
74
74
  }
75
75
 
76
76
  const preferFindMessage = "Prefer `.find(predicate)` over `.filter(predicate)[0]` / `.filter(predicate).at(0)` — `find` short-circuits on the first match and avoids materializing the full filtered array."
@@ -81,25 +81,25 @@ const preferFindMessage = "Prefer `.find(predicate)` over `.filter(predicate)[0]
81
81
  // is technically a separate value at the language level even though
82
82
  // `arr[-0]` resolves the same. Keeps the rule's noise floor narrow.
83
83
  func preferFindIsZeroLiteral(node *shimast.Node) bool {
84
- node = stripParens(node)
85
- if node == nil {
86
- return false
87
- }
88
- if node.Kind == shimast.KindNumericLiteral {
89
- return numericLiteralText(node) == "0"
90
- }
91
- if node.Kind == shimast.KindPrefixUnaryExpression {
92
- prefix := node.AsPrefixUnaryExpression()
93
- if prefix == nil || prefix.Operand == nil {
94
- return false
95
- }
96
- if prefix.Operator != shimast.KindPlusToken {
97
- return false
98
- }
99
- return prefix.Operand.Kind == shimast.KindNumericLiteral &&
100
- numericLiteralText(prefix.Operand) == "0"
101
- }
102
- return false
84
+ node = stripParens(node)
85
+ if node == nil {
86
+ return false
87
+ }
88
+ if node.Kind == shimast.KindNumericLiteral {
89
+ return numericLiteralText(node) == "0"
90
+ }
91
+ if node.Kind == shimast.KindPrefixUnaryExpression {
92
+ prefix := node.AsPrefixUnaryExpression()
93
+ if prefix == nil || prefix.Operand == nil {
94
+ return false
95
+ }
96
+ if prefix.Operator != shimast.KindPlusToken {
97
+ return false
98
+ }
99
+ return prefix.Operand.Kind == shimast.KindNumericLiteral &&
100
+ numericLiteralText(prefix.Operand) == "0"
101
+ }
102
+ return false
103
103
  }
104
104
 
105
105
  // preferFindIsArrayFilterCall reports whether `node` (after stripping
@@ -108,32 +108,32 @@ func preferFindIsZeroLiteral(node *shimast.Node) bool {
108
108
  // by `prefer-includes` for `.indexOf(x)`: a user type with a custom
109
109
  // `filter` method should NOT trigger the rule.
110
110
  func preferFindIsArrayFilterCall(ctx *Context, node *shimast.Node) bool {
111
- node = stripParens(node)
112
- if node == nil || node.Kind != shimast.KindCallExpression {
113
- return false
114
- }
115
- call := node.AsCallExpression()
116
- if call == nil || call.Expression == nil {
117
- return false
118
- }
119
- receiver, method, ok := promisePropertyAccessParts(call.Expression)
120
- if !ok || method != "filter" {
121
- return false
122
- }
123
- if receiver == nil {
124
- return false
125
- }
126
- // `.filter` accepts an optional `thisArg`, so require at least one
127
- // argument (the predicate) — a zero-arg call would not parse on the
128
- // real lib.es5 declaration and is conservatively skipped.
129
- if call.Arguments == nil || len(call.Arguments.Nodes) == 0 {
130
- return false
131
- }
132
- t := ctx.Checker.GetTypeAtLocation(receiver)
133
- if t == nil {
134
- return false
135
- }
136
- return preferFindIsArrayLike(ctx.Checker, t)
111
+ node = stripParens(node)
112
+ if node == nil || node.Kind != shimast.KindCallExpression {
113
+ return false
114
+ }
115
+ call := node.AsCallExpression()
116
+ if call == nil || call.Expression == nil {
117
+ return false
118
+ }
119
+ receiver, method, ok := promisePropertyAccessParts(call.Expression)
120
+ if !ok || method != "filter" {
121
+ return false
122
+ }
123
+ if receiver == nil {
124
+ return false
125
+ }
126
+ // `.filter` accepts an optional `thisArg`, so require at least one
127
+ // argument (the predicate) — a zero-arg call would not parse on the
128
+ // real lib.es5 declaration and is conservatively skipped.
129
+ if call.Arguments == nil || len(call.Arguments.Nodes) == 0 {
130
+ return false
131
+ }
132
+ t := ctx.Checker.GetTypeAtLocation(receiver)
133
+ if t == nil {
134
+ return false
135
+ }
136
+ return preferFindIsArrayLike(ctx.Checker, t)
137
137
  }
138
138
 
139
139
  // preferFindIsArrayLike reports whether t is provably an array or
@@ -146,33 +146,33 @@ func preferFindIsArrayFilterCall(ctx *Context, node *shimast.Node) bool {
146
146
  // though they expose a `.filter`-shaped method via lib polyfills,
147
147
  // because the upstream rule only fires on the genuine `Array#filter`.
148
148
  func preferFindIsArrayLike(checker *shimchecker.Checker, t *shimchecker.Type) bool {
149
- if checker == nil || t == nil {
150
- return false
151
- }
152
- flags := t.Flags()
153
- if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0 {
154
- return false
155
- }
156
- if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
157
- for _, part := range t.Types() {
158
- if part == nil {
159
- continue
160
- }
161
- if !preferFindIsArrayLike(checker, part) {
162
- return false
163
- }
164
- }
165
- return true
166
- }
167
- if shimchecker.Checker_isArrayType(checker, t) {
168
- return true
169
- }
170
- if shimchecker.IsTupleType(t) {
171
- return true
172
- }
173
- return false
149
+ if checker == nil || t == nil {
150
+ return false
151
+ }
152
+ flags := t.Flags()
153
+ if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0 {
154
+ return false
155
+ }
156
+ if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
157
+ for _, part := range t.Types() {
158
+ if part == nil {
159
+ continue
160
+ }
161
+ if !preferFindIsArrayLike(checker, part) {
162
+ return false
163
+ }
164
+ }
165
+ return true
166
+ }
167
+ if shimchecker.Checker_isArrayType(checker, t) {
168
+ return true
169
+ }
170
+ if shimchecker.IsTupleType(t) {
171
+ return true
172
+ }
173
+ return false
174
174
  }
175
175
 
176
176
  func init() {
177
- Register(preferFind{})
177
+ Register(preferFind{})
178
178
  }