@ttsc/lint 0.13.0 → 0.14.0-dev.20260528

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 (467) 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 +60 -37
  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/compile.go +33 -2
  116. package/linthost/config.go +48 -17
  117. package/linthost/config_format.go +9 -9
  118. package/linthost/directives.go +67 -25
  119. package/linthost/dispatch.go +14 -3
  120. package/linthost/engine.go +160 -40
  121. package/linthost/fix.go +2 -2
  122. package/linthost/flags_gen.go +17 -15
  123. package/linthost/host.go +40 -3
  124. package/linthost/lsp.go +747 -0
  125. package/linthost/print_dispatch.go +2 -2
  126. package/linthost/print_nodes_function.go +2 -2
  127. package/linthost/print_nodes_object.go +1 -1
  128. package/linthost/rule_names.go +14 -0
  129. package/linthost/rules_arrays.go +2 -2
  130. package/linthost/rules_boundaries.go +532 -0
  131. package/linthost/rules_camelcase.go +133 -0
  132. package/linthost/rules_complexity.go +94 -0
  133. package/linthost/rules_consistent_return.go +130 -0
  134. package/linthost/rules_console.go +1 -1
  135. package/linthost/rules_core_extra.go +739 -0
  136. package/linthost/rules_curly.go +70 -0
  137. package/linthost/rules_cypress.go +608 -0
  138. package/linthost/rules_debugger.go +2 -2
  139. package/linthost/rules_default_case.go +39 -0
  140. package/linthost/rules_default_case_last.go +46 -0
  141. package/linthost/rules_dupes.go +3 -3
  142. package/linthost/rules_empty.go +3 -3
  143. package/linthost/rules_escape.go +44 -24
  144. package/linthost/rules_eval.go +2 -2
  145. package/linthost/rules_finally.go +2 -2
  146. package/linthost/rules_format_jsdoc.go +1 -1
  147. package/linthost/rules_format_print_width.go +9 -9
  148. package/linthost/rules_format_quotes.go +1 -1
  149. package/linthost/rules_format_semi.go +1 -1
  150. package/linthost/rules_format_sort_imports.go +1 -1
  151. package/linthost/rules_format_trailing_comma.go +1 -1
  152. package/linthost/rules_functional.go +967 -0
  153. package/linthost/rules_gap.go +24 -45
  154. package/linthost/rules_grouped_accessor_pairs.go +87 -0
  155. package/linthost/rules_guard_for_in.go +198 -0
  156. package/linthost/rules_id_length.go +77 -0
  157. package/linthost/rules_imports.go +70 -2
  158. package/linthost/rules_init_declarations.go +53 -0
  159. package/linthost/rules_jest.go +618 -0
  160. package/linthost/rules_jsdoc.go +502 -0
  161. package/linthost/rules_jsx_a11y.go +1264 -0
  162. package/linthost/rules_logic.go +12 -12
  163. package/linthost/rules_loops.go +1 -1
  164. package/linthost/rules_max_classes_per_file.go +58 -0
  165. package/linthost/rules_max_depth.go +83 -0
  166. package/linthost/rules_max_lines.go +101 -0
  167. package/linthost/rules_max_lines_per_function.go +57 -0
  168. package/linthost/rules_max_nested_callbacks.go +61 -0
  169. package/linthost/rules_max_params.go +49 -0
  170. package/linthost/rules_max_statements.go +59 -0
  171. package/linthost/rules_misc.go +1 -1
  172. package/linthost/rules_nextjs.go +697 -0
  173. package/linthost/rules_no_else_return.go +75 -0
  174. package/linthost/rules_no_empty_named_blocks.go +91 -0
  175. package/linthost/rules_no_extend_native.go +51 -0
  176. package/linthost/rules_no_import_assign.go +140 -0
  177. package/linthost/rules_no_invalid_this.go +52 -0
  178. package/linthost/rules_no_loop_func.go +85 -0
  179. package/linthost/rules_no_magic_numbers.go +123 -0
  180. package/linthost/rules_no_mixed_operators.go +80 -0
  181. package/linthost/rules_no_param_reassign.go +98 -0
  182. package/linthost/rules_no_redeclare.go +270 -0
  183. package/linthost/rules_no_restricted_imports.go +105 -0
  184. package/linthost/rules_no_restricted_syntax.go +49 -0
  185. package/linthost/rules_no_shadow.go +147 -0
  186. package/linthost/rules_no_unreachable.go +77 -0
  187. package/linthost/rules_no_useless_assignment.go +120 -0
  188. package/linthost/rules_no_useless_constructor.go +245 -0
  189. package/linthost/rules_no_useless_return.go +51 -0
  190. package/linthost/rules_params.go +1 -1
  191. package/linthost/rules_playwright.go +788 -0
  192. package/linthost/rules_prefer_arrow_callback.go +124 -0
  193. package/linthost/rules_prefer_destructuring.go +98 -0
  194. package/linthost/rules_prefer_named_capture_group.go +129 -0
  195. package/linthost/rules_prefer_rest_params.go +94 -0
  196. package/linthost/rules_problems.go +41 -30
  197. package/linthost/rules_promise.go +1128 -73
  198. package/linthost/rules_protos.go +2 -2
  199. package/linthost/rules_react.go +773 -0
  200. package/linthost/rules_react_extras.go +227 -0
  201. package/linthost/rules_react_hooks.go +848 -0
  202. package/linthost/rules_react_perf.go +293 -0
  203. package/linthost/rules_react_refresh.go +583 -0
  204. package/linthost/rules_regexp.go +410 -0
  205. package/linthost/rules_security.go +830 -0
  206. package/linthost/rules_self.go +2 -2
  207. package/linthost/rules_solid.go +1073 -0
  208. package/linthost/rules_sort_imports.go +69 -0
  209. package/linthost/rules_sort_keys.go +134 -0
  210. package/linthost/rules_storybook.go +1176 -0
  211. package/linthost/rules_strings.go +4 -4
  212. package/linthost/rules_suggestions.go +38 -38
  213. package/linthost/rules_tanstack_query.go +844 -0
  214. package/linthost/rules_testing_library.go +1204 -0
  215. package/linthost/rules_throw.go +1 -1
  216. package/linthost/rules_ts.go +19 -19
  217. package/linthost/rules_ts_async.go +399 -0
  218. package/linthost/rules_ts_class_literal_property_style.go +115 -0
  219. package/linthost/rules_ts_consistent_type_exports.go +256 -0
  220. package/linthost/rules_ts_explicit_function_return_type.go +67 -0
  221. package/linthost/rules_ts_extra.go +155 -36
  222. package/linthost/rules_ts_no_base_to_string.go +218 -0
  223. package/linthost/rules_ts_no_confusing_void.go +72 -0
  224. package/linthost/rules_ts_no_deprecated.go +195 -0
  225. package/linthost/rules_ts_no_for_in_array.go +84 -0
  226. package/linthost/rules_ts_no_magic_numbers.go +124 -0
  227. package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
  228. package/linthost/rules_ts_no_misused_spread.go +104 -0
  229. package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
  230. package/linthost/rules_ts_no_restricted_types.go +62 -0
  231. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
  232. package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
  233. package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
  234. package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
  235. package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
  236. package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
  237. package/linthost/rules_ts_no_unsafe_argument.go +82 -0
  238. package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
  239. package/linthost/rules_ts_no_unsafe_call.go +82 -0
  240. package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
  241. package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
  242. package/linthost/rules_ts_no_unsafe_return.go +126 -0
  243. package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
  244. package/linthost/rules_ts_no_useless_constructor.go +52 -0
  245. package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
  246. package/linthost/rules_ts_parameter_properties.go +38 -0
  247. package/linthost/rules_ts_prefer_find.go +178 -0
  248. package/linthost/rules_ts_prefer_includes.go +255 -0
  249. package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
  250. package/linthost/rules_ts_prefer_optional_chain.go +228 -0
  251. package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
  252. package/linthost/rules_ts_prefer_readonly.go +73 -0
  253. package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
  254. package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
  255. package/linthost/rules_ts_prefer_return_this_type.go +135 -0
  256. package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
  257. package/linthost/rules_ts_promise_function_async.go +77 -0
  258. package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
  259. package/linthost/rules_ts_require_array_sort_compare.go +96 -0
  260. package/linthost/rules_ts_restrict_plus_operands.go +127 -0
  261. package/linthost/rules_ts_restrict_template_expressions.go +95 -0
  262. package/linthost/rules_ts_simple.go +387 -0
  263. package/linthost/rules_ts_sort_type_constituents.go +144 -0
  264. package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
  265. package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
  266. package/linthost/rules_ts_unbound_method.go +126 -0
  267. package/linthost/rules_tsdoc.go +136 -0
  268. package/linthost/rules_unicorn_better_regex.go +27 -0
  269. package/linthost/rules_unicorn_catch_error_name.go +46 -0
  270. package/linthost/rules_unicorn_consistent_assert.go +47 -0
  271. package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
  272. package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
  273. package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
  274. package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
  275. package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
  276. package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
  277. package/linthost/rules_unicorn_custom_error_definition.go +138 -0
  278. package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
  279. package/linthost/rules_unicorn_error_message.go +64 -0
  280. package/linthost/rules_unicorn_escape_case.go +51 -0
  281. package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
  282. package/linthost/rules_unicorn_explicit_length_check.go +88 -0
  283. package/linthost/rules_unicorn_filename_case.go +29 -0
  284. package/linthost/rules_unicorn_import_style.go +28 -0
  285. package/linthost/rules_unicorn_isolated_functions.go +29 -0
  286. package/linthost/rules_unicorn_new_for_builtins.go +87 -0
  287. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
  288. package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
  289. package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
  290. package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
  291. package/linthost/rules_unicorn_no_array_for_each.go +40 -0
  292. package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
  293. package/linthost/rules_unicorn_no_array_reduce.go +41 -0
  294. package/linthost/rules_unicorn_no_array_reverse.go +44 -0
  295. package/linthost/rules_unicorn_no_array_sort.go +43 -0
  296. package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
  297. package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
  298. package/linthost/rules_unicorn_no_console_spaces.go +61 -0
  299. package/linthost/rules_unicorn_no_document_cookie.go +41 -0
  300. package/linthost/rules_unicorn_no_empty_file.go +44 -0
  301. package/linthost/rules_unicorn_no_for_loop.go +102 -0
  302. package/linthost/rules_unicorn_no_hex_escape.go +42 -0
  303. package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
  304. package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
  305. package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
  306. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
  307. package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
  308. package/linthost/rules_unicorn_no_lonely_if.go +44 -0
  309. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
  310. package/linthost/rules_unicorn_no_named_default.go +54 -0
  311. package/linthost/rules_unicorn_no_negated_condition.go +85 -0
  312. package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
  313. package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
  314. package/linthost/rules_unicorn_no_new_array.go +30 -0
  315. package/linthost/rules_unicorn_no_new_buffer.go +31 -0
  316. package/linthost/rules_unicorn_no_null.go +24 -0
  317. package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
  318. package/linthost/rules_unicorn_no_process_exit.go +43 -0
  319. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
  320. package/linthost/rules_unicorn_no_static_only_class.go +56 -0
  321. package/linthost/rules_unicorn_no_thenable.go +74 -0
  322. package/linthost/rules_unicorn_no_this_assignment.go +35 -0
  323. package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
  324. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
  325. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
  326. package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
  327. package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
  328. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
  329. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
  330. package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
  331. package/linthost/rules_unicorn_no_unused_properties.go +30 -0
  332. package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
  333. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
  334. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
  335. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
  336. package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
  337. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
  338. package/linthost/rules_unicorn_no_useless_spread.go +67 -0
  339. package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
  340. package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
  341. package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
  342. package/linthost/rules_unicorn_number_literal_case.go +69 -0
  343. package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
  344. package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
  345. package/linthost/rules_unicorn_prefer_array_find.go +51 -0
  346. package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
  347. package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
  348. package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
  349. package/linthost/rules_unicorn_prefer_array_some.go +67 -0
  350. package/linthost/rules_unicorn_prefer_at.go +77 -0
  351. package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
  352. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
  353. package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
  354. package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
  355. package/linthost/rules_unicorn_prefer_code_point.go +49 -0
  356. package/linthost/rules_unicorn_prefer_date_now.go +78 -0
  357. package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
  358. package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
  359. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
  360. package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
  361. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
  362. package/linthost/rules_unicorn_prefer_event_target.go +36 -0
  363. package/linthost/rules_unicorn_prefer_export_from.go +129 -0
  364. package/linthost/rules_unicorn_prefer_global_this.go +127 -0
  365. package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
  366. package/linthost/rules_unicorn_prefer_includes.go +149 -0
  367. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
  368. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
  369. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
  370. package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
  371. package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
  372. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
  373. package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
  374. package/linthost/rules_unicorn_prefer_module.go +50 -0
  375. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
  376. package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
  377. package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
  378. package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
  379. package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
  380. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
  381. package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
  382. package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
  383. package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
  384. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
  385. package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
  386. package/linthost/rules_unicorn_prefer_set_has.go +42 -0
  387. package/linthost/rules_unicorn_prefer_set_size.go +48 -0
  388. package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
  389. package/linthost/rules_unicorn_prefer_single_call.go +96 -0
  390. package/linthost/rules_unicorn_prefer_spread.go +51 -0
  391. package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
  392. package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
  393. package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
  394. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
  395. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
  396. package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
  397. package/linthost/rules_unicorn_prefer_switch.go +103 -0
  398. package/linthost/rules_unicorn_prefer_ternary.go +71 -0
  399. package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
  400. package/linthost/rules_unicorn_prefer_type_error.go +127 -0
  401. package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
  402. package/linthost/rules_unicorn_relative_url_style.go +49 -0
  403. package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
  404. package/linthost/rules_unicorn_require_module_attributes.go +54 -0
  405. package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
  406. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
  407. package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
  408. package/linthost/rules_unicorn_string_content.go +27 -0
  409. package/linthost/rules_unicorn_switch_case_braces.go +42 -0
  410. package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
  411. package/linthost/rules_unicorn_template_indent.go +28 -0
  412. package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
  413. package/linthost/rules_unicorn_throw_new_error.go +61 -0
  414. package/linthost/rules_var.go +10 -4
  415. package/linthost/rules_vitest.go +568 -0
  416. package/package.json +3 -3
  417. package/plugin/main.go +49 -3
  418. package/rule/astutil/astutil.go +10 -3
  419. package/rule/rule.go +12 -10
  420. package/src/defaultFormat.ts +11 -8
  421. package/src/index.ts +65 -43
  422. package/src/structures/ITtscLintConfig.ts +12 -6
  423. package/src/structures/{ITtscLintFormatConfig.ts → ITtscLintFormat.ts} +2 -2
  424. package/src/structures/TtscLintRuleSetting.ts +55 -0
  425. package/src/structures/index.ts +3 -4
  426. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +128 -0
  427. package/src/structures/rules/ITtscLintBoundariesRules.ts +95 -0
  428. package/src/structures/rules/ITtscLintContributorRules.ts +21 -0
  429. package/src/structures/rules/ITtscLintCoreRules.ts +1406 -0
  430. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
  431. package/src/structures/rules/ITtscLintCypressRules.ts +145 -0
  432. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +213 -0
  433. package/src/structures/rules/ITtscLintFunctionalRules.ts +202 -0
  434. package/src/structures/rules/ITtscLintJestRules.ts +220 -0
  435. package/src/structures/rules/ITtscLintJsdocRules.ts +153 -0
  436. package/src/structures/rules/ITtscLintJsxA11yRules.ts +339 -0
  437. package/src/structures/rules/ITtscLintNextjsRules.ts +206 -0
  438. package/src/structures/rules/ITtscLintPlaywrightRules.ts +361 -0
  439. package/src/structures/rules/ITtscLintPromiseRules.ts +205 -0
  440. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
  441. package/src/structures/rules/ITtscLintReactPerfRules.ts +55 -0
  442. package/src/structures/rules/ITtscLintReactRuleOptions.ts +43 -0
  443. package/src/structures/rules/ITtscLintReactRules.ts +321 -0
  444. package/src/structures/rules/ITtscLintRegexpRules.ts +212 -0
  445. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +89 -0
  446. package/src/structures/rules/ITtscLintRules.ts +77 -0
  447. package/src/structures/rules/ITtscLintSecurityRules.ts +162 -0
  448. package/src/structures/rules/ITtscLintSolidRules.ts +202 -0
  449. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +23 -0
  450. package/src/structures/rules/ITtscLintStorybookRules.ts +193 -0
  451. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +102 -0
  452. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +24 -0
  453. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +342 -0
  454. package/src/structures/rules/ITtscLintTypeScriptRules.ts +1230 -0
  455. package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
  456. package/src/structures/rules/ITtscLintVitestRules.ts +154 -0
  457. package/src/structures/rules/index.ts +31 -0
  458. package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
  459. package/lib/structures/TtscLintRule.d.ts +0 -17
  460. package/lib/structures/TtscLintRule.js.map +0 -1
  461. package/lib/structures/TtscLintRuleMap.d.ts +0 -46
  462. package/lib/structures/TtscLintRuleMap.js.map +0 -1
  463. package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
  464. package/lib/structures/TtscLintRuleOptions.js.map +0 -1
  465. package/src/structures/TtscLintRule.ts +0 -160
  466. package/src/structures/TtscLintRuleMap.ts +0 -55
  467. package/src/structures/TtscLintRuleOptions.ts +0 -151
