@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,48 @@
1
+ // unicorn/prefer-logical-operator-over-ternary: `x ? x : y` evaluates `x`
2
+ // twice and adds a branch only to reproduce what `x || y` (for truthy
3
+ // preservation) or `x ?? y` (for nullish-only) already say in one
4
+ // shorter, allocation-free token. The ternary spelling tends to crop up
5
+ // when authors forget the short-circuit operators exist; the rule nudges
6
+ // them back to the canonical form.
7
+ //
8
+ // AST-only: visit `KindConditionalExpression`. Fire when the textual form
9
+ // of `cond` (after `stripParens`) equals the textual form of `whenTrue`.
10
+ // That covers the `cond ? cond : alt` shape. The negated `!x ? y : x`
11
+ // case is left to a future iteration to keep the rule focused on a
12
+ // single shape.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-logical-operator-over-ternary.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornPreferLogicalOperatorOverTernary struct{}
19
+
20
+ func (unicornPreferLogicalOperatorOverTernary) Name() string {
21
+ return "unicorn/prefer-logical-operator-over-ternary"
22
+ }
23
+ func (unicornPreferLogicalOperatorOverTernary) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindConditionalExpression}
25
+ }
26
+ func (unicornPreferLogicalOperatorOverTernary) Check(ctx *Context, node *shimast.Node) {
27
+ cond := node.AsConditionalExpression()
28
+ if cond == nil {
29
+ return
30
+ }
31
+ condExpr := stripParens(cond.Condition)
32
+ whenTrue := stripParens(cond.WhenTrue)
33
+ if condExpr == nil || whenTrue == nil {
34
+ return
35
+ }
36
+ condText := nodeText(ctx.File, condExpr)
37
+ if condText == "" {
38
+ return
39
+ }
40
+ if condText != nodeText(ctx.File, whenTrue) {
41
+ return
42
+ }
43
+ ctx.Report(node, "Prefer `a || b` / `a ?? b` over the equivalent ternary `a ? a : b`.")
44
+ }
45
+
46
+ func init() {
47
+ Register(unicornPreferLogicalOperatorOverTernary{})
48
+ }
@@ -0,0 +1,60 @@
1
+ // unicorn/prefer-math-min-max: `a < b ? a : b` is the long-hand spelling
2
+ // of `Math.min(a, b)`; the conditional adds a branch and reads each
3
+ // operand twice to do what the built-in does in one call. The built-ins
4
+ // also handle the NaN edge case the conditional silently mis-routes,
5
+ // so the rule pushes authors to switch.
6
+ //
7
+ // AST-only: visit `KindConditionalExpression`. Fire when the condition
8
+ // (after `stripParens`) is a `KindBinaryExpression` whose operator is one
9
+ // of `<`, `<=`, `>`, `>=` AND its two operands read textually as the
10
+ // two branches of the conditional (either order — `a < b ? a : b` and
11
+ // `a < b ? b : a` both qualify, since the rule covers both `Math.min`
12
+ // and `Math.max`).
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-math-min-max.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornPreferMathMinMax struct{}
19
+
20
+ func (unicornPreferMathMinMax) Name() string { return "unicorn/prefer-math-min-max" }
21
+ func (unicornPreferMathMinMax) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindConditionalExpression}
23
+ }
24
+ func (unicornPreferMathMinMax) Check(ctx *Context, node *shimast.Node) {
25
+ cond := node.AsConditionalExpression()
26
+ if cond == nil {
27
+ return
28
+ }
29
+ condExpr := stripParens(cond.Condition)
30
+ if condExpr == nil || condExpr.Kind != shimast.KindBinaryExpression {
31
+ return
32
+ }
33
+ bin := condExpr.AsBinaryExpression()
34
+ if bin == nil || bin.OperatorToken == nil {
35
+ return
36
+ }
37
+ switch bin.OperatorToken.Kind {
38
+ case shimast.KindLessThanToken,
39
+ shimast.KindLessThanEqualsToken,
40
+ shimast.KindGreaterThanToken,
41
+ shimast.KindGreaterThanEqualsToken:
42
+ default:
43
+ return
44
+ }
45
+ leftText := nodeText(ctx.File, stripParens(bin.Left))
46
+ rightText := nodeText(ctx.File, stripParens(bin.Right))
47
+ if leftText == "" || rightText == "" {
48
+ return
49
+ }
50
+ trueText := nodeText(ctx.File, stripParens(cond.WhenTrue))
51
+ falseText := nodeText(ctx.File, stripParens(cond.WhenFalse))
52
+ if (leftText == trueText && rightText == falseText) ||
53
+ (leftText == falseText && rightText == trueText) {
54
+ ctx.Report(node, "Prefer `Math.min` / `Math.max` over a conditional comparing the same two values.")
55
+ }
56
+ }
57
+
58
+ func init() {
59
+ Register(unicornPreferMathMinMax{})
60
+ }
@@ -0,0 +1,62 @@
1
+ // unicorn/prefer-math-trunc: `~~x` and `x | 0` are folk idioms for
2
+ // integer truncation that ride on the implicit Int32 coercion of the
3
+ // bitwise operators. They lose values outside the int32 range and
4
+ // confuse readers expecting a real math function. `Math.trunc(x)`
5
+ // expresses the intent directly and handles the full numeric range.
6
+ //
7
+ // AST-only: visit `KindBinaryExpression` and `KindPrefixUnaryExpression`.
8
+ // Fire on:
9
+ //
10
+ // - `x | 0` — a BinaryExpression with `|` whose right operand is the
11
+ // numeric literal `0`.
12
+ // - `~~x` — a PrefixUnaryExpression with `~` whose operand is itself
13
+ // a PrefixUnaryExpression with `~` (the parser nests them as
14
+ // `~(~x)`).
15
+ //
16
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-math-trunc.md
17
+ package linthost
18
+
19
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
20
+
21
+ type unicornPreferMathTrunc struct{}
22
+
23
+ func (unicornPreferMathTrunc) Name() string { return "unicorn/prefer-math-trunc" }
24
+ func (unicornPreferMathTrunc) Visits() []shimast.Kind {
25
+ return []shimast.Kind{shimast.KindBinaryExpression, shimast.KindPrefixUnaryExpression}
26
+ }
27
+ func (unicornPreferMathTrunc) Check(ctx *Context, node *shimast.Node) {
28
+ switch node.Kind {
29
+ case shimast.KindBinaryExpression:
30
+ expr := node.AsBinaryExpression()
31
+ if expr == nil || expr.OperatorToken == nil ||
32
+ expr.OperatorToken.Kind != shimast.KindBarToken {
33
+ return
34
+ }
35
+ right := stripParens(expr.Right)
36
+ if right == nil || right.Kind != shimast.KindNumericLiteral {
37
+ return
38
+ }
39
+ if numericLiteralText(right) != "0" {
40
+ return
41
+ }
42
+ ctx.Report(node, "Prefer `Math.trunc(x)` over `~~x` / `x | 0` for integer truncation.")
43
+ case shimast.KindPrefixUnaryExpression:
44
+ outer := node.AsPrefixUnaryExpression()
45
+ if outer == nil || outer.Operator != shimast.KindTildeToken || outer.Operand == nil {
46
+ return
47
+ }
48
+ operand := stripParens(outer.Operand)
49
+ if operand == nil || operand.Kind != shimast.KindPrefixUnaryExpression {
50
+ return
51
+ }
52
+ inner := operand.AsPrefixUnaryExpression()
53
+ if inner == nil || inner.Operator != shimast.KindTildeToken {
54
+ return
55
+ }
56
+ ctx.Report(node, "Prefer `Math.trunc(x)` over `~~x` / `x | 0` for integer truncation.")
57
+ }
58
+ }
59
+
60
+ func init() {
61
+ Register(unicornPreferMathTrunc{})
62
+ }
@@ -0,0 +1,47 @@
1
+ // unicorn/prefer-modern-dom-apis: `Node#insertBefore`, `Node#replaceChild`,
2
+ // and `Element#insertAdjacentText` are the legacy mutation methods that
3
+ // still require the caller to thread a parent node and pass arguments in
4
+ // a specific order. The `before` / `after` / `replaceWith` family on
5
+ // `ChildNode` is the supported modern shape and accepts a variadic list
6
+ // of nodes and strings without needing the parent reference.
7
+ //
8
+ // AST-only: visit each `CallExpression`, match a property-access callee
9
+ // whose method identifier is one of the legacy mutation names, and fire
10
+ // on the call. Receivers and argument shapes are not validated — the
11
+ // method name alone is the signal the rule wants to discourage.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-modern-dom-apis.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ var unicornPreferModernDomApisMethods = map[string]struct{}{
18
+ "insertBefore": {},
19
+ "replaceChild": {},
20
+ "insertAdjacentText": {},
21
+ }
22
+
23
+ type unicornPreferModernDomApis struct{}
24
+
25
+ func (unicornPreferModernDomApis) Name() string { return "unicorn/prefer-modern-dom-apis" }
26
+ func (unicornPreferModernDomApis) Visits() []shimast.Kind {
27
+ return []shimast.Kind{shimast.KindCallExpression}
28
+ }
29
+ func (unicornPreferModernDomApis) Check(ctx *Context, node *shimast.Node) {
30
+ call := node.AsCallExpression()
31
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
32
+ return
33
+ }
34
+ access := call.Expression.AsPropertyAccessExpression()
35
+ if access == nil {
36
+ return
37
+ }
38
+ method := identifierText(access.Name())
39
+ if _, ok := unicornPreferModernDomApisMethods[method]; !ok {
40
+ return
41
+ }
42
+ ctx.Report(node, "Prefer `before` / `after` / `replaceWith` over `"+method+"`.")
43
+ }
44
+
45
+ func init() {
46
+ Register(unicornPreferModernDomApis{})
47
+ }
@@ -0,0 +1,70 @@
1
+ // unicorn/prefer-modern-math-apis: `Math.log(x) * Math.LOG10E` is the
2
+ // classical pre-ES2015 spelling of `Math.log10(x)`. The arithmetic
3
+ // identity is exact in the abstract but loses precision once it goes
4
+ // through IEEE-754 multiplication, and the modern call also reads as
5
+ // the operation it actually performs. The rule flags the multiplication
6
+ // form for `LOG10E` and `LOG2E`.
7
+ //
8
+ // AST-only: visit `KindBinaryExpression`. Fire when the operator is `*`
9
+ // and one operand is `Math.log(...)` while the other is
10
+ // `PropertyAccess(Identifier("Math"), LOG10E)` or `LOG2E`. The
11
+ // commutative `*` operator means `Math.log(x) * Math.LOG10E` and
12
+ // `Math.LOG10E * Math.log(x)` both match.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-modern-math-apis.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornPreferModernMathApis struct{}
19
+
20
+ func (unicornPreferModernMathApis) Name() string { return "unicorn/prefer-modern-math-apis" }
21
+ func (unicornPreferModernMathApis) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindBinaryExpression}
23
+ }
24
+ func (unicornPreferModernMathApis) Check(ctx *Context, node *shimast.Node) {
25
+ bin := node.AsBinaryExpression()
26
+ if bin == nil || bin.OperatorToken == nil ||
27
+ bin.OperatorToken.Kind != shimast.KindAsteriskToken {
28
+ return
29
+ }
30
+ left := stripParens(bin.Left)
31
+ right := stripParens(bin.Right)
32
+ if unicornPreferModernMathApisMatchesPair(left, right) ||
33
+ unicornPreferModernMathApisMatchesPair(right, left) {
34
+ ctx.Report(node, "Prefer `Math.log10(x)` / `Math.log2(x)` over `Math.log(x) * Math.LOG10E` / `Math.log(x) * Math.LOG2E`.")
35
+ }
36
+ }
37
+
38
+ // unicornPreferModernMathApisMatchesPair reports whether `callSide` is
39
+ // `Math.log(...)` and `constSide` is `Math.LOG10E` or `Math.LOG2E`.
40
+ func unicornPreferModernMathApisMatchesPair(callSide, constSide *shimast.Node) bool {
41
+ if callSide == nil || constSide == nil {
42
+ return false
43
+ }
44
+ if callSide.Kind != shimast.KindCallExpression {
45
+ return false
46
+ }
47
+ call := callSide.AsCallExpression()
48
+ if call == nil || call.Expression == nil {
49
+ return false
50
+ }
51
+ if !isMatchingPropertyAccess(call.Expression, "Math", "log") {
52
+ return false
53
+ }
54
+ if constSide.Kind != shimast.KindPropertyAccessExpression {
55
+ return false
56
+ }
57
+ prop := constSide.AsPropertyAccessExpression()
58
+ if prop == nil || identifierText(prop.Expression) != "Math" {
59
+ return false
60
+ }
61
+ switch identifierText(prop.Name()) {
62
+ case "LOG10E", "LOG2E":
63
+ return true
64
+ }
65
+ return false
66
+ }
67
+
68
+ func init() {
69
+ Register(unicornPreferModernMathApis{})
70
+ }
@@ -0,0 +1,50 @@
1
+ // unicorn/prefer-module: ES modules are the spec-blessed module
2
+ // system and provide cross-runtime semantics that CommonJS does not.
3
+ // `require(...)` is dynamic, synchronous, and tied to Node's module
4
+ // resolver; `__dirname` and `__filename` only exist inside CJS modules
5
+ // and silently turn into `undefined` under ESM. The rule flags the
6
+ // CommonJS-only constructs so the codebase converges on ESM-native
7
+ // equivalents (`import` / `import.meta.dirname` / `import.meta.filename`).
8
+ //
9
+ // AST-only: visit `CallExpression` to match bare `require(...)` calls
10
+ // and visit `Identifier` to match value-position reads of
11
+ // `__dirname` / `__filename`. Identifier matches are gated by the
12
+ // shared value-position helper so binding sites, property keys, and
13
+ // type references are filtered out.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-module.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornPreferModule struct{}
20
+
21
+ func (unicornPreferModule) Name() string { return "unicorn/prefer-module" }
22
+ func (unicornPreferModule) Visits() []shimast.Kind {
23
+ return []shimast.Kind{shimast.KindCallExpression, shimast.KindIdentifier}
24
+ }
25
+ func (unicornPreferModule) Check(ctx *Context, node *shimast.Node) {
26
+ switch node.Kind {
27
+ case shimast.KindCallExpression:
28
+ call := node.AsCallExpression()
29
+ if call == nil || call.Expression == nil {
30
+ return
31
+ }
32
+ if identifierText(call.Expression) != "require" {
33
+ return
34
+ }
35
+ ctx.Report(node, "Prefer ES modules over CommonJS — use `import` / `import.meta.dirname` / `import.meta.filename`.")
36
+ case shimast.KindIdentifier:
37
+ name := identifierText(node)
38
+ if name != "__dirname" && name != "__filename" {
39
+ return
40
+ }
41
+ if !isUnicornValuePositionIdentifier(node) {
42
+ return
43
+ }
44
+ ctx.Report(node, "Prefer ES modules over CommonJS — use `import` / `import.meta.dirname` / `import.meta.filename`.")
45
+ }
46
+ }
47
+
48
+ func init() {
49
+ Register(unicornPreferModule{})
50
+ }
@@ -0,0 +1,114 @@
1
+ // unicorn/prefer-native-coercion-functions: an arrow that does nothing
2
+ // but pass its parameter to `String` / `Number` / `Boolean` / `BigInt`
3
+ // / `Symbol` is a wrapper around a function that already has the same
4
+ // signature. Passing the built-in reference directly drops a closure
5
+ // allocation, a stack frame, and a layer of indirection at every call
6
+ // site while reading as the operation it actually performs.
7
+ //
8
+ // AST-only: visit `KindArrowFunction` and `KindFunctionExpression`. Fire
9
+ // when the function takes exactly one bare-identifier parameter AND its
10
+ // body is either an arrow expression body that calls one of the named
11
+ // constructors with the parameter as the sole argument, or a block body
12
+ // with a single `return <Name>(<param>);` statement.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-native-coercion-functions.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornPreferNativeCoercionFunctions struct{}
19
+
20
+ func (unicornPreferNativeCoercionFunctions) Name() string {
21
+ return "unicorn/prefer-native-coercion-functions"
22
+ }
23
+ func (unicornPreferNativeCoercionFunctions) Visits() []shimast.Kind {
24
+ return []shimast.Kind{shimast.KindArrowFunction, shimast.KindFunctionExpression}
25
+ }
26
+ func (unicornPreferNativeCoercionFunctions) Check(ctx *Context, node *shimast.Node) {
27
+ params := node.Parameters()
28
+ if len(params) != 1 {
29
+ return
30
+ }
31
+ paramName := parameterIdentifierName(params[0])
32
+ if paramName == "" {
33
+ return
34
+ }
35
+ var body *shimast.Node
36
+ switch node.Kind {
37
+ case shimast.KindArrowFunction:
38
+ if arrow := node.AsArrowFunction(); arrow != nil {
39
+ body = arrow.Body
40
+ }
41
+ case shimast.KindFunctionExpression:
42
+ if fn := node.AsFunctionExpression(); fn != nil {
43
+ body = fn.Body
44
+ }
45
+ }
46
+ if body == nil {
47
+ return
48
+ }
49
+ call := unicornPreferNativeCoercionBodyCall(body)
50
+ if call == nil {
51
+ return
52
+ }
53
+ if !unicornPreferNativeCoercionIsCoercion(call, paramName) {
54
+ return
55
+ }
56
+ ctx.Report(node, "Use the bare `String` / `Number` / `Boolean` / `BigInt` function reference instead of an arrow wrapper.")
57
+ }
58
+
59
+ // unicornPreferNativeCoercionBodyCall normalizes a function body to the
60
+ // inner `CallExpression`. A concise arrow body returns its expression
61
+ // directly; a block body must contain exactly one `return <expr>;` and
62
+ // the returned expression must itself be a call.
63
+ func unicornPreferNativeCoercionBodyCall(body *shimast.Node) *shimast.Node {
64
+ if body == nil {
65
+ return nil
66
+ }
67
+ if body.Kind != shimast.KindBlock {
68
+ expr := stripParens(body)
69
+ if expr == nil || expr.Kind != shimast.KindCallExpression {
70
+ return nil
71
+ }
72
+ return expr
73
+ }
74
+ block := body.AsBlock()
75
+ if block == nil || block.Statements == nil || len(block.Statements.Nodes) != 1 {
76
+ return nil
77
+ }
78
+ stmt := block.Statements.Nodes[0]
79
+ if stmt == nil || stmt.Kind != shimast.KindReturnStatement {
80
+ return nil
81
+ }
82
+ ret := stmt.AsReturnStatement()
83
+ if ret == nil || ret.Expression == nil {
84
+ return nil
85
+ }
86
+ expr := stripParens(ret.Expression)
87
+ if expr == nil || expr.Kind != shimast.KindCallExpression {
88
+ return nil
89
+ }
90
+ return expr
91
+ }
92
+
93
+ // unicornPreferNativeCoercionIsCoercion reports whether `call` is a
94
+ // `String|Number|Boolean|BigInt|Symbol(<param>)` invocation where the
95
+ // single argument is the parameter identifier.
96
+ func unicornPreferNativeCoercionIsCoercion(call *shimast.Node, paramName string) bool {
97
+ c := call.AsCallExpression()
98
+ if c == nil || c.Expression == nil {
99
+ return false
100
+ }
101
+ switch identifierText(c.Expression) {
102
+ case "String", "Number", "Boolean", "BigInt", "Symbol":
103
+ default:
104
+ return false
105
+ }
106
+ if c.Arguments == nil || len(c.Arguments.Nodes) != 1 {
107
+ return false
108
+ }
109
+ return identifierText(stripParens(c.Arguments.Nodes[0])) == paramName
110
+ }
111
+
112
+ func init() {
113
+ Register(unicornPreferNativeCoercionFunctions{})
114
+ }
@@ -0,0 +1,74 @@
1
+ // unicorn/prefer-negative-index: `arr.slice(arr.length - N)` is the
2
+ // long-hand spelling of `arr.slice(-N)`. The subtraction repeats the
3
+ // receiver, allocates an extra read, and obscures the intent. The same
4
+ // idiom shows up across `slice`, `splice`, `toSpliced`, `at`, and
5
+ // `lastIndexOf`; all five accept a negative index that means the same
6
+ // thing the subtraction expresses, so the rule pushes authors there.
7
+ //
8
+ // AST-only: visit `KindCallExpression`. Fire when the callee is
9
+ // `PropertyAccess(_, name)` for one of those five method names AND the
10
+ // first argument is a `KindBinaryExpression` with operator `-`, LHS a
11
+ // `PropertyAccess(_, length)`, and RHS a positive numeric literal.
12
+ // Reports on the offending argument so the diagnostic anchors to the
13
+ // expression the author would rewrite.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-negative-index.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornPreferNegativeIndex struct{}
20
+
21
+ func (unicornPreferNegativeIndex) Name() string { return "unicorn/prefer-negative-index" }
22
+ func (unicornPreferNegativeIndex) Visits() []shimast.Kind {
23
+ return []shimast.Kind{shimast.KindCallExpression}
24
+ }
25
+ func (unicornPreferNegativeIndex) Check(ctx *Context, node *shimast.Node) {
26
+ call := node.AsCallExpression()
27
+ if call == nil || call.Expression == nil {
28
+ return
29
+ }
30
+ if call.Expression.Kind != shimast.KindPropertyAccessExpression {
31
+ return
32
+ }
33
+ access := call.Expression.AsPropertyAccessExpression()
34
+ if access == nil {
35
+ return
36
+ }
37
+ switch identifierText(access.Name()) {
38
+ case "slice", "splice", "toSpliced", "at", "lastIndexOf":
39
+ default:
40
+ return
41
+ }
42
+ if call.Arguments == nil || len(call.Arguments.Nodes) == 0 {
43
+ return
44
+ }
45
+ first := stripParens(call.Arguments.Nodes[0])
46
+ if first == nil || first.Kind != shimast.KindBinaryExpression {
47
+ return
48
+ }
49
+ bin := first.AsBinaryExpression()
50
+ if bin == nil || bin.OperatorToken == nil ||
51
+ bin.OperatorToken.Kind != shimast.KindMinusToken {
52
+ return
53
+ }
54
+ left := stripParens(bin.Left)
55
+ if left == nil || left.Kind != shimast.KindPropertyAccessExpression {
56
+ return
57
+ }
58
+ prop := left.AsPropertyAccessExpression()
59
+ if prop == nil || identifierText(prop.Name()) != "length" {
60
+ return
61
+ }
62
+ right := stripParens(bin.Right)
63
+ if right == nil || right.Kind != shimast.KindNumericLiteral {
64
+ return
65
+ }
66
+ if !unicornPreferAtIsPositiveInteger(numericLiteralText(right)) {
67
+ return
68
+ }
69
+ ctx.Report(first, "Use a negative index (`-N`) instead of `arr.length - N`.")
70
+ }
71
+
72
+ func init() {
73
+ Register(unicornPreferNegativeIndex{})
74
+ }
@@ -0,0 +1,122 @@
1
+ // unicorn/prefer-node-protocol: the bare Node built-in specifier
2
+ // (`import "fs"` / `require("fs")`) is ambiguous — a userland package
3
+ // named `fs` on the module path resolves first, silently hijacking
4
+ // what readers assume is the Node built-in. The `node:` prefix removes
5
+ // the ambiguity and is supported by every modern Node release.
6
+ //
7
+ // AST-only: visit `ImportDeclaration` for the static-import case and
8
+ // `CallExpression` for the `require(...)` case. Both reduce to a
9
+ // single string-literal specifier compared against the allowlist of
10
+ // Node built-in module names; matching specifiers (without the
11
+ // `node:` prefix) fire on the literal node itself so the diagnostic
12
+ // underlines the specifier text the reader needs to change.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-node-protocol.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ // unicornPreferNodeProtocolBuiltins enumerates the bare Node built-in
19
+ // module specifiers that must be rewritten to use the `node:` prefix.
20
+ var unicornPreferNodeProtocolBuiltins = map[string]struct{}{
21
+ "assert": {},
22
+ "assert/strict": {},
23
+ "async_hooks": {},
24
+ "buffer": {},
25
+ "child_process": {},
26
+ "cluster": {},
27
+ "console": {},
28
+ "constants": {},
29
+ "crypto": {},
30
+ "dgram": {},
31
+ "diagnostics_channel": {},
32
+ "dns": {},
33
+ "dns/promises": {},
34
+ "domain": {},
35
+ "events": {},
36
+ "fs": {},
37
+ "fs/promises": {},
38
+ "http": {},
39
+ "http2": {},
40
+ "https": {},
41
+ "inspector": {},
42
+ "module": {},
43
+ "net": {},
44
+ "os": {},
45
+ "path": {},
46
+ "path/posix": {},
47
+ "path/win32": {},
48
+ "perf_hooks": {},
49
+ "process": {},
50
+ "punycode": {},
51
+ "querystring": {},
52
+ "readline": {},
53
+ "readline/promises": {},
54
+ "repl": {},
55
+ "stream": {},
56
+ "stream/consumers": {},
57
+ "stream/promises": {},
58
+ "stream/web": {},
59
+ "string_decoder": {},
60
+ "sys": {},
61
+ "timers": {},
62
+ "timers/promises": {},
63
+ "tls": {},
64
+ "trace_events": {},
65
+ "tty": {},
66
+ "url": {},
67
+ "util": {},
68
+ "util/types": {},
69
+ "v8": {},
70
+ "vm": {},
71
+ "wasi": {},
72
+ "worker_threads": {},
73
+ "zlib": {},
74
+ }
75
+
76
+ type unicornPreferNodeProtocol struct{}
77
+
78
+ func (unicornPreferNodeProtocol) Name() string { return "unicorn/prefer-node-protocol" }
79
+ func (unicornPreferNodeProtocol) Visits() []shimast.Kind {
80
+ return []shimast.Kind{shimast.KindImportDeclaration, shimast.KindCallExpression}
81
+ }
82
+ func (unicornPreferNodeProtocol) Check(ctx *Context, node *shimast.Node) {
83
+ switch node.Kind {
84
+ case shimast.KindImportDeclaration:
85
+ imp := node.AsImportDeclaration()
86
+ if imp == nil || imp.ModuleSpecifier == nil {
87
+ return
88
+ }
89
+ if imp.ModuleSpecifier.Kind != shimast.KindStringLiteral {
90
+ return
91
+ }
92
+ specifier := stringLiteralText(imp.ModuleSpecifier)
93
+ if _, ok := unicornPreferNodeProtocolBuiltins[specifier]; !ok {
94
+ return
95
+ }
96
+ ctx.Report(imp.ModuleSpecifier, "Prefer `node:` protocol when importing Node built-ins.")
97
+ case shimast.KindCallExpression:
98
+ call := node.AsCallExpression()
99
+ if call == nil || call.Expression == nil {
100
+ return
101
+ }
102
+ if identifierText(call.Expression) != "require" {
103
+ return
104
+ }
105
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
106
+ return
107
+ }
108
+ arg := call.Arguments.Nodes[0]
109
+ if arg == nil || arg.Kind != shimast.KindStringLiteral {
110
+ return
111
+ }
112
+ specifier := stringLiteralText(arg)
113
+ if _, ok := unicornPreferNodeProtocolBuiltins[specifier]; !ok {
114
+ return
115
+ }
116
+ ctx.Report(arg, "Prefer `node:` protocol when importing Node built-ins.")
117
+ }
118
+ }
119
+
120
+ func init() {
121
+ Register(unicornPreferNodeProtocol{})
122
+ }