@ttsc/lint 0.14.0-dev.20260529.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +85 -87
  2. package/lib/defaultFormat.d.ts +10 -6
  3. package/lib/defaultFormat.js +10 -6
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/structures/ITtscLintConfig.d.ts +5 -5
  6. package/lib/structures/TtscLintRuleSetting.d.ts +19 -19
  7. package/lib/structures/{ITtscLintFormat.d.ts → format/ITtscLintFormat.d.ts} +45 -70
  8. package/lib/structures/format/ITtscLintFormat.js.map +1 -0
  9. package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +15 -0
  10. package/lib/structures/format/ITtscLintFormatJsDoc.js +3 -0
  11. package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
  12. package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
  13. package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
  14. package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
  15. package/lib/structures/format/index.d.ts +3 -0
  16. package/lib/structures/format/index.js +20 -0
  17. package/lib/structures/format/index.js.map +1 -0
  18. package/lib/structures/index.d.ts +1 -1
  19. package/lib/structures/index.js +1 -1
  20. package/lib/structures/index.js.map +1 -1
  21. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +18 -27
  22. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +4 -5
  23. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -1
  24. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +29 -33
  25. package/lib/structures/rules/ITtscLintContributorRules.d.ts +6 -7
  26. package/lib/structures/rules/ITtscLintCoreRules.d.ts +380 -408
  27. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +5 -5
  28. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +2 -2
  29. package/lib/structures/rules/ITtscLintCypressRules.d.ts +34 -38
  30. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +21 -24
  31. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +2 -2
  32. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +51 -56
  33. package/lib/structures/rules/ITtscLintJestRules.d.ts +63 -74
  34. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +47 -54
  35. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +94 -102
  36. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +50 -55
  37. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +104 -122
  38. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +62 -71
  39. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +4 -4
  40. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +17 -19
  41. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +8 -10
  42. package/lib/structures/rules/ITtscLintReactRuleOptions.js +1 -2
  43. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -1
  44. package/lib/structures/rules/ITtscLintReactRules.d.ts +91 -104
  45. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +46 -54
  46. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +7 -8
  47. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +45 -52
  48. package/lib/structures/rules/ITtscLintSolidRules.d.ts +53 -56
  49. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +3 -4
  50. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +60 -69
  51. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +31 -37
  52. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +2 -3
  53. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +102 -119
  54. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +460 -518
  55. package/lib/structures/rules/ITtscLintVitestRules.d.ts +43 -51
  56. package/linthost/config.go +89 -72
  57. package/linthost/config_format.go +265 -99
  58. package/linthost/directives.go +5 -1
  59. package/linthost/display_width.go +72 -0
  60. package/linthost/fix.go +26 -1
  61. package/linthost/format.go +222 -25
  62. package/linthost/format_editor_settings.go +262 -0
  63. package/linthost/lsp.go +8 -4
  64. package/linthost/print_dispatch.go +3 -0
  65. package/linthost/print_doc.go +13 -0
  66. package/linthost/print_engine.go +68 -11
  67. package/linthost/print_nodes_array.go +108 -5
  68. package/linthost/print_nodes_call.go +515 -74
  69. package/linthost/print_nodes_function.go +25 -0
  70. package/linthost/print_nodes_imports.go +47 -14
  71. package/linthost/print_nodes_list.go +191 -8
  72. package/linthost/print_nodes_object.go +12 -6
  73. package/linthost/print_nodes_ternary.go +106 -0
  74. package/linthost/rules_boundaries.go +400 -400
  75. package/linthost/rules_camelcase.go +81 -81
  76. package/linthost/rules_complexity.go +52 -51
  77. package/linthost/rules_consistent_return.go +81 -81
  78. package/linthost/rules_core_extra.go +472 -472
  79. package/linthost/rules_curly.go +43 -43
  80. package/linthost/rules_default_case.go +15 -15
  81. package/linthost/rules_default_case_last.go +22 -22
  82. package/linthost/rules_format_arrow_parens.go +167 -0
  83. package/linthost/rules_format_bracket_spacing.go +117 -0
  84. package/linthost/rules_format_clause_join.go +172 -0
  85. package/linthost/rules_format_declaration_header.go +664 -0
  86. package/linthost/rules_format_indent.go +616 -0
  87. package/linthost/rules_format_jsdoc.go +4 -4
  88. package/linthost/rules_format_orphan_semi.go +106 -0
  89. package/linthost/rules_format_parameter_properties.go +175 -0
  90. package/linthost/rules_format_print_width.go +185 -69
  91. package/linthost/rules_format_quote_props.go +169 -0
  92. package/linthost/rules_format_quotes.go +75 -29
  93. package/linthost/rules_format_semi.go +185 -10
  94. package/linthost/rules_format_sort_imports.go +456 -121
  95. package/linthost/rules_format_statement_split.go +368 -0
  96. package/linthost/rules_format_ternary_nullish_parens.go +77 -0
  97. package/linthost/rules_format_trailing_comma.go +21 -2
  98. package/linthost/rules_format_whitespace.go +336 -0
  99. package/linthost/rules_functional.go +688 -688
  100. package/linthost/rules_gap.go +146 -11
  101. package/linthost/rules_grouped_accessor_pairs.go +60 -60
  102. package/linthost/rules_guard_for_in.go +122 -122
  103. package/linthost/rules_id_length.go +44 -44
  104. package/linthost/rules_imports.go +11 -3
  105. package/linthost/rules_init_declarations.go +25 -25
  106. package/linthost/rules_jsx_a11y.go +844 -844
  107. package/linthost/rules_max_classes_per_file.go +24 -24
  108. package/linthost/rules_max_depth.go +43 -43
  109. package/linthost/rules_max_lines.go +53 -53
  110. package/linthost/rules_max_lines_per_function.go +28 -28
  111. package/linthost/rules_max_nested_callbacks.go +26 -26
  112. package/linthost/rules_max_params.go +20 -20
  113. package/linthost/rules_max_statements.go +29 -29
  114. package/linthost/rules_nextjs.go +5 -5
  115. package/linthost/rules_no_else_return.go +38 -38
  116. package/linthost/rules_no_empty_named_blocks.go +45 -45
  117. package/linthost/rules_no_import_assign.go +96 -96
  118. package/linthost/rules_no_invalid_this.go +19 -19
  119. package/linthost/rules_no_loop_func.go +43 -43
  120. package/linthost/rules_no_magic_numbers.go +60 -60
  121. package/linthost/rules_no_mixed_operators.go +44 -44
  122. package/linthost/rules_no_param_reassign.go +64 -64
  123. package/linthost/rules_no_restricted_imports.go +45 -45
  124. package/linthost/rules_no_restricted_syntax.go +17 -17
  125. package/linthost/rules_no_shadow.go +112 -112
  126. package/linthost/rules_no_unreachable.go +36 -36
  127. package/linthost/rules_no_useless_assignment.go +79 -79
  128. package/linthost/rules_no_useless_constructor.go +167 -167
  129. package/linthost/rules_no_useless_return.go +28 -28
  130. package/linthost/rules_prefer_arrow_callback.go +74 -74
  131. package/linthost/rules_prefer_destructuring.go +61 -61
  132. package/linthost/rules_prefer_named_capture_group.go +87 -87
  133. package/linthost/rules_prefer_rest_params.go +61 -61
  134. package/linthost/rules_promise.go +800 -800
  135. package/linthost/rules_react.go +600 -600
  136. package/linthost/rules_react_extras.go +162 -162
  137. package/linthost/rules_react_hooks.go +2 -2
  138. package/linthost/rules_react_perf.go +231 -231
  139. package/linthost/rules_regexp.go +293 -293
  140. package/linthost/rules_security.go +613 -613
  141. package/linthost/rules_sort_imports.go +37 -37
  142. package/linthost/rules_sort_keys.go +88 -88
  143. package/linthost/rules_suggestions.go +13 -0
  144. package/linthost/rules_ts.go +2 -2
  145. package/linthost/rules_ts_async.go +247 -247
  146. package/linthost/rules_ts_class_literal_property_style.go +64 -64
  147. package/linthost/rules_ts_consistent_type_exports.go +209 -209
  148. package/linthost/rules_ts_explicit_function_return_type.go +35 -35
  149. package/linthost/rules_ts_extra.go +6 -2
  150. package/linthost/rules_ts_no_base_to_string.go +140 -140
  151. package/linthost/rules_ts_no_confusing_void.go +28 -28
  152. package/linthost/rules_ts_no_deprecated.go +110 -110
  153. package/linthost/rules_ts_no_for_in_array.go +45 -45
  154. package/linthost/rules_ts_no_magic_numbers.go +67 -67
  155. package/linthost/rules_ts_no_meaningless_void_operator.go +44 -44
  156. package/linthost/rules_ts_no_misused_spread.go +64 -64
  157. package/linthost/rules_ts_no_redundant_type_constituents.go +72 -72
  158. package/linthost/rules_ts_no_restricted_types.go +28 -28
  159. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +87 -87
  160. package/linthost/rules_ts_no_unnecessary_condition.go +184 -184
  161. package/linthost/rules_ts_no_unnecessary_qualifier.go +72 -72
  162. package/linthost/rules_ts_no_unnecessary_template_expression.go +120 -120
  163. package/linthost/rules_ts_no_unnecessary_type_arguments.go +171 -171
  164. package/linthost/rules_ts_no_unnecessary_type_assertion.go +90 -90
  165. package/linthost/rules_ts_no_unsafe_argument.go +50 -50
  166. package/linthost/rules_ts_no_unsafe_assignment.go +60 -60
  167. package/linthost/rules_ts_no_unsafe_call.go +40 -40
  168. package/linthost/rules_ts_no_unsafe_enum_comparison.go +147 -147
  169. package/linthost/rules_ts_no_unsafe_member_access.go +29 -29
  170. package/linthost/rules_ts_no_unsafe_return.go +64 -64
  171. package/linthost/rules_ts_no_unsafe_unary_minus.go +42 -42
  172. package/linthost/rules_ts_no_useless_constructor.go +20 -20
  173. package/linthost/rules_ts_non_nullable_type_assertion_style.go +60 -60
  174. package/linthost/rules_ts_parameter_properties.go +10 -10
  175. package/linthost/rules_ts_prefer_find.go +116 -116
  176. package/linthost/rules_ts_prefer_includes.go +173 -173
  177. package/linthost/rules_ts_prefer_nullish_coalescing.go +54 -54
  178. package/linthost/rules_ts_prefer_optional_chain.go +156 -156
  179. package/linthost/rules_ts_prefer_promise_reject_errors.go +104 -104
  180. package/linthost/rules_ts_prefer_readonly.go +31 -31
  181. package/linthost/rules_ts_prefer_reduce_type_parameter.go +74 -74
  182. package/linthost/rules_ts_prefer_regexp_exec.go +69 -69
  183. package/linthost/rules_ts_prefer_return_this_type.go +79 -79
  184. package/linthost/rules_ts_prefer_string_starts_ends_with.go +237 -237
  185. package/linthost/rules_ts_promise_function_async.go +41 -41
  186. package/linthost/rules_ts_related_getter_setter_pairs.go +61 -61
  187. package/linthost/rules_ts_require_array_sort_compare.go +58 -58
  188. package/linthost/rules_ts_restrict_plus_operands.go +82 -82
  189. package/linthost/rules_ts_restrict_template_expressions.go +50 -50
  190. package/linthost/rules_ts_simple.go +249 -249
  191. package/linthost/rules_ts_sort_type_constituents.go +88 -88
  192. package/linthost/rules_ts_strict_boolean_expressions.go +103 -103
  193. package/linthost/rules_ts_switch_exhaustiveness_check.go +90 -90
  194. package/linthost/rules_ts_unbound_method.go +65 -65
  195. package/linthost/rules_tsdoc.go +88 -88
  196. package/linthost/rules_unicorn_better_regex.go +1 -1
  197. package/linthost/rules_unicorn_catch_error_name.go +19 -19
  198. package/linthost/rules_unicorn_consistent_assert.go +20 -20
  199. package/linthost/rules_unicorn_consistent_date_clone.go +27 -27
  200. package/linthost/rules_unicorn_consistent_destructuring.go +3 -3
  201. package/linthost/rules_unicorn_consistent_empty_array_spread.go +34 -34
  202. package/linthost/rules_unicorn_consistent_existence_index_check.go +42 -42
  203. package/linthost/rules_unicorn_consistent_function_scoping.go +3 -3
  204. package/linthost/rules_unicorn_consistent_template_literal_escape.go +3 -3
  205. package/linthost/rules_unicorn_custom_error_definition.go +92 -92
  206. package/linthost/rules_unicorn_empty_brace_spaces.go +47 -47
  207. package/linthost/rules_unicorn_error_message.go +34 -34
  208. package/linthost/rules_unicorn_escape_case.go +14 -14
  209. package/linthost/rules_unicorn_expiring_todo_comments.go +36 -36
  210. package/linthost/rules_unicorn_explicit_length_check.go +51 -51
  211. package/linthost/rules_unicorn_filename_case.go +1 -1
  212. package/linthost/rules_unicorn_import_style.go +1 -1
  213. package/linthost/rules_unicorn_isolated_functions.go +2 -2
  214. package/linthost/rules_unicorn_new_for_builtins.go +49 -49
  215. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +31 -31
  216. package/linthost/rules_unicorn_no_accessor_recursion.go +69 -69
  217. package/linthost/rules_unicorn_no_anonymous_default_export.go +40 -40
  218. package/linthost/rules_unicorn_no_array_callback_reference.go +33 -33
  219. package/linthost/rules_unicorn_no_array_for_each.go +14 -14
  220. package/linthost/rules_unicorn_no_array_method_this_argument.go +29 -29
  221. package/linthost/rules_unicorn_no_array_reduce.go +15 -15
  222. package/linthost/rules_unicorn_no_array_reverse.go +17 -17
  223. package/linthost/rules_unicorn_no_array_sort.go +17 -17
  224. package/linthost/rules_unicorn_no_await_expression_member.go +12 -12
  225. package/linthost/rules_unicorn_no_await_in_promise_methods.go +38 -38
  226. package/linthost/rules_unicorn_no_console_spaces.go +30 -30
  227. package/linthost/rules_unicorn_no_document_cookie.go +13 -13
  228. package/linthost/rules_unicorn_no_empty_file.go +16 -16
  229. package/linthost/rules_unicorn_no_for_loop.go +58 -58
  230. package/linthost/rules_unicorn_no_hex_escape.go +11 -11
  231. package/linthost/rules_unicorn_no_immediate_mutation.go +55 -55
  232. package/linthost/rules_unicorn_no_instanceof_builtins.go +34 -34
  233. package/linthost/rules_unicorn_no_invalid_fetch_options.go +52 -52
  234. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +25 -25
  235. package/linthost/rules_unicorn_no_keyword_prefix.go +56 -56
  236. package/linthost/rules_unicorn_no_lonely_if.go +21 -21
  237. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +22 -22
  238. package/linthost/rules_unicorn_no_named_default.go +25 -25
  239. package/linthost/rules_unicorn_no_negated_condition.go +54 -54
  240. package/linthost/rules_unicorn_no_negation_in_equality_check.go +23 -23
  241. package/linthost/rules_unicorn_no_nested_ternary.go +15 -15
  242. package/linthost/rules_unicorn_no_new_array.go +5 -5
  243. package/linthost/rules_unicorn_no_new_buffer.go +5 -5
  244. package/linthost/rules_unicorn_no_null.go +2 -2
  245. package/linthost/rules_unicorn_no_object_as_default_parameter.go +19 -19
  246. package/linthost/rules_unicorn_no_process_exit.go +17 -17
  247. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +29 -29
  248. package/linthost/rules_unicorn_no_static_only_class.go +27 -27
  249. package/linthost/rules_unicorn_no_thenable.go +47 -47
  250. package/linthost/rules_unicorn_no_this_assignment.go +10 -10
  251. package/linthost/rules_unicorn_no_typeof_undefined.go +31 -31
  252. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +23 -23
  253. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +37 -37
  254. package/linthost/rules_unicorn_no_unnecessary_await.go +24 -24
  255. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +22 -22
  256. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +67 -67
  257. package/linthost/rules_unicorn_no_unreadable_iife.go +22 -22
  258. package/linthost/rules_unicorn_no_useless_collection_argument.go +34 -34
  259. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +18 -18
  260. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +49 -49
  261. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +41 -41
  262. package/linthost/rules_unicorn_no_useless_length_check.go +82 -82
  263. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +42 -42
  264. package/linthost/rules_unicorn_no_useless_spread.go +38 -38
  265. package/linthost/rules_unicorn_no_useless_switch_case.go +29 -29
  266. package/linthost/rules_unicorn_no_useless_undefined.go +25 -25
  267. package/linthost/rules_unicorn_no_zero_fractions.go +17 -17
  268. package/linthost/rules_unicorn_number_literal_case.go +33 -33
  269. package/linthost/rules_unicorn_numeric_separators_style.go +36 -36
  270. package/linthost/rules_unicorn_prefer_add_event_listener.go +30 -30
  271. package/linthost/rules_unicorn_prefer_array_find.go +27 -27
  272. package/linthost/rules_unicorn_prefer_array_flat.go +25 -25
  273. package/linthost/rules_unicorn_prefer_array_flat_map.go +37 -37
  274. package/linthost/rules_unicorn_prefer_array_index_of.go +108 -108
  275. package/linthost/rules_unicorn_prefer_array_some.go +43 -43
  276. package/linthost/rules_unicorn_prefer_at.go +42 -42
  277. package/linthost/rules_unicorn_prefer_bigint_literals.go +42 -42
  278. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +15 -15
  279. package/linthost/rules_unicorn_prefer_class_fields.go +57 -57
  280. package/linthost/rules_unicorn_prefer_classlist_toggle.go +76 -76
  281. package/linthost/rules_unicorn_prefer_code_point.go +21 -21
  282. package/linthost/rules_unicorn_prefer_date_now.go +47 -47
  283. package/linthost/rules_unicorn_prefer_default_parameters.go +96 -96
  284. package/linthost/rules_unicorn_prefer_dom_node_append.go +14 -14
  285. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +27 -27
  286. package/linthost/rules_unicorn_prefer_dom_node_remove.go +17 -17
  287. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +11 -11
  288. package/linthost/rules_unicorn_prefer_event_target.go +10 -10
  289. package/linthost/rules_unicorn_prefer_export_from.go +99 -99
  290. package/linthost/rules_unicorn_prefer_global_this.go +91 -91
  291. package/linthost/rules_unicorn_prefer_import_meta_properties.go +38 -38
  292. package/linthost/rules_unicorn_prefer_includes.go +108 -108
  293. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +37 -37
  294. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +10 -10
  295. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +20 -20
  296. package/linthost/rules_unicorn_prefer_math_min_max.go +33 -33
  297. package/linthost/rules_unicorn_prefer_math_trunc.go +32 -32
  298. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +18 -18
  299. package/linthost/rules_unicorn_prefer_modern_math_apis.go +38 -38
  300. package/linthost/rules_unicorn_prefer_module.go +22 -22
  301. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +73 -73
  302. package/linthost/rules_unicorn_prefer_negative_index.go +46 -46
  303. package/linthost/rules_unicorn_prefer_node_protocol.go +90 -90
  304. package/linthost/rules_unicorn_prefer_number_properties.go +57 -57
  305. package/linthost/rules_unicorn_prefer_object_from_entries.go +26 -26
  306. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +24 -24
  307. package/linthost/rules_unicorn_prefer_prototype_methods.go +25 -25
  308. package/linthost/rules_unicorn_prefer_query_selector.go +25 -25
  309. package/linthost/rules_unicorn_prefer_reflect_apply.go +10 -10
  310. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +47 -47
  311. package/linthost/rules_unicorn_prefer_response_static_json.go +26 -26
  312. package/linthost/rules_unicorn_prefer_set_has.go +16 -16
  313. package/linthost/rules_unicorn_prefer_set_size.go +22 -22
  314. package/linthost/rules_unicorn_prefer_simple_condition_first.go +3 -3
  315. package/linthost/rules_unicorn_prefer_single_call.go +59 -59
  316. package/linthost/rules_unicorn_prefer_spread.go +24 -24
  317. package/linthost/rules_unicorn_prefer_string_raw.go +12 -12
  318. package/linthost/rules_unicorn_prefer_string_replace_all.go +46 -46
  319. package/linthost/rules_unicorn_prefer_string_slice.go +17 -17
  320. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +104 -104
  321. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +21 -21
  322. package/linthost/rules_unicorn_prefer_structured_clone.go +36 -36
  323. package/linthost/rules_unicorn_prefer_switch.go +65 -65
  324. package/linthost/rules_unicorn_prefer_ternary.go +35 -35
  325. package/linthost/rules_unicorn_prefer_top_level_await.go +34 -34
  326. package/linthost/rules_unicorn_prefer_type_error.go +84 -84
  327. package/linthost/rules_unicorn_prevent_abbreviations.go +68 -68
  328. package/linthost/rules_unicorn_relative_url_style.go +19 -19
  329. package/linthost/rules_unicorn_require_array_join_separator.go +18 -18
  330. package/linthost/rules_unicorn_require_module_attributes.go +25 -25
  331. package/linthost/rules_unicorn_require_module_specifiers.go +28 -28
  332. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +18 -18
  333. package/linthost/rules_unicorn_require_post_message_target_origin.go +18 -18
  334. package/linthost/rules_unicorn_string_content.go +1 -1
  335. package/linthost/rules_unicorn_switch_case_braces.go +16 -16
  336. package/linthost/rules_unicorn_switch_case_break_position.go +3 -3
  337. package/linthost/rules_unicorn_template_indent.go +1 -1
  338. package/linthost/rules_unicorn_text_encoding_identifier_case.go +36 -36
  339. package/linthost/rules_unicorn_throw_new_error.go +30 -30
  340. package/linthost/rules_var.go +273 -3
  341. package/package.json +3 -3
  342. package/src/defaultFormat.ts +11 -7
  343. package/src/structures/ITtscLintConfig.ts +5 -5
  344. package/src/structures/TtscLintRuleSetting.ts +19 -19
  345. package/src/structures/{ITtscLintFormat.ts → format/ITtscLintFormat.ts} +48 -75
  346. package/src/structures/format/ITtscLintFormatJsDoc.ts +16 -0
  347. package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
  348. package/src/structures/format/index.ts +3 -0
  349. package/src/structures/index.ts +1 -1
  350. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +20 -31
  351. package/src/structures/rules/ITtscLintBoundariesRules.ts +32 -36
  352. package/src/structures/rules/ITtscLintContributorRules.ts +6 -7
  353. package/src/structures/rules/ITtscLintCoreRules.ts +380 -408
  354. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +5 -5
  355. package/src/structures/rules/ITtscLintCypressRules.ts +34 -38
  356. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +28 -41
  357. package/src/structures/rules/ITtscLintFunctionalRules.ts +51 -56
  358. package/src/structures/rules/ITtscLintJestRules.ts +63 -74
  359. package/src/structures/rules/ITtscLintJsdocRules.ts +47 -54
  360. package/src/structures/rules/ITtscLintJsxA11yRules.ts +94 -102
  361. package/src/structures/rules/ITtscLintNextjsRules.ts +50 -55
  362. package/src/structures/rules/ITtscLintPlaywrightRules.ts +104 -122
  363. package/src/structures/rules/ITtscLintPromiseRules.ts +62 -71
  364. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +4 -4
  365. package/src/structures/rules/ITtscLintReactPerfRules.ts +17 -19
  366. package/src/structures/rules/ITtscLintReactRuleOptions.ts +8 -10
  367. package/src/structures/rules/ITtscLintReactRules.ts +91 -104
  368. package/src/structures/rules/ITtscLintRegexpRules.ts +46 -54
  369. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +7 -8
  370. package/src/structures/rules/ITtscLintSecurityRules.ts +45 -52
  371. package/src/structures/rules/ITtscLintSolidRules.ts +53 -56
  372. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +3 -4
  373. package/src/structures/rules/ITtscLintStorybookRules.ts +60 -69
  374. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +31 -37
  375. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +2 -3
  376. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +102 -119
  377. package/src/structures/rules/ITtscLintTypeScriptRules.ts +460 -518
  378. package/src/structures/rules/ITtscLintVitestRules.ts +43 -51
  379. package/lib/structures/ITtscLintFormat.js.map +0 -1
  380. /package/lib/structures/{ITtscLintFormat.js → format/ITtscLintFormat.js} +0 -0
