@ttsc/lint 0.14.0-dev.20260529.2 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +23 -25
  2. package/lib/defaultFormat.d.ts +10 -6
  3. package/lib/defaultFormat.js +10 -6
  4. package/lib/defaultFormat.js.map +1 -1
  5. package/lib/structures/ITtscLintConfig.d.ts +5 -5
  6. package/lib/structures/TtscLintRuleSetting.d.ts +19 -19
  7. package/lib/structures/{ITtscLintFormat.d.ts → format/ITtscLintFormat.d.ts} +45 -70
  8. package/lib/structures/format/ITtscLintFormat.js.map +1 -0
  9. package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +15 -0
  10. package/lib/structures/format/ITtscLintFormatJsDoc.js +3 -0
  11. package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
  12. package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
  13. package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
  14. package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
  15. package/lib/structures/format/index.d.ts +3 -0
  16. package/lib/structures/format/index.js +20 -0
  17. package/lib/structures/format/index.js.map +1 -0
  18. package/lib/structures/index.d.ts +1 -1
  19. package/lib/structures/index.js +1 -1
  20. package/lib/structures/index.js.map +1 -1
  21. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +18 -27
  22. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +4 -5
  23. package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -1
  24. package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +29 -33
  25. package/lib/structures/rules/ITtscLintContributorRules.d.ts +6 -7
  26. package/lib/structures/rules/ITtscLintCoreRules.d.ts +380 -408
  27. package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +5 -5
  28. package/lib/structures/rules/ITtscLintCypressRuleOptions.js +2 -2
  29. package/lib/structures/rules/ITtscLintCypressRules.d.ts +34 -38
  30. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +21 -24
  31. package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +2 -2
  32. package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +51 -56
  33. package/lib/structures/rules/ITtscLintJestRules.d.ts +63 -74
  34. package/lib/structures/rules/ITtscLintJsdocRules.d.ts +47 -54
  35. package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +94 -102
  36. package/lib/structures/rules/ITtscLintNextjsRules.d.ts +50 -55
  37. package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +104 -122
  38. package/lib/structures/rules/ITtscLintPromiseRules.d.ts +62 -71
  39. package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +4 -4
  40. package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +17 -19
  41. package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +8 -10
  42. package/lib/structures/rules/ITtscLintReactRuleOptions.js +1 -2
  43. package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -1
  44. package/lib/structures/rules/ITtscLintReactRules.d.ts +91 -104
  45. package/lib/structures/rules/ITtscLintRegexpRules.d.ts +46 -54
  46. package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +7 -8
  47. package/lib/structures/rules/ITtscLintSecurityRules.d.ts +45 -52
  48. package/lib/structures/rules/ITtscLintSolidRules.d.ts +53 -56
  49. package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +3 -4
  50. package/lib/structures/rules/ITtscLintStorybookRules.d.ts +60 -69
  51. package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +31 -37
  52. package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +2 -3
  53. package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +102 -119
  54. package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +460 -518
  55. package/lib/structures/rules/ITtscLintVitestRules.d.ts +43 -51
  56. package/linthost/config.go +89 -72
  57. package/linthost/config_format.go +265 -99
  58. package/linthost/directives.go +5 -1
  59. package/linthost/display_width.go +72 -0
  60. package/linthost/fix.go +26 -1
  61. package/linthost/format.go +222 -25
  62. package/linthost/format_editor_settings.go +262 -0
  63. package/linthost/lsp.go +8 -4
  64. package/linthost/print_dispatch.go +3 -0
  65. package/linthost/print_doc.go +13 -0
  66. package/linthost/print_engine.go +68 -11
  67. package/linthost/print_nodes_array.go +167 -5
  68. package/linthost/print_nodes_call.go +786 -77
  69. package/linthost/print_nodes_function.go +43 -0
  70. package/linthost/print_nodes_imports.go +64 -14
  71. package/linthost/print_nodes_list.go +214 -8
  72. package/linthost/print_nodes_object.go +14 -6
  73. package/linthost/print_nodes_ternary.go +147 -0
  74. package/linthost/rules_boundaries.go +400 -400
  75. package/linthost/rules_camelcase.go +81 -81
  76. package/linthost/rules_complexity.go +52 -51
  77. package/linthost/rules_consistent_return.go +81 -81
  78. package/linthost/rules_core_extra.go +472 -472
  79. package/linthost/rules_curly.go +43 -43
  80. package/linthost/rules_default_case.go +15 -15
  81. package/linthost/rules_default_case_last.go +22 -22
  82. package/linthost/rules_format_arrow_parens.go +213 -0
  83. package/linthost/rules_format_bracket_spacing.go +117 -0
  84. package/linthost/rules_format_clause_join.go +179 -0
  85. package/linthost/rules_format_declaration_header.go +664 -0
  86. package/linthost/rules_format_indent.go +616 -0
  87. package/linthost/rules_format_jsdoc.go +4 -4
  88. package/linthost/rules_format_orphan_semi.go +106 -0
  89. package/linthost/rules_format_parameter_properties.go +175 -0
  90. package/linthost/rules_format_print_width.go +180 -69
  91. package/linthost/rules_format_quote_props.go +169 -0
  92. package/linthost/rules_format_quotes.go +75 -29
  93. package/linthost/rules_format_semi.go +185 -10
  94. package/linthost/rules_format_sort_imports.go +517 -121
  95. package/linthost/rules_format_statement_split.go +368 -0
  96. package/linthost/rules_format_ternary_nullish_parens.go +77 -0
  97. package/linthost/rules_format_trailing_comma.go +21 -2
  98. package/linthost/rules_format_whitespace.go +336 -0
  99. package/linthost/rules_functional.go +688 -688
  100. package/linthost/rules_gap.go +146 -11
  101. package/linthost/rules_grouped_accessor_pairs.go +60 -60
  102. package/linthost/rules_guard_for_in.go +122 -122
  103. package/linthost/rules_id_length.go +44 -44
  104. package/linthost/rules_imports.go +11 -3
  105. package/linthost/rules_init_declarations.go +25 -25
  106. package/linthost/rules_jsx_a11y.go +844 -844
  107. package/linthost/rules_max_classes_per_file.go +24 -24
  108. package/linthost/rules_max_depth.go +43 -43
  109. package/linthost/rules_max_lines.go +53 -53
  110. package/linthost/rules_max_lines_per_function.go +28 -28
  111. package/linthost/rules_max_nested_callbacks.go +26 -26
  112. package/linthost/rules_max_params.go +20 -20
  113. package/linthost/rules_max_statements.go +29 -29
  114. package/linthost/rules_nextjs.go +5 -5
  115. package/linthost/rules_no_else_return.go +38 -38
  116. package/linthost/rules_no_empty_named_blocks.go +45 -45
  117. package/linthost/rules_no_import_assign.go +96 -96
  118. package/linthost/rules_no_invalid_this.go +19 -19
  119. package/linthost/rules_no_loop_func.go +43 -43
  120. package/linthost/rules_no_magic_numbers.go +60 -60
  121. package/linthost/rules_no_mixed_operators.go +44 -44
  122. package/linthost/rules_no_param_reassign.go +64 -64
  123. package/linthost/rules_no_restricted_imports.go +45 -45
  124. package/linthost/rules_no_restricted_syntax.go +17 -17
  125. package/linthost/rules_no_shadow.go +112 -112
  126. package/linthost/rules_no_unreachable.go +36 -36
  127. package/linthost/rules_no_useless_assignment.go +79 -79
  128. package/linthost/rules_no_useless_constructor.go +167 -167
  129. package/linthost/rules_no_useless_return.go +28 -28
  130. package/linthost/rules_prefer_arrow_callback.go +74 -74
  131. package/linthost/rules_prefer_destructuring.go +61 -61
  132. package/linthost/rules_prefer_named_capture_group.go +87 -87
  133. package/linthost/rules_prefer_rest_params.go +61 -61
  134. package/linthost/rules_promise.go +800 -800
  135. package/linthost/rules_react.go +600 -600
  136. package/linthost/rules_react_extras.go +162 -162
  137. package/linthost/rules_react_hooks.go +2 -2
  138. package/linthost/rules_react_perf.go +231 -231
  139. package/linthost/rules_regexp.go +293 -293
  140. package/linthost/rules_security.go +613 -613
  141. package/linthost/rules_sort_imports.go +37 -37
  142. package/linthost/rules_sort_keys.go +88 -88
  143. package/linthost/rules_suggestions.go +13 -0
  144. package/linthost/rules_ts.go +2 -2
  145. package/linthost/rules_ts_async.go +247 -247
  146. package/linthost/rules_ts_class_literal_property_style.go +64 -64
  147. package/linthost/rules_ts_consistent_type_exports.go +209 -209
  148. package/linthost/rules_ts_explicit_function_return_type.go +35 -35
  149. package/linthost/rules_ts_extra.go +6 -2
  150. package/linthost/rules_ts_no_base_to_string.go +140 -140
  151. package/linthost/rules_ts_no_confusing_void.go +28 -28
  152. package/linthost/rules_ts_no_deprecated.go +110 -110
  153. package/linthost/rules_ts_no_for_in_array.go +45 -45
  154. package/linthost/rules_ts_no_magic_numbers.go +67 -67
  155. package/linthost/rules_ts_no_meaningless_void_operator.go +44 -44
  156. package/linthost/rules_ts_no_misused_spread.go +64 -64
  157. package/linthost/rules_ts_no_redundant_type_constituents.go +72 -72
  158. package/linthost/rules_ts_no_restricted_types.go +28 -28
  159. package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +87 -87
  160. package/linthost/rules_ts_no_unnecessary_condition.go +184 -184
  161. package/linthost/rules_ts_no_unnecessary_qualifier.go +72 -72
  162. package/linthost/rules_ts_no_unnecessary_template_expression.go +120 -120
  163. package/linthost/rules_ts_no_unnecessary_type_arguments.go +171 -171
  164. package/linthost/rules_ts_no_unnecessary_type_assertion.go +90 -90
  165. package/linthost/rules_ts_no_unsafe_argument.go +50 -50
  166. package/linthost/rules_ts_no_unsafe_assignment.go +60 -60
  167. package/linthost/rules_ts_no_unsafe_call.go +40 -40
  168. package/linthost/rules_ts_no_unsafe_enum_comparison.go +147 -147
  169. package/linthost/rules_ts_no_unsafe_member_access.go +29 -29
  170. package/linthost/rules_ts_no_unsafe_return.go +64 -64
  171. package/linthost/rules_ts_no_unsafe_unary_minus.go +42 -42
  172. package/linthost/rules_ts_no_useless_constructor.go +20 -20
  173. package/linthost/rules_ts_non_nullable_type_assertion_style.go +60 -60
  174. package/linthost/rules_ts_parameter_properties.go +10 -10
  175. package/linthost/rules_ts_prefer_find.go +116 -116
  176. package/linthost/rules_ts_prefer_includes.go +173 -173
  177. package/linthost/rules_ts_prefer_nullish_coalescing.go +54 -54
  178. package/linthost/rules_ts_prefer_optional_chain.go +156 -156
  179. package/linthost/rules_ts_prefer_promise_reject_errors.go +104 -104
  180. package/linthost/rules_ts_prefer_readonly.go +31 -31
  181. package/linthost/rules_ts_prefer_reduce_type_parameter.go +74 -74
  182. package/linthost/rules_ts_prefer_regexp_exec.go +69 -69
  183. package/linthost/rules_ts_prefer_return_this_type.go +79 -79
  184. package/linthost/rules_ts_prefer_string_starts_ends_with.go +237 -237
  185. package/linthost/rules_ts_promise_function_async.go +41 -41
  186. package/linthost/rules_ts_related_getter_setter_pairs.go +61 -61
  187. package/linthost/rules_ts_require_array_sort_compare.go +58 -58
  188. package/linthost/rules_ts_restrict_plus_operands.go +82 -82
  189. package/linthost/rules_ts_restrict_template_expressions.go +50 -50
  190. package/linthost/rules_ts_simple.go +249 -249
  191. package/linthost/rules_ts_sort_type_constituents.go +88 -88
  192. package/linthost/rules_ts_strict_boolean_expressions.go +103 -103
  193. package/linthost/rules_ts_switch_exhaustiveness_check.go +90 -90
  194. package/linthost/rules_ts_unbound_method.go +65 -65
  195. package/linthost/rules_tsdoc.go +88 -88
  196. package/linthost/rules_unicorn_better_regex.go +1 -1
  197. package/linthost/rules_unicorn_catch_error_name.go +19 -19
  198. package/linthost/rules_unicorn_consistent_assert.go +20 -20
  199. package/linthost/rules_unicorn_consistent_date_clone.go +27 -27
  200. package/linthost/rules_unicorn_consistent_destructuring.go +3 -3
  201. package/linthost/rules_unicorn_consistent_empty_array_spread.go +34 -34
  202. package/linthost/rules_unicorn_consistent_existence_index_check.go +42 -42
  203. package/linthost/rules_unicorn_consistent_function_scoping.go +3 -3
  204. package/linthost/rules_unicorn_consistent_template_literal_escape.go +3 -3
  205. package/linthost/rules_unicorn_custom_error_definition.go +92 -92
  206. package/linthost/rules_unicorn_empty_brace_spaces.go +47 -47
  207. package/linthost/rules_unicorn_error_message.go +34 -34
  208. package/linthost/rules_unicorn_escape_case.go +14 -14
  209. package/linthost/rules_unicorn_expiring_todo_comments.go +36 -36
  210. package/linthost/rules_unicorn_explicit_length_check.go +51 -51
  211. package/linthost/rules_unicorn_filename_case.go +1 -1
  212. package/linthost/rules_unicorn_import_style.go +1 -1
  213. package/linthost/rules_unicorn_isolated_functions.go +2 -2
  214. package/linthost/rules_unicorn_new_for_builtins.go +49 -49
  215. package/linthost/rules_unicorn_no_abusive_eslint_disable.go +31 -31
  216. package/linthost/rules_unicorn_no_accessor_recursion.go +69 -69
  217. package/linthost/rules_unicorn_no_anonymous_default_export.go +40 -40
  218. package/linthost/rules_unicorn_no_array_callback_reference.go +33 -33
  219. package/linthost/rules_unicorn_no_array_for_each.go +14 -14
  220. package/linthost/rules_unicorn_no_array_method_this_argument.go +29 -29
  221. package/linthost/rules_unicorn_no_array_reduce.go +15 -15
  222. package/linthost/rules_unicorn_no_array_reverse.go +17 -17
  223. package/linthost/rules_unicorn_no_array_sort.go +17 -17
  224. package/linthost/rules_unicorn_no_await_expression_member.go +12 -12
  225. package/linthost/rules_unicorn_no_await_in_promise_methods.go +38 -38
  226. package/linthost/rules_unicorn_no_console_spaces.go +30 -30
  227. package/linthost/rules_unicorn_no_document_cookie.go +13 -13
  228. package/linthost/rules_unicorn_no_empty_file.go +16 -16
  229. package/linthost/rules_unicorn_no_for_loop.go +58 -58
  230. package/linthost/rules_unicorn_no_hex_escape.go +11 -11
  231. package/linthost/rules_unicorn_no_immediate_mutation.go +55 -55
  232. package/linthost/rules_unicorn_no_instanceof_builtins.go +34 -34
  233. package/linthost/rules_unicorn_no_invalid_fetch_options.go +52 -52
  234. package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +25 -25
  235. package/linthost/rules_unicorn_no_keyword_prefix.go +56 -56
  236. package/linthost/rules_unicorn_no_lonely_if.go +21 -21
  237. package/linthost/rules_unicorn_no_magic_array_flat_depth.go +22 -22
  238. package/linthost/rules_unicorn_no_named_default.go +25 -25
  239. package/linthost/rules_unicorn_no_negated_condition.go +54 -54
  240. package/linthost/rules_unicorn_no_negation_in_equality_check.go +23 -23
  241. package/linthost/rules_unicorn_no_nested_ternary.go +15 -15
  242. package/linthost/rules_unicorn_no_new_array.go +5 -5
  243. package/linthost/rules_unicorn_no_new_buffer.go +5 -5
  244. package/linthost/rules_unicorn_no_null.go +2 -2
  245. package/linthost/rules_unicorn_no_object_as_default_parameter.go +19 -19
  246. package/linthost/rules_unicorn_no_process_exit.go +17 -17
  247. package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +29 -29
  248. package/linthost/rules_unicorn_no_static_only_class.go +27 -27
  249. package/linthost/rules_unicorn_no_thenable.go +47 -47
  250. package/linthost/rules_unicorn_no_this_assignment.go +10 -10
  251. package/linthost/rules_unicorn_no_typeof_undefined.go +31 -31
  252. package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +23 -23
  253. package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +37 -37
  254. package/linthost/rules_unicorn_no_unnecessary_await.go +24 -24
  255. package/linthost/rules_unicorn_no_unnecessary_slice_end.go +22 -22
  256. package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +67 -67
  257. package/linthost/rules_unicorn_no_unreadable_iife.go +22 -22
  258. package/linthost/rules_unicorn_no_useless_collection_argument.go +34 -34
  259. package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +18 -18
  260. package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +49 -49
  261. package/linthost/rules_unicorn_no_useless_iterator_to_array.go +41 -41
  262. package/linthost/rules_unicorn_no_useless_length_check.go +82 -82
  263. package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +42 -42
  264. package/linthost/rules_unicorn_no_useless_spread.go +38 -38
  265. package/linthost/rules_unicorn_no_useless_switch_case.go +29 -29
  266. package/linthost/rules_unicorn_no_useless_undefined.go +25 -25
  267. package/linthost/rules_unicorn_no_zero_fractions.go +17 -17
  268. package/linthost/rules_unicorn_number_literal_case.go +33 -33
  269. package/linthost/rules_unicorn_numeric_separators_style.go +36 -36
  270. package/linthost/rules_unicorn_prefer_add_event_listener.go +30 -30
  271. package/linthost/rules_unicorn_prefer_array_find.go +27 -27
  272. package/linthost/rules_unicorn_prefer_array_flat.go +25 -25
  273. package/linthost/rules_unicorn_prefer_array_flat_map.go +37 -37
  274. package/linthost/rules_unicorn_prefer_array_index_of.go +108 -108
  275. package/linthost/rules_unicorn_prefer_array_some.go +43 -43
  276. package/linthost/rules_unicorn_prefer_at.go +42 -42
  277. package/linthost/rules_unicorn_prefer_bigint_literals.go +42 -42
  278. package/linthost/rules_unicorn_prefer_blob_reading_methods.go +15 -15
  279. package/linthost/rules_unicorn_prefer_class_fields.go +57 -57
  280. package/linthost/rules_unicorn_prefer_classlist_toggle.go +76 -76
  281. package/linthost/rules_unicorn_prefer_code_point.go +21 -21
  282. package/linthost/rules_unicorn_prefer_date_now.go +47 -47
  283. package/linthost/rules_unicorn_prefer_default_parameters.go +96 -96
  284. package/linthost/rules_unicorn_prefer_dom_node_append.go +14 -14
  285. package/linthost/rules_unicorn_prefer_dom_node_dataset.go +27 -27
  286. package/linthost/rules_unicorn_prefer_dom_node_remove.go +17 -17
  287. package/linthost/rules_unicorn_prefer_dom_node_text_content.go +11 -11
  288. package/linthost/rules_unicorn_prefer_event_target.go +10 -10
  289. package/linthost/rules_unicorn_prefer_export_from.go +99 -99
  290. package/linthost/rules_unicorn_prefer_global_this.go +91 -91
  291. package/linthost/rules_unicorn_prefer_import_meta_properties.go +38 -38
  292. package/linthost/rules_unicorn_prefer_includes.go +108 -108
  293. package/linthost/rules_unicorn_prefer_json_parse_buffer.go +37 -37
  294. package/linthost/rules_unicorn_prefer_keyboard_event_key.go +10 -10
  295. package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +20 -20
  296. package/linthost/rules_unicorn_prefer_math_min_max.go +33 -33
  297. package/linthost/rules_unicorn_prefer_math_trunc.go +32 -32
  298. package/linthost/rules_unicorn_prefer_modern_dom_apis.go +18 -18
  299. package/linthost/rules_unicorn_prefer_modern_math_apis.go +38 -38
  300. package/linthost/rules_unicorn_prefer_module.go +22 -22
  301. package/linthost/rules_unicorn_prefer_native_coercion_functions.go +73 -73
  302. package/linthost/rules_unicorn_prefer_negative_index.go +46 -46
  303. package/linthost/rules_unicorn_prefer_node_protocol.go +90 -90
  304. package/linthost/rules_unicorn_prefer_number_properties.go +57 -57
  305. package/linthost/rules_unicorn_prefer_object_from_entries.go +26 -26
  306. package/linthost/rules_unicorn_prefer_optional_catch_binding.go +24 -24
  307. package/linthost/rules_unicorn_prefer_prototype_methods.go +25 -25
  308. package/linthost/rules_unicorn_prefer_query_selector.go +25 -25
  309. package/linthost/rules_unicorn_prefer_reflect_apply.go +10 -10
  310. package/linthost/rules_unicorn_prefer_regexp_test_rule.go +47 -47
  311. package/linthost/rules_unicorn_prefer_response_static_json.go +26 -26
  312. package/linthost/rules_unicorn_prefer_set_has.go +16 -16
  313. package/linthost/rules_unicorn_prefer_set_size.go +22 -22
  314. package/linthost/rules_unicorn_prefer_simple_condition_first.go +3 -3
  315. package/linthost/rules_unicorn_prefer_single_call.go +59 -59
  316. package/linthost/rules_unicorn_prefer_spread.go +24 -24
  317. package/linthost/rules_unicorn_prefer_string_raw.go +12 -12
  318. package/linthost/rules_unicorn_prefer_string_replace_all.go +46 -46
  319. package/linthost/rules_unicorn_prefer_string_slice.go +17 -17
  320. package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +104 -104
  321. package/linthost/rules_unicorn_prefer_string_trim_start_end.go +21 -21
  322. package/linthost/rules_unicorn_prefer_structured_clone.go +36 -36
  323. package/linthost/rules_unicorn_prefer_switch.go +65 -65
  324. package/linthost/rules_unicorn_prefer_ternary.go +35 -35
  325. package/linthost/rules_unicorn_prefer_top_level_await.go +34 -34
  326. package/linthost/rules_unicorn_prefer_type_error.go +84 -84
  327. package/linthost/rules_unicorn_prevent_abbreviations.go +68 -68
  328. package/linthost/rules_unicorn_relative_url_style.go +19 -19
  329. package/linthost/rules_unicorn_require_array_join_separator.go +18 -18
  330. package/linthost/rules_unicorn_require_module_attributes.go +25 -25
  331. package/linthost/rules_unicorn_require_module_specifiers.go +28 -28
  332. package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +18 -18
  333. package/linthost/rules_unicorn_require_post_message_target_origin.go +18 -18
  334. package/linthost/rules_unicorn_string_content.go +1 -1
  335. package/linthost/rules_unicorn_switch_case_braces.go +16 -16
  336. package/linthost/rules_unicorn_switch_case_break_position.go +3 -3
  337. package/linthost/rules_unicorn_template_indent.go +1 -1
  338. package/linthost/rules_unicorn_text_encoding_identifier_case.go +36 -36
  339. package/linthost/rules_unicorn_throw_new_error.go +30 -30
  340. package/linthost/rules_var.go +273 -3
  341. package/package.json +3 -3
  342. package/src/defaultFormat.ts +11 -7
  343. package/src/structures/ITtscLintConfig.ts +5 -5
  344. package/src/structures/TtscLintRuleSetting.ts +19 -19
  345. package/src/structures/{ITtscLintFormat.ts → format/ITtscLintFormat.ts} +48 -75
  346. package/src/structures/format/ITtscLintFormatJsDoc.ts +16 -0
  347. package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
  348. package/src/structures/format/index.ts +3 -0
  349. package/src/structures/index.ts +1 -1
  350. package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +20 -31
  351. package/src/structures/rules/ITtscLintBoundariesRules.ts +32 -36
  352. package/src/structures/rules/ITtscLintContributorRules.ts +6 -7
  353. package/src/structures/rules/ITtscLintCoreRules.ts +380 -408
  354. package/src/structures/rules/ITtscLintCypressRuleOptions.ts +5 -5
  355. package/src/structures/rules/ITtscLintCypressRules.ts +34 -38
  356. package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +28 -41
  357. package/src/structures/rules/ITtscLintFunctionalRules.ts +51 -56
  358. package/src/structures/rules/ITtscLintJestRules.ts +63 -74
  359. package/src/structures/rules/ITtscLintJsdocRules.ts +47 -54
  360. package/src/structures/rules/ITtscLintJsxA11yRules.ts +94 -102
  361. package/src/structures/rules/ITtscLintNextjsRules.ts +50 -55
  362. package/src/structures/rules/ITtscLintPlaywrightRules.ts +104 -122
  363. package/src/structures/rules/ITtscLintPromiseRules.ts +62 -71
  364. package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +4 -4
  365. package/src/structures/rules/ITtscLintReactPerfRules.ts +17 -19
  366. package/src/structures/rules/ITtscLintReactRuleOptions.ts +8 -10
  367. package/src/structures/rules/ITtscLintReactRules.ts +91 -104
  368. package/src/structures/rules/ITtscLintRegexpRules.ts +46 -54
  369. package/src/structures/rules/ITtscLintRuleOptionsMap.ts +7 -8
  370. package/src/structures/rules/ITtscLintSecurityRules.ts +45 -52
  371. package/src/structures/rules/ITtscLintSolidRules.ts +53 -56
  372. package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +3 -4
  373. package/src/structures/rules/ITtscLintStorybookRules.ts +60 -69
  374. package/src/structures/rules/ITtscLintTanstackQueryRules.ts +31 -37
  375. package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +2 -3
  376. package/src/structures/rules/ITtscLintTestingLibraryRules.ts +102 -119
  377. package/src/structures/rules/ITtscLintTypeScriptRules.ts +460 -518
  378. package/src/structures/rules/ITtscLintVitestRules.ts +43 -51
  379. package/lib/structures/ITtscLintFormat.js.map +0 -1
  380. /package/lib/structures/{ITtscLintFormat.js → format/ITtscLintFormat.js} +0 -0
