@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
@@ -1,11 +1,11 @@
1
1
  package linthost
2
2
 
3
3
  import (
4
- "sort"
5
- "strconv"
6
- "strings"
4
+ "sort"
5
+ "strconv"
6
+ "strings"
7
7
 
8
- shimast "github.com/microsoft/typescript-go/shim/ast"
8
+ shimast "github.com/microsoft/typescript-go/shim/ast"
9
9
  )
10
10
 
11
11
  // regexpSourceRule implements the high-confidence, source-text subset of
@@ -14,397 +14,397 @@ import (
14
14
  // stay AST-only and avoid pretending to evaluate arbitrary `RegExp(...)`
15
15
  // constructor strings.
16
16
  type regexpSourceRule struct {
17
- name string
18
- check func(regexpLiteralParts) bool
17
+ name string
18
+ check func(regexpLiteralParts) bool
19
19
  }
20
20
 
21
21
  type regexpLiteralParts struct {
22
- raw string
23
- pattern string
24
- flags string
22
+ raw string
23
+ pattern string
24
+ flags string
25
25
  }
26
26
 
27
27
  func (r regexpSourceRule) Name() string { return r.name }
28
28
  func (regexpSourceRule) Visits() []shimast.Kind {
29
- return []shimast.Kind{shimast.KindRegularExpressionLiteral}
29
+ return []shimast.Kind{shimast.KindRegularExpressionLiteral}
30
30
  }
31
31
  func (r regexpSourceRule) Check(ctx *Context, node *shimast.Node) {
32
- parts, ok := parseRegexpLiteralParts(ctx, node)
33
- if !ok || r.check == nil || !r.check(parts) {
34
- return
35
- }
36
- ctx.Report(node, regexpRuleMessage(r.name))
32
+ parts, ok := parseRegexpLiteralParts(ctx, node)
33
+ if !ok || r.check == nil || !r.check(parts) {
34
+ return
35
+ }
36
+ ctx.Report(node, regexpRuleMessage(r.name))
37
37
  }
38
38
 
39
39
  type regexpNoUselessEscapeAlias struct{}
40
40
 
41
41
  func (regexpNoUselessEscapeAlias) Name() string { return "regexp/no-useless-escape" }
42
42
  func (regexpNoUselessEscapeAlias) Visits() []shimast.Kind {
43
- return []shimast.Kind{shimast.KindRegularExpressionLiteral}
43
+ return []shimast.Kind{shimast.KindRegularExpressionLiteral}
44
44
  }
45
45
  func (regexpNoUselessEscapeAlias) Check(ctx *Context, node *shimast.Node) {
46
- pos, end := tokenRange(ctx.File, node)
47
- if pos < 0 {
48
- return
49
- }
50
- reportRegexEscapes(ctx, ctx.File.Text()[pos:end], pos)
46
+ pos, end := tokenRange(ctx.File, node)
47
+ if pos < 0 {
48
+ return
49
+ }
50
+ reportRegexEscapes(ctx, ctx.File.Text()[pos:end], pos)
51
51
  }
52
52
 
53
53
  func parseRegexpLiteralParts(ctx *Context, node *shimast.Node) (regexpLiteralParts, bool) {
54
- raw := nodeText(ctx.File, node)
55
- if len(raw) < 2 || raw[0] != '/' {
56
- return regexpLiteralParts{}, false
57
- }
58
- closing := strings.LastIndexByte(raw, '/')
59
- if closing <= 0 {
60
- return regexpLiteralParts{}, false
61
- }
62
- return regexpLiteralParts{
63
- raw: raw,
64
- pattern: raw[1:closing],
65
- flags: raw[closing+1:],
66
- }, true
54
+ raw := nodeText(ctx.File, node)
55
+ if len(raw) < 2 || raw[0] != '/' {
56
+ return regexpLiteralParts{}, false
57
+ }
58
+ closing := strings.LastIndexByte(raw, '/')
59
+ if closing <= 0 {
60
+ return regexpLiteralParts{}, false
61
+ }
62
+ return regexpLiteralParts{
63
+ raw: raw,
64
+ pattern: raw[1:closing],
65
+ flags: raw[closing+1:],
66
+ }, true
67
67
  }
68
68
 
69
69
  func regexpRuleMessage(name string) string {
70
- switch name {
71
- case "regexp/no-control-character":
72
- return "Unexpected control character in regular expression."
73
- case "regexp/no-dupe-characters-character-class":
74
- return "Unexpected duplicate character in character class."
75
- case "regexp/no-empty-alternative":
76
- return "Unexpected empty alternative."
77
- case "regexp/no-empty-capturing-group":
78
- return "Unexpected empty capturing group."
79
- case "regexp/no-empty-character-class":
80
- return "Unexpected empty character class."
81
- case "regexp/no-empty-group":
82
- return "Unexpected empty group."
83
- case "regexp/no-empty-lookarounds-assertion":
84
- return "Unexpected empty lookaround assertion."
85
- case "regexp/no-misleading-unicode-character":
86
- return "Unexpected misleading Unicode character in character class."
87
- case "regexp/no-useless-character-class":
88
- return "Unexpected character class with one character."
89
- case "regexp/no-useless-flag":
90
- return "Unexpected useless regular expression flag."
91
- case "regexp/no-useless-quantifier":
92
- return "Unexpected useless quantifier."
93
- case "regexp/no-useless-two-nums-quantifier":
94
- return "Unexpected quantifier with equal minimum and maximum."
95
- case "regexp/no-zero-quantifier":
96
- return "Unexpected quantifier that repeats zero times."
97
- case "regexp/prefer-d":
98
- return "Prefer \\d over [0-9]."
99
- case "regexp/prefer-plus-quantifier":
100
- return "Prefer + over {1,}."
101
- case "regexp/prefer-question-quantifier":
102
- return "Prefer ? over {0,1}."
103
- case "regexp/prefer-star-quantifier":
104
- return "Prefer * over {0,}."
105
- case "regexp/prefer-w":
106
- return "Prefer \\w over [A-Za-z0-9_]."
107
- case "regexp/require-unicode-regexp":
108
- return "Regular expression should use the u or v flag."
109
- case "regexp/require-unicode-sets-regexp":
110
- return "Regular expression should use the v flag."
111
- case "regexp/sort-flags":
112
- return "Regular expression flags should be sorted."
113
- default:
114
- return "Unexpected regular expression pattern."
115
- }
70
+ switch name {
71
+ case "regexp/no-control-character":
72
+ return "Unexpected control character in regular expression."
73
+ case "regexp/no-dupe-characters-character-class":
74
+ return "Unexpected duplicate character in character class."
75
+ case "regexp/no-empty-alternative":
76
+ return "Unexpected empty alternative."
77
+ case "regexp/no-empty-capturing-group":
78
+ return "Unexpected empty capturing group."
79
+ case "regexp/no-empty-character-class":
80
+ return "Unexpected empty character class."
81
+ case "regexp/no-empty-group":
82
+ return "Unexpected empty group."
83
+ case "regexp/no-empty-lookarounds-assertion":
84
+ return "Unexpected empty lookaround assertion."
85
+ case "regexp/no-misleading-unicode-character":
86
+ return "Unexpected misleading Unicode character in character class."
87
+ case "regexp/no-useless-character-class":
88
+ return "Unexpected character class with one character."
89
+ case "regexp/no-useless-flag":
90
+ return "Unexpected useless regular expression flag."
91
+ case "regexp/no-useless-quantifier":
92
+ return "Unexpected useless quantifier."
93
+ case "regexp/no-useless-two-nums-quantifier":
94
+ return "Unexpected quantifier with equal minimum and maximum."
95
+ case "regexp/no-zero-quantifier":
96
+ return "Unexpected quantifier that repeats zero times."
97
+ case "regexp/prefer-d":
98
+ return "Prefer \\d over [0-9]."
99
+ case "regexp/prefer-plus-quantifier":
100
+ return "Prefer + over {1,}."
101
+ case "regexp/prefer-question-quantifier":
102
+ return "Prefer ? over {0,1}."
103
+ case "regexp/prefer-star-quantifier":
104
+ return "Prefer * over {0,}."
105
+ case "regexp/prefer-w":
106
+ return "Prefer \\w over [A-Za-z0-9_]."
107
+ case "regexp/require-unicode-regexp":
108
+ return "Regular expression should use the u or v flag."
109
+ case "regexp/require-unicode-sets-regexp":
110
+ return "Regular expression should use the v flag."
111
+ case "regexp/sort-flags":
112
+ return "Regular expression flags should be sorted."
113
+ default:
114
+ return "Unexpected regular expression pattern."
115
+ }
116
116
  }
117
117
 
118
118
  func regexpHasEmptyAlternative(parts regexpLiteralParts) bool {
119
- return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
120
- if pattern[i] != '|' {
121
- return false
122
- }
123
- return i == 0 || i == len(pattern)-1 || pattern[i-1] == '|' || pattern[i-1] == '(' || pattern[i+1] == '|' || pattern[i+1] == ')'
124
- })
119
+ return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
120
+ if pattern[i] != '|' {
121
+ return false
122
+ }
123
+ return i == 0 || i == len(pattern)-1 || pattern[i-1] == '|' || pattern[i-1] == '(' || pattern[i+1] == '|' || pattern[i+1] == ')'
124
+ })
125
125
  }