@@ -19,19 +19,19 @@ type unicornPreferGlobalThis struct{}
19
19
 
20
20
  func (unicornPreferGlobalThis) Name() string { return "unicorn/prefer-global-this" }
21
21
  func (unicornPreferGlobalThis) Visits() []shimast.Kind {
22
- return []shimast.Kind{shimast.KindIdentifier}
22
+ return []shimast.Kind{shimast.KindIdentifier}
23
23
  }
24
24
  func (unicornPreferGlobalThis) Check(ctx *Context, node *shimast.Node) {
25
- name := identifierText(node)
26
- switch name {
27
- case "window", "self", "global":
28
- default:
29
- return
30
- }
31
- if !isUnicornValuePositionIdentifier(node) {
32
- return
33
- }
34
- ctx.Report(node, "Prefer `globalThis` over `window` / `self` / `global`.")
25
+ name := identifierText(node)
26
+ switch name {
27
+ case "window", "self", "global":
28
+ default:
29
+ return
30
+ }
31
+ if !isUnicornValuePositionIdentifier(node) {
32
+ return
33
+ }
34
+ ctx.Report(node, "Prefer `globalThis` over `window` / `self` / `global`.")
35
35
  }
36
36
 
37
37
  // isUnicornValuePositionIdentifier reports whether `node` (a bare
