@ttsc/lint 0.13.1 → 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 (495) 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 +35 -10
  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/config.go +118 -71
  125. package/linthost/config_format.go +270 -104
  126. package/linthost/directives.go +67 -25
  127. package/linthost/dispatch.go +14 -3
  128. package/linthost/engine.go +152 -31
  129. package/linthost/fix.go +10 -3
  130. package/linthost/format.go +222 -25
  131. package/linthost/format_editor_settings.go +262 -0
  132. package/linthost/lsp.go +898 -0
  133. package/linthost/print_dispatch.go +5 -2
  134. package/linthost/print_engine.go +5 -5
  135. package/linthost/print_nodes_call.go +149 -67
  136. package/linthost/print_nodes_function.go +27 -2
  137. package/linthost/print_nodes_list.go +40 -5
  138. package/linthost/print_nodes_object.go +1 -1
  139. package/linthost/print_nodes_ternary.go +86 -0
  140. package/linthost/rule_names.go +14 -0
  141. package/linthost/rules_arrays.go +2 -2
  142. package/linthost/rules_boundaries.go +532 -0
  143. package/linthost/rules_camelcase.go +133 -0
  144. package/linthost/rules_complexity.go +95 -0
  145. package/linthost/rules_consistent_return.go +130 -0
  146. package/linthost/rules_console.go +1 -1
  147. package/linthost/rules_core_extra.go +739 -0
  148. package/linthost/rules_curly.go +70 -0
  149. package/linthost/rules_cypress.go +608 -0
  150. package/linthost/rules_debugger.go +2 -2
  151. package/linthost/rules_default_case.go +39 -0
  152. package/linthost/rules_default_case_last.go +46 -0
  153. package/linthost/rules_dupes.go +3 -3
  154. package/linthost/rules_empty.go +3 -3
  155. package/linthost/rules_escape.go +44 -24
  156. package/linthost/rules_eval.go +2 -2
  157. package/linthost/rules_finally.go +2 -2
  158. package/linthost/rules_format_arrow_parens.go +167 -0
  159. package/linthost/rules_format_bracket_spacing.go +117 -0
  160. package/linthost/rules_format_clause_join.go +172 -0
  161. package/linthost/rules_format_declaration_header.go +595 -0
  162. package/linthost/rules_format_indent.go +372 -0
  163. package/linthost/rules_format_jsdoc.go +5 -5
  164. package/linthost/rules_format_orphan_semi.go +106 -0
  165. package/linthost/rules_format_parameter_properties.go +175 -0
  166. package/linthost/rules_format_print_width.go +66 -55
  167. package/linthost/rules_format_quote_props.go +169 -0
  168. package/linthost/rules_format_quotes.go +76 -30
  169. package/linthost/rules_format_semi.go +186 -11
  170. package/linthost/rules_format_sort_imports.go +437 -118
  171. package/linthost/rules_format_statement_split.go +343 -0
  172. package/linthost/rules_format_ternary_nullish_parens.go +77 -0
  173. package/linthost/rules_format_trailing_comma.go +22 -3
  174. package/linthost/rules_format_whitespace.go +336 -0
  175. package/linthost/rules_functional.go +967 -0
  176. package/linthost/rules_gap.go +24 -45
  177. package/linthost/rules_grouped_accessor_pairs.go +87 -0
  178. package/linthost/rules_guard_for_in.go +198 -0
  179. package/linthost/rules_id_length.go +77 -0
  180. package/linthost/rules_imports.go +70 -2
  181. package/linthost/rules_init_declarations.go +53 -0
  182. package/linthost/rules_jest.go +618 -0
  183. package/linthost/rules_jsdoc.go +502 -0
  184. package/linthost/rules_jsx_a11y.go +1264 -0
  185. package/linthost/rules_logic.go +12 -12
  186. package/linthost/rules_loops.go +1 -1
  187. package/linthost/rules_max_classes_per_file.go +58 -0
  188. package/linthost/rules_max_depth.go +83 -0
  189. package/linthost/rules_max_lines.go +101 -0
  190. package/linthost/rules_max_lines_per_function.go +57 -0
  191. package/linthost/rules_max_nested_callbacks.go +61 -0
  192. package/linthost/rules_max_params.go +49 -0
  193. package/linthost/rules_max_statements.go +59 -0
  194. package/linthost/rules_misc.go +1 -1
  195. package/linthost/rules_nextjs.go +697 -0
  196. package/linthost/rules_no_else_return.go +75 -0
  197. package/linthost/rules_no_empty_named_blocks.go +91 -0
  198. package/linthost/rules_no_extend_native.go +51 -0
  199. package/linthost/rules_no_import_assign.go +140 -0
  200. package/linthost/rules_no_invalid_this.go +52 -0
  201. package/linthost/rules_no_loop_func.go +85 -0
  202. package/linthost/rules_no_magic_numbers.go +123 -0
  203. package/linthost/rules_no_mixed_operators.go +80 -0
  204. package/linthost/rules_no_param_reassign.go +98 -0
  205. package/linthost/rules_no_redeclare.go +270 -0
  206. package/linthost/rules_no_restricted_imports.go +105 -0
  207. package/linthost/rules_no_restricted_syntax.go +49 -0
  208. package/linthost/rules_no_shadow.go +147 -0
  209. package/linthost/rules_no_unreachable.go +77 -0
  210. package/linthost/rules_no_useless_assignment.go +120 -0
  211. package/linthost/rules_no_useless_constructor.go +245 -0
  212. package/linthost/rules_no_useless_return.go +51 -0
  213. package/linthost/rules_params.go +1 -1
  214. package/linthost/rules_playwright.go +788 -0
  215. package/linthost/rules_prefer_arrow_callback.go +124 -0
  216. package/linthost/rules_prefer_destructuring.go +98 -0
  217. package/linthost/rules_prefer_named_capture_group.go +129 -0
  218. package/linthost/rules_prefer_rest_params.go +94 -0
  219. package/linthost/rules_problems.go +41 -30
  220. package/linthost/rules_promise.go +1057 -2
  221. package/linthost/rules_protos.go +2 -2
  222. package/linthost/rules_react.go +773 -0
  223. package/linthost/rules_react_extras.go +227 -0
  224. package/linthost/rules_react_hooks.go +848 -0
  225. package/linthost/rules_react_perf.go +293 -0
  226. package/linthost/rules_react_refresh.go +583 -0
  227. package/linthost/rules_regexp.go +410 -0
  228. package/linthost/rules_security.go +830 -0
  229. package/linthost/rules_self.go +2 -2
  230. package/linthost/rules_solid.go +1073 -0
  231. package/linthost/rules_sort_imports.go +69 -0
  232. package/linthost/rules_sort_keys.go +134 -0
  233. package/linthost/rules_storybook.go +1176 -0
  234. package/linthost/rules_strings.go +4 -4
  235. package/linthost/rules_suggestions.go +38 -38
  236. package/linthost/rules_tanstack_query.go +844 -0
  237. package/linthost/rules_testing_library.go +1204 -0
  238. package/linthost/rules_throw.go +1 -1
  239. package/linthost/rules_ts.go +19 -19
  240. package/linthost/rules_ts_async.go +399 -0
  241. package/linthost/rules_ts_class_literal_property_style.go +115 -0
  242. package/linthost/rules_ts_consistent_type_exports.go +256 -0
  243. package/linthost/rules_ts_explicit_function_return_type.go +67 -0
  244. package/linthost/rules_ts_extra.go +159 -36
  245. package/linthost/rules_ts_no_base_to_string.go +218 -0
  246. package/linthost/rules_ts_no_confusing_void.go +72 -0
  247. package/linthost/rules_ts_no_deprecated.go +195 -0
  248. package/linthost/rules_ts_no_for_in_array.go +84 -0
  249. package/linthost/rules_ts_no_magic_numbers.go +124 -0
  250. package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
  251. package/linthost/rules_ts_no_misused_spread.go +104 -0
  252. package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
  253. package/linthost/rules_ts_no_restricted_types.go +62 -0
  254. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
  255. package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
  256. package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
  257. package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
  258. package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
  259. package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
  260. package/linthost/rules_ts_no_unsafe_argument.go +82 -0
  261. package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
  262. package/linthost/rules_ts_no_unsafe_call.go +82 -0
  263. package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
  264. package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
  265. package/linthost/rules_ts_no_unsafe_return.go +126 -0
  266. package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
  267. package/linthost/rules_ts_no_useless_constructor.go +52 -0
  268. package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
  269. package/linthost/rules_ts_parameter_properties.go +38 -0
  270. package/linthost/rules_ts_prefer_find.go +178 -0
  271. package/linthost/rules_ts_prefer_includes.go +255 -0
  272. package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
  273. package/linthost/rules_ts_prefer_optional_chain.go +228 -0
  274. package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
  275. package/linthost/rules_ts_prefer_readonly.go +73 -0
  276. package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
  277. package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
  278. package/linthost/rules_ts_prefer_return_this_type.go +135 -0
  279. package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
  280. package/linthost/rules_ts_promise_function_async.go +77 -0
  281. package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
  282. package/linthost/rules_ts_require_array_sort_compare.go +96 -0
  283. package/linthost/rules_ts_restrict_plus_operands.go +127 -0
  284. package/linthost/rules_ts_restrict_template_expressions.go +95 -0
  285. package/linthost/rules_ts_simple.go +387 -0
  286. package/linthost/rules_ts_sort_type_constituents.go +144 -0
  287. package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
  288. package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
  289. package/linthost/rules_ts_unbound_method.go +126 -0
  290. package/linthost/rules_tsdoc.go +136 -0
  291. package/linthost/rules_unicorn_better_regex.go +27 -0
  292. package/linthost/rules_unicorn_catch_error_name.go +46 -0
  293. package/linthost/rules_unicorn_consistent_assert.go +47 -0
  294. package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
  295. package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
  296. package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
  297. package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
  298. package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
  299. package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
  300. package/linthost/rules_unicorn_custom_error_definition.go +138 -0
  301. package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
  302. package/linthost/rules_unicorn_error_message.go +64 -0
  303. package/linthost/rules_unicorn_escape_case.go +51 -0
  304. package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
  305. package/linthost/rules_unicorn_explicit_length_check.go +88 -0
  306. package/linthost/rules_unicorn_filename_case.go +29 -0
  307. package/linthost/rules_unicorn_import_style.go +28 -0
  308. package/linthost/rules_unicorn_isolated_functions.go +29 -0
  309. package/linthost/rules_unicorn_new_for_builtins.go +87 -0
  310. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
  311. package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
  312. package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
  313. package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
  314. package/linthost/rules_unicorn_no_array_for_each.go +40 -0
  315. package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
  316. package/linthost/rules_unicorn_no_array_reduce.go +41 -0
  317. package/linthost/rules_unicorn_no_array_reverse.go +44 -0
  318. package/linthost/rules_unicorn_no_array_sort.go +43 -0
  319. package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
  320. package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
  321. package/linthost/rules_unicorn_no_console_spaces.go +61 -0
  322. package/linthost/rules_unicorn_no_document_cookie.go +41 -0
  323. package/linthost/rules_unicorn_no_empty_file.go +44 -0
  324. package/linthost/rules_unicorn_no_for_loop.go +102 -0
  325. package/linthost/rules_unicorn_no_hex_escape.go +42 -0
  326. package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
  327. package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
  328. package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
  329. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
  330. package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
  331. package/linthost/rules_unicorn_no_lonely_if.go +44 -0
  332. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
  333. package/linthost/rules_unicorn_no_named_default.go +54 -0
  334. package/linthost/rules_unicorn_no_negated_condition.go +85 -0
  335. package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
  336. package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
  337. package/linthost/rules_unicorn_no_new_array.go +30 -0
  338. package/linthost/rules_unicorn_no_new_buffer.go +31 -0
  339. package/linthost/rules_unicorn_no_null.go +24 -0
  340. package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
  341. package/linthost/rules_unicorn_no_process_exit.go +43 -0
  342. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
  343. package/linthost/rules_unicorn_no_static_only_class.go +56 -0
  344. package/linthost/rules_unicorn_no_thenable.go +74 -0
  345. package/linthost/rules_unicorn_no_this_assignment.go +35 -0
  346. package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
  347. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
  348. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
  349. package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
  350. package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
  351. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
  352. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
  353. package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
  354. package/linthost/rules_unicorn_no_unused_properties.go +30 -0
  355. package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
  356. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
  357. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
  358. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
  359. package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
  360. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
  361. package/linthost/rules_unicorn_no_useless_spread.go +67 -0
  362. package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
  363. package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
  364. package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
  365. package/linthost/rules_unicorn_number_literal_case.go +69 -0
  366. package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
  367. package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
  368. package/linthost/rules_unicorn_prefer_array_find.go +51 -0
  369. package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
  370. package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
  371. package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
  372. package/linthost/rules_unicorn_prefer_array_some.go +67 -0
  373. package/linthost/rules_unicorn_prefer_at.go +77 -0
  374. package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
  375. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
  376. package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
  377. package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
  378. package/linthost/rules_unicorn_prefer_code_point.go +49 -0
  379. package/linthost/rules_unicorn_prefer_date_now.go +78 -0
  380. package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
  381. package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
  382. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
  383. package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
  384. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
  385. package/linthost/rules_unicorn_prefer_event_target.go +36 -0
  386. package/linthost/rules_unicorn_prefer_export_from.go +129 -0
  387. package/linthost/rules_unicorn_prefer_global_this.go +127 -0
  388. package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
  389. package/linthost/rules_unicorn_prefer_includes.go +149 -0
  390. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
  391. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
  392. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
  393. package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
  394. package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
  395. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
  396. package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
  397. package/linthost/rules_unicorn_prefer_module.go +50 -0
  398. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
  399. package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
  400. package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
  401. package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
  402. package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
  403. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
  404. package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
  405. package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
  406. package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
  407. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
  408. package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
  409. package/linthost/rules_unicorn_prefer_set_has.go +42 -0
  410. package/linthost/rules_unicorn_prefer_set_size.go +48 -0
  411. package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
  412. package/linthost/rules_unicorn_prefer_single_call.go +96 -0
  413. package/linthost/rules_unicorn_prefer_spread.go +51 -0
  414. package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
  415. package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
  416. package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
  417. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
  418. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
  419. package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
  420. package/linthost/rules_unicorn_prefer_switch.go +103 -0
  421. package/linthost/rules_unicorn_prefer_ternary.go +71 -0
  422. package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
  423. package/linthost/rules_unicorn_prefer_type_error.go +127 -0
  424. package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
  425. package/linthost/rules_unicorn_relative_url_style.go +49 -0
  426. package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
  427. package/linthost/rules_unicorn_require_module_attributes.go +54 -0
  428. package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
  429. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
  430. package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
  431. package/linthost/rules_unicorn_string_content.go +27 -0
  432. package/linthost/rules_unicorn_switch_case_braces.go +42 -0
  433. package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
  434. package/linthost/rules_unicorn_template_indent.go +28 -0
  435. package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
  436. package/linthost/rules_unicorn_throw_new_error.go +61 -0
  437. package/linthost/rules_var.go +4 -4
  438. package/linthost/rules_vitest.go +568 -0
  439. package/package.json +3 -3
  440. package/plugin/main.go +49 -3
  441. package/rule/astutil/astutil.go +10 -3
  442. package/rule/rule.go +12 -10
  443. package/src/defaultFormat.ts +17 -10
  444. package/src/index.ts +40 -16
  445. package/src/structures/ITtscLintConfig.ts +14 -8
  446. package/src/structures/TtscLintRuleSetting.ts +55 -0
  447. package/src/structures/format/ITtscLintFormat.ts +141 -0
  448. package/src/structures/format/ITtscLintFormatJsDoc.ts +18 -0
  449. package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
  450. package/src/structures/format/index.ts +3 -0
  451. package/src/structures/index.ts +3 -4
  452. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +117 -0
  453. package/src/structures/rules/ITtscLintBoundariesRules.ts +91 -0
  454. package/src/structures/rules/ITtscLintContributorRules.ts +20 -0
  455. package/src/structures/rules/ITtscLintCoreRules.ts +1378 -0
  456. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
  457. package/src/structures/rules/ITtscLintCypressRules.ts +141 -0
  458. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +200 -0
  459. package/src/structures/rules/ITtscLintFunctionalRules.ts +197 -0
  460. package/src/structures/rules/ITtscLintJestRules.ts +209 -0
  461. package/src/structures/rules/ITtscLintJsdocRules.ts +146 -0
  462. package/src/structures/rules/ITtscLintJsxA11yRules.ts +331 -0
  463. package/src/structures/rules/ITtscLintNextjsRules.ts +201 -0
  464. package/src/structures/rules/ITtscLintPlaywrightRules.ts +343 -0
  465. package/src/structures/rules/ITtscLintPromiseRules.ts +196 -0
  466. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
  467. package/src/structures/rules/ITtscLintReactPerfRules.ts +53 -0
  468. package/src/structures/rules/ITtscLintReactRuleOptions.ts +41 -0
  469. package/src/structures/rules/ITtscLintReactRules.ts +308 -0
  470. package/src/structures/rules/ITtscLintRegexpRules.ts +204 -0
  471. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +88 -0
  472. package/src/structures/rules/ITtscLintRules.ts +77 -0
  473. package/src/structures/rules/ITtscLintSecurityRules.ts +155 -0
  474. package/src/structures/rules/ITtscLintSolidRules.ts +199 -0
  475. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +22 -0
  476. package/src/structures/rules/ITtscLintStorybookRules.ts +184 -0
  477. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +96 -0
  478. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +23 -0
  479. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +325 -0
  480. package/src/structures/rules/ITtscLintTypeScriptRules.ts +1172 -0
  481. package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
  482. package/src/structures/rules/ITtscLintVitestRules.ts +146 -0
  483. package/src/structures/rules/index.ts +31 -0
  484. package/lib/structures/ITtscLintFormatConfig.d.ts +0 -153
  485. package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
  486. package/lib/structures/TtscLintRule.d.ts +0 -17
  487. package/lib/structures/TtscLintRule.js.map +0 -1
  488. package/lib/structures/TtscLintRuleMap.d.ts +0 -46
  489. package/lib/structures/TtscLintRuleMap.js.map +0 -1
  490. package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
  491. package/lib/structures/TtscLintRuleOptions.js.map +0 -1
  492. package/src/structures/ITtscLintFormatConfig.ts +0 -168
  493. package/src/structures/TtscLintRule.ts +0 -160
  494. package/src/structures/TtscLintRuleMap.ts +0 -55
  495. package/src/structures/TtscLintRuleOptions.ts +0 -151
