@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,55 @@
1
+ // unicorn/require-module-specifiers: an `import "x"` with no bindings
2
+ // or an `export {} from "x"` declares the module dependency without
3
+ // pulling anything from it; both shapes are almost always either dead
4
+ // imports left over from a refactor or accidental side-effect imports
5
+ // that the author meant to bind. The rule asks for an explicit specifier
6
+ // list so the dependency makes its purpose visible in the source.
7
+ //
8
+ // AST-only: visit every `ImportDeclaration` and `ExportDeclaration`.
9
+ // Import side fires when the declaration has no `ImportClause` at all
10
+ // (the side-effect form). Export side fires when the declaration has an
11
+ // empty NamedExports `{}` (with or without a `from`).
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-module-specifiers.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornRequireModuleSpecifiers struct{}
18
+
19
+ func (unicornRequireModuleSpecifiers) Name() string {
20
+ return "unicorn/require-module-specifiers"
21
+ }
22
+ func (unicornRequireModuleSpecifiers) Visits() []shimast.Kind {
23
+ return []shimast.Kind{shimast.KindImportDeclaration, shimast.KindExportDeclaration}
24
+ }
25
+ func (unicornRequireModuleSpecifiers) Check(ctx *Context, node *shimast.Node) {
26
+ switch node.Kind {
27
+ case shimast.KindImportDeclaration:
28
+ decl := node.AsImportDeclaration()
29
+ if decl == nil {
30
+ return
31
+ }
32
+ // `import "x"` parses with a nil ImportClause; any binding shape
33
+ // (`import x`, `import {a}`, `import * as ns`) installs a clause.
34
+ if decl.ImportClause == nil {
35
+ ctx.Report(node, "Empty import/export specifier list is not allowed.")
36
+ }
37
+ case shimast.KindExportDeclaration:
38
+ decl := node.AsExportDeclaration()
39
+ if decl == nil || decl.ExportClause == nil {
40
+ return
41
+ }
42
+ if decl.ExportClause.Kind != shimast.KindNamedExports {
43
+ return
44
+ }
45
+ named := decl.ExportClause.AsNamedExports()
46
+ if named == nil || named.Elements == nil || len(named.Elements.Nodes) > 0 {
47
+ return
48
+ }
49
+ ctx.Report(node, "Empty import/export specifier list is not allowed.")
50
+ }
51
+ }
52
+
53
+ func init() {
54
+ Register(unicornRequireModuleSpecifiers{})
55
+ }
@@ -0,0 +1,43 @@
1
+ // unicorn/require-number-to-fixed-digits-argument: `Number#toFixed()`
2
+ // with no argument is equivalent to `.toFixed(0)`, which rounds away
3
+ // every fractional digit. Authors almost always mean a non-zero digit
4
+ // count, and the no-arg form is one of the more common silent
5
+ // truncation bugs. The rule asks every call site to spell out the digit
6
+ // count.
7
+ //
8
+ // AST-only: visit each `CallExpression`, accept only the property-access
9
+ // `x.toFixed` shape, and report when the call carries zero arguments.
10
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-number-to-fixed-digits-argument.md
11
+ package linthost
12
+
13
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
14
+
15
+ type unicornRequireNumberToFixedDigitsArgument struct{}
16
+
17
+ func (unicornRequireNumberToFixedDigitsArgument) Name() string {
18
+ return "unicorn/require-number-to-fixed-digits-argument"
19
+ }
20
+ func (unicornRequireNumberToFixedDigitsArgument) Visits() []shimast.Kind {
21
+ return []shimast.Kind{shimast.KindCallExpression}
22
+ }
23
+ func (unicornRequireNumberToFixedDigitsArgument) 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.Name()) != "toFixed" {
33
+ return
34
+ }
35
+ if call.Arguments != nil && len(call.Arguments.Nodes) > 0 {
36
+ return
37
+ }
38
+ ctx.Report(node, "Pass an explicit digits argument to `Number#toFixed()`.")
39
+ }
40
+
41
+ func init() {
42
+ Register(unicornRequireNumberToFixedDigitsArgument{})
43
+ }
@@ -0,0 +1,44 @@
1
+ // unicorn/require-post-message-target-origin: `Window#postMessage` and
2
+ // `Worker#postMessage` take a `targetOrigin` (or `transfer`) argument
3
+ // that scopes which document/worker may receive the message. Omitting
4
+ // it defaults to the receiver's own origin, which is a quiet security
5
+ // footgun — cross-origin frames silently lose the message. The rule
6
+ // asks every call site to pass an explicit second argument.
7
+ //
8
+ // AST-only: visit each `CallExpression`, accept only the property-access
9
+ // `x.postMessage` shape, and report when the call carries exactly one
10
+ // argument (the message payload, with no targetOrigin to follow).
11
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-post-message-target-origin.md
12
+ package linthost
13
+
14
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
15
+
16
+ type unicornRequirePostMessageTargetOrigin struct{}
17
+
18
+ func (unicornRequirePostMessageTargetOrigin) Name() string {
19
+ return "unicorn/require-post-message-target-origin"
20
+ }
21
+ func (unicornRequirePostMessageTargetOrigin) Visits() []shimast.Kind {
22
+ return []shimast.Kind{shimast.KindCallExpression}
23
+ }
24
+ func (unicornRequirePostMessageTargetOrigin) Check(ctx *Context, node *shimast.Node) {
25
+ call := node.AsCallExpression()
26
+ if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
27
+ return
28
+ }
29
+ access := call.Expression.AsPropertyAccessExpression()
30
+ if access == nil {
31
+ return
32
+ }
33
+ if identifierText(access.Name()) != "postMessage" {
34
+ return
35
+ }
36
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
37
+ return
38
+ }
39
+ ctx.Report(node, "Pass an explicit `targetOrigin` argument to `postMessage`.")
40
+ }
41
+
42
+ func init() {
43
+ Register(unicornRequirePostMessageTargetOrigin{})
44
+ }
@@ -0,0 +1,27 @@
1
+ // unicorn/string-content: rewrites configured substrings inside string
2
+ // literals (e.g. straight quotes -> curly quotes, `...` -> `…`). The
3
+ // rule has NO defaults; behavior depends entirely on the user-supplied
4
+ // `patterns: { match: replacement }` configuration. Without that
5
+ // per-pattern configuration plumbing in the host's rule-options
6
+ // pipeline, the rule has nothing to enforce.
7
+ //
8
+ // Registered as a no-op stub to keep
9
+ // `TestTypedKeysMatchRegisteredRules` aligned with the typed
10
+ // `ITtscLintUnicornRules` surface. The matching fixture under
11
+ // `tests/test-lint/src/cases/unicorn-string-content.ts` keeps its
12
+ // `@ttsc-corpus-skip` directive.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/string-content.md
14
+ package linthost
15
+
16
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
17
+
18
+ type unicornStringContent struct{}
19
+
20
+ func (unicornStringContent) Name() string { return "unicorn/string-content" }
21
+ func (unicornStringContent) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindSourceFile} }
22
+ func (unicornStringContent) Check(_ *Context, _ *shimast.Node) {
23
+ }
24
+
25
+ func init() {
26
+ Register(unicornStringContent{})
27
+ }
@@ -0,0 +1,42 @@
1
+ // unicorn/switch-case-braces: `case` and `default` clauses share their
2
+ // parent switch's scope, so an unbraced `case x: let y = …;` leaks `y`
3
+ // into every subsequent case. The default-on "always" mode of this rule
4
+ // requires every clause body to be a single `{ … }` block, which both
5
+ // scopes declarations and visually delimits clause bodies.
6
+ //
7
+ // AST-only: visit each `CaseClause` and `DefaultClause` and report when
8
+ // the clause's statements list is anything other than exactly one
9
+ // `Block`. Empty fall-through clauses (`case "a":` with no statements)
10
+ // also fire — the rule's "always" mode wants the brace pair even when
11
+ // the body is empty.
12
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/switch-case-braces.md
13
+ package linthost
14
+
15
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
16
+
17
+ type unicornSwitchCaseBraces struct{}
18
+
19
+ func (unicornSwitchCaseBraces) Name() string { return "unicorn/switch-case-braces" }
20
+ func (unicornSwitchCaseBraces) Visits() []shimast.Kind {
21
+ return []shimast.Kind{shimast.KindCaseClause, shimast.KindDefaultClause}
22
+ }
23
+ func (unicornSwitchCaseBraces) Check(ctx *Context, node *shimast.Node) {
24
+ clause := node.AsCaseOrDefaultClause()
25
+ if clause == nil || clause.Statements == nil {
26
+ return
27
+ }
28
+ stmts := clause.Statements.Nodes
29
+ if len(stmts) == 0 {
30
+ // Empty fall-through (`case "a":` followed immediately by another
31
+ // clause) is not the "missing braces" shape the rule targets.
32
+ return
33
+ }
34
+ if len(stmts) == 1 && stmts[0] != nil && stmts[0].Kind == shimast.KindBlock {
35
+ return
36
+ }
37
+ ctx.Report(node, "Wrap `case` clause body in a block (`case x: { ... }`).")
38
+ }
39
+
40
+ func init() {
41
+ Register(unicornSwitchCaseBraces{})
42
+ }
@@ -0,0 +1,31 @@
1
+ // unicorn/switch-case-break-position: the upstream rule rejects a
2
+ // `break` / `return` / `throw` that is followed by further statements
3
+ // inside the same `case` / `default` clause, because the trailing
4
+ // statements are dead code.
5
+ //
6
+ // In a well-formed TypeScript program the TypeScript-Go checker already
7
+ // emits an `unreachable code` diagnostic for statements following a
8
+ // terminator, so this AST-only port would either duplicate that
9
+ // diagnostic (when reused as an MVP) or need scope/CFG analysis to
10
+ // reproduce the exact upstream surface. The rule is registered as a
11
+ // no-op until a follow-up exposes the unreachable-statement metadata
12
+ // the checker computes for switch clauses.
13
+ //
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/switch-case-break-position.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornSwitchCaseBreakPosition struct{}
20
+
21
+ func (unicornSwitchCaseBreakPosition) Name() string {
22
+ return "unicorn/switch-case-break-position"
23
+ }
24
+ func (unicornSwitchCaseBreakPosition) Visits() []shimast.Kind { return nil }
25
+ func (unicornSwitchCaseBreakPosition) Check(*Context, *shimast.Node) {
26
+ // Intentionally empty; see file-level comment.
27
+ }
28
+
29
+ func init() {
30
+ Register(unicornSwitchCaseBreakPosition{})
31
+ }
@@ -0,0 +1,28 @@
1
+ // unicorn/template-indent: re-indents the contents of tagged template
2
+ // literals (`outdent`, `dedent`, `stripIndent`, etc.) so the inner text
3
+ // is column-aligned with the surrounding code. The autofix has to
4
+ // detect the common leading-whitespace prefix of every line in the
5
+ // template body, decide what the desired indent level is from the
6
+ // template's own column, then rewrite every interior line — substantial
7
+ // whitespace analysis well beyond a pattern match.
8
+ //
9
+ // Registered as a no-op stub to keep
10
+ // `TestTypedKeysMatchRegisteredRules` aligned with the typed
11
+ // `ITtscLintUnicornRules` surface. The matching fixture under
12
+ // `tests/test-lint/src/cases/unicorn-template-indent.ts` keeps its
13
+ // `@ttsc-corpus-skip` directive.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/template-indent.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ type unicornTemplateIndent struct{}
20
+
21
+ func (unicornTemplateIndent) Name() string { return "unicorn/template-indent" }
22
+ func (unicornTemplateIndent) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindSourceFile} }
23
+ func (unicornTemplateIndent) Check(_ *Context, _ *shimast.Node) {
24
+ }
25
+
26
+ func init() {
27
+ Register(unicornTemplateIndent{})
28
+ }
@@ -0,0 +1,72 @@
1
+ // unicorn/text-encoding-identifier-case: the IANA text-encoding labels
2
+ // `UTF-8`, `utf8`, `ASCII`, etc. all resolve to the same encoding in
3
+ // browsers and Node, but the surrounding ecosystem (HTTP headers,
4
+ // `TextDecoder`, file APIs) varies on which spelling it echoes back.
5
+ // Picking one canonical form per encoding makes string-equality checks
6
+ // against those echoes stable. The rule asks every encoding-shaped
7
+ // literal to use the canonical lowercase, hyphenated form.
8
+ //
9
+ // AST-only: visit `StringLiteral` and `NoSubstitutionTemplateLiteral`
10
+ // nodes. The literal's lowercased text is matched against the well-known
11
+ // encoding identifiers; a mismatch with the canonical form (the same
12
+ // identifier already in canonical case) fires the rule.
13
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/text-encoding-identifier-case.md
14
+ package linthost
15
+
16
+ import (
17
+ "strings"
18
+
19
+ shimast "github.com/microsoft/typescript-go/shim/ast"
20
+ )
21
+
22
+ type unicornTextEncodingIdentifierCase struct{}
23
+
24
+ // unicornCanonicalTextEncodings maps the lowercased label to its canonical
25
+ // spelling. Authors who already wrote the canonical form pass; anything
26
+ // else with the same lowercased label fires.
27
+ var unicornCanonicalTextEncodings = map[string]string{
28
+ "utf-8": "utf-8",
29
+ "utf-16le": "utf-16le",
30
+ "utf-16be": "utf-16be",
31
+ "ascii": "ascii",
32
+ "latin1": "latin1",
33
+ "iso-8859-1": "iso-8859-1",
34
+ "windows-1252": "windows-1252",
35
+ }
36
+
37
+ func (unicornTextEncodingIdentifierCase) Name() string {
38
+ return "unicorn/text-encoding-identifier-case"
39
+ }
40
+ func (unicornTextEncodingIdentifierCase) Visits() []shimast.Kind {
41
+ return []shimast.Kind{shimast.KindStringLiteral, shimast.KindNoSubstitutionTemplateLiteral}
42
+ }
43
+ func (unicornTextEncodingIdentifierCase) Check(ctx *Context, node *shimast.Node) {
44
+ text := stringLiteralText(node)
45
+ if text == "" {
46
+ return
47
+ }
48
+ lower := strings.ToLower(text)
49
+ canonical, ok := unicornCanonicalTextEncodings[lower]
50
+ if !ok {
51
+ // `utf8`/`UTF8` share a canonical form with `utf-8` but lowercase
52
+ // differently — handle the hyphen-stripped aliases explicitly.
53
+ switch lower {
54
+ case "utf8":
55
+ canonical = "utf-8"
56
+ case "utf16le":
57
+ canonical = "utf-16le"
58
+ case "utf16be":
59
+ canonical = "utf-16be"
60
+ default:
61
+ return
62
+ }
63
+ }
64
+ if text == canonical {
65
+ return
66
+ }
67
+ ctx.Report(node, "Use the canonical lowercase form for text-encoding identifiers (e.g. `utf-8`).")
68
+ }
69
+
70
+ func init() {
71
+ Register(unicornTextEncodingIdentifierCase{})
72
+ }
@@ -0,0 +1,61 @@
1
+ // unicorn/throw-new-error: `throw Foo(...)` and `throw new Foo(...)` both
2
+ // produce an Error instance because the built-in Error constructors are
3
+ // callable without `new`, but the call-form is a footgun — readers expect
4
+ // `throw` to be paired with `new`, and some tooling (notably custom Error
5
+ // subclasses) stops working when the call-form is mixed in. The rule
6
+ // requires `throw new` whenever the operand is a direct call to one of the
7
+ // eight built-in Error constructor names.
8
+ //
9
+ // AST-only: visit each `ThrowStatement`, peel parentheses off its operand,
10
+ // and fire when the operand is a `CallExpression` (NOT a `NewExpression`)
11
+ // whose callee is an `Identifier` matching the built-in allowlist. Shadowed
12
+ // bindings and type-aware widening are intentionally out of scope — the
13
+ // rule is a syntactic nudge, not a full Error-tracking pass.
14
+ // https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/throw-new-error.md
15
+ package linthost
16
+
17
+ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
+
19
+ var unicornThrowNewErrorBuiltinNames = map[string]struct{}{
20
+ "Error": {},
21
+ "TypeError": {},
22
+ "RangeError": {},
23
+ "SyntaxError": {},
24
+ "ReferenceError": {},
25
+ "EvalError": {},
26
+ "URIError": {},
27
+ "AggregateError": {},
28
+ }
29
+
30
+ type unicornThrowNewError struct{}
31
+
32
+ func (unicornThrowNewError) Name() string { return "unicorn/throw-new-error" }
33
+ func (unicornThrowNewError) Visits() []shimast.Kind {
34
+ return []shimast.Kind{shimast.KindThrowStatement}
35
+ }
36
+ func (unicornThrowNewError) Check(ctx *Context, node *shimast.Node) {
37
+ throw := node.AsThrowStatement()
38
+ if throw == nil {
39
+ return
40
+ }
41
+ expr := stripParens(throw.Expression)
42
+ if expr == nil || expr.Kind != shimast.KindCallExpression {
43
+ return
44
+ }
45
+ call := expr.AsCallExpression()
46
+ if call == nil {
47
+ return
48
+ }
49
+ name := identifierText(call.Expression)
50
+ if name == "" {
51
+ return
52
+ }
53
+ if _, ok := unicornThrowNewErrorBuiltinNames[name]; !ok {
54
+ return
55
+ }
56
+ ctx.Report(expr, "Use `new` when throwing an error.")
57
+ }
58
+
59
+ func init() {
60
+ Register(unicornThrowNewError{})
61
+ }
@@ -2,7 +2,7 @@ package linthost
2
2
 
