@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
@@ -24,43 +24,43 @@
24
24
  package linthost
25
25
 
26
26
  import (
27
- shimast "github.com/microsoft/typescript-go/shim/ast"
28
- shimchecker "github.com/microsoft/typescript-go/shim/checker"
27
+ shimast "github.com/microsoft/typescript-go/shim/ast"
28
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
29
29
  )
30
30
 
31
31
  type noUnsafeEnumComparison struct{}
32
32
 
33
33
  func (noUnsafeEnumComparison) Name() string { return "typescript/no-unsafe-enum-comparison" }
34
34
  func (noUnsafeEnumComparison) NeedsTypeChecker() bool {
35
- return true
35
+ return true
36
36
  }
37
37
  func (noUnsafeEnumComparison) Visits() []shimast.Kind {
38
- return []shimast.Kind{shimast.KindBinaryExpression}
38
+ return []shimast.Kind{shimast.KindBinaryExpression}
39
39
  }
40
40
  func (noUnsafeEnumComparison) Check(ctx *Context, node *shimast.Node) {
41
- if ctx.Checker == nil {
42
- return
43
- }
44
- bin := node.AsBinaryExpression()
45
- if bin == nil || bin.OperatorToken == nil || bin.Left == nil || bin.Right == nil {
46
- return
47
- }
48
- switch bin.OperatorToken.Kind {
49
- case shimast.KindEqualsEqualsToken,
50
- shimast.KindEqualsEqualsEqualsToken,
51
- shimast.KindExclamationEqualsToken,
52
- shimast.KindExclamationEqualsEqualsToken:
53
- default:
54
- return
55
- }
56
- left := ctx.Checker.GetTypeAtLocation(bin.Left)
57
- right := ctx.Checker.GetTypeAtLocation(bin.Right)
58
- if left == nil || right == nil {
59
- return
60
- }
61
- if noUnsafeEnumComparisonMismatch(left, right) || noUnsafeEnumComparisonMismatch(right, left) {
62
- ctx.Report(node, "Unsafe comparison between an enum-typed value and a plain primitive of the same widened type. Compare against one of the enum's own members so a typo surfaces at compile time.")
63
- }
41
+ if ctx.Checker == nil {
42
+ return
43
+ }
44
+ bin := node.AsBinaryExpression()
45
+ if bin == nil || bin.OperatorToken == nil || bin.Left == nil || bin.Right == nil {
46
+ return
47
+ }
48
+ switch bin.OperatorToken.Kind {
49
+ case shimast.KindEqualsEqualsToken,
50
+ shimast.KindEqualsEqualsEqualsToken,
51
+ shimast.KindExclamationEqualsToken,
52
+ shimast.KindExclamationEqualsEqualsToken:
53
+ default:
54
+ return
55
+ }
56
+ left := ctx.Checker.GetTypeAtLocation(bin.Left)
57
+ right := ctx.Checker.GetTypeAtLocation(bin.Right)
58
+ if left == nil || right == nil {
59
+ return
60
+ }
61
+ if noUnsafeEnumComparisonMismatch(left, right) || noUnsafeEnumComparisonMismatch(right, left) {
62
+ ctx.Report(node, "Unsafe comparison between an enum-typed value and a plain primitive of the same widened type. Compare against one of the enum's own members so a typo surfaces at compile time.")
63
+ }
64
64
  }
65
65
 
66
66
  // noUnsafeEnumComparisonMismatch reports whether `enumSide` carries an
