@ttsc/lint 0.14.0-dev.20260529.2 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +23 -25
  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 +167 -5
  68. package/linthost/print_nodes_call.go +786 -77
  69. package/linthost/print_nodes_function.go +43 -0
  70. package/linthost/print_nodes_imports.go +64 -14
  71. package/linthost/print_nodes_list.go +214 -8
  72. package/linthost/print_nodes_object.go +14 -6
  73. package/linthost/print_nodes_ternary.go +147 -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 +213 -0
  83. package/linthost/rules_format_bracket_spacing.go +117 -0
  84. package/linthost/rules_format_clause_join.go +179 -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 +180 -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 +517 -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
@@ -68,11 +68,11 @@ import "strings"
68
68
  //
69
69
  // - "all" (default) every multi-line list gets one.
70
70
  // - "es5" arrays, objects, named imports / exports get one;
71
- // call arguments, parameter lists, and type-level
72
- // lists do not — those positions accepted trailing
73
- // commas only in ES2017+, so es5 mode skips them
74
- // to match Prettier and avoid oscillating against
75
- // the formatter on every cascade pass.
71
+ // call arguments, parameter lists, and type-level
72
+ // lists do not — those positions accepted trailing
73
+ // commas only in ES2017+, so es5 mode skips them
74
+ // to match Prettier and avoid oscillating against
75
+ // the formatter on every cascade pass.
76
76
  // - "none" no list gets one.
77
77
  //
78
78
  // An empty string is treated as "all", which keeps `DefaultPrintOptions()`