3
3
  import shimast "github.com/microsoft/typescript-go/shim/ast"
4
4
 
5
- // no-var: ban `var` declarations. ESLint canonical:
5
+ // noVar: ban `var` declarations. ESLint canonical:
6
6
  // https://eslint.org/docs/latest/rules/no-var
7
7
  type noVar struct{}
8
8
 
@@ -13,6 +13,12 @@ func (noVar) Check(ctx *Context, node *shimast.Node) {
13
13
  if stmt == nil || stmt.DeclarationList == nil {
14
14
  return
15
15
  }
16
+ if ctx.File != nil && ctx.File.IsDeclarationFile {
17
+ return
18
+ }
19
+ if node.ModifierFlags()&shimast.ModifierFlagsAmbient != 0 {
20
+ return
21
+ }
16
22
  if shimast.IsVar(stmt.DeclarationList) {
17
23
  start := keywordStart(ctx.File, stmt.DeclarationList, "var")
18
24
  if start >= 0 {
@@ -28,7 +34,7 @@ func (noVar) Check(ctx *Context, node *shimast.Node) {
28
34
  }
29
35
  }
30
36
 
31
- // prefer-const: flag `let` declarations whose binding is never reassigned.
37
+ // preferConst: flag `let` declarations whose binding is never reassigned.
32
38
  // This follows ESLint's core rule for the common AST-local cases. It is
33
39
  // intentionally conservative: destructuring and declaration-only `let`
34
40
  // variables (those without an initializer and not in a for-of/for-in
@@ -129,7 +135,7 @@ func isSingleDeclarationList(node *shimast.Node) bool {
129
135
  }
130
136
 
131
137
  // isConstEligibleLetDeclaration reports whether a `let` VariableDeclaration
132
- // node is eligible for prefer-const analysis. A declaration is eligible when:
138
+ // node is eligible for preferConst analysis. A declaration is eligible when:
133
139
  // - it has an initializer (the value is set immediately), or
134
140
  // - it is the loop variable of a for-in or for-of statement (e.g. `for (let k of m)`).
135
141
  //
@@ -148,7 +154,7 @@ func isConstEligibleLetDeclaration(node *shimast.Node, decl *shimast.VariableDec
148
154
  (node.Parent.Parent.Kind == shimast.KindForInStatement || node.Parent.Parent.Kind == shimast.KindForOfStatement)
149
155
  }
150
156
 
151
- // no-undef-init: forbid `let x = undefined` and `var x = undefined`.
157
+ // noUndefInit: forbid `let x = undefined` and `var x = undefined`.
152
158
  // ESLint canonical: https://eslint.org/docs/latest/rules/no-undef-init
153
159
  type noUndefInit struct{}
154
160