@ttsc/lint 0.13.0 → 0.14.0-dev.20250530.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 (498) hide show
  1. package/README.md +955 -85
  2. package/lib/defaultFormat.d.ts +15 -8
  3. package/lib/defaultFormat.js +15 -8
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/index.d.ts +46 -0
  6. package/lib/index.js +60 -37
  7. package/lib/index.js.map +1 -1
  8. package/lib/structures/ITtscLintConfig.d.ts +12 -6
  9. package/lib/structures/TtscLintRuleSetting.d.ts +49 -0
  10. package/lib/structures/{TtscLintRuleOptions.js → TtscLintRuleSetting.js} +1 -1
  11. package/lib/structures/TtscLintRuleSetting.js.map +1 -0
  12. package/lib/structures/format/ITtscLintFormat.d.ts +128 -0
  13. package/lib/structures/{TtscLintRuleMap.js → format/ITtscLintFormat.js} +1 -1
  14. package/lib/structures/format/ITtscLintFormat.js.map +1 -0
  15. package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +17 -0
  16. package/lib/structures/{ITtscLintFormatConfig.js → format/ITtscLintFormatJsDoc.js} +1 -1
  17. package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
  18. package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
  19. package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
  20. package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
  21. package/lib/structures/format/index.d.ts +3 -0
  22. package/lib/structures/format/index.js +20 -0
  23. package/lib/structures/format/index.js.map +1 -0
  24. package/lib/structures/index.d.ts +3 -4
  25. package/lib/structures/index.js +3 -4
  26. package/lib/structures/index.js.map +1 -1
  27. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +95 -0
  28. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +13 -0
  29. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
  30. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +75 -0
  31. package/lib/structures/rules/ITtscLintBoundariesRules.js +3 -0
  32. package/lib/structures/rules/ITtscLintBoundariesRules.js.map +1 -0
  33. package/lib/structures/rules/ITtscLintContributorRules.d.ts +16 -0
  34. package/lib/structures/rules/ITtscLintContributorRules.js +3 -0
  35. package/lib/structures/rules/ITtscLintContributorRules.js.map +1 -0
  36. package/lib/structures/rules/ITtscLintCoreRules.d.ts +1229 -0
  37. package/lib/structures/rules/ITtscLintCoreRules.js +3 -0
  38. package/lib/structures/rules/ITtscLintCoreRules.js.map +1 -0
  39. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +17 -0
  40. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +10 -0
  41. package/lib/structures/rules/ITtscLintCypressRuleOptions.js.map +1 -0
  42. package/lib/structures/rules/ITtscLintCypressRules.d.ts +125 -0
  43. package/lib/structures/rules/ITtscLintCypressRules.js +3 -0
  44. package/lib/structures/rules/ITtscLintCypressRules.js.map +1 -0
  45. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +154 -0
  46. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +13 -0
  47. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js.map +1 -0
  48. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +162 -0
  49. package/lib/structures/rules/ITtscLintFunctionalRules.js +3 -0
  50. package/lib/structures/rules/ITtscLintFunctionalRules.js.map +1 -0
  51. package/lib/structures/rules/ITtscLintJestRules.d.ts +190 -0
  52. package/lib/structures/rules/ITtscLintJestRules.js +3 -0
  53. package/lib/structures/rules/ITtscLintJestRules.js.map +1 -0
  54. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +133 -0
  55. package/lib/structures/rules/ITtscLintJsdocRules.js +3 -0
  56. package/lib/structures/rules/ITtscLintJsdocRules.js.map +1 -0
  57. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +294 -0
  58. package/lib/structures/rules/ITtscLintJsxA11yRules.js +3 -0
  59. package/lib/structures/rules/ITtscLintJsxA11yRules.js.map +1 -0
  60. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +180 -0
  61. package/lib/structures/rules/ITtscLintNextjsRules.js +3 -0
  62. package/lib/structures/rules/ITtscLintNextjsRules.js.map +1 -0
  63. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +312 -0
  64. package/lib/structures/rules/ITtscLintPlaywrightRules.js +3 -0
  65. package/lib/structures/rules/ITtscLintPlaywrightRules.js.map +1 -0
  66. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +179 -0
  67. package/lib/structures/rules/ITtscLintPromiseRules.js +3 -0
  68. package/lib/structures/rules/ITtscLintPromiseRules.js.map +1 -0
  69. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +18 -0
  70. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js +8 -0
  71. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js.map +1 -0
  72. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +49 -0
  73. package/lib/structures/rules/ITtscLintReactPerfRules.js +3 -0
  74. package/lib/structures/rules/ITtscLintReactPerfRules.js.map +1 -0
  75. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +37 -0
  76. package/lib/structures/rules/ITtscLintReactRuleOptions.js +11 -0
  77. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
  78. package/lib/structures/rules/ITtscLintReactRules.d.ts +276 -0
  79. package/lib/structures/rules/ITtscLintReactRules.js +3 -0
  80. package/lib/structures/rules/ITtscLintReactRules.js.map +1 -0
  81. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +182 -0
  82. package/lib/structures/rules/ITtscLintRegexpRules.js +3 -0
  83. package/lib/structures/rules/ITtscLintRegexpRules.js.map +1 -0
  84. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +65 -0
  85. package/lib/structures/rules/ITtscLintRuleOptionsMap.js +3 -0
  86. package/lib/structures/rules/ITtscLintRuleOptionsMap.js.map +1 -0
  87. package/lib/structures/rules/ITtscLintRules.d.ts +55 -0
  88. package/lib/structures/{TtscLintRule.js → rules/ITtscLintRules.js} +1 -1
  89. package/lib/structures/rules/ITtscLintRules.js.map +1 -0
  90. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +141 -0
  91. package/lib/structures/rules/ITtscLintSecurityRules.js +3 -0
  92. package/lib/structures/rules/ITtscLintSecurityRules.js.map +1 -0
  93. package/lib/structures/rules/ITtscLintSolidRules.d.ts +178 -0
  94. package/lib/structures/rules/ITtscLintSolidRules.js +3 -0
  95. package/lib/structures/rules/ITtscLintSolidRules.js.map +1 -0
  96. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +20 -0
  97. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js +9 -0
  98. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js.map +1 -0
  99. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +165 -0
  100. package/lib/structures/rules/ITtscLintStorybookRules.js +3 -0
  101. package/lib/structures/rules/ITtscLintStorybookRules.js.map +1 -0
  102. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +88 -0
  103. package/lib/structures/rules/ITtscLintTanstackQueryRules.js +3 -0
  104. package/lib/structures/rules/ITtscLintTanstackQueryRules.js.map +1 -0
  105. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +21 -0
  106. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js +10 -0
  107. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js.map +1 -0
  108. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +293 -0
  109. package/lib/structures/rules/ITtscLintTestingLibraryRules.js +3 -0
  110. package/lib/structures/rules/ITtscLintTestingLibraryRules.js.map +1 -0
  111. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +1074 -0
  112. package/lib/structures/rules/ITtscLintTypeScriptRules.js +3 -0
  113. package/lib/structures/rules/ITtscLintTypeScriptRules.js.map +1 -0
  114. package/lib/structures/rules/ITtscLintUnicornRules.d.ts +997 -0
  115. package/lib/structures/rules/ITtscLintUnicornRules.js +3 -0
  116. package/lib/structures/rules/ITtscLintUnicornRules.js.map +1 -0
  117. package/lib/structures/rules/ITtscLintVitestRules.d.ts +133 -0
  118. package/lib/structures/rules/ITtscLintVitestRules.js +3 -0
  119. package/lib/structures/rules/ITtscLintVitestRules.js.map +1 -0
  120. package/lib/structures/rules/index.d.ts +31 -0
  121. package/lib/structures/rules/index.js +48 -0
  122. package/lib/structures/rules/index.js.map +1 -0
  123. package/linthost/ast_helpers.go +30 -5
  124. package/linthost/compile.go +33 -2
  125. package/linthost/config.go +118 -71
  126. package/linthost/config_format.go +270 -104
  127. package/linthost/directives.go +67 -25
  128. package/linthost/dispatch.go +14 -3
  129. package/linthost/engine.go +160 -40
  130. package/linthost/fix.go +10 -3
  131. package/linthost/flags_gen.go +17 -15
  132. package/linthost/format.go +222 -25
  133. package/linthost/format_editor_settings.go +262 -0
  134. package/linthost/host.go +40 -3
  135. package/linthost/lsp.go +898 -0
  136. package/linthost/print_dispatch.go +5 -2
  137. package/linthost/print_engine.go +5 -5
  138. package/linthost/print_nodes_call.go +149 -67
  139. package/linthost/print_nodes_function.go +27 -2
  140. package/linthost/print_nodes_list.go +40 -5
  141. package/linthost/print_nodes_object.go +1 -1
  142. package/linthost/print_nodes_ternary.go +86 -0
  143. package/linthost/rule_names.go +14 -0
  144. package/linthost/rules_arrays.go +2 -2
  145. package/linthost/rules_boundaries.go +532 -0
  146. package/linthost/rules_camelcase.go +133 -0
  147. package/linthost/rules_complexity.go +95 -0
  148. package/linthost/rules_consistent_return.go +130 -0
  149. package/linthost/rules_console.go +1 -1
  150. package/linthost/rules_core_extra.go +739 -0
  151. package/linthost/rules_curly.go +70 -0
  152. package/linthost/rules_cypress.go +608 -0
  153. package/linthost/rules_debugger.go +2 -2
  154. package/linthost/rules_default_case.go +39 -0
  155. package/linthost/rules_default_case_last.go +46 -0
  156. package/linthost/rules_dupes.go +3 -3
  157. package/linthost/rules_empty.go +3 -3
  158. package/linthost/rules_escape.go +44 -24
  159. package/linthost/rules_eval.go +2 -2
  160. package/linthost/rules_finally.go +2 -2
  161. package/linthost/rules_format_arrow_parens.go +167 -0
  162. package/linthost/rules_format_bracket_spacing.go +117 -0
  163. package/linthost/rules_format_clause_join.go +172 -0
  164. package/linthost/rules_format_declaration_header.go +595 -0
  165. package/linthost/rules_format_indent.go +372 -0
  166. package/linthost/rules_format_jsdoc.go +5 -5
  167. package/linthost/rules_format_orphan_semi.go +106 -0
  168. package/linthost/rules_format_parameter_properties.go +175 -0
  169. package/linthost/rules_format_print_width.go +66 -55
  170. package/linthost/rules_format_quote_props.go +169 -0
  171. package/linthost/rules_format_quotes.go +76 -30
  172. package/linthost/rules_format_semi.go +186 -11
  173. package/linthost/rules_format_sort_imports.go +437 -118
  174. package/linthost/rules_format_statement_split.go +343 -0
  175. package/linthost/rules_format_ternary_nullish_parens.go +77 -0
  176. package/linthost/rules_format_trailing_comma.go +22 -3
  177. package/linthost/rules_format_whitespace.go +336 -0
  178. package/linthost/rules_functional.go +967 -0
  179. package/linthost/rules_gap.go +24 -45
  180. package/linthost/rules_grouped_accessor_pairs.go +87 -0
  181. package/linthost/rules_guard_for_in.go +198 -0
  182. package/linthost/rules_id_length.go +77 -0
  183. package/linthost/rules_imports.go +70 -2
  184. package/linthost/rules_init_declarations.go +53 -0
  185. package/linthost/rules_jest.go +618 -0
  186. package/linthost/rules_jsdoc.go +502 -0
  187. package/linthost/rules_jsx_a11y.go +1264 -0
  188. package/linthost/rules_logic.go +12 -12
  189. package/linthost/rules_loops.go +1 -1
  190. package/linthost/rules_max_classes_per_file.go +58 -0
  191. package/linthost/rules_max_depth.go +83 -0
  192. package/linthost/rules_max_lines.go +101 -0
  193. package/linthost/rules_max_lines_per_function.go +57 -0
  194. package/linthost/rules_max_nested_callbacks.go +61 -0
  195. package/linthost/rules_max_params.go +49 -0
  196. package/linthost/rules_max_statements.go +59 -0
  197. package/linthost/rules_misc.go +1 -1
  198. package/linthost/rules_nextjs.go +697 -0
  199. package/linthost/rules_no_else_return.go +75 -0
  200. package/linthost/rules_no_empty_named_blocks.go +91 -0
  201. package/linthost/rules_no_extend_native.go +51 -0
  202. package/linthost/rules_no_import_assign.go +140 -0
  203. package/linthost/rules_no_invalid_this.go +52 -0
  204. package/linthost/rules_no_loop_func.go +85 -0
  205. package/linthost/rules_no_magic_numbers.go +123 -0
  206. package/linthost/rules_no_mixed_operators.go +80 -0
  207. package/linthost/rules_no_param_reassign.go +98 -0
  208. package/linthost/rules_no_redeclare.go +270 -0
  209. package/linthost/rules_no_restricted_imports.go +105 -0
  210. package/linthost/rules_no_restricted_syntax.go +49 -0
  211. package/linthost/rules_no_shadow.go +147 -0
  212. package/linthost/rules_no_unreachable.go +77 -0
  213. package/linthost/rules_no_useless_assignment.go +120 -0
  214. package/linthost/rules_no_useless_constructor.go +245 -0
  215. package/linthost/rules_no_useless_return.go +51 -0
  216. package/linthost/rules_params.go +1 -1
  217. package/linthost/rules_playwright.go +788 -0
  218. package/linthost/rules_prefer_arrow_callback.go +124 -0
  219. package/linthost/rules_prefer_destructuring.go +98 -0
  220. package/linthost/rules_prefer_named_capture_group.go +129 -0
  221. package/linthost/rules_prefer_rest_params.go +94 -0
  222. package/linthost/rules_problems.go +41 -30
  223. package/linthost/rules_promise.go +1057 -2
  224. package/linthost/rules_protos.go +2 -2
  225. package/linthost/rules_react.go +773 -0
  226. package/linthost/rules_react_extras.go +227 -0
  227. package/linthost/rules_react_hooks.go +848 -0
  228. package/linthost/rules_react_perf.go +293 -0
  229. package/linthost/rules_react_refresh.go +583 -0
  230. package/linthost/rules_regexp.go +410 -0
  231. package/linthost/rules_security.go +830 -0
  232. package/linthost/rules_self.go +2 -2
  233. package/linthost/rules_solid.go +1073 -0
  234. package/linthost/rules_sort_imports.go +69 -0
  235. package/linthost/rules_sort_keys.go +134 -0
  236. package/linthost/rules_storybook.go +1176 -0
  237. package/linthost/rules_strings.go +4 -4
  238. package/linthost/rules_suggestions.go +38 -38
  239. package/linthost/rules_tanstack_query.go +844 -0
  240. package/linthost/rules_testing_library.go +1204 -0
  241. package/linthost/rules_throw.go +1 -1
  242. package/linthost/rules_ts.go +19 -19
  243. package/linthost/rules_ts_async.go +399 -0
  244. package/linthost/rules_ts_class_literal_property_style.go +115 -0
  245. package/linthost/rules_ts_consistent_type_exports.go +256 -0
  246. package/linthost/rules_ts_explicit_function_return_type.go +67 -0
  247. package/linthost/rules_ts_extra.go +159 -36
  248. package/linthost/rules_ts_no_base_to_string.go +218 -0
  249. package/linthost/rules_ts_no_confusing_void.go +72 -0
  250. package/linthost/rules_ts_no_deprecated.go +195 -0
  251. package/linthost/rules_ts_no_for_in_array.go +84 -0
  252. package/linthost/rules_ts_no_magic_numbers.go +124 -0
  253. package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
  254. package/linthost/rules_ts_no_misused_spread.go +104 -0
  255. package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
  256. package/linthost/rules_ts_no_restricted_types.go +62 -0
  257. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
  258. package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
  259. package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
  260. package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
  261. package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
  262. package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
  263. package/linthost/rules_ts_no_unsafe_argument.go +82 -0
  264. package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
  265. package/linthost/rules_ts_no_unsafe_call.go +82 -0
  266. package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
  267. package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
  268. package/linthost/rules_ts_no_unsafe_return.go +126 -0
  269. package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
  270. package/linthost/rules_ts_no_useless_constructor.go +52 -0
  271. package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
  272. package/linthost/rules_ts_parameter_properties.go +38 -0
  273. package/linthost/rules_ts_prefer_find.go +178 -0
  274. package/linthost/rules_ts_prefer_includes.go +255 -0
  275. package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
  276. package/linthost/rules_ts_prefer_optional_chain.go +228 -0
  277. package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
  278. package/linthost/rules_ts_prefer_readonly.go +73 -0
  279. package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
  280. package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
  281. package/linthost/rules_ts_prefer_return_this_type.go +135 -0
  282. package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
  283. package/linthost/rules_ts_promise_function_async.go +77 -0
  284. package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
  285. package/linthost/rules_ts_require_array_sort_compare.go +96 -0
  286. package/linthost/rules_ts_restrict_plus_operands.go +127 -0
  287. package/linthost/rules_ts_restrict_template_expressions.go +95 -0
  288. package/linthost/rules_ts_simple.go +387 -0
  289. package/linthost/rules_ts_sort_type_constituents.go +144 -0
  290. package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
  291. package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
  292. package/linthost/rules_ts_unbound_method.go +126 -0
  293. package/linthost/rules_tsdoc.go +136 -0
  294. package/linthost/rules_unicorn_better_regex.go +27 -0
  295. package/linthost/rules_unicorn_catch_error_name.go +46 -0
  296. package/linthost/rules_unicorn_consistent_assert.go +47 -0
  297. package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
  298. package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
  299. package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
  300. package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
  301. package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
  302. package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
  303. package/linthost/rules_unicorn_custom_error_definition.go +138 -0
  304. package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
  305. package/linthost/rules_unicorn_error_message.go +64 -0
  306. package/linthost/rules_unicorn_escape_case.go +51 -0
  307. package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
  308. package/linthost/rules_unicorn_explicit_length_check.go +88 -0
  309. package/linthost/rules_unicorn_filename_case.go +29 -0
  310. package/linthost/rules_unicorn_import_style.go +28 -0
  311. package/linthost/rules_unicorn_isolated_functions.go +29 -0
  312. package/linthost/rules_unicorn_new_for_builtins.go +87 -0
  313. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
  314. package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
  315. package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
  316. package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
  317. package/linthost/rules_unicorn_no_array_for_each.go +40 -0
  318. package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
  319. package/linthost/rules_unicorn_no_array_reduce.go +41 -0
  320. package/linthost/rules_unicorn_no_array_reverse.go +44 -0
  321. package/linthost/rules_unicorn_no_array_sort.go +43 -0
  322. package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
  323. package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
  324. package/linthost/rules_unicorn_no_console_spaces.go +61 -0
  325. package/linthost/rules_unicorn_no_document_cookie.go +41 -0
  326. package/linthost/rules_unicorn_no_empty_file.go +44 -0
  327. package/linthost/rules_unicorn_no_for_loop.go +102 -0
  328. package/linthost/rules_unicorn_no_hex_escape.go +42 -0
  329. package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
  330. package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
  331. package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
  332. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
  333. package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
  334. package/linthost/rules_unicorn_no_lonely_if.go +44 -0
  335. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
  336. package/linthost/rules_unicorn_no_named_default.go +54 -0
  337. package/linthost/rules_unicorn_no_negated_condition.go +85 -0
  338. package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
  339. package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
  340. package/linthost/rules_unicorn_no_new_array.go +30 -0
  341. package/linthost/rules_unicorn_no_new_buffer.go +31 -0
  342. package/linthost/rules_unicorn_no_null.go +24 -0
  343. package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
  344. package/linthost/rules_unicorn_no_process_exit.go +43 -0
  345. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
  346. package/linthost/rules_unicorn_no_static_only_class.go +56 -0
  347. package/linthost/rules_unicorn_no_thenable.go +74 -0
  348. package/linthost/rules_unicorn_no_this_assignment.go +35 -0
  349. package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
  350. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
  351. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
  352. package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
  353. package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
  354. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
  355. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
  356. package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
  357. package/linthost/rules_unicorn_no_unused_properties.go +30 -0
  358. package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
  359. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
  360. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
  361. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
  362. package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
  363. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
  364. package/linthost/rules_unicorn_no_useless_spread.go +67 -0
  365. package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
  366. package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
  367. package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
  368. package/linthost/rules_unicorn_number_literal_case.go +69 -0
  369. package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
  370. package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
  371. package/linthost/rules_unicorn_prefer_array_find.go +51 -0
  372. package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
  373. package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
  374. package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
  375. package/linthost/rules_unicorn_prefer_array_some.go +67 -0
  376. package/linthost/rules_unicorn_prefer_at.go +77 -0
  377. package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
  378. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
  379. package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
  380. package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
  381. package/linthost/rules_unicorn_prefer_code_point.go +49 -0
  382. package/linthost/rules_unicorn_prefer_date_now.go +78 -0
  383. package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
  384. package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
  385. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
  386. package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
  387. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
  388. package/linthost/rules_unicorn_prefer_event_target.go +36 -0
  389. package/linthost/rules_unicorn_prefer_export_from.go +129 -0
  390. package/linthost/rules_unicorn_prefer_global_this.go +127 -0
  391. package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
  392. package/linthost/rules_unicorn_prefer_includes.go +149 -0
  393. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
  394. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
  395. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
  396. package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
  397. package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
  398. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
  399. package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
  400. package/linthost/rules_unicorn_prefer_module.go +50 -0
  401. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
  402. package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
  403. package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
  404. package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
  405. package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
  406. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
  407. package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
  408. package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
  409. package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
  410. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
  411. package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
  412. package/linthost/rules_unicorn_prefer_set_has.go +42 -0
  413. package/linthost/rules_unicorn_prefer_set_size.go +48 -0
  414. package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
  415. package/linthost/rules_unicorn_prefer_single_call.go +96 -0
  416. package/linthost/rules_unicorn_prefer_spread.go +51 -0
  417. package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
  418. package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
  419. package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
  420. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
  421. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
  422. package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
  423. package/linthost/rules_unicorn_prefer_switch.go +103 -0
  424. package/linthost/rules_unicorn_prefer_ternary.go +71 -0
  425. package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
  426. package/linthost/rules_unicorn_prefer_type_error.go +127 -0
  427. package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
  428. package/linthost/rules_unicorn_relative_url_style.go +49 -0
  429. package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
  430. package/linthost/rules_unicorn_require_module_attributes.go +54 -0
  431. package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
  432. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
  433. package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
  434. package/linthost/rules_unicorn_string_content.go +27 -0
  435. package/linthost/rules_unicorn_switch_case_braces.go +42 -0
  436. package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
  437. package/linthost/rules_unicorn_template_indent.go +28 -0
  438. package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
  439. package/linthost/rules_unicorn_throw_new_error.go +61 -0
  440. package/linthost/rules_var.go +10 -4
  441. package/linthost/rules_vitest.go +568 -0
  442. package/package.json +3 -3
  443. package/plugin/main.go +49 -3
  444. package/rule/astutil/astutil.go +10 -3
  445. package/rule/rule.go +12 -10
  446. package/src/defaultFormat.ts +17 -10
  447. package/src/index.ts +65 -43
  448. package/src/structures/ITtscLintConfig.ts +14 -8
  449. package/src/structures/TtscLintRuleSetting.ts +55 -0
  450. package/src/structures/format/ITtscLintFormat.ts +141 -0
  451. package/src/structures/format/ITtscLintFormatJsDoc.ts +18 -0
  452. package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
  453. package/src/structures/format/index.ts +3 -0
  454. package/src/structures/index.ts +3 -4
  455. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +117 -0
  456. package/src/structures/rules/ITtscLintBoundariesRules.ts +91 -0
  457. package/src/structures/rules/ITtscLintContributorRules.ts +20 -0
  458. package/src/structures/rules/ITtscLintCoreRules.ts +1378 -0
  459. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
  460. package/src/structures/rules/ITtscLintCypressRules.ts +141 -0
  461. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +200 -0
  462. package/src/structures/rules/ITtscLintFunctionalRules.ts +197 -0
  463. package/src/structures/rules/ITtscLintJestRules.ts +209 -0
  464. package/src/structures/rules/ITtscLintJsdocRules.ts +146 -0
  465. package/src/structures/rules/ITtscLintJsxA11yRules.ts +331 -0
  466. package/src/structures/rules/ITtscLintNextjsRules.ts +201 -0
  467. package/src/structures/rules/ITtscLintPlaywrightRules.ts +343 -0
  468. package/src/structures/rules/ITtscLintPromiseRules.ts +196 -0
  469. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
  470. package/src/structures/rules/ITtscLintReactPerfRules.ts +53 -0
  471. package/src/structures/rules/ITtscLintReactRuleOptions.ts +41 -0
  472. package/src/structures/rules/ITtscLintReactRules.ts +308 -0
  473. package/src/structures/rules/ITtscLintRegexpRules.ts +204 -0
  474. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +88 -0
  475. package/src/structures/rules/ITtscLintRules.ts +77 -0
  476. package/src/structures/rules/ITtscLintSecurityRules.ts +155 -0
  477. package/src/structures/rules/ITtscLintSolidRules.ts +199 -0
  478. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +22 -0
  479. package/src/structures/rules/ITtscLintStorybookRules.ts +184 -0
  480. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +96 -0
  481. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +23 -0
  482. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +325 -0
  483. package/src/structures/rules/ITtscLintTypeScriptRules.ts +1172 -0
  484. package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
  485. package/src/structures/rules/ITtscLintVitestRules.ts +146 -0
  486. package/src/structures/rules/index.ts +31 -0
  487. package/lib/structures/ITtscLintFormatConfig.d.ts +0 -153
  488. package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
  489. package/lib/structures/TtscLintRule.d.ts +0 -17
  490. package/lib/structures/TtscLintRule.js.map +0 -1
  491. package/lib/structures/TtscLintRuleMap.d.ts +0 -46
  492. package/lib/structures/TtscLintRuleMap.js.map +0 -1
  493. package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
  494. package/lib/structures/TtscLintRuleOptions.js.map +0 -1
  495. package/src/structures/ITtscLintFormatConfig.ts +0 -168
  496. package/src/structures/TtscLintRule.ts +0 -160
  497. package/src/structures/TtscLintRuleMap.ts +0 -55
  498. package/src/structures/TtscLintRuleOptions.ts +0 -151