@@ -0,0 +1,51 @@
1
+ // unicorn/no-invalid-remove-event-listener: passing a fresh function
2
+ // literal to `removeEventListener` is a no-op because event-target
3
+ // internals match listeners by reference identity. The handler that was
4
+ // originally registered still fires; the call silently does nothing.
5
+ //
6
+ // AST-only: visit each `CallExpression`, match when the callee is a
7
+ // `PropertyAccessExpression(_, removeEventListener)` and the second
8
+ // argument (after stripping parens) is a fresh arrow function or
9
+ // function expression. Fire on the call so the diagnostic lands at the
10
+ // no-op site.
11
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-remove-event-listener.md
12
+ package linthost
13
+
14
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
15
+
16
+ type unicornNoInvalidRemoveEventListener struct{}
17
+
18
+ func (unicornNoInvalidRemoveEventListener) Name() string {
19
+ return "unicorn/no-invalid-remove-event-listener"
20
+ }
21
+ func (unicornNoInvalidRemoveEventListener) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindCallExpression}
23
+ }
24
+ func (unicornNoInvalidRemoveEventListener) Check(ctx *Context, node *shimast.Node) {
25
+ call := node.AsCallExpression()
26
+ if call == nil || call.Expression == nil {
27
+ return
28
+ }
29
+ if call.Expression.Kind != shimast.KindPropertyAccessExpression {
30
+ return
31
+ }
32
+ access := call.Expression.AsPropertyAccessExpression()
33
+ if access == nil || identifierText(access.Name()) != "removeEventListener" {
34
+ return
35
+ }
36
+ if call.Arguments == nil || len(call.Arguments.Nodes) < 2 {
37
+ return
38
+ }
39
+ handler := stripParens(call.Arguments.Nodes[1])
40
+ if handler == nil {
41
+ return
42
+ }
43
+ switch handler.Kind {
44
+ case shimast.KindArrowFunction, shimast.KindFunctionExpression:
45
+ ctx.Report(node, "Calling `removeEventListener` with a fresh function reference removes nothing — store and reuse the handler.")
46
+ }
47
+ }
48
+
49
+ func init() {
50
+ Register(unicornNoInvalidRemoveEventListener{})
51
+ }
@@ -0,0 +1,101 @@
1
+ // unicorn/no-keyword-prefix: identifiers like `newFoo` or `classBar`
2
+ // embed a reserved word at the prefix position so the reader has to
3
+ // re-parse the identifier each time. The rule discourages the prefix in
4
+ // declarations so the codebase converges on names whose first segment
5
+ // is not a JavaScript keyword.
6
+ //
7
+ // AST-only: visit every `Identifier` and fire only on declaration
8
+ // positions (parameter, variable, function, class, method, accessor,
9
+ // property, binding-element names). Reads of an already-named binding
10
+ // are NOT flagged — the diagnostic is anchored on the declaration so
11
+ // the rename happens once. Uses the same value-position-gate logic as
12
+ // `prefer-global-this`, inverted: this rule needs the identifier to be
13
+ // in a *name* slot, not a value-expression slot.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-keyword-prefix.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornNoKeywordPrefix struct{}
20
+
21
+ func (unicornNoKeywordPrefix) Name() string { return "unicorn/no-keyword-prefix" }
22
+ func (unicornNoKeywordPrefix) Visits() []shimast.Kind {
23
+ return []shimast.Kind{shimast.KindIdentifier}
24
+ }
25
+ func (unicornNoKeywordPrefix) Check(ctx *Context, node *shimast.Node) {
26
+ name := identifierText(node)
27
+ if !hasKeywordPrefix(name) {
28
+ return
29
+ }
30
+ if !isUnicornDeclarationPositionIdentifier(node) {
31
+ return
32
+ }
33
+ ctx.Report(node, "Don't prefix identifiers with a reserved word (`new` / `class`).")
34
+ }
35
+
36
+ // hasKeywordPrefix reports whether `name` starts with `new` or `class`
37
+ // followed by an uppercase ASCII letter. The case-sensitive prefix +
38
+ // the uppercase next letter together pin the camelCase pattern the rule
39
+ // targets (`newFoo`, `classBar`); plain words like `news` or `classic`
40
+ // share the prefix bytes but not the camelCase break and are out of
41
+ // scope.
42
+ func hasKeywordPrefix(name string) bool {
43
+ for _, prefix := range []string{"new", "class"} {
44
+ if len(name) <= len(prefix) {
45
+ continue
46
+ }
47
+ if name[:len(prefix)] != prefix {
48
+ continue
49
+ }
50
+ next := name[len(prefix)]
51
+ if next >= 'A' && next <= 'Z' {
52
+ return true
53
+ }
54
+ }
55
+ return false
56
+ }
57
+
58
+ // isUnicornDeclarationPositionIdentifier reports whether `node` (a bare
59
+ // Identifier) appears as a *name* slot of a declaration, i.e. the slot
60
+ // reserved by the language for introducing a new binding. Reads,
61
+ // property keys on accesses, type references, and labels are filtered
62
+ // out so the rule only fires on declarations.
63
+ func isUnicornDeclarationPositionIdentifier(node *shimast.Node) bool {
64
+ if node == nil || node.Kind != shimast.KindIdentifier || node.Parent == nil {
65
+ return false
66
+ }
67
+ parent := node.Parent
68
+ switch parent.Kind {
69
+ case shimast.KindVariableDeclaration:
70
+ decl := parent.AsVariableDeclaration()
71
+ return decl != nil && decl.Name() == node
72
+ case shimast.KindBindingElement:
73
+ elem := parent.AsBindingElement()
74
+ return elem != nil && elem.Name() == node
75
+ case shimast.KindParameter:
76
+ param := parent.AsParameterDeclaration()
77
+ return param != nil && param.Name() == node
78
+ case shimast.KindFunctionDeclaration:
79
+ fn := parent.AsFunctionDeclaration()
80
+ return fn != nil && fn.Name() == node
81
+ case shimast.KindFunctionExpression:
82
+ fn := parent.AsFunctionExpression()
83
+ return fn != nil && fn.Name() == node
84
+ case shimast.KindClassDeclaration:
85
+ cls := parent.AsClassDeclaration()
86
+ return cls != nil && cls.Name() == node
87
+ case shimast.KindClassExpression:
88
+ cls := parent.AsClassExpression()
89
+ return cls != nil && cls.Name() == node
90
+ case shimast.KindMethodDeclaration,
91
+ shimast.KindGetAccessor,
92
+ shimast.KindSetAccessor,
93
+ shimast.KindPropertyDeclaration:
94
+ return true
95
+ }
96
+ return false
97
+ }
98
+
99
+ func init() {
100
+ Register(unicornNoKeywordPrefix{})
101
+ }
@@ -0,0 +1,44 @@
1
+ // unicorn/no-lonely-if: `else { if (cond) { … } }` collapses to
2
+ // `else if (cond) { … }`. Wrapping a single `if` in an `else` block
3
+ // adds an extra brace pair and an extra indentation level without
4
+ // changing semantics, so the rule flags it as redundant punctuation.
5
+ //
6
+ // AST-only and parent-walking: visit every `IfStatement`, then check
7
+ // whether its parent is a `Block` containing exactly this one
8
+ // statement AND that block is the `ElseStatement` of an outer
9
+ // `IfStatement`. Mirrors the core `no-lonely-if` rule shape.
10
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-lonely-if.md
11
+ package linthost
12
+
13
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
14
+
15
+ type unicornNoLonelyIf struct{}
16
+
17
+ func (unicornNoLonelyIf) Name() string { return "unicorn/no-lonely-if" }
18
+ func (unicornNoLonelyIf) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindIfStatement} }
19
+ func (unicornNoLonelyIf) Check(ctx *Context, node *shimast.Node) {
20
+ parent := node.Parent
21
+ if parent == nil || parent.Kind != shimast.KindBlock {
22
+ return
23
+ }
24
+ block := parent.AsBlock()
25
+ if block == nil || block.Statements == nil {
26
+ return
27
+ }
28
+ if len(block.Statements.Nodes) != 1 {
29
+ return
30
+ }
31
+ grand := parent.Parent
32
+ if grand == nil || grand.Kind != shimast.KindIfStatement {
33
+ return
34
+ }
35
+ gif := grand.AsIfStatement()
36
+ if gif == nil || gif.ElseStatement != parent {
37
+ return
38
+ }
39
+ ctx.Report(node, "Use `else if` instead of an `if` as the only statement inside an `else` block.")
40
+ }
41
+
42
+ func init() {
43
+ Register(unicornNoLonelyIf{})
44
+ }
@@ -0,0 +1,51 @@
1
+ // unicorn/no-magic-array-flat-depth: `Array#flat(depth)` accepts a numeric
2
+ // argument that controls how many nested levels are flattened. Magic
3
+ // numbers like `.flat(2)` or `.flat(3)` make the call hard to scan —
4
+ // readers must mentally model the input shape to decide whether the
5
+ // depth is correct. The rule allows `1` (the default depth, common
6
+ // enough to read at a glance) and `Infinity` (an explicit named value)
7
+ // but flags every other numeric literal so authors switch to either
8
+ // `Infinity` or a named constant.
9
+ //
10
+ // AST-only: dispatch on `KindCallExpression`, require a property-access
11
+ // callee whose method identifier is `flat`, exactly one argument, and
12
+ // that argument to be `KindNumericLiteral` with text other than "1".
13
+ // `Infinity` is parsed as an Identifier, not a NumericLiteral, so the
14
+ // kind check alone exempts it without a separate value branch.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md
16
+ package linthost
17
+
18
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
19
+
20
+ type unicornNoMagicArrayFlatDepth struct{}
21
+
22
+ func (unicornNoMagicArrayFlatDepth) Name() string { return "unicorn/no-magic-array-flat-depth" }
23
+ func (unicornNoMagicArrayFlatDepth) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindCallExpression}
25
+ }
26
+ func (unicornNoMagicArrayFlatDepth) Check(ctx *Context, node *shimast.Node) {
27
+ call := node.AsCallExpression()
28
+ if call == nil || call.Expression == nil ||
29
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
30
+ return
31
+ }
32
+ access := call.Expression.AsPropertyAccessExpression()
33
+ if access == nil || identifierText(access.Name()) != "flat" {
34
+ return
35
+ }
36
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
37
+ return
38
+ }
39
+ arg := stripParens(call.Arguments.Nodes[0])
40
+ if arg == nil || arg.Kind != shimast.KindNumericLiteral {
41
+ return
42
+ }
43
+ if numericLiteralText(arg) == "1" {
44
+ return
45
+ }
46
+ ctx.Report(node, "Don't use a magic-number depth in `Array#flat()` — use `Infinity` or a named constant.")
47
+ }
48
+
49
+ func init() {
50
+ Register(unicornNoMagicArrayFlatDepth{})
51
+ }
@@ -0,0 +1,54 @@
1
+ // unicorn/no-named-default: a named-import specifier that re-aliases the
2
+ // module's default export (`import { default as Foo } from "mod"`) does
3
+ // the same job as the dedicated default-import form `import Foo from "mod"`
4
+ // but obscures the intent — reviewers reading the named-import list have
5
+ // to notice the `default as` prefix to realize the binding is the
6
+ // module's default, not a named export named "default". The rule flags
7
+ // every such specifier so authors use the default-import syntax instead.
8
+ //
9
+ // AST-only: dispatch on `KindImportDeclaration`, descend through the
10
+ // import clause's NamedImports list, and fire on each specifier whose
11
+ // `PropertyName` is an identifier named "default". The default-import
12
+ // case (`clause.Name()`) and namespace imports (`* as`) are not
13
+ // affected; the property-name check matches both `import { default as X }`
14
+ // and the deprecated string form `import { "default" as X }`.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-named-default.md
16
+ package linthost
17
+
18
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
19
+
20
+ type unicornNoNamedDefault struct{}
21
+
22
+ func (unicornNoNamedDefault) Name() string { return "unicorn/no-named-default" }
23
+ func (unicornNoNamedDefault) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindImportDeclaration}
25
+ }
26
+ func (unicornNoNamedDefault) Check(ctx *Context, node *shimast.Node) {
27
+ decl := node.AsImportDeclaration()
28
+ if decl == nil || decl.ImportClause == nil {
29
+ return
30
+ }
31
+ clause := decl.ImportClause.AsImportClause()
32
+ if clause == nil || clause.NamedBindings == nil ||
33
+ clause.NamedBindings.Kind != shimast.KindNamedImports {
34
+ return
35
+ }
36
+ named := clause.NamedBindings.AsNamedImports()
37
+ if named == nil || named.Elements == nil {
38
+ return
39
+ }
40
+ for _, spec := range named.Elements.Nodes {
41
+ s := spec.AsImportSpecifier()
42
+ if s == nil || s.PropertyName == nil {
43
+ continue
44
+ }
45
+ if moduleExportNameText(s.PropertyName) != "default" {
46
+ continue
47
+ }
48
+ ctx.Report(spec, "Don't import a default export under a named alias — use `import X from \"...\"` instead.")
49
+ }
50
+ }
51
+
52
+ func init() {
53
+ Register(unicornNoNamedDefault{})
54
+ }
@@ -0,0 +1,85 @@
1
+ // unicorn/no-negated-condition: a negated condition with an `else`
2
+ // branch forces the reader to mentally invert the test before they can
3
+ // pair branches with outcomes. Swapping the two branches and dropping
4
+ // the negation reads in source order. The rule fires on `if` / `else`
5
+ // pairs and on ternaries where both branches are present.
6
+ //
7
+ // AST-only: visit `KindIfStatement` and `KindConditionalExpression`.
8
+ // Match when the condition (after `stripParens`) is either a `!`
9
+ // prefix-unary expression or a `!=` / `!==` binary expression AND the
10
+ // other branch is also present. Fire on the if / ternary node.
11
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negated-condition.md
12
+ package linthost
13
+
14
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
15
+
16
+ type unicornNoNegatedCondition struct{}
17
+
18
+ func (unicornNoNegatedCondition) Name() string { return "unicorn/no-negated-condition" }
19
+ func (unicornNoNegatedCondition) Visits() []shimast.Kind {
20
+ return []shimast.Kind{shimast.KindIfStatement, shimast.KindConditionalExpression}
21
+ }
22
+ func (unicornNoNegatedCondition) Check(ctx *Context, node *shimast.Node) {
23
+ var condition *shimast.Node
24
+ switch node.Kind {
25
+ case shimast.KindIfStatement:
26
+ stmt := node.AsIfStatement()
27
+ if stmt == nil || stmt.ElseStatement == nil {
28
+ return
29
+ }
30
+ // An `else if` chain (else is itself an IfStatement) reads
31
+ // fine after inversion only when the else has its own else;
32
+ // otherwise inverting reshapes the chain. Keep the rule
33
+ // conservative and only fire when else is a Block.
34
+ if stmt.ElseStatement.Kind == shimast.KindIfStatement {
35
+ return
36
+ }
37
+ condition = stmt.Expression
38
+ case shimast.KindConditionalExpression:
39
+ cond := node.AsConditionalExpression()
40
+ if cond == nil || cond.WhenTrue == nil || cond.WhenFalse == nil {
41
+ return
42
+ }
43
+ condition = cond.Condition
44
+ }
45
+ if condition == nil {
46
+ return
47
+ }
48
+ condition = stripParens(condition)
49
+ if condition == nil {
50
+ return
51
+ }
52
+ if !unicornNoNegatedConditionIsNegated(condition) {
53
+ return
54
+ }
55
+ ctx.Report(node, "Avoid negated conditions in `if` / `else` and ternaries when the positive form is shorter.")
56
+ }
57
+
58
+ // unicornNoNegatedConditionIsNegated reports whether `node` is a `!`
59
+ // prefix-unary expression or a `!=` / `!==` binary expression — the
60
+ // two shapes the rule treats as "negated".
61
+ func unicornNoNegatedConditionIsNegated(node *shimast.Node) bool {
62
+ if node == nil {
63
+ return false
64
+ }
65
+ switch node.Kind {
66
+ case shimast.KindPrefixUnaryExpression:
67
+ prefix := node.AsPrefixUnaryExpression()
68
+ return prefix != nil && prefix.Operator == shimast.KindExclamationToken
69
+ case shimast.KindBinaryExpression:
70
+ bin := node.AsBinaryExpression()
71
+ if bin == nil || bin.OperatorToken == nil {
72
+ return false
73
+ }
74
+ switch bin.OperatorToken.Kind {
75
+ case shimast.KindExclamationEqualsToken,
76
+ shimast.KindExclamationEqualsEqualsToken:
77
+ return true
78
+ }
79
+ }
80
+ return false
81
+ }
82
+
83
+ func init() {
84
+ Register(unicornNoNegatedCondition{})
85
+ }
@@ -0,0 +1,50 @@
1
+ // unicorn/no-negation-in-equality-check: `!a === b` parses as
2
+ // `(!a) === b`, comparing the *boolean* `!a` against `b`. Readers
3
+ // almost always expect `!(a === b)` instead, so the rule rejects the
4
+ // `!a === b` / `!a !== b` shape and asks the author to either switch
5
+ // the comparison operator (`a !== b`) or wrap the negation in parens.
6
+ //
7
+ // AST-only: visit each `BinaryExpression`, match the operator against
8
+ // the four equality tokens, and check whether the LEFT operand is a
9
+ // `!` prefix-unary expression. Parens are the documented escape hatch
10
+ // (`(!a) === b`), so the check does NOT strip them. Fire on the binary
11
+ // expression so the report covers the full ambiguous shape.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornNoNegationInEqualityCheck struct{}
18
+
19
+ func (unicornNoNegationInEqualityCheck) Name() string {
20
+ return "unicorn/no-negation-in-equality-check"
21
+ }
22
+ func (unicornNoNegationInEqualityCheck) Visits() []shimast.Kind {
23
+ return []shimast.Kind{shimast.KindBinaryExpression}
24
+ }
25
+ func (unicornNoNegationInEqualityCheck) Check(ctx *Context, node *shimast.Node) {
26
+ bin := node.AsBinaryExpression()
27
+ if bin == nil || bin.OperatorToken == nil || bin.Left == nil {
28
+ return
29
+ }
30
+ switch bin.OperatorToken.Kind {
31
+ case shimast.KindEqualsEqualsEqualsToken,
32
+ shimast.KindEqualsEqualsToken,
33
+ shimast.KindExclamationEqualsEqualsToken,
34
+ shimast.KindExclamationEqualsToken:
35
+ default:
36
+ return
37
+ }
38
+ if bin.Left.Kind != shimast.KindPrefixUnaryExpression {
39
+ return
40
+ }
41
+ prefix := bin.Left.AsPrefixUnaryExpression()
42
+ if prefix == nil || prefix.Operator != shimast.KindExclamationToken {
43
+ return
44
+ }
45
+ ctx.Report(node, "Don't negate the left operand of an equality check — use `!==` directly, or wrap in parens.")
46
+ }
47
+
48
+ func init() {
49
+ Register(unicornNoNegationInEqualityCheck{})
50
+ }
@@ -0,0 +1,43 @@
1
+ // unicorn/no-nested-ternary: `a ? b : c ? d : e` packs two decision
2
+ // points into one expression and forces the reader to track operator
3
+ // precedence to know which branch each value belongs to. Unlike the
4
+ // core ESLint rule of the same name, the unicorn variant fires on every
5
+ // nested level rather than only the outermost — each inner conditional
6
+ // is its own offense and is reported in place.
7
+ //
8
+ // AST-only: visit every `ConditionalExpression` and report on it when
9
+ // its parent is also a `ConditionalExpression`. `stripParens` makes the
10
+ // match insensitive to grouping parens.
11
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-nested-ternary.md
12
+ package linthost
13
+
14
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
15
+
16
+ type unicornNoNestedTernary struct{}
17
+
18
+ func (unicornNoNestedTernary) Name() string { return "unicorn/no-nested-ternary" }
19
+ func (unicornNoNestedTernary) Visits() []shimast.Kind {
20
+ return []shimast.Kind{shimast.KindConditionalExpression}
21
+ }
22
+ func (unicornNoNestedTernary) Check(ctx *Context, node *shimast.Node) {
23
+ cond := node.AsConditionalExpression()
24
+ if cond == nil {
25
+ return
26
+ }
27
+ if hasUnicornNestedConditional(cond.WhenTrue) {
28
+ ctx.Report(stripParens(cond.WhenTrue), "Do not nest ternary expressions.")
29
+ return
30
+ }
31
+ if hasUnicornNestedConditional(cond.WhenFalse) {
32
+ ctx.Report(stripParens(cond.WhenFalse), "Do not nest ternary expressions.")
33
+ }
34
+ }
35
+
36
+ func hasUnicornNestedConditional(node *shimast.Node) bool {
37
+ expr := stripParens(node)
38
+ return expr != nil && expr.Kind == shimast.KindConditionalExpression
39
+ }
40
+
41
+ func init() {
42
+ Register(unicornNoNestedTernary{})
43
+ }
@@ -0,0 +1,30 @@
1
+ // unicorn/no-new-array: `new Array(n)` is a sharp edge — with a single
2
+ // numeric argument it allocates a sparse array of length `n`, with
3
+ // anything else it constructs from the arguments. The two readings
4
+ // share one syntax, so the same expression silently switches meaning
5
+ // when its input shape changes. The replacement is an array literal,
6
+ // `Array.from`, or `Array.of`.
7
+ //
8
+ // AST-only and identifier-text-driven: any `NewExpression` whose callee
9
+ // is an `Identifier` named `Array` fires. Shadowed `Array` bindings,
10
+ // argument count, and argument types are not part of the match,
11
+ // mirroring `unicorn/no-new-buffer`.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-new-array.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornNoNewArray struct{}
18
+
19
+ func (unicornNoNewArray) Name() string { return "unicorn/no-new-array" }
20
+ func (unicornNoNewArray) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindNewExpression} }
21
+ func (unicornNoNewArray) Check(ctx *Context, node *shimast.Node) {
22
+ ne := node.AsNewExpression()
23
+ if ne != nil && identifierText(ne.Expression) == "Array" {
24
+ ctx.Report(node, "Don't use `new Array(...)` — use an array literal or `Array.from`/`Array.of` instead.")
25
+ }
26
+ }
27
+
28
+ func init() {
29
+ Register(unicornNoNewArray{})
30
+ }
@@ -0,0 +1,31 @@
1
+ // unicorn/no-new-buffer: the `new Buffer(...)` constructor was deprecated
2
+ // in Node because its overloads route on argument type at runtime — an
3
+ // integer allocates uninitialized memory, a string decodes bytes, an array
4
+ // copies them — so the same call site silently changes meaning when its
5
+ // input shape changes. The replacement is the explicit `Buffer.from()` /
6
+ // `Buffer.alloc()` pair.
7
+ //
8
+ // AST-only and identifier-text-driven: the rule fires on any `NewExpression`
9
+ // whose callee is an `Identifier` named `Buffer`. Shadowed `Buffer`
10
+ // bindings and import sources are out of scope; argument count and shape
11
+ // are not part of the match, so `new Buffer(10)`, `new Buffer("ascii")`,
12
+ // and `new Buffer([])` all report.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-new-buffer.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoNewBuffer struct{}
19
+
20
+ func (unicornNoNewBuffer) Name() string { return "unicorn/no-new-buffer" }
21
+ func (unicornNoNewBuffer) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindNewExpression} }
22
+ func (unicornNoNewBuffer) Check(ctx *Context, node *shimast.Node) {
23
+ ne := node.AsNewExpression()
24
+ if ne != nil && identifierText(ne.Expression) == "Buffer" {
25
+ ctx.Report(node, "`new Buffer()` is deprecated, use `Buffer.from()` or `Buffer.alloc()` instead.")
26
+ }
27
+ }
28
+
29
+ func init() {
30
+ Register(unicornNoNewBuffer{})
31
+ }
@@ -0,0 +1,24 @@
1
+ // unicorn/no-null: the bare `null` literal is treated as a code smell —
2
+ // the rule's policy is that `undefined` is the single absent-value token
3
+ // in user code. Every occurrence of the keyword anywhere in the source is
4
+ // flagged so the codebase converges on one convention.
5
+ //
6
+ // AST-only: the engine dispatches once per `NullKeyword` node and the
7
+ // rule reports unconditionally on that node. There is no fixer in this
8
+ // pass — the diagnostic alone is the contract.
9
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-null.md
10
+ package linthost
11
+
12
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
13
+
14
+ type unicornNoNull struct{}
15
+
16
+ func (unicornNoNull) Name() string { return "unicorn/no-null" }
17
+ func (unicornNoNull) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindNullKeyword} }
18
+ func (unicornNoNull) Check(ctx *Context, node *shimast.Node) {
19
+ ctx.Report(node, "Use `undefined` instead of `null`.")
20
+ }
21
+
22
+ func init() {
23
+ Register(unicornNoNull{})
24
+ }
@@ -0,0 +1,48 @@
1
+ // unicorn/no-object-as-default-parameter: writing
2
+ // `function f(opts = { tag: "x" })` ships a hidden default object that
3
+ // is hard to override granularly — callers either supply the whole
4
+ // object or get every default at once, and the option keys are
5
+ // invisible at the call site. Destructuring with per-key defaults
6
+ // (`function f({ tag = "x" } = {})`) is the canonical replacement.
7
+ //
8
+ // AST-only: dispatch on `ParameterDeclaration`. Fire when the parameter
9
+ // has a non-empty object-literal initializer and the parameter name
10
+ // itself is a bare identifier (already-destructured parameters are
11
+ // covered by the destructuring form the rule recommends). Empty
12
+ // objects `param = {}` are out of scope — that pattern is a different
13
+ // rule.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-object-as-default-parameter.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornNoObjectAsDefaultParameter struct{}
20
+
21
+ func (unicornNoObjectAsDefaultParameter) Name() string {
22
+ return "unicorn/no-object-as-default-parameter"
23
+ }
24
+ func (unicornNoObjectAsDefaultParameter) Visits() []shimast.Kind {
25
+ return []shimast.Kind{shimast.KindParameter}
26
+ }
27
+ func (unicornNoObjectAsDefaultParameter) Check(ctx *Context, node *shimast.Node) {
28
+ param := node.AsParameterDeclaration()
29
+ if param == nil || param.Initializer == nil || param.Name() == nil {
30
+ return
31
+ }
32
+ if param.Name().Kind != shimast.KindIdentifier {
33
+ return
34
+ }
35
+ init := stripParens(param.Initializer)
36
+ if init == nil || init.Kind != shimast.KindObjectLiteralExpression {
37
+ return
38
+ }
39
+ obj := init.AsObjectLiteralExpression()
40
+ if obj == nil || obj.Properties == nil || len(obj.Properties.Nodes) == 0 {
41
+ return
42
+ }
43
+ ctx.Report(node, "Don't use an object literal as a default parameter — destructure the option instead.")
44
+ }
45
+
46
+ func init() {
47
+ Register(unicornNoObjectAsDefaultParameter{})
48
+ }
@@ -0,0 +1,43 @@
1
+ // unicorn/no-process-exit: calling `process.exit(...)` short-circuits the
2
+ // Node runtime before pending I/O, timers, or microtasks drain, which
3
+ // turns ordinary error paths into silent data loss. The rule pushes
4
+ // authors toward throwing or returning a non-zero status so the host
5
+ // process owns the termination decision.
6
+ //
7
+ // AST-only first pass: a `CallExpression` whose callee is a
8
+ // `PropertyAccessExpression` of the literal form `process.exit` fires.
9
+ // Computed access (`process["exit"]`), optional chaining
10
+ // (`process?.exit()`), and shadowed `process` bindings are intentionally
11
+ // out of scope — only the bare callsite is reported.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-process-exit.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornNoProcessExit struct{}
18
+
19
+ func (unicornNoProcessExit) Name() string { return "unicorn/no-process-exit" }
20
+ func (unicornNoProcessExit) Visits() []shimast.Kind {
21
+ return []shimast.Kind{shimast.KindCallExpression}
22
+ }
23
+ func (unicornNoProcessExit) Check(ctx *Context, node *shimast.Node) {
24
+ call := node.AsCallExpression()
25
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
26
+ return
27
+ }
28
+ access := call.Expression.AsPropertyAccessExpression()
29
+ if access == nil {
30
+ return
31
+ }
32
+ if identifierText(access.Expression) != "process" {
33
+ return
34
+ }
35
+ if identifierText(access.Name()) != "exit" {
36
+ return
37
+ }
38
+ ctx.Report(node, "Don't use `process.exit()`. Throw an error or return a non-zero status instead.")
39
+ }
40
+
41
+ func init() {
42
+ Register(unicornNoProcessExit{})
43
+ }