@@ -20,61 +20,61 @@ package linthost
20
20
  import shimast "github.com/microsoft/typescript-go/shim/ast"
21
21
 
22
22
  var unicornConsistentExistenceIndexCheckMethods = map[string]struct{}{
23
- "indexOf": {},
24
- "findIndex": {},
25
- "lastIndexOf": {},
26
- "findLastIndex": {},
23
+ "indexOf": {},
24
+ "findIndex": {},
25
+ "lastIndexOf": {},
26
+ "findLastIndex": {},
27
27
  }
28
28
 
29
29
  type unicornConsistentExistenceIndexCheck struct{}
30
30
 
31
31
  func (unicornConsistentExistenceIndexCheck) Name() string {
32
- return "unicorn/consistent-existence-index-check"
32
+ return "unicorn/consistent-existence-index-check"
33
33
  }
34
34
  func (unicornConsistentExistenceIndexCheck) Visits() []shimast.Kind {
35
- return []shimast.Kind{shimast.KindBinaryExpression}
35
+ return []shimast.Kind{shimast.KindBinaryExpression}
36
36
  }
37
37
  func (unicornConsistentExistenceIndexCheck) Check(ctx *Context, node *shimast.Node) {
38
- bin := node.AsBinaryExpression()
39
- if bin == nil || bin.OperatorToken == nil || bin.Left == nil || bin.Right == nil {
40
- return
41
- }
42
- switch bin.OperatorToken.Kind {
43
- case shimast.KindLessThanToken, shimast.KindGreaterThanEqualsToken:
44
- default:
45
- return
46
- }
47
- left := stripParens(bin.Left)
48
- right := stripParens(bin.Right)
49
- if unicornConsistentExistenceIndexCheckMatch(left, right) {
50
- ctx.Report(node, "Use a consistent existence-check form for `indexOf` / `findIndex` — prefer `=== -1` / `!== -1` over magnitude comparisons.")
51
- }
38
+ bin := node.AsBinaryExpression()
39
+ if bin == nil || bin.OperatorToken == nil || bin.Left == nil || bin.Right == nil {
40
+ return
41
+ }
42
+ switch bin.OperatorToken.Kind {
43
+ case shimast.KindLessThanToken, shimast.KindGreaterThanEqualsToken:
44
+ default:
45
+ return
46
+ }
47
+ left := stripParens(bin.Left)
48
+ right := stripParens(bin.Right)
49
+ if unicornConsistentExistenceIndexCheckMatch(left, right) {
50
+ ctx.Report(node, "Use a consistent existence-check form for `indexOf` / `findIndex` — prefer `=== -1` / `!== -1` over magnitude comparisons.")
51
+ }
52
52
  }