@@ -69,29 +69,29 @@ func (noUnsafeEnumComparison) Check(ctx *Context, node *shimast.Node) {
69
69
  // still counts as the enum side, and the comparison `color === "red"`
70
70
  // is still unsafe even when `color` carries an extra nullish branch.
71
71
  func noUnsafeEnumComparisonMismatch(enumSide, otherSide *shimchecker.Type) bool {
72
- if !noUnsafeEnumComparisonHasEnum(enumSide) {
73
- return false
74
- }
75
- // `any` / `unknown` / `never` on the other side silently propagate
76
- // from generic helpers — flagging them would explode false positives
77
- // the same way `restrict-template-expressions` mitigates with its
78
- // `allowAny` default.
79
- if noUnsafeEnumComparisonIsLoose(otherSide) {
80
- return false
81
- }
82
- // If the other side is provably the same enum (or one of its
83
- // members), the comparison is the safe shape the rule recommends.
84
- if noUnsafeEnumComparisonSharesEnum(enumSide, otherSide) {
85
- return false
86
- }
87
- // The mismatch only fires when the non-enum side is the widened
88
- // primitive that the enum widens to. A `Color === Status.Active`
89
- // comparison (two unrelated enums of the same widened number) also
90
- // trips this branch via the other call ordering.
91
- if !noUnsafeEnumComparisonIsBareLiteralLike(otherSide) && !noUnsafeEnumComparisonHasEnum(otherSide) {
92
- return false
93
- }
94
- return true
72
+ if !noUnsafeEnumComparisonHasEnum(enumSide) {
73
+ return false
74
+ }
75
+ // `any` / `unknown` / `never` on the other side silently propagate
76
+ // from generic helpers — flagging them would explode false positives
77
+ // the same way `restrict-template-expressions` mitigates with its
78
+ // `allowAny` default.
79
+ if noUnsafeEnumComparisonIsLoose(otherSide) {
80
+ return false
81
+ }
82
+ // If the other side is provably the same enum (or one of its
83
+ // members), the comparison is the safe shape the rule recommends.
84
+ if noUnsafeEnumComparisonSharesEnum(enumSide, otherSide) {
85
+ return false
86
+ }
87
+ // The mismatch only fires when the non-enum side is the widened
88
+ // primitive that the enum widens to. A `Color === Status.Active`
89
+ // comparison (two unrelated enums of the same widened number) also
90
+ // trips this branch via the other call ordering.
91
+ if !noUnsafeEnumComparisonIsBareLiteralLike(otherSide) && !noUnsafeEnumComparisonHasEnum(otherSide) {
92
+ return false
93
+ }
94
+ return true
95
95
  }
96
96
 
97
97
  // noUnsafeEnumComparisonHasEnum reports whether t (or any constituent of
@@ -99,21 +99,21 @@ func noUnsafeEnumComparisonMismatch(enumSide, otherSide *shimchecker.Type) bool
99
99
  // the enum union type produced by `enum E { ... }` and the canonical
100
100
  // `TypeFlagsEnumLiteral`-tagged literal types for each member.
101
101
  func noUnsafeEnumComparisonHasEnum(t *shimchecker.Type) bool {
102
- if t == nil {
103
- return false
104
- }
105
- flags := t.Flags()
106
- if flags&shimchecker.TypeFlagsEnumLike != 0 {
107
- return true
108
- }
109
- if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
110
- for _, part := range t.Types() {
111
- if noUnsafeEnumComparisonHasEnum(part) {
112
- return true
113
- }
114
- }
115
- }
116
- return false
102
+ if t == nil {
103
+ return false
104
+ }
105
+ flags := t.Flags()
106
+ if flags&shimchecker.TypeFlagsEnumLike != 0 {
107
+ return true
108
+ }
109
+ if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
110
+ for _, part := range t.Types() {
111
+ if noUnsafeEnumComparisonHasEnum(part) {
112
+ return true
113
+ }
114
+ }
115
+ }
116
+ return false
117
117
  }
118
118
 
119
119
  // noUnsafeEnumComparisonIsLoose reports whether t propagates from a