@@ -41,87 +41,87 @@ func (unicornPreferGlobalThis) Check(ctx *Context, node *shimast.Node) {
41
41
  // for the *name* itself, so they must not contribute to rules that
42
42
  // flag *uses* of a global.
43
43
  func isUnicornValuePositionIdentifier(node *shimast.Node) bool {
44
- if node == nil || node.Kind != shimast.KindIdentifier || node.Parent == nil {
45
- return false
46
- }
47
- parent := node.Parent
48
- switch parent.Kind {
49
- case shimast.KindVariableDeclaration:
50
- decl := parent.AsVariableDeclaration()
51
- if decl != nil && decl.Name() == node {
52
- return false
53
- }
54
- case shimast.KindBindingElement:
55
- elem := parent.AsBindingElement()
56
- if elem != nil && elem.Name() == node {
57
- return false
58
- }
59
- case shimast.KindParameter:
60
- param := parent.AsParameterDeclaration()
61
- if param != nil && param.Name() == node {
62
- return false
63
- }
64
- case shimast.KindFunctionDeclaration:
65
- fn := parent.AsFunctionDeclaration()
66
- if fn != nil && fn.Name() == node {
67
- return false
68
- }
69
- case shimast.KindFunctionExpression:
70
- fn := parent.AsFunctionExpression()
71
- if fn != nil && fn.Name() == node {
72
- return false
73
- }
74
- case shimast.KindClassDeclaration:
75
- cls := parent.AsClassDeclaration()
76
- if cls != nil && cls.Name() == node {
77
- return false
78
- }
79
- case shimast.KindClassExpression:
80
- cls := parent.AsClassExpression()
81
- if cls != nil && cls.Name() == node {
82
- return false
83
- }
84
- case shimast.KindPropertyAccessExpression:
85
- access := parent.AsPropertyAccessExpression()
86
- if access != nil && access.Name() == node {
87
- return false
88
- }
89
- case shimast.KindPropertyAssignment:
90
- prop := parent.AsPropertyAssignment()
91
- if prop != nil && prop.Name() == node {
92
- return false
93
- }
94
- case shimast.KindShorthandPropertyAssignment:
95
- // `{window}` shorthand — the identifier is both name and read,
96
- // but the read here is the value position, so allow.
97
- case shimast.KindMethodDeclaration,
98
- shimast.KindGetAccessor,
99
- shimast.KindSetAccessor,
100
- shimast.KindPropertyDeclaration:
101
- // These have a Name() slot that is not a value expression.
102
- return false
103
- case shimast.KindTypeReference,
104
- shimast.KindQualifiedName,
105
- shimast.KindImportSpecifier,
106
- shimast.KindExportSpecifier,
107
- shimast.KindNamespaceImport,
108
- shimast.KindImportClause,
109
- shimast.KindNamespaceExport,
110
- shimast.KindLabeledStatement,
111
- shimast.KindBreakStatement,
112
- shimast.KindContinueStatement,
113
- shimast.KindJsxAttribute,
114
- shimast.KindEnumDeclaration,
115
- shimast.KindEnumMember,
116
- shimast.KindModuleDeclaration,
117
- shimast.KindTypeParameter,
118
- shimast.KindInterfaceDeclaration,
119
- shimast.KindTypeAliasDeclaration:
120
- return false
121
- }
122
- return true
44
+ if node == nil || node.Kind != shimast.KindIdentifier || node.Parent == nil {
45
+ return false
46
+ }
47
+ parent := node.Parent
48
+ switch parent.Kind {
49
+ case shimast.KindVariableDeclaration:
50
+ decl := parent.AsVariableDeclaration()
51
+ if decl != nil && decl.Name() == node {
52
+ return false
53
+ }
54
+ case shimast.KindBindingElement:
55
+ elem := parent.AsBindingElement()
56
+ if elem != nil && elem.Name() == node {
57
+ return false
58
+ }
59
+ case shimast.KindParameter:
60
+ param := parent.AsParameterDeclaration()
61
+ if param != nil && param.Name() == node {
62
+ return false
63
+ }
64
+ case shimast.KindFunctionDeclaration:
65
+ fn := parent.AsFunctionDeclaration()
66
+ if fn != nil && fn.Name() == node {
67
+ return false
68
+ }
69
+ case shimast.KindFunctionExpression:
70
+ fn := parent.AsFunctionExpression()
71
+ if fn != nil && fn.Name() == node {
72
+ return false
73
+ }
74
+ case shimast.KindClassDeclaration:
75
+ cls := parent.AsClassDeclaration()
76
+ if cls != nil && cls.Name() == node {
77
+ return false
78
+ }
79
+ case shimast.KindClassExpression:
80
+ cls := parent.AsClassExpression()
81
+ if cls != nil && cls.Name() == node {
82
+ return false
83
+ }
84
+ case shimast.KindPropertyAccessExpression:
85
+ access := parent.AsPropertyAccessExpression()
86
+ if access != nil && access.Name() == node {
87
+ return false
88
+ }
89
+ case shimast.KindPropertyAssignment:
90
+ prop := parent.AsPropertyAssignment()
91
+ if prop != nil && prop.Name() == node {
92
+ return false
93
+ }
94
+ case shimast.KindShorthandPropertyAssignment:
95
+ // `{window}` shorthand — the identifier is both name and read,
96
+ // but the read here is the value position, so allow.
97
+ case shimast.KindMethodDeclaration,
98
+ shimast.KindGetAccessor,
99
+ shimast.KindSetAccessor,
100
+ shimast.KindPropertyDeclaration:
101
+ // These have a Name() slot that is not a value expression.
102
+ return false
103
+ case shimast.KindTypeReference,
104
+ shimast.KindQualifiedName,
105
+ shimast.KindImportSpecifier,
106
+ shimast.KindExportSpecifier,
107
+ shimast.KindNamespaceImport,
108
+ shimast.KindImportClause,
109
+ shimast.KindNamespaceExport,
110
+ shimast.KindLabeledStatement,
111
+ shimast.KindBreakStatement,
112
+ shimast.KindContinueStatement,
113
+ shimast.KindJsxAttribute,
114
+ shimast.KindEnumDeclaration,
115
+ shimast.KindEnumMember,
116
+ shimast.KindModuleDeclaration,
117
+ shimast.KindTypeParameter,
118
+ shimast.KindInterfaceDeclaration,
119
+ shimast.KindTypeAliasDeclaration:
120
+ return false
121
+ }
122
+ return true
123
123
  }
124
124
 
125
125
  func init() {
126
- Register(unicornPreferGlobalThis{})
126
+ Register(unicornPreferGlobalThis{})
127
127
  }
@@ -18,49 +18,49 @@ import shimast "github.com/microsoft/typescript-go/shim/ast"
18
18
  type unicornPreferImportMetaProperties struct{}
19
19
 
20
20
  func (unicornPreferImportMetaProperties) Name() string {
21
- return "unicorn/prefer-import-meta-properties"
21
+ return "unicorn/prefer-import-meta-properties"
22
22
  }
23
23
  func (unicornPreferImportMetaProperties) Visits() []shimast.Kind {
24
- return []shimast.Kind{shimast.KindCallExpression}
24
+ return []shimast.Kind{shimast.KindCallExpression}
25
25
  }
26
26
  func (unicornPreferImportMetaProperties) Check(ctx *Context, node *shimast.Node) {
27
- call := node.AsCallExpression()
28
- if call == nil || call.Expression == nil {
29
- return
30
- }
31
- if identifierText(call.Expression) != "fileURLToPath" {
32
- return
33
- }
34
- if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
35
- return
36
- }
37
- arg := stripParens(call.Arguments.Nodes[0])
38
- if arg == nil || arg.Kind != shimast.KindPropertyAccessExpression {
39
- return
40
- }
41
- access := arg.AsPropertyAccessExpression()
42
- if access == nil {
43
- return
44
- }
45
- if identifierText(access.Name()) != "url" {
46
- return
47
- }
48
- receiver := stripParens(access.Expression)
49
- if receiver == nil {
50
- return
51
- }
52
- // `import.meta` parses as either a MetaProperty token or a
53
- // PropertyAccess(import, meta) chain depending on the path; both
54
- // resolve textually to the same source span.
55
- if receiver.Kind == shimast.KindMetaProperty {
56
- ctx.Report(node, "Prefer `import.meta.dirname` / `import.meta.filename` over `fileURLToPath(import.meta.url)`.")
57
- return
58
- }
59
- if isMatchingPropertyAccess(receiver, "import", "meta") {
60
- ctx.Report(node, "Prefer `import.meta.dirname` / `import.meta.filename` over `fileURLToPath(import.meta.url)`.")
61
- }
27
+ call := node.AsCallExpression()
28
+ if call == nil || call.Expression == nil {
29
+ return
30
+ }
31
+ if identifierText(call.Expression) != "fileURLToPath" {
32
+ return
33
+ }
34
+ if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
35
+ return
36
+ }
37
+ arg := stripParens(call.Arguments.Nodes[0])
38
+ if arg == nil || arg.Kind != shimast.KindPropertyAccessExpression {
39
+ return
40
+ }
41
+ access := arg.AsPropertyAccessExpression()
42
+ if access == nil {
43
+ return
44
+ }
45
+ if identifierText(access.Name()) != "url" {
46
+ return
47
+ }
48
+ receiver := stripParens(access.Expression)
49
+ if receiver == nil {
50
+ return
51
+ }
52
+ // `import.meta` parses as either a MetaProperty token or a
53
+ // PropertyAccess(import, meta) chain depending on the path; both
54
+ // resolve textually to the same source span.
55
+ if receiver.Kind == shimast.KindMetaProperty {
56
+ ctx.Report(node, "Prefer `import.meta.dirname` / `import.meta.filename` over `fileURLToPath(import.meta.url)`.")
57
+ return
58
+ }
59
+ if isMatchingPropertyAccess(receiver, "import", "meta") {
60
+ ctx.Report(node, "Prefer `import.meta.dirname` / `import.meta.filename` over `fileURLToPath(import.meta.url)`.")
61
+ }
62
62
  }