126
126
 
127
127
  func regexpHasEmptyCapturingGroup(parts regexpLiteralParts) bool {
128
- return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
129
- return pattern[i] == '(' && i+1 < len(pattern) && pattern[i+1] == ')'
130
- })
128
+ return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
129
+ return pattern[i] == '(' && i+1 < len(pattern) && pattern[i+1] == ')'
130
+ })
131
131
  }
132
132
 
133
133
  func regexpHasEmptyGroup(parts regexpLiteralParts) bool {
134
- return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
135
- return strings.HasPrefix(pattern[i:], "(?:)")
136
- })
134
+ return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
135
+ return strings.HasPrefix(pattern[i:], "(?:)")
136
+ })
137
137
  }
138
138
 
139
139
  func regexpHasEmptyLookaround(parts regexpLiteralParts) bool {
140
- return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
141
- return strings.HasPrefix(pattern[i:], "(?=)") ||
142
- strings.HasPrefix(pattern[i:], "(?!)") ||
143
- strings.HasPrefix(pattern[i:], "(?<=)") ||
144
- strings.HasPrefix(pattern[i:], "(?<!)")
145
- })
140
+ return scanRegexpPattern(parts.pattern, func(pattern string, i int) bool {
141
+ return strings.HasPrefix(pattern[i:], "(?=)") ||
142
+ strings.HasPrefix(pattern[i:], "(?!)") ||
143
+ strings.HasPrefix(pattern[i:], "(?<=)") ||
144
+ strings.HasPrefix(pattern[i:], "(?<!)")
145
+ })
146
146
  }