@@ -121,10 +121,10 @@ func noUnsafeEnumComparisonHasEnum(t *shimchecker.Type) bool {
121
121
  // `never`. The upstream rule keeps these silent so type-erasure paths
122
122
  // (`JSON.parse`, untyped APIs) don't light up everywhere.
123
123
  func noUnsafeEnumComparisonIsLoose(t *shimchecker.Type) bool {
124
- if t == nil {
125
- return true
126
- }
127
- return t.Flags()&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0
124
+ if t == nil {
125
+ return true
126
+ }
127
+ return t.Flags()&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0
128
128
  }
129
129
 
130
130
  // noUnsafeEnumComparisonSharesEnum reports whether both sides refer to
@@ -134,12 +134,12 @@ func noUnsafeEnumComparisonIsLoose(t *shimchecker.Type) bool {
134
134
  // — comparing those addresses tells us whether `Color.Red` and
135
135
  // `Color.Blue` come from the same enum.
136
136
  func noUnsafeEnumComparisonSharesEnum(a, b *shimchecker.Type) bool {
137
- aDecl := noUnsafeEnumComparisonEnumDeclaration(a)
138
- bDecl := noUnsafeEnumComparisonEnumDeclaration(b)
139
- if aDecl == nil || bDecl == nil {
140
- return false
141
- }
142
- return aDecl == bDecl
137
+ aDecl := noUnsafeEnumComparisonEnumDeclaration(a)
138
+ bDecl := noUnsafeEnumComparisonEnumDeclaration(b)
139
+ if aDecl == nil || bDecl == nil {
140
+ return false
141
+ }
142
+ return aDecl == bDecl
143
143
  }
144
144
 
145
145
  // noUnsafeEnumComparisonEnumDeclaration returns the EnumDeclaration
@@ -148,48 +148,48 @@ func noUnsafeEnumComparisonSharesEnum(a, b *shimchecker.Type) bool {
148
148
  // enum-literal member carry the enum's symbol via Type.Symbol; the
149
149
  // symbol's parent declaration is the EnumDeclaration we identify by.
150
150
  func noUnsafeEnumComparisonEnumDeclaration(t *shimchecker.Type) *shimast.Node {
151
- if t == nil {
152
- return nil
153
- }
154
- flags := t.Flags()
155
- if flags&shimchecker.TypeFlagsEnumLike != 0 {
156
- sym := t.Symbol()
157
- if sym == nil {
158
- return nil
159
- }
160
- for _, decl := range sym.Declarations {
161
- if decl == nil {
162
- continue
163
- }
164
- if decl.Kind == shimast.KindEnumDeclaration {
165
- return decl
166
- }
167
- // Enum member literal types carry the member symbol; walk
168
- // one level up to land on the surrounding EnumDeclaration.
169
- if decl.Parent != nil && decl.Parent.Kind == shimast.KindEnumDeclaration {
170
- return decl.Parent
171
- }
172
- }
173
- return nil
174
- }
175
- if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
176
- var seen *shimast.Node
177
- for _, part := range t.Types() {
178
- decl := noUnsafeEnumComparisonEnumDeclaration(part)
179
- if decl == nil {
180
- continue
181
- }
182
- if seen == nil {
183
- seen = decl
184
- continue
185
- }
186
- if seen != decl {
187
- return nil
188
- }
189
- }
190
- return seen
191
- }
192
- return nil
151
+ if t == nil {
152
+ return nil
153
+ }
154
+ flags := t.Flags()
155
+ if flags&shimchecker.TypeFlagsEnumLike != 0 {
156
+ sym := t.Symbol()
157
+ if sym == nil {
158
+ return nil
159
+ }
160
+ for _, decl := range sym.Declarations {
161
+ if decl == nil {
162
+ continue
163
+ }
164
+ if decl.Kind == shimast.KindEnumDeclaration {
165
+ return decl
166
+ }
167
+ // Enum member literal types carry the member symbol; walk
168
+ // one level up to land on the surrounding EnumDeclaration.
169
+ if decl.Parent != nil && decl.Parent.Kind == shimast.KindEnumDeclaration {
170
+ return decl.Parent
171
+ }
172
+ }
173
+ return nil
174
+ }
175
+ if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
176
+ var seen *shimast.Node
177
+ for _, part := range t.Types() {
178
+ decl := noUnsafeEnumComparisonEnumDeclaration(part)
179
+ if decl == nil {
180
+ continue
181
+ }
182
+ if seen == nil {
183
+ seen = decl
184
+ continue
185
+ }
186
+ if seen != decl {
187
+ return nil
188
+ }
189
+ }
190
+ return seen
191
+ }
192
+ return nil
193
193
  }
194
194
 
195
195
  // noUnsafeEnumComparisonIsBareLiteralLike reports whether t is a plain
@@ -199,37 +199,37 @@ func noUnsafeEnumComparisonEnumDeclaration(t *shimchecker.Type) *shimast.Node {
199
199
  // share an enum's primitive widening — `color === null` is a real
200
200
  // nullability check, not a same-primitive mistake.
201
201
  func noUnsafeEnumComparisonIsBareLiteralLike(t *shimchecker.Type) bool {
202
- if t == nil {
203
- return false
204
- }
205
- flags := t.Flags()
206
- if flags&shimchecker.TypeFlagsEnumLike != 0 {
207
- return false
208
- }
209
- const primitiveMask = shimchecker.TypeFlagsStringLike |
210
- shimchecker.TypeFlagsNumberLike |
211
- shimchecker.TypeFlagsBigIntLike
212
- if flags&primitiveMask != 0 {
213
- return true
214
- }
215
- if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
216
- anyMatch := false
217
- for _, part := range t.Types() {
218
- if part == nil {
219
- continue
220
- }
221
- if noUnsafeEnumComparisonHasEnum(part) {
222
- return false
223
- }
224
- if noUnsafeEnumComparisonIsBareLiteralLike(part) {
225
- anyMatch = true
226
- }
227
- }
228
- return anyMatch
229
- }
230
- return false
202
+ if t == nil {
203
+ return false
204
+ }
205
+ flags := t.Flags()
206
+ if flags&shimchecker.TypeFlagsEnumLike != 0 {
207
+ return false
208
+ }
209
+ const primitiveMask = shimchecker.TypeFlagsStringLike |
210
+ shimchecker.TypeFlagsNumberLike |
211
+ shimchecker.TypeFlagsBigIntLike
212
+ if flags&primitiveMask != 0 {
213
+ return true
214
+ }
215
+ if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
216
+ anyMatch := false
217
+ for _, part := range t.Types() {
218
+ if part == nil {
219
+ continue
220
+ }
221
+ if noUnsafeEnumComparisonHasEnum(part) {
222
+ return false
223
+ }
224
+ if noUnsafeEnumComparisonIsBareLiteralLike(part) {
225
+ anyMatch = true
226
+ }
227
+ }
228
+ return anyMatch
229
+ }
230
+ return false
231
231
  }