53
53
 
54
54
  func unicornConsistentExistenceIndexCheckMatch(callSide, literalSide *shimast.Node) bool {
55
- if callSide == nil || literalSide == nil {
56
- return false
57
- }
58
- if literalSide.Kind != shimast.KindNumericLiteral ||
59
- numericLiteralText(literalSide) != "0" {
60
- return false
61
- }
62
- if callSide.Kind != shimast.KindCallExpression {
63
- return false
64
- }
65
- call := callSide.AsCallExpression()
66
- if call == nil || call.Expression == nil ||
67
- call.Expression.Kind != shimast.KindPropertyAccessExpression {
68
- return false
69
- }
70
- access := call.Expression.AsPropertyAccessExpression()
71
- if access == nil {
72
- return false
73
- }
74
- _, ok := unicornConsistentExistenceIndexCheckMethods[identifierText(access.Name())]
75
- return ok
55
+ if callSide == nil || literalSide == nil {
56
+ return false
57
+ }
58
+ if literalSide.Kind != shimast.KindNumericLiteral ||
59
+ numericLiteralText(literalSide) != "0" {
60
+ return false
61
+ }
62
+ if callSide.Kind != shimast.KindCallExpression {
63
+ return false
64
+ }
65
+ call := callSide.AsCallExpression()
66
+ if call == nil || call.Expression == nil ||
67
+ call.Expression.Kind != shimast.KindPropertyAccessExpression {
68
+ return false
69
+ }
70
+ access := call.Expression.AsPropertyAccessExpression()
71
+ if access == nil {
72
+ return false
73
+ }
74
+ _, ok := unicornConsistentExistenceIndexCheckMethods[identifierText(access.Name())]
75
+ return ok
76
76
  }
