@ttsc/lint 0.13.1 → 0.14.0-dev.20260528.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 (464) hide show
  1. package/README.md +948 -69
  2. package/lib/defaultFormat.d.ts +9 -6
  3. package/lib/defaultFormat.js +9 -6
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/index.d.ts +46 -0
  6. package/lib/index.js +35 -10
  7. package/lib/index.js.map +1 -1
  8. package/lib/structures/ITtscLintConfig.d.ts +12 -6
  9. package/lib/structures/{ITtscLintFormatConfig.d.ts → ITtscLintFormat.d.ts} +2 -2
  10. package/lib/structures/{TtscLintRuleMap.js → ITtscLintFormat.js} +1 -1
  11. package/lib/structures/ITtscLintFormat.js.map +1 -0
  12. package/lib/structures/TtscLintRuleSetting.d.ts +49 -0
  13. package/lib/structures/{TtscLintRuleOptions.js → TtscLintRuleSetting.js} +1 -1
  14. package/lib/structures/TtscLintRuleSetting.js.map +1 -0
  15. package/lib/structures/index.d.ts +3 -4
  16. package/lib/structures/index.js +3 -4
  17. package/lib/structures/index.js.map +1 -1
  18. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +104 -0
  19. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +14 -0
  20. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
  21. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +79 -0
  22. package/lib/structures/rules/ITtscLintBoundariesRules.js +3 -0
  23. package/lib/structures/rules/ITtscLintBoundariesRules.js.map +1 -0
  24. package/lib/structures/rules/ITtscLintContributorRules.d.ts +17 -0
  25. package/lib/structures/rules/ITtscLintContributorRules.js +3 -0
  26. package/lib/structures/rules/ITtscLintContributorRules.js.map +1 -0
  27. package/lib/structures/rules/ITtscLintCoreRules.d.ts +1257 -0
  28. package/lib/structures/{ITtscLintFormatConfig.js → rules/ITtscLintCoreRules.js} +1 -1
  29. package/lib/structures/rules/ITtscLintCoreRules.js.map +1 -0
  30. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +17 -0
  31. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +10 -0
  32. package/lib/structures/rules/ITtscLintCypressRuleOptions.js.map +1 -0
  33. package/lib/structures/rules/ITtscLintCypressRules.d.ts +129 -0
  34. package/lib/structures/rules/ITtscLintCypressRules.js +3 -0
  35. package/lib/structures/rules/ITtscLintCypressRules.js.map +1 -0
  36. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +157 -0
  37. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +13 -0
  38. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js.map +1 -0
  39. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +167 -0
  40. package/lib/structures/rules/ITtscLintFunctionalRules.js +3 -0
  41. package/lib/structures/rules/ITtscLintFunctionalRules.js.map +1 -0
  42. package/lib/structures/rules/ITtscLintJestRules.d.ts +201 -0
  43. package/lib/structures/rules/ITtscLintJestRules.js +3 -0
  44. package/lib/structures/rules/ITtscLintJestRules.js.map +1 -0
  45. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +140 -0
  46. package/lib/structures/rules/ITtscLintJsdocRules.js +3 -0
  47. package/lib/structures/rules/ITtscLintJsdocRules.js.map +1 -0
  48. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +302 -0
  49. package/lib/structures/rules/ITtscLintJsxA11yRules.js +3 -0
  50. package/lib/structures/rules/ITtscLintJsxA11yRules.js.map +1 -0
  51. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +185 -0
  52. package/lib/structures/rules/ITtscLintNextjsRules.js +3 -0
  53. package/lib/structures/rules/ITtscLintNextjsRules.js.map +1 -0
  54. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +330 -0
  55. package/lib/structures/rules/ITtscLintPlaywrightRules.js +3 -0
  56. package/lib/structures/rules/ITtscLintPlaywrightRules.js.map +1 -0
  57. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +188 -0
  58. package/lib/structures/rules/ITtscLintPromiseRules.js +3 -0
  59. package/lib/structures/rules/ITtscLintPromiseRules.js.map +1 -0
  60. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +18 -0
  61. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js +8 -0
  62. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js.map +1 -0
  63. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +51 -0
  64. package/lib/structures/rules/ITtscLintReactPerfRules.js +3 -0
  65. package/lib/structures/rules/ITtscLintReactPerfRules.js.map +1 -0
  66. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +39 -0
  67. package/lib/structures/rules/ITtscLintReactRuleOptions.js +12 -0
  68. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
  69. package/lib/structures/rules/ITtscLintReactRules.d.ts +289 -0
  70. package/lib/structures/rules/ITtscLintReactRules.js +3 -0
  71. package/lib/structures/rules/ITtscLintReactRules.js.map +1 -0
  72. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +190 -0
  73. package/lib/structures/rules/ITtscLintRegexpRules.js +3 -0
  74. package/lib/structures/rules/ITtscLintRegexpRules.js.map +1 -0
  75. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +66 -0
  76. package/lib/structures/rules/ITtscLintRuleOptionsMap.js +3 -0
  77. package/lib/structures/rules/ITtscLintRuleOptionsMap.js.map +1 -0
  78. package/lib/structures/rules/ITtscLintRules.d.ts +55 -0
  79. package/lib/structures/{TtscLintRule.js → rules/ITtscLintRules.js} +1 -1
  80. package/lib/structures/rules/ITtscLintRules.js.map +1 -0
  81. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +148 -0
  82. package/lib/structures/rules/ITtscLintSecurityRules.js +3 -0
  83. package/lib/structures/rules/ITtscLintSecurityRules.js.map +1 -0
  84. package/lib/structures/rules/ITtscLintSolidRules.d.ts +181 -0
  85. package/lib/structures/rules/ITtscLintSolidRules.js +3 -0
  86. package/lib/structures/rules/ITtscLintSolidRules.js.map +1 -0
  87. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +21 -0
  88. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js +9 -0
  89. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js.map +1 -0
  90. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +174 -0
  91. package/lib/structures/rules/ITtscLintStorybookRules.js +3 -0
  92. package/lib/structures/rules/ITtscLintStorybookRules.js.map +1 -0
  93. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +94 -0
  94. package/lib/structures/rules/ITtscLintTanstackQueryRules.js +3 -0
  95. package/lib/structures/rules/ITtscLintTanstackQueryRules.js.map +1 -0
  96. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +22 -0
  97. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js +10 -0
  98. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js.map +1 -0
  99. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +310 -0
  100. package/lib/structures/rules/ITtscLintTestingLibraryRules.js +3 -0
  101. package/lib/structures/rules/ITtscLintTestingLibraryRules.js.map +1 -0
  102. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +1132 -0
  103. package/lib/structures/rules/ITtscLintTypeScriptRules.js +3 -0
  104. package/lib/structures/rules/ITtscLintTypeScriptRules.js.map +1 -0
  105. package/lib/structures/rules/ITtscLintUnicornRules.d.ts +997 -0
  106. package/lib/structures/rules/ITtscLintUnicornRules.js +3 -0
  107. package/lib/structures/rules/ITtscLintUnicornRules.js.map +1 -0
  108. package/lib/structures/rules/ITtscLintVitestRules.d.ts +141 -0
  109. package/lib/structures/rules/ITtscLintVitestRules.js +3 -0
  110. package/lib/structures/rules/ITtscLintVitestRules.js.map +1 -0
  111. package/lib/structures/rules/index.d.ts +31 -0
  112. package/lib/structures/rules/index.js +48 -0
  113. package/lib/structures/rules/index.js.map +1 -0
  114. package/linthost/ast_helpers.go +30 -5
  115. package/linthost/config.go +48 -17
  116. package/linthost/config_format.go +9 -9
  117. package/linthost/directives.go +67 -25
  118. package/linthost/dispatch.go +14 -3
  119. package/linthost/engine.go +152 -31
  120. package/linthost/fix.go +2 -2
  121. package/linthost/lsp.go +747 -0
  122. package/linthost/print_dispatch.go +2 -2
  123. package/linthost/print_nodes_function.go +2 -2
  124. package/linthost/print_nodes_object.go +1 -1
  125. package/linthost/rule_names.go +14 -0
  126. package/linthost/rules_arrays.go +2 -2
  127. package/linthost/rules_boundaries.go +532 -0
  128. package/linthost/rules_camelcase.go +133 -0
  129. package/linthost/rules_complexity.go +94 -0
  130. package/linthost/rules_consistent_return.go +130 -0
  131. package/linthost/rules_console.go +1 -1
  132. package/linthost/rules_core_extra.go +739 -0
  133. package/linthost/rules_curly.go +70 -0
  134. package/linthost/rules_cypress.go +608 -0
  135. package/linthost/rules_debugger.go +2 -2
  136. package/linthost/rules_default_case.go +39 -0
  137. package/linthost/rules_default_case_last.go +46 -0
  138. package/linthost/rules_dupes.go +3 -3
  139. package/linthost/rules_empty.go +3 -3
  140. package/linthost/rules_escape.go +44 -24
  141. package/linthost/rules_eval.go +2 -2
  142. package/linthost/rules_finally.go +2 -2
  143. package/linthost/rules_format_jsdoc.go +1 -1
  144. package/linthost/rules_format_print_width.go +9 -9
  145. package/linthost/rules_format_quotes.go +1 -1
  146. package/linthost/rules_format_semi.go +1 -1
  147. package/linthost/rules_format_sort_imports.go +1 -1
  148. package/linthost/rules_format_trailing_comma.go +1 -1
  149. package/linthost/rules_functional.go +967 -0
  150. package/linthost/rules_gap.go +24 -45
  151. package/linthost/rules_grouped_accessor_pairs.go +87 -0
  152. package/linthost/rules_guard_for_in.go +198 -0
  153. package/linthost/rules_id_length.go +77 -0
  154. package/linthost/rules_imports.go +70 -2
  155. package/linthost/rules_init_declarations.go +53 -0
  156. package/linthost/rules_jest.go +618 -0
  157. package/linthost/rules_jsdoc.go +502 -0
  158. package/linthost/rules_jsx_a11y.go +1264 -0
  159. package/linthost/rules_logic.go +12 -12
  160. package/linthost/rules_loops.go +1 -1
  161. package/linthost/rules_max_classes_per_file.go +58 -0
  162. package/linthost/rules_max_depth.go +83 -0
  163. package/linthost/rules_max_lines.go +101 -0
  164. package/linthost/rules_max_lines_per_function.go +57 -0
  165. package/linthost/rules_max_nested_callbacks.go +61 -0
  166. package/linthost/rules_max_params.go +49 -0
  167. package/linthost/rules_max_statements.go +59 -0
  168. package/linthost/rules_misc.go +1 -1
  169. package/linthost/rules_nextjs.go +697 -0
  170. package/linthost/rules_no_else_return.go +75 -0
  171. package/linthost/rules_no_empty_named_blocks.go +91 -0
  172. package/linthost/rules_no_extend_native.go +51 -0
  173. package/linthost/rules_no_import_assign.go +140 -0
  174. package/linthost/rules_no_invalid_this.go +52 -0
  175. package/linthost/rules_no_loop_func.go +85 -0
  176. package/linthost/rules_no_magic_numbers.go +123 -0
  177. package/linthost/rules_no_mixed_operators.go +80 -0
  178. package/linthost/rules_no_param_reassign.go +98 -0
  179. package/linthost/rules_no_redeclare.go +270 -0
  180. package/linthost/rules_no_restricted_imports.go +105 -0
  181. package/linthost/rules_no_restricted_syntax.go +49 -0
  182. package/linthost/rules_no_shadow.go +147 -0
  183. package/linthost/rules_no_unreachable.go +77 -0
  184. package/linthost/rules_no_useless_assignment.go +120 -0
  185. package/linthost/rules_no_useless_constructor.go +245 -0
  186. package/linthost/rules_no_useless_return.go +51 -0
  187. package/linthost/rules_params.go +1 -1
  188. package/linthost/rules_playwright.go +788 -0
  189. package/linthost/rules_prefer_arrow_callback.go +124 -0
  190. package/linthost/rules_prefer_destructuring.go +98 -0
  191. package/linthost/rules_prefer_named_capture_group.go +129 -0
  192. package/linthost/rules_prefer_rest_params.go +94 -0
  193. package/linthost/rules_problems.go +41 -30
  194. package/linthost/rules_promise.go +1128 -73
  195. package/linthost/rules_protos.go +2 -2
  196. package/linthost/rules_react.go +773 -0
  197. package/linthost/rules_react_extras.go +227 -0
  198. package/linthost/rules_react_hooks.go +848 -0
  199. package/linthost/rules_react_perf.go +293 -0
  200. package/linthost/rules_react_refresh.go +583 -0
  201. package/linthost/rules_regexp.go +410 -0
  202. package/linthost/rules_security.go +830 -0
  203. package/linthost/rules_self.go +2 -2
  204. package/linthost/rules_solid.go +1073 -0
  205. package/linthost/rules_sort_imports.go +69 -0
  206. package/linthost/rules_sort_keys.go +134 -0
  207. package/linthost/rules_storybook.go +1176 -0
  208. package/linthost/rules_strings.go +4 -4
  209. package/linthost/rules_suggestions.go +38 -38
  210. package/linthost/rules_tanstack_query.go +844 -0
  211. package/linthost/rules_testing_library.go +1204 -0
  212. package/linthost/rules_throw.go +1 -1
  213. package/linthost/rules_ts.go +19 -19
  214. package/linthost/rules_ts_async.go +399 -0
  215. package/linthost/rules_ts_class_literal_property_style.go +115 -0
  216. package/linthost/rules_ts_consistent_type_exports.go +256 -0
  217. package/linthost/rules_ts_explicit_function_return_type.go +67 -0
  218. package/linthost/rules_ts_extra.go +155 -36
  219. package/linthost/rules_ts_no_base_to_string.go +218 -0
  220. package/linthost/rules_ts_no_confusing_void.go +72 -0
  221. package/linthost/rules_ts_no_deprecated.go +195 -0
  222. package/linthost/rules_ts_no_for_in_array.go +84 -0
  223. package/linthost/rules_ts_no_magic_numbers.go +124 -0
  224. package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
  225. package/linthost/rules_ts_no_misused_spread.go +104 -0
  226. package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
  227. package/linthost/rules_ts_no_restricted_types.go +62 -0
  228. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
  229. package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
  230. package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
  231. package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
  232. package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
  233. package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
  234. package/linthost/rules_ts_no_unsafe_argument.go +82 -0
  235. package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
  236. package/linthost/rules_ts_no_unsafe_call.go +82 -0
  237. package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
  238. package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
  239. package/linthost/rules_ts_no_unsafe_return.go +126 -0
  240. package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
  241. package/linthost/rules_ts_no_useless_constructor.go +52 -0
  242. package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
  243. package/linthost/rules_ts_parameter_properties.go +38 -0
  244. package/linthost/rules_ts_prefer_find.go +178 -0
  245. package/linthost/rules_ts_prefer_includes.go +255 -0
  246. package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
  247. package/linthost/rules_ts_prefer_optional_chain.go +228 -0
  248. package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
  249. package/linthost/rules_ts_prefer_readonly.go +73 -0
  250. package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
  251. package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
  252. package/linthost/rules_ts_prefer_return_this_type.go +135 -0
  253. package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
  254. package/linthost/rules_ts_promise_function_async.go +77 -0
  255. package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
  256. package/linthost/rules_ts_require_array_sort_compare.go +96 -0
  257. package/linthost/rules_ts_restrict_plus_operands.go +127 -0
  258. package/linthost/rules_ts_restrict_template_expressions.go +95 -0
  259. package/linthost/rules_ts_simple.go +387 -0
  260. package/linthost/rules_ts_sort_type_constituents.go +144 -0
  261. package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
  262. package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
  263. package/linthost/rules_ts_unbound_method.go +126 -0
  264. package/linthost/rules_tsdoc.go +136 -0
  265. package/linthost/rules_unicorn_better_regex.go +27 -0
  266. package/linthost/rules_unicorn_catch_error_name.go +46 -0
  267. package/linthost/rules_unicorn_consistent_assert.go +47 -0
  268. package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
  269. package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
  270. package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
  271. package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
  272. package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
  273. package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
  274. package/linthost/rules_unicorn_custom_error_definition.go +138 -0
  275. package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
  276. package/linthost/rules_unicorn_error_message.go +64 -0
  277. package/linthost/rules_unicorn_escape_case.go +51 -0
  278. package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
  279. package/linthost/rules_unicorn_explicit_length_check.go +88 -0
  280. package/linthost/rules_unicorn_filename_case.go +29 -0
  281. package/linthost/rules_unicorn_import_style.go +28 -0
  282. package/linthost/rules_unicorn_isolated_functions.go +29 -0
  283. package/linthost/rules_unicorn_new_for_builtins.go +87 -0
  284. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
  285. package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
  286. package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
  287. package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
  288. package/linthost/rules_unicorn_no_array_for_each.go +40 -0
  289. package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
  290. package/linthost/rules_unicorn_no_array_reduce.go +41 -0
  291. package/linthost/rules_unicorn_no_array_reverse.go +44 -0
  292. package/linthost/rules_unicorn_no_array_sort.go +43 -0
  293. package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
  294. package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
  295. package/linthost/rules_unicorn_no_console_spaces.go +61 -0
  296. package/linthost/rules_unicorn_no_document_cookie.go +41 -0
  297. package/linthost/rules_unicorn_no_empty_file.go +44 -0
  298. package/linthost/rules_unicorn_no_for_loop.go +102 -0
  299. package/linthost/rules_unicorn_no_hex_escape.go +42 -0
  300. package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
  301. package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
  302. package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
  303. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
  304. package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
  305. package/linthost/rules_unicorn_no_lonely_if.go +44 -0
  306. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
  307. package/linthost/rules_unicorn_no_named_default.go +54 -0
  308. package/linthost/rules_unicorn_no_negated_condition.go +85 -0
  309. package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
  310. package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
  311. package/linthost/rules_unicorn_no_new_array.go +30 -0
  312. package/linthost/rules_unicorn_no_new_buffer.go +31 -0
  313. package/linthost/rules_unicorn_no_null.go +24 -0
  314. package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
  315. package/linthost/rules_unicorn_no_process_exit.go +43 -0
  316. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
  317. package/linthost/rules_unicorn_no_static_only_class.go +56 -0
  318. package/linthost/rules_unicorn_no_thenable.go +74 -0
  319. package/linthost/rules_unicorn_no_this_assignment.go +35 -0
  320. package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
  321. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
  322. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
  323. package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
  324. package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
  325. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
  326. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
  327. package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
  328. package/linthost/rules_unicorn_no_unused_properties.go +30 -0
  329. package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
  330. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
  331. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
  332. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
  333. package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
  334. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
  335. package/linthost/rules_unicorn_no_useless_spread.go +67 -0
  336. package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
  337. package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
  338. package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
  339. package/linthost/rules_unicorn_number_literal_case.go +69 -0
  340. package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
  341. package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
  342. package/linthost/rules_unicorn_prefer_array_find.go +51 -0
  343. package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
  344. package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
  345. package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
  346. package/linthost/rules_unicorn_prefer_array_some.go +67 -0
  347. package/linthost/rules_unicorn_prefer_at.go +77 -0
  348. package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
  349. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
  350. package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
  351. package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
  352. package/linthost/rules_unicorn_prefer_code_point.go +49 -0
  353. package/linthost/rules_unicorn_prefer_date_now.go +78 -0
  354. package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
  355. package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
  356. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
  357. package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
  358. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
  359. package/linthost/rules_unicorn_prefer_event_target.go +36 -0
  360. package/linthost/rules_unicorn_prefer_export_from.go +129 -0
  361. package/linthost/rules_unicorn_prefer_global_this.go +127 -0
  362. package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
  363. package/linthost/rules_unicorn_prefer_includes.go +149 -0
  364. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
  365. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
  366. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
  367. package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
  368. package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
  369. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
  370. package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
  371. package/linthost/rules_unicorn_prefer_module.go +50 -0
  372. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
  373. package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
  374. package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
  375. package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
  376. package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
  377. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
  378. package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
  379. package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
  380. package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
  381. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
  382. package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
  383. package/linthost/rules_unicorn_prefer_set_has.go +42 -0
  384. package/linthost/rules_unicorn_prefer_set_size.go +48 -0
  385. package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
  386. package/linthost/rules_unicorn_prefer_single_call.go +96 -0
  387. package/linthost/rules_unicorn_prefer_spread.go +51 -0
  388. package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
  389. package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
  390. package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
  391. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
  392. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
  393. package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
  394. package/linthost/rules_unicorn_prefer_switch.go +103 -0
  395. package/linthost/rules_unicorn_prefer_ternary.go +71 -0
  396. package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
  397. package/linthost/rules_unicorn_prefer_type_error.go +127 -0
  398. package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
  399. package/linthost/rules_unicorn_relative_url_style.go +49 -0
  400. package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
  401. package/linthost/rules_unicorn_require_module_attributes.go +54 -0
  402. package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
  403. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
  404. package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
  405. package/linthost/rules_unicorn_string_content.go +27 -0
  406. package/linthost/rules_unicorn_switch_case_braces.go +42 -0
  407. package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
  408. package/linthost/rules_unicorn_template_indent.go +28 -0
  409. package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
  410. package/linthost/rules_unicorn_throw_new_error.go +61 -0
  411. package/linthost/rules_var.go +4 -4
  412. package/linthost/rules_vitest.go +568 -0
  413. package/package.json +3 -3
  414. package/plugin/main.go +49 -3
  415. package/rule/astutil/astutil.go +10 -3
  416. package/rule/rule.go +12 -10
  417. package/src/defaultFormat.ts +11 -8
  418. package/src/index.ts +40 -16
  419. package/src/structures/ITtscLintConfig.ts +12 -6
  420. package/src/structures/{ITtscLintFormatConfig.ts → ITtscLintFormat.ts} +2 -2
  421. package/src/structures/TtscLintRuleSetting.ts +55 -0
  422. package/src/structures/index.ts +3 -4
  423. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +128 -0
  424. package/src/structures/rules/ITtscLintBoundariesRules.ts +95 -0
  425. package/src/structures/rules/ITtscLintContributorRules.ts +21 -0
  426. package/src/structures/rules/ITtscLintCoreRules.ts +1406 -0
  427. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
  428. package/src/structures/rules/ITtscLintCypressRules.ts +145 -0
  429. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +213 -0
  430. package/src/structures/rules/ITtscLintFunctionalRules.ts +202 -0
  431. package/src/structures/rules/ITtscLintJestRules.ts +220 -0
  432. package/src/structures/rules/ITtscLintJsdocRules.ts +153 -0
  433. package/src/structures/rules/ITtscLintJsxA11yRules.ts +339 -0
  434. package/src/structures/rules/ITtscLintNextjsRules.ts +206 -0
  435. package/src/structures/rules/ITtscLintPlaywrightRules.ts +361 -0
  436. package/src/structures/rules/ITtscLintPromiseRules.ts +205 -0
  437. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
  438. package/src/structures/rules/ITtscLintReactPerfRules.ts +55 -0
  439. package/src/structures/rules/ITtscLintReactRuleOptions.ts +43 -0
  440. package/src/structures/rules/ITtscLintReactRules.ts +321 -0
  441. package/src/structures/rules/ITtscLintRegexpRules.ts +212 -0
  442. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +89 -0
  443. package/src/structures/rules/ITtscLintRules.ts +77 -0
  444. package/src/structures/rules/ITtscLintSecurityRules.ts +162 -0
  445. package/src/structures/rules/ITtscLintSolidRules.ts +202 -0
  446. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +23 -0
  447. package/src/structures/rules/ITtscLintStorybookRules.ts +193 -0
  448. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +102 -0
  449. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +24 -0
  450. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +342 -0
  451. package/src/structures/rules/ITtscLintTypeScriptRules.ts +1230 -0
  452. package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
  453. package/src/structures/rules/ITtscLintVitestRules.ts +154 -0
  454. package/src/structures/rules/index.ts +31 -0
  455. package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
  456. package/lib/structures/TtscLintRule.d.ts +0 -17
  457. package/lib/structures/TtscLintRule.js.map +0 -1
  458. package/lib/structures/TtscLintRuleMap.d.ts +0 -46
  459. package/lib/structures/TtscLintRuleMap.js.map +0 -1
  460. package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
  461. package/lib/structures/TtscLintRuleOptions.js.map +0 -1
  462. package/src/structures/TtscLintRule.ts +0 -160
  463. package/src/structures/TtscLintRuleMap.ts +0 -55
  464. package/src/structures/TtscLintRuleOptions.ts +0 -151
