@ttsc/lint 0.14.0-dev.20260529.1 → 0.14.0

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 (380) hide show
  1. package/README.md +85 -87
  2. package/lib/defaultFormat.d.ts +10 -6
  3. package/lib/defaultFormat.js +10 -6
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/structures/ITtscLintConfig.d.ts +5 -5
  6. package/lib/structures/TtscLintRuleSetting.d.ts +19 -19
  7. package/lib/structures/{ITtscLintFormat.d.ts → format/ITtscLintFormat.d.ts} +45 -70
  8. package/lib/structures/format/ITtscLintFormat.js.map +1 -0
  9. package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +15 -0
  10. package/lib/structures/format/ITtscLintFormatJsDoc.js +3 -0
  11. package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
  12. package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
  13. package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
  14. package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
  15. package/lib/structures/format/index.d.ts +3 -0
  16. package/lib/structures/format/index.js +20 -0
  17. package/lib/structures/format/index.js.map +1 -0
  18. package/lib/structures/index.d.ts +1 -1
  19. package/lib/structures/index.js +1 -1
  20. package/lib/structures/index.js.map +1 -1
  21. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +18 -27
  22. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +4 -5
  23. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -1
  24. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +29 -33
  25. package/lib/structures/rules/ITtscLintContributorRules.d.ts +6 -7
  26. package/lib/structures/rules/ITtscLintCoreRules.d.ts +380 -408
  27. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +5 -5
  28. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +2 -2
  29. package/lib/structures/rules/ITtscLintCypressRules.d.ts +34 -38
  30. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +21 -24
  31. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +2 -2
  32. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +51 -56
  33. package/lib/structures/rules/ITtscLintJestRules.d.ts +63 -74
  34. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +47 -54
  35. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +94 -102
  36. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +50 -55
  37. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +104 -122
  38. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +62 -71
  39. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +4 -4
  40. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +17 -19
  41. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +8 -10
  42. package/lib/structures/rules/ITtscLintReactRuleOptions.js +1 -2
  43. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -1
  44. package/lib/structures/rules/ITtscLintReactRules.d.ts +91 -104
  45. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +46 -54
  46. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +7 -8
  47. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +45 -52
  48. package/lib/structures/rules/ITtscLintSolidRules.d.ts +53 -56
  49. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +3 -4
  50. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +60 -69
  51. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +31 -37
  52. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +2 -3
  53. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +102 -119
  54. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +460 -518
  55. package/lib/structures/rules/ITtscLintVitestRules.d.ts +43 -51
  56. package/linthost/config.go +89 -72
  57. package/linthost/config_format.go +265 -99
  58. package/linthost/directives.go +5 -1
  59. package/linthost/display_width.go +72 -0
  60. package/linthost/fix.go +26 -1
  61. package/linthost/format.go +222 -25
  62. package/linthost/format_editor_settings.go +262 -0
  63. package/linthost/lsp.go +8 -4
  64. package/linthost/print_dispatch.go +3 -0
  65. package/linthost/print_doc.go +13 -0
  66. package/linthost/print_engine.go +68 -11
  67. package/linthost/print_nodes_array.go +108 -5
  68. package/linthost/print_nodes_call.go +515 -74
  69. package/linthost/print_nodes_function.go +25 -0
  70. package/linthost/print_nodes_imports.go +47 -14
  71. package/linthost/print_nodes_list.go +191 -8
  72. package/linthost/print_nodes_object.go +12 -6
  73. package/linthost/print_nodes_ternary.go +106 -0
  74. package/linthost/rules_boundaries.go +400 -400
  75. package/linthost/rules_camelcase.go +81 -81
  76. package/linthost/rules_complexity.go +52 -51
  77. package/linthost/rules_consistent_return.go +81 -81
  78. package/linthost/rules_core_extra.go +472 -472
  79. package/linthost/rules_curly.go +43 -43
  80. package/linthost/rules_default_case.go +15 -15
  81. package/linthost/rules_default_case_last.go +22 -22
  82. package/linthost/rules_format_arrow_parens.go +167 -0
  83. package/linthost/rules_format_bracket_spacing.go +117 -0
  84. package/linthost/rules_format_clause_join.go +172 -0
  85. package/linthost/rules_format_declaration_header.go +664 -0
  86. package/linthost/rules_format_indent.go +616 -0
  87. package/linthost/rules_format_jsdoc.go +4 -4
  88. package/linthost/rules_format_orphan_semi.go +106 -0
  89. package/linthost/rules_format_parameter_properties.go +175 -0
  90. package/linthost/rules_format_print_width.go +185 -69
  91. package/linthost/rules_format_quote_props.go +169 -0
  92. package/linthost/rules_format_quotes.go +75 -29
  93. package/linthost/rules_format_semi.go +185 -10
  94. package/linthost/rules_format_sort_imports.go +456 -121
  95. package/linthost/rules_format_statement_split.go +368 -0
  96. package/linthost/rules_format_ternary_nullish_parens.go +77 -0
  97. package/linthost/rules_format_trailing_comma.go +21 -2
  98. package/linthost/rules_format_whitespace.go +336 -0
  99. package/linthost/rules_functional.go +688 -688
  100. package/linthost/rules_gap.go +146 -11
  101. package/linthost/rules_grouped_accessor_pairs.go +60 -60
  102. package/linthost/rules_guard_for_in.go +122 -122
  103. package/linthost/rules_id_length.go +44 -44
  104. package/linthost/rules_imports.go +11 -3
  105. package/linthost/rules_init_declarations.go +25 -25
  106. package/linthost/rules_jsx_a11y.go +844 -844
  107. package/linthost/rules_max_classes_per_file.go +24 -24
  108. package/linthost/rules_max_depth.go +43 -43
  109. package/linthost/rules_max_lines.go +53 -53
  110. package/linthost/rules_max_lines_per_function.go +28 -28
  111. package/linthost/rules_max_nested_callbacks.go +26 -26
  112. package/linthost/rules_max_params.go +20 -20
  113. package/linthost/rules_max_statements.go +29 -29
  114. package/linthost/rules_nextjs.go +5 -5
  115. package/linthost/rules_no_else_return.go +38 -38
  116. package/linthost/rules_no_empty_named_blocks.go +45 -45
  117. package/linthost/rules_no_import_assign.go +96 -96
  118. package/linthost/rules_no_invalid_this.go +19 -19
  119. package/linthost/rules_no_loop_func.go +43 -43
  120. package/linthost/rules_no_magic_numbers.go +60 -60
  121. package/linthost/rules_no_mixed_operators.go +44 -44
  122. package/linthost/rules_no_param_reassign.go +64 -64
  123. package/linthost/rules_no_restricted_imports.go +45 -45
  124. package/linthost/rules_no_restricted_syntax.go +17 -17
  125. package/linthost/rules_no_shadow.go +112 -112
  126. package/linthost/rules_no_unreachable.go +36 -36
  127. package/linthost/rules_no_useless_assignment.go +79 -79
  128. package/linthost/rules_no_useless_constructor.go +167 -167
  129. package/linthost/rules_no_useless_return.go +28 -28
  130. package/linthost/rules_prefer_arrow_callback.go +74 -74
  131. package/linthost/rules_prefer_destructuring.go +61 -61
  132. package/linthost/rules_prefer_named_capture_group.go +87 -87
  133. package/linthost/rules_prefer_rest_params.go +61 -61
  134. package/linthost/rules_promise.go +800 -800
  135. package/linthost/rules_react.go +600 -600
  136. package/linthost/rules_react_extras.go +162 -162
  137. package/linthost/rules_react_hooks.go +2 -2
  138. package/linthost/rules_react_perf.go +231 -231
  139. package/linthost/rules_regexp.go +293 -293
  140. package/linthost/rules_security.go +613 -613
  141. package/linthost/rules_sort_imports.go +37 -37
  142. package/linthost/rules_sort_keys.go +88 -88
  143. package/linthost/rules_suggestions.go +13 -0
  144. package/linthost/rules_ts.go +2 -2
  145. package/linthost/rules_ts_async.go +247 -247
  146. package/linthost/rules_ts_class_literal_property_style.go +64 -64
  147. package/linthost/rules_ts_consistent_type_exports.go +209 -209
  148. package/linthost/rules_ts_explicit_function_return_type.go +35 -35
  149. package/linthost/rules_ts_extra.go +6 -2
  150. package/linthost/rules_ts_no_base_to_string.go +140 -140
  151. package/linthost/rules_ts_no_confusing_void.go +28 -28
  152. package/linthost/rules_ts_no_deprecated.go +110 -110
  153. package/linthost/rules_ts_no_for_in_array.go +45 -45
  154. package/linthost/rules_ts_no_magic_numbers.go +67 -67
  155. package/linthost/rules_ts_no_meaningless_void_operator.go +44 -44
  156. package/linthost/rules_ts_no_misused_spread.go +64 -64
  157. package/linthost/rules_ts_no_redundant_type_constituents.go +72 -72
  158. package/linthost/rules_ts_no_restricted_types.go +28 -28
  159. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +87 -87
  160. package/linthost/rules_ts_no_unnecessary_condition.go +184 -184
  161. package/linthost/rules_ts_no_unnecessary_qualifier.go +72 -72
  162. package/linthost/rules_ts_no_unnecessary_template_expression.go +120 -120
  163. package/linthost/rules_ts_no_unnecessary_type_arguments.go +171 -171
  164. package/linthost/rules_ts_no_unnecessary_type_assertion.go +90 -90
  165. package/linthost/rules_ts_no_unsafe_argument.go +50 -50
  166. package/linthost/rules_ts_no_unsafe_assignment.go +60 -60
  167. package/linthost/rules_ts_no_unsafe_call.go +40 -40
  168. package/linthost/rules_ts_no_unsafe_enum_comparison.go +147 -147
  169. package/linthost/rules_ts_no_unsafe_member_access.go +29 -29
  170. package/linthost/rules_ts_no_unsafe_return.go +64 -64
  171. package/linthost/rules_ts_no_unsafe_unary_minus.go +42 -42
  172. package/linthost/rules_ts_no_useless_constructor.go +20 -20
  173. package/linthost/rules_ts_non_nullable_type_assertion_style.go +60 -60
  174. package/linthost/rules_ts_parameter_properties.go +10 -10
  175. package/linthost/rules_ts_prefer_find.go +116 -116
  176. package/linthost/rules_ts_prefer_includes.go +173 -173
  177. package/linthost/rules_ts_prefer_nullish_coalescing.go +54 -54
  178. package/linthost/rules_ts_prefer_optional_chain.go +156 -156
  179. package/linthost/rules_ts_prefer_promise_reject_errors.go +104 -104
  180. package/linthost/rules_ts_prefer_readonly.go +31 -31
  181. package/linthost/rules_ts_prefer_reduce_type_parameter.go +74 -74
  182. package/linthost/rules_ts_prefer_regexp_exec.go +69 -69
  183. package/linthost/rules_ts_prefer_return_this_type.go +79 -79
  184. package/linthost/rules_ts_prefer_string_starts_ends_with.go +237 -237
  185. package/linthost/rules_ts_promise_function_async.go +41 -41
  186. package/linthost/rules_ts_related_getter_setter_pairs.go +61 -61
  187. package/linthost/rules_ts_require_array_sort_compare.go +58 -58
  188. package/linthost/rules_ts_restrict_plus_operands.go +82 -82
  189. package/linthost/rules_ts_restrict_template_expressions.go +50 -50
  190. package/linthost/rules_ts_simple.go +249 -249
  191. package/linthost/rules_ts_sort_type_constituents.go +88 -88
  192. package/linthost/rules_ts_strict_boolean_expressions.go +103 -103
  193. package/linthost/rules_ts_switch_exhaustiveness_check.go +90 -90
  194. package/linthost/rules_ts_unbound_method.go +65 -65
  195. package/linthost/rules_tsdoc.go +88 -88
  196. package/linthost/rules_unicorn_better_regex.go +1 -1
  197. package/linthost/rules_unicorn_catch_error_name.go +19 -19
  198. package/linthost/rules_unicorn_consistent_assert.go +20 -20
  199. package/linthost/rules_unicorn_consistent_date_clone.go +27 -27
  200. package/linthost/rules_unicorn_consistent_destructuring.go +3 -3
  201. package/linthost/rules_unicorn_consistent_empty_array_spread.go +34 -34
  202. package/linthost/rules_unicorn_consistent_existence_index_check.go +42 -42
  203. package/linthost/rules_unicorn_consistent_function_scoping.go +3 -3
  204. package/linthost/rules_unicorn_consistent_template_literal_escape.go +3 -3
  205. package/linthost/rules_unicorn_custom_error_definition.go +92 -92
  206. package/linthost/rules_unicorn_empty_brace_spaces.go +47 -47
  207. package/linthost/rules_unicorn_error_message.go +34 -34
  208. package/linthost/rules_unicorn_escape_case.go +14 -14
  209. package/linthost/rules_unicorn_expiring_todo_comments.go +36 -36
  210. package/linthost/rules_unicorn_explicit_length_check.go +51 -51
  211. package/linthost/rules_unicorn_filename_case.go +1 -1
  212. package/linthost/rules_unicorn_import_style.go +1 -1
  213. package/linthost/rules_unicorn_isolated_functions.go +2 -2
  214. package/linthost/rules_unicorn_new_for_builtins.go +49 -49
  215. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +31 -31
  216. package/linthost/rules_unicorn_no_accessor_recursion.go +69 -69
  217. package/linthost/rules_unicorn_no_anonymous_default_export.go +40 -40
  218. package/linthost/rules_unicorn_no_array_callback_reference.go +33 -33
  219. package/linthost/rules_unicorn_no_array_for_each.go +14 -14
  220. package/linthost/rules_unicorn_no_array_method_this_argument.go +29 -29
  221. package/linthost/rules_unicorn_no_array_reduce.go +15 -15
  222. package/linthost/rules_unicorn_no_array_reverse.go +17 -17
  223. package/linthost/rules_unicorn_no_array_sort.go +17 -17
  224. package/linthost/rules_unicorn_no_await_expression_member.go +12 -12
  225. package/linthost/rules_unicorn_no_await_in_promise_methods.go +38 -38
  226. package/linthost/rules_unicorn_no_console_spaces.go +30 -30
  227. package/linthost/rules_unicorn_no_document_cookie.go +13 -13
  228. package/linthost/rules_unicorn_no_empty_file.go +16 -16
  229. package/linthost/rules_unicorn_no_for_loop.go +58 -58
  230. package/linthost/rules_unicorn_no_hex_escape.go +11 -11
  231. package/linthost/rules_unicorn_no_immediate_mutation.go +55 -55
  232. package/linthost/rules_unicorn_no_instanceof_builtins.go +34 -34
  233. package/linthost/rules_unicorn_no_invalid_fetch_options.go +52 -52
  234. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +25 -25
  235. package/linthost/rules_unicorn_no_keyword_prefix.go +56 -56
  236. package/linthost/rules_unicorn_no_lonely_if.go +21 -21
  237. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +22 -22
  238. package/linthost/rules_unicorn_no_named_default.go +25 -25
  239. package/linthost/rules_unicorn_no_negated_condition.go +54 -54
  240. package/linthost/rules_unicorn_no_negation_in_equality_check.go +23 -23
  241. package/linthost/rules_unicorn_no_nested_ternary.go +15 -15
  242. package/linthost/rules_unicorn_no_new_array.go +5 -5
  243. package/linthost/rules_unicorn_no_new_buffer.go +5 -5
  244. package/linthost/rules_unicorn_no_null.go +2 -2
  245. package/linthost/rules_unicorn_no_object_as_default_parameter.go +19 -19
  246. package/linthost/rules_unicorn_no_process_exit.go +17 -17
  247. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +29 -29
  248. package/linthost/rules_unicorn_no_static_only_class.go +27 -27
  249. package/linthost/rules_unicorn_no_thenable.go +47 -47
  250. package/linthost/rules_unicorn_no_this_assignment.go +10 -10
  251. package/linthost/rules_unicorn_no_typeof_undefined.go +31 -31
  252. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +23 -23
  253. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +37 -37
  254. package/linthost/rules_unicorn_no_unnecessary_await.go +24 -24
  255. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +22 -22
  256. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +67 -67
  257. package/linthost/rules_unicorn_no_unreadable_iife.go +22 -22
  258. package/linthost/rules_unicorn_no_useless_collection_argument.go +34 -34
  259. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +18 -18
  260. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +49 -49
  261. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +41 -41
  262. package/linthost/rules_unicorn_no_useless_length_check.go +82 -82
  263. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +42 -42
  264. package/linthost/rules_unicorn_no_useless_spread.go +38 -38
  265. package/linthost/rules_unicorn_no_useless_switch_case.go +29 -29
  266. package/linthost/rules_unicorn_no_useless_undefined.go +25 -25
  267. package/linthost/rules_unicorn_no_zero_fractions.go +17 -17
  268. package/linthost/rules_unicorn_number_literal_case.go +33 -33
  269. package/linthost/rules_unicorn_numeric_separators_style.go +36 -36
  270. package/linthost/rules_unicorn_prefer_add_event_listener.go +30 -30
  271. package/linthost/rules_unicorn_prefer_array_find.go +27 -27
  272. package/linthost/rules_unicorn_prefer_array_flat.go +25 -25
  273. package/linthost/rules_unicorn_prefer_array_flat_map.go +37 -37
  274. package/linthost/rules_unicorn_prefer_array_index_of.go +108 -108
  275. package/linthost/rules_unicorn_prefer_array_some.go +43 -43
  276. package/linthost/rules_unicorn_prefer_at.go +42 -42
  277. package/linthost/rules_unicorn_prefer_bigint_literals.go +42 -42
  278. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +15 -15
  279. package/linthost/rules_unicorn_prefer_class_fields.go +57 -57
  280. package/linthost/rules_unicorn_prefer_classlist_toggle.go +76 -76
  281. package/linthost/rules_unicorn_prefer_code_point.go +21 -21
  282. package/linthost/rules_unicorn_prefer_date_now.go +47 -47
  283. package/linthost/rules_unicorn_prefer_default_parameters.go +96 -96
  284. package/linthost/rules_unicorn_prefer_dom_node_append.go +14 -14
  285. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +27 -27
  286. package/linthost/rules_unicorn_prefer_dom_node_remove.go +17 -17
  287. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +11 -11
  288. package/linthost/rules_unicorn_prefer_event_target.go +10 -10
  289. package/linthost/rules_unicorn_prefer_export_from.go +99 -99
  290. package/linthost/rules_unicorn_prefer_global_this.go +91 -91
  291. package/linthost/rules_unicorn_prefer_import_meta_properties.go +38 -38
  292. package/linthost/rules_unicorn_prefer_includes.go +108 -108
  293. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +37 -37
  294. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +10 -10
  295. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +20 -20
  296. package/linthost/rules_unicorn_prefer_math_min_max.go +33 -33
  297. package/linthost/rules_unicorn_prefer_math_trunc.go +32 -32
  298. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +18 -18
  299. package/linthost/rules_unicorn_prefer_modern_math_apis.go +38 -38
  300. package/linthost/rules_unicorn_prefer_module.go +22 -22
  301. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +73 -73
  302. package/linthost/rules_unicorn_prefer_negative_index.go +46 -46
  303. package/linthost/rules_unicorn_prefer_node_protocol.go +90 -90
  304. package/linthost/rules_unicorn_prefer_number_properties.go +57 -57
  305. package/linthost/rules_unicorn_prefer_object_from_entries.go +26 -26
  306. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +24 -24
  307. package/linthost/rules_unicorn_prefer_prototype_methods.go +25 -25
  308. package/linthost/rules_unicorn_prefer_query_selector.go +25 -25
  309. package/linthost/rules_unicorn_prefer_reflect_apply.go +10 -10
  310. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +47 -47
  311. package/linthost/rules_unicorn_prefer_response_static_json.go +26 -26
  312. package/linthost/rules_unicorn_prefer_set_has.go +16 -16
  313. package/linthost/rules_unicorn_prefer_set_size.go +22 -22
  314. package/linthost/rules_unicorn_prefer_simple_condition_first.go +3 -3
  315. package/linthost/rules_unicorn_prefer_single_call.go +59 -59
  316. package/linthost/rules_unicorn_prefer_spread.go +24 -24
  317. package/linthost/rules_unicorn_prefer_string_raw.go +12 -12
  318. package/linthost/rules_unicorn_prefer_string_replace_all.go +46 -46
  319. package/linthost/rules_unicorn_prefer_string_slice.go +17 -17
  320. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +104 -104
  321. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +21 -21
  322. package/linthost/rules_unicorn_prefer_structured_clone.go +36 -36
  323. package/linthost/rules_unicorn_prefer_switch.go +65 -65
  324. package/linthost/rules_unicorn_prefer_ternary.go +35 -35
  325. package/linthost/rules_unicorn_prefer_top_level_await.go +34 -34
  326. package/linthost/rules_unicorn_prefer_type_error.go +84 -84
  327. package/linthost/rules_unicorn_prevent_abbreviations.go +68 -68
  328. package/linthost/rules_unicorn_relative_url_style.go +19 -19
  329. package/linthost/rules_unicorn_require_array_join_separator.go +18 -18
  330. package/linthost/rules_unicorn_require_module_attributes.go +25 -25
  331. package/linthost/rules_unicorn_require_module_specifiers.go +28 -28
  332. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +18 -18
  333. package/linthost/rules_unicorn_require_post_message_target_origin.go +18 -18
  334. package/linthost/rules_unicorn_string_content.go +1 -1
  335. package/linthost/rules_unicorn_switch_case_braces.go +16 -16
  336. package/linthost/rules_unicorn_switch_case_break_position.go +3 -3
  337. package/linthost/rules_unicorn_template_indent.go +1 -1
  338. package/linthost/rules_unicorn_text_encoding_identifier_case.go +36 -36
  339. package/linthost/rules_unicorn_throw_new_error.go +30 -30
  340. package/linthost/rules_var.go +273 -3
  341. package/package.json +3 -3
  342. package/src/defaultFormat.ts +11 -7
  343. package/src/structures/ITtscLintConfig.ts +5 -5
  344. package/src/structures/TtscLintRuleSetting.ts +19 -19
  345. package/src/structures/{ITtscLintFormat.ts → format/ITtscLintFormat.ts} +48 -75
  346. package/src/structures/format/ITtscLintFormatJsDoc.ts +16 -0
  347. package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
  348. package/src/structures/format/index.ts +3 -0
  349. package/src/structures/index.ts +1 -1
  350. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +20 -31
  351. package/src/structures/rules/ITtscLintBoundariesRules.ts +32 -36
  352. package/src/structures/rules/ITtscLintContributorRules.ts +6 -7
  353. package/src/structures/rules/ITtscLintCoreRules.ts +380 -408
  354. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +5 -5
  355. package/src/structures/rules/ITtscLintCypressRules.ts +34 -38
  356. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +28 -41
  357. package/src/structures/rules/ITtscLintFunctionalRules.ts +51 -56
  358. package/src/structures/rules/ITtscLintJestRules.ts +63 -74
  359. package/src/structures/rules/ITtscLintJsdocRules.ts +47 -54
  360. package/src/structures/rules/ITtscLintJsxA11yRules.ts +94 -102
  361. package/src/structures/rules/ITtscLintNextjsRules.ts +50 -55
  362. package/src/structures/rules/ITtscLintPlaywrightRules.ts +104 -122
  363. package/src/structures/rules/ITtscLintPromiseRules.ts +62 -71
  364. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +4 -4
  365. package/src/structures/rules/ITtscLintReactPerfRules.ts +17 -19
  366. package/src/structures/rules/ITtscLintReactRuleOptions.ts +8 -10
  367. package/src/structures/rules/ITtscLintReactRules.ts +91 -104
  368. package/src/structures/rules/ITtscLintRegexpRules.ts +46 -54
  369. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +7 -8
  370. package/src/structures/rules/ITtscLintSecurityRules.ts +45 -52
  371. package/src/structures/rules/ITtscLintSolidRules.ts +53 -56
  372. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +3 -4
  373. package/src/structures/rules/ITtscLintStorybookRules.ts +60 -69
  374. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +31 -37
  375. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +2 -3
  376. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +102 -119
  377. package/src/structures/rules/ITtscLintTypeScriptRules.ts +460 -518
  378. package/src/structures/rules/ITtscLintVitestRules.ts +43 -51
  379. package/lib/structures/ITtscLintFormat.js.map +0 -1
  380. /package/lib/structures/{ITtscLintFormat.js → format/ITtscLintFormat.js} +0 -0