77
77
 
78
78
  func init() {
79
- Register(unicornConsistentExistenceIndexCheck{})
79
+ Register(unicornConsistentExistenceIndexCheck{})
80
80
  }
@@ -12,14 +12,14 @@ import shimast "github.com/microsoft/typescript-go/shim/ast"
12
12
  type unicornConsistentFunctionScoping struct{}
13
13
 
14
14
  func (unicornConsistentFunctionScoping) Name() string {
15
- return "unicorn/consistent-function-scoping"
15
+ return "unicorn/consistent-function-scoping"
16
16
  }
17
17
  func (unicornConsistentFunctionScoping) Visits() []shimast.Kind {
18
- return []shimast.Kind{shimast.KindSourceFile}
18
+ return []shimast.Kind{shimast.KindSourceFile}
19
19
  }
20
20
  func (unicornConsistentFunctionScoping) Check(ctx *Context, node *shimast.Node) {
21
21
  }
22
22
 
23
23
  func init() {
24
- Register(unicornConsistentFunctionScoping{})
24
+ Register(unicornConsistentFunctionScoping{})
25
25
  }
@@ -12,14 +12,14 @@ import shimast "github.com/microsoft/typescript-go/shim/ast"
12
12
  type unicornConsistentTemplateLiteralEscape struct{}
