@ttsc/lint 0.14.0-dev.20260529.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -23
- package/lib/defaultFormat.d.ts +10 -6
- package/lib/defaultFormat.js +10 -6
- package/lib/defaultFormat.js.map +1 -1
- package/lib/structures/ITtscLintConfig.d.ts +5 -5
- package/lib/structures/TtscLintRuleSetting.d.ts +19 -19
- package/lib/structures/{ITtscLintFormat.d.ts → format/ITtscLintFormat.d.ts} +45 -70
- package/lib/structures/format/ITtscLintFormat.js.map +1 -0
- package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +15 -0
- package/lib/structures/format/ITtscLintFormatJsDoc.js +3 -0
- package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
- package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
- package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
- package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
- package/lib/structures/format/index.d.ts +3 -0
- package/lib/structures/format/index.js +20 -0
- package/lib/structures/format/index.js.map +1 -0
- package/lib/structures/index.d.ts +1 -1
- package/lib/structures/index.js +1 -1
- package/lib/structures/index.js.map +1 -1
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +18 -27
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +4 -5
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -1
- package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +29 -33
- package/lib/structures/rules/ITtscLintContributorRules.d.ts +6 -7
- package/lib/structures/rules/ITtscLintCoreRules.d.ts +380 -408
- package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +5 -5
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js +2 -2
- package/lib/structures/rules/ITtscLintCypressRules.d.ts +34 -38
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +21 -24
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +2 -2
- package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +51 -56
- package/lib/structures/rules/ITtscLintJestRules.d.ts +63 -74
- package/lib/structures/rules/ITtscLintJsdocRules.d.ts +47 -54
- package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +94 -102
- package/lib/structures/rules/ITtscLintNextjsRules.d.ts +50 -55
- package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +104 -122
- package/lib/structures/rules/ITtscLintPromiseRules.d.ts +62 -71
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +4 -4
- package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +17 -19
- package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +8 -10
- package/lib/structures/rules/ITtscLintReactRuleOptions.js +1 -2
- package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -1
- package/lib/structures/rules/ITtscLintReactRules.d.ts +91 -104
- package/lib/structures/rules/ITtscLintRegexpRules.d.ts +46 -54
- package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +7 -8
- package/lib/structures/rules/ITtscLintSecurityRules.d.ts +45 -52
- package/lib/structures/rules/ITtscLintSolidRules.d.ts +53 -56
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +3 -4
- package/lib/structures/rules/ITtscLintStorybookRules.d.ts +60 -69
- package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +31 -37
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +2 -3
- package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +102 -119
- package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +460 -518
- package/lib/structures/rules/ITtscLintVitestRules.d.ts +43 -51
- package/linthost/config.go +89 -72
- package/linthost/config_format.go +265 -99
- package/linthost/directives.go +5 -1
- package/linthost/display_width.go +72 -0
- package/linthost/fix.go +26 -1
- package/linthost/format.go +222 -25
- package/linthost/format_editor_settings.go +262 -0
- package/linthost/lsp.go +8 -4
- package/linthost/print_dispatch.go +3 -0
- package/linthost/print_doc.go +13 -0
- package/linthost/print_engine.go +68 -11
- package/linthost/print_nodes_array.go +108 -5
- package/linthost/print_nodes_call.go +515 -74
- package/linthost/print_nodes_function.go +25 -0
- package/linthost/print_nodes_imports.go +47 -14
- package/linthost/print_nodes_list.go +191 -8
- package/linthost/print_nodes_object.go +12 -6
- package/linthost/print_nodes_ternary.go +106 -0
- package/linthost/rules_boundaries.go +400 -400
- package/linthost/rules_camelcase.go +81 -81
- package/linthost/rules_complexity.go +52 -51
- package/linthost/rules_consistent_return.go +81 -81
- package/linthost/rules_core_extra.go +472 -472
- package/linthost/rules_curly.go +43 -43
- package/linthost/rules_default_case.go +15 -15
- package/linthost/rules_default_case_last.go +22 -22
- package/linthost/rules_format_arrow_parens.go +167 -0
- package/linthost/rules_format_bracket_spacing.go +117 -0
- package/linthost/rules_format_clause_join.go +172 -0
- package/linthost/rules_format_declaration_header.go +664 -0
- package/linthost/rules_format_indent.go +616 -0
- package/linthost/rules_format_jsdoc.go +4 -4
- package/linthost/rules_format_orphan_semi.go +106 -0
- package/linthost/rules_format_parameter_properties.go +175 -0
- package/linthost/rules_format_print_width.go +185 -69
- package/linthost/rules_format_quote_props.go +169 -0
- package/linthost/rules_format_quotes.go +75 -29
- package/linthost/rules_format_semi.go +185 -10
- package/linthost/rules_format_sort_imports.go +456 -121
- package/linthost/rules_format_statement_split.go +368 -0
- package/linthost/rules_format_ternary_nullish_parens.go +77 -0
- package/linthost/rules_format_trailing_comma.go +21 -2
- package/linthost/rules_format_whitespace.go +336 -0
- package/linthost/rules_functional.go +688 -688
- package/linthost/rules_gap.go +146 -11
- package/linthost/rules_grouped_accessor_pairs.go +60 -60
- package/linthost/rules_guard_for_in.go +122 -122
- package/linthost/rules_id_length.go +44 -44
- package/linthost/rules_imports.go +11 -3
- package/linthost/rules_init_declarations.go +25 -25
- package/linthost/rules_jsx_a11y.go +844 -844
- package/linthost/rules_max_classes_per_file.go +24 -24
- package/linthost/rules_max_depth.go +43 -43
- package/linthost/rules_max_lines.go +53 -53
- package/linthost/rules_max_lines_per_function.go +28 -28
- package/linthost/rules_max_nested_callbacks.go +26 -26
- package/linthost/rules_max_params.go +20 -20
- package/linthost/rules_max_statements.go +29 -29
- package/linthost/rules_nextjs.go +5 -5
- package/linthost/rules_no_else_return.go +38 -38
- package/linthost/rules_no_empty_named_blocks.go +45 -45
- package/linthost/rules_no_import_assign.go +96 -96
- package/linthost/rules_no_invalid_this.go +19 -19
- package/linthost/rules_no_loop_func.go +43 -43
- package/linthost/rules_no_magic_numbers.go +60 -60
- package/linthost/rules_no_mixed_operators.go +44 -44
- package/linthost/rules_no_param_reassign.go +64 -64
- package/linthost/rules_no_restricted_imports.go +45 -45
- package/linthost/rules_no_restricted_syntax.go +17 -17
- package/linthost/rules_no_shadow.go +112 -112
- package/linthost/rules_no_unreachable.go +36 -36
- package/linthost/rules_no_useless_assignment.go +79 -79
- package/linthost/rules_no_useless_constructor.go +167 -167
- package/linthost/rules_no_useless_return.go +28 -28
- package/linthost/rules_prefer_arrow_callback.go +74 -74
- package/linthost/rules_prefer_destructuring.go +61 -61
- package/linthost/rules_prefer_named_capture_group.go +87 -87
- package/linthost/rules_prefer_rest_params.go +61 -61
- package/linthost/rules_promise.go +800 -800
- package/linthost/rules_react.go +600 -600
- package/linthost/rules_react_extras.go +162 -162
- package/linthost/rules_react_hooks.go +2 -2
- package/linthost/rules_react_perf.go +231 -231
- package/linthost/rules_regexp.go +293 -293
- package/linthost/rules_security.go +613 -613
- package/linthost/rules_sort_imports.go +37 -37
- package/linthost/rules_sort_keys.go +88 -88
- package/linthost/rules_suggestions.go +13 -0
- package/linthost/rules_ts.go +2 -2
- package/linthost/rules_ts_async.go +247 -247
- package/linthost/rules_ts_class_literal_property_style.go +64 -64
- package/linthost/rules_ts_consistent_type_exports.go +209 -209
- package/linthost/rules_ts_explicit_function_return_type.go +35 -35
- package/linthost/rules_ts_extra.go +6 -2
- package/linthost/rules_ts_no_base_to_string.go +140 -140
- package/linthost/rules_ts_no_confusing_void.go +28 -28
- package/linthost/rules_ts_no_deprecated.go +110 -110
- package/linthost/rules_ts_no_for_in_array.go +45 -45
- package/linthost/rules_ts_no_magic_numbers.go +67 -67
- package/linthost/rules_ts_no_meaningless_void_operator.go +44 -44
- package/linthost/rules_ts_no_misused_spread.go +64 -64
- package/linthost/rules_ts_no_redundant_type_constituents.go +72 -72
- package/linthost/rules_ts_no_restricted_types.go +28 -28
- package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +87 -87
- package/linthost/rules_ts_no_unnecessary_condition.go +184 -184
- package/linthost/rules_ts_no_unnecessary_qualifier.go +72 -72
- package/linthost/rules_ts_no_unnecessary_template_expression.go +120 -120
- package/linthost/rules_ts_no_unnecessary_type_arguments.go +171 -171
- package/linthost/rules_ts_no_unnecessary_type_assertion.go +90 -90
- package/linthost/rules_ts_no_unsafe_argument.go +50 -50
- package/linthost/rules_ts_no_unsafe_assignment.go +60 -60
- package/linthost/rules_ts_no_unsafe_call.go +40 -40
- package/linthost/rules_ts_no_unsafe_enum_comparison.go +147 -147
- package/linthost/rules_ts_no_unsafe_member_access.go +29 -29
- package/linthost/rules_ts_no_unsafe_return.go +64 -64
- package/linthost/rules_ts_no_unsafe_unary_minus.go +42 -42
- package/linthost/rules_ts_no_useless_constructor.go +20 -20
- package/linthost/rules_ts_non_nullable_type_assertion_style.go +60 -60
- package/linthost/rules_ts_parameter_properties.go +10 -10
- package/linthost/rules_ts_prefer_find.go +116 -116
- package/linthost/rules_ts_prefer_includes.go +173 -173
- package/linthost/rules_ts_prefer_nullish_coalescing.go +54 -54
- package/linthost/rules_ts_prefer_optional_chain.go +156 -156
- package/linthost/rules_ts_prefer_promise_reject_errors.go +104 -104
- package/linthost/rules_ts_prefer_readonly.go +31 -31
- package/linthost/rules_ts_prefer_reduce_type_parameter.go +74 -74
- package/linthost/rules_ts_prefer_regexp_exec.go +69 -69
- package/linthost/rules_ts_prefer_return_this_type.go +79 -79
- package/linthost/rules_ts_prefer_string_starts_ends_with.go +237 -237
- package/linthost/rules_ts_promise_function_async.go +41 -41
- package/linthost/rules_ts_related_getter_setter_pairs.go +61 -61
- package/linthost/rules_ts_require_array_sort_compare.go +58 -58
- package/linthost/rules_ts_restrict_plus_operands.go +82 -82
- package/linthost/rules_ts_restrict_template_expressions.go +50 -50
- package/linthost/rules_ts_simple.go +249 -249
- package/linthost/rules_ts_sort_type_constituents.go +88 -88
- package/linthost/rules_ts_strict_boolean_expressions.go +103 -103
- package/linthost/rules_ts_switch_exhaustiveness_check.go +90 -90
- package/linthost/rules_ts_unbound_method.go +65 -65
- package/linthost/rules_tsdoc.go +88 -88
- package/linthost/rules_unicorn_better_regex.go +1 -1
- package/linthost/rules_unicorn_catch_error_name.go +19 -19
- package/linthost/rules_unicorn_consistent_assert.go +20 -20
- package/linthost/rules_unicorn_consistent_date_clone.go +27 -27
- package/linthost/rules_unicorn_consistent_destructuring.go +3 -3
- package/linthost/rules_unicorn_consistent_empty_array_spread.go +34 -34
- package/linthost/rules_unicorn_consistent_existence_index_check.go +42 -42
- package/linthost/rules_unicorn_consistent_function_scoping.go +3 -3
- package/linthost/rules_unicorn_consistent_template_literal_escape.go +3 -3
- package/linthost/rules_unicorn_custom_error_definition.go +92 -92
- package/linthost/rules_unicorn_empty_brace_spaces.go +47 -47
- package/linthost/rules_unicorn_error_message.go +34 -34
- package/linthost/rules_unicorn_escape_case.go +14 -14
- package/linthost/rules_unicorn_expiring_todo_comments.go +36 -36
- package/linthost/rules_unicorn_explicit_length_check.go +51 -51
- package/linthost/rules_unicorn_filename_case.go +1 -1
- package/linthost/rules_unicorn_import_style.go +1 -1
- package/linthost/rules_unicorn_isolated_functions.go +2 -2
- package/linthost/rules_unicorn_new_for_builtins.go +49 -49
- package/linthost/rules_unicorn_no_abusive_eslint_disable.go +31 -31
- package/linthost/rules_unicorn_no_accessor_recursion.go +69 -69
- package/linthost/rules_unicorn_no_anonymous_default_export.go +40 -40
- package/linthost/rules_unicorn_no_array_callback_reference.go +33 -33
- package/linthost/rules_unicorn_no_array_for_each.go +14 -14
- package/linthost/rules_unicorn_no_array_method_this_argument.go +29 -29
- package/linthost/rules_unicorn_no_array_reduce.go +15 -15
- package/linthost/rules_unicorn_no_array_reverse.go +17 -17
- package/linthost/rules_unicorn_no_array_sort.go +17 -17
- package/linthost/rules_unicorn_no_await_expression_member.go +12 -12
- package/linthost/rules_unicorn_no_await_in_promise_methods.go +38 -38
- package/linthost/rules_unicorn_no_console_spaces.go +30 -30
- package/linthost/rules_unicorn_no_document_cookie.go +13 -13
- package/linthost/rules_unicorn_no_empty_file.go +16 -16
- package/linthost/rules_unicorn_no_for_loop.go +58 -58
- package/linthost/rules_unicorn_no_hex_escape.go +11 -11
- package/linthost/rules_unicorn_no_immediate_mutation.go +55 -55
- package/linthost/rules_unicorn_no_instanceof_builtins.go +34 -34
- package/linthost/rules_unicorn_no_invalid_fetch_options.go +52 -52
- package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +25 -25
- package/linthost/rules_unicorn_no_keyword_prefix.go +56 -56
- package/linthost/rules_unicorn_no_lonely_if.go +21 -21
- package/linthost/rules_unicorn_no_magic_array_flat_depth.go +22 -22
- package/linthost/rules_unicorn_no_named_default.go +25 -25
- package/linthost/rules_unicorn_no_negated_condition.go +54 -54
- package/linthost/rules_unicorn_no_negation_in_equality_check.go +23 -23
- package/linthost/rules_unicorn_no_nested_ternary.go +15 -15
- package/linthost/rules_unicorn_no_new_array.go +5 -5
- package/linthost/rules_unicorn_no_new_buffer.go +5 -5
- package/linthost/rules_unicorn_no_null.go +2 -2
- package/linthost/rules_unicorn_no_object_as_default_parameter.go +19 -19
- package/linthost/rules_unicorn_no_process_exit.go +17 -17
- package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +29 -29
- package/linthost/rules_unicorn_no_static_only_class.go +27 -27
- package/linthost/rules_unicorn_no_thenable.go +47 -47
- package/linthost/rules_unicorn_no_this_assignment.go +10 -10
- package/linthost/rules_unicorn_no_typeof_undefined.go +31 -31
- package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +23 -23
- package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +37 -37
- package/linthost/rules_unicorn_no_unnecessary_await.go +24 -24
- package/linthost/rules_unicorn_no_unnecessary_slice_end.go +22 -22
- package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +67 -67
- package/linthost/rules_unicorn_no_unreadable_iife.go +22 -22
- package/linthost/rules_unicorn_no_useless_collection_argument.go +34 -34
- package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +18 -18
- package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +49 -49
- package/linthost/rules_unicorn_no_useless_iterator_to_array.go +41 -41
- package/linthost/rules_unicorn_no_useless_length_check.go +82 -82
- package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +42 -42
- package/linthost/rules_unicorn_no_useless_spread.go +38 -38
- package/linthost/rules_unicorn_no_useless_switch_case.go +29 -29
- package/linthost/rules_unicorn_no_useless_undefined.go +25 -25
- package/linthost/rules_unicorn_no_zero_fractions.go +17 -17
- package/linthost/rules_unicorn_number_literal_case.go +33 -33
- package/linthost/rules_unicorn_numeric_separators_style.go +36 -36
- package/linthost/rules_unicorn_prefer_add_event_listener.go +30 -30
- package/linthost/rules_unicorn_prefer_array_find.go +27 -27
- package/linthost/rules_unicorn_prefer_array_flat.go +25 -25
- package/linthost/rules_unicorn_prefer_array_flat_map.go +37 -37
- package/linthost/rules_unicorn_prefer_array_index_of.go +108 -108
- package/linthost/rules_unicorn_prefer_array_some.go +43 -43
- package/linthost/rules_unicorn_prefer_at.go +42 -42
- package/linthost/rules_unicorn_prefer_bigint_literals.go +42 -42
- package/linthost/rules_unicorn_prefer_blob_reading_methods.go +15 -15
- package/linthost/rules_unicorn_prefer_class_fields.go +57 -57
- package/linthost/rules_unicorn_prefer_classlist_toggle.go +76 -76
- package/linthost/rules_unicorn_prefer_code_point.go +21 -21
- package/linthost/rules_unicorn_prefer_date_now.go +47 -47
- package/linthost/rules_unicorn_prefer_default_parameters.go +96 -96
- package/linthost/rules_unicorn_prefer_dom_node_append.go +14 -14
- package/linthost/rules_unicorn_prefer_dom_node_dataset.go +27 -27
- package/linthost/rules_unicorn_prefer_dom_node_remove.go +17 -17
- package/linthost/rules_unicorn_prefer_dom_node_text_content.go +11 -11
- package/linthost/rules_unicorn_prefer_event_target.go +10 -10
- package/linthost/rules_unicorn_prefer_export_from.go +99 -99
- package/linthost/rules_unicorn_prefer_global_this.go +91 -91
- package/linthost/rules_unicorn_prefer_import_meta_properties.go +38 -38
- package/linthost/rules_unicorn_prefer_includes.go +108 -108
- package/linthost/rules_unicorn_prefer_json_parse_buffer.go +37 -37
- package/linthost/rules_unicorn_prefer_keyboard_event_key.go +10 -10
- package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +20 -20
- package/linthost/rules_unicorn_prefer_math_min_max.go +33 -33
- package/linthost/rules_unicorn_prefer_math_trunc.go +32 -32
- package/linthost/rules_unicorn_prefer_modern_dom_apis.go +18 -18
- package/linthost/rules_unicorn_prefer_modern_math_apis.go +38 -38
- package/linthost/rules_unicorn_prefer_module.go +22 -22
- package/linthost/rules_unicorn_prefer_native_coercion_functions.go +73 -73
- package/linthost/rules_unicorn_prefer_negative_index.go +46 -46
- package/linthost/rules_unicorn_prefer_node_protocol.go +90 -90
- package/linthost/rules_unicorn_prefer_number_properties.go +57 -57
- package/linthost/rules_unicorn_prefer_object_from_entries.go +26 -26
- package/linthost/rules_unicorn_prefer_optional_catch_binding.go +24 -24
- package/linthost/rules_unicorn_prefer_prototype_methods.go +25 -25
- package/linthost/rules_unicorn_prefer_query_selector.go +25 -25
- package/linthost/rules_unicorn_prefer_reflect_apply.go +10 -10
- package/linthost/rules_unicorn_prefer_regexp_test_rule.go +47 -47
- package/linthost/rules_unicorn_prefer_response_static_json.go +26 -26
- package/linthost/rules_unicorn_prefer_set_has.go +16 -16
- package/linthost/rules_unicorn_prefer_set_size.go +22 -22
- package/linthost/rules_unicorn_prefer_simple_condition_first.go +3 -3
- package/linthost/rules_unicorn_prefer_single_call.go +59 -59
- package/linthost/rules_unicorn_prefer_spread.go +24 -24
- package/linthost/rules_unicorn_prefer_string_raw.go +12 -12
- package/linthost/rules_unicorn_prefer_string_replace_all.go +46 -46
- package/linthost/rules_unicorn_prefer_string_slice.go +17 -17
- package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +104 -104
- package/linthost/rules_unicorn_prefer_string_trim_start_end.go +21 -21
- package/linthost/rules_unicorn_prefer_structured_clone.go +36 -36
- package/linthost/rules_unicorn_prefer_switch.go +65 -65
- package/linthost/rules_unicorn_prefer_ternary.go +35 -35
- package/linthost/rules_unicorn_prefer_top_level_await.go +34 -34
- package/linthost/rules_unicorn_prefer_type_error.go +84 -84
- package/linthost/rules_unicorn_prevent_abbreviations.go +68 -68
- package/linthost/rules_unicorn_relative_url_style.go +19 -19
- package/linthost/rules_unicorn_require_array_join_separator.go +18 -18
- package/linthost/rules_unicorn_require_module_attributes.go +25 -25
- package/linthost/rules_unicorn_require_module_specifiers.go +28 -28
- package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +18 -18
- package/linthost/rules_unicorn_require_post_message_target_origin.go +18 -18
- package/linthost/rules_unicorn_string_content.go +1 -1
- package/linthost/rules_unicorn_switch_case_braces.go +16 -16
- package/linthost/rules_unicorn_switch_case_break_position.go +3 -3
- package/linthost/rules_unicorn_template_indent.go +1 -1
- package/linthost/rules_unicorn_text_encoding_identifier_case.go +36 -36
- package/linthost/rules_unicorn_throw_new_error.go +30 -30
- package/linthost/rules_var.go +273 -3
- package/package.json +3 -3
- package/src/defaultFormat.ts +11 -7
- package/src/structures/ITtscLintConfig.ts +5 -5
- package/src/structures/TtscLintRuleSetting.ts +19 -19
- package/src/structures/{ITtscLintFormat.ts → format/ITtscLintFormat.ts} +48 -75
- package/src/structures/format/ITtscLintFormatJsDoc.ts +16 -0
- package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
- package/src/structures/format/index.ts +3 -0
- package/src/structures/index.ts +1 -1
- package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +20 -31
- package/src/structures/rules/ITtscLintBoundariesRules.ts +32 -36
- package/src/structures/rules/ITtscLintContributorRules.ts +6 -7
- package/src/structures/rules/ITtscLintCoreRules.ts +380 -408
- package/src/structures/rules/ITtscLintCypressRuleOptions.ts +5 -5
- package/src/structures/rules/ITtscLintCypressRules.ts +34 -38
- package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +28 -41
- package/src/structures/rules/ITtscLintFunctionalRules.ts +51 -56
- package/src/structures/rules/ITtscLintJestRules.ts +63 -74
- package/src/structures/rules/ITtscLintJsdocRules.ts +47 -54
- package/src/structures/rules/ITtscLintJsxA11yRules.ts +94 -102
- package/src/structures/rules/ITtscLintNextjsRules.ts +50 -55
- package/src/structures/rules/ITtscLintPlaywrightRules.ts +104 -122
- package/src/structures/rules/ITtscLintPromiseRules.ts +62 -71
- package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +4 -4
- package/src/structures/rules/ITtscLintReactPerfRules.ts +17 -19
- package/src/structures/rules/ITtscLintReactRuleOptions.ts +8 -10
- package/src/structures/rules/ITtscLintReactRules.ts +91 -104
- package/src/structures/rules/ITtscLintRegexpRules.ts +46 -54
- package/src/structures/rules/ITtscLintRuleOptionsMap.ts +7 -8
- package/src/structures/rules/ITtscLintSecurityRules.ts +45 -52
- package/src/structures/rules/ITtscLintSolidRules.ts +53 -56
- package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +3 -4
- package/src/structures/rules/ITtscLintStorybookRules.ts +60 -69
- package/src/structures/rules/ITtscLintTanstackQueryRules.ts +31 -37
- package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +2 -3
- package/src/structures/rules/ITtscLintTestingLibraryRules.ts +102 -119
- package/src/structures/rules/ITtscLintTypeScriptRules.ts +460 -518
- package/src/structures/rules/ITtscLintVitestRules.ts +43 -51
- package/lib/structures/ITtscLintFormat.js.map +0 -1
- /package/lib/structures/{ITtscLintFormat.js → format/ITtscLintFormat.js} +0 -0
package/linthost/rules_regexp.go
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
package linthost
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
"sort"
|
|
5
|
+
"strconv"
|
|
6
|
+
"strings"
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
18
|
-
|
|
17
|
+
name string
|
|
18
|
+
check func(regexpLiteralParts) bool
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
type regexpLiteralParts struct {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
29
|
+
return []shimast.Kind{shimast.KindRegularExpressionLiteral}
|
|
30
30
|
}
|
|
31
31
|
func (r regexpSourceRule) Check(ctx *Context, node *shimast.Node) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
43
|
+
return []shimast.Kind{shimast.KindRegularExpressionLiteral}
|
|
44
44
|
}
|
|
45
45
|
func (regexpNoUselessEscapeAlias) Check(ctx *Context, node *shimast.Node) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
150
|
-
|
|
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
|
-
|
|
156
|
-
|
|
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
|
-
|
|
162
|
-
|
|
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
|
-
|
|
168
|
-
|
|
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
|
-
|
|
174
|
-
|
|
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
|
-
|
|
180
|
-
|
|
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
|
-
|
|
185
|
+
return !strings.ContainsAny(parts.flags, "uv")
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
func regexpNeedsUnicodeSetsFlag(parts regexpLiteralParts) bool {
|
|
189
|
-
|
|
189
|
+
return !strings.Contains(parts.flags, "v")
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
func regexpFlagsUnsorted(parts regexpLiteralParts) bool {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
219
|
+
return strings.Contains(parts.pattern, "[0-9]")
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
func regexpHasPreferW(parts regexpLiteralParts) bool {
|
|
223
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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
|
-
|
|
377
|
-
|
|
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
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
}
|