232
232
 
233
233
  func init() {
234
- Register(noUnsafeEnumComparison{})
234
+ Register(noUnsafeEnumComparison{})
235
235
  }
@@ -13,46 +13,46 @@
13
13
  package linthost
14
14
 
15
15
  import (
16
- shimast "github.com/microsoft/typescript-go/shim/ast"
16
+ shimast "github.com/microsoft/typescript-go/shim/ast"
17
17
  )
18
18
 
19
19
  type noUnsafeMemberAccess struct{}
20
20
 
21
21
  func (noUnsafeMemberAccess) Name() string { return "typescript/no-unsafe-member-access" }
22
22
  func (noUnsafeMemberAccess) NeedsTypeChecker() bool {
23
- return true
23
+ return true
24
24
  }
25
25
  func (noUnsafeMemberAccess) Visits() []shimast.Kind {
26
- return []shimast.Kind{
27
- shimast.KindPropertyAccessExpression,
28
- shimast.KindElementAccessExpression,
29
- }
26
+ return []shimast.Kind{
27
+ shimast.KindPropertyAccessExpression,
28
+ shimast.KindElementAccessExpression,
29
+ }
30
30
  }
31
31
  func (noUnsafeMemberAccess) Check(ctx *Context, node *shimast.Node) {
32
- if ctx.Checker == nil {
33
- return
34
- }
35
- var receiver *shimast.Node
36
- switch node.Kind {
37
- case shimast.KindPropertyAccessExpression:
38
- if access := node.AsPropertyAccessExpression(); access != nil {
39
- receiver = access.Expression
40
- }
41
- case shimast.KindElementAccessExpression:
42
- if access := node.AsElementAccessExpression(); access != nil {
43
- receiver = access.Expression
44
- }
45
- }
46
- if receiver == nil {
47
- return
48
- }
49
- t := ctx.Checker.GetTypeAtLocation(receiver)
50
- if !typeIsUnsafeAny(t) {
51
- return
52
- }
53
- ctx.Report(node, "Unsafe member access on a value typed as `any`. Narrow the receiver to a concrete type before reading a property.")
32
+ if ctx.Checker == nil {
33
+ return
34
+ }
35
+ var receiver *shimast.Node
36
+ switch node.Kind {
37
+ case shimast.KindPropertyAccessExpression:
38
+ if access := node.AsPropertyAccessExpression(); access != nil {
39
+ receiver = access.Expression
40
+ }
41
+ case shimast.KindElementAccessExpression:
42
+ if access := node.AsElementAccessExpression(); access != nil {
43
+ receiver = access.Expression
44
+ }
45
+ }
46
+ if receiver == nil {
47
+ return
48
+ }
49
+ t := ctx.Checker.GetTypeAtLocation(receiver)
50
+ if !typeIsUnsafeAny(t) {
51
+ return
52
+ }
53
+ ctx.Report(node, "Unsafe member access on a value typed as `any`. Narrow the receiver to a concrete type before reading a property.")
54
54
  }