13
13
 
14
14
  func (unicornConsistentTemplateLiteralEscape) Name() string {
15
- return "unicorn/consistent-template-literal-escape"
15
+ return "unicorn/consistent-template-literal-escape"
16
16
  }
17
17
  func (unicornConsistentTemplateLiteralEscape) Visits() []shimast.Kind {
18
- return []shimast.Kind{shimast.KindSourceFile}
18
+ return []shimast.Kind{shimast.KindSourceFile}
19
19
  }
20
20
  func (unicornConsistentTemplateLiteralEscape) Check(ctx *Context, node *shimast.Node) {
21
21
  }
22
22
 
23
23
  func init() {
24
- Register(unicornConsistentTemplateLiteralEscape{})
24
+ Register(unicornConsistentTemplateLiteralEscape{})
25
25
  }
@@ -17,88 +17,88 @@ package linthost
17
17
  import shimast "github.com/microsoft/typescript-go/shim/ast"
18
18
 
19
19
  var unicornCustomErrorDefinitionBaseNames = map[string]struct{}{
20
- "Error": {},
21
- "EvalError": {},
22
- "RangeError": {},
23
- "ReferenceError": {},
24
- "SyntaxError": {},
25
- "TypeError": {},
26
- "URIError": {},
27
- "AggregateError": {},
20
+ "Error": {},
21
+ "EvalError": {},
22
+ "RangeError": {},
23
+ "ReferenceError": {},
24
+ "SyntaxError": {},
25
+ "TypeError": {},
26
+ "URIError": {},
27
+ "AggregateError": {},
28
28
  }
