@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
|
@@ -13,46 +13,46 @@
|
|
|
13
13
|
package linthost
|
|
14
14
|
|
|
15
15
|
import (
|
|
16
|
-
|
|
16
|
+
"strings"
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
19
19
|
)
|
|
20
20
|
|
|
21
21
|
type preferOptionalChain struct{}
|
|
22
22
|
|
|
23
23
|
func (preferOptionalChain) Name() string { return "typescript/prefer-optional-chain" }
|
|
24
24
|
func (preferOptionalChain) Visits() []shimast.Kind {
|
|
25
|
-
|
|
25
|
+
return []shimast.Kind{shimast.KindBinaryExpression}
|
|
26
26
|
}
|
|
27
27
|
func (preferOptionalChain) Check(ctx *Context, node *shimast.Node) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
28
|
+
expr := node.AsBinaryExpression()
|
|
29
|
+
if expr == nil || expr.OperatorToken == nil {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
if expr.OperatorToken.Kind != shimast.KindAmpersandAmpersandToken {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
// Skip when the binary expression is itself the left side of an
|
|
36
|
+
// outer `&&` — the outer node will be visited and report the full
|
|
37
|
+
// chain. Reporting at every inner conjunct would flood `a && a.b
|
|
38
|
+
// && a.b.c` with two diagnostics on the same chain.
|
|
39
|
+
if parent := node.Parent; parent != nil && parent.Kind == shimast.KindBinaryExpression {
|
|
40
|
+
pe := parent.AsBinaryExpression()
|
|
41
|
+
if pe != nil && pe.OperatorToken != nil &&
|
|
42
|
+
pe.OperatorToken.Kind == shimast.KindAmpersandAmpersandToken &&
|
|
43
|
+
pe.Left == node {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
guardText, ok := preferOptionalChainGuardText(ctx, expr.Left)
|
|
48
|
+
if !ok {
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
right := stripParens(expr.Right)
|
|
52
|
+
if !preferOptionalChainRightMatches(ctx, right, guardText) {
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
ctx.Report(node, "Prefer an optional chain (`a?.b`) over `a && a.b` — shorter and short-circuits to `undefined` instead of the leftmost falsy value.")
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
// preferOptionalChainRightmostConjunct returns the rightmost operand
|
|
@@ -60,17 +60,17 @@ func (preferOptionalChain) Check(ctx *Context, node *shimast.Node) {
|
|
|
60
60
|
// rightmost conjunct of the left is `a.b`, which is the immediate
|
|
61
61
|
// guard the outer `&&` was extending.
|
|
62
62
|
func preferOptionalChainRightmostConjunct(node *shimast.Node) *shimast.Node {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
63
|
+
node = stripParens(node)
|
|
64
|
+
for node != nil && node.Kind == shimast.KindBinaryExpression {
|
|
65
|
+
inner := node.AsBinaryExpression()
|
|
66
|
+
if inner == nil || inner.OperatorToken == nil ||
|
|
67
|
+
inner.OperatorToken.Kind != shimast.KindAmpersandAmpersandToken ||
|
|
68
|
+
inner.Right == nil {
|
|
69
|
+
return node
|
|
70
|
+
}
|
|
71
|
+
node = stripParens(inner.Right)
|
|
72
|
+
}
|
|
73
|
+
return node
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
// preferOptionalChainGuardText returns the textual identity of the
|
|
@@ -80,84 +80,84 @@ func preferOptionalChainRightmostConjunct(node *shimast.Node) *shimast.Node {
|
|
|
80
80
|
// comparison form, the returned text is the non-null side, which is
|
|
81
81
|
// what the right-hand access must start with.
|
|
82
82
|
func preferOptionalChainGuardText(ctx *Context, left *shimast.Node) (string, bool) {
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
83
|
+
left = stripParens(left)
|
|
84
|
+
if left == nil {
|
|
85
|
+
return "", false
|
|
86
|
+
}
|
|
87
|
+
switch left.Kind {
|
|
88
|
+
case shimast.KindIdentifier, shimast.KindPropertyAccessExpression:
|
|
89
|
+
text := nodeText(ctx.File, left)
|
|
90
|
+
return text, text != ""
|
|
91
|
+
case shimast.KindBinaryExpression:
|
|
92
|
+
inner := left.AsBinaryExpression()
|
|
93
|
+
if inner == nil || inner.OperatorToken == nil {
|
|
94
|
+
return "", false
|
|
95
|
+
}
|
|
96
|
+
// Chain extension: `(x && a.b) && a.b.c` — peel down to the
|
|
97
|
+
// rightmost conjunct (`a.b`) and use it as the guard against
|
|
98
|
+
// the outer right side.
|
|
99
|
+
if inner.OperatorToken.Kind == shimast.KindAmpersandAmpersandToken {
|
|
100
|
+
conjunct := preferOptionalChainRightmostConjunct(left)
|
|
101
|
+
if conjunct == nil {
|
|
102
|
+
return "", false
|
|
103
|
+
}
|
|
104
|
+
switch conjunct.Kind {
|
|
105
|
+
case shimast.KindIdentifier, shimast.KindPropertyAccessExpression:
|
|
106
|
+
text := nodeText(ctx.File, conjunct)
|
|
107
|
+
return text, text != ""
|
|
108
|
+
}
|
|
109
|
+
return "", false
|
|
110
|
+
}
|
|
111
|
+
if inner.OperatorToken.Kind != shimast.KindExclamationEqualsToken &&
|
|
112
|
+
inner.OperatorToken.Kind != shimast.KindExclamationEqualsEqualsToken {
|
|
113
|
+
return "", false
|
|
114
|
+
}
|
|
115
|
+
lhs := stripParens(inner.Left)
|
|
116
|
+
rhs := stripParens(inner.Right)
|
|
117
|
+
if subject, ok := preferOptionalChainNullishCompareSubject(ctx, lhs, rhs); ok {
|
|
118
|
+
return subject, true
|
|
119
|
+
}
|
|
120
|
+
if subject, ok := preferOptionalChainNullishCompareSubject(ctx, rhs, lhs); ok {
|
|
121
|
+
return subject, true
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return "", false
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
// preferOptionalChainNullishCompareSubject returns the textual identity
|
|
128
128
|
// of `subject` when `nullish` is `null` or `undefined` and `subject` is
|
|
129
129
|
// an identifier or property access. Returns the empty text otherwise.
|
|
130
130
|
func preferOptionalChainNullishCompareSubject(
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
ctx *Context,
|
|
132
|
+
subject, nullish *shimast.Node,
|
|
133
133
|
) (string, bool) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
134
|
+
if subject == nil || nullish == nil {
|
|
135
|
+
return "", false
|
|
136
|
+
}
|
|
137
|
+
if !preferOptionalChainIsNullOrUndefined(nullish) {
|
|
138
|
+
return "", false
|
|
139
|
+
}
|
|
140
|
+
switch subject.Kind {
|
|
141
|
+
case shimast.KindIdentifier, shimast.KindPropertyAccessExpression:
|
|
142
|
+
text := nodeText(ctx.File, subject)
|
|
143
|
+
return text, text != ""
|
|
144
|
+
}
|
|
145
|
+
return "", false
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
// preferOptionalChainIsNullOrUndefined reports whether node is the
|
|
149
149
|
// `null` keyword or the `undefined` identifier.
|
|
150
150
|
func preferOptionalChainIsNullOrUndefined(node *shimast.Node) bool {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
151
|
+
if node == nil {
|
|
152
|
+
return false
|
|
153
|
+
}
|
|
154
|
+
if node.Kind == shimast.KindNullKeyword {
|
|
155
|
+
return true
|
|
156
|
+
}
|
|
157
|
+
if node.Kind == shimast.KindIdentifier {
|
|
158
|
+
return identifierText(node) == "undefined"
|
|
159
|
+
}
|
|
160
|
+
return false
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
// preferOptionalChainRightMatches reports whether `right` is a
|
|
@@ -166,63 +166,63 @@ func preferOptionalChainIsNullOrUndefined(node *shimast.Node) bool {
|
|
|
166
166
|
// rejected — the `?.` rewrite would not preserve side-effect ordering
|
|
167
167
|
// when the arguments themselves can have side effects.
|
|
168
168
|
func preferOptionalChainRightMatches(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
169
|
+
ctx *Context,
|
|
170
|
+
right *shimast.Node,
|
|
171
|
+
guardText string,
|
|
172
172
|
) bool {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
173
|
+
if right == nil || guardText == "" {
|
|
174
|
+
return false
|
|
175
|
+
}
|
|
176
|
+
switch right.Kind {
|
|
177
|
+
case shimast.KindPropertyAccessExpression:
|
|
178
|
+
access := right.AsPropertyAccessExpression()
|
|
179
|
+
if access == nil || access.Expression == nil {
|
|
180
|
+
return false
|
|
181
|
+
}
|
|
182
|
+
return preferOptionalChainHasPrefix(ctx, right, guardText)
|
|
183
|
+
case shimast.KindCallExpression:
|
|
184
|
+
call := right.AsCallExpression()
|
|
185
|
+
if call == nil || call.Expression == nil {
|
|
186
|
+
return false
|
|
187
|
+
}
|
|
188
|
+
// Skip calls with arguments — their evaluation cannot be
|
|
189
|
+
// observed identically through `?.()`.
|
|
190
|
+
if call.Arguments != nil && len(call.Arguments.Nodes) > 0 {
|
|
191
|
+
return false
|
|
192
|
+
}
|
|
193
|
+
// The callee receiver must itself be a property access; a
|
|
194
|
+
// bare identifier call (`a()`) has no chain to fold.
|
|
195
|
+
callee := stripParens(call.Expression)
|
|
196
|
+
if callee == nil || callee.Kind != shimast.KindPropertyAccessExpression {
|
|
197
|
+
return false
|
|
198
|
+
}
|
|
199
|
+
return preferOptionalChainHasPrefix(ctx, right, guardText)
|
|
200
|
+
}
|
|
201
|
+
return false
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
// preferOptionalChainHasPrefix returns whether the textual form of
|
|
205
205
|
// `node` begins with `guard` followed by a `.` or `[` — the only
|
|
206
206
|
// continuations that mean "a property of the guarded value".
|
|
207
207
|
func preferOptionalChainHasPrefix(
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
208
|
+
ctx *Context,
|
|
209
|
+
node *shimast.Node,
|
|
210
|
+
guard string,
|
|
211
211
|
) bool {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
212
|
+
text := nodeText(ctx.File, node)
|
|
213
|
+
if !strings.HasPrefix(text, guard) {
|
|
214
|
+
return false
|
|
215
|
+
}
|
|
216
|
+
if len(text) == len(guard) {
|
|
217
|
+
return false
|
|
218
|
+
}
|
|
219
|
+
switch text[len(guard)] {
|
|
220
|
+
case '.', '[', '(':
|
|
221
|
+
return true
|
|
222
|
+
}
|
|
223
|
+
return false
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
func init() {
|
|
227
|
-
|
|
227
|
+
Register(preferOptionalChain{})
|
|
228
228
|
}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
package linthost
|
|
9
9
|
|
|
10
10
|
import (
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
12
|
+
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
// preferPromiseRejectErrors reports `Promise.reject(arg)`, `p.reject(arg)`
|
|
@@ -27,39 +27,39 @@ import (
|
|
|
27
27
|
type preferPromiseRejectErrors struct{}
|
|
28
28
|
|
|
29
29
|
func (preferPromiseRejectErrors) Name() string {
|
|
30
|
-
|
|
30
|
+
return "typescript/prefer-promise-reject-errors"
|
|
31
31
|
}
|
|
32
32
|
func (preferPromiseRejectErrors) NeedsTypeChecker() bool {
|
|
33
|
-
|
|
33
|
+
return true
|
|
34
34
|
}
|
|
35
35
|
func (preferPromiseRejectErrors) Visits() []shimast.Kind {
|
|
36
|
-
|
|
36
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
37
37
|
}
|
|
38
38
|
func (preferPromiseRejectErrors) Check(ctx *Context, node *shimast.Node) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
39
|
+
if ctx.Checker == nil {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
call := node.AsCallExpression()
|
|
43
|
+
if call == nil || call.Expression == nil {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
if !preferPromiseRejectErrorsIsRejectCall(ctx, call, node) {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) == 0 {
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
arg := stripParens(call.Arguments.Nodes[0])
|
|
53
|
+
if arg == nil {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
t := ctx.Checker.GetTypeAtLocation(arg)
|
|
57
|
+
if t == nil {
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
if preferPromiseRejectErrorsIsNonError(ctx.Checker, t) {
|
|
61
|
+
ctx.Report(node, "Reject promises with an Error object instead of a non-Error value.")
|
|
62
|
+
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
// preferPromiseRejectErrorsIsRejectCall returns true when `call` is one of
|
|
@@ -70,25 +70,25 @@ func (preferPromiseRejectErrors) Check(ctx *Context, node *shimast.Node) {
|
|
|
70
70
|
//
|
|
71
71
|
// `node` is the AST node form of `call`, used for the parent walk.
|
|
72
72
|
func preferPromiseRejectErrorsIsRejectCall(ctx *Context, call *shimast.CallExpression, node *shimast.Node) bool {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
73
|
+
receiver, method, ok := promisePropertyAccessParts(call.Expression)
|
|
74
|
+
if ok && method == "reject" {
|
|
75
|
+
if identifierText(receiver) == "Promise" {
|
|
76
|
+
return true
|
|
77
|
+
}
|
|
78
|
+
if ctx.Checker != nil && receiver != nil {
|
|
79
|
+
if t := ctx.Checker.GetTypeAtLocation(receiver); t != nil &&
|
|
80
|
+
isPromiseTypedExpression(ctx.Checker, t) {
|
|
81
|
+
return true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false
|
|
85
|
+
}
|
|
86
|
+
// Bare identifier call — check Promise executor binding.
|
|
87
|
+
name := callCalleeName(call)
|
|
88
|
+
if name == "" {
|
|
89
|
+
return false
|
|
90
|
+
}
|
|
91
|
+
return preferPromiseRejectErrorsIsExecutorReject(node, name)
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
// preferPromiseRejectErrorsIsExecutorReject walks parent function-like
|
|
@@ -97,19 +97,19 @@ func preferPromiseRejectErrorsIsRejectCall(ctx *Context, call *shimast.CallExpre
|
|
|
97
97
|
// parameter is named `name`. Mirrors the param walking used by
|
|
98
98
|
// `promiseNoMultipleResolved`.
|
|
99
99
|
func preferPromiseRejectErrorsIsExecutorReject(node *shimast.Node, name string) bool {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
100
|
+
for fn := nearestFunctionLike(node); fn != nil; fn = nearestFunctionLike(fn) {
|
|
101
|
+
if !preferPromiseRejectErrorsIsPromiseExecutorFn(fn) {
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
params := fn.Parameters()
|
|
105
|
+
if len(params) < 2 {
|
|
106
|
+
continue
|
|
107
|
+
}
|
|
108
|
+
if parameterIdentifierName(params[1]) == name {
|
|
109
|
+
return true
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return false
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
// preferPromiseRejectErrorsIsPromiseExecutorFn reports whether `fn` is
|
|
@@ -118,22 +118,22 @@ func preferPromiseRejectErrorsIsExecutorReject(node *shimast.Node, name string)
|
|
|
118
118
|
// does in rules_promise.go so `new Promise(((_, reject) => …))` still
|
|
119
119
|
// matches.
|
|
120
120
|
func preferPromiseRejectErrorsIsPromiseExecutorFn(fn *shimast.Node) bool {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
121
|
+
if fn == nil || !isFunctionLikeKind(fn) {
|
|
122
|
+
return false
|
|
123
|
+
}
|
|
124
|
+
cur := fn
|
|
125
|
+
for parent := cur.Parent; parent != nil && parent.Kind == shimast.KindParenthesizedExpression; parent = parent.Parent {
|
|
126
|
+
cur = parent
|
|
127
|
+
}
|
|
128
|
+
newExpr := cur.Parent
|
|
129
|
+
if newExpr == nil || newExpr.Kind != shimast.KindNewExpression {
|
|
130
|
+
return false
|
|
131
|
+
}
|
|
132
|
+
ne := newExpr.AsNewExpression()
|
|
133
|
+
if ne == nil || identifierText(ne.Expression) != "Promise" || ne.Arguments == nil || len(ne.Arguments.Nodes) == 0 {
|
|
134
|
+
return false
|
|
135
|
+
}
|
|
136
|
+
return stripParens(ne.Arguments.Nodes[0]) == fn
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
// preferPromiseRejectErrorsIsNonError mirrors `onlyThrowErrorIsPrimitive`
|
|
@@ -143,34 +143,34 @@ func preferPromiseRejectErrorsIsPromiseExecutorFn(fn *shimast.Node) bool {
|
|
|
143
143
|
// Union and intersection types recurse: a constituent that is primitive
|
|
144
144
|
// is enough to fire, matching the throw-side baseline.
|
|
145
145
|
func preferPromiseRejectErrorsIsNonError(checker *shimchecker.Checker, t *shimchecker.Type) bool {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
146
|
+
if checker == nil || t == nil {
|
|
147
|
+
return false
|
|
148
|
+
}
|
|
149
|
+
flags := t.Flags()
|
|
150
|
+
if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0 {
|
|
151
|
+
return false
|
|
152
|
+
}
|
|
153
|
+
if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
|
|
154
|
+
for _, part := range t.Types() {
|
|
155
|
+
if part == nil {
|
|
156
|
+
continue
|
|
157
|
+
}
|
|
158
|
+
if preferPromiseRejectErrorsIsNonError(checker, part) {
|
|
159
|
+
return true
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return false
|
|
163
|
+
}
|
|
164
|
+
const primitiveMask = shimchecker.TypeFlagsStringLike |
|
|
165
|
+
shimchecker.TypeFlagsNumberLike |
|
|
166
|
+
shimchecker.TypeFlagsBigIntLike |
|
|
167
|
+
shimchecker.TypeFlagsBooleanLike |
|
|
168
|
+
shimchecker.TypeFlagsVoid |
|
|
169
|
+
shimchecker.TypeFlagsUndefined |
|
|
170
|
+
shimchecker.TypeFlagsNull
|
|
171
|
+
return flags&primitiveMask != 0
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
func init() {
|
|
175
|
-
|
|
175
|
+
Register(preferPromiseRejectErrors{})
|
|
176
176
|
}
|