63
63
 
64
64
  func init() {
65
- Register(unicornPreferImportMetaProperties{})
65
+ Register(unicornPreferImportMetaProperties{})
66
66
  }
@@ -23,127 +23,127 @@ type unicornPreferIncludes struct{}
23
23
 
24
24
  func (unicornPreferIncludes) Name() string { return "unicorn/prefer-includes" }
25
25
  func (unicornPreferIncludes) Visits() []shimast.Kind {
26
- return []shimast.Kind{shimast.KindBinaryExpression}
26
+ return []shimast.Kind{shimast.KindBinaryExpression}
27
27
  }
28
28
  func (unicornPreferIncludes) Check(ctx *Context, node *shimast.Node) {
29
- bin := node.AsBinaryExpression()
30
- if bin == nil || bin.OperatorToken == nil || bin.Left == nil || bin.Right == nil {
31
- return
32
- }
33
- op := bin.OperatorToken.Kind
34
- wantNegOne := false
35
- wantZero := false
36
- switch op {
37
- case shimast.KindEqualsEqualsEqualsToken,
38
- shimast.KindExclamationEqualsEqualsToken,
39
- shimast.KindEqualsEqualsToken,
40
- shimast.KindExclamationEqualsToken:
41
- wantNegOne = true
42
- case shimast.KindLessThanToken:
43
- // `indexOf(x) < 0`
44
- wantZero = true
45
- case shimast.KindGreaterThanEqualsToken:
46
- // `indexOf(x) >= 0`
47
- wantZero = true
48
- case shimast.KindGreaterThanToken:
49
- // Not in the canonical set for this orientation; handled below
50
- // via `> -1` matching against the negative-one form.
51
- wantNegOne = true
52
- default:
53
- return
54
- }
55
- left := stripParens(bin.Left)
56
- right := stripParens(bin.Right)
57
- matched := unicornPreferIncludesMatches(left, right, op, wantNegOne, wantZero)
58
- // Equality is symmetric — also try the swapped orientation.
59
- // Asymmetric operators (`<`, `>=`, `>`) only match the canonical
60
- // orientation; swapping `indexOf(x) < 0` to `0 < indexOf(x)` changes
61
- // the meaning ("found at index >= 1") and must not be rewritten.
62
- if !matched {
63
- switch op {
64
- case shimast.KindEqualsEqualsEqualsToken,
65
- shimast.KindExclamationEqualsEqualsToken,
66
- shimast.KindEqualsEqualsToken,
67
- shimast.KindExclamationEqualsToken:
68
- matched = unicornPreferIncludesMatches(right, left, op, wantNegOne, wantZero)
69
- }
70
- }
71
- if matched {
72
- ctx.Report(node, "Prefer `Array#includes()` / `String#includes()` over `indexOf` comparisons.")
73
- }
29
+ bin := node.AsBinaryExpression()
30
+ if bin == nil || bin.OperatorToken == nil || bin.Left == nil || bin.Right == nil {
31
+ return
32
+ }
33
+ op := bin.OperatorToken.Kind
34
+ wantNegOne := false
35
+ wantZero := false
36
+ switch op {
37
+ case shimast.KindEqualsEqualsEqualsToken,
38
+ shimast.KindExclamationEqualsEqualsToken,
39
+ shimast.KindEqualsEqualsToken,
40
+ shimast.KindExclamationEqualsToken:
41
+ wantNegOne = true
42
+ case shimast.KindLessThanToken:
43
+ // `indexOf(x) < 0`
44
+ wantZero = true
45
+ case shimast.KindGreaterThanEqualsToken:
46
+ // `indexOf(x) >= 0`
47
+ wantZero = true
48
+ case shimast.KindGreaterThanToken:
49
+ // Not in the canonical set for this orientation; handled below
50
+ // via `> -1` matching against the negative-one form.
51
+ wantNegOne = true
52
+ default:
53
+ return
54
+ }
55
+ left := stripParens(bin.Left)
56
+ right := stripParens(bin.Right)
57
+ matched := unicornPreferIncludesMatches(left, right, op, wantNegOne, wantZero)
58
+ // Equality is symmetric — also try the swapped orientation.
59
+ // Asymmetric operators (`<`, `>=`, `>`) only match the canonical
60
+ // orientation; swapping `indexOf(x) < 0` to `0 < indexOf(x)` changes
61
+ // the meaning ("found at index >= 1") and must not be rewritten.
62
+ if !matched {
63
+ switch op {
64
+ case shimast.KindEqualsEqualsEqualsToken,
65
+ shimast.KindExclamationEqualsEqualsToken,
66
+ shimast.KindEqualsEqualsToken,
67
+ shimast.KindExclamationEqualsToken:
68
+ matched = unicornPreferIncludesMatches(right, left, op, wantNegOne, wantZero)
69
+ }
70
+ }
71
+ if matched {
72
+ ctx.Report(node, "Prefer `Array#includes()` / `String#includes()` over `indexOf` comparisons.")
73
+ }
74
74
  }