55
55
 
56
56
  func init() {
57
- Register(noUnsafeMemberAccess{})
57
+ Register(noUnsafeMemberAccess{})
58
58
  }
@@ -22,50 +22,50 @@
22
22
  package linthost
23
23
 
24
24
  import (
25
- shimast "github.com/microsoft/typescript-go/shim/ast"
26
- shimchecker "github.com/microsoft/typescript-go/shim/checker"
25
+ shimast "github.com/microsoft/typescript-go/shim/ast"
26
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
27
27
  )
28
28
 
29
29
  type noUnsafeReturn struct{}
30
30
 
31
31
  func (noUnsafeReturn) Name() string { return "typescript/no-unsafe-return" }
32
32
  func (noUnsafeReturn) NeedsTypeChecker() bool {
33
- return true
33
+ return true
34
34
  }
35
35
  func (noUnsafeReturn) Visits() []shimast.Kind {
36
- return []shimast.Kind{shimast.KindReturnStatement}
36
+ return []shimast.Kind{shimast.KindReturnStatement}
37
37
  }
38
38
  func (noUnsafeReturn) Check(ctx *Context, node *shimast.Node) {
39
- if ctx.Checker == nil {
40
- return
41
- }
42
- ret := node.AsReturnStatement()
43
- if ret == nil || ret.Expression == nil {
44
- return
45
- }
46
- fn := noUnsafeReturnEnclosingFunction(node)
47
- if fn == nil {
48
- return
49
- }
50
- sig := ctx.Checker.GetSignatureFromDeclaration(fn)
51
- if sig == nil {
52
- return
53
- }
54
- declared := ctx.Checker.GetReturnTypeOfSignature(sig)
55
- if declared == nil {
56
- return
57
- }
58
- if !noUnsafeReturnIsConcrete(declared) {
59
- return
60
- }
61
- exprType := ctx.Checker.GetTypeAtLocation(ret.Expression)
62
- if exprType == nil {
63
- return
64
- }
65
- if !noUnsafeReturnIsAny(exprType) {
66
- return
67
- }
68
- ctx.Report(ret.Expression, "Unsafe return of `any` value from function with a concrete declared return type. The `any` leaks past the type boundary and disables downstream type checks.")
39
+ if ctx.Checker == nil {
40
+ return
41
+ }
42
+ ret := node.AsReturnStatement()
43
+ if ret == nil || ret.Expression == nil {
44
+ return
45
+ }
46
+ fn := noUnsafeReturnEnclosingFunction(node)
47
+ if fn == nil {
48
+ return
49
+ }
50
+ sig := ctx.Checker.GetSignatureFromDeclaration(fn)
51
+ if sig == nil {
52
+ return
53
+ }
54
+ declared := ctx.Checker.GetReturnTypeOfSignature(sig)
55
+ if declared == nil {
56
+ return
57
+ }
58
+ if !noUnsafeReturnIsConcrete(declared) {
59
+ return
60
+ }
61
+ exprType := ctx.Checker.GetTypeAtLocation(ret.Expression)
62
+ if exprType == nil {
63
+ return
64
+ }
65
+ if !noUnsafeReturnIsAny(exprType) {
66
+ return
67
+ }
68
+ ctx.Report(ret.Expression, "Unsafe return of `any` value from function with a concrete declared return type. The `any` leaks past the type boundary and disables downstream type checks.")
69
69
  }