147
147
 
148
148
  func regexpHasZeroQuantifier(parts regexpLiteralParts) bool {
149
- return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
150
- return min == 0 && (!hasComma || max == 0)
151
- })
149
+ return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
150
+ return min == 0 && (!hasComma || max == 0)
151
+ })
152
152
  }
153
153
 
154
154
  func regexpHasUselessTwoNumsQuantifier(parts regexpLiteralParts) bool {
155
- return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
156
- return hasComma && min == max && min >= 0
157
- })
155
+ return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
156
+ return hasComma && min == max && min >= 0
157
+ })
158
158
  }
159
159
 
160
160
  func regexpHasUselessQuantifier(parts regexpLiteralParts) bool {
161
- return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
162
- return !hasComma && min == 1 && max == -1
163
- })
161
+ return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
162
+ return !hasComma && min == 1 && max == -1
163
+ })
164
164
  }
165
165
 
166
166
  func regexpHasPlusQuantifierCandidate(parts regexpLiteralParts) bool {
167
- return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
168
- return hasComma && min == 1 && max == -1
169
- })
167
+ return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
168
+ return hasComma && min == 1 && max == -1
169
+ })
170
170
  }
171
171
 
172
172
  func regexpHasStarQuantifierCandidate(parts regexpLiteralParts) bool {
173
- return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
174
- return hasComma && min == 0 && max == -1
175
- })
173
+ return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
174
+ return hasComma && min == 0 && max == -1
175
+ })
176
176
  }
177
177
 
178
178
  func regexpHasQuestionQuantifierCandidate(parts regexpLiteralParts) bool {
179
- return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
180
- return hasComma && min == 0 && max == 1
181
- })
179
+ return scanRegexpQuantifiers(parts.pattern, func(min, max int, hasComma bool) bool {
180
+ return hasComma && min == 0 && max == 1
181
+ })
182
182
  }
183
183
 