75
75
 
76
76
  func unicornPreferIncludesMatches(
77
- callSide, literalSide *shimast.Node,
78
- op shimast.Kind,
79
- wantNegOne, wantZero bool,
77
+ callSide, literalSide *shimast.Node,
78
+ op shimast.Kind,
79
+ wantNegOne, wantZero bool,
80
80
  ) bool {
81
- if callSide == nil || literalSide == nil {
82
- return false
83
- }
84
- if callSide.Kind != shimast.KindCallExpression {
85
- return false
86
- }
87
- call := callSide.AsCallExpression()
88
- if call == nil || call.Expression == nil ||
89
- call.Expression.Kind != shimast.KindPropertyAccessExpression {
90
- return false
91
- }
92
- access := call.Expression.AsPropertyAccessExpression()
93
- if access == nil || identifierText(access.Name()) != "indexOf" {
94
- return false
95
- }
96
- // `> -1`, `>= 0`, `< 0`, `=== -1`, `!== -1`, `== -1`, `!= -1`.
97
- switch op {
98
- case shimast.KindGreaterThanToken:
99
- // Only `indexOf(x) > -1` matches.
100
- return unicornPreferIncludesIsNegativeOne(literalSide)
101
- case shimast.KindLessThanToken:
102
- // Only `indexOf(x) < 0` matches.
103
- return unicornPreferIncludesIsZero(literalSide)
104
- case shimast.KindGreaterThanEqualsToken:
105
- // Only `indexOf(x) >= 0` matches.
106
- return unicornPreferIncludesIsZero(literalSide)
107
- }
108
- if wantNegOne && unicornPreferIncludesIsNegativeOne(literalSide) {
109
- return true
110
- }
111
- if wantZero && unicornPreferIncludesIsZero(literalSide) {
112
- return true
113
- }
114
- return false
81
+ if callSide == nil || literalSide == nil {
82
+ return false
83
+ }
84
+ if callSide.Kind != shimast.KindCallExpression {
85
+ return false
86
+ }
87
+ call := callSide.AsCallExpression()
88
+ if call == nil || call.Expression == nil ||
89
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
90
+ return false
91
+ }
92
+ access := call.Expression.AsPropertyAccessExpression()
93
+ if access == nil || identifierText(access.Name()) != "indexOf" {
94
+ return false
95
+ }
96
+ // `> -1`, `>= 0`, `< 0`, `=== -1`, `!== -1`, `== -1`, `!= -1`.
97
+ switch op {
98
+ case shimast.KindGreaterThanToken:
99
+ // Only `indexOf(x) > -1` matches.
100
+ return unicornPreferIncludesIsNegativeOne(literalSide)
101
+ case shimast.KindLessThanToken:
102
+ // Only `indexOf(x) < 0` matches.
103
+ return unicornPreferIncludesIsZero(literalSide)
104
+ case shimast.KindGreaterThanEqualsToken:
105
+ // Only `indexOf(x) >= 0` matches.
106
+ return unicornPreferIncludesIsZero(literalSide)
107
+ }
108
+ if wantNegOne && unicornPreferIncludesIsNegativeOne(literalSide) {
109
+ return true
110
+ }
111
+ if wantZero && unicornPreferIncludesIsZero(literalSide) {
112
+ return true
113
+ }
114
+ return false
115
115
  }
