@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
@@ -6,7 +6,7 @@
6
6
  package linthost
7
7
 
8
8
  import (
9
- shimast "github.com/microsoft/typescript-go/shim/ast"
9
+ shimast "github.com/microsoft/typescript-go/shim/ast"
10
10
  )
11
11
 
12
12
  // classLiteralPropertyStyle reports `get foo() { return <literal>; }`
@@ -28,44 +28,44 @@ import (
28
28
  type classLiteralPropertyStyle struct{}
29
29
 
30
30
  func (classLiteralPropertyStyle) Name() string {
31
- return "typescript/class-literal-property-style"
31
+ return "typescript/class-literal-property-style"
32
32
  }
33
33
  func (classLiteralPropertyStyle) Visits() []shimast.Kind {
34
- return []shimast.Kind{shimast.KindGetAccessor}
34
+ return []shimast.Kind{shimast.KindGetAccessor}
35
35
  }
36
36
  func (classLiteralPropertyStyle) Check(ctx *Context, node *shimast.Node) {
37
- parent := node.Parent
38
- if parent == nil ||
39
- (parent.Kind != shimast.KindClassDeclaration && parent.Kind != shimast.KindClassExpression) {
40
- return
41
- }
42
- accessor := node.AsGetAccessorDeclaration()
43
- if accessor == nil || accessor.Body == nil || accessor.Body.Kind != shimast.KindBlock {
44
- return
45
- }
46
- statements := accessor.Body.Statements()
47
- if len(statements) != 1 {
48
- return
49
- }
50
- ret := statements[0]
51
- if ret == nil || ret.Kind != shimast.KindReturnStatement {
52
- return
53
- }
54
- retStmt := ret.AsReturnStatement()
55
- if retStmt == nil || retStmt.Expression == nil {
56
- return
57
- }
58
- if !isClassLiteralPropertyValue(retStmt.Expression) {
59
- return
60
- }
61
- name := classMemberName(node)
62
- if name == "" {
63
- return
64
- }
65
- if classHasSetterFor(parent, name) {
66
- return
67
- }
68
- ctx.Report(node, "Literal-returning getter `"+name+"` should be a `readonly` field instead.")
37
+ parent := node.Parent
38
+ if parent == nil ||
39
+ (parent.Kind != shimast.KindClassDeclaration && parent.Kind != shimast.KindClassExpression) {
40
+ return
41
+ }
42
+ accessor := node.AsGetAccessorDeclaration()
43
+ if accessor == nil || accessor.Body == nil || accessor.Body.Kind != shimast.KindBlock {
44
+ return
45
+ }
46
+ statements := accessor.Body.Statements()
47
+ if len(statements) != 1 {
48
+ return
49
+ }
50
+ ret := statements[0]
51
+ if ret == nil || ret.Kind != shimast.KindReturnStatement {
52
+ return
53
+ }
54
+ retStmt := ret.AsReturnStatement()
55
+ if retStmt == nil || retStmt.Expression == nil {
56
+ return
57
+ }
58
+ if !isClassLiteralPropertyValue(retStmt.Expression) {
59
+ return
60
+ }
61
+ name := classMemberName(node)
62
+ if name == "" {
63
+ return
64
+ }
65
+ if classHasSetterFor(parent, name) {
66
+ return
67
+ }
68
+ ctx.Report(node, "Literal-returning getter `"+name+"` should be a `readonly` field instead.")
69
69
  }
70
70
 
71
71
  // isClassLiteralPropertyValue reports whether the expression is one of
@@ -73,25 +73,25 @@ func (classLiteralPropertyStyle) Check(ctx *Context, node *shimast.Node) {
73
73
  // literal without substitutions, or a unary-minus prefix on a numeric
74
74
  // literal.
75
75
  func isClassLiteralPropertyValue(expr *shimast.Node) bool {
76
- if expr == nil {
77
- return false
78
- }
79
- switch expr.Kind {
80
- case shimast.KindStringLiteral,
81
- shimast.KindNumericLiteral,
82
- shimast.KindTrueKeyword,
83
- shimast.KindFalseKeyword,
84
- shimast.KindNullKeyword,
85
- shimast.KindNoSubstitutionTemplateLiteral:
86
- return true
87
- case shimast.KindPrefixUnaryExpression:
88
- prefix := expr.AsPrefixUnaryExpression()
89
- if prefix == nil || prefix.Operator != shimast.KindMinusToken || prefix.Operand == nil {
90
- return false
91
- }
92
- return prefix.Operand.Kind == shimast.KindNumericLiteral
93
- }
94
- return false
76
+ if expr == nil {
77
+ return false
78
+ }
79
+ switch expr.Kind {
80
+ case shimast.KindStringLiteral,
81
+ shimast.KindNumericLiteral,
82
+ shimast.KindTrueKeyword,
83
+ shimast.KindFalseKeyword,
84
+ shimast.KindNullKeyword,
85
+ shimast.KindNoSubstitutionTemplateLiteral:
86
+ return true
87
+ case shimast.KindPrefixUnaryExpression:
88
+ prefix := expr.AsPrefixUnaryExpression()
89
+ if prefix == nil || prefix.Operator != shimast.KindMinusToken || prefix.Operand == nil {
90
+ return false
91
+ }
92
+ return prefix.Operand.Kind == shimast.KindNumericLiteral
93
+ }
94
+ return false
95
95
  }
96
96
 
97
97
  // classHasSetterFor reports whether the class contains a `set`
@@ -99,17 +99,17 @@ func isClassLiteralPropertyValue(expr *shimast.Node) bool {
99
99
  // is left alone because the field form cannot reproduce the setter's
100
100
  // side effects.
101
101
  func classHasSetterFor(class *shimast.Node, name string) bool {
102
- for _, member := range classMembers(class) {
103
- if member == nil || member.Kind != shimast.KindSetAccessor {
104
- continue
105
- }
106
- if classMemberName(member) == name {
107
- return true
108
- }
109
- }
110
- return false
102
+ for _, member := range classMembers(class) {
103
+ if member == nil || member.Kind != shimast.KindSetAccessor {
104
+ continue
105
+ }
106
+ if classMemberName(member) == name {
107
+ return true
108
+ }
109
+ }
110
+ return false
111
111
  }
112
112
 
113
113
  func init() {
114
- Register(classLiteralPropertyStyle{})
114
+ Register(classLiteralPropertyStyle{})
115
115
  }
@@ -16,68 +16,68 @@
16
16
  package linthost
17
17
 
18
18
  import (
19
- shimast "github.com/microsoft/typescript-go/shim/ast"
19
+ shimast "github.com/microsoft/typescript-go/shim/ast"
20
20
  )
21
21
 
22
22
  type consistentTypeExports struct{}
23
23
 
24
24
  func (consistentTypeExports) Name() string { return "typescript/consistent-type-exports" }
25
25
  func (consistentTypeExports) Visits() []shimast.Kind {
26
- return []shimast.Kind{shimast.KindExportDeclaration}
26
+ return []shimast.Kind{shimast.KindExportDeclaration}
27
27
  }
28
28
  func (consistentTypeExports) Check(ctx *Context, node *shimast.Node) {
29
- decl := node.AsExportDeclaration()
30
- if decl == nil || decl.ExportClause == nil {
31
- return
32
- }
33
- // Already `export type { ... }` — nothing to suggest.
34
- if decl.IsTypeOnly {
35
- return
36
- }
37
- // Re-export from another module (`export { Foo } from "bar"`)
38
- // cannot be classified by the AST alone — the source's nature
39
- // lives in a different file. Skip to stay conservative.
40
- if decl.ModuleSpecifier != nil {
41
- return
42
- }
43
- if decl.ExportClause.Kind != shimast.KindNamedExports {
44
- return
45
- }
46
- named := decl.ExportClause.AsNamedExports()
47
- if named == nil || named.Elements == nil || len(named.Elements.Nodes) == 0 {
48
- return
49
- }
50
- // Collect the local names being exported. `export { Foo as Bar }`
51
- // — the `propertyName` (Foo) is the local identifier; the `name`
52
- // (Bar) is the externally visible alias.
53
- localNames := []string{}
54
- for _, el := range named.Elements.Nodes {
55
- spec := el.AsExportSpecifier()
56
- if spec == nil {
57
- return
58
- }
59
- // An inline `export { type Foo }` already opts out at the
60
- // specifier level — bail rather than try to merge mixed shapes.
61
- if spec.IsTypeOnly {
62
- return
63
- }
64
- local := spec.PropertyName
65
- if local == nil {
66
- local = spec.Name()
67
- }
68
- name := identifierText(local)
69
- if name == "" {
70
- return
71
- }
72
- localNames = append(localNames, name)
73
- }
74
- if len(localNames) == 0 {
75
- return
76
- }
77
- if !allNamesAreTypeOnlyDeclarations(ctx.File, localNames) {
78
- return
79
- }
80
- ctx.Report(node, "All exported names are type-only declarations — prefer `export type { ... }` so consumers and bundlers can elide the import.")
29
+ decl := node.AsExportDeclaration()
30
+ if decl == nil || decl.ExportClause == nil {
31
+ return
32
+ }
33
+ // Already `export type { ... }` — nothing to suggest.
34
+ if decl.IsTypeOnly {
35
+ return
36
+ }
37
+ // Re-export from another module (`export { Foo } from "bar"`)
38
+ // cannot be classified by the AST alone — the source's nature
39
+ // lives in a different file. Skip to stay conservative.
40
+ if decl.ModuleSpecifier != nil {
41
+ return
42
+ }
43
+ if decl.ExportClause.Kind != shimast.KindNamedExports {
44
+ return
45
+ }
46
+ named := decl.ExportClause.AsNamedExports()
47
+ if named == nil || named.Elements == nil || len(named.Elements.Nodes) == 0 {
48
+ return
49
+ }
50
+ // Collect the local names being exported. `export { Foo as Bar }`
51
+ // — the `propertyName` (Foo) is the local identifier; the `name`
52
+ // (Bar) is the externally visible alias.
53
+ localNames := []string{}
54
+ for _, el := range named.Elements.Nodes {
55
+ spec := el.AsExportSpecifier()
56
+ if spec == nil {
57
+ return
58
+ }
59
+ // An inline `export { type Foo }` already opts out at the
60
+ // specifier level — bail rather than try to merge mixed shapes.
61
+ if spec.IsTypeOnly {
62
+ return
63
+ }
64
+ local := spec.PropertyName
65
+ if local == nil {
66
+ local = spec.Name()
67
+ }
68
+ name := identifierText(local)
69
+ if name == "" {
70
+ return
71
+ }
72
+ localNames = append(localNames, name)
73
+ }
74
+ if len(localNames) == 0 {
75
+ return
76
+ }
77
+ if !allNamesAreTypeOnlyDeclarations(ctx.File, localNames) {
78
+ return
79
+ }
80
+ ctx.Report(node, "All exported names are type-only declarations — prefer `export type { ... }` so consumers and bundlers can elide the import.")
81
81
  }
82
82
 
83
83
  // allNamesAreTypeOnlyDeclarations reports whether every name in
@@ -88,113 +88,113 @@ func (consistentTypeExports) Check(ctx *Context, node *shimast.Node) {
88
88
  // Checker the rule cannot prove the binding is type-only when its
89
89
  // source is elsewhere.
90
90
  func allNamesAreTypeOnlyDeclarations(file *shimast.SourceFile, names []string) bool {
91
- if file == nil || file.Statements == nil || len(names) == 0 {
92
- return false
93
- }
94
- want := map[string]bool{}
95
- for _, n := range names {
96
- want[n] = true
97
- }
98
- found := map[string]bool{}
99
- valueShadow := map[string]bool{}
100
- for _, stmt := range file.Statements.Nodes {
101
- if stmt == nil {
102
- continue
103
- }
104
- switch stmt.Kind {
105
- case shimast.KindInterfaceDeclaration:
106
- decl := stmt.AsInterfaceDeclaration()
107
- if decl == nil {
108
- continue
109
- }
110
- name := identifierText(decl.Name())
111
- if want[name] {
112
- found[name] = true
113
- }
114
- case shimast.KindTypeAliasDeclaration:
115
- decl := stmt.AsTypeAliasDeclaration()
116
- if decl == nil {
117
- continue
118
- }
119
- name := identifierText(decl.Name())
120
- if want[name] {
121
- found[name] = true
122
- }
123
- case shimast.KindVariableStatement:
124
- vs := stmt.AsVariableStatement()
125
- if vs == nil || vs.DeclarationList == nil {
126
- continue
127
- }
128
- list := vs.DeclarationList.AsVariableDeclarationList()
129
- if list == nil || list.Declarations == nil {
130
- continue
131
- }
132
- for _, d := range list.Declarations.Nodes {
133
- if d == nil {
134
- continue
135
- }
136
- vd := d.AsVariableDeclaration()
137
- if vd == nil {
138
- continue
139
- }
140
- if name := identifierText(vd.Name()); want[name] {
141
- valueShadow[name] = true
142
- }
143
- }
144
- case shimast.KindFunctionDeclaration:
145
- fn := stmt.AsFunctionDeclaration()
146
- if fn == nil {
147
- continue
148
- }
149
- if name := identifierText(fn.Name()); want[name] {
150
- valueShadow[name] = true
151
- }
152
- case shimast.KindClassDeclaration:
153
- cd := stmt.AsClassDeclaration()
154
- if cd == nil {
155
- continue
156
- }
157
- if name := identifierText(cd.Name()); want[name] {
158
- valueShadow[name] = true
159
- }
160
- case shimast.KindEnumDeclaration:
161
- ed := stmt.AsEnumDeclaration()
162
- if ed == nil {
163
- continue
164
- }
165
- if name := identifierText(ed.Name()); want[name] {
166
- valueShadow[name] = true
167
- }
168
- case shimast.KindModuleDeclaration:
169
- // `namespace Foo { ... }` and `module "foo" { ... }` both
170
- // produce a value binding for the namespace object.
171
- md := stmt.AsModuleDeclaration()
172
- if md == nil {
173
- continue
174
- }
175
- if name := identifierText(md.Name()); want[name] {
176
- valueShadow[name] = true
177
- }
178
- case shimast.KindImportDeclaration:
179
- // Any name that comes in through a value import is a value
180
- // here, so the export rewrite would be wrong.
181
- collectImportBindings(stmt, want, valueShadow)
182
- case shimast.KindImportEqualsDeclaration:
183
- ied := stmt.AsImportEqualsDeclaration()
184
- if ied == nil {
185
- continue
186
- }
187
- if name := identifierText(ied.Name()); want[name] {
188
- valueShadow[name] = true
189
- }
190
- }
191
- }
192
- for _, n := range names {
193
- if valueShadow[n] || !found[n] {
194
- return false
195
- }
196
- }
197
- return true
91
+ if file == nil || file.Statements == nil || len(names) == 0 {
92
+ return false
93
+ }
94
+ want := map[string]bool{}
95
+ for _, n := range names {
96
+ want[n] = true
97
+ }
98
+ found := map[string]bool{}
99
+ valueShadow := map[string]bool{}
100
+ for _, stmt := range file.Statements.Nodes {
101
+ if stmt == nil {
102
+ continue
103
+ }
104
+ switch stmt.Kind {
105
+ case shimast.KindInterfaceDeclaration:
106
+ decl := stmt.AsInterfaceDeclaration()
107
+ if decl == nil {
108
+ continue
109
+ }
110
+ name := identifierText(decl.Name())
111
+ if want[name] {
112
+ found[name] = true
113
+ }
114
+ case shimast.KindTypeAliasDeclaration:
115
+ decl := stmt.AsTypeAliasDeclaration()
116
+ if decl == nil {
117
+ continue
118
+ }
119
+ name := identifierText(decl.Name())
120
+ if want[name] {
121
+ found[name] = true
122
+ }
123
+ case shimast.KindVariableStatement:
124
+ vs := stmt.AsVariableStatement()
125
+ if vs == nil || vs.DeclarationList == nil {
126
+ continue
127
+ }
128
+ list := vs.DeclarationList.AsVariableDeclarationList()
129
+ if list == nil || list.Declarations == nil {
130
+ continue
131
+ }
132
+ for _, d := range list.Declarations.Nodes {
133
+ if d == nil {
134
+ continue
135
+ }
136
+ vd := d.AsVariableDeclaration()
137
+ if vd == nil {
138
+ continue
139
+ }
140
+ if name := identifierText(vd.Name()); want[name] {
141
+ valueShadow[name] = true
142
+ }
143
+ }
144
+ case shimast.KindFunctionDeclaration:
145
+ fn := stmt.AsFunctionDeclaration()
146
+ if fn == nil {
147
+ continue
148
+ }
149
+ if name := identifierText(fn.Name()); want[name] {
150
+ valueShadow[name] = true
151
+ }
152
+ case shimast.KindClassDeclaration:
153
+ cd := stmt.AsClassDeclaration()
154
+ if cd == nil {
155
+ continue
156
+ }
157
+ if name := identifierText(cd.Name()); want[name] {
158
+ valueShadow[name] = true
159
+ }
160
+ case shimast.KindEnumDeclaration:
161
+ ed := stmt.AsEnumDeclaration()
162
+ if ed == nil {
163
+ continue
164
+ }
165
+ if name := identifierText(ed.Name()); want[name] {
166
+ valueShadow[name] = true
167
+ }
168
+ case shimast.KindModuleDeclaration:
169
+ // `namespace Foo { ... }` and `module "foo" { ... }` both
170
+ // produce a value binding for the namespace object.
171
+ md := stmt.AsModuleDeclaration()
172
+ if md == nil {
173
+ continue
174
+ }
175
+ if name := identifierText(md.Name()); want[name] {
176
+ valueShadow[name] = true
177
+ }
178
+ case shimast.KindImportDeclaration:
179
+ // Any name that comes in through a value import is a value
180
+ // here, so the export rewrite would be wrong.
181
+ collectImportBindings(stmt, want, valueShadow)
182
+ case shimast.KindImportEqualsDeclaration:
183
+ ied := stmt.AsImportEqualsDeclaration()
184
+ if ied == nil {
185
+ continue
186
+ }
187
+ if name := identifierText(ied.Name()); want[name] {
188
+ valueShadow[name] = true
189
+ }
190
+ }
191
+ }
192
+ for _, n := range names {
193
+ if valueShadow[n] || !found[n] {
194
+ return false
195
+ }
196
+ }
197
+ return true
198
198
  }
199
199
 
200
200
  // collectImportBindings records every value-import name from `stmt`
@@ -202,55 +202,55 @@ func allNamesAreTypeOnlyDeclarations(file *shimast.SourceFile, names []string) b
202
202
  // (`import type { Foo }` or inline `import { type Foo }`) do not
203
203
  // produce a value binding and are skipped.
204
204
  func collectImportBindings(stmt *shimast.Node, want, valueShadow map[string]bool) {
205
- if stmt == nil {
206
- return
207
- }
208
- decl := stmt.AsImportDeclaration()
209
- if decl == nil || decl.ImportClause == nil {
210
- return
211
- }
212
- clause := decl.ImportClause.AsImportClause()
213
- if clause == nil {
214
- return
215
- }
216
- // `import type { Foo }` — entire clause is type-only.
217
- if clause.PhaseModifier == shimast.KindTypeKeyword {
218
- return
219
- }
220
- if def := clause.Name(); def != nil {
221
- if name := identifierText(def); want[name] {
222
- valueShadow[name] = true
223
- }
224
- }
225
- if clause.NamedBindings == nil {
226
- return
227
- }
228
- switch clause.NamedBindings.Kind {
229
- case shimast.KindNamespaceImport:
230
- ns := clause.NamedBindings.AsNamespaceImport()
231
- if ns == nil {
232
- return
233
- }
234
- if name := identifierText(ns.Name()); want[name] {
235
- valueShadow[name] = true
236
- }
237
- case shimast.KindNamedImports:
238
- named := clause.NamedBindings.AsNamedImports()
239
- if named == nil || named.Elements == nil {
240
- return
241
- }
242
- for _, spec := range named.Elements.Nodes {
243
- s := spec.AsImportSpecifier()
244
- if s == nil || s.IsTypeOnly {
245
- continue
246
- }
247
- if name := identifierText(s.Name()); want[name] {
248
- valueShadow[name] = true
249
- }
250
- }
251
- }
205
+ if stmt == nil {
206
+ return
207
+ }
208
+ decl := stmt.AsImportDeclaration()
209
+ if decl == nil || decl.ImportClause == nil {
210
+ return
211
+ }
212
+ clause := decl.ImportClause.AsImportClause()
213
+ if clause == nil {
214
+ return
215
+ }
216
+ // `import type { Foo }` — entire clause is type-only.
217
+ if clause.PhaseModifier == shimast.KindTypeKeyword {
218
+ return
219
+ }
220
+ if def := clause.Name(); def != nil {
221
+ if name := identifierText(def); want[name] {
222
+ valueShadow[name] = true
223
+ }
224
+ }
225
+ if clause.NamedBindings == nil {
226
+ return
227
+ }
228
+ switch clause.NamedBindings.Kind {
229
+ case shimast.KindNamespaceImport:
230
+ ns := clause.NamedBindings.AsNamespaceImport()
231
+ if ns == nil {
232
+ return
233
+ }
234
+ if name := identifierText(ns.Name()); want[name] {
235
+ valueShadow[name] = true
236
+ }
237
+ case shimast.KindNamedImports:
238
+ named := clause.NamedBindings.AsNamedImports()
239
+ if named == nil || named.Elements == nil {
240
+ return
241
+ }
242
+ for _, spec := range named.Elements.Nodes {
243
+ s := spec.AsImportSpecifier()
244
+ if s == nil || s.IsTypeOnly {
245
+ continue
246
+ }
247
+ if name := identifierText(s.Name()); want[name] {
248
+ valueShadow[name] = true
249
+ }
250
+ }
251
+ }
252
252
  }
253
253
 
254
254
  func init() {
255
- Register(consistentTypeExports{})
255
+ Register(consistentTypeExports{})
256
256
  }