@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
|
@@ -24,43 +24,43 @@
|
|
|
24
24
|
package linthost
|
|
25
25
|
|
|
26
26
|
import (
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
28
|
+
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
29
29
|
)
|
|
30
30
|
|
|
31
31
|
type noUnsafeEnumComparison struct{}
|
|
32
32
|
|
|
33
33
|
func (noUnsafeEnumComparison) Name() string { return "typescript/no-unsafe-enum-comparison" }
|
|
34
34
|
func (noUnsafeEnumComparison) NeedsTypeChecker() bool {
|
|
35
|
-
|
|
35
|
+
return true
|
|
36
36
|
}
|
|
37
37
|
func (noUnsafeEnumComparison) Visits() []shimast.Kind {
|
|
38
|
-
|
|
38
|
+
return []shimast.Kind{shimast.KindBinaryExpression}
|
|
39
39
|
}
|
|
40
40
|
func (noUnsafeEnumComparison) Check(ctx *Context, node *shimast.Node) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
41
|
+
if ctx.Checker == nil {
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
bin := node.AsBinaryExpression()
|
|
45
|
+
if bin == nil || bin.OperatorToken == nil || bin.Left == nil || bin.Right == nil {
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
switch bin.OperatorToken.Kind {
|
|
49
|
+
case shimast.KindEqualsEqualsToken,
|
|
50
|
+
shimast.KindEqualsEqualsEqualsToken,
|
|
51
|
+
shimast.KindExclamationEqualsToken,
|
|
52
|
+
shimast.KindExclamationEqualsEqualsToken:
|
|
53
|
+
default:
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
left := ctx.Checker.GetTypeAtLocation(bin.Left)
|
|
57
|
+
right := ctx.Checker.GetTypeAtLocation(bin.Right)
|
|
58
|
+
if left == nil || right == nil {
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
if noUnsafeEnumComparisonMismatch(left, right) || noUnsafeEnumComparisonMismatch(right, left) {
|
|
62
|
+
ctx.Report(node, "Unsafe comparison between an enum-typed value and a plain primitive of the same widened type. Compare against one of the enum's own members so a typo surfaces at compile time.")
|
|
63
|
+
}
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
// noUnsafeEnumComparisonMismatch reports whether `enumSide` carries an
|
|
@@ -69,29 +69,29 @@ func (noUnsafeEnumComparison) Check(ctx *Context, node *shimast.Node) {
|
|
|
69
69
|
// still counts as the enum side, and the comparison `color === "red"`
|
|
70
70
|
// is still unsafe even when `color` carries an extra nullish branch.
|
|
71
71
|
func noUnsafeEnumComparisonMismatch(enumSide, otherSide *shimchecker.Type) bool {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
72
|
+
if !noUnsafeEnumComparisonHasEnum(enumSide) {
|
|
73
|
+
return false
|
|
74
|
+
}
|
|
75
|
+
// `any` / `unknown` / `never` on the other side silently propagate
|
|
76
|
+
// from generic helpers — flagging them would explode false positives
|
|
77
|
+
// the same way `restrict-template-expressions` mitigates with its
|
|
78
|
+
// `allowAny` default.
|
|
79
|
+
if noUnsafeEnumComparisonIsLoose(otherSide) {
|
|
80
|
+
return false
|
|
81
|
+
}
|
|
82
|
+
// If the other side is provably the same enum (or one of its
|
|
83
|
+
// members), the comparison is the safe shape the rule recommends.
|
|
84
|
+
if noUnsafeEnumComparisonSharesEnum(enumSide, otherSide) {
|
|
85
|
+
return false
|
|
86
|
+
}
|
|
87
|
+
// The mismatch only fires when the non-enum side is the widened
|
|
88
|
+
// primitive that the enum widens to. A `Color === Status.Active`
|
|
89
|
+
// comparison (two unrelated enums of the same widened number) also
|
|
90
|
+
// trips this branch via the other call ordering.
|
|
91
|
+
if !noUnsafeEnumComparisonIsBareLiteralLike(otherSide) && !noUnsafeEnumComparisonHasEnum(otherSide) {
|
|
92
|
+
return false
|
|
93
|
+
}
|
|
94
|
+
return true
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
// noUnsafeEnumComparisonHasEnum reports whether t (or any constituent of
|
|
@@ -99,21 +99,21 @@ func noUnsafeEnumComparisonMismatch(enumSide, otherSide *shimchecker.Type) bool
|
|
|
99
99
|
// the enum union type produced by `enum E { ... }` and the canonical
|
|
100
100
|
// `TypeFlagsEnumLiteral`-tagged literal types for each member.
|
|
101
101
|
func noUnsafeEnumComparisonHasEnum(t *shimchecker.Type) bool {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
102
|
+
if t == nil {
|
|
103
|
+
return false
|
|
104
|
+
}
|
|
105
|
+
flags := t.Flags()
|
|
106
|
+
if flags&shimchecker.TypeFlagsEnumLike != 0 {
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
|
|
110
|
+
for _, part := range t.Types() {
|
|
111
|
+
if noUnsafeEnumComparisonHasEnum(part) {
|
|
112
|
+
return true
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return false
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
// noUnsafeEnumComparisonIsLoose reports whether t propagates from a
|
|
@@ -121,10 +121,10 @@ func noUnsafeEnumComparisonHasEnum(t *shimchecker.Type) bool {
|
|
|
121
121
|
// `never`. The upstream rule keeps these silent so type-erasure paths
|
|
122
122
|
// (`JSON.parse`, untyped APIs) don't light up everywhere.
|
|
123
123
|
func noUnsafeEnumComparisonIsLoose(t *shimchecker.Type) bool {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
if t == nil {
|
|
125
|
+
return true
|
|
126
|
+
}
|
|
127
|
+
return t.Flags()&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
// noUnsafeEnumComparisonSharesEnum reports whether both sides refer to
|
|
@@ -134,12 +134,12 @@ func noUnsafeEnumComparisonIsLoose(t *shimchecker.Type) bool {
|
|
|
134
134
|
// — comparing those addresses tells us whether `Color.Red` and
|
|
135
135
|
// `Color.Blue` come from the same enum.
|
|
136
136
|
func noUnsafeEnumComparisonSharesEnum(a, b *shimchecker.Type) bool {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
aDecl := noUnsafeEnumComparisonEnumDeclaration(a)
|
|
138
|
+
bDecl := noUnsafeEnumComparisonEnumDeclaration(b)
|
|
139
|
+
if aDecl == nil || bDecl == nil {
|
|
140
|
+
return false
|
|
141
|
+
}
|
|
142
|
+
return aDecl == bDecl
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
// noUnsafeEnumComparisonEnumDeclaration returns the EnumDeclaration
|
|
@@ -148,48 +148,48 @@ func noUnsafeEnumComparisonSharesEnum(a, b *shimchecker.Type) bool {
|
|
|
148
148
|
// enum-literal member carry the enum's symbol via Type.Symbol; the
|
|
149
149
|
// symbol's parent declaration is the EnumDeclaration we identify by.
|
|
150
150
|
func noUnsafeEnumComparisonEnumDeclaration(t *shimchecker.Type) *shimast.Node {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
151
|
+
if t == nil {
|
|
152
|
+
return nil
|
|
153
|
+
}
|
|
154
|
+
flags := t.Flags()
|
|
155
|
+
if flags&shimchecker.TypeFlagsEnumLike != 0 {
|
|
156
|
+
sym := t.Symbol()
|
|
157
|
+
if sym == nil {
|
|
158
|
+
return nil
|
|
159
|
+
}
|
|
160
|
+
for _, decl := range sym.Declarations {
|
|
161
|
+
if decl == nil {
|
|
162
|
+
continue
|
|
163
|
+
}
|
|
164
|
+
if decl.Kind == shimast.KindEnumDeclaration {
|
|
165
|
+
return decl
|
|
166
|
+
}
|
|
167
|
+
// Enum member literal types carry the member symbol; walk
|
|
168
|
+
// one level up to land on the surrounding EnumDeclaration.
|
|
169
|
+
if decl.Parent != nil && decl.Parent.Kind == shimast.KindEnumDeclaration {
|
|
170
|
+
return decl.Parent
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return nil
|
|
174
|
+
}
|
|
175
|
+
if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
|
|
176
|
+
var seen *shimast.Node
|
|
177
|
+
for _, part := range t.Types() {
|
|
178
|
+
decl := noUnsafeEnumComparisonEnumDeclaration(part)
|
|
179
|
+
if decl == nil {
|
|
180
|
+
continue
|
|
181
|
+
}
|
|
182
|
+
if seen == nil {
|
|
183
|
+
seen = decl
|
|
184
|
+
continue
|
|
185
|
+
}
|
|
186
|
+
if seen != decl {
|
|
187
|
+
return nil
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return seen
|
|
191
|
+
}
|
|
192
|
+
return nil
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
// noUnsafeEnumComparisonIsBareLiteralLike reports whether t is a plain
|
|
@@ -199,37 +199,37 @@ func noUnsafeEnumComparisonEnumDeclaration(t *shimchecker.Type) *shimast.Node {
|
|
|
199
199
|
// share an enum's primitive widening — `color === null` is a real
|
|
200
200
|
// nullability check, not a same-primitive mistake.
|
|
201
201
|
func noUnsafeEnumComparisonIsBareLiteralLike(t *shimchecker.Type) bool {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
202
|
+
if t == nil {
|
|
203
|
+
return false
|
|
204
|
+
}
|
|
205
|
+
flags := t.Flags()
|
|
206
|
+
if flags&shimchecker.TypeFlagsEnumLike != 0 {
|
|
207
|
+
return false
|
|
208
|
+
}
|
|
209
|
+
const primitiveMask = shimchecker.TypeFlagsStringLike |
|
|
210
|
+
shimchecker.TypeFlagsNumberLike |
|
|
211
|
+
shimchecker.TypeFlagsBigIntLike
|
|
212
|
+
if flags&primitiveMask != 0 {
|
|
213
|
+
return true
|
|
214
|
+
}
|
|
215
|
+
if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
|
|
216
|
+
anyMatch := false
|
|
217
|
+
for _, part := range t.Types() {
|
|
218
|
+
if part == nil {
|
|
219
|
+
continue
|
|
220
|
+
}
|
|
221
|
+
if noUnsafeEnumComparisonHasEnum(part) {
|
|
222
|
+
return false
|
|
223
|
+
}
|
|
224
|
+
if noUnsafeEnumComparisonIsBareLiteralLike(part) {
|
|
225
|
+
anyMatch = true
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return anyMatch
|
|
229
|
+
}
|
|
230
|
+
return false
|
|
231
231
|
}
|
|
232
232
|
|
|
233
233
|
func init() {
|
|
234
|
-
|
|
234
|
+
Register(noUnsafeEnumComparison{})
|
|
235
235
|
}
|
|
@@ -13,46 +13,46 @@
|
|
|
13
13
|
package linthost
|
|
14
14
|
|
|
15
15
|
import (
|
|
16
|
-
|
|
16
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
17
|
)
|
|
18
18
|
|
|
19
19
|
type noUnsafeMemberAccess struct{}
|
|
20
20
|
|
|
21
21
|
func (noUnsafeMemberAccess) Name() string { return "typescript/no-unsafe-member-access" }
|
|
22
22
|
func (noUnsafeMemberAccess) NeedsTypeChecker() bool {
|
|
23
|
-
|
|
23
|
+
return true
|
|
24
24
|
}
|
|
25
25
|
func (noUnsafeMemberAccess) Visits() []shimast.Kind {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
return []shimast.Kind{
|
|
27
|
+
shimast.KindPropertyAccessExpression,
|
|
28
|
+
shimast.KindElementAccessExpression,
|
|
29
|
+
}
|
|
30
30
|
}
|
|
31
31
|
func (noUnsafeMemberAccess) Check(ctx *Context, node *shimast.Node) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
32
|
+
if ctx.Checker == nil {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
var receiver *shimast.Node
|
|
36
|
+
switch node.Kind {
|
|
37
|
+
case shimast.KindPropertyAccessExpression:
|
|
38
|
+
if access := node.AsPropertyAccessExpression(); access != nil {
|
|
39
|
+
receiver = access.Expression
|
|
40
|
+
}
|
|
41
|
+
case shimast.KindElementAccessExpression:
|
|
42
|
+
if access := node.AsElementAccessExpression(); access != nil {
|
|
43
|
+
receiver = access.Expression
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if receiver == nil {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
t := ctx.Checker.GetTypeAtLocation(receiver)
|
|
50
|
+
if !typeIsUnsafeAny(t) {
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
ctx.Report(node, "Unsafe member access on a value typed as `any`. Narrow the receiver to a concrete type before reading a property.")
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
func init() {
|
|
57
|
-
|
|
57
|
+
Register(noUnsafeMemberAccess{})
|
|
58
58
|
}
|
|
@@ -22,50 +22,50 @@
|
|
|
22
22
|
package linthost
|
|
23
23
|
|
|
24
24
|
import (
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
26
|
+
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
27
27
|
)
|
|
28
28
|
|
|
29
29
|
type noUnsafeReturn struct{}
|
|
30
30
|
|
|
31
31
|
func (noUnsafeReturn) Name() string { return "typescript/no-unsafe-return" }
|
|
32
32
|
func (noUnsafeReturn) NeedsTypeChecker() bool {
|
|
33
|
-
|
|
33
|
+
return true
|
|
34
34
|
}
|
|
35
35
|
func (noUnsafeReturn) Visits() []shimast.Kind {
|
|
36
|
-
|
|
36
|
+
return []shimast.Kind{shimast.KindReturnStatement}
|
|
37
37
|
}
|
|
38
38
|
func (noUnsafeReturn) 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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
39
|
+
if ctx.Checker == nil {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
ret := node.AsReturnStatement()
|
|
43
|
+
if ret == nil || ret.Expression == nil {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
fn := noUnsafeReturnEnclosingFunction(node)
|
|
47
|
+
if fn == nil {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
sig := ctx.Checker.GetSignatureFromDeclaration(fn)
|
|
51
|
+
if sig == nil {
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
declared := ctx.Checker.GetReturnTypeOfSignature(sig)
|
|
55
|
+
if declared == nil {
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
if !noUnsafeReturnIsConcrete(declared) {
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
exprType := ctx.Checker.GetTypeAtLocation(ret.Expression)
|
|
62
|
+
if exprType == nil {
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
if !noUnsafeReturnIsAny(exprType) {
|
|
66
|
+
return
|
|
67
|
+
}
|
|
68
|
+
ctx.Report(ret.Expression, "Unsafe return of `any` value from function with a concrete declared return type. The `any` leaks past the type boundary and disables downstream type checks.")
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
// noUnsafeReturnEnclosingFunction walks up the parent chain to the
|
|
@@ -74,12 +74,12 @@ func (noUnsafeReturn) Check(ctx *Context, node *shimast.Node) {
|
|
|
74
74
|
// first function-like ancestor — mirroring the `consistent-return`
|
|
75
75
|
// scope rule already established in this package.
|
|
76
76
|
func noUnsafeReturnEnclosingFunction(node *shimast.Node) *shimast.Node {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
for cur := node.Parent; cur != nil; cur = cur.Parent {
|
|
78
|
+
if isFunctionLikeKind(cur) {
|
|
79
|
+
return cur
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return nil
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
// noUnsafeReturnIsConcrete reports whether the declared return type is
|
|
@@ -89,25 +89,25 @@ func noUnsafeReturnEnclosingFunction(node *shimast.Node) *shimast.Node {
|
|
|
89
89
|
// `unknown` and side-effect functions that return `void` do not light
|
|
90
90
|
// up everywhere. Unions are concrete only when every constituent is.
|
|
91
91
|
func noUnsafeReturnIsConcrete(t *shimchecker.Type) bool {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
92
|
+
if t == nil {
|
|
93
|
+
return false
|
|
94
|
+
}
|
|
95
|
+
flags := t.Flags()
|
|
96
|
+
if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsVoid) != 0 {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
|
|
100
|
+
for _, part := range t.Types() {
|
|
101
|
+
if part == nil {
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
if !noUnsafeReturnIsConcrete(part) {
|
|
105
|
+
return false
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return true
|
|
109
|
+
}
|
|
110
|
+
return true
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
// noUnsafeReturnIsAny reports whether t is the raw `any` type. The
|
|
@@ -115,12 +115,12 @@ func noUnsafeReturnIsConcrete(t *shimchecker.Type) bool {
|
|
|
115
115
|
// returned as `unknown` cannot be used without further narrowing, so
|
|
116
116
|
// they don't leak silently — and only flags the lossy `any` case.
|
|
117
117
|
func noUnsafeReturnIsAny(t *shimchecker.Type) bool {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
if t == nil {
|
|
119
|
+
return false
|
|
120
|
+
}
|
|
121
|
+
return t.Flags()&shimchecker.TypeFlagsAny != 0
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
func init() {
|
|
125
|
-
|
|
125
|
+
Register(noUnsafeReturn{})
|
|
126
126
|
}
|