116
116
 
117
117
  func unicornPreferIncludesIsNegativeOne(node *shimast.Node) bool {
118
- node = stripParens(node)
119
- if node == nil {
120
- return false
121
- }
122
- if node.Kind == shimast.KindPrefixUnaryExpression {
123
- prefix := node.AsPrefixUnaryExpression()
124
- if prefix == nil || prefix.Operator != shimast.KindMinusToken || prefix.Operand == nil {
125
- return false
126
- }
127
- if prefix.Operand.Kind != shimast.KindNumericLiteral {
128
- return false
129
- }
130
- return numericLiteralText(prefix.Operand) == "1"
131
- }
132
- if node.Kind == shimast.KindNumericLiteral {
133
- // Some tokenizers preserve the leading `-` in the literal text.
134
- return numericLiteralText(node) == "-1"
135
- }
136
- return false
118
+ node = stripParens(node)
119
+ if node == nil {
120
+ return false
121
+ }
122
+ if node.Kind == shimast.KindPrefixUnaryExpression {
123
+ prefix := node.AsPrefixUnaryExpression()
124
+ if prefix == nil || prefix.Operator != shimast.KindMinusToken || prefix.Operand == nil {
125
+ return false
126
+ }
127
+ if prefix.Operand.Kind != shimast.KindNumericLiteral {
128
+ return false
129
+ }
130
+ return numericLiteralText(prefix.Operand) == "1"
131
+ }
132
+ if node.Kind == shimast.KindNumericLiteral {
133
+ // Some tokenizers preserve the leading `-` in the literal text.
134
+ return numericLiteralText(node) == "-1"
135
+ }
136
+ return false
137
137
  }
