@ttsc/lint 0.13.0 → 0.14.0-dev.20260528

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/README.md +948 -69
  2. package/lib/defaultFormat.d.ts +9 -6
  3. package/lib/defaultFormat.js +9 -6
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/index.d.ts +46 -0
  6. package/lib/index.js +60 -37
  7. package/lib/index.js.map +1 -1
  8. package/lib/structures/ITtscLintConfig.d.ts +12 -6
  9. package/lib/structures/{ITtscLintFormatConfig.d.ts → ITtscLintFormat.d.ts} +2 -2
  10. package/lib/structures/{TtscLintRuleMap.js → ITtscLintFormat.js} +1 -1
  11. package/lib/structures/ITtscLintFormat.js.map +1 -0
  12. package/lib/structures/TtscLintRuleSetting.d.ts +49 -0
  13. package/lib/structures/{TtscLintRuleOptions.js → TtscLintRuleSetting.js} +1 -1
  14. package/lib/structures/TtscLintRuleSetting.js.map +1 -0
  15. package/lib/structures/index.d.ts +3 -4
  16. package/lib/structures/index.js +3 -4
  17. package/lib/structures/index.js.map +1 -1
  18. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +104 -0
  19. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +14 -0
  20. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
  21. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +79 -0
  22. package/lib/structures/rules/ITtscLintBoundariesRules.js +3 -0
  23. package/lib/structures/rules/ITtscLintBoundariesRules.js.map +1 -0
  24. package/lib/structures/rules/ITtscLintContributorRules.d.ts +17 -0
  25. package/lib/structures/rules/ITtscLintContributorRules.js +3 -0
  26. package/lib/structures/rules/ITtscLintContributorRules.js.map +1 -0
  27. package/lib/structures/rules/ITtscLintCoreRules.d.ts +1257 -0
  28. package/lib/structures/{ITtscLintFormatConfig.js → rules/ITtscLintCoreRules.js} +1 -1
  29. package/lib/structures/rules/ITtscLintCoreRules.js.map +1 -0
  30. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +17 -0
  31. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +10 -0
  32. package/lib/structures/rules/ITtscLintCypressRuleOptions.js.map +1 -0
  33. package/lib/structures/rules/ITtscLintCypressRules.d.ts +129 -0
  34. package/lib/structures/rules/ITtscLintCypressRules.js +3 -0
  35. package/lib/structures/rules/ITtscLintCypressRules.js.map +1 -0
  36. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +157 -0
  37. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +13 -0
  38. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js.map +1 -0
  39. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +167 -0
  40. package/lib/structures/rules/ITtscLintFunctionalRules.js +3 -0
  41. package/lib/structures/rules/ITtscLintFunctionalRules.js.map +1 -0
  42. package/lib/structures/rules/ITtscLintJestRules.d.ts +201 -0
  43. package/lib/structures/rules/ITtscLintJestRules.js +3 -0
  44. package/lib/structures/rules/ITtscLintJestRules.js.map +1 -0
  45. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +140 -0
  46. package/lib/structures/rules/ITtscLintJsdocRules.js +3 -0
  47. package/lib/structures/rules/ITtscLintJsdocRules.js.map +1 -0
  48. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +302 -0
  49. package/lib/structures/rules/ITtscLintJsxA11yRules.js +3 -0
  50. package/lib/structures/rules/ITtscLintJsxA11yRules.js.map +1 -0
  51. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +185 -0
  52. package/lib/structures/rules/ITtscLintNextjsRules.js +3 -0
  53. package/lib/structures/rules/ITtscLintNextjsRules.js.map +1 -0
  54. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +330 -0
  55. package/lib/structures/rules/ITtscLintPlaywrightRules.js +3 -0
  56. package/lib/structures/rules/ITtscLintPlaywrightRules.js.map +1 -0
  57. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +188 -0
  58. package/lib/structures/rules/ITtscLintPromiseRules.js +3 -0
  59. package/lib/structures/rules/ITtscLintPromiseRules.js.map +1 -0
  60. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +18 -0
  61. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js +8 -0
  62. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js.map +1 -0
  63. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +51 -0
  64. package/lib/structures/rules/ITtscLintReactPerfRules.js +3 -0
  65. package/lib/structures/rules/ITtscLintReactPerfRules.js.map +1 -0
  66. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +39 -0
  67. package/lib/structures/rules/ITtscLintReactRuleOptions.js +12 -0
  68. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
  69. package/lib/structures/rules/ITtscLintReactRules.d.ts +289 -0
  70. package/lib/structures/rules/ITtscLintReactRules.js +3 -0
  71. package/lib/structures/rules/ITtscLintReactRules.js.map +1 -0
  72. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +190 -0
  73. package/lib/structures/rules/ITtscLintRegexpRules.js +3 -0
  74. package/lib/structures/rules/ITtscLintRegexpRules.js.map +1 -0
  75. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +66 -0
  76. package/lib/structures/rules/ITtscLintRuleOptionsMap.js +3 -0
  77. package/lib/structures/rules/ITtscLintRuleOptionsMap.js.map +1 -0
  78. package/lib/structures/rules/ITtscLintRules.d.ts +55 -0
  79. package/lib/structures/{TtscLintRule.js → rules/ITtscLintRules.js} +1 -1
  80. package/lib/structures/rules/ITtscLintRules.js.map +1 -0
  81. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +148 -0
  82. package/lib/structures/rules/ITtscLintSecurityRules.js +3 -0
  83. package/lib/structures/rules/ITtscLintSecurityRules.js.map +1 -0
  84. package/lib/structures/rules/ITtscLintSolidRules.d.ts +181 -0
  85. package/lib/structures/rules/ITtscLintSolidRules.js +3 -0
  86. package/lib/structures/rules/ITtscLintSolidRules.js.map +1 -0
  87. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +21 -0
  88. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js +9 -0
  89. package/lib/structures/rules/ITtscLintStorybookRuleOptions.js.map +1 -0
  90. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +174 -0
  91. package/lib/structures/rules/ITtscLintStorybookRules.js +3 -0
  92. package/lib/structures/rules/ITtscLintStorybookRules.js.map +1 -0
  93. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +94 -0
  94. package/lib/structures/rules/ITtscLintTanstackQueryRules.js +3 -0
  95. package/lib/structures/rules/ITtscLintTanstackQueryRules.js.map +1 -0
  96. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +22 -0
  97. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js +10 -0
  98. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js.map +1 -0
  99. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +310 -0
  100. package/lib/structures/rules/ITtscLintTestingLibraryRules.js +3 -0
  101. package/lib/structures/rules/ITtscLintTestingLibraryRules.js.map +1 -0
  102. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +1132 -0
  103. package/lib/structures/rules/ITtscLintTypeScriptRules.js +3 -0
  104. package/lib/structures/rules/ITtscLintTypeScriptRules.js.map +1 -0
  105. package/lib/structures/rules/ITtscLintUnicornRules.d.ts +997 -0
  106. package/lib/structures/rules/ITtscLintUnicornRules.js +3 -0
  107. package/lib/structures/rules/ITtscLintUnicornRules.js.map +1 -0
  108. package/lib/structures/rules/ITtscLintVitestRules.d.ts +141 -0
  109. package/lib/structures/rules/ITtscLintVitestRules.js +3 -0
  110. package/lib/structures/rules/ITtscLintVitestRules.js.map +1 -0
  111. package/lib/structures/rules/index.d.ts +31 -0
  112. package/lib/structures/rules/index.js +48 -0
  113. package/lib/structures/rules/index.js.map +1 -0
  114. package/linthost/ast_helpers.go +30 -5
  115. package/linthost/compile.go +33 -2
  116. package/linthost/config.go +48 -17
  117. package/linthost/config_format.go +9 -9
  118. package/linthost/directives.go +67 -25
  119. package/linthost/dispatch.go +14 -3
  120. package/linthost/engine.go +160 -40
  121. package/linthost/fix.go +2 -2
  122. package/linthost/flags_gen.go +17 -15
  123. package/linthost/host.go +40 -3
  124. package/linthost/lsp.go +747 -0
  125. package/linthost/print_dispatch.go +2 -2
  126. package/linthost/print_nodes_function.go +2 -2
  127. package/linthost/print_nodes_object.go +1 -1
  128. package/linthost/rule_names.go +14 -0
  129. package/linthost/rules_arrays.go +2 -2
  130. package/linthost/rules_boundaries.go +532 -0
  131. package/linthost/rules_camelcase.go +133 -0
  132. package/linthost/rules_complexity.go +94 -0
  133. package/linthost/rules_consistent_return.go +130 -0
  134. package/linthost/rules_console.go +1 -1
  135. package/linthost/rules_core_extra.go +739 -0
  136. package/linthost/rules_curly.go +70 -0
  137. package/linthost/rules_cypress.go +608 -0
  138. package/linthost/rules_debugger.go +2 -2
  139. package/linthost/rules_default_case.go +39 -0
  140. package/linthost/rules_default_case_last.go +46 -0
  141. package/linthost/rules_dupes.go +3 -3
  142. package/linthost/rules_empty.go +3 -3
  143. package/linthost/rules_escape.go +44 -24
  144. package/linthost/rules_eval.go +2 -2
  145. package/linthost/rules_finally.go +2 -2
  146. package/linthost/rules_format_jsdoc.go +1 -1
  147. package/linthost/rules_format_print_width.go +9 -9
  148. package/linthost/rules_format_quotes.go +1 -1
  149. package/linthost/rules_format_semi.go +1 -1
  150. package/linthost/rules_format_sort_imports.go +1 -1
  151. package/linthost/rules_format_trailing_comma.go +1 -1
  152. package/linthost/rules_functional.go +967 -0
  153. package/linthost/rules_gap.go +24 -45
  154. package/linthost/rules_grouped_accessor_pairs.go +87 -0
  155. package/linthost/rules_guard_for_in.go +198 -0
  156. package/linthost/rules_id_length.go +77 -0
  157. package/linthost/rules_imports.go +70 -2
  158. package/linthost/rules_init_declarations.go +53 -0
  159. package/linthost/rules_jest.go +618 -0
  160. package/linthost/rules_jsdoc.go +502 -0
  161. package/linthost/rules_jsx_a11y.go +1264 -0
  162. package/linthost/rules_logic.go +12 -12
  163. package/linthost/rules_loops.go +1 -1
  164. package/linthost/rules_max_classes_per_file.go +58 -0
  165. package/linthost/rules_max_depth.go +83 -0
  166. package/linthost/rules_max_lines.go +101 -0
  167. package/linthost/rules_max_lines_per_function.go +57 -0
  168. package/linthost/rules_max_nested_callbacks.go +61 -0
  169. package/linthost/rules_max_params.go +49 -0
  170. package/linthost/rules_max_statements.go +59 -0
  171. package/linthost/rules_misc.go +1 -1
  172. package/linthost/rules_nextjs.go +697 -0
  173. package/linthost/rules_no_else_return.go +75 -0
  174. package/linthost/rules_no_empty_named_blocks.go +91 -0
  175. package/linthost/rules_no_extend_native.go +51 -0
  176. package/linthost/rules_no_import_assign.go +140 -0
  177. package/linthost/rules_no_invalid_this.go +52 -0
  178. package/linthost/rules_no_loop_func.go +85 -0
  179. package/linthost/rules_no_magic_numbers.go +123 -0
  180. package/linthost/rules_no_mixed_operators.go +80 -0
  181. package/linthost/rules_no_param_reassign.go +98 -0
  182. package/linthost/rules_no_redeclare.go +270 -0
  183. package/linthost/rules_no_restricted_imports.go +105 -0
  184. package/linthost/rules_no_restricted_syntax.go +49 -0
  185. package/linthost/rules_no_shadow.go +147 -0
  186. package/linthost/rules_no_unreachable.go +77 -0
  187. package/linthost/rules_no_useless_assignment.go +120 -0
  188. package/linthost/rules_no_useless_constructor.go +245 -0
  189. package/linthost/rules_no_useless_return.go +51 -0
  190. package/linthost/rules_params.go +1 -1
  191. package/linthost/rules_playwright.go +788 -0
  192. package/linthost/rules_prefer_arrow_callback.go +124 -0
  193. package/linthost/rules_prefer_destructuring.go +98 -0
  194. package/linthost/rules_prefer_named_capture_group.go +129 -0
  195. package/linthost/rules_prefer_rest_params.go +94 -0
  196. package/linthost/rules_problems.go +41 -30
  197. package/linthost/rules_promise.go +1128 -73
  198. package/linthost/rules_protos.go +2 -2
  199. package/linthost/rules_react.go +773 -0
  200. package/linthost/rules_react_extras.go +227 -0
  201. package/linthost/rules_react_hooks.go +848 -0
  202. package/linthost/rules_react_perf.go +293 -0
  203. package/linthost/rules_react_refresh.go +583 -0
  204. package/linthost/rules_regexp.go +410 -0
  205. package/linthost/rules_security.go +830 -0
  206. package/linthost/rules_self.go +2 -2
  207. package/linthost/rules_solid.go +1073 -0
  208. package/linthost/rules_sort_imports.go +69 -0
  209. package/linthost/rules_sort_keys.go +134 -0
  210. package/linthost/rules_storybook.go +1176 -0
  211. package/linthost/rules_strings.go +4 -4
  212. package/linthost/rules_suggestions.go +38 -38
  213. package/linthost/rules_tanstack_query.go +844 -0
  214. package/linthost/rules_testing_library.go +1204 -0
  215. package/linthost/rules_throw.go +1 -1
  216. package/linthost/rules_ts.go +19 -19
  217. package/linthost/rules_ts_async.go +399 -0
  218. package/linthost/rules_ts_class_literal_property_style.go +115 -0
  219. package/linthost/rules_ts_consistent_type_exports.go +256 -0
  220. package/linthost/rules_ts_explicit_function_return_type.go +67 -0
  221. package/linthost/rules_ts_extra.go +155 -36
  222. package/linthost/rules_ts_no_base_to_string.go +218 -0
  223. package/linthost/rules_ts_no_confusing_void.go +72 -0
  224. package/linthost/rules_ts_no_deprecated.go +195 -0
  225. package/linthost/rules_ts_no_for_in_array.go +84 -0
  226. package/linthost/rules_ts_no_magic_numbers.go +124 -0
  227. package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
  228. package/linthost/rules_ts_no_misused_spread.go +104 -0
  229. package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
  230. package/linthost/rules_ts_no_restricted_types.go +62 -0
  231. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
  232. package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
  233. package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
  234. package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
  235. package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
  236. package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
  237. package/linthost/rules_ts_no_unsafe_argument.go +82 -0
  238. package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
  239. package/linthost/rules_ts_no_unsafe_call.go +82 -0
  240. package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
  241. package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
  242. package/linthost/rules_ts_no_unsafe_return.go +126 -0
  243. package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
  244. package/linthost/rules_ts_no_useless_constructor.go +52 -0
  245. package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
  246. package/linthost/rules_ts_parameter_properties.go +38 -0
  247. package/linthost/rules_ts_prefer_find.go +178 -0
  248. package/linthost/rules_ts_prefer_includes.go +255 -0
  249. package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
  250. package/linthost/rules_ts_prefer_optional_chain.go +228 -0
  251. package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
  252. package/linthost/rules_ts_prefer_readonly.go +73 -0
  253. package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
  254. package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
  255. package/linthost/rules_ts_prefer_return_this_type.go +135 -0
  256. package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
  257. package/linthost/rules_ts_promise_function_async.go +77 -0
  258. package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
  259. package/linthost/rules_ts_require_array_sort_compare.go +96 -0
  260. package/linthost/rules_ts_restrict_plus_operands.go +127 -0
  261. package/linthost/rules_ts_restrict_template_expressions.go +95 -0
  262. package/linthost/rules_ts_simple.go +387 -0
  263. package/linthost/rules_ts_sort_type_constituents.go +144 -0
  264. package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
  265. package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
  266. package/linthost/rules_ts_unbound_method.go +126 -0
  267. package/linthost/rules_tsdoc.go +136 -0
  268. package/linthost/rules_unicorn_better_regex.go +27 -0
  269. package/linthost/rules_unicorn_catch_error_name.go +46 -0
  270. package/linthost/rules_unicorn_consistent_assert.go +47 -0
  271. package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
  272. package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
  273. package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
  274. package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
  275. package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
  276. package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
  277. package/linthost/rules_unicorn_custom_error_definition.go +138 -0
  278. package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
  279. package/linthost/rules_unicorn_error_message.go +64 -0
  280. package/linthost/rules_unicorn_escape_case.go +51 -0
  281. package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
  282. package/linthost/rules_unicorn_explicit_length_check.go +88 -0
  283. package/linthost/rules_unicorn_filename_case.go +29 -0
  284. package/linthost/rules_unicorn_import_style.go +28 -0
  285. package/linthost/rules_unicorn_isolated_functions.go +29 -0
  286. package/linthost/rules_unicorn_new_for_builtins.go +87 -0
  287. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
  288. package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
  289. package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
  290. package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
  291. package/linthost/rules_unicorn_no_array_for_each.go +40 -0
  292. package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
  293. package/linthost/rules_unicorn_no_array_reduce.go +41 -0
  294. package/linthost/rules_unicorn_no_array_reverse.go +44 -0
  295. package/linthost/rules_unicorn_no_array_sort.go +43 -0
  296. package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
  297. package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
  298. package/linthost/rules_unicorn_no_console_spaces.go +61 -0
  299. package/linthost/rules_unicorn_no_document_cookie.go +41 -0
  300. package/linthost/rules_unicorn_no_empty_file.go +44 -0
  301. package/linthost/rules_unicorn_no_for_loop.go +102 -0
  302. package/linthost/rules_unicorn_no_hex_escape.go +42 -0
  303. package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
  304. package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
  305. package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
  306. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
  307. package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
  308. package/linthost/rules_unicorn_no_lonely_if.go +44 -0
  309. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
  310. package/linthost/rules_unicorn_no_named_default.go +54 -0
  311. package/linthost/rules_unicorn_no_negated_condition.go +85 -0
  312. package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
  313. package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
  314. package/linthost/rules_unicorn_no_new_array.go +30 -0
  315. package/linthost/rules_unicorn_no_new_buffer.go +31 -0
  316. package/linthost/rules_unicorn_no_null.go +24 -0
  317. package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
  318. package/linthost/rules_unicorn_no_process_exit.go +43 -0
  319. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
  320. package/linthost/rules_unicorn_no_static_only_class.go +56 -0
  321. package/linthost/rules_unicorn_no_thenable.go +74 -0
  322. package/linthost/rules_unicorn_no_this_assignment.go +35 -0
  323. package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
  324. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
  325. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
  326. package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
  327. package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
  328. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
  329. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
  330. package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
  331. package/linthost/rules_unicorn_no_unused_properties.go +30 -0
  332. package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
  333. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
  334. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
  335. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
  336. package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
  337. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
  338. package/linthost/rules_unicorn_no_useless_spread.go +67 -0
  339. package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
  340. package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
  341. package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
  342. package/linthost/rules_unicorn_number_literal_case.go +69 -0
  343. package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
  344. package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
  345. package/linthost/rules_unicorn_prefer_array_find.go +51 -0
  346. package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
  347. package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
  348. package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
  349. package/linthost/rules_unicorn_prefer_array_some.go +67 -0
  350. package/linthost/rules_unicorn_prefer_at.go +77 -0
  351. package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
  352. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
  353. package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
  354. package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
  355. package/linthost/rules_unicorn_prefer_code_point.go +49 -0
  356. package/linthost/rules_unicorn_prefer_date_now.go +78 -0
  357. package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
  358. package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
  359. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
  360. package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
  361. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
  362. package/linthost/rules_unicorn_prefer_event_target.go +36 -0
  363. package/linthost/rules_unicorn_prefer_export_from.go +129 -0
  364. package/linthost/rules_unicorn_prefer_global_this.go +127 -0
  365. package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
  366. package/linthost/rules_unicorn_prefer_includes.go +149 -0
  367. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
  368. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
  369. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
  370. package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
  371. package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
  372. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
  373. package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
  374. package/linthost/rules_unicorn_prefer_module.go +50 -0
  375. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
  376. package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
  377. package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
  378. package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
  379. package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
  380. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
  381. package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
  382. package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
  383. package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
  384. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
  385. package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
  386. package/linthost/rules_unicorn_prefer_set_has.go +42 -0
  387. package/linthost/rules_unicorn_prefer_set_size.go +48 -0
  388. package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
  389. package/linthost/rules_unicorn_prefer_single_call.go +96 -0
  390. package/linthost/rules_unicorn_prefer_spread.go +51 -0
  391. package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
  392. package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
  393. package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
  394. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
  395. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
  396. package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
  397. package/linthost/rules_unicorn_prefer_switch.go +103 -0
  398. package/linthost/rules_unicorn_prefer_ternary.go +71 -0
  399. package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
  400. package/linthost/rules_unicorn_prefer_type_error.go +127 -0
  401. package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
  402. package/linthost/rules_unicorn_relative_url_style.go +49 -0
  403. package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
  404. package/linthost/rules_unicorn_require_module_attributes.go +54 -0
  405. package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
  406. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
  407. package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
  408. package/linthost/rules_unicorn_string_content.go +27 -0
  409. package/linthost/rules_unicorn_switch_case_braces.go +42 -0
  410. package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
  411. package/linthost/rules_unicorn_template_indent.go +28 -0
  412. package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
  413. package/linthost/rules_unicorn_throw_new_error.go +61 -0
  414. package/linthost/rules_var.go +10 -4
  415. package/linthost/rules_vitest.go +568 -0
  416. package/package.json +3 -3
  417. package/plugin/main.go +49 -3
  418. package/rule/astutil/astutil.go +10 -3
  419. package/rule/rule.go +12 -10
  420. package/src/defaultFormat.ts +11 -8
  421. package/src/index.ts +65 -43
  422. package/src/structures/ITtscLintConfig.ts +12 -6
  423. package/src/structures/{ITtscLintFormatConfig.ts → ITtscLintFormat.ts} +2 -2
  424. package/src/structures/TtscLintRuleSetting.ts +55 -0
  425. package/src/structures/index.ts +3 -4
  426. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +128 -0
  427. package/src/structures/rules/ITtscLintBoundariesRules.ts +95 -0
  428. package/src/structures/rules/ITtscLintContributorRules.ts +21 -0
  429. package/src/structures/rules/ITtscLintCoreRules.ts +1406 -0
  430. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
  431. package/src/structures/rules/ITtscLintCypressRules.ts +145 -0
  432. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +213 -0
  433. package/src/structures/rules/ITtscLintFunctionalRules.ts +202 -0
  434. package/src/structures/rules/ITtscLintJestRules.ts +220 -0
  435. package/src/structures/rules/ITtscLintJsdocRules.ts +153 -0
  436. package/src/structures/rules/ITtscLintJsxA11yRules.ts +339 -0
  437. package/src/structures/rules/ITtscLintNextjsRules.ts +206 -0
  438. package/src/structures/rules/ITtscLintPlaywrightRules.ts +361 -0
  439. package/src/structures/rules/ITtscLintPromiseRules.ts +205 -0
  440. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
  441. package/src/structures/rules/ITtscLintReactPerfRules.ts +55 -0
  442. package/src/structures/rules/ITtscLintReactRuleOptions.ts +43 -0
  443. package/src/structures/rules/ITtscLintReactRules.ts +321 -0
  444. package/src/structures/rules/ITtscLintRegexpRules.ts +212 -0
  445. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +89 -0
  446. package/src/structures/rules/ITtscLintRules.ts +77 -0
  447. package/src/structures/rules/ITtscLintSecurityRules.ts +162 -0
  448. package/src/structures/rules/ITtscLintSolidRules.ts +202 -0
  449. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +23 -0
  450. package/src/structures/rules/ITtscLintStorybookRules.ts +193 -0
  451. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +102 -0
  452. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +24 -0
  453. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +342 -0
  454. package/src/structures/rules/ITtscLintTypeScriptRules.ts +1230 -0
  455. package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
  456. package/src/structures/rules/ITtscLintVitestRules.ts +154 -0
  457. package/src/structures/rules/index.ts +31 -0
  458. package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
  459. package/lib/structures/TtscLintRule.d.ts +0 -17
  460. package/lib/structures/TtscLintRule.js.map +0 -1
  461. package/lib/structures/TtscLintRuleMap.d.ts +0 -46
  462. package/lib/structures/TtscLintRuleMap.js.map +0 -1
  463. package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
  464. package/lib/structures/TtscLintRuleOptions.js.map +0 -1
  465. package/src/structures/TtscLintRule.ts +0 -160
  466. package/src/structures/TtscLintRuleMap.ts +0 -55
  467. package/src/structures/TtscLintRuleOptions.ts +0 -151
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ITtscLintUnicornRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITtscLintUnicornRules.js","sourceRoot":"","sources":["../../../src/structures/rules/ITtscLintUnicornRules.ts"],"names":[],"mappings":""}
@@ -0,0 +1,141 @@
1
+ import type { TtscLintRuleSetting } from "../TtscLintRuleSetting";
2
+ /**
3
+ * Vitest test source rules from `@vitest/eslint-plugin`.
4
+ *
5
+ * Vitest reuses much of Jest's testing surface but ships its own
6
+ * runner and configuration. These rules mirror the ergonomic subset
7
+ * of `eslint-plugin-jest` adapted for Vitest semantics — focused
8
+ * tests, identical titles, conditional logic, valid `expect` shape.
9
+ *
10
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest
11
+ */
12
+ export interface ITtscLintVitestRules {
13
+ /**
14
+ * Require every Vitest test body to contain at least one
15
+ * `expect(...)` call. A test with no assertions still passes,
16
+ * giving a false-positive signal.
17
+ *
18
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/expect-expect.md
19
+ */
20
+ "vitest/expect-expect"?: TtscLintRuleSetting;
21
+ /**
22
+ * Reject `expect(...)` calls under `if`/`try`/`catch` or other
23
+ * conditional branches in Vitest tests.
24
+ *
25
+ * A branch that never runs turns the assertion into a silent no-op
26
+ * rather than a failure.
27
+ *
28
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-conditional-expect.md
29
+ */
30
+ "vitest/no-conditional-expect"?: TtscLintRuleSetting;
31
+ /**
32
+ * Reject `test(...)`/`it(...)` declarations inside loops or `if`
33
+ * branches.
34
+ *
35
+ * Vitest collects tests at module load, so a conditional
36
+ * declaration produces a different suite shape than the file
37
+ * appears to describe.
38
+ *
39
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-conditional-tests.md
40
+ */
41
+ "vitest/no-conditional-tests"?: TtscLintRuleSetting;
42
+ /**
43
+ * Reject `test.skip`, `it.skip`, `describe.skip`, and `.todo`
44
+ * variants.
45
+ *
46
+ * Disabled tests rot in place and quietly drop coverage for the
47
+ * feature they were meant to pin.
48
+ *
49
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-disabled-tests.md
50
+ */
51
+ "vitest/no-disabled-tests"?: TtscLintRuleSetting;
52
+ /**
53
+ * Reject `done` callback parameters in Vitest tests and
54
+ * lifecycle hooks.
55
+ *
56
+ * The callback style predates async/await and makes failure
57
+ * propagation easy to miss; return a Promise or mark the body
58
+ * `async` instead.
59
+ *
60
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-done-callback.md
61
+ */
62
+ "vitest/no-done-callback"?: TtscLintRuleSetting;
63
+ /**
64
+ * Reject `test.only`, `it.only`, and `describe.only`.
65
+ *
66
+ * A focused suite silently skips the rest of the file, so a stray
67
+ * `.only` left from debugging hides every other test in CI.
68
+ *
69
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-focused-tests.md
70
+ */
71
+ "vitest/no-focused-tests"?: TtscLintRuleSetting;
72
+ /**
73
+ * Reject duplicate Vitest test or `describe` titles within the
74
+ * same suite scope.
75
+ *
76
+ * The runner cannot disambiguate two siblings with identical names
77
+ * in its error output or filter flags.
78
+ *
79
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-identical-title.md
80
+ */
81
+ "vitest/no-identical-title"?: TtscLintRuleSetting;
82
+ /**
83
+ * Reject `expect(...)` calls outside Vitest tests and hooks.
84
+ *
85
+ * Top-level assertions execute at module load before any test
86
+ * starts, so failures never attach to a named case.
87
+ *
88
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-standalone-expect.md
89
+ */
90
+ "vitest/no-standalone-expect"?: TtscLintRuleSetting;
91
+ /**
92
+ * Reject `return` statements that return non-Promise values from
93
+ * a Vitest test callback.
94
+ *
95
+ * The runner ignores the value and following code is dead, which
96
+ * usually masks a missing `await` or stray early-exit.
97
+ *
98
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-test-return-statement.md
99
+ */
100
+ "vitest/no-test-return-statement"?: TtscLintRuleSetting;
101
+ /**
102
+ * Prefer `expect(value).toHaveLength(n)` over asserting on
103
+ * `value.length` with `toBe`.
104
+ *
105
+ * The dedicated matcher reports the actual length on failure
106
+ * instead of a bare number mismatch.
107
+ *
108
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/prefer-to-have-length.md
109
+ */
110
+ "vitest/prefer-to-have-length"?: TtscLintRuleSetting;
111
+ /**
112
+ * Validate the shape of Vitest `describe` callbacks.
113
+ *
114
+ * The callback must be synchronous and take no arguments — the
115
+ * runner ignores returned Promises and `done`-style parameters at
116
+ * the describe level.
117
+ *
118
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/valid-describe-callback.md
119
+ */
120
+ "vitest/valid-describe-callback"?: TtscLintRuleSetting;
121
+ /**
122
+ * Validate `expect(...)` arity and matcher chaining: exactly one
123
+ * argument, terminated by a matcher call, and async matchers
124
+ * properly awaited.
125
+ *
126
+ * Malformed expects either throw at runtime or pass without
127
+ * asserting anything.
128
+ *
129
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/valid-expect.md
130
+ */
131
+ "vitest/valid-expect"?: TtscLintRuleSetting;
132
+ /**
133
+ * Require non-empty static Vitest test and `describe` titles.
134
+ *
135
+ * Empty or dynamically-built titles produce unreadable failure
136
+ * output and break filter-by-name flags.
137
+ *
138
+ * @reference https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/valid-title.md
139
+ */
140
+ "vitest/valid-title"?: TtscLintRuleSetting;
141
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ITtscLintVitestRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITtscLintVitestRules.js","sourceRoot":"","sources":["../../../src/structures/rules/ITtscLintVitestRules.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ export * from "./ITtscLintBoundariesRuleOptions";
2
+ export * from "./ITtscLintBoundariesRules";
3
+ export * from "./ITtscLintContributorRules";
4
+ export * from "./ITtscLintCoreRules";
5
+ export * from "./ITtscLintCypressRuleOptions";
6
+ export * from "./ITtscLintCypressRules";
7
+ export * from "./ITtscLintFunctionalRuleOptions";
8
+ export * from "./ITtscLintFunctionalRules";
9
+ export * from "./ITtscLintJestRules";
10
+ export * from "./ITtscLintJsdocRules";
11
+ export * from "./ITtscLintJsxA11yRules";
12
+ export * from "./ITtscLintNextjsRules";
13
+ export * from "./ITtscLintPlaywrightRules";
14
+ export * from "./ITtscLintPromiseRules";
15
+ export * from "./ITtscLintReactPerfRuleOptions";
16
+ export * from "./ITtscLintReactPerfRules";
17
+ export * from "./ITtscLintReactRuleOptions";
18
+ export * from "./ITtscLintReactRules";
19
+ export * from "./ITtscLintRegexpRules";
20
+ export * from "./ITtscLintRuleOptionsMap";
21
+ export * from "./ITtscLintRules";
22
+ export * from "./ITtscLintSecurityRules";
23
+ export * from "./ITtscLintSolidRules";
24
+ export * from "./ITtscLintStorybookRuleOptions";
25
+ export * from "./ITtscLintStorybookRules";
26
+ export * from "./ITtscLintTanstackQueryRules";
27
+ export * from "./ITtscLintTestingLibraryRuleOptions";
28
+ export * from "./ITtscLintTestingLibraryRules";
29
+ export * from "./ITtscLintTypeScriptRules";
30
+ export * from "./ITtscLintUnicornRules";
31
+ export * from "./ITtscLintVitestRules";
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ITtscLintBoundariesRuleOptions"), exports);
18
+ __exportStar(require("./ITtscLintBoundariesRules"), exports);
19
+ __exportStar(require("./ITtscLintContributorRules"), exports);
20
+ __exportStar(require("./ITtscLintCoreRules"), exports);
21
+ __exportStar(require("./ITtscLintCypressRuleOptions"), exports);
22
+ __exportStar(require("./ITtscLintCypressRules"), exports);
23
+ __exportStar(require("./ITtscLintFunctionalRuleOptions"), exports);
24
+ __exportStar(require("./ITtscLintFunctionalRules"), exports);
25
+ __exportStar(require("./ITtscLintJestRules"), exports);
26
+ __exportStar(require("./ITtscLintJsdocRules"), exports);
27
+ __exportStar(require("./ITtscLintJsxA11yRules"), exports);
28
+ __exportStar(require("./ITtscLintNextjsRules"), exports);
29
+ __exportStar(require("./ITtscLintPlaywrightRules"), exports);
30
+ __exportStar(require("./ITtscLintPromiseRules"), exports);
31
+ __exportStar(require("./ITtscLintReactPerfRuleOptions"), exports);
32
+ __exportStar(require("./ITtscLintReactPerfRules"), exports);
33
+ __exportStar(require("./ITtscLintReactRuleOptions"), exports);
34
+ __exportStar(require("./ITtscLintReactRules"), exports);
35
+ __exportStar(require("./ITtscLintRegexpRules"), exports);
36
+ __exportStar(require("./ITtscLintRuleOptionsMap"), exports);
37
+ __exportStar(require("./ITtscLintRules"), exports);
38
+ __exportStar(require("./ITtscLintSecurityRules"), exports);
39
+ __exportStar(require("./ITtscLintSolidRules"), exports);
40
+ __exportStar(require("./ITtscLintStorybookRuleOptions"), exports);
41
+ __exportStar(require("./ITtscLintStorybookRules"), exports);
42
+ __exportStar(require("./ITtscLintTanstackQueryRules"), exports);
43
+ __exportStar(require("./ITtscLintTestingLibraryRuleOptions"), exports);
44
+ __exportStar(require("./ITtscLintTestingLibraryRules"), exports);
45
+ __exportStar(require("./ITtscLintTypeScriptRules"), exports);
46
+ __exportStar(require("./ITtscLintUnicornRules"), exports);
47
+ __exportStar(require("./ITtscLintVitestRules"), exports);
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/structures/rules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,6DAA2C;AAC3C,8DAA4C;AAC5C,uDAAqC;AACrC,gEAA8C;AAC9C,0DAAwC;AACxC,mEAAiD;AACjD,6DAA2C;AAC3C,uDAAqC;AACrC,wDAAsC;AACtC,0DAAwC;AACxC,yDAAuC;AACvC,6DAA2C;AAC3C,0DAAwC;AACxC,kEAAgD;AAChD,4DAA0C;AAC1C,8DAA4C;AAC5C,wDAAsC;AACtC,yDAAuC;AACvC,4DAA0C;AAC1C,mDAAiC;AACjC,2DAAyC;AACzC,wDAAsC;AACtC,kEAAgD;AAChD,4DAA0C;AAC1C,gEAA8C;AAC9C,uEAAqD;AACrD,iEAA+C;AAC/C,6DAA2C;AAC3C,0DAAwC;AACxC,yDAAuC"}
@@ -269,15 +269,40 @@ func stringLiteralText(node *shimast.Node) string {
269
269
  }
270
270
 
271
271
  // walkDescendants visits node and every child below it, depth-first.
272
+ //
273
+ // The naive recursive shape `node.ForEachChild(func(child) bool {
274
+ // walkDescendants(child, visit); return false })` allocates one
275
+ // closure per recursive call (the inner func captures `visit` and
276
+ // the outer function reference), so a subtree of N nodes costs N
277
+ // closure allocations. The struct walker below caches the
278
+ // `ForEachChild` callback as a method value bound once to the
279
+ // walker, dropping that cost to one allocation per `walkDescendants`
280
+ // call regardless of subtree size.
272
281
  func walkDescendants(node *shimast.Node, visit func(*shimast.Node)) {
273
282
  if node == nil {
274
283
  return
275
284
  }
276
- visit(node)
277
- node.ForEachChild(func(child *shimast.Node) bool {
278
- walkDescendants(child, visit)
279
- return false
280
- })
285
+ w := &descendantsWalker{visit: visit}
286
+ w.childCB = w.visitChild
287
+ w.walk(node)
288
+ }
289
+
290
+ type descendantsWalker struct {
291
+ visit func(*shimast.Node)
292
+ childCB func(*shimast.Node) bool
293
+ }
294
+
295
+ func (w *descendantsWalker) walk(node *shimast.Node) {
296
+ if node == nil {
297
+ return
298
+ }
299
+ w.visit(node)
300
+ node.ForEachChild(w.childCB)
301
+ }
302
+
303
+ func (w *descendantsWalker) visitChild(child *shimast.Node) bool {
304
+ w.walk(child)
305
+ return false
281
306
  }
282
307
 
283
308
  // assignmentTargetNames collects the identifier names written by an
@@ -21,6 +21,7 @@ import (
21
21
  "os"
22
22
  "path/filepath"
23
23
  "strings"
24
+ "time"
24
25
 
25
26
  shimast "github.com/microsoft/typescript-go/shim/ast"
26
27
  shimcompiler "github.com/microsoft/typescript-go/shim/compiler"
@@ -63,6 +64,8 @@ func RunTransform(args []string) int {
63
64
  singleThreaded := fs.Bool("singleThreaded", false, "run TypeScript-Go single-threaded")
64
65
  checkers := fs.Int("checkers", 0, "type-checker pool size (0 = TypeScript-Go default)")
65
66
  tsgoArgsRaw := fs.String("tsgo-args", "", "JSON array of forwarded tsgo CLI flags")
67
+ _ = fs.Bool("diagnostics", false, "print @ttsc/lint diagnostics timing")
68
+ _ = fs.Bool("extendedDiagnostics", false, "print @ttsc/lint diagnostics timing")
66
69
  if err := fs.Parse(filterKnownFlags(args, LintFlagAllowList)); err != nil {
67
70
  return 2
68
71
  }
@@ -171,6 +174,7 @@ type subcommandOpts struct {
171
174
  noEmit bool
172
175
  quiet bool
173
176
  verbose bool
177
+ diagnostics bool
174
178
  outDir string
175
179
  singleThreaded bool
176
180
  checkers int
@@ -190,6 +194,8 @@ func parseSubcommandFlags(name string, args []string) (*subcommandOpts, error) {
190
194
  noEmit := fs.Bool("noEmit", false, "")
191
195
  quiet := fs.Bool("quiet", false, "")
192
196
  verbose := fs.Bool("verbose", false, "")
197
+ diagnostics := fs.Bool("diagnostics", false, "")
198
+ extendedDiagnostics := fs.Bool("extendedDiagnostics", false, "")
193
199
  outDir := fs.String("outDir", "", "")
194
200
  singleThreaded := fs.Bool("singleThreaded", false, "")
195
201
  checkers := fs.Int("checkers", 0, "")
@@ -216,6 +222,7 @@ func parseSubcommandFlags(name string, args []string) (*subcommandOpts, error) {
216
222
  noEmit: *noEmit,
217
223
  quiet: *quiet,
218
224
  verbose: *verbose,
225
+ diagnostics: *diagnostics || *extendedDiagnostics,
219
226
  outDir: *outDir,
220
227
  singleThreaded: *singleThreaded,
221
228
  checkers: *checkers,
@@ -268,11 +275,12 @@ func runProject(opts *subcommandOpts) int {
268
275
  }
269
276
  defer prog.close()
270
277
 
271
- astDiags, lintDiags, err := collectDiagnostics(prog, engine)
278
+ astDiags, lintDiags, diagnosticsTiming, err := collectDiagnosticsTimed(prog, engine)
272
279
  if err != nil {
273
280
  fmt.Fprintln(os.Stderr, err)
274
281
  return 2
275
282
  }
283
+ printLintDiagnosticsTiming(os.Stdout, opts.diagnostics, diagnosticsTiming)
276
284
  warnUnknownRules(os.Stderr, engine.UnknownRules())
277
285
  if errCount := shimdw.FormatMixedDiagnostics(os.Stderr, astDiags, lintDiags, opts.cwd); errCount > 0 {
278
286
  return 2
@@ -373,9 +381,21 @@ func filterKnownFlags(args []string, known map[string]bool) []string {
373
381
  // engine's findings. The renderer takes the two slices and walks them in
374
382
  // source order, so we don't need to interleave here.
375
383
  func collectDiagnostics(prog *program, engine *Engine) ([]*shimast.Diagnostic, []*shimdw.LintDiagnostic, error) {
384
+ astDiags, lintDiags, _, err := collectDiagnosticsTimed(prog, engine)
385
+ return astDiags, lintDiags, err
386
+ }
387
+
388
+ type lintDiagnosticsTiming struct {
389
+ lint time.Duration
390
+ }
391
+
392
+ func collectDiagnosticsTimed(prog *program, engine *Engine) ([]*shimast.Diagnostic, []*shimdw.LintDiagnostic, lintDiagnosticsTiming, error) {
393
+ timing := lintDiagnosticsTiming{}
376
394
  astDiags := prog.programDiagnostics()
377
395
  files := prog.userSourceFiles()
396
+ lintStarted := time.Now()
378
397
  findings := engine.Run(files, prog.checker)
398
+ timing.lint = time.Since(lintStarted)
379
399
  nativeDiags := make([]*shimdw.LintDiagnostic, 0, len(findings))
380
400
  for _, finding := range findings {
381
401
  category := shimdw.LintCategoryError
@@ -391,7 +411,18 @@ func collectDiagnostics(prog *program, engine *Engine) ([]*shimast.Diagnostic, [
391
411
  fmt.Sprintf("[%s] %s", finding.Rule, finding.Message),
392
412
  ))
393
413
  }
394
- return astDiags, nativeDiags, nil
414
+ return astDiags, nativeDiags, timing, nil
415
+ }
416
+
417
+ func printLintDiagnosticsTiming(w io.Writer, enabled bool, timing lintDiagnosticsTiming) {
418
+ if !enabled {
419
+ return
420
+ }
421
+ fmt.Fprintf(w, "@ttsc/lint time: %s\n", formatTimingSeconds(timing.lint))
422
+ }
423
+
424
+ func formatTimingSeconds(duration time.Duration) string {
425
+ return fmt.Sprintf("%.3fs", duration.Seconds())
395
426
  }
396
427
 
397
428
  // RuleCode hashes a rule name into a stable, positive int32 so the
@@ -125,13 +125,13 @@ type RuleResolver interface {
125
125
  // ResolveRules implements RuleResolver. A flat RuleConfig has no glob scoping,
126
126
  // so every file receives the full map unchanged.
127
127
  func (c RuleConfig) ResolveRules(string) ResolvedRuleConfig {
128
- return ResolvedRuleConfig{Rules: c}
128
+ return ResolvedRuleConfig{Rules: normalizeRuleConfigKeys(c)}
129
129
  }
130
130
 
131
131
  // ActiveRuleNames implements RuleResolver. Returns rule names whose severity
132
132
  // is not SeverityOff, sorted for deterministic engine dispatch-table construction.
133
133
  func (c RuleConfig) ActiveRuleNames() []string {
134
- return sortedRuleNames(c, func(sev Severity) bool { return sev != SeverityOff })
134
+ return sortedRuleNames(normalizeRuleConfigKeys(c), func(sev Severity) bool { return sev != SeverityOff })
135
135
  }
136
136
 
137
137
  // EnabledRuleConfig implements RuleResolver. Returns a copy containing only the
@@ -140,7 +140,7 @@ func (c RuleConfig) EnabledRuleConfig() RuleConfig {
140
140
  out := RuleConfig{}
141
141
  for name, sev := range c {
142
142
  if sev != SeverityOff {
143
- out[name] = sev
143
+ out[normalizeExternalRuleName(name)] = sev
144
144
  }
145
145
  }
146
146
  return out
@@ -151,6 +151,17 @@ func (c RuleConfig) EnabledRuleConfig() RuleConfig {
151
151
  // predate option support.
152
152
  func (RuleConfig) RuleOptions(string) json.RawMessage { return nil }
153
153
 
154
+ func normalizeRuleConfigKeys(c RuleConfig) RuleConfig {
155
+ if len(c) == 0 {
156
+ return c
157
+ }
158
+ out := RuleConfig{}
159
+ for name, sev := range c {
160
+ out[normalizeExternalRuleName(name)] = sev
161
+ }
162
+ return out
163
+ }
164
+
154
165
  // InlineRuleResolver pairs a severity map with an options map. The fields
155
166
  // are public so tests can construct one without going through
156
167
  // ParseRulesWithOptions.
@@ -162,7 +173,7 @@ type InlineRuleResolver struct {
162
173
  // ResolveRules implements RuleResolver. Inline rules have no glob scoping;
163
174
  // the full map applies to every file.
164
175
  func (r InlineRuleResolver) ResolveRules(string) ResolvedRuleConfig {
165
- return ResolvedRuleConfig{Rules: r.Rules}
176
+ return ResolvedRuleConfig{Rules: normalizeRuleConfigKeys(r.Rules)}
166
177
  }
167
178
 
168
179
  // ActiveRuleNames implements RuleResolver by delegating to the inner RuleConfig.
@@ -182,7 +193,14 @@ func (r InlineRuleResolver) RuleOptions(name string) json.RawMessage {
182
193
  if r.Options == nil {
183
194
  return nil
184
195
  }
185
- return r.Options[name]
196
+ if raw := r.Options[name]; len(raw) > 0 {
197
+ return raw
198
+ }
199
+ canonical := normalizeExternalRuleName(name)
200
+ if raw := r.Options[canonical]; len(raw) > 0 {
201
+ return raw
202
+ }
203
+ return nil
186
204
  }
187
205
 
188
206
  // ConfigStore holds the parsed representation of a lint config file. It
@@ -210,7 +228,14 @@ func (s *ConfigStore) RuleOptions(name string) json.RawMessage {
210
228
  if s == nil {
211
229
  return nil
212
230
  }
213
- return s.options[name]
231
+ if raw := s.options[name]; len(raw) > 0 {
232
+ return raw
233
+ }
234
+ canonical := normalizeExternalRuleName(name)
235
+ if raw := s.options[canonical]; len(raw) > 0 {
236
+ return raw
237
+ }
238
+ return nil
214
239
  }
215
240
 
216
241
  // ConfigEntry is the parsed form of one config file in the extends chain.
@@ -245,7 +270,7 @@ func (s *ConfigStore) ResolveRules(fileName string) ResolvedRuleConfig {
245
270
  continue
246
271
  }
247
272
  for name, sev := range entry.Rules {
248
- out[name] = sev
273
+ out[normalizeExternalRuleName(name)] = sev
249
274
  }
250
275
  }
251
276
  return ResolvedRuleConfig{Rules: out}
@@ -266,7 +291,7 @@ func (s *ConfigStore) ActiveRuleNames() []string {
266
291
  }
267
292
  for name, sev := range entry.Rules {
268
293
  if sev != SeverityOff {
269
- active[name] = sev
294
+ active[normalizeExternalRuleName(name)] = sev
270
295
  }
271
296
  }
272
297
  }
@@ -289,8 +314,9 @@ func (s *ConfigStore) EnabledRuleConfig() RuleConfig {
289
314
  if sev == SeverityOff {
290
315
  continue
291
316
  }
292
- if out[name] != SeverityError {
293
- out[name] = sev
317
+ canonical := normalizeExternalRuleName(name)
318
+ if out[canonical] != SeverityError {
319
+ out[canonical] = sev
294
320
  }
295
321
  }
296
322
  }
@@ -310,7 +336,7 @@ func (s *ConfigStore) Flatten() RuleConfig {
310
336
  continue
311
337
  }
312
338
  for name, sev := range entry.Rules {
313
- out[name] = sev
339
+ out[normalizeExternalRuleName(name)] = sev
314
340
  }
315
341
  }
316
342
  return out
@@ -649,12 +675,10 @@ func rejectUnknownConfigKeys(value map[string]any, path string) error {
649
675
  return nil
650
676
  }
651
677
 
652
- // normalizeExternalRuleName strips the standard typescript-eslint namespace
653
- // prefixes so that rules like "@typescript-eslint/no-explicit-any" and the
654
- // bare "no-explicit-any" key both resolve to the same engine-internal name.
678
+ // normalizeExternalRuleName strips standard TypeScript-ESLint namespaces while
679
+ // preserving @ttsc/lint's canonical kebab/slash rule IDs.
655
680
  func normalizeExternalRuleName(name string) string {
656
- name = strings.TrimPrefix(name, "@typescript-eslint/")
657
- return strings.TrimPrefix(name, "typescript-eslint/")
681
+ return normalizeBuiltinRuleName(name)
658
682
  }
659
683
 
660
684
  // parsePatternList coerces a raw config value to a string slice for use as a
@@ -1704,5 +1728,12 @@ func (c RuleConfig) Severity(name string) Severity {
1704
1728
  if c == nil {
1705
1729
  return SeverityOff
1706
1730
  }
1707
- return c[name]
1731
+ if sev, ok := c[name]; ok {
1732
+ return sev
1733
+ }
1734
+ canonical := normalizeExternalRuleName(name)
1735
+ if sev, ok := c[canonical]; ok {
1736
+ return sev
1737
+ }
1738
+ return SeverityOff
1708
1739
  }
@@ -47,7 +47,7 @@ func expandFormatBlock(raw map[string]any) (map[string]any, error) {
47
47
  }
48
48
  out := map[string]any{}
49
49
 
50
- // format/semi
50
+ // formatSemi
51
51
  semiPrefer := "always"
52
52
  if v, ok := raw["semi"]; ok {
53
53
  b, err := asBool("format.semi", v)
@@ -60,7 +60,7 @@ func expandFormatBlock(raw map[string]any) (map[string]any, error) {
60
60
  }
61
61
  out["format/semi"] = ruleEntry(map[string]any{"prefer": semiPrefer})
62
62
 
63
- // format/quotes
63
+ // formatQuotes
64
64
  quotesPrefer := "double"
65
65
  if v, ok := raw["singleQuote"]; ok {
66
66
  b, err := asBool("format.singleQuote", v)
@@ -73,7 +73,7 @@ func expandFormatBlock(raw map[string]any) (map[string]any, error) {
73
73
  }
74
74
  out["format/quotes"] = ruleEntry(map[string]any{"prefer": quotesPrefer})
75
75
 
76
- // format/trailing-comma
76
+ // formatTrailingComma
77
77
  tcMode := "all"
78
78
  if v, ok := raw["trailingComma"]; ok {
79
79
  s, err := asString("format.trailingComma", v)
@@ -89,7 +89,7 @@ func expandFormatBlock(raw map[string]any) (map[string]any, error) {
89
89
  }
90
90
  out["format/trailing-comma"] = ruleEntry(map[string]any{"mode": tcMode})
91
91
 
92
- // format/print-width
92
+ // formatPrintWidth
93
93
  //
94
94
  // `trailingComma` is mirrored into the print-width rule's options so
95
95
  // the printer's broken-list reflow emits the same trailing-comma
@@ -137,7 +137,7 @@ func expandFormatBlock(raw map[string]any) (map[string]any, error) {
137
137
  }
138
138
  out["format/print-width"] = ruleEntry(pwOpts)
139
139
 
140
- // format/sort-imports — opt-in by `importOrder`.
140
+ // formatSortImports — opt-in by `importOrder`.
141
141
  if v, ok := raw["importOrder"]; ok {
142
142
  siOpts := map[string]any{}
143
143
  order, err := asStringSlice("format.importOrder", v)
@@ -145,7 +145,7 @@ func expandFormatBlock(raw map[string]any) (map[string]any, error) {
145
145
  return nil, err
146
146
  }
147
147
  if len(order) == 0 {
148
- return nil, fmt.Errorf("@ttsc/lint: format.importOrder must contain at least one entry; omit the field to keep format/sort-imports off")
148
+ return nil, fmt.Errorf("@ttsc/lint: format.importOrder must contain at least one entry; omit the field to keep formatSortImports off")
149
149
  }
150
150
  siOpts["importOrder"] = order
151
151
  if x, ok := raw["importOrderSeparation"]; ok {
@@ -172,7 +172,7 @@ func expandFormatBlock(raw map[string]any) (map[string]any, error) {
172
172
  out["format/sort-imports"] = ruleEntry(siOpts)
173
173
  }
174
174
 
175
- // format/jsdoc — opt-in by `jsdoc` truthy (boolean or object).
175
+ // formatJsdoc — opt-in by `jsdoc` truthy (boolean or object).
176
176
  if v, ok := raw["jsdoc"]; ok && v != nil {
177
177
  jdOpts := map[string]any{}
178
178
  enabled := false
@@ -314,7 +314,7 @@ func asStringSlice(field string, v any) ([]string, error) {
314
314
 
315
315
  // rejectUnknownFormatKeys surfaces typos in top-level format-block
316
316
  // keys at the boundary rather than silently ignoring them. The
317
- // key set mirrors `ITtscLintFormatConfig` exactly.
317
+ // key set mirrors `ITtscLintFormat` exactly.
318
318
  func rejectUnknownFormatKeys(raw map[string]any) error {
319
319
  allowed := map[string]struct{}{
320
320
  "severity": {},
@@ -333,7 +333,7 @@ func rejectUnknownFormatKeys(raw map[string]any) error {
333
333
  }
334
334
  for key := range raw {
335
335
  if _, ok := allowed[key]; !ok {
336
- return fmt.Errorf("@ttsc/lint: format unknown key %q; see ITtscLintFormatConfig for the allowed surface", key)
336
+ return fmt.Errorf("@ttsc/lint: format unknown key %q; see ITtscLintFormat for the allowed surface", key)
337
337
  }
338
338
  }
339
339
  return nil