@@ -0,0 +1,115 @@
1
+ // unicorn/no-accessor-recursion: a `get value()` that reads
2
+ // `this.value` triggers itself — the getter is the only thing that
3
+ // resolves `this.value`, so the call recurses until the stack runs
4
+ // out. The same holds for setters, computed and string-keyed names,
5
+ // and class / object-literal accessors. The rule pins every read of
6
+ // `this.<X>` inside the `<X>` accessor as a recursion bug.
7
+ //
8
+ // AST-only: visit both `KindGetAccessor` and `KindSetAccessor`. Take
9
+ // the accessor's own name and walk its body, reporting every
10
+ // `KindPropertyAccessExpression(KindThisKeyword, <name>)` that
11
+ // matches. The walk does NOT descend into nested non-arrow function
12
+ // bodies (`FunctionDeclaration`, `FunctionExpression`,
13
+ // `MethodDeclaration`, `GetAccessor`, `SetAccessor`,
14
+ // `Constructor`), because those rebind `this`. Arrow functions
15
+ // preserve the outer `this` and are walked through.
16
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-accessor-recursion.md
17
+ package linthost
18
+
19
+ import (
20
+ "fmt"
21
+
22
+ shimast "github.com/microsoft/typescript-go/shim/ast"
23
+ )
24
+
25
+ type unicornNoAccessorRecursion struct{}
26
+
27
+ func (unicornNoAccessorRecursion) Name() string { return "unicorn/no-accessor-recursion" }
28
+ func (unicornNoAccessorRecursion) Visits() []shimast.Kind {
29
+ return []shimast.Kind{shimast.KindGetAccessor, shimast.KindSetAccessor}
30
+ }
31
+ func (unicornNoAccessorRecursion) Check(ctx *Context, node *shimast.Node) {
32
+ name := unicornAccessorRecursionName(node)
33
+ if name == "" {
34
+ return
35
+ }
36
+ body := node.Body()
37
+ if body == nil {
38
+ return
39
+ }
40
+ unicornAccessorRecursionWalkRespectingThisBoundary(body, func(child *shimast.Node) {
41
+ if child == nil || child.Kind != shimast.KindPropertyAccessExpression {
42
+ return
43
+ }
44
+ access := child.AsPropertyAccessExpression()
45
+ if access == nil || access.Expression == nil {
46
+ return
47
+ }
48
+ if access.Expression.Kind != shimast.KindThisKeyword {
49
+ return
50
+ }
51
+ if identifierText(access.Name()) != name {
52
+ return
53
+ }
54
+ ctx.Report(child, fmt.Sprintf("Reading `this.%s` inside the `%s` accessor recurses forever.", name, name))
55
+ })
56
+ }
57
+
58
+ // unicornAccessorRecursionWalkRespectingThisBoundary walks `node` and
59
+ // its descendants depth-first, but does not descend into bodies that
60
+ // rebind `this`. Arrow functions are walked through because they
61
+ // capture the outer `this`.
62
+ func unicornAccessorRecursionWalkRespectingThisBoundary(node *shimast.Node, visit func(*shimast.Node)) {
63
+ if node == nil {
64
+ return
65
+ }
66
+ visit(node)
67
+ node.ForEachChild(func(child *shimast.Node) bool {
68
+ if child == nil {
69
+ return false
70
+ }
71
+ switch child.Kind {
72
+ case shimast.KindFunctionDeclaration,
73
+ shimast.KindFunctionExpression,
74
+ shimast.KindMethodDeclaration,
75
+ shimast.KindGetAccessor,
76
+ shimast.KindSetAccessor,
77
+ shimast.KindConstructor:
78
+ return false
79
+ }
80
+ unicornAccessorRecursionWalkRespectingThisBoundary(child, visit)
81
+ return false
82
+ })
83
+ }
84
+
85
+ // unicornAccessorRecursionName returns the property name of a
86
+ // get/set accessor declaration. Only bare Identifier and StringLiteral
87
+ // names are supported because computed names cannot be matched against
88
+ // the `this.<X>` shape statically.
89
+ func unicornAccessorRecursionName(node *shimast.Node) string {
90
+ var name *shimast.Node
91
+ switch node.Kind {
92
+ case shimast.KindGetAccessor:
93
+ if g := node.AsGetAccessorDeclaration(); g != nil {
94
+ name = g.Name()
95
+ }
96
+ case shimast.KindSetAccessor:
97
+ if s := node.AsSetAccessorDeclaration(); s != nil {
98
+ name = s.Name()
99
+ }
100
+ }
101
+ if name == nil {
102
+ return ""
103
+ }
104
+ switch name.Kind {
105
+ case shimast.KindIdentifier:
106
+ return identifierText(name)
107
+ case shimast.KindStringLiteral:
108
+ return stringLiteralText(name)
109
+ }
110
+ return ""
111
+ }
112
+
113
+ func init() {
114
+ Register(unicornNoAccessorRecursion{})
115
+ }
@@ -0,0 +1,74 @@
1
+ // unicorn/no-anonymous-default-export: `export default function () {}`
2
+ // and `export default class {}` (and the arrow-function equivalent)
3
+ // leave the exported value without a local binding name. Stack traces,
4
+ // dev-tools labels, and downstream `import X from …` all rebind to the
5
+ // importer's chosen name, so the export site contributes nothing to
6
+ // readability. Giving the function/class a name keeps the original
7
+ // identifier visible everywhere.
8
+ //
9
+ // AST-only: TypeScript-Go's parser splits the two surface forms of
10
+ // `export default`. `export default <expression>` parses as
11
+ // `KindExportAssignment`; `export default function …` / `export default
12
+ // class …` parse as `KindFunctionDeclaration` / `KindClassDeclaration`
13
+ // with `export` + `default` modifiers and an optional `Name()`. The
14
+ // rule covers both paths: it reports an `ExportAssignment` whose
15
+ // expression is a `KindFunctionExpression`/`KindArrowFunction`/
16
+ // `KindClassExpression` with no name, and reports an export-default
17
+ // `Function`/`ClassDeclaration` whose `Name()` is nil.
18
+ //
19
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md
20
+ package linthost
21
+
22
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
23
+
24
+ type unicornNoAnonymousDefaultExport struct{}
25
+
26
+ func (unicornNoAnonymousDefaultExport) Name() string {
27
+ return "unicorn/no-anonymous-default-export"
28
+ }
29
+ func (unicornNoAnonymousDefaultExport) Visits() []shimast.Kind {
30
+ return []shimast.Kind{
31
+ shimast.KindExportAssignment,
32
+ shimast.KindFunctionDeclaration,
33
+ shimast.KindClassDeclaration,
34
+ }
35
+ }
36
+ func (unicornNoAnonymousDefaultExport) Check(ctx *Context, node *shimast.Node) {
37
+ switch node.Kind {
38
+ case shimast.KindExportAssignment:
39
+ assign := node.AsExportAssignment()
40
+ if assign == nil || assign.IsExportEquals || assign.Expression == nil {
41
+ return
42
+ }
43
+ expr := stripParens(assign.Expression)
44
+ if expr == nil {
45
+ return
46
+ }
47
+ switch expr.Kind {
48
+ case shimast.KindFunctionExpression:
49
+ if fn := expr.AsFunctionExpression(); fn != nil && fn.Name() == nil {
50
+ ctx.Report(node, "Give a name to the default export.")
51
+ }
52
+ case shimast.KindArrowFunction:
53
+ // Arrow functions never bind a name; an `export default` of
54
+ // one is always anonymous.
55
+ ctx.Report(node, "Give a name to the default export.")
56
+ case shimast.KindClassExpression:
57
+ if cls := expr.AsClassExpression(); cls != nil && cls.Name() == nil {
58
+ ctx.Report(node, "Give a name to the default export.")
59
+ }
60
+ }
61
+ case shimast.KindFunctionDeclaration, shimast.KindClassDeclaration:
62
+ if !hasModifier(node, shimast.KindExportKeyword) ||
63
+ !hasModifier(node, shimast.KindDefaultKeyword) {
64
+ return
65
+ }
66
+ if node.Name() == nil {
67
+ ctx.Report(node, "Give a name to the default export.")
68
+ }
69
+ }
70
+ }
71
+
72
+ func init() {
73
+ Register(unicornNoAnonymousDefaultExport{})
74
+ }
@@ -0,0 +1,65 @@
1
+ // unicorn/no-array-callback-reference: passing a function reference
2
+ // directly to an `Array#…` iteration method silently exposes it to
3
+ // extra positional arguments. `[1,2,3].filter(isEven)` passes `isEven`
4
+ // the index and the source array as well as the element, which is fine
5
+ // for `isEven` but breaks the moment the predicate's signature grows
6
+ // optional parameters. Wrapping in an arrow that takes just the value
7
+ // pins the call shape locally.
8
+ //
9
+ // AST-only: each visited `CallExpression` is matched against a
10
+ // property-access callee whose method name is one of the iteration
11
+ // methods, and the first argument is checked for the bare-identifier
12
+ // shape. Anything more elaborate (member access, arrow, call result)
13
+ // has already named the call shape explicitly and is out of scope.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-callback-reference.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ var unicornNoArrayCallbackReferenceMethods = map[string]struct{}{
20
+ "every": {},
21
+ "filter": {},
22
+ "find": {},
23
+ "findIndex": {},
24
+ "findLast": {},
25
+ "findLastIndex": {},
26
+ "flatMap": {},
27
+ "forEach": {},
28
+ "map": {},
29
+ "some": {},
30
+ }
31
+
32
+ type unicornNoArrayCallbackReference struct{}
33
+
34
+ func (unicornNoArrayCallbackReference) Name() string {
35
+ return "unicorn/no-array-callback-reference"
36
+ }
37
+ func (unicornNoArrayCallbackReference) Visits() []shimast.Kind {
38
+ return []shimast.Kind{shimast.KindCallExpression}
39
+ }
40
+ func (unicornNoArrayCallbackReference) Check(ctx *Context, node *shimast.Node) {
41
+ call := node.AsCallExpression()
42
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
43
+ return
44
+ }
45
+ access := call.Expression.AsPropertyAccessExpression()
46
+ if access == nil {
47
+ return
48
+ }
49
+ method := identifierText(access.Name())
50
+ if _, ok := unicornNoArrayCallbackReferenceMethods[method]; !ok {
51
+ return
52
+ }
53
+ if call.Arguments == nil || len(call.Arguments.Nodes) == 0 {
54
+ return
55
+ }
56
+ first := call.Arguments.Nodes[0]
57
+ if first == nil || first.Kind != shimast.KindIdentifier {
58
+ return
59
+ }
60
+ ctx.Report(first, "Don't pass a function reference directly to `Array#"+method+"` — wrap it in an arrow that takes only the value.")
61
+ }
62
+
63
+ func init() {
64
+ Register(unicornNoArrayCallbackReference{})
65
+ }
@@ -0,0 +1,40 @@
1
+ // unicorn/no-array-for-each: `Array#forEach` is harder to short-circuit and
2
+ // to reason about than a `for…of` loop — `break`/`continue`/`return` from
3
+ // the loop body all become per-iteration callback returns with different
4
+ // semantics, and async/await inside the callback silently no-ops because
5
+ // the iteration callback is not awaited.
6
+ //
7
+ // AST-only: dispatch on each `CallExpression`, look for a property-access
8
+ // callee whose method identifier is `forEach`, and fire on the call. The
9
+ // receiver expression is not type-checked — the syntactic shape is the
10
+ // signal the rule wants to discourage, regardless of whether the value is
11
+ // known to be an array at the type level.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornNoArrayForEach struct{}
18
+
19
+ func (unicornNoArrayForEach) Name() string { return "unicorn/no-array-for-each" }
20
+ func (unicornNoArrayForEach) Visits() []shimast.Kind {
21
+ return []shimast.Kind{shimast.KindCallExpression}
22
+ }
23
+ func (unicornNoArrayForEach) Check(ctx *Context, node *shimast.Node) {
24
+ call := node.AsCallExpression()
25
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
26
+ return
27
+ }
28
+ access := call.Expression.AsPropertyAccessExpression()
29
+ if access == nil {
30
+ return
31
+ }
32
+ if identifierText(access.Name()) != "forEach" {
33
+ return
34
+ }
35
+ ctx.Report(node, "Use `for…of` instead of `.forEach(…)`.")
36
+ }
37
+
38
+ func init() {
39
+ Register(unicornNoArrayForEach{})
40
+ }
@@ -0,0 +1,61 @@
1
+ // unicorn/no-array-method-this-argument: the iteration methods on
2
+ // `Array.prototype` accept an optional `thisArg` after the callback. The
3
+ // runtime binds that `thisArg` only for non-arrow callbacks — arrow
4
+ // callbacks ignore it entirely — so the second argument's behavior
5
+ // depends on the callable shape of the first. Replacing it with a closure
6
+ // that captures the intended value makes the binding unambiguous and
7
+ // arrow-safe.
8
+ //
9
+ // AST-only: visit each `CallExpression`, match a property-access callee
10
+ // whose method identifier is one of the Array.prototype iteration methods
11
+ // that accept a thisArg, and fire when the call has exactly two
12
+ // arguments. One argument is the canonical no-thisArg shape; three or
13
+ // more means a different callsite signature and is out of scope.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-method-this-argument.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ var unicornNoArrayMethodThisArgumentMethods = map[string]struct{}{
20
+ "every": {},
21
+ "filter": {},
22
+ "find": {},
23
+ "findIndex": {},
24
+ "findLast": {},
25
+ "findLastIndex": {},
26
+ "flatMap": {},
27
+ "forEach": {},
28
+ "map": {},
29
+ "some": {},
30
+ }
31
+
32
+ type unicornNoArrayMethodThisArgument struct{}
33
+
34
+ func (unicornNoArrayMethodThisArgument) Name() string {
35
+ return "unicorn/no-array-method-this-argument"
36
+ }
37
+ func (unicornNoArrayMethodThisArgument) Visits() []shimast.Kind {
38
+ return []shimast.Kind{shimast.KindCallExpression}
39
+ }
40
+ func (unicornNoArrayMethodThisArgument) Check(ctx *Context, node *shimast.Node) {
41
+ call := node.AsCallExpression()
42
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
43
+ return
44
+ }
45
+ access := call.Expression.AsPropertyAccessExpression()
46
+ if access == nil {
47
+ return
48
+ }
49
+ method := identifierText(access.Name())
50
+ if _, ok := unicornNoArrayMethodThisArgumentMethods[method]; !ok {
51
+ return
52
+ }
53
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 2 {
54
+ return
55
+ }
56
+ ctx.Report(node, "Don't use `thisArg` on `Array#"+method+"` — use an explicit closure that captures the value instead.")
57
+ }
58
+
59
+ func init() {
60
+ Register(unicornNoArrayMethodThisArgument{})
61
+ }
@@ -0,0 +1,41 @@
1
+ // unicorn/no-array-reduce: `Array#reduce` and `Array#reduceRight` collapse
2
+ // an iteration into a single callback that has to encode both the
3
+ // accumulator state and the per-element step, which routinely produces
4
+ // less-readable code than an explicit loop. The rule pushes authors
5
+ // toward `for…of` (or a typed accumulator initialized outside the loop)
6
+ // so the state and the step live on separate lines.
7
+ //
8
+ // AST-only: visit each `CallExpression`, check that the callee is a
9
+ // property access whose method identifier is `reduce` or `reduceRight`,
10
+ // and fire on the call. The receiver expression is not type-checked —
11
+ // the syntactic shape is the signal the rule wants to discourage.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-reduce.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornNoArrayReduce struct{}
18
+
19
+ func (unicornNoArrayReduce) Name() string { return "unicorn/no-array-reduce" }
20
+ func (unicornNoArrayReduce) Visits() []shimast.Kind {
21
+ return []shimast.Kind{shimast.KindCallExpression}
22
+ }
23
+ func (unicornNoArrayReduce) Check(ctx *Context, node *shimast.Node) {
24
+ call := node.AsCallExpression()
25
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
26
+ return
27
+ }
28
+ access := call.Expression.AsPropertyAccessExpression()
29
+ if access == nil {
30
+ return
31
+ }
32
+ method := identifierText(access.Name())
33
+ if method != "reduce" && method != "reduceRight" {
34
+ return
35
+ }
36
+ ctx.Report(node, "Avoid `Array#"+method+"()` — use an explicit loop or `for…of` instead.")
37
+ }
38
+
39
+ func init() {
40
+ Register(unicornNoArrayReduce{})
41
+ }
@@ -0,0 +1,44 @@
1
+ // unicorn/no-array-reverse: `Array#reverse()` mutates the array in place
2
+ // and also returns the same reference, which lets aliasing bugs slip into
3
+ // otherwise-pure pipelines (`const out = input.reverse()` rewrites
4
+ // `input` too). ES2023 ships `Array#toReversed()`, which produces a new
5
+ // array and leaves the source untouched, so the rule pushes authors
6
+ // toward the non-mutating form.
7
+ //
8
+ // AST-only: visit each `CallExpression`, check that the callee is a
9
+ // property access whose method identifier is `reverse`, and require zero
10
+ // arguments — `reverse` accepts none, so a non-empty argument list is
11
+ // almost certainly a different `reverse` on a user-defined type and is
12
+ // excluded by design.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-reverse.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoArrayReverse struct{}
19
+
20
+ func (unicornNoArrayReverse) Name() string { return "unicorn/no-array-reverse" }
21
+ func (unicornNoArrayReverse) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindCallExpression}
23
+ }
24
+ func (unicornNoArrayReverse) Check(ctx *Context, node *shimast.Node) {
25
+ call := node.AsCallExpression()
26
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
27
+ return
28
+ }
29
+ access := call.Expression.AsPropertyAccessExpression()
30
+ if access == nil {
31
+ return
32
+ }
33
+ if identifierText(access.Name()) != "reverse" {
34
+ return
35
+ }
36
+ if call.Arguments != nil && len(call.Arguments.Nodes) != 0 {
37
+ return
38
+ }
39
+ ctx.Report(node, "Prefer `Array#toReversed()` over the mutating `Array#reverse()`.")
40
+ }
41
+
42
+ func init() {
43
+ Register(unicornNoArrayReverse{})
44
+ }
@@ -0,0 +1,43 @@
1
+ // unicorn/no-array-sort: `Array#sort()` mutates the array in place and
2
+ // returns the same reference, so any caller holding the original sees
3
+ // the sorted order too. ES2023 introduced `Array#toSorted()`, which
4
+ // returns a fresh sorted copy and leaves the source untouched; the rule
5
+ // pushes authors toward the non-mutating form.
6
+ //
7
+ // AST-only: visit each `CallExpression`, check that the callee is a
8
+ // property access whose method identifier is `sort`, and accept either
9
+ // zero arguments or exactly one (the optional comparator). Calls with
10
+ // two or more arguments are almost certainly a different `sort` on a
11
+ // user-defined type and are excluded by design.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-sort.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornNoArraySort struct{}
18
+
19
+ func (unicornNoArraySort) Name() string { return "unicorn/no-array-sort" }
20
+ func (unicornNoArraySort) Visits() []shimast.Kind {
21
+ return []shimast.Kind{shimast.KindCallExpression}
22
+ }
23
+ func (unicornNoArraySort) Check(ctx *Context, node *shimast.Node) {
24
+ call := node.AsCallExpression()
25
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
26
+ return
27
+ }
28
+ access := call.Expression.AsPropertyAccessExpression()
29
+ if access == nil {
30
+ return
31
+ }
32
+ if identifierText(access.Name()) != "sort" {
33
+ return
34
+ }
35
+ if call.Arguments != nil && len(call.Arguments.Nodes) > 1 {
36
+ return
37
+ }
38
+ ctx.Report(node, "Prefer `Array#toSorted()` over the mutating `Array#sort()`.")
39
+ }
40
+
41
+ func init() {
42
+ Register(unicornNoArraySort{})
43
+ }
@@ -0,0 +1,40 @@
1
+ // unicorn/no-await-expression-member: `(await foo).bar` and
2
+ // `(await foo)[index]` mix two reading positions in one expression —
3
+ // the resolution step (`await foo`) and the projection step (`.bar`).
4
+ // Splitting them into a temporary `const value = await foo; value.bar`
5
+ // makes the order of operations explicit and lines up better with
6
+ // stepping through the async function in a debugger.
7
+ //
8
+ // AST-only: any `PropertyAccessExpression` whose receiver is an
9
+ // `AwaitExpression` (possibly wrapped in `ParenthesizedExpression`) fires.
10
+ // `ElementAccessExpression` is left out of this minimal pass — the
11
+ // PropertyAccess shape is the canonical violation cited in the upstream
12
+ // docs and matches the receiver shape directly via `stripParens`.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-expression-member.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoAwaitExpressionMember struct{}
19
+
20
+ func (unicornNoAwaitExpressionMember) Name() string {
21
+ return "unicorn/no-await-expression-member"
22
+ }
23
+ func (unicornNoAwaitExpressionMember) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindPropertyAccessExpression}
25
+ }
26
+ func (unicornNoAwaitExpressionMember) Check(ctx *Context, node *shimast.Node) {
27
+ access := node.AsPropertyAccessExpression()
28
+ if access == nil {
29
+ return
30
+ }
31
+ receiver := stripParens(access.Expression)
32
+ if receiver == nil || receiver.Kind != shimast.KindAwaitExpression {
33
+ return
34
+ }
35
+ ctx.Report(node, "Don't use member access on an `await` expression — assign the awaited value to a variable first.")
36
+ }
37
+
38
+ func init() {
39
+ Register(unicornNoAwaitExpressionMember{})
40
+ }
@@ -0,0 +1,69 @@
1
+ // unicorn/no-await-in-promise-methods: awaiting an element inside the
2
+ // array argument of `Promise.all` / `Promise.allSettled` / `Promise.race`
3
+ // / `Promise.any` defeats the parallelism the call exists for. The
4
+ // awaits resolve serially in source order before the array is even
5
+ // handed to `Promise.<method>`, so the combinator only sees the
6
+ // already-resolved values.
7
+ //
8
+ // AST-only: visit each `CallExpression`, match the callee against
9
+ // `Promise.<method>` for the four parallel combinators, and check the
10
+ // sole argument's `ArrayLiteralExpression` elements for any
11
+ // `AwaitExpression` shape. Fire on the offending await node so the
12
+ // report anchors to the actual misuse.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ var unicornNoAwaitInPromiseMethodsMethods = map[string]struct{}{
19
+ "all": {},
20
+ "allSettled": {},
21
+ "race": {},
22
+ "any": {},
23
+ }
24
+
25
+ type unicornNoAwaitInPromiseMethods struct{}
26
+
27
+ func (unicornNoAwaitInPromiseMethods) Name() string {
28
+ return "unicorn/no-await-in-promise-methods"
29
+ }
30
+ func (unicornNoAwaitInPromiseMethods) Visits() []shimast.Kind {
31
+ return []shimast.Kind{shimast.KindCallExpression}
32
+ }
33
+ func (unicornNoAwaitInPromiseMethods) Check(ctx *Context, node *shimast.Node) {
34
+ call := node.AsCallExpression()
35
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
36
+ return
37
+ }
38
+ access := call.Expression.AsPropertyAccessExpression()
39
+ if access == nil {
40
+ return
41
+ }
42
+ if identifierText(access.Expression) != "Promise" {
43
+ return
44
+ }
45
+ method := identifierText(access.Name())
46
+ if _, ok := unicornNoAwaitInPromiseMethodsMethods[method]; !ok {
47
+ return
48
+ }
49
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
50
+ return
51
+ }
52
+ arg := call.Arguments.Nodes[0]
53
+ if arg == nil || arg.Kind != shimast.KindArrayLiteralExpression {
54
+ return
55
+ }
56
+ arr := arg.AsArrayLiteralExpression()
57
+ if arr == nil || arr.Elements == nil {
58
+ return
59
+ }
60
+ for _, elem := range arr.Elements.Nodes {
61
+ if elem != nil && elem.Kind == shimast.KindAwaitExpression {
62
+ ctx.Report(elem, "Don't `await` inside `Promise."+method+"` array members — the awaits serialize the calls.")
63
+ }
64
+ }
65
+ }
66
+
67
+ func init() {
68
+ Register(unicornNoAwaitInPromiseMethods{})
69
+ }
@@ -0,0 +1,61 @@
1
+ // unicorn/no-console-spaces: `console.log("a ", "b")` produces
2
+ // `"a b"` with a doubled space because the runtime already inserts a
3
+ // single ASCII space between arguments. Leading/trailing whitespace on
4
+ // the literal duplicates that separator and is almost always a leftover
5
+ // from hand-formatting. The rule flags every string-literal argument
6
+ // whose content starts or ends with a space so the source converges on
7
+ // argument-only content and the runtime owns the separator.
8
+ //
9
+ // AST-only and identifier-text-driven: dispatch on `CallExpression`,
10
+ // match a `console.<method>` callee against the six common log
11
+ // methods, and report each `StringLiteral` argument with a leading or
12
+ // trailing space. The receiver is matched by identifier text only;
13
+ // shadowed `console` bindings are out of scope, mirroring the other
14
+ // console-shape rules in this family.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-console-spaces.md
16
+ package linthost
17
+
18
+ import (
19
+ "strings"
20
+
21
+ shimast "github.com/microsoft/typescript-go/shim/ast"
22
+ )
23
+
24
+ type unicornNoConsoleSpaces struct{}
25
+
26
+ func (unicornNoConsoleSpaces) Name() string { return "unicorn/no-console-spaces" }
27
+ func (unicornNoConsoleSpaces) Visits() []shimast.Kind {
28
+ return []shimast.Kind{shimast.KindCallExpression}
29
+ }
30
+ func (unicornNoConsoleSpaces) Check(ctx *Context, node *shimast.Node) {
31
+ call := node.AsCallExpression()
32
+ if call == nil || call.Expression == nil ||
33
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
34
+ return
35
+ }
36
+ access := call.Expression.AsPropertyAccessExpression()
37
+ if access == nil || identifierText(access.Expression) != "console" {
38
+ return
39
+ }
40
+ switch identifierText(access.Name()) {
41
+ case "log", "warn", "error", "info", "debug", "trace":
42
+ default:
43
+ return
44
+ }
45
+ if call.Arguments == nil {
46
+ return
47
+ }
48
+ for _, arg := range call.Arguments.Nodes {
49
+ if arg == nil || arg.Kind != shimast.KindStringLiteral {
50
+ continue
51
+ }
52
+ text := stringLiteralText(arg)
53
+ if strings.HasPrefix(text, " ") || strings.HasSuffix(text, " ") {
54
+ ctx.Report(arg, "Don't include leading or trailing spaces in `console.<method>` arguments.")
55
+ }
56
+ }
57
+ }
58
+
59
+ func init() {
60
+ Register(unicornNoConsoleSpaces{})
61
+ }