138
138
 
139
139
  func unicornPreferIncludesIsZero(node *shimast.Node) bool {
140
- node = stripParens(node)
141
- if node == nil || node.Kind != shimast.KindNumericLiteral {
142
- return false
143
- }
144
- return numericLiteralText(node) == "0"
140
+ node = stripParens(node)
141
+ if node == nil || node.Kind != shimast.KindNumericLiteral {
142
+ return false
143
+ }
144
+ return numericLiteralText(node) == "0"
145
145
  }
146
146
 
147
147
  func init() {
148
- Register(unicornPreferIncludes{})
148
+ Register(unicornPreferIncludes{})
149
149
  }
@@ -20,46 +20,46 @@ type unicornPreferJsonParseBuffer struct{}
20
20
 
21
21
  func (unicornPreferJsonParseBuffer) Name() string { return "unicorn/prefer-json-parse-buffer" }
22
22
  func (unicornPreferJsonParseBuffer) Visits() []shimast.Kind {
23
- return []shimast.Kind{shimast.KindCallExpression}
23
+ return []shimast.Kind{shimast.KindCallExpression}
24
24
  }
25
25
  func (unicornPreferJsonParseBuffer) Check(ctx *Context, node *shimast.Node) {
26
- call := node.AsCallExpression()
27
- if call == nil || call.Expression == nil || call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
28
- return
29
- }
30
- // Callee must be `JSON.parse`.
31
- if call.Expression.Kind != shimast.KindPropertyAccessExpression {
32
- return
33
- }
34
- access := call.Expression.AsPropertyAccessExpression()
35
- if access == nil {
36
- return
37
- }
38
- if identifierText(access.Expression) != "JSON" || identifierText(access.Name()) != "parse" {
39
- return
40
- }
41
- // Argument must be `_.toString()` with no arguments.
42
- arg := stripParens(call.Arguments.Nodes[0])
43
- if arg == nil || arg.Kind != shimast.KindCallExpression {
44
- return
45
- }
46
- innerCall := arg.AsCallExpression()
47
- if innerCall == nil || innerCall.Expression == nil {
48
- return
49
- }
50
- if innerCall.Arguments != nil && len(innerCall.Arguments.Nodes) != 0 {
51
- return
52
- }
53
- if innerCall.Expression.Kind != shimast.KindPropertyAccessExpression {
54
- return
55
- }
56
- innerAccess := innerCall.Expression.AsPropertyAccessExpression()
57
- if innerAccess == nil || identifierText(innerAccess.Name()) != "toString" {
58
- return
59
- }
60
- ctx.Report(node, "Prefer passing a `Buffer` directly to `JSON.parse` (Node 21+) over decoding to a string first.")
26
+ call := node.AsCallExpression()
27
+ if call == nil || call.Expression == nil || call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
28
+ return
29
+ }
30
+ // Callee must be `JSON.parse`.
31
+ if call.Expression.Kind != shimast.KindPropertyAccessExpression {
32
+ return
33
+ }
34
+ access := call.Expression.AsPropertyAccessExpression()
35
+ if access == nil {
36
+ return
37
+ }
38
+ if identifierText(access.Expression) != "JSON" || identifierText(access.Name()) != "parse" {
39
+ return
40
+ }
41
+ // Argument must be `_.toString()` with no arguments.
42
+ arg := stripParens(call.Arguments.Nodes[0])
43
+ if arg == nil || arg.Kind != shimast.KindCallExpression {
44
+ return
45
+ }
46
+ innerCall := arg.AsCallExpression()
47
+ if innerCall == nil || innerCall.Expression == nil {
48
+ return
49
+ }
50
+ if innerCall.Arguments != nil && len(innerCall.Arguments.Nodes) != 0 {
51
+ return
52
+ }
53
+ if innerCall.Expression.Kind != shimast.KindPropertyAccessExpression {
54
+ return
55
+ }
56
+ innerAccess := innerCall.Expression.AsPropertyAccessExpression()
57
+ if innerAccess == nil || identifierText(innerAccess.Name()) != "toString" {
58
+ return
59
+ }
60
+ ctx.Report(node, "Prefer passing a `Buffer` directly to `JSON.parse` (Node 21+) over decoding to a string first.")
61
61
  }