@@ -0,0 +1,59 @@
1
+ // unicorn/no-single-promise-in-promise-methods:
2
+ // `Promise.all([single])`, `Promise.allSettled([single])`,
3
+ // `Promise.race([single])`, and `Promise.any([single])` are redundant
4
+ // wrappers — the result is just `single` (or a one-element array
5
+ // wrapping its resolution, which the caller can produce trivially).
6
+ // The wrapper hides the fact that there is only one promise in flight
7
+ // and forces an extra allocation for no behavioral difference.
8
+ //
9
+ // AST-only and identifier-text-driven: dispatch on `CallExpression`,
10
+ // match a `Promise.<method>` callee against the four collection
11
+ // methods, and require exactly one argument whose stripped form is an
12
+ // `ArrayLiteralExpression` with exactly one element. Shadowed
13
+ // `Promise` bindings are out of scope; the syntactic shape is the
14
+ // signal.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md
16
+ package linthost
17
+
18
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
19
+
20
+ type unicornNoSinglePromiseInPromiseMethods struct{}
21
+
22
+ func (unicornNoSinglePromiseInPromiseMethods) Name() string {
23
+ return "unicorn/no-single-promise-in-promise-methods"
24
+ }
25
+ func (unicornNoSinglePromiseInPromiseMethods) Visits() []shimast.Kind {
26
+ return []shimast.Kind{shimast.KindCallExpression}
27
+ }
28
+ func (unicornNoSinglePromiseInPromiseMethods) Check(ctx *Context, node *shimast.Node) {
29
+ call := node.AsCallExpression()
30
+ if call == nil || call.Expression == nil ||
31
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
32
+ return
33
+ }
34
+ access := call.Expression.AsPropertyAccessExpression()
35
+ if access == nil || identifierText(access.Expression) != "Promise" {
36
+ return
37
+ }
38
+ switch identifierText(access.Name()) {
39
+ case "all", "allSettled", "race", "any":
40
+ default:
41
+ return
42
+ }
43
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
44
+ return
45
+ }
46
+ arg := stripParens(call.Arguments.Nodes[0])
47
+ if arg == nil || arg.Kind != shimast.KindArrayLiteralExpression {
48
+ return
49
+ }
50
+ arr := arg.AsArrayLiteralExpression()
51
+ if arr == nil || arr.Elements == nil || len(arr.Elements.Nodes) != 1 {
52
+ return
53
+ }
54
+ ctx.Report(node, "Don't wrap a single promise in `Promise.<method>([...])` — the wrapper is redundant.")
55
+ }
56
+
57
+ func init() {
58
+ Register(unicornNoSinglePromiseInPromiseMethods{})
59
+ }
@@ -0,0 +1,56 @@
1
+ // unicorn/no-static-only-class: a class whose every member is `static`
2
+ // is a namespace dressed up as a class. The `class` keyword introduces
3
+ // a constructor, a prototype chain, and `new`-able semantics that the
4
+ // static-only form never uses. A plain object literal or a module
5
+ // namespace is the more honest shape.
6
+ //
7
+ // AST-only: visit both `ClassDeclaration` and `ClassExpression`. The
8
+ // rule requires at least one member (empty classes are handled by a
9
+ // separate rule) and every member must be a method, property, getter,
10
+ // or setter declaration with the `static` modifier. Constructors,
11
+ // index signatures, and any non-static member disqualify the class.
12
+ // Classes with heritage clauses (`extends`, `implements`) are also
13
+ // skipped — the inheritance IS the reason the class exists, so it
14
+ // can't be replaced by a plain object.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-static-only-class.md
16
+ package linthost
17
+
18
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
19
+
20
+ type unicornNoStaticOnlyClass struct{}
21
+
22
+ func (unicornNoStaticOnlyClass) Name() string { return "unicorn/no-static-only-class" }
23
+ func (unicornNoStaticOnlyClass) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindClassDeclaration, shimast.KindClassExpression}
25
+ }
26
+ func (unicornNoStaticOnlyClass) Check(ctx *Context, node *shimast.Node) {
27
+ if classHasHeritage(node) {
28
+ return
29
+ }
30
+ members := classMembers(node)
31
+ if len(members) == 0 {
32
+ // Empty classes are out of scope — separate rule territory.
33
+ return
34
+ }
35
+ for _, member := range members {
36
+ if member == nil {
37
+ return
38
+ }
39
+ switch member.Kind {
40
+ case shimast.KindMethodDeclaration,
41
+ shimast.KindPropertyDeclaration,
42
+ shimast.KindGetAccessor,
43
+ shimast.KindSetAccessor:
44
+ if !hasModifier(member, shimast.KindStaticKeyword) {
45
+ return
46
+ }
47
+ default:
48
+ return
49
+ }
50
+ }
51
+ ctx.Report(node, "A class with only static members can be replaced by a plain object or module namespace.")
52
+ }
53
+
54
+ func init() {
55
+ Register(unicornNoStaticOnlyClass{})
56
+ }
@@ -0,0 +1,74 @@
1
+ // unicorn/no-thenable: an object that exposes a callable `then` property
2
+ // becomes accidentally thenable — the runtime's `Promise.resolve(value)`
3
+ // pipeline treats every such value as a promise, so awaiting it invokes
4
+ // the user's `then` instead of resolving to the object itself. This is a
5
+ // common source of surprises in plain data objects and class shapes that
6
+ // were never intended as promises.
7
+ //
8
+ // AST-only: dispatch on every property-defining node form (data
9
+ // property, method, shorthand property, getter, setter) and fire when
10
+ // the name node is an Identifier `then` or a StringLiteral `"then"`.
11
+ // `moduleExportNameText` already returns the right textual value for
12
+ // both shapes; computed names and other syntactic forms are skipped.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-thenable.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoThenable struct{}
19
+
20
+ func (unicornNoThenable) Name() string { return "unicorn/no-thenable" }
21
+ func (unicornNoThenable) Visits() []shimast.Kind {
22
+ return []shimast.Kind{
23
+ shimast.KindPropertyAssignment,
24
+ shimast.KindMethodDeclaration,
25
+ shimast.KindShorthandPropertyAssignment,
26
+ shimast.KindGetAccessor,
27
+ shimast.KindSetAccessor,
28
+ }
29
+ }
30
+ func (unicornNoThenable) Check(ctx *Context, node *shimast.Node) {
31
+ var name *shimast.Node
32
+ switch node.Kind {
33
+ case shimast.KindPropertyAssignment:
34
+ if a := node.AsPropertyAssignment(); a != nil {
35
+ name = a.Name()
36
+ }
37
+ case shimast.KindMethodDeclaration:
38
+ if m := node.AsMethodDeclaration(); m != nil {
39
+ name = m.Name()
40
+ }
41
+ case shimast.KindShorthandPropertyAssignment:
42
+ if s := node.AsShorthandPropertyAssignment(); s != nil {
43
+ name = s.Name()
44
+ }
45
+ case shimast.KindGetAccessor:
46
+ if g := node.AsGetAccessorDeclaration(); g != nil {
47
+ name = g.Name()
48
+ }
49
+ case shimast.KindSetAccessor:
50
+ if s := node.AsSetAccessorDeclaration(); s != nil {
51
+ name = s.Name()
52
+ }
53
+ }
54
+ if name == nil {
55
+ return
56
+ }
57
+ switch name.Kind {
58
+ case shimast.KindIdentifier:
59
+ if identifierText(name) != "then" {
60
+ return
61
+ }
62
+ case shimast.KindStringLiteral:
63
+ if stringLiteralText(name) != "then" {
64
+ return
65
+ }
66
+ default:
67
+ return
68
+ }
69
+ ctx.Report(node, "Don't define a property named `then` — it makes the object accidentally thenable.")
70
+ }
71
+
72
+ func init() {
73
+ Register(unicornNoThenable{})
74
+ }
@@ -0,0 +1,35 @@
1
+ // unicorn/no-this-assignment: capturing `this` into a local variable —
2
+ // the classic `const self = this;` / `var that = this;` — was a workaround
3
+ // before arrow functions existed. Modern callers should close over the
4
+ // outer `this` with an arrow function instead so the binding cannot drift
5
+ // or be reassigned.
6
+ //
7
+ // AST-only: dispatch on `KindVariableDeclaration` and fire when the
8
+ // initializer (after stripping parentheses, so `const self = (this);`
9
+ // also matches) is `KindThisKeyword`. The diagnostic anchors on the
10
+ // declaration node so reporters surface the whole `name = this` line.
11
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-this-assignment.md
12
+ package linthost
13
+
14
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
15
+
16
+ type unicornNoThisAssignment struct{}
17
+
18
+ func (unicornNoThisAssignment) Name() string { return "unicorn/no-this-assignment" }
19
+ func (unicornNoThisAssignment) Visits() []shimast.Kind {
20
+ return []shimast.Kind{shimast.KindVariableDeclaration}
21
+ }
22
+ func (unicornNoThisAssignment) Check(ctx *Context, node *shimast.Node) {
23
+ decl := node.AsVariableDeclaration()
24
+ if decl == nil || decl.Initializer == nil {
25
+ return
26
+ }
27
+ if stripParens(decl.Initializer).Kind != shimast.KindThisKeyword {
28
+ return
29
+ }
30
+ ctx.Report(node, "Don't assign `this` to a variable — capture via an arrow function instead.")
31
+ }
32
+
33
+ func init() {
34
+ Register(unicornNoThisAssignment{})
35
+ }
@@ -0,0 +1,58 @@
1
+ // unicorn/no-typeof-undefined: comparing `typeof X` against the string
2
+ // literal `"undefined"` is a leftover guard from pre-strict-mode code,
3
+ // when referencing an undeclared identifier threw a ReferenceError.
4
+ // Modern code can compare the value to `undefined` directly, which is
5
+ // shorter and reads as the intent it actually expresses.
6
+ //
7
+ // AST-only: each visited BinaryExpression is rejected when its operator
8
+ // is one of `===`, `==`, `!==`, `!=` and its two operands include
9
+ // exactly one TypeOfExpression and exactly one string-shaped literal
10
+ // (StringLiteral or NoSubstitutionTemplateLiteral) whose text value is
11
+ // `undefined`. Either side may carry the typeof; either side may carry
12
+ // the literal.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-typeof-undefined.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoTypeofUndefined struct{}
19
+
20
+ func (unicornNoTypeofUndefined) Name() string { return "unicorn/no-typeof-undefined" }
21
+ func (unicornNoTypeofUndefined) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindBinaryExpression}
23
+ }
24
+ func (unicornNoTypeofUndefined) Check(ctx *Context, node *shimast.Node) {
25
+ expr := node.AsBinaryExpression()
26
+ if expr == nil || expr.OperatorToken == nil {
27
+ return
28
+ }
29
+ switch expr.OperatorToken.Kind {
30
+ case shimast.KindEqualsEqualsEqualsToken,
31
+ shimast.KindEqualsEqualsToken,
32
+ shimast.KindExclamationEqualsEqualsToken,
33
+ shimast.KindExclamationEqualsToken:
34
+ default:
35
+ return
36
+ }
37
+ left := stripParens(expr.Left)
38
+ right := stripParens(expr.Right)
39
+ if left == nil || right == nil {
40
+ return
41
+ }
42
+ var literal *shimast.Node
43
+ if left.Kind == shimast.KindTypeOfExpression {
44
+ literal = right
45
+ } else if right.Kind == shimast.KindTypeOfExpression {
46
+ literal = left
47
+ } else {
48
+ return
49
+ }
50
+ if stringLiteralText(literal) != "undefined" {
51
+ return
52
+ }
53
+ ctx.Report(node, "Compare with `undefined` directly instead of using `typeof`.")
54
+ }
55
+
56
+ func init() {
57
+ Register(unicornNoTypeofUndefined{})
58
+ }
@@ -0,0 +1,49 @@
1
+ // unicorn/no-unnecessary-array-flat-depth: `Array#flat()` already defaults
2
+ // to depth `1`, so writing `.flat(1)` is a redundant spelling that adds
3
+ // noise without changing behavior. The rule flags the explicit `1` so
4
+ // the call collapses to the dependency-free `.flat()` shorthand.
5
+ //
6
+ // AST-only: dispatch on `KindCallExpression`, require a property-access
7
+ // callee whose method identifier is `flat`, exactly one argument, and
8
+ // that argument's NumericLiteral text to be "1". Other numeric arguments
9
+ // are handled by `unicorn/no-magic-array-flat-depth`; this sibling rule
10
+ // only owns the literal-`1` shape.
11
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-array-flat-depth.md
12
+ package linthost
13
+
14
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
15
+
16
+ type unicornNoUnnecessaryArrayFlatDepth struct{}
17
+
18
+ func (unicornNoUnnecessaryArrayFlatDepth) Name() string {
19
+ return "unicorn/no-unnecessary-array-flat-depth"
20
+ }
21
+ func (unicornNoUnnecessaryArrayFlatDepth) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindCallExpression}
23
+ }
24
+ func (unicornNoUnnecessaryArrayFlatDepth) Check(ctx *Context, node *shimast.Node) {
25
+ call := node.AsCallExpression()
26
+ if call == nil || call.Expression == nil ||
27
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
28
+ return
29
+ }
30
+ access := call.Expression.AsPropertyAccessExpression()
31
+ if access == nil || identifierText(access.Name()) != "flat" {
32
+ return
33
+ }
34
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
35
+ return
36
+ }
37
+ arg := stripParens(call.Arguments.Nodes[0])
38
+ if arg == nil || arg.Kind != shimast.KindNumericLiteral {
39
+ return
40
+ }
41
+ if numericLiteralText(arg) != "1" {
42
+ return
43
+ }
44
+ ctx.Report(node, "`Array#flat()` already defaults to depth 1 — omit the argument.")
45
+ }
46
+
47
+ func init() {
48
+ Register(unicornNoUnnecessaryArrayFlatDepth{})
49
+ }
@@ -0,0 +1,70 @@
1
+ // unicorn/no-unnecessary-array-splice-count: `arr.splice(start, arr.length)`
2
+ // and `arr.splice(start, Infinity)` both say "delete from `start` to the
3
+ // end", but `splice` already does that when the count argument is
4
+ // omitted entirely. Dropping the redundant count makes the intent read
5
+ // directly: "splice from `start`."
6
+ //
7
+ // AST-only: each visited `CallExpression` checks a `splice` /
8
+ // `toSpliced` callee with at least two arguments and inspects the
9
+ // second. A `.length` property access (on any receiver — the rule
10
+ // doesn't try to reconcile receivers) or a bare `Infinity` identifier
11
+ // both fire. Anything else is a real count.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-array-splice-count.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornNoUnnecessaryArraySpliceCount struct{}
18
+
19
+ func (unicornNoUnnecessaryArraySpliceCount) Name() string {
20
+ return "unicorn/no-unnecessary-array-splice-count"
21
+ }
22
+ func (unicornNoUnnecessaryArraySpliceCount) Visits() []shimast.Kind {
23
+ return []shimast.Kind{shimast.KindCallExpression}
24
+ }
25
+ func (unicornNoUnnecessaryArraySpliceCount) Check(ctx *Context, node *shimast.Node) {
26
+ call := node.AsCallExpression()
27
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
28
+ return
29
+ }
30
+ access := call.Expression.AsPropertyAccessExpression()
31
+ if access == nil {
32
+ return
33
+ }
34
+ method := identifierText(access.Name())
35
+ if method != "splice" && method != "toSpliced" {
36
+ return
37
+ }
38
+ if call.Arguments == nil || len(call.Arguments.Nodes) < 2 {
39
+ return
40
+ }
41
+ second := stripParens(call.Arguments.Nodes[1])
42
+ if !unicornUnnecessaryCountArgument(second) {
43
+ return
44
+ }
45
+ ctx.Report(call.Arguments.Nodes[1], "Use `splice(start)` without the count — `.length` / `Infinity` is the default.")
46
+ }
47
+
48
+ // unicornUnnecessaryCountArgument reports whether `node` is one of the
49
+ // two redundant "until the end" shapes — a `.length` property access on
50
+ // any receiver, or the bare `Infinity` identifier.
51
+ func unicornUnnecessaryCountArgument(node *shimast.Node) bool {
52
+ if node == nil {
53
+ return false
54
+ }
55
+ if node.Kind == shimast.KindPropertyAccessExpression {
56
+ access := node.AsPropertyAccessExpression()
57
+ if access == nil {
58
+ return false
59
+ }
60
+ return identifierText(access.Name()) == "length"
61
+ }
62
+ if node.Kind == shimast.KindIdentifier {
63
+ return identifierText(node) == "Infinity"
64
+ }
65
+ return false
66
+ }
67
+
68
+ func init() {
69
+ Register(unicornNoUnnecessaryArraySpliceCount{})
70
+ }
@@ -0,0 +1,51 @@
1
+ // unicorn/no-unnecessary-await: `await x` only changes anything when
2
+ // `x` is thenable; awaiting a value that the language guarantees is
3
+ // not a promise (a literal, an object/array literal, the result of a
4
+ // non-async constructor call, etc.) just costs one extra microtask and
5
+ // reads as if the author forgot what type they were holding.
6
+ //
7
+ // AST-only minimum-viable port: visit each `AwaitExpression` and only
8
+ // fire when the operand (after `stripParens`) is a node whose value the
9
+ // parser already pins as not-thenable: a string/number/bigint/regex
10
+ // literal, a template literal, an array or object literal, `true`,
11
+ // `false`, or `null`. Without type information, identifiers and
12
+ // function calls are unsafe to flag — their values can be promises.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-await.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoUnnecessaryAwait struct{}
19
+
20
+ func (unicornNoUnnecessaryAwait) Name() string { return "unicorn/no-unnecessary-await" }
21
+ func (unicornNoUnnecessaryAwait) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindAwaitExpression}
23
+ }
24
+ func (unicornNoUnnecessaryAwait) Check(ctx *Context, node *shimast.Node) {
25
+ await := node.AsAwaitExpression()
26
+ if await == nil || await.Expression == nil {
27
+ return
28
+ }
29
+ operand := stripParens(await.Expression)
30
+ if operand == nil {
31
+ return
32
+ }
33
+ switch operand.Kind {
34
+ case shimast.KindStringLiteral,
35
+ shimast.KindNumericLiteral,
36
+ shimast.KindBigIntLiteral,
37
+ shimast.KindNoSubstitutionTemplateLiteral,
38
+ shimast.KindTemplateExpression,
39
+ shimast.KindRegularExpressionLiteral,
40
+ shimast.KindTrueKeyword,
41
+ shimast.KindFalseKeyword,
42
+ shimast.KindNullKeyword,
43
+ shimast.KindArrayLiteralExpression,
44
+ shimast.KindObjectLiteralExpression:
45
+ ctx.Report(node, "Don't `await` a non-thenable expression.")
46
+ }
47
+ }
48
+
49
+ func init() {
50
+ Register(unicornNoUnnecessaryAwait{})
51
+ }
@@ -0,0 +1,32 @@
1
+ // unicorn/no-unnecessary-polyfills: rejects imports of polyfill
2
+ // packages (`core-js/…`, `es6-promise`, …) for APIs the project's
3
+ // targeted runtime already supports natively. The signal is "this
4
+ // dependency is dead weight for our `engines.node` / `browserslist`
5
+ // floor".
6
+ //
7
+ // Escape-hatch / no-op port: the rule needs two external inputs the
8
+ // AST-only engine in this package does not yet have a place for: the
9
+ // project's targeted runtime baseline (read upstream from
10
+ // `package.json#engines`, `browserslist`, or a rule option) and a
11
+ // curated polyfill-package → API map kept in lockstep with caniuse /
12
+ // MDN. Until both are wired through the linthost configuration, firing
13
+ // would either be uninformed (no baseline) or wrong (stale map).
14
+ // Registered so the typed-key/Go-registry parity check passes and so
15
+ // users can configure the rule, but it intentionally reports nothing
16
+ // until the inputs land in a follow-up.
17
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md
18
+ package linthost
19
+
20
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
21
+
22
+ type unicornNoUnnecessaryPolyfills struct{}
23
+
24
+ func (unicornNoUnnecessaryPolyfills) Name() string { return "unicorn/no-unnecessary-polyfills" }
25
+ func (unicornNoUnnecessaryPolyfills) Visits() []shimast.Kind { return nil }
26
+ func (unicornNoUnnecessaryPolyfills) Check(_ *Context, _ *shimast.Node) {
27
+ // Intentionally empty — see file header for the escape-hatch rationale.
28
+ }
29
+
30
+ func init() {
31
+ Register(unicornNoUnnecessaryPolyfills{})
32
+ }
@@ -0,0 +1,48 @@
1
+ // unicorn/no-unnecessary-slice-end: `arr.slice(start, arr.length)` and
2
+ // `arr.slice(start, Infinity)` both clamp the end to the array's tail,
3
+ // which is exactly what `slice(start)` already does. Removing the
4
+ // redundant end argument shortens the call without changing behavior.
5
+ //
6
+ // AST-only: each visited `CallExpression` checks a `slice` callee with
7
+ // exactly two arguments and inspects the second. A `.length` property
8
+ // access (on any receiver) or a bare `Infinity` identifier both fire.
9
+ // Three or more arguments is out of shape for `Array#slice` and is
10
+ // ignored.
11
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-slice-end.md
12
+ package linthost
13
+
14
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
15
+
16
+ type unicornNoUnnecessarySliceEnd struct{}
17
+
18
+ func (unicornNoUnnecessarySliceEnd) Name() string {
19
+ return "unicorn/no-unnecessary-slice-end"
20
+ }
21
+ func (unicornNoUnnecessarySliceEnd) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindCallExpression}
23
+ }
24
+ func (unicornNoUnnecessarySliceEnd) 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()) != "slice" {
34
+ return
35
+ }
36
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 2 {
37
+ return
38
+ }
39
+ second := stripParens(call.Arguments.Nodes[1])
40
+ if !unicornUnnecessaryCountArgument(second) {
41
+ return
42
+ }
43
+ ctx.Report(call.Arguments.Nodes[1], "Use `slice(start)` without the end — `.length` / `Infinity` is the default.")
44
+ }
45
+
46
+ func init() {
47
+ Register(unicornNoUnnecessarySliceEnd{})
48
+ }
@@ -0,0 +1,115 @@
1
+ // unicorn/no-unreadable-array-destructuring: a destructuring pattern
2
+ // like `[, , a]` uses a run of comma holes to skip array positions
3
+ // before the binding the caller actually wants. The hole run is
4
+ // positional, silent, and trivial to miscount, so the rule flags
5
+ // patterns with two or more consecutive holes followed by a real
6
+ // element. A single leading hole (`[, second]`) is a common idiom and
7
+ // is not flagged. The recommended replacement is an indexed read
8
+ // (`arr[2]`).
9
+ //
10
+ // AST-only and syntactic: dispatch on `ArrayBindingPattern` for
11
+ // declaration / parameter destructuring AND `ArrayLiteralExpression`
12
+ // for the assignment-destructuring form (which the parser models as an
13
+ // array literal in LHS position). A run of three or more
14
+ // `OmittedExpression` holes followed by a non-hole element trips the
15
+ // diagnostic; runs that are not followed by anything (trailing holes)
16
+ // are not actionable and are out of scope.
17
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unreadable-array-destructuring.md
18
+ package linthost
19
+
20
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
21
+
22
+ type unicornNoUnreadableArrayDestructuring struct{}
23
+
24
+ func (unicornNoUnreadableArrayDestructuring) Name() string {
25
+ return "unicorn/no-unreadable-array-destructuring"
26
+ }
27
+ func (unicornNoUnreadableArrayDestructuring) Visits() []shimast.Kind {
28
+ return []shimast.Kind{shimast.KindArrayBindingPattern, shimast.KindArrayLiteralExpression}
29
+ }
30
+ func (unicornNoUnreadableArrayDestructuring) Check(ctx *Context, node *shimast.Node) {
31
+ var elements []*shimast.Node
32
+ switch node.Kind {
33
+ case shimast.KindArrayBindingPattern:
34
+ pattern := node.AsBindingPattern()
35
+ if pattern == nil || pattern.Elements == nil {
36
+ return
37
+ }
38
+ elements = pattern.Elements.Nodes
39
+ case shimast.KindArrayLiteralExpression:
40
+ // Array literals fire only when they appear in a destructuring-
41
+ // assignment position; otherwise the holes are just sparse-array
42
+ // construction, which a different rule covers.
43
+ if !isAssignmentDestructuringTarget(node) {
44
+ return
45
+ }
46
+ arr := node.AsArrayLiteralExpression()
47
+ if arr == nil || arr.Elements == nil {
48
+ return
49
+ }
50
+ elements = arr.Elements.Nodes
51
+ default:
52
+ return
53
+ }
54
+ run := 0
55
+ for _, el := range elements {
56
+ if isArrayDestructuringHole(el) {
57
+ run++
58
+ continue
59
+ }
60
+ if run >= 2 {
61
+ ctx.Report(node, "Don't use unreadable array destructuring with long hole runs.")
62
+ return
63
+ }
64
+ run = 0
65
+ }
66
+ }
67
+
68
+ // isArrayDestructuringHole reports whether `el` is a comma "hole" in an
69
+ // array destructuring/literal context. The TypeScript parser models a
70
+ // hole in an `ArrayLiteralExpression` as `OmittedExpression`, but a
71
+ // hole in an `ArrayBindingPattern` as a `BindingElement` with no name
72
+ // (and no initializer / dotdotdot). Both shapes contribute to a run.
73
+ func isArrayDestructuringHole(el *shimast.Node) bool {
74
+ if el == nil {
75
+ return false
76
+ }
77
+ if el.Kind == shimast.KindOmittedExpression {
78
+ return true
79
+ }
80
+ if el.Kind == shimast.KindBindingElement {
81
+ be := el.AsBindingElement()
82
+ if be != nil && be.Name() == nil && be.Initializer == nil && be.DotDotDotToken == nil {
83
+ return true
84
+ }
85
+ }
86
+ return false
87
+ }
88
+
89
+ // isAssignmentDestructuringTarget reports whether `node` (an
90
+ // ArrayLiteralExpression) appears on the LHS of an `=` assignment or
91
+ // in another write-target position. The parser models destructuring
92
+ // assignment as an array-literal expression in LHS slot; without this
93
+ // gate every plain sparse array literal would trip the rule.
94
+ func isAssignmentDestructuringTarget(node *shimast.Node) bool {
95
+ parent := node.Parent
96
+ for parent != nil && parent.Kind == shimast.KindParenthesizedExpression {
97
+ parent = parent.Parent
98
+ }
99
+ if parent == nil {
100
+ return false
101
+ }
102
+ if parent.Kind == shimast.KindBinaryExpression {
103
+ bin := parent.AsBinaryExpression()
104
+ if bin != nil && bin.OperatorToken != nil &&
105
+ bin.OperatorToken.Kind == shimast.KindEqualsToken &&
106
+ stripParens(bin.Left) == node {
107
+ return true
108
+ }
109
+ }
110
+ return false
111
+ }
112
+
113
+ func init() {
114
+ Register(unicornNoUnreadableArrayDestructuring{})
115
+ }