29
29
 
30
30
  type unicornCustomErrorDefinition struct{}
31
31
 
32
32
  func (unicornCustomErrorDefinition) Name() string {
33
- return "unicorn/custom-error-definition"
33
+ return "unicorn/custom-error-definition"
34
34
  }
35
35
  func (unicornCustomErrorDefinition) Visits() []shimast.Kind {
36
- return []shimast.Kind{shimast.KindClassDeclaration, shimast.KindClassExpression}
36
+ return []shimast.Kind{shimast.KindClassDeclaration, shimast.KindClassExpression}
37
37
  }
38
38
  func (unicornCustomErrorDefinition) Check(ctx *Context, node *shimast.Node) {
39
- if !unicornCustomErrorDefinitionExtendsError(node) {
40
- return
41
- }
42
- members := classMembers(node)
43
- for _, member := range members {
44
- if member == nil || member.Kind != shimast.KindConstructor {
45
- continue
46
- }
47
- ctor := member.AsConstructorDeclaration()
48
- if ctor == nil || ctor.Body == nil {
49
- continue
50
- }
51
- if !unicornCustomErrorDefinitionBodyCallsSuper(ctor.Body) {
52
- ctx.Report(node, "A custom `Error` subclass should call `super(message)` and set `this.name`.")
53
- return
54
- }
55
- }
39
+ if !unicornCustomErrorDefinitionExtendsError(node) {
40
+ return
41
+ }
42
+ members := classMembers(node)
43
+ for _, member := range members {
44
+ if member == nil || member.Kind != shimast.KindConstructor {
45
+ continue
46
+ }
47
+ ctor := member.AsConstructorDeclaration()
48
+ if ctor == nil || ctor.Body == nil {
49
+ continue
50
+ }
51
+ if !unicornCustomErrorDefinitionBodyCallsSuper(ctor.Body) {
52
+ ctx.Report(node, "A custom `Error` subclass should call `super(message)` and set `this.name`.")
53
+ return
54
+ }
55
+ }
56
56
  }
57
57
 
58
58
  // unicornCustomErrorDefinitionExtendsError reports whether `class` has
59
59
  // an `extends <Identifier>` heritage clause whose target identifier is
60
60
  // one of the built-in Error constructors.
61
61
  func unicornCustomErrorDefinitionExtendsError(class *shimast.Node) bool {
62
- var clauses []*shimast.Node
63
- switch class.Kind {
64
- case shimast.KindClassDeclaration:
65
- decl := class.AsClassDeclaration()
66
- if decl == nil || decl.HeritageClauses == nil {
67
- return false
68
- }
69
- clauses = decl.HeritageClauses.Nodes
70
- case shimast.KindClassExpression:
71
- expr := class.AsClassExpression()
72
- if expr == nil || expr.HeritageClauses == nil {
73
- return false
74
- }
75
- clauses = expr.HeritageClauses.Nodes
76
- default:
77
- return false
78
- }
79
- for _, clause := range clauses {
80
- if clause == nil {
81
- continue
82
- }
83
- hc := clause.AsHeritageClause()
84
- if hc == nil || hc.Token != shimast.KindExtendsKeyword || hc.Types == nil {
85
- continue
86
- }
87
- for _, ty := range hc.Types.Nodes {
88
- if ty == nil {
89
- continue
90
- }
91
- expr := ty.AsExpressionWithTypeArguments()
92
- if expr == nil {
93
- continue
94
- }
95
- name := identifierText(expr.Expression)
96
- if _, ok := unicornCustomErrorDefinitionBaseNames[name]; ok {
97
- return true
98
- }
99
- }
100
- }
101
- return false
62
+ var clauses []*shimast.Node
63
+ switch class.Kind {
64
+ case shimast.KindClassDeclaration:
65
+ decl := class.AsClassDeclaration()
66
+ if decl == nil || decl.HeritageClauses == nil {
67
+ return false
68
+ }
69
+ clauses = decl.HeritageClauses.Nodes
70
+ case shimast.KindClassExpression:
71
+ expr := class.AsClassExpression()
72
+ if expr == nil || expr.HeritageClauses == nil {
73
+ return false
74
+ }
75
+ clauses = expr.HeritageClauses.Nodes
76
+ default:
77
+ return false
78
+ }
79
+ for _, clause := range clauses {
80
+ if clause == nil {
81
+ continue
82
+ }
83
+ hc := clause.AsHeritageClause()
84
+ if hc == nil || hc.Token != shimast.KindExtendsKeyword || hc.Types == nil {
85
+ continue
86
+ }
87
+ for _, ty := range hc.Types.Nodes {
88
+ if ty == nil {
89
+ continue
90
+ }
91
+ expr := ty.AsExpressionWithTypeArguments()
92
+ if expr == nil {
93
+ continue
94
+ }
95
+ name := identifierText(expr.Expression)
96
+ if _, ok := unicornCustomErrorDefinitionBaseNames[name]; ok {
97
+ return true
98
+ }
99
+ }
100
+ }
101
+ return false
102
102
  }
