@ttsc/lint 0.14.0-dev.20260529.2 → 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 +21 -23
  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
@@ -0,0 +1,336 @@
1
+ package linthost
2
+
3
+ import (
4
+ shimast "github.com/microsoft/typescript-go/shim/ast"
5
+ shimscanner "github.com/microsoft/typescript-go/shim/scanner"
6
+ )
7
+
8
+ // formatWhitespace performs file-level text hygiene, mirroring the
9
+ // whitespace normalization Prettier applies regardless of node shape:
10
+ //
11
+ // (a) trailing whitespace (spaces, tabs, `\r`) before a `\n` is
12
+ // trimmed;
13
+ // (b) runs of two or more consecutive blank lines collapse to exactly
14
+ // one blank line (Prettier keeps at most one);
15
+ // (c) blank lines at the start of the file are removed;
16
+ // (d) blank lines at the end of the file are removed and the file is
17
+ // made to end with exactly one EOL.
18
+ //
19
+ // The rule emits targeted insert/delete TextEdits rather than a
20
+ // whole-file replacement. A whole-file replace would overlap the edits
21
+ // the structural format rules (`format/statement-split`,
22
+ // `format/indent`, `format/print-width`) produce on the same pass, and
23
+ // the applier rejects overlapping edits. Disjoint per-line edits compose
24
+ // with them cleanly.
25
+ //
26
+ // Template safety: bytes inside a template literal are significant,
27
+ // trailing spaces and blank lines there are part of the string value.
28
+ // The rule collects the byte ranges of every NoSubstitutionTemplate and
29
+ // TemplateExpression node (covering head/middle/tail spans and the
30
+ // interpolations between them) and skips any line whose terminating
31
+ // newline falls strictly inside such a range. The hygiene edits then
32
+ // only ever touch real source whitespace, never template content.
33
+ //
34
+ // Idempotent: a file that already has no trailing whitespace, at most
35
+ // one consecutive blank line, no leading/trailing blank lines, and a
36
+ // single final EOL produces no edits.
37
+ type formatWhitespace struct{}
38
+
39
+ // formatWhitespaceOptions carries only the EOL setting; the rule needs
40
+ // it to synthesize the file's final newline. Indentation is irrelevant
41
+ // here. JSON tag matches the `format` block key the config layer mirrors
42
+ // in (see `expandFormatBlock`).
43
+ type formatWhitespaceOptions struct {
44
+ EndOfLine *string `json:"endOfLine"`
45
+ }
46
+
47
+ func (formatWhitespace) Name() string { return "format/whitespace" }
48
+ func (formatWhitespace) IsFormat() bool { return true }
49
+ func (formatWhitespace) Visits() []shimast.Kind {
50
+ return []shimast.Kind{shimast.KindSourceFile}
51
+ }
52
+
53
+ func (formatWhitespace) Check(ctx *Context, node *shimast.Node) {
54
+ if ctx == nil || ctx.File == nil {
55
+ return
56
+ }
57
+ var opts formatWhitespaceOptions
58
+ _ = ctx.DecodeOptions(&opts)
59
+ eol := "\n"
60
+ if opts.EndOfLine != nil && *opts.EndOfLine == "crlf" {
61
+ eol = "\r\n"
62
+ }
63
+ src := ctx.File.Text()
64
+ if len(src) == 0 {
65
+ return
66
+ }
67
+ ranges := collectTemplateRanges(ctx.File, src)
68
+ edits := whitespaceEdits(src, eol, ranges)
69
+ if len(edits) == 0 {
70
+ return
71
+ }
72
+ ctx.ReportRangeFix(
73
+ edits[0].Pos,
74
+ edits[0].End,
75
+ "Normalize file whitespace.",
76
+ edits...,
77
+ )
78
+ }
79
+
80
+ // byteRange is a half-open [pos, end) span of source bytes.
81
+ type byteRange struct {
82
+ pos int
83
+ end int
84
+ }
85
+
86
+ // inTemplate reports whether byte offset `i` lies strictly inside any
87
+ // collected template-literal range. Strict containment (`i > pos`) lets
88
+ // a newline that merely abuts a template boundary still be normalized
89
+ // while a newline inside the literal's body is preserved.
90
+ func inTemplate(ranges []byteRange, i int) bool {
91
+ for _, r := range ranges {
92
+ if i > r.pos && i < r.end {
93
+ return true
94
+ }
95
+ }
96
+ return false
97
+ }
98
+
99
+ // whitespaceEdits computes the disjoint insert/delete edits that realize
100
+ // operations (a)-(d). It walks the file line by line, tracking blank
101
+ // lines so it can collapse runs and strip the leading/trailing blocks,
102
+ // and it consults `ranges` so no edit touches template-literal content.
103
+ func whitespaceEdits(src, eol string, ranges []byteRange) []TextEdit {
104
+ var edits []TextEdit
105
+
106
+ // Index every line as [start, contentEnd, newlinePos). newlinePos is
107
+ // the offset of the line's terminating '\n', or len(src) for the last
108
+ // line when the file does not end in a newline. contentEnd trims the
109
+ // run of trailing spaces, tabs, and '\r' so the gap [contentEnd,
110
+ // newlinePos) is exactly the trailing-whitespace the rule strips, and
111
+ // a whitespace-only line reduces to contentEnd == start.
112
+ type lineSpan struct {
113
+ start int
114
+ contentEnd int // end of visible content (trailing whitespace trimmed)
115
+ eolStart int // offset where this line's terminator begins
116
+ newlinePos int // offset of '\n', or -1 when none (final line)
117
+ inTpl bool
118
+ }
119
+ // stripCR governs whether a line's trailing '\r' counts as trimmable
120
+ // whitespace. Under LF EOL a stray '\r' before '\n' is interior CRLF
121
+ // and must be normalized away; under CRLF EOL the '\r' is half of the
122
+ // line terminator and must be preserved, so it is never trimmed and the
123
+ // deletion stops before it (eolStart points at the '\r', not the '\n').
124
+ stripCR := eol == "\n"
125
+ var lines []lineSpan
126
+ start := 0
127
+ for i := 0; i <= len(src); i++ {
128
+ if i == len(src) || src[i] == '\n' {
129
+ newlinePos := -1
130
+ if i < len(src) {
131
+ newlinePos = i
132
+ }
133
+ inTpl := newlinePos >= 0 && inTemplate(ranges, newlinePos)
134
+ // eolStart marks where the preserved line terminator begins. Under
135
+ // CRLF a trailing '\r' immediately before the '\n' is kept, so the
136
+ // terminator (and the lower bound of any trailing-trim deletion) is
137
+ // the '\r'. Otherwise the terminator is the '\n' itself.
138
+ eolStart := i
139
+ if !stripCR && newlinePos >= 0 && i > start && src[i-1] == '\r' {
140
+ eolStart = i - 1
141
+ }
142
+ contentEnd := eolStart
143
+ // A template-interior line keeps its bytes verbatim, its trailing
144
+ // spaces are string content, so contentEnd is the raw line end.
145
+ // Real source lines trim the trailing run of spaces and tabs (and,
146
+ // under LF EOL, a stray '\r') so contentEnd marks the end of visible
147
+ // content and a whitespace-only line reduces to contentEnd == start.
148
+ if !inTpl {
149
+ for contentEnd > start {
150
+ c := src[contentEnd-1]
151
+ if c == ' ' || c == '\t' || (stripCR && c == '\r') {
152
+ contentEnd--
153
+ continue
154
+ }
155
+ break
156
+ }
157
+ }
158
+ lines = append(lines, lineSpan{
159
+ start: start,
160
+ contentEnd: contentEnd,
161
+ eolStart: eolStart,
162
+ newlinePos: newlinePos,
163
+ inTpl: inTpl,
164
+ })
165
+ start = i + 1
166
+ }
167
+ }
168
+
169
+ isBlank := func(ls lineSpan) bool {
170
+ for i := ls.start; i < ls.contentEnd; i++ {
171
+ if src[i] != ' ' && src[i] != '\t' {
172
+ return false
173
+ }
174
+ }
175
+ return true
176
+ }
177
+
178
+ // Identify the first and last content lines (non-blank, or
179
+ // template-protected which always counts as content). Edits are kept
180
+ // disjoint by partitioning the file into three regions: the leading
181
+ // blank block [0, firstContent.start), the body [firstContent,
182
+ // lastContent], and the trailing block after lastContent.contentEnd.
183
+ firstContent := -1
184
+ lastContent := -1
185
+ for idx, ls := range lines {
186
+ if ls.inTpl || !isBlank(ls) {
187
+ if firstContent < 0 {
188
+ firstContent = idx
189
+ }
190
+ lastContent = idx
191
+ }
192
+ }
193
+ if firstContent < 0 {
194
+ // Whole file is blank: collapse to a single EOL.
195
+ if src != eol {
196
+ edits = append(edits, TextEdit{Pos: 0, End: len(src), Text: eol})
197
+ }
198
+ return dedupeAndSort(src, edits)
199
+ }
200
+
201
+ // collapsed[idx] marks a blank body line whose entire span is deleted
202
+ // by run-collapse (b); those lines must not also get a trailing-trim
203
+ // edit (a), which would overlap the deletion.
204
+ collapsed := make([]bool, len(lines))
205
+
206
+ // (b) Collapse interior runs of 2+ blank lines to one blank line. A
207
+ // run is a maximal sequence of blank, non-template lines between two
208
+ // content lines. Keep the first blank line of the run; delete the full
209
+ // span of every subsequent blank line in the run.
210
+ idx := firstContent + 1
211
+ for idx < lastContent {
212
+ if !isBlank(lines[idx]) || lines[idx].inTpl {
213
+ idx++
214
+ continue
215
+ }
216
+ runStart := idx
217
+ runEnd := idx
218
+ for runEnd+1 <= lastContent && isBlank(lines[runEnd+1]) && !lines[runEnd+1].inTpl {
219
+ runEnd++
220
+ }
221
+ if runEnd > runStart {
222
+ delFrom := lines[runStart+1].start
223
+ delTo := lines[runEnd].newlinePos + 1
224
+ if delTo > len(src) {
225
+ delTo = len(src)
226
+ }
227
+ edits = append(edits, TextEdit{Pos: delFrom, End: delTo, Text: ""})
228
+ for k := runStart + 1; k <= runEnd; k++ {
229
+ collapsed[k] = true
230
+ }
231
+ }
232
+ idx = runEnd + 1
233
+ }
234
+
235
+ // (a) Trailing-whitespace trim, for body lines only (excluding the
236
+ // last content line, whose tail is owned by (d), and collapsed lines,
237
+ // whose span is owned by (b)). Template-protected lines are skipped so
238
+ // string content survives.
239
+ for i := firstContent; i < lastContent; i++ {
240
+ ls := lines[i]
241
+ if ls.inTpl || collapsed[i] {
242
+ continue
243
+ }
244
+ // Trim only up to the preserved line terminator: eolStart is the '\n'
245
+ // under LF and the '\r' under CRLF, so a kept '\r\n' survives the
246
+ // trim while trailing spaces/tabs (and a stray '\r' under LF) go.
247
+ rawEnd := ls.eolStart
248
+ if rawEnd > ls.contentEnd {
249
+ edits = append(edits, TextEdit{Pos: ls.contentEnd, End: rawEnd, Text: ""})
250
+ }
251
+ }
252
+
253
+ // (c) Remove leading blank lines: delete from file start up to the
254
+ // first content line's start.
255
+ if lines[firstContent].start > 0 {
256
+ edits = append(edits, TextEdit{Pos: 0, End: lines[firstContent].start, Text: ""})
257
+ }
258
+
259
+ // (d) Remove trailing blank lines and any trailing whitespace on the
260
+ // last content line, then guarantee exactly one final EOL: replace
261
+ // everything after the last content line's content with a single EOL.
262
+ last := lines[lastContent]
263
+ if last.contentEnd < len(src) {
264
+ edits = append(edits, TextEdit{Pos: last.contentEnd, End: len(src), Text: eol})
265
+ } else {
266
+ // File ends exactly at content with no newline: append one.
267
+ edits = append(edits, TextEdit{Pos: len(src), End: len(src), Text: eol})
268
+ }
269
+
270
+ return dedupeAndSort(src, edits)
271
+ }
272
+
273
+ // dedupeAndSort drops no-op edits, an empty deletion of an empty range,
274
+ // or a replacement whose text already equals the bytes it covers, and
275
+ // returns the survivors ordered by position. Dropping equal-text
276
+ // replacements is what keeps the rule idempotent: a file that already
277
+ // ends in one EOL would otherwise re-emit a `\n`→`\n` edit forever. The
278
+ // applier expects disjoint edits; the construction above guarantees
279
+ // disjointness, so this only orders and prunes.
280
+ func dedupeAndSort(src string, edits []TextEdit) []TextEdit {
281
+ out := edits[:0]
282
+ for _, e := range edits {
283
+ if e.Pos == e.End && e.Text == "" {
284
+ continue
285
+ }
286
+ if e.Pos >= 0 && e.End <= len(src) && src[e.Pos:e.End] == e.Text {
287
+ continue
288
+ }
289
+ out = append(out, e)
290
+ }
291
+ // Insertion sort: edit counts here are small (proportional to blank
292
+ // runs), so a stable simple sort keeps the code obvious.
293
+ for i := 1; i < len(out); i++ {
294
+ for j := i; j > 0 && out[j-1].Pos > out[j].Pos; j-- {
295
+ out[j-1], out[j] = out[j], out[j-1]
296
+ }
297
+ }
298
+ return out
299
+ }
300
+
301
+ // collectTemplateRanges walks the file's AST and records the byte span
302
+ // of every template literal, NoSubstitutionTemplate literals and full
303
+ // TemplateExpression nodes (whose range spans the head, every
304
+ // interpolation, and the tail). Newlines inside these ranges carry
305
+ // string content and must not be touched by the whitespace edits.
306
+ func collectTemplateRanges(file *shimast.SourceFile, src string) []byteRange {
307
+ var ranges []byteRange
308
+ var walk func(node *shimast.Node)
309
+ walk = func(node *shimast.Node) {
310
+ if node == nil {
311
+ return
312
+ }
313
+ switch node.Kind {
314
+ case shimast.KindNoSubstitutionTemplateLiteral, shimast.KindTemplateExpression:
315
+ pos := shimscanner.SkipTrivia(src, node.Pos())
316
+ end := node.End()
317
+ if pos >= 0 && end <= len(src) && end > pos {
318
+ ranges = append(ranges, byteRange{pos: pos, end: end})
319
+ }
320
+ }
321
+ node.ForEachChild(func(child *shimast.Node) bool {
322
+ walk(child)
323
+ return false
324
+ })
325
+ }
326
+ if file != nil && file.Statements != nil {
327
+ for _, stmt := range file.Statements.Nodes {
328
+ walk(stmt)
329
+ }
330
+ }
331
+ return ranges
332
+ }
333
+
334
+ func init() {
335
+ Register(formatWhitespace{})
336
+ }