@@ -59,35 +59,63 @@ func (formatQuotes) Check(ctx *Context, node *shimast.Node) {
59
59
  }
60
60
  src := ctx.File.Text()
61
61
  raw := src[pos:end]
62
+ isDouble := raw[0] == '"' && raw[len(raw)-1] == '"'
63
+ isSingle := raw[0] == '\'' && raw[len(raw)-1] == '\''
64
+ if !isDouble && !isSingle {
65
+ return
66
+ }
67
+ inner := raw[1 : len(raw)-1]
68
+
69
+ // Prettier's quote rule chooses the quote that yields fewer escapes and
70
+ // only falls back to the configured preference on a tie. So the rule
71
+ // must inspect both directions regardless of the literal's current
72
+ // quote: a double-quoted `"\""` (one escape) is rewritten to single
73
+ // `'"'` (zero escapes) even under prefer:"double", and symmetrically a
74
+ // single-quoted literal flips to double when double is strictly cheaper
75
+ // even under prefer:"single". On a tie the preferred quote wins, which
76
+ // for a literal already in the preferred quote means no edit (keeping
77
+ // the rule idempotent).
62
78
  if preferSingle {
63
- if raw[0] != '"' || raw[len(raw)-1] != '"' {
79
+ if isDouble {
80
+ // Tie resolves to single (the preference), so convert whenever
81
+ // single is no worse, exactly convertDoubleQuotedToSingle's `ok`.
82
+ converted, ok := convertDoubleQuotedToSingle(inner)
83
+ if ok && converted != raw {
84
+ ctx.ReportRangeFix(pos, end, "Strings must use single quotes.",
85
+ TextEdit{Pos: pos, End: end, Text: converted})
86
+ }
64
87
  return
65
88
  }
66
- converted, ok := convertDoubleQuotedToSingle(raw[1 : len(raw)-1])
67
- if !ok || converted == raw {
68
- return
89
+ // Already single: only flip to double when double is STRICTLY cheaper,
90
+ // so a tie keeps the preferred single quote.
91
+ escapedSingle, unescapedDouble := countSingleEscapes(inner)
92
+ if unescapedDouble < escapedSingle {
93
+ if converted, ok := convertSingleQuotedToDouble(inner); ok && converted != raw {
94
+ ctx.ReportRangeFix(pos, end, "Strings must use double quotes.",
95
+ TextEdit{Pos: pos, End: end, Text: converted})
96
+ }
69
97
  }
70
- ctx.ReportRangeFix(
71
- pos,
72
- end,
73
- "Strings must use single quotes.",
74
- TextEdit{Pos: pos, End: end, Text: converted},
75
- )
76
98
  return
77
99
  }
78
- if raw[0] != '\'' || raw[len(raw)-1] != '\'' {
100
+ if isSingle {
101
+ // Tie resolves to double (the preference), so convert whenever double
102
+ // is no worse, exactly convertSingleQuotedToDouble's `ok`.
103
+ converted, ok := convertSingleQuotedToDouble(inner)
104
+ if ok && converted != raw {
105
+ ctx.ReportRangeFix(pos, end, "Strings must use double quotes.",
106
+ TextEdit{Pos: pos, End: end, Text: converted})
107
+ }
79
108
  return
80
109
  }
81
- converted, ok := convertSingleQuotedToDouble(raw[1 : len(raw)-1])
82
- if !ok || converted == raw {
83
- return
110
+ // Already double: only flip to single when single is STRICTLY cheaper,
111
+ // so a tie keeps the preferred double quote.
112
+ escapedDouble, unescapedSingle := countDoubleEscapes(inner)
113
+ if unescapedSingle < escapedDouble {
114
+ if converted, ok := convertDoubleQuotedToSingle(inner); ok && converted != raw {
115
+ ctx.ReportRangeFix(pos, end, "Strings must use single quotes.",
116
+ TextEdit{Pos: pos, End: end, Text: converted})
117
+ }
84
118
  }
85
- ctx.ReportRangeFix(
86
- pos,
87
- end,
88
- "Strings must use double quotes.",
89
- TextEdit{Pos: pos, End: end, Text: converted},
90
- )
91
119
  }
92
120
 
93
121
  // convertDoubleQuotedToSingle walks the inner text of a double-quoted
@@ -133,14 +161,25 @@ func convertDoubleQuotedToSingle(inner string) (string, bool) {
133
161
  return b.String(), true
134
162
  }
135
163
 
136
- // countDoubleEscapes returns the number of `\"` sequences and bare `'`
137
- // bytes inside a double-quoted literal's text. Pairs with
138
- // countSingleEscapes.
164
+ // countDoubleEscapes returns, for a double-quoted literal's text, the
165
+ // escape cost of each quote style: `escapedDouble` is how many `"` are
166
+ // escaped today, `unescapedSingle` is how many `'` characters the value
167
+ // holds (each would need escaping if the literal were single-quoted).
168
+ // Pairs with countSingleEscapes.
169
+ //
170
+ // A `'` reaches the value two ways inside double quotes: bare (`'`) or as
171
+ // a redundant escape (`\'`). Both are a single-quote character in the
172
+ // cooked string, so both count toward unescapedSingle, otherwise a
173
+ // literal like `"a\'b"` looks like a 0-vs-0 tie and flips to single,
174
+ // where Prettier keeps double because single would cost the one escape.
139
175
  func countDoubleEscapes(inner string) (escapedDouble, unescapedSingle int) {
140
176
  for i := 0; i < len(inner); {
141
177
  if inner[i] == '\\' && i+1 < len(inner) {
142
- if inner[i+1] == '"' {
178
+ switch inner[i+1] {
179
+ case '"':
143
180
  escapedDouble++
181
+ case '\'':
182
+ unescapedSingle++
144
183
  }
145
184
  i += 2
146
185
  continue
@@ -196,15 +235,22 @@ func convertSingleQuotedToDouble(inner string) (string, bool) {
196
235
  return b.String(), true
197
236
  }
198
237
 
199
- // countSingleEscapes returns the number of `\'` sequences and bare `"`
200
- // bytes inside a single-quoted literal's text. Pairs with
201
- // countDoubleEscapes; the names describe what they count (the quote kind
202
- // that's been escape-prefixed).
238
+ // countSingleEscapes is the mirror of countDoubleEscapes for a
239
+ // single-quoted literal's text: `escapedSingle` is how many `'` are
240
+ // escaped today, `unescapedDouble` is how many `"` characters the value
241
+ // holds (each would need escaping if the literal were double-quoted). A
242
+ // `"` reaches the value either bare (`"`) or as a redundant escape
243
+ // (`\"`), and both count toward unescapedDouble so a literal like
244
+ // `'a\"b'` does not look like a tie and flip to double, Prettier keeps
245
+ // single because double would cost the one escape.
203
246
  func countSingleEscapes(inner string) (escapedSingle, unescapedDouble int) {
204
247
  for i := 0; i < len(inner); {
205
248
  if inner[i] == '\\' && i+1 < len(inner) {
206
- if inner[i+1] == '\'' {
249
+ switch inner[i+1] {
250
+ case '\'':
207
251
  escapedSingle++
252
+ case '"':
253
+ unescapedDouble++
208
254
  }
209
255
  i += 2
210
256
  continue
@@ -43,6 +43,16 @@ func (formatSemi) Visits() []shimast.Kind {
43
43
  shimast.KindExportAssignment,
44
44
  shimast.KindPropertyDeclaration,
45
45
  shimast.KindTypeAliasDeclaration,
46
+ // Interface / type-literal members. Prettier drops their trailing
47
+ // `;` under semi:false when they are newline-separated; see
48
+ // stripMemberSemicolon for the per-context hazard rules.
49
+ shimast.KindPropertySignature,
50
+ shimast.KindMethodSignature,
51
+ shimast.KindIndexSignature,
52
+ shimast.KindCallSignature,
53
+ shimast.KindConstructSignature,
54
+ shimast.KindGetAccessor,
55
+ shimast.KindSetAccessor,
46
56
  }
47
57
  }
48
58
 
@@ -59,6 +69,21 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
59
69
  if end <= 0 || end > len(src) {
60
70
  return
61
71
  }
72
+ // Interface / type-literal members and class fields carry their own
73
+ // ASI rules, distinct from top-level statements, so the never
74
+ // direction routes through a dedicated stripper. Class fields keep
75
+ // their existing always-direction insertion (falling through below);
76
+ // inserting a missing interface/type member terminator is out of scope
77
+ // for this strip fix, so type members short-circuit in always mode.
78
+ isClassField := node.Kind == shimast.KindPropertyDeclaration
79
+ isTypeMember := isTypeMemberKind(node.Kind)
80
+ if preferNever && (isClassField || isTypeMember) {
81
+ stripMemberSemicolon(ctx, src, node, isClassField)
82
+ return
83
+ }
84
+ if isTypeMember {
85
+ return
86
+ }
62
87
  hasSemi := src[end-1] == ';'
63
88
  if preferNever {
64
89
  if !hasSemi {
@@ -66,7 +91,7 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
66
91
  }
67
92
  if !preferNeverSafeKind(node.Kind) {
68
93
  // Dropping the `;` after a class field or a type alias can
69
- // change parse e.g. `class A { x: number; [k](): void {} }`
94
+ // change parse, e.g. `class A { x: number; [k](): void {} }`
70
95
  // would reparse `[k]` as a computed index access on `number`.
71
96
  // Keep the terminator on those kinds even in prefer:"never"
72
97
  // mode.
@@ -96,7 +121,7 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
96
121
  }
97
122
  // Diagnostic anchors on the last character of the statement so the
98
123
  // banner underlines "the place a semicolon should follow". The fix
99
- // itself is a zero-width insertion at node.End() keeping the edit
124
+ // itself is a zero-width insertion at node.End(), keeping the edit
100
125
  // disjoint from any other rule's edits on the same statement.
101
126
  pos := end - 1
102
127
  if pos < 0 {
@@ -119,11 +144,14 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
119
144
  //
120
145
  // Hazard tokens per the ASI spec:
121
146
  //
122
- // - `[` — bracket access continues an expression
123
- // - `(` — call expression continues
124
- // - “ ` tagged template literal continues
125
- // - `+`, `-`, `*`, `/` — binary operator continues
126
- // - `,` — comma operator continues
147
+ // - `[`: bracket access continues an expression
148
+ // - `(`: call expression continues
149
+ // - “ ` “: tagged template literal continues
150
+ // - `+`, `-`, `*`: binary operator continues
151
+ // - `,`: comma operator continues
152
+ // - `/`: division operator or regex literal continues; handled by
153
+ // the comment-or-regex branch below (a leading `//` or `/*` is not a
154
+ // hazard, a bare `/` is), so it is absent from the token switch.
127
155
  func nextStatementHasASIHazard(src string, end int) bool {
128
156
  for i := end; i < len(src); i++ {
129
157
  c := src[i]
@@ -147,11 +175,18 @@ func nextStatementHasASIHazard(src string, end int) bool {
147
175
  }
148
176
  continue
149
177
  }
150
- // bare `/` starts a regex literal or division hazard.
178
+ // bare `/` starts a regex literal or division, hazard.
151
179
  return true
152
180
  }
153
181
  switch c {
154
- case '[', '(', '`', '+', '-', '*', ',':
182
+ // If the next significant byte is one of these, dropping the terminator
183
+ // could let the following line re-associate with the prior expression.
184
+ // `( [`, a unary `+ -`, and a tagged-template backtick are the cases
185
+ // actually reachable from a valid statement start; `<` matters in .tsx
186
+ // (a leading `<` opens a JSX element). The remaining infix bytes cannot
187
+ // begin a valid statement on their own, but are listed defensively so
188
+ // the strip always cedes rather than risk a parse-changing edit.
189
+ case '[', '(', '`', '+', '-', '*', ',', '.', '<', '>', '=', '?', '%', '&', '|', '^':
155
190
  return true
156
191
  }
157
192
  return false
@@ -179,12 +214,152 @@ func preferNeverSafeKind(kind shimast.Kind) bool {
179
214
  shimast.KindImportDeclaration,
180
215
  shimast.KindImportEqualsDeclaration,
181
216
  shimast.KindExportDeclaration,
182
- shimast.KindExportAssignment:
217
+ shimast.KindExportAssignment,
218
+ // `type T = …;` is a statement-position declaration; Prettier drops
219
+ // its terminator under semi:false. The nextStatementHasASIHazard
220
+ // guard keeps it whenever removal would let ASI mis-associate the
221
+ // following statement (e.g. a leading `(`/`[`).
222
+ shimast.KindTypeAliasDeclaration:
183
223
  return true
184
224
  }
185
225
  return false
186
226
  }
187
227
 
228
+ // isTypeMemberKind reports whether `kind` is an interface or
229
+ // object-type-literal member whose trailing `;` Prettier strips under
230
+ // semi:false. Class fields (KindPropertyDeclaration) are handled
231
+ // separately because their initializer is an expression and so they
232
+ // carry the full expression-ASI hazard set, while type members only
233
+ // risk a call/construct-signature (`(`) or generic-call-signature (`<`)
234
+ // continuation.
235
+ func isTypeMemberKind(kind shimast.Kind) bool {
236
+ switch kind {
237
+ case
238
+ shimast.KindPropertySignature,
239
+ shimast.KindMethodSignature,
240
+ shimast.KindIndexSignature,
241
+ shimast.KindCallSignature,
242
+ shimast.KindConstructSignature,
243
+ shimast.KindGetAccessor,
244
+ shimast.KindSetAccessor:
245
+ return true
246
+ }
247
+ return false
248
+ }
249
+
250
+ // stripMemberSemicolon removes a redundant trailing `;` from an
251
+ // interface / type-literal member or a class field under semi:false.
252
+ //
253
+ // The member-terminating `;` is located robustly: typescript-go parses
254
+ // the terminator as a separate token (parseTypeMemberSemicolon /
255
+ // parseSemicolonAfterPropertyName run after finishNode), so a member
256
+ // node's End() may sit before the `;`. Accept either a `;` already at
257
+ // End()-1 or the first `;` reached scanning horizontal whitespace
258
+ // forward from End().
259
+ //
260
+ // The `;` is dropped only when it is redundant, see
261
+ // memberSemicolonRedundant, so single-line separators stay intact and
262
+ // ASI-hazardous continuations keep their terminator. Idempotent: once
263
+ // removed, no `;` remains for the rule to act on.
264
+ func stripMemberSemicolon(ctx *Context, src string, node *shimast.Node, isClassField bool) {
265
+ end := node.End()
266
+ semiPos := -1
267
+ if end-1 >= 0 && src[end-1] == ';' {
268
+ semiPos = end - 1
269
+ } else {
270
+ i := end
271
+ for i < len(src) && (src[i] == ' ' || src[i] == '\t') {
272
+ i++
273
+ }
274
+ if i < len(src) && src[i] == ';' {
275
+ semiPos = i
276
+ }
277
+ }
278
+ if semiPos < 0 {
279
+ return
280
+ }
281
+ if !memberSemicolonRedundant(src, semiPos+1, isClassField) {
282
+ return
283
+ }
284
+ ctx.ReportRangeFix(
285
+ semiPos,
286
+ semiPos+1,
287
+ "Unexpected trailing semicolon.",
288
+ TextEdit{Pos: semiPos, End: semiPos + 1, Text: ""},
289
+ )
290
+ }
291
+
292
+ // memberSemicolonRedundant reports whether the member terminator `;`
293
+ // whose following byte is at `after` can be dropped without changing the
294
+ // parse. It scans past trivia (whitespace + comments) to the next
295
+ // significant byte and applies Prettier's semi:false member rules:
296
+ //
297
+ // - The closing `}` (or end of file) always makes the `;` redundant.
298
+ // - A next member on the SAME line (no newline crossed) keeps the `;`
299
+ // as a required separator, the rule never inserts the newline that
300
+ // would let ASI take over, so dropping it here would corrupt the
301
+ // source.
302
+ // - A newline-separated next member drops the `;` unless its lead token
303
+ // would re-associate with the prior member: the full expression-ASI
304
+ // hazard set for class fields (`[ ( ` + - * / ,`), or just a
305
+ // call/construct/generic signature (`(` / `<`) for type members
306
+ // (a leading `[` is an index signature there, not a continuation).
307
+ func memberSemicolonRedundant(src string, after int, isClassField bool) bool {
308
+ sawNewline := false
309
+ for i := after; i < len(src); {
310
+ c := src[i]
311
+ if c == '\n' {
312
+ sawNewline = true
313
+ i++
314
+ continue
315
+ }
316
+ if c == ' ' || c == '\t' || c == '\r' {
317
+ i++
318
+ continue
319
+ }
320
+ if c == '/' && i+1 < len(src) {
321
+ if src[i+1] == '/' {
322
+ for i < len(src) && src[i] != '\n' {
323
+ i++
324
+ }
325
+ continue
326
+ }
327
+ if src[i+1] == '*' {
328
+ i += 2
329
+ for i+1 < len(src) && !(src[i] == '*' && src[i+1] == '/') {
330
+ if src[i] == '\n' {
331
+ sawNewline = true
332
+ }
333
+ i++
334
+ }
335
+ if i+1 < len(src) {
336
+ i += 2
337
+ }
338
+ continue
339
+ }
340
+ }
341
+ if c == '}' {
342
+ return true
343
+ }
344
+ if !sawNewline {
345
+ return false
346
+ }
347
+ if isClassField {
348
+ switch c {
349
+ case '[', '(', '`', '+', '-', '*', '/', ',':
350
+ return false
351
+ }
352
+ } else {
353
+ switch c {
354
+ case '(', '<':
355
+ return false
356
+ }
357
+ }
358
+ return true
359
+ }
360
+ return true
361
+ }
362
+
188
363
  func init() {
189
364
  Register(formatSemi{})
190
365
  }