103
103
 
104
104
  // unicornCustomErrorDefinitionBodyCallsSuper walks the constructor body
@@ -107,32 +107,32 @@ func unicornCustomErrorDefinitionExtendsError(class *shimast.Node) bool {
107
107
  // — a `super(...)` inside a nested arrow does not initialize `Error`'s
108
108
  // prototype state.
109
109
  func unicornCustomErrorDefinitionBodyCallsSuper(body *shimast.Node) bool {
110
- found := false
111
- var walk func(*shimast.Node)
112
- walk = func(n *shimast.Node) {
113
- if n == nil || found {
114
- return
115
- }
116
- if n != body && isFunctionLikeKind(n) {
117
- return
118
- }
119
- if n.Kind == shimast.KindCallExpression {
120
- call := n.AsCallExpression()
121
- if call != nil && call.Expression != nil &&
122
- call.Expression.Kind == shimast.KindSuperKeyword {
123
- found = true
124
- return
125
- }
126
- }
127
- n.ForEachChild(func(child *shimast.Node) bool {
128
- walk(child)
129
- return false
130
- })
131
- }
132
- walk(body)
133
- return found
110
+ found := false
111
+ var walk func(*shimast.Node)
112
+ walk = func(n *shimast.Node) {
113
+ if n == nil || found {
114
+ return
115
+ }
116
+ if n != body && isFunctionLikeKind(n) {
117
+ return
118
+ }
119
+ if n.Kind == shimast.KindCallExpression {
120
+ call := n.AsCallExpression()
121
+ if call != nil && call.Expression != nil &&
122
+ call.Expression.Kind == shimast.KindSuperKeyword {
123
+ found = true
124
+ return
125
+ }
126
+ }
127
+ n.ForEachChild(func(child *shimast.Node) bool {
128
+ walk(child)
129
+ return false
130
+ })
131
+ }
132
+ walk(body)
133
+ return found
134
134
  }
135
135
 
136
136
  func init() {
137
- Register(unicornCustomErrorDefinition{})
137
+ Register(unicornCustomErrorDefinition{})
138
138
  }
@@ -18,56 +18,56 @@ type unicornEmptyBraceSpaces struct{}
18
18
 
19
19
  func (unicornEmptyBraceSpaces) Name() string { return "unicorn/empty-brace-spaces" }
20
20
  func (unicornEmptyBraceSpaces) Visits() []shimast.Kind {
21
- return []shimast.Kind{shimast.KindBlock, shimast.KindObjectLiteralExpression}
21
+ return []shimast.Kind{shimast.KindBlock, shimast.KindObjectLiteralExpression}
22
22
  }
23
23
  func (unicornEmptyBraceSpaces) Check(ctx *Context, node *shimast.Node) {
24
- if ctx.File == nil {
25
- return
26
- }
27
- switch node.Kind {
28
- case shimast.KindBlock:
29
- block := node.AsBlock()
30
- if block == nil || block.Statements == nil || len(block.Statements.Nodes) > 0 {
31
- return
32
- }
33
- case shimast.KindObjectLiteralExpression:
34
- obj := node.AsObjectLiteralExpression()
35
- if obj == nil || obj.Properties == nil || len(obj.Properties.Nodes) > 0 {
36
- return
37
- }
38
- default:
39
- return
40
- }
41
- src := ctx.File.Text()
42
- _, end := tokenRange(ctx.File, node)
43
- pos := node.Pos()
44
- if pos < 0 || end < 0 || end > len(src) {
45
- return
46
- }
47
- // Locate the opening `{` after any leading trivia.
48
- open := -1
49
- for i := pos; i < end; i++ {
50
- if src[i] == '{' {
51
- open = i
52
- break
53
- }
54
- }
55
- if open < 0 || end-1 <= open {
56
- return
57
- }
58
- // The closing `}` is the byte immediately before End().
59
- if src[end-1] != '}' {
60
- return
61
- }
62
- for i := open + 1; i < end-1; i++ {
63
- switch src[i] {
64
- case ' ', '\t', '\r', '\n':
65
- ctx.Report(node, "Empty braces shouldn't contain whitespace.")
66
- return
67
- }
68
- }
24
+ if ctx.File == nil {
25
+ return
26
+ }
27
+ switch node.Kind {
28
+ case shimast.KindBlock:
29
+ block := node.AsBlock()
30
+ if block == nil || block.Statements == nil || len(block.Statements.Nodes) > 0 {
31
+ return
32
+ }
33
+ case shimast.KindObjectLiteralExpression:
34
+ obj := node.AsObjectLiteralExpression()
35
+ if obj == nil || obj.Properties == nil || len(obj.Properties.Nodes) > 0 {
36
+ return
37
+ }
38
+ default:
39
+ return
40
+ }
41
+ src := ctx.File.Text()
42
+ _, end := tokenRange(ctx.File, node)
43
+ pos := node.Pos()
44
+ if pos < 0 || end < 0 || end > len(src) {
45
+ return
46
+ }
47
+ // Locate the opening `{` after any leading trivia.
48
+ open := -1
49
+ for i := pos; i < end; i++ {
50
+ if src[i] == '{' {
51
+ open = i
52
+ break
53
+ }
54
+ }
55
+ if open < 0 || end-1 <= open {
56
+ return
57
+ }
58
+ // The closing `}` is the byte immediately before End().
59
+ if src[end-1] != '}' {
60
+ return
61
+ }
62
+ for i := open + 1; i < end-1; i++ {
63
+ switch src[i] {
64
+ case ' ', '\t', '\r', '\n':
65
+ ctx.Report(node, "Empty braces shouldn't contain whitespace.")
66
+ return
67
+ }
68
+ }
69
69
  }
70
70
 
71
71
  func init() {
72
- Register(unicornEmptyBraceSpaces{})
72
+ Register(unicornEmptyBraceSpaces{})
73
73
  }
@@ -16,49 +16,49 @@ package linthost
16
16
  import shimast "github.com/microsoft/typescript-go/shim/ast"
17
17
 
18
18
  var unicornErrorMessageBuiltinNames = map[string]struct{}{
19
- "Error": {},
20
- "TypeError": {},
21
- "RangeError": {},
22
- "SyntaxError": {},
23
- "ReferenceError": {},
24
- "EvalError": {},
25
- "URIError": {},
26
- "AggregateError": {},
19
+ "Error": {},
20
+ "TypeError": {},
21
+ "RangeError": {},
22
+ "SyntaxError": {},
23
+ "ReferenceError": {},
24
+ "EvalError": {},
25
+ "URIError": {},
26
+ "AggregateError": {},
27
27
  }
28
28
 
29
29
  type unicornErrorMessage struct{}
30
30
 
31
31
  func (unicornErrorMessage) Name() string { return "unicorn/error-message" }
32
32
  func (unicornErrorMessage) Visits() []shimast.Kind {
33
- return []shimast.Kind{shimast.KindNewExpression}
33
+ return []shimast.Kind{shimast.KindNewExpression}
34
34
  }
35
35
  func (unicornErrorMessage) Check(ctx *Context, node *shimast.Node) {
36
- ne := node.AsNewExpression()
37
- if ne == nil {
38
- return
39
- }
40
- name := identifierText(ne.Expression)
41
- if name == "" {
42
- return
43
- }
44
- if _, ok := unicornErrorMessageBuiltinNames[name]; !ok {
45
- return
46
- }
47
- // Zero arguments — `new Error()` / `new Error` — always fires.
48
- if ne.Arguments == nil || len(ne.Arguments.Nodes) == 0 {
49
- ctx.Report(node, "Pass an error message to the `Error` constructor.")
50
- return
51
- }
52
- // Single argument — fire only when the argument is an empty string
53
- // literal. Dynamic arguments cannot be proven empty statically.
54
- if len(ne.Arguments.Nodes) == 1 {
55
- arg := stripParens(ne.Arguments.Nodes[0])
56
- if arg != nil && arg.Kind == shimast.KindStringLiteral && stringLiteralText(arg) == "" {
57
- ctx.Report(node, "Pass an error message to the `Error` constructor.")
58
- }
59
- }
36
+ ne := node.AsNewExpression()
37
+ if ne == nil {
38
+ return
39
+ }
40
+ name := identifierText(ne.Expression)
41
+ if name == "" {
42
+ return
43
+ }
44
+ if _, ok := unicornErrorMessageBuiltinNames[name]; !ok {
45
+ return
46
+ }
47
+ // Zero arguments — `new Error()` / `new Error` — always fires.
48
+ if ne.Arguments == nil || len(ne.Arguments.Nodes) == 0 {
49
+ ctx.Report(node, "Pass an error message to the `Error` constructor.")
50
+ return
51
+ }
52
+ // Single argument — fire only when the argument is an empty string
53
+ // literal. Dynamic arguments cannot be proven empty statically.
54
+ if len(ne.Arguments.Nodes) == 1 {
55
+ arg := stripParens(ne.Arguments.Nodes[0])
56
+ if arg != nil && arg.Kind == shimast.KindStringLiteral && stringLiteralText(arg) == "" {
57
+ ctx.Report(node, "Pass an error message to the `Error` constructor.")
58
+ }
59
+ }
60
60
  }
61
61
 
62
62
  func init() {
63
- Register(unicornErrorMessage{})
63
+ Register(unicornErrorMessage{})
64
64
  }
@@ -15,9 +15,9 @@
15
15
  package linthost
16
16
 
17
17
  import (
18
- "regexp"
18
+ "regexp"
19
19
 
20
- shimast "github.com/microsoft/typescript-go/shim/ast"
20
+ shimast "github.com/microsoft/typescript-go/shim/ast"
21
21
  )
22
22
 
23
23
  // unicornEscapeCasePattern matches a hex escape whose hex digits contain
@@ -25,27 +25,27 @@ import (
25
25
  // `\u{...}` and rejects matches where every hex digit is already
26
26
  // uppercase / 0-9.
27
27
  var unicornEscapeCasePattern = regexp.MustCompile(
28
- `\\x[0-9A-Fa-f]*[a-f][0-9A-Fa-f]*|` +
29
- `\\u\{[0-9A-Fa-f]*[a-f][0-9A-Fa-f]*\}|` +
30
- `\\u[0-9A-Fa-f]*[a-f][0-9A-Fa-f]*`,
28
+ `\\x[0-9A-Fa-f]*[a-f][0-9A-Fa-f]*|` +
29
+ `\\u\{[0-9A-Fa-f]*[a-f][0-9A-Fa-f]*\}|` +
30
+ `\\u[0-9A-Fa-f]*[a-f][0-9A-Fa-f]*`,
31
31
  )
32
32
 
33
33
  type unicornEscapeCase struct{}
34
34
 
35
35
  func (unicornEscapeCase) Name() string { return "unicorn/escape-case" }
36
36
  func (unicornEscapeCase) Visits() []shimast.Kind {
37
- return []shimast.Kind{shimast.KindStringLiteral, shimast.KindNoSubstitutionTemplateLiteral}
37
+ return []shimast.Kind{shimast.KindStringLiteral, shimast.KindNoSubstitutionTemplateLiteral}
38
38
  }
39
39
  func (unicornEscapeCase) Check(ctx *Context, node *shimast.Node) {
40
- source := nodeText(ctx.File, node)
41
- if source == "" {
42
- return
43
- }
44
- if unicornEscapeCasePattern.MatchString(source) {
45
- ctx.Report(node, "Use uppercase letters for escape sequence hex digits (`\\xA9` over `\\xa9`).")
46
- }
40
+ source := nodeText(ctx.File, node)
41
+ if source == "" {
42
+ return
43
+ }
44
+ if unicornEscapeCasePattern.MatchString(source) {
45
+ ctx.Report(node, "Use uppercase letters for escape sequence hex digits (`\\xA9` over `\\xa9`).")
46
+ }
47
47
  }
48
48
 
49
49
  func init() {
50
- Register(unicornEscapeCase{})
50
+ Register(unicornEscapeCase{})
51
51
  }