@@ -192,10 +192,10 @@ func Print(doc Doc, opts PrintOptions) string {
192
192
  // Update column. A text fragment may contain embedded
193
193
  // newlines (verbatim slices). The column tracker counts
194
194
  // from the last newline.
195
- if idx := strings.LastIndex(top.doc.Text, "\n"); idx >= 0 {
196
- col = len(top.doc.Text) - idx - 1
195
+ if strings.Contains(top.doc.Text, "\n") {
196
+ col = displayWidthAfterLastNewline(top.doc.Text)
197
197
  } else {
198
- col += len(top.doc.Text)
198
+ col += displayWidth(top.doc.Text)
199
199
  }
200
200
  case docConcat:
201
201
  // Push children in reverse so they pop in source order.
@@ -241,6 +241,51 @@ func Print(doc Doc, opts PrintOptions) string {
241
241
  stack = append(stack, printFrame{indent: top.indent, mode: top.mode, doc: pick})
242
242
  case docLineSuffix:
243
243
  lineSuffix = append(lineSuffix, top.doc.Children...)
244
+ case docFill:
245
+ // Prettier's fill: lay out [content, sep, content, sep, …] packing as
246
+ // many contents per line as fit, breaking a separator only when the
247
+ // current content (or the content+sep+next-content pair) overflows.
248
+ parts := top.doc.Children
249
+ if len(parts) == 0 {
250
+ break
251
+ }
252
+ rem := opts.PrintWidth - col
253
+ content := parts[0]
254
+ contentFits := fits(content, rem, top.indent)
255
+ if len(parts) == 1 {
256
+ m := modeBreak
257
+ if contentFits {
258
+ m = modeFlat
259
+ }
260
+ stack = append(stack, printFrame{indent: top.indent, mode: m, doc: content})
261
+ break
262
+ }
263
+ sep := parts[1]
264
+ if len(parts) == 2 {
265
+ cm, sm := modeBreak, modeBreak
266
+ if contentFits {
267
+ cm, sm = modeFlat, modeFlat
268
+ }
269
+ stack = append(stack, printFrame{indent: top.indent, mode: sm, doc: sep})
270
+ stack = append(stack, printFrame{indent: top.indent, mode: cm, doc: content})
271
+ break
272
+ }
273
+ rest := Doc{Kind: docFill, Children: parts[2:]}
274
+ pairFits := fits(Concat(content, sep, parts[2]), rem, top.indent)
275
+ // Push rest (bottom), then sep, then content (top) so they render in
276
+ // order content, sep, rest.
277
+ stack = append(stack, printFrame{indent: top.indent, mode: top.mode, doc: rest})
278
+ switch {
279
+ case pairFits:
280
+ stack = append(stack, printFrame{indent: top.indent, mode: modeFlat, doc: sep})
281
+ stack = append(stack, printFrame{indent: top.indent, mode: modeFlat, doc: content})
282
+ case contentFits:
283
+ stack = append(stack, printFrame{indent: top.indent, mode: modeBreak, doc: sep})
284
+ stack = append(stack, printFrame{indent: top.indent, mode: modeFlat, doc: content})
285
+ default:
286
+ stack = append(stack, printFrame{indent: top.indent, mode: modeBreak, doc: sep})
287
+ stack = append(stack, printFrame{indent: top.indent, mode: modeBreak, doc: content})
288
+ }
244
289
  case docLine:
245
290
  if top.mode == modeFlat {
246
291
  out.WriteByte(' ')
@@ -320,7 +365,7 @@ func fits(doc Doc, remaining int, indent int) bool {
320
365
  switch top.doc.Kind {
321
366
  case docNil:
322
367
  case docText:
323
- remaining -= len(top.doc.Text)
368
+ remaining -= displayWidth(top.doc.Text)
324
369
  if remaining < 0 {
325
370
  return false
326
371
  }
@@ -364,6 +409,11 @@ func fits(doc Doc, remaining int, indent int) bool {
364
409
  pick = top.doc.Children[0]
365
410
  }
366
411
  stack = append(stack, frame{mode: top.mode, doc: pick})
412
+ case docFill:
413
+ // A fill's flat form is every content and separator flat.
414
+ for i := len(top.doc.Children) - 1; i >= 0; i-- {
415
+ stack = append(stack, frame{mode: modeFlat, doc: top.doc.Children[i]})
416
+ }
367
417
  case docLineSuffix:
368
418
  // Line suffix never contributes to flat width — it queues
369
419
  // for a future break. Skip.
@@ -416,9 +466,9 @@ func fitsFirstLine(doc Doc, remaining int) bool {
416
466
  case docText:
417
467
  if idx := strings.IndexByte(top.Text, '\n'); idx >= 0 {
418
468
  // A multi-line Text ends the first line at its first newline.
419
- return remaining-idx >= 0
469
+ return remaining-displayWidth(top.Text[:idx]) >= 0
420
470
  }
421
- remaining -= len(top.Text)
471
+ remaining -= displayWidth(top.Text)
422
472
  if remaining < 0 {
423
473
  return false
424
474
  }
@@ -488,6 +538,13 @@ func flatten(doc Doc) (Doc, bool) {
488
538
  return flattenChildren(doc.Children)
489
539
  case docConcat, docIndent, docAlign:
490
540
  return flattenChildren(doc.Children)
541
+ case docFill:
542
+ // A fill's flat form is every content and separator rendered flat (its
543
+ // Line separators collapse to spaces). Without this case flatten returned
544
+ // the live Fill unchanged, so a supposedly all-flat option still carried a
545
+ // breakable fill and a hugged numeric array (`new Float32Array([ … ])`)
546
+ // rendered with the fill broken inside unbroken brackets.
547
+ return flattenChildren(doc.Children)
491
548
  }
492
549
  return doc, true
493
550
  }
@@ -31,6 +31,13 @@ func printArrayLiteral(ctx *PrintContext, node *shimast.Node) (Doc, bool) {
31
31
  if arr == nil || arr.Elements == nil {
32
32
  return verbatim(ctx, node), !nodeSpansMultipleLines(ctx, node)
33
33
  }
34
+ // A comment between elements (or after `[`) would be dropped by the fresh
35
+ // separators; bail to verbatim and report UNCOVERED (hard `false`, not
36
+ // `!nodeSpansMultipleLines`) so an enclosing reflow abstains instead of
37
+ // breaking around this single-line verbatim array and moving it off its line.
38
+ if listHasInterItemComments(ctx, node) {
39
+ return verbatim(ctx, node), false
40
+ }
34
41
  items := make([]Doc, 0, len(arr.Elements.Nodes))
35
42
  covered := true
36
43
  for _, elem := range arr.Elements.Nodes {
@@ -47,10 +54,165 @@ func printArrayLiteral(ctx *PrintContext, node *shimast.Node) (Doc, bool) {
47
54
  // every `none` project (the trailing-comma rule wouldn't insert one
48
55
  // and the printer would put one back).
49
56
  return printList(ctx, listShape{
50
- OpenTok: "[",
51
- CloseTok: "]",
52
- Items: items,
53
- Space: false,
54
- AddComma: ctx.allowsEs5TrailingComma(),
57
+ OpenTok: "[",
58
+ CloseTok: "]",
59
+ Items: items,
60
+ Space: false,
61
+ AddComma: ctx.allowsEs5TrailingComma(),
62
+ Fill: isConciselyPrintedArray(arr.Elements.Nodes),
63
+ ForceBreak: arrayShouldForceBreak(arr.Elements.Nodes),
64
+ BlankBefore: blankBeforeItems(ctx.Source, arr.Elements.Nodes),
55
65
  }), covered
56
66
  }
67
+
68
+ // arrayShouldForceBreak reports whether an array literal takes Prettier's
69
+ // forced one-element-per-line layout even when it would fit flat: more than one
70
+ // element, every element an array or object literal carrying more than one
71
+ // child, and consecutive elements of the same kind (`[["(", ")"], ["{", "}"]]`
72
+ // and `new Map([[k, v], [k, v]])` break; a mixed `[[1, 2], { c: 3 }]` and a
73
+ // lone `[[1, 2]]` or single-child inners stay flat). Mirrors Prettier's array
74
+ // shouldBreak heuristic.
75
+ func arrayShouldForceBreak(elems []*shimast.Node) bool {
76
+ if len(elems) < 2 {
77
+ return false
78
+ }
79
+ for i, e := range elems {
80
+ if !isMultiChildArrayOrObject(e) {
81
+ return false
82
+ }
83
+ if i+1 < len(elems) && elems[i+1] != nil && elems[i+1].Kind != e.Kind {
84
+ return false
85
+ }
86
+ }
87
+ return true
88
+ }
89
+
90
+ // isMultiChildArrayOrObject reports whether `node` is an array or object literal
91
+ // with more than one element/property.
92
+ func isMultiChildArrayOrObject(node *shimast.Node) bool {
93
+ if node == nil {
94
+ return false
95
+ }
96
+ switch node.Kind {
97
+ case shimast.KindArrayLiteralExpression:
98
+ if a := node.AsArrayLiteralExpression(); a != nil && a.Elements != nil {
99
+ return len(a.Elements.Nodes) > 1
100
+ }
101
+ case shimast.KindObjectLiteralExpression:
102
+ if o := node.AsObjectLiteralExpression(); o != nil && o.Properties != nil {
103
+ return len(o.Properties.Nodes) > 1
104
+ }
105
+ }
106
+ return false
107
+ }
108
+
109
+ // arrayForcesBreak reports whether `node` is an array literal that Prettier's
110
+ // shouldBreak heuristic explodes regardless of width. The print-width rule
111
+ // consults it so its flat-fit fast path does not leave such an array inline
112
+ // when the source wrote it on one line.
113
+ func arrayForcesBreak(node *shimast.Node) bool {
114
+ if node == nil || node.Kind != shimast.KindArrayLiteralExpression {
115
+ return false
116
+ }
117
+ arr := node.AsArrayLiteralExpression()
118
+ if arr == nil || arr.Elements == nil {
119
+ return false
120
+ }
121
+ return arrayShouldForceBreak(arr.Elements.Nodes)
122
+ }
123
+
124
+ // fastPathForcesBreak reports whether `node`, OR a force-breaking node nested
125
+ // within the subtree a reflow of `node` would print (its call/new arguments and
126
+ // array elements, recursively), must explode even though it fits flat. Prettier
127
+ // breaks such a descendant — an array `shouldBreak` or a function-composition
128
+ // call/new — when the enclosing node reflows; ttsc's print-width fast path
129
+ // returns first while the descendant abstains via hasReflowAncestor, leaving
130
+ // both flat (`new Map([["a", 1], ["b", 2]])`, `foo([[1, 2], [3, 4]])`). So the
131
+ // fast path must consult this, not only the visited node itself.
132
+ func fastPathForcesBreak(node *shimast.Node) bool {
133
+ if node == nil {
134
+ return false
135
+ }
136
+ if callForcesFunctionBreak(node) || arrayForcesBreak(node) {
137
+ return true
138
+ }
139
+ var children []*shimast.Node
140
+ switch node.Kind {
141
+ case shimast.KindCallExpression:
142
+ if c := node.AsCallExpression(); c != nil && c.Arguments != nil {
143
+ children = c.Arguments.Nodes
144
+ }
145
+ case shimast.KindNewExpression:
146
+ if n := node.AsNewExpression(); n != nil && n.Arguments != nil {
147
+ children = n.Arguments.Nodes
148
+ }
149
+ case shimast.KindArrayLiteralExpression:
150
+ if a := node.AsArrayLiteralExpression(); a != nil && a.Elements != nil {
151
+ children = a.Elements.Nodes
152
+ }
153
+ case shimast.KindObjectLiteralExpression:
154
+ // A force-breaking array/object nested in an object PROPERTY value
155
+ // (`{ m: [[1, 2], [3, 4]] }`) must also deny the fast path: the value
156
+ // abstains to its object ancestor via hasReflowAncestor, and the object
157
+ // itself fits flat, so without descending into property initializers both
158
+ // would stay flat where Prettier breaks them.
159
+ if o := node.AsObjectLiteralExpression(); o != nil && o.Properties != nil {
160
+ for _, p := range o.Properties.Nodes {
161
+ if p != nil && p.Kind == shimast.KindPropertyAssignment {
162
+ if pa := p.AsPropertyAssignment(); pa != nil && pa.Initializer != nil {
163
+ children = append(children, pa.Initializer)
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ for _, ch := range children {
170
+ if fastPathForcesBreak(ch) {
171
+ return true
172
+ }
173
+ }
174
+ return false
175
+ }
176
+
177
+ // isConciselyPrintedArray reports whether an array should use Prettier's
178
+ // concise "fill" layout: at least one element and every element a numeric
179
+ // literal (optionally a `+`/`-` signed numeric). Prettier packs such arrays
180
+ // several per line; mixed / string / identifier arrays stay one-per-line.
181
+ // Prettier's predicate gates on `elements.length > 0` (array.js), so a
182
+ // single-element numeric array counts — which also makes a `[42]` last
183
+ // argument decline last-argument hugging, matching shouldExpandLastArg.
184
+ func isConciselyPrintedArray(elems []*shimast.Node) bool {
185
+ if len(elems) < 1 {
186
+ return false
187
+ }
188
+ for _, e := range elems {
189
+ if !isNumericArrayElement(e) {
190
+ return false
191
+ }
192
+ }
193
+ return true
194
+ }
195
+
196
+ // isNumericArrayElement reports whether `node` is a numeric literal or a
197
+ // `+`/`-` prefix applied to one. A BigInt literal is NOT numeric here: Prettier's
198
+ // isNumericLiteral matches only a number-valued literal, so `[1n, 2n]` prints
199
+ // one element per line rather than filling.
200
+ func isNumericArrayElement(node *shimast.Node) bool {
201
+ if node == nil {
202
+ return false
203
+ }
204
+ switch node.Kind {
205
+ case shimast.KindNumericLiteral:
206
+ return true
207
+ case shimast.KindPrefixUnaryExpression:
208
+ u := node.AsPrefixUnaryExpression()
209
+ if u == nil || u.Operand == nil {
210
+ return false
211
+ }
212
+ if u.Operator != shimast.KindPlusToken && u.Operator != shimast.KindMinusToken {
213
+ return false
214
+ }
215
+ return u.Operand.Kind == shimast.KindNumericLiteral
216
+ }
217
+ return false
218
+ }