184
184
  func regexpNeedsUnicodeFlag(parts regexpLiteralParts) bool {
185
- return !strings.ContainsAny(parts.flags, "uv")
185
+ return !strings.ContainsAny(parts.flags, "uv")
186
186
  }
187
187
 
188
188
  func regexpNeedsUnicodeSetsFlag(parts regexpLiteralParts) bool {
189
- return !strings.Contains(parts.flags, "v")
189
+ return !strings.Contains(parts.flags, "v")
190
190
  }
191
191
 
192
192
  func regexpFlagsUnsorted(parts regexpLiteralParts) bool {
193
- sorted := []byte(parts.flags)
194
- sort.SliceStable(sorted, func(i, j int) bool {
195
- return regexpFlagOrder(sorted[i]) < regexpFlagOrder(sorted[j])
196
- })
197
- return string(sorted) != parts.flags
193
+ sorted := []byte(parts.flags)
194
+ sort.SliceStable(sorted, func(i, j int) bool {
195
+ return regexpFlagOrder(sorted[i]) < regexpFlagOrder(sorted[j])
196
+ })
197
+ return string(sorted) != parts.flags
198
198
  }
199
199
 
200
200
  func regexpFlagOrder(flag byte) int {
201
- const order = "dgimsuvy"
202
- if i := strings.IndexByte(order, flag); i >= 0 {
203
- return i
204
- }
205
- return len(order) + int(flag)
201
+ const order = "dgimsuvy"
202
+ if i := strings.IndexByte(order, flag); i >= 0 {
203
+ return i
204
+ }
205
+ return len(order) + int(flag)
206
206
  }
207
207
 
208
208
  func regexpHasUselessFlag(parts regexpLiteralParts) bool {
209
- if strings.Contains(parts.flags, "i") && !regexpPatternHasAsciiLetter(parts.pattern) {
210
- return true
211
- }
212
- if strings.Contains(parts.flags, "m") && !regexpPatternHasLineAnchor(parts.pattern) {
213
- return true
214
- }
215
- return false
209
+ if strings.Contains(parts.flags, "i") && !regexpPatternHasAsciiLetter(parts.pattern) {
210
+ return true
211
+ }
212
+ if strings.Contains(parts.flags, "m") && !regexpPatternHasLineAnchor(parts.pattern) {
213
+ return true
214
+ }
215
+ return false
216
216
  }
217
217
 
218
218
  func regexpHasPreferD(parts regexpLiteralParts) bool {
219
- return strings.Contains(parts.pattern, "[0-9]")
219
+ return strings.Contains(parts.pattern, "[0-9]")
220
220
  }
221
221
 
222
222
  func regexpHasPreferW(parts regexpLiteralParts) bool {
223
- return strings.Contains(parts.pattern, "[A-Za-z0-9_]") || strings.Contains(parts.pattern, "[a-zA-Z0-9_]")
223
+ return strings.Contains(parts.pattern, "[A-Za-z0-9_]") || strings.Contains(parts.pattern, "[a-zA-Z0-9_]")
224
224
  }
225
225
 
226
226
  func regexpHasDuplicateClassCharacter(parts regexpLiteralParts) bool {
227
- return walkRegexpCharacterClasses(parts.pattern, func(content string) bool {
228
- if classHasRange(content) {
229
- return false
230
- }
231
- seen := map[byte]struct{}{}
232
- for i := 0; i < len(content); i++ {
233
- ch := content[i]
234
- if ch == '\\' {
235
- i++
236
- continue
237
- }
238
- if ch == '^' && i == 0 {
239
- continue
240
- }
241
- if ch == '-' {
242
- continue
243
- }
244
- if _, ok := seen[ch]; ok {
245
- return true
246
- }
247
- seen[ch] = struct{}{}
248
- }
249
- return false
250
- })
227
+ return walkRegexpCharacterClasses(parts.pattern, func(content string) bool {
228
+ if classHasRange(content) {
229
+ return false
230
+ }
231
+ seen := map[byte]struct{}{}
232
+ for i := 0; i < len(content); i++ {
233
+ ch := content[i]
234
+ if ch == '\\' {
235
+ i++
236
+ continue
237
+ }
238
+ if ch == '^' && i == 0 {
239
+ continue
240
+ }
241
+ if ch == '-' {
242
+ continue
243
+ }
244
+ if _, ok := seen[ch]; ok {
245
+ return true
246
+ }
247
+ seen[ch] = struct{}{}
248
+ }
249
+ return false
250
+ })
251
251
  }