62
62
 
63
63
  func init() {
64
- Register(unicornPreferJsonParseBuffer{})
64
+ Register(unicornPreferJsonParseBuffer{})
65
65
  }
@@ -20,19 +20,19 @@ type unicornPreferKeyboardEventKey struct{}
20
20
 
21
21
  func (unicornPreferKeyboardEventKey) Name() string { return "unicorn/prefer-keyboard-event-key" }
22
22
  func (unicornPreferKeyboardEventKey) Visits() []shimast.Kind {
23
- return []shimast.Kind{shimast.KindPropertyAccessExpression}
23
+ return []shimast.Kind{shimast.KindPropertyAccessExpression}
24
24
  }
25
25
  func (unicornPreferKeyboardEventKey) Check(ctx *Context, node *shimast.Node) {
26
- access := node.AsPropertyAccessExpression()
27
- if access == nil {
28
- return
29
- }
30
- switch identifierText(access.Name()) {
31
- case "keyCode", "charCode", "which":
32
- ctx.Report(node, "Prefer `KeyboardEvent#key` over the deprecated `keyCode` / `charCode` / `which`.")
33
- }
26
+ access := node.AsPropertyAccessExpression()
27
+ if access == nil {
28
+ return
29
+ }
30
+ switch identifierText(access.Name()) {
31
+ case "keyCode", "charCode", "which":
32
+ ctx.Report(node, "Prefer `KeyboardEvent#key` over the deprecated `keyCode` / `charCode` / `which`.")
33
+ }
34
34
  }
35
35
 
36
36
  func init() {
37
- Register(unicornPreferKeyboardEventKey{})
37
+ Register(unicornPreferKeyboardEventKey{})
38
38
  }