@@ -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
+ }
@@ -0,0 +1,50 @@
1
+ // unicorn/no-unreadable-iife: an IIFE whose body is itself another
2
+ // call expression — `(() => f())()` — reads as two layers of
3
+ // invocation for one effective call. The shape obscures the actual
4
+ // computation and the rule asks authors to extract the call site so
5
+ // the inner function name appears at the top level instead of being
6
+ // hidden behind an anonymous arrow.
7
+ //
8
+ // AST-only: visit `KindCallExpression`, accept when the callee is a
9
+ // `KindParenthesizedExpression` wrapping a `KindArrowFunction` whose
10
+ // body is a `KindCallExpression`. Block-bodied arrows and arrows that
11
+ // return a non-call expression don't match — only the arrow → call
12
+ // shape is "unreadable" in the upstream sense.
13
+ //
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unreadable-iife.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornNoUnreadableIIFE struct{}
20
+
21
+ func (unicornNoUnreadableIIFE) Name() string { return "unicorn/no-unreadable-iife" }
22
+ func (unicornNoUnreadableIIFE) Visits() []shimast.Kind {
23
+ return []shimast.Kind{shimast.KindCallExpression}
24
+ }
25
+ func (unicornNoUnreadableIIFE) Check(ctx *Context, node *shimast.Node) {
26
+ call := node.AsCallExpression()
27
+ if call == nil || call.Expression == nil {
28
+ return
29
+ }
30
+ if call.Expression.Kind != shimast.KindParenthesizedExpression {
31
+ return
32
+ }
33
+ paren := call.Expression.AsParenthesizedExpression()
34
+ if paren == nil || paren.Expression == nil ||
35
+ paren.Expression.Kind != shimast.KindArrowFunction {
36
+ return
37
+ }
38
+ arrow := paren.Expression.AsArrowFunction()
39
+ if arrow == nil || arrow.Body == nil {
40
+ return
41
+ }
42
+ if arrow.Body.Kind != shimast.KindCallExpression {
43
+ return
44
+ }
45
+ ctx.Report(node, "Avoid unreadable IIFEs — extract the function.")
46
+ }
47
+
48
+ func init() {
49
+ Register(unicornNoUnreadableIIFE{})
50
+ }
@@ -0,0 +1,30 @@
1
+ // unicorn/no-unused-properties: flags object-literal properties that
2
+ // are never read after the object is constructed. The signal is "this
3
+ // key sits in a literal that nothing reaches into" — analogous to
4
+ // `no-unused-vars` but for one level deeper inside object data.
5
+ //
6
+ // Escape-hatch / no-op port: implementing this faithfully requires
7
+ // per-object reachability and read tracking across the file (and across
8
+ // destructuring patterns, spread, computed access, and exports). That
9
+ // is a scope-and-flow problem the AST-only engine in this package
10
+ // cannot yet model without false positives every time a property is
11
+ // read through dynamic access. Registered so the typed-key/Go-registry
12
+ // parity check passes and so users can configure the rule, but it
13
+ // intentionally reports nothing until the analysis lands in a
14
+ // follow-up.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unused-properties.md
16
+ package linthost
17
+
18
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
19
+
20
+ type unicornNoUnusedProperties struct{}
21
+
22
+ func (unicornNoUnusedProperties) Name() string { return "unicorn/no-unused-properties" }
23
+ func (unicornNoUnusedProperties) Visits() []shimast.Kind { return nil }
24
+ func (unicornNoUnusedProperties) Check(_ *Context, _ *shimast.Node) {
25
+ // Intentionally empty — see file header for the escape-hatch rationale.
26
+ }
27
+
28
+ func init() {
29
+ Register(unicornNoUnusedProperties{})
30
+ }
@@ -0,0 +1,63 @@
1
+ // unicorn/no-useless-collection-argument: `new Set()`, `new Map()`,
2
+ // `new WeakSet()`, and `new WeakMap()` already start empty. Passing an
3
+ // explicit `null`, `undefined`, or `[]` reads as if the author meant to
4
+ // seed the collection with entries but came up empty — it adds noise
5
+ // without changing behavior. Zero-argument calls are the canonical
6
+ // correct form and are NOT flagged.
7
+ //
8
+ // AST-only and identifier-text-driven: visit every `NewExpression`
9
+ // whose callee identifier is one of the four collection constructors,
10
+ // then match a single argument that is a `null`/`undefined` literal,
11
+ // an `undefined` identifier, or an empty array literal. The receiver
12
+ // chain is not inspected; shadowed `Set`/`Map` bindings are out of
13
+ // scope, mirroring the other constructor-name-only unicorn rules.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-collection-argument.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornNoUselessCollectionArgument struct{}
20
+
21
+ func (unicornNoUselessCollectionArgument) Name() string {
22
+ return "unicorn/no-useless-collection-argument"
23
+ }
24
+ func (unicornNoUselessCollectionArgument) Visits() []shimast.Kind {
25
+ return []shimast.Kind{shimast.KindNewExpression}
26
+ }
27
+ func (unicornNoUselessCollectionArgument) Check(ctx *Context, node *shimast.Node) {
28
+ ne := node.AsNewExpression()
29
+ if ne == nil {
30
+ return
31
+ }
32
+ switch identifierText(ne.Expression) {
33
+ case "Set", "Map", "WeakSet", "WeakMap":
34
+ default:
35
+ return
36
+ }
37
+ if ne.Arguments == nil || len(ne.Arguments.Nodes) != 1 {
38
+ return
39
+ }
40
+ arg := stripParens(ne.Arguments.Nodes[0])
41
+ if arg == nil {
42
+ return
43
+ }
44
+ switch arg.Kind {
45
+ case shimast.KindNullKeyword, shimast.KindUndefinedKeyword:
46
+ ctx.Report(node, "Don't pass a useless initializer to `new <Collection>()`.")
47
+ return
48
+ case shimast.KindIdentifier:
49
+ if identifierText(arg) == "undefined" {
50
+ ctx.Report(node, "Don't pass a useless initializer to `new <Collection>()`.")
51
+ }
52
+ return
53
+ case shimast.KindArrayLiteralExpression:
54
+ if arr := arg.AsArrayLiteralExpression(); arr != nil &&
55
+ (arr.Elements == nil || len(arr.Elements.Nodes) == 0) {
56
+ ctx.Report(node, "Don't pass a useless initializer to `new <Collection>()`.")
57
+ }
58
+ }
59
+ }
60
+
61
+ func init() {
62
+ Register(unicornNoUselessCollectionArgument{})
63
+ }
@@ -0,0 +1,46 @@
1
+ // unicorn/no-useless-error-capture-stack-trace: `new Error()` already
2
+ // captures a stack trace by default, so calling
3
+ // `Error.captureStackTrace(this, …)` inside an Error-subclass
4
+ // constructor just rebuilds the same trace and adds noise without
5
+ // changing behavior. The rule flags the redundant call.
6
+ //
7
+ // AST-only MVP: visit each `CallExpression`, match when the callee is
8
+ // `Error.captureStackTrace` and the first argument is the `this`
9
+ // keyword. Detecting "inside an Error subclass constructor" is left to
10
+ // a future iteration — the MVP covers the common shape directly and is
11
+ // safe because `Error.captureStackTrace(this, …)` is uniformly useless
12
+ // inside subclasses anyway.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-error-capture-stack-trace.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoUselessErrorCaptureStackTrace struct{}
19
+
20
+ func (unicornNoUselessErrorCaptureStackTrace) Name() string {
21
+ return "unicorn/no-useless-error-capture-stack-trace"
22
+ }
23
+ func (unicornNoUselessErrorCaptureStackTrace) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindCallExpression}
25
+ }
26
+ func (unicornNoUselessErrorCaptureStackTrace) Check(ctx *Context, node *shimast.Node) {
27
+ call := node.AsCallExpression()
28
+ if call == nil || call.Expression == nil {
29
+ return
30
+ }
31
+ if !isMatchingPropertyAccess(call.Expression, "Error", "captureStackTrace") {
32
+ return
33
+ }
34
+ if call.Arguments == nil || len(call.Arguments.Nodes) < 1 {
35
+ return
36
+ }
37
+ first := stripParens(call.Arguments.Nodes[0])
38
+ if first == nil || first.Kind != shimast.KindThisKeyword {
39
+ return
40
+ }
41
+ ctx.Report(node, "Don't call `Error.captureStackTrace(this, ...)` in an `Error` subclass — the default capture already happens.")
42
+ }
43
+
44
+ func init() {
45
+ Register(unicornNoUselessErrorCaptureStackTrace{})
46
+ }