252
252
 
253
253
  func regexpHasUselessCharacterClass(parts regexpLiteralParts) bool {
254
- return walkRegexpCharacterClasses(parts.pattern, func(content string) bool {
255
- if len(content) != 1 {
256
- return false
257
- }
258
- ch := content[0]
259
- return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')
260
- })
254
+ return walkRegexpCharacterClasses(parts.pattern, func(content string) bool {
255
+ if len(content) != 1 {
256
+ return false
257
+ }
258
+ ch := content[0]
259
+ return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')
260
+ })
261
261
  }
262
262
 
263
263
  func scanRegexpPattern(pattern string, visit func(pattern string, i int) bool) bool {
264
- inClass := false
265
- for i := 0; i < len(pattern); i++ {
266
- switch pattern[i] {
267
- case '\\':
268
- i++
269
- case '[':
270
- if !inClass {
271
- inClass = true
272
- }
273
- case ']':
274
- inClass = false
275
- default:
276
- if !inClass && visit(pattern, i) {
277
- return true
278
- }
279
- }
280
- }
281
- return false
264
+ inClass := false
265
+ for i := 0; i < len(pattern); i++ {
266
+ switch pattern[i] {
267
+ case '\\':
268
+ i++
269
+ case '[':
270
+ if !inClass {
271
+ inClass = true
272
+ }
273
+ case ']':
274
+ inClass = false
275
+ default:
276
+ if !inClass && visit(pattern, i) {
277
+ return true
278
+ }
279
+ }
280
+ }
281
+ return false
282
282
  }
283
283
 
284
284
  func scanRegexpQuantifiers(pattern string, visit func(min, max int, hasComma bool) bool) bool {
285
- return scanRegexpPattern(pattern, func(pattern string, i int) bool {
286
- if pattern[i] != '{' {
287
- return false
288
- }
289
- end := i + 1
290
- for end < len(pattern) && pattern[end] != '}' {
291
- end++
292
- }
293
- if end >= len(pattern) {
294
- return false
295
- }
296
- body := pattern[i+1 : end]
297
- hasComma := strings.Contains(body, ",")
298
- min, max := -1, -1
299
- if hasComma {
300
- pair := strings.SplitN(body, ",", 2)
301
- min = parseRegexpQuantifierNumber(pair[0])
302
- if pair[1] != "" {
303
- max = parseRegexpQuantifierNumber(pair[1])
304
- }
305
- } else {
306
- min = parseRegexpQuantifierNumber(body)
307
- }
308
- return min >= 0 && visit(min, max, hasComma)
309
- })
285
+ return scanRegexpPattern(pattern, func(pattern string, i int) bool {
286
+ if pattern[i] != '{' {
287
+ return false
288
+ }
289
+ end := i + 1
290
+ for end < len(pattern) && pattern[end] != '}' {
291
+ end++
292
+ }
293
+ if end >= len(pattern) {
294
+ return false
295
+ }
296
+ body := pattern[i+1 : end]
297
+ hasComma := strings.Contains(body, ",")
298
+ min, max := -1, -1
299
+ if hasComma {
300
+ pair := strings.SplitN(body, ",", 2)
301
+ min = parseRegexpQuantifierNumber(pair[0])
302
+ if pair[1] != "" {
303
+ max = parseRegexpQuantifierNumber(pair[1])
304
+ }
305
+ } else {
306
+ min = parseRegexpQuantifierNumber(body)
307
+ }
308
+ return min >= 0 && visit(min, max, hasComma)
309
+ })
310
310
  }
311
311
 
312
312
  func parseRegexpQuantifierNumber(text string) int {
313
- if text == "" {
314
- return -1
315
- }
316
- for i := 0; i < len(text); i++ {
317
- if text[i] < '0' || text[i] > '9' {
318
- return -1
319
- }
320
- }
321
- value, err := strconv.Atoi(text)
322
- if err != nil {
323
- return -1
324
- }
325
- return value
313
+ if text == "" {
314
+ return -1
315
+ }
316
+ for i := 0; i < len(text); i++ {
317
+ if text[i] < '0' || text[i] > '9' {
318
+ return -1
319
+ }
320
+ }
321
+ value, err := strconv.Atoi(text)
322
+ if err != nil {
323
+ return -1
324
+ }
325
+ return value
326
326
  }
