@ttsc/lint 0.13.0 → 0.14.0-dev.20250530.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/README.md +955 -85
  2. package/lib/defaultFormat.d.ts +15 -8
  3. package/lib/defaultFormat.js +15 -8
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/index.d.ts +46 -0
  6. package/lib/index.js +60 -37
  7. package/lib/index.js.map +1 -1
  8. package/lib/structures/ITtscLintConfig.d.ts +12 -6
  9. package/lib/structures/TtscLintRuleSetting.d.ts +49 -0
  10. package/lib/structures/{TtscLintRuleOptions.js → TtscLintRuleSetting.js} +1 -1
  11. package/lib/structures/TtscLintRuleSetting.js.map +1 -0
  12. package/lib/structures/format/ITtscLintFormat.d.ts +128 -0
  13. package/lib/structures/{TtscLintRuleMap.js → format/ITtscLintFormat.js} +1 -1
  14. package/lib/structures/format/ITtscLintFormat.js.map +1 -0
  15. package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +17 -0
  16. package/lib/structures/{ITtscLintFormatConfig.js → format/ITtscLintFormatJsDoc.js} +1 -1
  17. package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
  18. package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
  19. package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
  20. package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
  21. package/lib/structures/format/index.d.ts +3 -0
  22. package/lib/structures/format/index.js +20 -0
  23. package/lib/structures/format/index.js.map +1 -0
  24. package/lib/structures/index.d.ts +3 -4
  25. package/lib/structures/index.js +3 -4
  26. package/lib/structures/index.js.map +1 -1
  27. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +95 -0
  28. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +13 -0
  29. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
  30. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +75 -0
  31. package/lib/structures/rules/ITtscLintBoundariesRules.js +3 -0
  32. package/lib/structures/rules/ITtscLintBoundariesRules.js.map +1 -0
  33. package/lib/structures/rules/ITtscLintContributorRules.d.ts +16 -0
  34. package/lib/structures/rules/ITtscLintContributorRules.js +3 -0
  35. package/lib/structures/rules/ITtscLintContributorRules.js.map +1 -0
  36. package/lib/structures/rules/ITtscLintCoreRules.d.ts +1229 -0
  37. package/lib/structures/rules/ITtscLintCoreRules.js +3 -0
  38. package/lib/structures/rules/ITtscLintCoreRules.js.map +1 -0
  39. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +17 -0
  40. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +10 -0
  41. package/lib/structures/rules/ITtscLintCypressRuleOptions.js.map +1 -0
  42. package/lib/structures/rules/ITtscLintCypressRules.d.ts +125 -0
  43. package/lib/structures/rules/ITtscLintCypressRules.js +3 -0
  44. package/lib/structures/rules/ITtscLintCypressRules.js.map +1 -0
  45. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +154 -0
  46. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +13 -0
  47. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js.map +1 -0
  48. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +162 -0
  49. package/lib/structures/rules/ITtscLintFunctionalRules.js +3 -0
  50. package/lib/structures/rules/ITtscLintFunctionalRules.js.map +1 -0
  51. package/lib/structures/rules/ITtscLintJestRules.d.ts +190 -0
  52. package/lib/structures/rules/ITtscLintJestRules.js +3 -0
  53. package/lib/structures/rules/ITtscLintJestRules.js.map +1 -0
  54. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +133 -0
  55. package/lib/structures/rules/ITtscLintJsdocRules.js +3 -0
  56. package/lib/structures/rules/ITtscLintJsdocRules.js.map +1 -0
  57. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +294 -0
  58. package/lib/structures/rules/ITtscLintJsxA11yRules.js +3 -0
  59. package/lib/structures/rules/ITtscLintJsxA11yRules.js.map +1 -0
  60. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +180 -0
  61. package/lib/structures/rules/ITtscLintNextjsRules.js +3 -0
  62. package/lib/structures/rules/ITtscLintNextjsRules.js.map +1 -0
  63. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +312 -0
  64. package/lib/structures/rules/ITtscLintPlaywrightRules.js +3 -0
  65. package/lib/structures/rules/ITtscLintPlaywrightRules.js.map +1 -0
  66. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +179 -0
  67. package/lib/structures/rules/ITtscLintPromiseRules.js +3 -0
  68. package/lib/structures/rules/ITtscLintPromiseRules.js.map +1 -0
  69. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +18 -0
  70. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js +8 -0
  71. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js.map +1 -0
  72. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +49 -0
  73. package/lib/structures/rules/ITtscLintReactPerfRules.js +3 -0
  74. package/lib/structures/rules/ITtscLintReactPerfRules.js.map +1 -0
  75. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +37 -0
  76. package/lib/structures/rules/ITtscLintReactRuleOptions.js +11 -0
  77. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
  78. package/lib/structures/rules/ITtscLintReactRules.d.ts +276 -0
  79. package/lib/structures/rules/ITtscLintReactRules.js +3 -0
  80. package/lib/structures/rules/ITtscLintReactRules.js.map +1 -0
  81. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +182 -0
  82. package/lib/structures/rules/ITtscLintRegexpRules.js +3 -0
  83. package/lib/structures/rules/ITtscLintRegexpRules.js.map +1 -0
  84. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +65 -0
  85. package/lib/structures/rules/ITtscLintRuleOptionsMap.js +3 -0
  86. package/lib/structures/rules/ITtscLintRuleOptionsMap.js.map +1 -0
  87. package/lib/structures/rules/ITtscLintRules.d.ts +55 -0
  88. package/lib/structures/{TtscLintRule.js → rules/ITtscLintRules.js} +1 -1
  89. package/lib/structures/rules/ITtscLintRules.js.map +1 -0
  90. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +141 -0
  91. package/lib/structures/rules/ITtscLintSecurityRules.js +3 -0
  92. package/lib/structures/rules/ITtscLintSecurityRules.js.map +1 -0
  93. package/lib/structures/rules/ITtscLintSolidRules.d.ts +178 -0
  94. package/lib/structures/rules/ITtscLintSolidRules.js +3 -0
  95. package/lib/structures/rules/ITtscLintSolidRules.js.map +1 -0
  96. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +20 -0
  97. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js +9 -0
  98. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js.map +1 -0
  99. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +165 -0
  100. package/lib/structures/rules/ITtscLintStorybookRules.js +3 -0
  101. package/lib/structures/rules/ITtscLintStorybookRules.js.map +1 -0
  102. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +88 -0
  103. package/lib/structures/rules/ITtscLintTanstackQueryRules.js +3 -0
  104. package/lib/structures/rules/ITtscLintTanstackQueryRules.js.map +1 -0
  105. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +21 -0
  106. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js +10 -0
  107. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js.map +1 -0
  108. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +293 -0
  109. package/lib/structures/rules/ITtscLintTestingLibraryRules.js +3 -0
  110. package/lib/structures/rules/ITtscLintTestingLibraryRules.js.map +1 -0
  111. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +1074 -0
  112. package/lib/structures/rules/ITtscLintTypeScriptRules.js +3 -0
  113. package/lib/structures/rules/ITtscLintTypeScriptRules.js.map +1 -0
  114. package/lib/structures/rules/ITtscLintUnicornRules.d.ts +997 -0
  115. package/lib/structures/rules/ITtscLintUnicornRules.js +3 -0
  116. package/lib/structures/rules/ITtscLintUnicornRules.js.map +1 -0
  117. package/lib/structures/rules/ITtscLintVitestRules.d.ts +133 -0
  118. package/lib/structures/rules/ITtscLintVitestRules.js +3 -0
  119. package/lib/structures/rules/ITtscLintVitestRules.js.map +1 -0
  120. package/lib/structures/rules/index.d.ts +31 -0
  121. package/lib/structures/rules/index.js +48 -0
  122. package/lib/structures/rules/index.js.map +1 -0
  123. package/linthost/ast_helpers.go +30 -5
  124. package/linthost/compile.go +33 -2
  125. package/linthost/config.go +118 -71
  126. package/linthost/config_format.go +270 -104
  127. package/linthost/directives.go +67 -25
  128. package/linthost/dispatch.go +14 -3
  129. package/linthost/engine.go +160 -40
  130. package/linthost/fix.go +10 -3
  131. package/linthost/flags_gen.go +17 -15
  132. package/linthost/format.go +222 -25
  133. package/linthost/format_editor_settings.go +262 -0
  134. package/linthost/host.go +40 -3
  135. package/linthost/lsp.go +898 -0
  136. package/linthost/print_dispatch.go +5 -2
  137. package/linthost/print_engine.go +5 -5
  138. package/linthost/print_nodes_call.go +149 -67
  139. package/linthost/print_nodes_function.go +27 -2
  140. package/linthost/print_nodes_list.go +40 -5
  141. package/linthost/print_nodes_object.go +1 -1
  142. package/linthost/print_nodes_ternary.go +86 -0
  143. package/linthost/rule_names.go +14 -0
  144. package/linthost/rules_arrays.go +2 -2
  145. package/linthost/rules_boundaries.go +532 -0
  146. package/linthost/rules_camelcase.go +133 -0
  147. package/linthost/rules_complexity.go +95 -0
  148. package/linthost/rules_consistent_return.go +130 -0
  149. package/linthost/rules_console.go +1 -1
  150. package/linthost/rules_core_extra.go +739 -0
  151. package/linthost/rules_curly.go +70 -0
  152. package/linthost/rules_cypress.go +608 -0
  153. package/linthost/rules_debugger.go +2 -2
  154. package/linthost/rules_default_case.go +39 -0
  155. package/linthost/rules_default_case_last.go +46 -0
  156. package/linthost/rules_dupes.go +3 -3
  157. package/linthost/rules_empty.go +3 -3
  158. package/linthost/rules_escape.go +44 -24
  159. package/linthost/rules_eval.go +2 -2
  160. package/linthost/rules_finally.go +2 -2
  161. package/linthost/rules_format_arrow_parens.go +167 -0
  162. package/linthost/rules_format_bracket_spacing.go +117 -0
  163. package/linthost/rules_format_clause_join.go +172 -0
  164. package/linthost/rules_format_declaration_header.go +595 -0
  165. package/linthost/rules_format_indent.go +372 -0
  166. package/linthost/rules_format_jsdoc.go +5 -5
  167. package/linthost/rules_format_orphan_semi.go +106 -0
  168. package/linthost/rules_format_parameter_properties.go +175 -0
  169. package/linthost/rules_format_print_width.go +66 -55
  170. package/linthost/rules_format_quote_props.go +169 -0
  171. package/linthost/rules_format_quotes.go +76 -30
  172. package/linthost/rules_format_semi.go +186 -11
  173. package/linthost/rules_format_sort_imports.go +437 -118
  174. package/linthost/rules_format_statement_split.go +343 -0
  175. package/linthost/rules_format_ternary_nullish_parens.go +77 -0
  176. package/linthost/rules_format_trailing_comma.go +22 -3
  177. package/linthost/rules_format_whitespace.go +336 -0
  178. package/linthost/rules_functional.go +967 -0
  179. package/linthost/rules_gap.go +24 -45
  180. package/linthost/rules_grouped_accessor_pairs.go +87 -0
  181. package/linthost/rules_guard_for_in.go +198 -0
  182. package/linthost/rules_id_length.go +77 -0
  183. package/linthost/rules_imports.go +70 -2
  184. package/linthost/rules_init_declarations.go +53 -0
  185. package/linthost/rules_jest.go +618 -0
  186. package/linthost/rules_jsdoc.go +502 -0
  187. package/linthost/rules_jsx_a11y.go +1264 -0
  188. package/linthost/rules_logic.go +12 -12
  189. package/linthost/rules_loops.go +1 -1
  190. package/linthost/rules_max_classes_per_file.go +58 -0
  191. package/linthost/rules_max_depth.go +83 -0
  192. package/linthost/rules_max_lines.go +101 -0
  193. package/linthost/rules_max_lines_per_function.go +57 -0
  194. package/linthost/rules_max_nested_callbacks.go +61 -0
  195. package/linthost/rules_max_params.go +49 -0
  196. package/linthost/rules_max_statements.go +59 -0
  197. package/linthost/rules_misc.go +1 -1
  198. package/linthost/rules_nextjs.go +697 -0
  199. package/linthost/rules_no_else_return.go +75 -0
  200. package/linthost/rules_no_empty_named_blocks.go +91 -0
  201. package/linthost/rules_no_extend_native.go +51 -0
  202. package/linthost/rules_no_import_assign.go +140 -0
  203. package/linthost/rules_no_invalid_this.go +52 -0
  204. package/linthost/rules_no_loop_func.go +85 -0
  205. package/linthost/rules_no_magic_numbers.go +123 -0
  206. package/linthost/rules_no_mixed_operators.go +80 -0
  207. package/linthost/rules_no_param_reassign.go +98 -0
  208. package/linthost/rules_no_redeclare.go +270 -0
  209. package/linthost/rules_no_restricted_imports.go +105 -0
  210. package/linthost/rules_no_restricted_syntax.go +49 -0
  211. package/linthost/rules_no_shadow.go +147 -0
  212. package/linthost/rules_no_unreachable.go +77 -0
  213. package/linthost/rules_no_useless_assignment.go +120 -0
  214. package/linthost/rules_no_useless_constructor.go +245 -0
  215. package/linthost/rules_no_useless_return.go +51 -0
  216. package/linthost/rules_params.go +1 -1
  217. package/linthost/rules_playwright.go +788 -0
  218. package/linthost/rules_prefer_arrow_callback.go +124 -0
  219. package/linthost/rules_prefer_destructuring.go +98 -0
  220. package/linthost/rules_prefer_named_capture_group.go +129 -0
  221. package/linthost/rules_prefer_rest_params.go +94 -0
  222. package/linthost/rules_problems.go +41 -30
  223. package/linthost/rules_promise.go +1057 -2
  224. package/linthost/rules_protos.go +2 -2
  225. package/linthost/rules_react.go +773 -0
  226. package/linthost/rules_react_extras.go +227 -0
  227. package/linthost/rules_react_hooks.go +848 -0
  228. package/linthost/rules_react_perf.go +293 -0
  229. package/linthost/rules_react_refresh.go +583 -0
  230. package/linthost/rules_regexp.go +410 -0
  231. package/linthost/rules_security.go +830 -0
  232. package/linthost/rules_self.go +2 -2
  233. package/linthost/rules_solid.go +1073 -0
  234. package/linthost/rules_sort_imports.go +69 -0
  235. package/linthost/rules_sort_keys.go +134 -0
  236. package/linthost/rules_storybook.go +1176 -0
  237. package/linthost/rules_strings.go +4 -4
  238. package/linthost/rules_suggestions.go +38 -38
  239. package/linthost/rules_tanstack_query.go +844 -0
  240. package/linthost/rules_testing_library.go +1204 -0
  241. package/linthost/rules_throw.go +1 -1
  242. package/linthost/rules_ts.go +19 -19
  243. package/linthost/rules_ts_async.go +399 -0
  244. package/linthost/rules_ts_class_literal_property_style.go +115 -0
  245. package/linthost/rules_ts_consistent_type_exports.go +256 -0
  246. package/linthost/rules_ts_explicit_function_return_type.go +67 -0
  247. package/linthost/rules_ts_extra.go +159 -36
  248. package/linthost/rules_ts_no_base_to_string.go +218 -0
  249. package/linthost/rules_ts_no_confusing_void.go +72 -0
  250. package/linthost/rules_ts_no_deprecated.go +195 -0
  251. package/linthost/rules_ts_no_for_in_array.go +84 -0
  252. package/linthost/rules_ts_no_magic_numbers.go +124 -0
  253. package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
  254. package/linthost/rules_ts_no_misused_spread.go +104 -0
  255. package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
  256. package/linthost/rules_ts_no_restricted_types.go +62 -0
  257. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
  258. package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
  259. package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
  260. package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
  261. package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
  262. package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
  263. package/linthost/rules_ts_no_unsafe_argument.go +82 -0
  264. package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
  265. package/linthost/rules_ts_no_unsafe_call.go +82 -0
  266. package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
  267. package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
  268. package/linthost/rules_ts_no_unsafe_return.go +126 -0
  269. package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
  270. package/linthost/rules_ts_no_useless_constructor.go +52 -0
  271. package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
  272. package/linthost/rules_ts_parameter_properties.go +38 -0
  273. package/linthost/rules_ts_prefer_find.go +178 -0
  274. package/linthost/rules_ts_prefer_includes.go +255 -0
  275. package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
  276. package/linthost/rules_ts_prefer_optional_chain.go +228 -0
  277. package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
  278. package/linthost/rules_ts_prefer_readonly.go +73 -0
  279. package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
  280. package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
  281. package/linthost/rules_ts_prefer_return_this_type.go +135 -0
  282. package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
  283. package/linthost/rules_ts_promise_function_async.go +77 -0
  284. package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
  285. package/linthost/rules_ts_require_array_sort_compare.go +96 -0
  286. package/linthost/rules_ts_restrict_plus_operands.go +127 -0
  287. package/linthost/rules_ts_restrict_template_expressions.go +95 -0
  288. package/linthost/rules_ts_simple.go +387 -0
  289. package/linthost/rules_ts_sort_type_constituents.go +144 -0
  290. package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
  291. package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
  292. package/linthost/rules_ts_unbound_method.go +126 -0
  293. package/linthost/rules_tsdoc.go +136 -0
  294. package/linthost/rules_unicorn_better_regex.go +27 -0
  295. package/linthost/rules_unicorn_catch_error_name.go +46 -0
  296. package/linthost/rules_unicorn_consistent_assert.go +47 -0
  297. package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
  298. package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
  299. package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
  300. package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
  301. package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
  302. package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
  303. package/linthost/rules_unicorn_custom_error_definition.go +138 -0
  304. package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
  305. package/linthost/rules_unicorn_error_message.go +64 -0
  306. package/linthost/rules_unicorn_escape_case.go +51 -0
  307. package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
  308. package/linthost/rules_unicorn_explicit_length_check.go +88 -0
  309. package/linthost/rules_unicorn_filename_case.go +29 -0
  310. package/linthost/rules_unicorn_import_style.go +28 -0
  311. package/linthost/rules_unicorn_isolated_functions.go +29 -0
  312. package/linthost/rules_unicorn_new_for_builtins.go +87 -0
  313. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
  314. package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
  315. package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
  316. package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
  317. package/linthost/rules_unicorn_no_array_for_each.go +40 -0
  318. package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
  319. package/linthost/rules_unicorn_no_array_reduce.go +41 -0
  320. package/linthost/rules_unicorn_no_array_reverse.go +44 -0
  321. package/linthost/rules_unicorn_no_array_sort.go +43 -0
  322. package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
  323. package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
  324. package/linthost/rules_unicorn_no_console_spaces.go +61 -0
  325. package/linthost/rules_unicorn_no_document_cookie.go +41 -0
  326. package/linthost/rules_unicorn_no_empty_file.go +44 -0
  327. package/linthost/rules_unicorn_no_for_loop.go +102 -0
  328. package/linthost/rules_unicorn_no_hex_escape.go +42 -0
  329. package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
  330. package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
  331. package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
  332. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
  333. package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
  334. package/linthost/rules_unicorn_no_lonely_if.go +44 -0
  335. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
  336. package/linthost/rules_unicorn_no_named_default.go +54 -0
  337. package/linthost/rules_unicorn_no_negated_condition.go +85 -0
  338. package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
  339. package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
  340. package/linthost/rules_unicorn_no_new_array.go +30 -0
  341. package/linthost/rules_unicorn_no_new_buffer.go +31 -0
  342. package/linthost/rules_unicorn_no_null.go +24 -0
  343. package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
  344. package/linthost/rules_unicorn_no_process_exit.go +43 -0
  345. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
  346. package/linthost/rules_unicorn_no_static_only_class.go +56 -0
  347. package/linthost/rules_unicorn_no_thenable.go +74 -0
  348. package/linthost/rules_unicorn_no_this_assignment.go +35 -0
  349. package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
  350. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
  351. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
  352. package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
  353. package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
  354. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
  355. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
  356. package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
  357. package/linthost/rules_unicorn_no_unused_properties.go +30 -0
  358. package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
  359. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
  360. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
  361. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
  362. package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
  363. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
  364. package/linthost/rules_unicorn_no_useless_spread.go +67 -0
  365. package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
  366. package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
  367. package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
  368. package/linthost/rules_unicorn_number_literal_case.go +69 -0
  369. package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
  370. package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
  371. package/linthost/rules_unicorn_prefer_array_find.go +51 -0
  372. package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
  373. package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
  374. package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
  375. package/linthost/rules_unicorn_prefer_array_some.go +67 -0
  376. package/linthost/rules_unicorn_prefer_at.go +77 -0
  377. package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
  378. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
  379. package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
  380. package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
  381. package/linthost/rules_unicorn_prefer_code_point.go +49 -0
  382. package/linthost/rules_unicorn_prefer_date_now.go +78 -0
  383. package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
  384. package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
  385. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
  386. package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
  387. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
  388. package/linthost/rules_unicorn_prefer_event_target.go +36 -0
  389. package/linthost/rules_unicorn_prefer_export_from.go +129 -0
  390. package/linthost/rules_unicorn_prefer_global_this.go +127 -0
  391. package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
  392. package/linthost/rules_unicorn_prefer_includes.go +149 -0
  393. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
  394. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
  395. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
  396. package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
  397. package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
  398. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
  399. package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
  400. package/linthost/rules_unicorn_prefer_module.go +50 -0
  401. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
  402. package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
  403. package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
  404. package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
  405. package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
  406. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
  407. package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
  408. package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
  409. package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
  410. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
  411. package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
  412. package/linthost/rules_unicorn_prefer_set_has.go +42 -0
  413. package/linthost/rules_unicorn_prefer_set_size.go +48 -0
  414. package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
  415. package/linthost/rules_unicorn_prefer_single_call.go +96 -0
  416. package/linthost/rules_unicorn_prefer_spread.go +51 -0
  417. package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
  418. package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
  419. package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
  420. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
  421. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
  422. package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
  423. package/linthost/rules_unicorn_prefer_switch.go +103 -0
  424. package/linthost/rules_unicorn_prefer_ternary.go +71 -0
  425. package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
  426. package/linthost/rules_unicorn_prefer_type_error.go +127 -0
  427. package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
  428. package/linthost/rules_unicorn_relative_url_style.go +49 -0
  429. package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
  430. package/linthost/rules_unicorn_require_module_attributes.go +54 -0
  431. package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
  432. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
  433. package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
  434. package/linthost/rules_unicorn_string_content.go +27 -0
  435. package/linthost/rules_unicorn_switch_case_braces.go +42 -0
  436. package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
  437. package/linthost/rules_unicorn_template_indent.go +28 -0
  438. package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
  439. package/linthost/rules_unicorn_throw_new_error.go +61 -0
  440. package/linthost/rules_var.go +10 -4
  441. package/linthost/rules_vitest.go +568 -0
  442. package/package.json +3 -3
  443. package/plugin/main.go +49 -3
  444. package/rule/astutil/astutil.go +10 -3
  445. package/rule/rule.go +12 -10
  446. package/src/defaultFormat.ts +17 -10
  447. package/src/index.ts +65 -43
  448. package/src/structures/ITtscLintConfig.ts +14 -8
  449. package/src/structures/TtscLintRuleSetting.ts +55 -0
  450. package/src/structures/format/ITtscLintFormat.ts +141 -0
  451. package/src/structures/format/ITtscLintFormatJsDoc.ts +18 -0
  452. package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
  453. package/src/structures/format/index.ts +3 -0
  454. package/src/structures/index.ts +3 -4
  455. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +117 -0
  456. package/src/structures/rules/ITtscLintBoundariesRules.ts +91 -0
  457. package/src/structures/rules/ITtscLintContributorRules.ts +20 -0
  458. package/src/structures/rules/ITtscLintCoreRules.ts +1378 -0
  459. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
  460. package/src/structures/rules/ITtscLintCypressRules.ts +141 -0
  461. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +200 -0
  462. package/src/structures/rules/ITtscLintFunctionalRules.ts +197 -0
  463. package/src/structures/rules/ITtscLintJestRules.ts +209 -0
  464. package/src/structures/rules/ITtscLintJsdocRules.ts +146 -0
  465. package/src/structures/rules/ITtscLintJsxA11yRules.ts +331 -0
  466. package/src/structures/rules/ITtscLintNextjsRules.ts +201 -0
  467. package/src/structures/rules/ITtscLintPlaywrightRules.ts +343 -0
  468. package/src/structures/rules/ITtscLintPromiseRules.ts +196 -0
  469. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
  470. package/src/structures/rules/ITtscLintReactPerfRules.ts +53 -0
  471. package/src/structures/rules/ITtscLintReactRuleOptions.ts +41 -0
  472. package/src/structures/rules/ITtscLintReactRules.ts +308 -0
  473. package/src/structures/rules/ITtscLintRegexpRules.ts +204 -0
  474. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +88 -0
  475. package/src/structures/rules/ITtscLintRules.ts +77 -0
  476. package/src/structures/rules/ITtscLintSecurityRules.ts +155 -0
  477. package/src/structures/rules/ITtscLintSolidRules.ts +199 -0
  478. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +22 -0
  479. package/src/structures/rules/ITtscLintStorybookRules.ts +184 -0
  480. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +96 -0
  481. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +23 -0
  482. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +325 -0
  483. package/src/structures/rules/ITtscLintTypeScriptRules.ts +1172 -0
  484. package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
  485. package/src/structures/rules/ITtscLintVitestRules.ts +146 -0
  486. package/src/structures/rules/index.ts +31 -0
  487. package/lib/structures/ITtscLintFormatConfig.d.ts +0 -153
  488. package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
  489. package/lib/structures/TtscLintRule.d.ts +0 -17
  490. package/lib/structures/TtscLintRule.js.map +0 -1
  491. package/lib/structures/TtscLintRuleMap.d.ts +0 -46
  492. package/lib/structures/TtscLintRuleMap.js.map +0 -1
  493. package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
  494. package/lib/structures/TtscLintRuleOptions.js.map +0 -1
  495. package/src/structures/ITtscLintFormatConfig.ts +0 -168
  496. package/src/structures/TtscLintRule.ts +0 -160
  497. package/src/structures/TtscLintRuleMap.ts +0 -55
  498. package/src/structures/TtscLintRuleOptions.ts +0 -151