70
70
 
71
71
  // noUnsafeReturnEnclosingFunction walks up the parent chain to the
@@ -74,12 +74,12 @@ func (noUnsafeReturn) Check(ctx *Context, node *shimast.Node) {
74
74
  // first function-like ancestor — mirroring the `consistent-return`
75
75
  // scope rule already established in this package.
76
76
  func noUnsafeReturnEnclosingFunction(node *shimast.Node) *shimast.Node {
77
- for cur := node.Parent; cur != nil; cur = cur.Parent {
78
- if isFunctionLikeKind(cur) {
79
- return cur
80
- }
81
- }
82
- return nil
77
+ for cur := node.Parent; cur != nil; cur = cur.Parent {
78
+ if isFunctionLikeKind(cur) {
79
+ return cur
80
+ }
81
+ }
82
+ return nil
83
83
  }
84
84
 
85
85
  // noUnsafeReturnIsConcrete reports whether the declared return type is
@@ -89,25 +89,25 @@ func noUnsafeReturnEnclosingFunction(node *shimast.Node) *shimast.Node {
89
89
  // `unknown` and side-effect functions that return `void` do not light
90
90
  // up everywhere. Unions are concrete only when every constituent is.
91
91
  func noUnsafeReturnIsConcrete(t *shimchecker.Type) bool {
92
- if t == nil {
93
- return false
94
- }
95
- flags := t.Flags()
96
- if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsVoid) != 0 {
97
- return false
98
- }
99
- if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
100
- for _, part := range t.Types() {
101
- if part == nil {
102
- continue
103
- }
104
- if !noUnsafeReturnIsConcrete(part) {
105
- return false
106
- }
107
- }
108
- return true
109
- }
110
- return true
92
+ if t == nil {
93
+ return false
94
+ }
95
+ flags := t.Flags()
96
+ if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsVoid) != 0 {
97
+ return false
98
+ }
99
+ if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
100
+ for _, part := range t.Types() {
101
+ if part == nil {
102
+ continue
103
+ }
104
+ if !noUnsafeReturnIsConcrete(part) {
105
+ return false
106
+ }
107
+ }
108
+ return true
109
+ }
110
+ return true
111
111
  }
112
112
 
113
113
  // noUnsafeReturnIsAny reports whether t is the raw `any` type. The
@@ -115,12 +115,12 @@ func noUnsafeReturnIsConcrete(t *shimchecker.Type) bool {
115
115
  // returned as `unknown` cannot be used without further narrowing, so
116
116
  // they don't leak silently — and only flags the lossy `any` case.
117
117
  func noUnsafeReturnIsAny(t *shimchecker.Type) bool {
118
- if t == nil {
119
- return false
120
- }
121
- return t.Flags()&shimchecker.TypeFlagsAny != 0
118
+ if t == nil {
119
+ return false
120
+ }
121
+ return t.Flags()&shimchecker.TypeFlagsAny != 0
122
122
  }
123
123
 
124
124
  func init() {
125
- Register(noUnsafeReturn{})
125
+ Register(noUnsafeReturn{})
126
126
  }