327
327
 
328
328
  func walkRegexpCharacterClasses(pattern string, visit func(content string) bool) bool {
329
- for i := 0; i < len(pattern); i++ {
330
- if pattern[i] == '\\' {
331
- i++
332
- continue
333
- }
334
- if pattern[i] != '[' {
335
- continue
336
- }
337
- start := i + 1
338
- for j := start; j < len(pattern); j++ {
339
- if pattern[j] == '\\' {
340
- j++
341
- continue
342
- }
343
- if pattern[j] == ']' {
344
- if visit(pattern[start:j]) {
345
- return true
346
- }
347
- i = j
348
- break
349
- }
350
- }
351
- }
352
- return false
329
+ for i := 0; i < len(pattern); i++ {
330
+ if pattern[i] == '\\' {
331
+ i++
332
+ continue
333
+ }
334
+ if pattern[i] != '[' {
335
+ continue
336
+ }
337
+ start := i + 1
338
+ for j := start; j < len(pattern); j++ {
339
+ if pattern[j] == '\\' {
340
+ j++
341
+ continue
342
+ }
343
+ if pattern[j] == ']' {
344
+ if visit(pattern[start:j]) {
345
+ return true
346
+ }
347
+ i = j
348
+ break
349
+ }
350
+ }
351
+ }
352
+ return false
353
353
  }
354
354
 
355
355
  func classHasRange(content string) bool {
356
- for i := 1; i+1 < len(content); i++ {
357
- if content[i] == '\\' {
358
- i++
359
- continue
360
- }
361
- if content[i] == '-' {
362
- return true
363
- }
364
- }
365
- return false
356
+ for i := 1; i+1 < len(content); i++ {
357
+ if content[i] == '\\' {
358
+ i++
359
+ continue
360
+ }
361
+ if content[i] == '-' {
362
+ return true
363
+ }
364
+ }
365
+ return false
366
366
  }
367
367
 
368
368
  func regexpPatternHasAsciiLetter(pattern string) bool {
369
- return scanRegexpPattern(pattern, func(pattern string, i int) bool {
370
- ch := pattern[i]
371
- return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
372
- })
369
+ return scanRegexpPattern(pattern, func(pattern string, i int) bool {
370
+ ch := pattern[i]
371
+ return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
372
+ })
373
373
  }
374
374
 
375
375
  func regexpPatternHasLineAnchor(pattern string) bool {
376
- return scanRegexpPattern(pattern, func(pattern string, i int) bool {
377
- return pattern[i] == '^' || pattern[i] == '$'
378
- })
376
+ return scanRegexpPattern(pattern, func(pattern string, i int) bool {
377
+ return pattern[i] == '^' || pattern[i] == '$'
378
+ })
379
379
  }
380
380
 
