@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
|
@@ -28,65 +28,65 @@
|
|
|
28
28
|
package linthost
|
|
29
29
|
|
|
30
30
|
import (
|
|
31
|
-
|
|
31
|
+
"strings"
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
type noDeprecated struct{}
|
|
37
37
|
|
|
38
38
|
func (noDeprecated) Name() string { return "typescript/no-deprecated" }
|
|
39
39
|
func (noDeprecated) NeedsTypeChecker() bool {
|
|
40
|
-
|
|
40
|
+
return true
|
|
41
41
|
}
|
|
42
42
|
func (noDeprecated) Visits() []shimast.Kind {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
return []shimast.Kind{
|
|
44
|
+
shimast.KindIdentifier,
|
|
45
|
+
shimast.KindPropertyAccessExpression,
|
|
46
|
+
shimast.KindCallExpression,
|
|
47
|
+
shimast.KindNewExpression,
|
|
48
|
+
shimast.KindJsxOpeningElement,
|
|
49
|
+
shimast.KindJsxSelfClosingElement,
|
|
50
|
+
}
|
|
51
51
|
}
|
|
52
52
|
func (noDeprecated) Check(ctx *Context, node *shimast.Node) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
53
|
+
if ctx.Checker == nil {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
// All non-identifier kinds delegate to the identifier walk for
|
|
57
|
+
// reporting — they're listed in Visits() to keep the contract
|
|
58
|
+
// explicit about which structural shapes carry symbol references,
|
|
59
|
+
// but the actual diagnostic is emitted once per identifier so a
|
|
60
|
+
// chain like `obj.method()` reports the `method` identifier, not
|
|
61
|
+
// the surrounding PropertyAccess and CallExpression as well.
|
|
62
|
+
if node.Kind != shimast.KindIdentifier {
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
if noDeprecatedSkipIdentifier(node) {
|
|
66
|
+
return
|
|
67
|
+
}
|
|
68
|
+
symbol := ctx.Checker.GetSymbolAtLocation(node)
|
|
69
|
+
if symbol == nil {
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
tag := findDeprecatedJSDocTag(symbol)
|
|
73
|
+
if tag == nil {
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
// Don't report when this identifier IS the name of one of the
|
|
77
|
+
// symbol's declarations — that's the deprecation marker itself.
|
|
78
|
+
if noDeprecatedLocationIsDeclarationName(node, symbol) {
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
name := identifierText(node)
|
|
82
|
+
if name == "" {
|
|
83
|
+
name = symbol.Name
|
|
84
|
+
}
|
|
85
|
+
message := "`" + name + "` is deprecated."
|
|
86
|
+
if comment := jsdocDeprecatedComment(tag); comment != "" {
|
|
87
|
+
message = message + " " + comment
|
|
88
|
+
}
|
|
89
|
+
ctx.Report(node, message)
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
// noDeprecatedSkipIdentifier reports whether an identifier visit
|
|
@@ -100,35 +100,35 @@ func (noDeprecated) Check(ctx *Context, node *shimast.Node) {
|
|
|
100
100
|
// `noDeprecatedLocationIsDeclarationName` — which handles every
|
|
101
101
|
// declaration kind without enumerating each one here.
|
|
102
102
|
func noDeprecatedSkipIdentifier(node *shimast.Node) bool {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
103
|
+
parent := node.Parent
|
|
104
|
+
if parent == nil {
|
|
105
|
+
return false
|
|
106
|
+
}
|
|
107
|
+
if parent.Kind == shimast.KindQualifiedName {
|
|
108
|
+
qn := parent.AsQualifiedName()
|
|
109
|
+
if qn != nil && qn.Left == node {
|
|
110
|
+
return true
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return false
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
// noDeprecatedLocationIsDeclarationName reports whether `loc` is the
|
|
117
117
|
// name node of one of `symbol`'s declarations — i.e. the deprecation
|
|
118
118
|
// marker itself rather than a reference site.
|
|
119
119
|
func noDeprecatedLocationIsDeclarationName(loc *shimast.Node, symbol *shimast.Symbol) bool {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
120
|
+
if loc == nil || symbol == nil {
|
|
121
|
+
return false
|
|
122
|
+
}
|
|
123
|
+
for _, decl := range symbol.Declarations {
|
|
124
|
+
if decl == nil {
|
|
125
|
+
continue
|
|
126
|
+
}
|
|
127
|
+
if decl.Name() == loc {
|
|
128
|
+
return true
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return false
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
// findDeprecatedJSDocTag walks the symbol's declarations for a
|
|
@@ -138,58 +138,58 @@ func noDeprecatedLocationIsDeclarationName(loc *shimast.Node, symbol *shimast.Sy
|
|
|
138
138
|
// VariableStatement, and JSDoc on an ExportSpecifier may be on the
|
|
139
139
|
// outer ExportDeclaration.
|
|
140
140
|
func findDeprecatedJSDocTag(symbol *shimast.Symbol) *shimast.Node {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
141
|
+
if symbol == nil {
|
|
142
|
+
return nil
|
|
143
|
+
}
|
|
144
|
+
for _, decl := range symbol.Declarations {
|
|
145
|
+
if tag := deprecatedJSDocTagOnNodeOrAncestors(decl); tag != nil {
|
|
146
|
+
return tag
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return nil
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
// deprecatedJSDocTagOnNodeOrAncestors walks up from `node` looking for
|
|
153
153
|
// a `@deprecated` JSDoc tag attached to any ancestor. Returns the
|
|
154
154
|
// first matching tag, or nil.
|
|
155
155
|
func deprecatedJSDocTagOnNodeOrAncestors(node *shimast.Node) *shimast.Node {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
156
|
+
for n := node; n != nil; n = n.Parent {
|
|
157
|
+
for _, jsdoc := range n.JSDoc(nil) {
|
|
158
|
+
data := jsdoc.AsJSDoc()
|
|
159
|
+
if data == nil || data.Tags == nil {
|
|
160
|
+
continue
|
|
161
|
+
}
|
|
162
|
+
for _, tag := range data.Tags.Nodes {
|
|
163
|
+
if tag.Kind == shimast.KindJSDocDeprecatedTag {
|
|
164
|
+
return tag
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if n.Kind == shimast.KindSourceFile {
|
|
169
|
+
return nil
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return nil
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
// jsdocDeprecatedComment returns the textual comment that follows the
|
|
176
176
|
// `@deprecated` token in `tag`'s source range, trimmed of surrounding
|
|
177
177
|
// whitespace. Empty when the tag has no comment.
|
|
178
178
|
func jsdocDeprecatedComment(tag *shimast.Node) string {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
179
|
+
if tag == nil {
|
|
180
|
+
return ""
|
|
181
|
+
}
|
|
182
|
+
src := strings.TrimSpace(shimast.NodeText(tag))
|
|
183
|
+
if src == "" {
|
|
184
|
+
return ""
|
|
185
|
+
}
|
|
186
|
+
const prefix = "@deprecated"
|
|
187
|
+
if strings.HasPrefix(src, prefix) {
|
|
188
|
+
src = src[len(prefix):]
|
|
189
|
+
}
|
|
190
|
+
return strings.TrimSpace(src)
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
func init() {
|
|
194
|
-
|
|
194
|
+
Register(noDeprecated{})
|
|
195
195
|
}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
package linthost
|
|
8
8
|
|
|
9
9
|
import (
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
11
|
+
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
// noForInArray fires on `for (... in <expr>)` when the Checker reports that
|
|
@@ -21,27 +21,27 @@ type noForInArray struct{}
|
|
|
21
21
|
|
|
22
22
|
func (noForInArray) Name() string { return "typescript/no-for-in-array" }
|
|
23
23
|
func (noForInArray) NeedsTypeChecker() bool {
|
|
24
|
-
|
|
24
|
+
return true
|
|
25
25
|
}
|
|
26
26
|
func (noForInArray) Visits() []shimast.Kind {
|
|
27
|
-
|
|
27
|
+
return []shimast.Kind{shimast.KindForInStatement}
|
|
28
28
|
}
|
|
29
29
|
func (noForInArray) Check(ctx *Context, node *shimast.Node) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
30
|
+
if ctx.Checker == nil {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
stmt := node.AsForInOrOfStatement()
|
|
34
|
+
if stmt == nil || stmt.Expression == nil {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
t := ctx.Checker.GetTypeAtLocation(stmt.Expression)
|
|
38
|
+
if t == nil {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
if !noForInArrayIsArrayLike(ctx.Checker, t) {
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
ctx.Report(node, "Iterating an array with `for...in` yields enumerable property names (as strings), including inherited members. Use `for...of`, `forEach`, or an indexed `for` loop instead.")
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// noForInArrayIsArrayLike reports whether t is provably an array or tuple.
|
|
@@ -52,33 +52,33 @@ func (noForInArray) Check(ctx *Context, node *shimast.Node) {
|
|
|
52
52
|
// the false-positive volume on otherwise legitimate `for...in` over a
|
|
53
53
|
// genuinely-keyed object.
|
|
54
54
|
func noForInArrayIsArrayLike(checker *shimchecker.Checker, t *shimchecker.Type) bool {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
55
|
+
if checker == nil || t == nil {
|
|
56
|
+
return false
|
|
57
|
+
}
|
|
58
|
+
flags := t.Flags()
|
|
59
|
+
if flags&(shimchecker.TypeFlagsAny|shimchecker.TypeFlagsUnknown|shimchecker.TypeFlagsNever) != 0 {
|
|
60
|
+
return false
|
|
61
|
+
}
|
|
62
|
+
if flags&(shimchecker.TypeFlagsUnion|shimchecker.TypeFlagsIntersection) != 0 {
|
|
63
|
+
for _, part := range t.Types() {
|
|
64
|
+
if part == nil {
|
|
65
|
+
continue
|
|
66
|
+
}
|
|
67
|
+
if !noForInArrayIsArrayLike(checker, part) {
|
|
68
|
+
return false
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true
|
|
72
|
+
}
|
|
73
|
+
if shimchecker.Checker_isArrayType(checker, t) {
|
|
74
|
+
return true
|
|
75
|
+
}
|
|
76
|
+
if shimchecker.IsTupleType(t) {
|
|
77
|
+
return true
|
|
78
|
+
}
|
|
79
|
+
return false
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
func init() {
|
|
83
|
-
|
|
83
|
+
Register(noForInArray{})
|
|
84
84
|
}
|
|
@@ -22,48 +22,48 @@
|
|
|
22
22
|
package linthost
|
|
23
23
|
|
|
24
24
|
import (
|
|
25
|
-
|
|
25
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
type tsNoMagicNumbers struct{}
|
|
29
29
|
|
|
30
30
|
func (tsNoMagicNumbers) Name() string { return "typescript/no-magic-numbers" }
|
|
31
31
|
func (tsNoMagicNumbers) Visits() []shimast.Kind {
|
|
32
|
-
|
|
32
|
+
return []shimast.Kind{shimast.KindNumericLiteral}
|
|
33
33
|
}
|
|
34
34
|
func (tsNoMagicNumbers) Check(ctx *Context, node *shimast.Node) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
35
|
+
if node == nil {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
// Identify the surface node that represents the numeric value:
|
|
39
|
+
// either the literal itself or the wrapping `+lit` / `-lit` unary.
|
|
40
|
+
surface := node
|
|
41
|
+
if parent := node.Parent; parent != nil && parent.Kind == shimast.KindPrefixUnaryExpression {
|
|
42
|
+
prefix := parent.AsPrefixUnaryExpression()
|
|
43
|
+
if prefix != nil && (prefix.Operator == shimast.KindMinusToken || prefix.Operator == shimast.KindPlusToken) && prefix.Operand == node {
|
|
44
|
+
surface = parent
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Skip when the literal lives inside a type position. A literal type
|
|
48
|
+
// (`type N = 5`, `Array<10>`) is not a runtime constant — the
|
|
49
|
+
// rule's concern is unexplained runtime values.
|
|
50
|
+
if isInsideTypePosition(surface) {
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
// TS extension: enum member initializers are themselves the named
|
|
54
|
+
// constant the rule is asking for. `enum S { OK = 200 }` lifts the
|
|
55
|
+
// value into `S.OK`; flagging the `200` would push authors to
|
|
56
|
+
// double-wrap an already-named constant.
|
|
57
|
+
if isEnumMemberInitializer(surface) {
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
// Whitelisted unit values: -1 / 0 / 1 carry intrinsic meaning (not
|
|
61
|
+
// found, identity, step) in almost every codebase. Treating them as
|
|
62
|
+
// magic produces only noise.
|
|
63
|
+
if isWellKnownUnitNumber(ctx.File, surface) {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
ctx.Report(surface, "No magic number: extract into a named constant or enum member.")
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
// isEnumMemberInitializer reports whether surface is the initializer
|
|
@@ -71,12 +71,12 @@ func (tsNoMagicNumbers) Check(ctx *Context, node *shimast.Node) {
|
|
|
71
71
|
// itself (or its unary wrapper) is the EnumMember.Initializer in that
|
|
72
72
|
// case, which is exactly the position the TS extension whitelists.
|
|
73
73
|
func isEnumMemberInitializer(surface *shimast.Node) bool {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
parent := surface.Parent
|
|
75
|
+
if parent == nil || parent.Kind != shimast.KindEnumMember {
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
member := parent.AsEnumMember()
|
|
79
|
+
return member != nil && member.Initializer == surface
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
// isInsideTypePosition reports whether `surface` is reached only
|
|
@@ -84,26 +84,26 @@ func isEnumMemberInitializer(surface *shimast.Node) bool {
|
|
|
84
84
|
// Literal types, type arguments, and type aliases are type positions;
|
|
85
85
|
// the rule has nothing to say about literals that never reach runtime.
|
|
86
86
|
func isInsideTypePosition(surface *shimast.Node) bool {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
87
|
+
for p := surface.Parent; p != nil; p = p.Parent {
|
|
88
|
+
switch p.Kind {
|
|
89
|
+
case shimast.KindLiteralType,
|
|
90
|
+
shimast.KindTypeReference,
|
|
91
|
+
shimast.KindTypeAliasDeclaration,
|
|
92
|
+
shimast.KindUnionType,
|
|
93
|
+
shimast.KindIntersectionType,
|
|
94
|
+
shimast.KindTypeOperator,
|
|
95
|
+
shimast.KindIndexedAccessType,
|
|
96
|
+
shimast.KindMappedType,
|
|
97
|
+
shimast.KindConditionalType,
|
|
98
|
+
shimast.KindTypeParameter:
|
|
99
|
+
return true
|
|
100
|
+
case shimast.KindPrefixUnaryExpression,
|
|
101
|
+
shimast.KindParenthesizedExpression:
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
106
|
+
return false
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
// isWellKnownUnitNumber reports whether `surface` is the literal `0`,
|
|
@@ -111,14 +111,14 @@ func isInsideTypePosition(surface *shimast.Node) bool {
|
|
|
111
111
|
// vs `0` and `1e0` vs `1` consistent with what the author actually
|
|
112
112
|
// wrote — only the bare textual form is whitelisted.
|
|
113
113
|
func isWellKnownUnitNumber(file *shimast.SourceFile, surface *shimast.Node) bool {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
114
|
+
text := nodeText(file, surface)
|
|
115
|
+
switch text {
|
|
116
|
+
case "0", "1", "-1":
|
|
117
|
+
return true
|
|
118
|
+
}
|
|
119
|
+
return false
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
func init() {
|
|
123
|
-
|
|
123
|
+
Register(tsNoMagicNumbers{})
|
|
124
124
|
}
|
|
@@ -16,39 +16,39 @@
|
|
|
16
16
|
package linthost
|
|
17
17
|
|
|
18
18
|
import (
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
20
|
+
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
21
21
|
)
|
|
22
22
|
|
|
23
23
|
type noMeaninglessVoidOperator struct{}
|
|
24
24
|
|
|
25
25
|
func (noMeaninglessVoidOperator) Name() string {
|
|
26
|
-
|
|
26
|
+
return "typescript/no-meaningless-void-operator"
|
|
27
27
|
}
|
|
28
28
|
func (noMeaninglessVoidOperator) NeedsTypeChecker() bool { return true }
|
|
29
29
|
func (noMeaninglessVoidOperator) Visits() []shimast.Kind {
|
|
30
|
-
|
|
30
|
+
return []shimast.Kind{shimast.KindVoidExpression}
|
|
31
31
|
}
|
|
32
32
|
func (noMeaninglessVoidOperator) Check(ctx *Context, node *shimast.Node) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
33
|
+
if ctx.Checker == nil {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
expr := node.AsVoidExpression()
|
|
37
|
+
if expr == nil || expr.Expression == nil {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
operand := stripParens(expr.Expression)
|
|
41
|
+
if operand == nil {
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
t := ctx.Checker.GetTypeAtLocation(operand)
|
|
45
|
+
if t == nil {
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
if !isVoidOnlyType(t) {
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
ctx.Report(node, "The `void` operator on a value already typed `void` adds nothing — drop the operator.")
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
// isVoidOnlyType reports whether t is the bare `void` type or a union
|
|
@@ -57,28 +57,28 @@ func (noMeaninglessVoidOperator) Check(ctx *Context, node *shimast.Node) {
|
|
|
57
57
|
// number` operand still needs the operator to discard the runtime
|
|
58
58
|
// value, so it is left alone.
|
|
59
59
|
func isVoidOnlyType(t *shimchecker.Type) bool {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
60
|
+
if t == nil {
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
flags := t.Flags()
|
|
64
|
+
if flags&shimchecker.TypeFlagsVoid != 0 {
|
|
65
|
+
return true
|
|
66
|
+
}
|
|
67
|
+
if flags&shimchecker.TypeFlagsUnion != 0 {
|
|
68
|
+
parts := t.Types()
|
|
69
|
+
if len(parts) == 0 {
|
|
70
|
+
return false
|
|
71
|
+
}
|
|
72
|
+
for _, part := range parts {
|
|
73
|
+
if !isVoidOnlyType(part) {
|
|
74
|
+
return false
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return true
|
|
78
|
+
}
|
|
79
|
+
return false
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
func init() {
|
|
83
|
-
|
|
83
|
+
Register(noMeaninglessVoidOperator{})
|
|
84
84
|
}
|