@@ -0,0 +1,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
+ }
@@ -0,0 +1,59 @@
1
+ // unicorn/no-single-promise-in-promise-methods:
2
+ // `Promise.all([single])`, `Promise.allSettled([single])`,
3
+ // `Promise.race([single])`, and `Promise.any([single])` are redundant
4
+ // wrappers — the result is just `single` (or a one-element array
5
+ // wrapping its resolution, which the caller can produce trivially).
6
+ // The wrapper hides the fact that there is only one promise in flight
7
+ // and forces an extra allocation for no behavioral difference.
8
+ //
9
+ // AST-only and identifier-text-driven: dispatch on `CallExpression`,
10
+ // match a `Promise.<method>` callee against the four collection
11
+ // methods, and require exactly one argument whose stripped form is an
12
+ // `ArrayLiteralExpression` with exactly one element. Shadowed
13
+ // `Promise` bindings are out of scope; the syntactic shape is the
14
+ // signal.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md
16
+ package linthost
17
+
18
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
19
+
20
+ type unicornNoSinglePromiseInPromiseMethods struct{}
21
+
22
+ func (unicornNoSinglePromiseInPromiseMethods) Name() string {
23
+ return "unicorn/no-single-promise-in-promise-methods"
24
+ }
25
+ func (unicornNoSinglePromiseInPromiseMethods) Visits() []shimast.Kind {
26
+ return []shimast.Kind{shimast.KindCallExpression}
27
+ }
28
+ func (unicornNoSinglePromiseInPromiseMethods) Check(ctx *Context, node *shimast.Node) {
29
+ call := node.AsCallExpression()
30
+ if call == nil || call.Expression == nil ||
31
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
32
+ return
33
+ }
34
+ access := call.Expression.AsPropertyAccessExpression()
35
+ if access == nil || identifierText(access.Expression) != "Promise" {
36
+ return
37
+ }
38
+ switch identifierText(access.Name()) {
39
+ case "all", "allSettled", "race", "any":
40
+ default:
41
+ return
42
+ }
43
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
44
+ return
45
+ }
46
+ arg := stripParens(call.Arguments.Nodes[0])
47
+ if arg == nil || arg.Kind != shimast.KindArrayLiteralExpression {
48
+ return
49
+ }
50
+ arr := arg.AsArrayLiteralExpression()
51
+ if arr == nil || arr.Elements == nil || len(arr.Elements.Nodes) != 1 {
52
+ return
53
+ }
54
+ ctx.Report(node, "Don't wrap a single promise in `Promise.<method>([...])` — the wrapper is redundant.")
55
+ }
56
+
57
+ func init() {
58
+ Register(unicornNoSinglePromiseInPromiseMethods{})
59
+ }
@@ -0,0 +1,56 @@
1
+ // unicorn/no-static-only-class: a class whose every member is `static`
2
+ // is a namespace dressed up as a class. The `class` keyword introduces
3
+ // a constructor, a prototype chain, and `new`-able semantics that the
4
+ // static-only form never uses. A plain object literal or a module
5
+ // namespace is the more honest shape.
6
+ //
7
+ // AST-only: visit both `ClassDeclaration` and `ClassExpression`. The
8
+ // rule requires at least one member (empty classes are handled by a
9
+ // separate rule) and every member must be a method, property, getter,
10
+ // or setter declaration with the `static` modifier. Constructors,
11
+ // index signatures, and any non-static member disqualify the class.
12
+ // Classes with heritage clauses (`extends`, `implements`) are also
13
+ // skipped — the inheritance IS the reason the class exists, so it
14
+ // can't be replaced by a plain object.
15
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-static-only-class.md
16
+ package linthost
17
+
18
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
19
+
20
+ type unicornNoStaticOnlyClass struct{}
21
+
22
+ func (unicornNoStaticOnlyClass) Name() string { return "unicorn/no-static-only-class" }
23
+ func (unicornNoStaticOnlyClass) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindClassDeclaration, shimast.KindClassExpression}
25
+ }
26
+ func (unicornNoStaticOnlyClass) Check(ctx *Context, node *shimast.Node) {
27
+ if classHasHeritage(node) {
28
+ return
29
+ }
30
+ members := classMembers(node)
31
+ if len(members) == 0 {
32
+ // Empty classes are out of scope — separate rule territory.
33
+ return
34
+ }
35
+ for _, member := range members {
36
+ if member == nil {
37
+ return
38
+ }
39
+ switch member.Kind {
40
+ case shimast.KindMethodDeclaration,
41
+ shimast.KindPropertyDeclaration,
42
+ shimast.KindGetAccessor,
43
+ shimast.KindSetAccessor:
44
+ if !hasModifier(member, shimast.KindStaticKeyword) {
45
+ return
46
+ }
47
+ default:
48
+ return
49
+ }
50
+ }
51
+ ctx.Report(node, "A class with only static members can be replaced by a plain object or module namespace.")
52
+ }
53
+
54
+ func init() {
55
+ Register(unicornNoStaticOnlyClass{})
56
+ }
@@ -0,0 +1,74 @@
1
+ // unicorn/no-thenable: an object that exposes a callable `then` property
2
+ // becomes accidentally thenable — the runtime's `Promise.resolve(value)`
3
+ // pipeline treats every such value as a promise, so awaiting it invokes
4
+ // the user's `then` instead of resolving to the object itself. This is a
5
+ // common source of surprises in plain data objects and class shapes that
6
+ // were never intended as promises.
7
+ //
8
+ // AST-only: dispatch on every property-defining node form (data
9
+ // property, method, shorthand property, getter, setter) and fire when
10
+ // the name node is an Identifier `then` or a StringLiteral `"then"`.
11
+ // `moduleExportNameText` already returns the right textual value for
12
+ // both shapes; computed names and other syntactic forms are skipped.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-thenable.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornNoThenable struct{}
19
+
20
+ func (unicornNoThenable) Name() string { return "unicorn/no-thenable" }
21
+ func (unicornNoThenable) Visits() []shimast.Kind {
22
+ return []shimast.Kind{
23
+ shimast.KindPropertyAssignment,
24
+ shimast.KindMethodDeclaration,
25
+ shimast.KindShorthandPropertyAssignment,
26
+ shimast.KindGetAccessor,
27
+ shimast.KindSetAccessor,
28
+ }
29
+ }
30
+ func (unicornNoThenable) Check(ctx *Context, node *shimast.Node) {
31
+ var name *shimast.Node
32
+ switch node.Kind {
33
+ case shimast.KindPropertyAssignment:
34
+ if a := node.AsPropertyAssignment(); a != nil {
35
+ name = a.Name()
36
+ }
37
+ case shimast.KindMethodDeclaration:
38
+ if m := node.AsMethodDeclaration(); m != nil {
39
+ name = m.Name()
40
+ }
41
+ case shimast.KindShorthandPropertyAssignment:
42
+ if s := node.AsShorthandPropertyAssignment(); s != nil {
43
+ name = s.Name()
44
+ }
45
+ case shimast.KindGetAccessor:
46
+ if g := node.AsGetAccessorDeclaration(); g != nil {
47
+ name = g.Name()
48
+ }
49
+ case shimast.KindSetAccessor:
50
+ if s := node.AsSetAccessorDeclaration(); s != nil {
51
+ name = s.Name()
52
+ }
53
+ }
54
+ if name == nil {
55
+ return
56
+ }
57
+ switch name.Kind {
58
+ case shimast.KindIdentifier:
59
+ if identifierText(name) != "then" {
60
+ return
61
+ }
62
+ case shimast.KindStringLiteral:
63
+ if stringLiteralText(name) != "then" {
64
+ return
65
+ }
66
+ default:
67
+ return
68
+ }
69
+ ctx.Report(node, "Don't define a property named `then` — it makes the object accidentally thenable.")
70
+ }
71
+
72
+ func init() {
73
+ Register(unicornNoThenable{})
74
+ }