381
381
  func init() {
382
- Register(regexpSourceRule{name: "regexp/no-control-character", check: func(parts regexpLiteralParts) bool {
383
- return regexContainsControl(parts.raw)
384
- }})
385
- Register(regexpSourceRule{name: "regexp/no-dupe-characters-character-class", check: regexpHasDuplicateClassCharacter})
386
- Register(regexpSourceRule{name: "regexp/no-empty-alternative", check: regexpHasEmptyAlternative})
387
- Register(regexpSourceRule{name: "regexp/no-empty-capturing-group", check: regexpHasEmptyCapturingGroup})
388
- Register(regexpSourceRule{name: "regexp/no-empty-character-class", check: func(parts regexpLiteralParts) bool {
389
- return hasEmptyCharClass(parts.raw)
390
- }})
391
- Register(regexpSourceRule{name: "regexp/no-empty-group", check: regexpHasEmptyGroup})
392
- Register(regexpSourceRule{name: "regexp/no-empty-lookarounds-assertion", check: regexpHasEmptyLookaround})
393
- Register(regexpSourceRule{name: "regexp/no-misleading-unicode-character", check: func(parts regexpLiteralParts) bool {
394
- return regexHasSurrogatePair(parts.raw)
395
- }})
396
- Register(regexpSourceRule{name: "regexp/no-useless-character-class", check: regexpHasUselessCharacterClass})
397
- Register(regexpNoUselessEscapeAlias{})
398
- Register(regexpSourceRule{name: "regexp/no-useless-flag", check: regexpHasUselessFlag})
399
- Register(regexpSourceRule{name: "regexp/no-useless-quantifier", check: regexpHasUselessQuantifier})
400
- Register(regexpSourceRule{name: "regexp/no-useless-two-nums-quantifier", check: regexpHasUselessTwoNumsQuantifier})
401
- Register(regexpSourceRule{name: "regexp/no-zero-quantifier", check: regexpHasZeroQuantifier})
402
- Register(regexpSourceRule{name: "regexp/prefer-d", check: regexpHasPreferD})
403
- Register(regexpSourceRule{name: "regexp/prefer-plus-quantifier", check: regexpHasPlusQuantifierCandidate})
404
- Register(regexpSourceRule{name: "regexp/prefer-question-quantifier", check: regexpHasQuestionQuantifierCandidate})
405
- Register(regexpSourceRule{name: "regexp/prefer-star-quantifier", check: regexpHasStarQuantifierCandidate})
406
- Register(regexpSourceRule{name: "regexp/prefer-w", check: regexpHasPreferW})
407
- Register(regexpSourceRule{name: "regexp/require-unicode-regexp", check: regexpNeedsUnicodeFlag})
408
- Register(regexpSourceRule{name: "regexp/require-unicode-sets-regexp", check: regexpNeedsUnicodeSetsFlag})
409
- Register(regexpSourceRule{name: "regexp/sort-flags", check: regexpFlagsUnsorted})
382
+ Register(regexpSourceRule{name: "regexp/no-control-character", check: func(parts regexpLiteralParts) bool {
383
+ return regexContainsControl(parts.raw)
384
+ }})
385
+ Register(regexpSourceRule{name: "regexp/no-dupe-characters-character-class", check: regexpHasDuplicateClassCharacter})
386
+ Register(regexpSourceRule{name: "regexp/no-empty-alternative", check: regexpHasEmptyAlternative})
387
+ Register(regexpSourceRule{name: "regexp/no-empty-capturing-group", check: regexpHasEmptyCapturingGroup})
388
+ Register(regexpSourceRule{name: "regexp/no-empty-character-class", check: func(parts regexpLiteralParts) bool {
389
+ return hasEmptyCharClass(parts.raw)
390
+ }})
391
+ Register(regexpSourceRule{name: "regexp/no-empty-group", check: regexpHasEmptyGroup})
392
+ Register(regexpSourceRule{name: "regexp/no-empty-lookarounds-assertion", check: regexpHasEmptyLookaround})
393
+ Register(regexpSourceRule{name: "regexp/no-misleading-unicode-character", check: func(parts regexpLiteralParts) bool {
394
+ return regexHasSurrogatePair(parts.raw)
395
+ }})
396
+ Register(regexpSourceRule{name: "regexp/no-useless-character-class", check: regexpHasUselessCharacterClass})
397
+ Register(regexpNoUselessEscapeAlias{})
398
+ Register(regexpSourceRule{name: "regexp/no-useless-flag", check: regexpHasUselessFlag})
399
+ Register(regexpSourceRule{name: "regexp/no-useless-quantifier", check: regexpHasUselessQuantifier})
400
+ Register(regexpSourceRule{name: "regexp/no-useless-two-nums-quantifier", check: regexpHasUselessTwoNumsQuantifier})
401
+ Register(regexpSourceRule{name: "regexp/no-zero-quantifier", check: regexpHasZeroQuantifier})
402
+ Register(regexpSourceRule{name: "regexp/prefer-d", check: regexpHasPreferD})
403
+ Register(regexpSourceRule{name: "regexp/prefer-plus-quantifier", check: regexpHasPlusQuantifierCandidate})
404
+ Register(regexpSourceRule{name: "regexp/prefer-question-quantifier", check: regexpHasQuestionQuantifierCandidate})
405
+ Register(regexpSourceRule{name: "regexp/prefer-star-quantifier", check: regexpHasStarQuantifierCandidate})
406
+ Register(regexpSourceRule{name: "regexp/prefer-w", check: regexpHasPreferW})
407
+ Register(regexpSourceRule{name: "regexp/require-unicode-regexp", check: regexpNeedsUnicodeFlag})
408
+ Register(regexpSourceRule{name: "regexp/require-unicode-sets-regexp", check: regexpNeedsUnicodeSetsFlag})
409
+ Register(regexpSourceRule{name: "regexp/sort-flags", check: regexpFlagsUnsorted})
410
410
  }