@ttsc/lint 0.13.1 → 0.14.0-dev.20250530.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +955 -85
- package/lib/defaultFormat.d.ts +15 -8
- package/lib/defaultFormat.js +15 -8
- package/lib/defaultFormat.js.map +1 -1
- package/lib/index.d.ts +46 -0
- package/lib/index.js +35 -10
- package/lib/index.js.map +1 -1
- package/lib/structures/ITtscLintConfig.d.ts +12 -6
- package/lib/structures/TtscLintRuleSetting.d.ts +49 -0
- package/lib/structures/{TtscLintRuleOptions.js → TtscLintRuleSetting.js} +1 -1
- package/lib/structures/TtscLintRuleSetting.js.map +1 -0
- package/lib/structures/format/ITtscLintFormat.d.ts +128 -0
- package/lib/structures/{TtscLintRuleMap.js → format/ITtscLintFormat.js} +1 -1
- package/lib/structures/format/ITtscLintFormat.js.map +1 -0
- package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +17 -0
- package/lib/structures/{ITtscLintFormatConfig.js → format/ITtscLintFormatJsDoc.js} +1 -1
- 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 +3 -4
- package/lib/structures/index.js +3 -4
- package/lib/structures/index.js.map +1 -1
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +95 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +13 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +75 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.js +3 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintContributorRules.d.ts +16 -0
- package/lib/structures/rules/ITtscLintContributorRules.js +3 -0
- package/lib/structures/rules/ITtscLintContributorRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintCoreRules.d.ts +1229 -0
- package/lib/structures/rules/ITtscLintCoreRules.js +3 -0
- package/lib/structures/rules/ITtscLintCoreRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +17 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js +10 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintCypressRules.d.ts +125 -0
- package/lib/structures/rules/ITtscLintCypressRules.js +3 -0
- package/lib/structures/rules/ITtscLintCypressRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +154 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +13 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +162 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.js +3 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJestRules.d.ts +190 -0
- package/lib/structures/rules/ITtscLintJestRules.js +3 -0
- package/lib/structures/rules/ITtscLintJestRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJsdocRules.d.ts +133 -0
- package/lib/structures/rules/ITtscLintJsdocRules.js +3 -0
- package/lib/structures/rules/ITtscLintJsdocRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +294 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.js +3 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintNextjsRules.d.ts +180 -0
- package/lib/structures/rules/ITtscLintNextjsRules.js +3 -0
- package/lib/structures/rules/ITtscLintNextjsRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +312 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.js +3 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintPromiseRules.d.ts +179 -0
- package/lib/structures/rules/ITtscLintPromiseRules.js +3 -0
- package/lib/structures/rules/ITtscLintPromiseRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +18 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js +8 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +49 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.js +3 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +37 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js +11 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactRules.d.ts +276 -0
- package/lib/structures/rules/ITtscLintReactRules.js +3 -0
- package/lib/structures/rules/ITtscLintReactRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintRegexpRules.d.ts +182 -0
- package/lib/structures/rules/ITtscLintRegexpRules.js +3 -0
- package/lib/structures/rules/ITtscLintRegexpRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +65 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.js +3 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.js.map +1 -0
- package/lib/structures/rules/ITtscLintRules.d.ts +55 -0
- package/lib/structures/{TtscLintRule.js → rules/ITtscLintRules.js} +1 -1
- package/lib/structures/rules/ITtscLintRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintSecurityRules.d.ts +141 -0
- package/lib/structures/rules/ITtscLintSecurityRules.js +3 -0
- package/lib/structures/rules/ITtscLintSecurityRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintSolidRules.d.ts +178 -0
- package/lib/structures/rules/ITtscLintSolidRules.js +3 -0
- package/lib/structures/rules/ITtscLintSolidRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +20 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.js +9 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintStorybookRules.d.ts +165 -0
- package/lib/structures/rules/ITtscLintStorybookRules.js +3 -0
- package/lib/structures/rules/ITtscLintStorybookRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +88 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.js +3 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +21 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js +10 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +293 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.js +3 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +1074 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.js +3 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintUnicornRules.d.ts +997 -0
- package/lib/structures/rules/ITtscLintUnicornRules.js +3 -0
- package/lib/structures/rules/ITtscLintUnicornRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintVitestRules.d.ts +133 -0
- package/lib/structures/rules/ITtscLintVitestRules.js +3 -0
- package/lib/structures/rules/ITtscLintVitestRules.js.map +1 -0
- package/lib/structures/rules/index.d.ts +31 -0
- package/lib/structures/rules/index.js +48 -0
- package/lib/structures/rules/index.js.map +1 -0
- package/linthost/ast_helpers.go +30 -5
- package/linthost/config.go +118 -71
- package/linthost/config_format.go +270 -104
- package/linthost/directives.go +67 -25
- package/linthost/dispatch.go +14 -3
- package/linthost/engine.go +152 -31
- package/linthost/fix.go +10 -3
- package/linthost/format.go +222 -25
- package/linthost/format_editor_settings.go +262 -0
- package/linthost/lsp.go +898 -0
- package/linthost/print_dispatch.go +5 -2
- package/linthost/print_engine.go +5 -5
- package/linthost/print_nodes_call.go +149 -67
- package/linthost/print_nodes_function.go +27 -2
- package/linthost/print_nodes_list.go +40 -5
- package/linthost/print_nodes_object.go +1 -1
- package/linthost/print_nodes_ternary.go +86 -0
- package/linthost/rule_names.go +14 -0
- package/linthost/rules_arrays.go +2 -2
- package/linthost/rules_boundaries.go +532 -0
- package/linthost/rules_camelcase.go +133 -0
- package/linthost/rules_complexity.go +95 -0
- package/linthost/rules_consistent_return.go +130 -0
- package/linthost/rules_console.go +1 -1
- package/linthost/rules_core_extra.go +739 -0
- package/linthost/rules_curly.go +70 -0
- package/linthost/rules_cypress.go +608 -0
- package/linthost/rules_debugger.go +2 -2
- package/linthost/rules_default_case.go +39 -0
- package/linthost/rules_default_case_last.go +46 -0
- package/linthost/rules_dupes.go +3 -3
- package/linthost/rules_empty.go +3 -3
- package/linthost/rules_escape.go +44 -24
- package/linthost/rules_eval.go +2 -2
- package/linthost/rules_finally.go +2 -2
- 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 +595 -0
- package/linthost/rules_format_indent.go +372 -0
- package/linthost/rules_format_jsdoc.go +5 -5
- 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 +66 -55
- package/linthost/rules_format_quote_props.go +169 -0
- package/linthost/rules_format_quotes.go +76 -30
- package/linthost/rules_format_semi.go +186 -11
- package/linthost/rules_format_sort_imports.go +437 -118
- package/linthost/rules_format_statement_split.go +343 -0
- package/linthost/rules_format_ternary_nullish_parens.go +77 -0
- package/linthost/rules_format_trailing_comma.go +22 -3
- package/linthost/rules_format_whitespace.go +336 -0
- package/linthost/rules_functional.go +967 -0
- package/linthost/rules_gap.go +24 -45
- package/linthost/rules_grouped_accessor_pairs.go +87 -0
- package/linthost/rules_guard_for_in.go +198 -0
- package/linthost/rules_id_length.go +77 -0
- package/linthost/rules_imports.go +70 -2
- package/linthost/rules_init_declarations.go +53 -0
- package/linthost/rules_jest.go +618 -0
- package/linthost/rules_jsdoc.go +502 -0
- package/linthost/rules_jsx_a11y.go +1264 -0
- package/linthost/rules_logic.go +12 -12
- package/linthost/rules_loops.go +1 -1
- package/linthost/rules_max_classes_per_file.go +58 -0
- package/linthost/rules_max_depth.go +83 -0
- package/linthost/rules_max_lines.go +101 -0
- package/linthost/rules_max_lines_per_function.go +57 -0
- package/linthost/rules_max_nested_callbacks.go +61 -0
- package/linthost/rules_max_params.go +49 -0
- package/linthost/rules_max_statements.go +59 -0
- package/linthost/rules_misc.go +1 -1
- package/linthost/rules_nextjs.go +697 -0
- package/linthost/rules_no_else_return.go +75 -0
- package/linthost/rules_no_empty_named_blocks.go +91 -0
- package/linthost/rules_no_extend_native.go +51 -0
- package/linthost/rules_no_import_assign.go +140 -0
- package/linthost/rules_no_invalid_this.go +52 -0
- package/linthost/rules_no_loop_func.go +85 -0
- package/linthost/rules_no_magic_numbers.go +123 -0
- package/linthost/rules_no_mixed_operators.go +80 -0
- package/linthost/rules_no_param_reassign.go +98 -0
- package/linthost/rules_no_redeclare.go +270 -0
- package/linthost/rules_no_restricted_imports.go +105 -0
- package/linthost/rules_no_restricted_syntax.go +49 -0
- package/linthost/rules_no_shadow.go +147 -0
- package/linthost/rules_no_unreachable.go +77 -0
- package/linthost/rules_no_useless_assignment.go +120 -0
- package/linthost/rules_no_useless_constructor.go +245 -0
- package/linthost/rules_no_useless_return.go +51 -0
- package/linthost/rules_params.go +1 -1
- package/linthost/rules_playwright.go +788 -0
- package/linthost/rules_prefer_arrow_callback.go +124 -0
- package/linthost/rules_prefer_destructuring.go +98 -0
- package/linthost/rules_prefer_named_capture_group.go +129 -0
- package/linthost/rules_prefer_rest_params.go +94 -0
- package/linthost/rules_problems.go +41 -30
- package/linthost/rules_promise.go +1057 -2
- package/linthost/rules_protos.go +2 -2
- package/linthost/rules_react.go +773 -0
- package/linthost/rules_react_extras.go +227 -0
- package/linthost/rules_react_hooks.go +848 -0
- package/linthost/rules_react_perf.go +293 -0
- package/linthost/rules_react_refresh.go +583 -0
- package/linthost/rules_regexp.go +410 -0
- package/linthost/rules_security.go +830 -0
- package/linthost/rules_self.go +2 -2
- package/linthost/rules_solid.go +1073 -0
- package/linthost/rules_sort_imports.go +69 -0
- package/linthost/rules_sort_keys.go +134 -0
- package/linthost/rules_storybook.go +1176 -0
- package/linthost/rules_strings.go +4 -4
- package/linthost/rules_suggestions.go +38 -38
- package/linthost/rules_tanstack_query.go +844 -0
- package/linthost/rules_testing_library.go +1204 -0
- package/linthost/rules_throw.go +1 -1
- package/linthost/rules_ts.go +19 -19
- package/linthost/rules_ts_async.go +399 -0
- package/linthost/rules_ts_class_literal_property_style.go +115 -0
- package/linthost/rules_ts_consistent_type_exports.go +256 -0
- package/linthost/rules_ts_explicit_function_return_type.go +67 -0
- package/linthost/rules_ts_extra.go +159 -36
- package/linthost/rules_ts_no_base_to_string.go +218 -0
- package/linthost/rules_ts_no_confusing_void.go +72 -0
- package/linthost/rules_ts_no_deprecated.go +195 -0
- package/linthost/rules_ts_no_for_in_array.go +84 -0
- package/linthost/rules_ts_no_magic_numbers.go +124 -0
- package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
- package/linthost/rules_ts_no_misused_spread.go +104 -0
- package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
- package/linthost/rules_ts_no_restricted_types.go +62 -0
- package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
- package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
- package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
- package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
- package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
- package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
- package/linthost/rules_ts_no_unsafe_argument.go +82 -0
- package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
- package/linthost/rules_ts_no_unsafe_call.go +82 -0
- package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
- package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
- package/linthost/rules_ts_no_unsafe_return.go +126 -0
- package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
- package/linthost/rules_ts_no_useless_constructor.go +52 -0
- package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
- package/linthost/rules_ts_parameter_properties.go +38 -0
- package/linthost/rules_ts_prefer_find.go +178 -0
- package/linthost/rules_ts_prefer_includes.go +255 -0
- package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
- package/linthost/rules_ts_prefer_optional_chain.go +228 -0
- package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
- package/linthost/rules_ts_prefer_readonly.go +73 -0
- package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
- package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
- package/linthost/rules_ts_prefer_return_this_type.go +135 -0
- package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
- package/linthost/rules_ts_promise_function_async.go +77 -0
- package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
- package/linthost/rules_ts_require_array_sort_compare.go +96 -0
- package/linthost/rules_ts_restrict_plus_operands.go +127 -0
- package/linthost/rules_ts_restrict_template_expressions.go +95 -0
- package/linthost/rules_ts_simple.go +387 -0
- package/linthost/rules_ts_sort_type_constituents.go +144 -0
- package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
- package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
- package/linthost/rules_ts_unbound_method.go +126 -0
- package/linthost/rules_tsdoc.go +136 -0
- package/linthost/rules_unicorn_better_regex.go +27 -0
- package/linthost/rules_unicorn_catch_error_name.go +46 -0
- package/linthost/rules_unicorn_consistent_assert.go +47 -0
- package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
- package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
- package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
- package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
- package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
- package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
- package/linthost/rules_unicorn_custom_error_definition.go +138 -0
- package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
- package/linthost/rules_unicorn_error_message.go +64 -0
- package/linthost/rules_unicorn_escape_case.go +51 -0
- package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
- package/linthost/rules_unicorn_explicit_length_check.go +88 -0
- package/linthost/rules_unicorn_filename_case.go +29 -0
- package/linthost/rules_unicorn_import_style.go +28 -0
- package/linthost/rules_unicorn_isolated_functions.go +29 -0
- package/linthost/rules_unicorn_new_for_builtins.go +87 -0
- package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
- package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
- package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
- package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
- package/linthost/rules_unicorn_no_array_for_each.go +40 -0
- package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
- package/linthost/rules_unicorn_no_array_reduce.go +41 -0
- package/linthost/rules_unicorn_no_array_reverse.go +44 -0
- package/linthost/rules_unicorn_no_array_sort.go +43 -0
- package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
- package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
- package/linthost/rules_unicorn_no_console_spaces.go +61 -0
- package/linthost/rules_unicorn_no_document_cookie.go +41 -0
- package/linthost/rules_unicorn_no_empty_file.go +44 -0
- package/linthost/rules_unicorn_no_for_loop.go +102 -0
- package/linthost/rules_unicorn_no_hex_escape.go +42 -0
- package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
- package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
- package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
- package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
- package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
- package/linthost/rules_unicorn_no_lonely_if.go +44 -0
- package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
- package/linthost/rules_unicorn_no_named_default.go +54 -0
- package/linthost/rules_unicorn_no_negated_condition.go +85 -0
- package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
- package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
- package/linthost/rules_unicorn_no_new_array.go +30 -0
- package/linthost/rules_unicorn_no_new_buffer.go +31 -0
- package/linthost/rules_unicorn_no_null.go +24 -0
- package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
- package/linthost/rules_unicorn_no_process_exit.go +43 -0
- package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
- package/linthost/rules_unicorn_no_static_only_class.go +56 -0
- package/linthost/rules_unicorn_no_thenable.go +74 -0
- package/linthost/rules_unicorn_no_this_assignment.go +35 -0
- package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
- package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
- package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
- package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
- package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
- package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
- package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
- package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
- package/linthost/rules_unicorn_no_unused_properties.go +30 -0
- package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
- package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
- package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
- package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
- package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
- package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
- package/linthost/rules_unicorn_no_useless_spread.go +67 -0
- package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
- package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
- package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
- package/linthost/rules_unicorn_number_literal_case.go +69 -0
- package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
- package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
- package/linthost/rules_unicorn_prefer_array_find.go +51 -0
- package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
- package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
- package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
- package/linthost/rules_unicorn_prefer_array_some.go +67 -0
- package/linthost/rules_unicorn_prefer_at.go +77 -0
- package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
- package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
- package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
- package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
- package/linthost/rules_unicorn_prefer_code_point.go +49 -0
- package/linthost/rules_unicorn_prefer_date_now.go +78 -0
- package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
- package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
- package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
- package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
- package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
- package/linthost/rules_unicorn_prefer_event_target.go +36 -0
- package/linthost/rules_unicorn_prefer_export_from.go +129 -0
- package/linthost/rules_unicorn_prefer_global_this.go +127 -0
- package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
- package/linthost/rules_unicorn_prefer_includes.go +149 -0
- package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
- package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
- package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
- package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
- package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
- package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
- package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
- package/linthost/rules_unicorn_prefer_module.go +50 -0
- package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
- package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
- package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
- package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
- package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
- package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
- package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
- package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
- package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
- package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
- package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
- package/linthost/rules_unicorn_prefer_set_has.go +42 -0
- package/linthost/rules_unicorn_prefer_set_size.go +48 -0
- package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
- package/linthost/rules_unicorn_prefer_single_call.go +96 -0
- package/linthost/rules_unicorn_prefer_spread.go +51 -0
- package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
- package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
- package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
- package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
- package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
- package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
- package/linthost/rules_unicorn_prefer_switch.go +103 -0
- package/linthost/rules_unicorn_prefer_ternary.go +71 -0
- package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
- package/linthost/rules_unicorn_prefer_type_error.go +127 -0
- package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
- package/linthost/rules_unicorn_relative_url_style.go +49 -0
- package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
- package/linthost/rules_unicorn_require_module_attributes.go +54 -0
- package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
- package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
- package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
- package/linthost/rules_unicorn_string_content.go +27 -0
- package/linthost/rules_unicorn_switch_case_braces.go +42 -0
- package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
- package/linthost/rules_unicorn_template_indent.go +28 -0
- package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
- package/linthost/rules_unicorn_throw_new_error.go +61 -0
- package/linthost/rules_var.go +4 -4
- package/linthost/rules_vitest.go +568 -0
- package/package.json +3 -3
- package/plugin/main.go +49 -3
- package/rule/astutil/astutil.go +10 -3
- package/rule/rule.go +12 -10
- package/src/defaultFormat.ts +17 -10
- package/src/index.ts +40 -16
- package/src/structures/ITtscLintConfig.ts +14 -8
- package/src/structures/TtscLintRuleSetting.ts +55 -0
- package/src/structures/format/ITtscLintFormat.ts +141 -0
- package/src/structures/format/ITtscLintFormatJsDoc.ts +18 -0
- package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
- package/src/structures/format/index.ts +3 -0
- package/src/structures/index.ts +3 -4
- package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +117 -0
- package/src/structures/rules/ITtscLintBoundariesRules.ts +91 -0
- package/src/structures/rules/ITtscLintContributorRules.ts +20 -0
- package/src/structures/rules/ITtscLintCoreRules.ts +1378 -0
- package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
- package/src/structures/rules/ITtscLintCypressRules.ts +141 -0
- package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +200 -0
- package/src/structures/rules/ITtscLintFunctionalRules.ts +197 -0
- package/src/structures/rules/ITtscLintJestRules.ts +209 -0
- package/src/structures/rules/ITtscLintJsdocRules.ts +146 -0
- package/src/structures/rules/ITtscLintJsxA11yRules.ts +331 -0
- package/src/structures/rules/ITtscLintNextjsRules.ts +201 -0
- package/src/structures/rules/ITtscLintPlaywrightRules.ts +343 -0
- package/src/structures/rules/ITtscLintPromiseRules.ts +196 -0
- package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
- package/src/structures/rules/ITtscLintReactPerfRules.ts +53 -0
- package/src/structures/rules/ITtscLintReactRuleOptions.ts +41 -0
- package/src/structures/rules/ITtscLintReactRules.ts +308 -0
- package/src/structures/rules/ITtscLintRegexpRules.ts +204 -0
- package/src/structures/rules/ITtscLintRuleOptionsMap.ts +88 -0
- package/src/structures/rules/ITtscLintRules.ts +77 -0
- package/src/structures/rules/ITtscLintSecurityRules.ts +155 -0
- package/src/structures/rules/ITtscLintSolidRules.ts +199 -0
- package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +22 -0
- package/src/structures/rules/ITtscLintStorybookRules.ts +184 -0
- package/src/structures/rules/ITtscLintTanstackQueryRules.ts +96 -0
- package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +23 -0
- package/src/structures/rules/ITtscLintTestingLibraryRules.ts +325 -0
- package/src/structures/rules/ITtscLintTypeScriptRules.ts +1172 -0
- package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
- package/src/structures/rules/ITtscLintVitestRules.ts +146 -0
- package/src/structures/rules/index.ts +31 -0
- package/lib/structures/ITtscLintFormatConfig.d.ts +0 -153
- package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
- package/lib/structures/TtscLintRule.d.ts +0 -17
- package/lib/structures/TtscLintRule.js.map +0 -1
- package/lib/structures/TtscLintRuleMap.d.ts +0 -46
- package/lib/structures/TtscLintRuleMap.js.map +0 -1
- package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
- package/lib/structures/TtscLintRuleOptions.js.map +0 -1
- package/src/structures/ITtscLintFormatConfig.ts +0 -168
- package/src/structures/TtscLintRule.ts +0 -160
- package/src/structures/TtscLintRuleMap.ts +0 -55
- package/src/structures/TtscLintRuleOptions.ts +0 -151
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// unicorn/no-this-assignment: capturing `this` into a local variable —
|
|
2
|
+
// the classic `const self = this;` / `var that = this;` — was a workaround
|
|
3
|
+
// before arrow functions existed. Modern callers should close over the
|
|
4
|
+
// outer `this` with an arrow function instead so the binding cannot drift
|
|
5
|
+
// or be reassigned.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: dispatch on `KindVariableDeclaration` and fire when the
|
|
8
|
+
// initializer (after stripping parentheses, so `const self = (this);`
|
|
9
|
+
// also matches) is `KindThisKeyword`. The diagnostic anchors on the
|
|
10
|
+
// declaration node so reporters surface the whole `name = this` line.
|
|
11
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-this-assignment.md
|
|
12
|
+
package linthost
|
|
13
|
+
|
|
14
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
15
|
+
|
|
16
|
+
type unicornNoThisAssignment struct{}
|
|
17
|
+
|
|
18
|
+
func (unicornNoThisAssignment) Name() string { return "unicorn/no-this-assignment" }
|
|
19
|
+
func (unicornNoThisAssignment) Visits() []shimast.Kind {
|
|
20
|
+
return []shimast.Kind{shimast.KindVariableDeclaration}
|
|
21
|
+
}
|
|
22
|
+
func (unicornNoThisAssignment) Check(ctx *Context, node *shimast.Node) {
|
|
23
|
+
decl := node.AsVariableDeclaration()
|
|
24
|
+
if decl == nil || decl.Initializer == nil {
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
if stripParens(decl.Initializer).Kind != shimast.KindThisKeyword {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
ctx.Report(node, "Don't assign `this` to a variable — capture via an arrow function instead.")
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
func init() {
|
|
34
|
+
Register(unicornNoThisAssignment{})
|
|
35
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// unicorn/no-typeof-undefined: comparing `typeof X` against the string
|
|
2
|
+
// literal `"undefined"` is a leftover guard from pre-strict-mode code,
|
|
3
|
+
// when referencing an undeclared identifier threw a ReferenceError.
|
|
4
|
+
// Modern code can compare the value to `undefined` directly, which is
|
|
5
|
+
// shorter and reads as the intent it actually expresses.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: each visited BinaryExpression is rejected when its operator
|
|
8
|
+
// is one of `===`, `==`, `!==`, `!=` and its two operands include
|
|
9
|
+
// exactly one TypeOfExpression and exactly one string-shaped literal
|
|
10
|
+
// (StringLiteral or NoSubstitutionTemplateLiteral) whose text value is
|
|
11
|
+
// `undefined`. Either side may carry the typeof; either side may carry
|
|
12
|
+
// the literal.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-typeof-undefined.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornNoTypeofUndefined struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornNoTypeofUndefined) Name() string { return "unicorn/no-typeof-undefined" }
|
|
21
|
+
func (unicornNoTypeofUndefined) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindBinaryExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornNoTypeofUndefined) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
expr := node.AsBinaryExpression()
|
|
26
|
+
if expr == nil || expr.OperatorToken == nil {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
switch expr.OperatorToken.Kind {
|
|
30
|
+
case shimast.KindEqualsEqualsEqualsToken,
|
|
31
|
+
shimast.KindEqualsEqualsToken,
|
|
32
|
+
shimast.KindExclamationEqualsEqualsToken,
|
|
33
|
+
shimast.KindExclamationEqualsToken:
|
|
34
|
+
default:
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
left := stripParens(expr.Left)
|
|
38
|
+
right := stripParens(expr.Right)
|
|
39
|
+
if left == nil || right == nil {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
var literal *shimast.Node
|
|
43
|
+
if left.Kind == shimast.KindTypeOfExpression {
|
|
44
|
+
literal = right
|
|
45
|
+
} else if right.Kind == shimast.KindTypeOfExpression {
|
|
46
|
+
literal = left
|
|
47
|
+
} else {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
if stringLiteralText(literal) != "undefined" {
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
ctx.Report(node, "Compare with `undefined` directly instead of using `typeof`.")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
func init() {
|
|
57
|
+
Register(unicornNoTypeofUndefined{})
|
|
58
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// unicorn/no-unnecessary-array-flat-depth: `Array#flat()` already defaults
|
|
2
|
+
// to depth `1`, so writing `.flat(1)` is a redundant spelling that adds
|
|
3
|
+
// noise without changing behavior. The rule flags the explicit `1` so
|
|
4
|
+
// the call collapses to the dependency-free `.flat()` shorthand.
|
|
5
|
+
//
|
|
6
|
+
// AST-only: dispatch on `KindCallExpression`, require a property-access
|
|
7
|
+
// callee whose method identifier is `flat`, exactly one argument, and
|
|
8
|
+
// that argument's NumericLiteral text to be "1". Other numeric arguments
|
|
9
|
+
// are handled by `unicorn/no-magic-array-flat-depth`; this sibling rule
|
|
10
|
+
// only owns the literal-`1` shape.
|
|
11
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-array-flat-depth.md
|
|
12
|
+
package linthost
|
|
13
|
+
|
|
14
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
15
|
+
|
|
16
|
+
type unicornNoUnnecessaryArrayFlatDepth struct{}
|
|
17
|
+
|
|
18
|
+
func (unicornNoUnnecessaryArrayFlatDepth) Name() string {
|
|
19
|
+
return "unicorn/no-unnecessary-array-flat-depth"
|
|
20
|
+
}
|
|
21
|
+
func (unicornNoUnnecessaryArrayFlatDepth) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornNoUnnecessaryArrayFlatDepth) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
call := node.AsCallExpression()
|
|
26
|
+
if call == nil || call.Expression == nil ||
|
|
27
|
+
call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
31
|
+
if access == nil || identifierText(access.Name()) != "flat" {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
arg := stripParens(call.Arguments.Nodes[0])
|
|
38
|
+
if arg == nil || arg.Kind != shimast.KindNumericLiteral {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
if numericLiteralText(arg) != "1" {
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
ctx.Report(node, "`Array#flat()` already defaults to depth 1 — omit the argument.")
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
func init() {
|
|
48
|
+
Register(unicornNoUnnecessaryArrayFlatDepth{})
|
|
49
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// unicorn/no-unnecessary-array-splice-count: `arr.splice(start, arr.length)`
|
|
2
|
+
// and `arr.splice(start, Infinity)` both say "delete from `start` to the
|
|
3
|
+
// end", but `splice` already does that when the count argument is
|
|
4
|
+
// omitted entirely. Dropping the redundant count makes the intent read
|
|
5
|
+
// directly: "splice from `start`."
|
|
6
|
+
//
|
|
7
|
+
// AST-only: each visited `CallExpression` checks a `splice` /
|
|
8
|
+
// `toSpliced` callee with at least two arguments and inspects the
|
|
9
|
+
// second. A `.length` property access (on any receiver — the rule
|
|
10
|
+
// doesn't try to reconcile receivers) or a bare `Infinity` identifier
|
|
11
|
+
// both fire. Anything else is a real count.
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-array-splice-count.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
type unicornNoUnnecessaryArraySpliceCount struct{}
|
|
18
|
+
|
|
19
|
+
func (unicornNoUnnecessaryArraySpliceCount) Name() string {
|
|
20
|
+
return "unicorn/no-unnecessary-array-splice-count"
|
|
21
|
+
}
|
|
22
|
+
func (unicornNoUnnecessaryArraySpliceCount) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
24
|
+
}
|
|
25
|
+
func (unicornNoUnnecessaryArraySpliceCount) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
call := node.AsCallExpression()
|
|
27
|
+
if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
31
|
+
if access == nil {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
method := identifierText(access.Name())
|
|
35
|
+
if method != "splice" && method != "toSpliced" {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) < 2 {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
second := stripParens(call.Arguments.Nodes[1])
|
|
42
|
+
if !unicornUnnecessaryCountArgument(second) {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
ctx.Report(call.Arguments.Nodes[1], "Use `splice(start)` without the count — `.length` / `Infinity` is the default.")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// unicornUnnecessaryCountArgument reports whether `node` is one of the
|
|
49
|
+
// two redundant "until the end" shapes — a `.length` property access on
|
|
50
|
+
// any receiver, or the bare `Infinity` identifier.
|
|
51
|
+
func unicornUnnecessaryCountArgument(node *shimast.Node) bool {
|
|
52
|
+
if node == nil {
|
|
53
|
+
return false
|
|
54
|
+
}
|
|
55
|
+
if node.Kind == shimast.KindPropertyAccessExpression {
|
|
56
|
+
access := node.AsPropertyAccessExpression()
|
|
57
|
+
if access == nil {
|
|
58
|
+
return false
|
|
59
|
+
}
|
|
60
|
+
return identifierText(access.Name()) == "length"
|
|
61
|
+
}
|
|
62
|
+
if node.Kind == shimast.KindIdentifier {
|
|
63
|
+
return identifierText(node) == "Infinity"
|
|
64
|
+
}
|
|
65
|
+
return false
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
func init() {
|
|
69
|
+
Register(unicornNoUnnecessaryArraySpliceCount{})
|
|
70
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// unicorn/no-unnecessary-await: `await x` only changes anything when
|
|
2
|
+
// `x` is thenable; awaiting a value that the language guarantees is
|
|
3
|
+
// not a promise (a literal, an object/array literal, the result of a
|
|
4
|
+
// non-async constructor call, etc.) just costs one extra microtask and
|
|
5
|
+
// reads as if the author forgot what type they were holding.
|
|
6
|
+
//
|
|
7
|
+
// AST-only minimum-viable port: visit each `AwaitExpression` and only
|
|
8
|
+
// fire when the operand (after `stripParens`) is a node whose value the
|
|
9
|
+
// parser already pins as not-thenable: a string/number/bigint/regex
|
|
10
|
+
// literal, a template literal, an array or object literal, `true`,
|
|
11
|
+
// `false`, or `null`. Without type information, identifiers and
|
|
12
|
+
// function calls are unsafe to flag — their values can be promises.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-await.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornNoUnnecessaryAwait struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornNoUnnecessaryAwait) Name() string { return "unicorn/no-unnecessary-await" }
|
|
21
|
+
func (unicornNoUnnecessaryAwait) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindAwaitExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornNoUnnecessaryAwait) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
await := node.AsAwaitExpression()
|
|
26
|
+
if await == nil || await.Expression == nil {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
operand := stripParens(await.Expression)
|
|
30
|
+
if operand == nil {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
switch operand.Kind {
|
|
34
|
+
case shimast.KindStringLiteral,
|
|
35
|
+
shimast.KindNumericLiteral,
|
|
36
|
+
shimast.KindBigIntLiteral,
|
|
37
|
+
shimast.KindNoSubstitutionTemplateLiteral,
|
|
38
|
+
shimast.KindTemplateExpression,
|
|
39
|
+
shimast.KindRegularExpressionLiteral,
|
|
40
|
+
shimast.KindTrueKeyword,
|
|
41
|
+
shimast.KindFalseKeyword,
|
|
42
|
+
shimast.KindNullKeyword,
|
|
43
|
+
shimast.KindArrayLiteralExpression,
|
|
44
|
+
shimast.KindObjectLiteralExpression:
|
|
45
|
+
ctx.Report(node, "Don't `await` a non-thenable expression.")
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func init() {
|
|
50
|
+
Register(unicornNoUnnecessaryAwait{})
|
|
51
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// unicorn/no-unnecessary-polyfills: rejects imports of polyfill
|
|
2
|
+
// packages (`core-js/…`, `es6-promise`, …) for APIs the project's
|
|
3
|
+
// targeted runtime already supports natively. The signal is "this
|
|
4
|
+
// dependency is dead weight for our `engines.node` / `browserslist`
|
|
5
|
+
// floor".
|
|
6
|
+
//
|
|
7
|
+
// Escape-hatch / no-op port: the rule needs two external inputs the
|
|
8
|
+
// AST-only engine in this package does not yet have a place for: the
|
|
9
|
+
// project's targeted runtime baseline (read upstream from
|
|
10
|
+
// `package.json#engines`, `browserslist`, or a rule option) and a
|
|
11
|
+
// curated polyfill-package → API map kept in lockstep with caniuse /
|
|
12
|
+
// MDN. Until both are wired through the linthost configuration, firing
|
|
13
|
+
// would either be uninformed (no baseline) or wrong (stale map).
|
|
14
|
+
// Registered so the typed-key/Go-registry parity check passes and so
|
|
15
|
+
// users can configure the rule, but it intentionally reports nothing
|
|
16
|
+
// until the inputs land in a follow-up.
|
|
17
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md
|
|
18
|
+
package linthost
|
|
19
|
+
|
|
20
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
21
|
+
|
|
22
|
+
type unicornNoUnnecessaryPolyfills struct{}
|
|
23
|
+
|
|
24
|
+
func (unicornNoUnnecessaryPolyfills) Name() string { return "unicorn/no-unnecessary-polyfills" }
|
|
25
|
+
func (unicornNoUnnecessaryPolyfills) Visits() []shimast.Kind { return nil }
|
|
26
|
+
func (unicornNoUnnecessaryPolyfills) Check(_ *Context, _ *shimast.Node) {
|
|
27
|
+
// Intentionally empty — see file header for the escape-hatch rationale.
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
func init() {
|
|
31
|
+
Register(unicornNoUnnecessaryPolyfills{})
|
|
32
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// unicorn/no-unnecessary-slice-end: `arr.slice(start, arr.length)` and
|
|
2
|
+
// `arr.slice(start, Infinity)` both clamp the end to the array's tail,
|
|
3
|
+
// which is exactly what `slice(start)` already does. Removing the
|
|
4
|
+
// redundant end argument shortens the call without changing behavior.
|
|
5
|
+
//
|
|
6
|
+
// AST-only: each visited `CallExpression` checks a `slice` callee with
|
|
7
|
+
// exactly two arguments and inspects the second. A `.length` property
|
|
8
|
+
// access (on any receiver) or a bare `Infinity` identifier both fire.
|
|
9
|
+
// Three or more arguments is out of shape for `Array#slice` and is
|
|
10
|
+
// ignored.
|
|
11
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-slice-end.md
|
|
12
|
+
package linthost
|
|
13
|
+
|
|
14
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
15
|
+
|
|
16
|
+
type unicornNoUnnecessarySliceEnd struct{}
|
|
17
|
+
|
|
18
|
+
func (unicornNoUnnecessarySliceEnd) Name() string {
|
|
19
|
+
return "unicorn/no-unnecessary-slice-end"
|
|
20
|
+
}
|
|
21
|
+
func (unicornNoUnnecessarySliceEnd) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornNoUnnecessarySliceEnd) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
call := node.AsCallExpression()
|
|
26
|
+
if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
30
|
+
if access == nil {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
if identifierText(access.Name()) != "slice" {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) != 2 {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
second := stripParens(call.Arguments.Nodes[1])
|
|
40
|
+
if !unicornUnnecessaryCountArgument(second) {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
ctx.Report(call.Arguments.Nodes[1], "Use `slice(start)` without the end — `.length` / `Infinity` is the default.")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func init() {
|
|
47
|
+
Register(unicornNoUnnecessarySliceEnd{})
|
|
48
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// unicorn/no-unreadable-array-destructuring: a destructuring pattern
|
|
2
|
+
// like `[, , a]` uses a run of comma holes to skip array positions
|
|
3
|
+
// before the binding the caller actually wants. The hole run is
|
|
4
|
+
// positional, silent, and trivial to miscount, so the rule flags
|
|
5
|
+
// patterns with two or more consecutive holes followed by a real
|
|
6
|
+
// element. A single leading hole (`[, second]`) is a common idiom and
|
|
7
|
+
// is not flagged. The recommended replacement is an indexed read
|
|
8
|
+
// (`arr[2]`).
|
|
9
|
+
//
|
|
10
|
+
// AST-only and syntactic: dispatch on `ArrayBindingPattern` for
|
|
11
|
+
// declaration / parameter destructuring AND `ArrayLiteralExpression`
|
|
12
|
+
// for the assignment-destructuring form (which the parser models as an
|
|
13
|
+
// array literal in LHS position). A run of three or more
|
|
14
|
+
// `OmittedExpression` holes followed by a non-hole element trips the
|
|
15
|
+
// diagnostic; runs that are not followed by anything (trailing holes)
|
|
16
|
+
// are not actionable and are out of scope.
|
|
17
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unreadable-array-destructuring.md
|
|
18
|
+
package linthost
|
|
19
|
+
|
|
20
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
21
|
+
|
|
22
|
+
type unicornNoUnreadableArrayDestructuring struct{}
|
|
23
|
+
|
|
24
|
+
func (unicornNoUnreadableArrayDestructuring) Name() string {
|
|
25
|
+
return "unicorn/no-unreadable-array-destructuring"
|
|
26
|
+
}
|
|
27
|
+
func (unicornNoUnreadableArrayDestructuring) Visits() []shimast.Kind {
|
|
28
|
+
return []shimast.Kind{shimast.KindArrayBindingPattern, shimast.KindArrayLiteralExpression}
|
|
29
|
+
}
|
|
30
|
+
func (unicornNoUnreadableArrayDestructuring) Check(ctx *Context, node *shimast.Node) {
|
|
31
|
+
var elements []*shimast.Node
|
|
32
|
+
switch node.Kind {
|
|
33
|
+
case shimast.KindArrayBindingPattern:
|
|
34
|
+
pattern := node.AsBindingPattern()
|
|
35
|
+
if pattern == nil || pattern.Elements == nil {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
elements = pattern.Elements.Nodes
|
|
39
|
+
case shimast.KindArrayLiteralExpression:
|
|
40
|
+
// Array literals fire only when they appear in a destructuring-
|
|
41
|
+
// assignment position; otherwise the holes are just sparse-array
|
|
42
|
+
// construction, which a different rule covers.
|
|
43
|
+
if !isAssignmentDestructuringTarget(node) {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
arr := node.AsArrayLiteralExpression()
|
|
47
|
+
if arr == nil || arr.Elements == nil {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
elements = arr.Elements.Nodes
|
|
51
|
+
default:
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
run := 0
|
|
55
|
+
for _, el := range elements {
|
|
56
|
+
if isArrayDestructuringHole(el) {
|
|
57
|
+
run++
|
|
58
|
+
continue
|
|
59
|
+
}
|
|
60
|
+
if run >= 2 {
|
|
61
|
+
ctx.Report(node, "Don't use unreadable array destructuring with long hole runs.")
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
run = 0
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// isArrayDestructuringHole reports whether `el` is a comma "hole" in an
|
|
69
|
+
// array destructuring/literal context. The TypeScript parser models a
|
|
70
|
+
// hole in an `ArrayLiteralExpression` as `OmittedExpression`, but a
|
|
71
|
+
// hole in an `ArrayBindingPattern` as a `BindingElement` with no name
|
|
72
|
+
// (and no initializer / dotdotdot). Both shapes contribute to a run.
|
|
73
|
+
func isArrayDestructuringHole(el *shimast.Node) bool {
|
|
74
|
+
if el == nil {
|
|
75
|
+
return false
|
|
76
|
+
}
|
|
77
|
+
if el.Kind == shimast.KindOmittedExpression {
|
|
78
|
+
return true
|
|
79
|
+
}
|
|
80
|
+
if el.Kind == shimast.KindBindingElement {
|
|
81
|
+
be := el.AsBindingElement()
|
|
82
|
+
if be != nil && be.Name() == nil && be.Initializer == nil && be.DotDotDotToken == nil {
|
|
83
|
+
return true
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// isAssignmentDestructuringTarget reports whether `node` (an
|
|
90
|
+
// ArrayLiteralExpression) appears on the LHS of an `=` assignment or
|
|
91
|
+
// in another write-target position. The parser models destructuring
|
|
92
|
+
// assignment as an array-literal expression in LHS slot; without this
|
|
93
|
+
// gate every plain sparse array literal would trip the rule.
|
|
94
|
+
func isAssignmentDestructuringTarget(node *shimast.Node) bool {
|
|
95
|
+
parent := node.Parent
|
|
96
|
+
for parent != nil && parent.Kind == shimast.KindParenthesizedExpression {
|
|
97
|
+
parent = parent.Parent
|
|
98
|
+
}
|
|
99
|
+
if parent == nil {
|
|
100
|
+
return false
|
|
101
|
+
}
|
|
102
|
+
if parent.Kind == shimast.KindBinaryExpression {
|
|
103
|
+
bin := parent.AsBinaryExpression()
|
|
104
|
+
if bin != nil && bin.OperatorToken != nil &&
|
|
105
|
+
bin.OperatorToken.Kind == shimast.KindEqualsToken &&
|
|
106
|
+
stripParens(bin.Left) == node {
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return false
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
func init() {
|
|
114
|
+
Register(unicornNoUnreadableArrayDestructuring{})
|
|
115
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// unicorn/no-unreadable-iife: an IIFE whose body is itself another
|
|
2
|
+
// call expression — `(() => f())()` — reads as two layers of
|
|
3
|
+
// invocation for one effective call. The shape obscures the actual
|
|
4
|
+
// computation and the rule asks authors to extract the call site so
|
|
5
|
+
// the inner function name appears at the top level instead of being
|
|
6
|
+
// hidden behind an anonymous arrow.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit `KindCallExpression`, accept when the callee is a
|
|
9
|
+
// `KindParenthesizedExpression` wrapping a `KindArrowFunction` whose
|
|
10
|
+
// body is a `KindCallExpression`. Block-bodied arrows and arrows that
|
|
11
|
+
// return a non-call expression don't match — only the arrow → call
|
|
12
|
+
// shape is "unreadable" in the upstream sense.
|
|
13
|
+
//
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unreadable-iife.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornNoUnreadableIIFE struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornNoUnreadableIIFE) Name() string { return "unicorn/no-unreadable-iife" }
|
|
22
|
+
func (unicornNoUnreadableIIFE) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
24
|
+
}
|
|
25
|
+
func (unicornNoUnreadableIIFE) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
call := node.AsCallExpression()
|
|
27
|
+
if call == nil || call.Expression == nil {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
if call.Expression.Kind != shimast.KindParenthesizedExpression {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
paren := call.Expression.AsParenthesizedExpression()
|
|
34
|
+
if paren == nil || paren.Expression == nil ||
|
|
35
|
+
paren.Expression.Kind != shimast.KindArrowFunction {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
arrow := paren.Expression.AsArrowFunction()
|
|
39
|
+
if arrow == nil || arrow.Body == nil {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
if arrow.Body.Kind != shimast.KindCallExpression {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
ctx.Report(node, "Avoid unreadable IIFEs — extract the function.")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func init() {
|
|
49
|
+
Register(unicornNoUnreadableIIFE{})
|
|
50
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// unicorn/no-unused-properties: flags object-literal properties that
|
|
2
|
+
// are never read after the object is constructed. The signal is "this
|
|
3
|
+
// key sits in a literal that nothing reaches into" — analogous to
|
|
4
|
+
// `no-unused-vars` but for one level deeper inside object data.
|
|
5
|
+
//
|
|
6
|
+
// Escape-hatch / no-op port: implementing this faithfully requires
|
|
7
|
+
// per-object reachability and read tracking across the file (and across
|
|
8
|
+
// destructuring patterns, spread, computed access, and exports). That
|
|
9
|
+
// is a scope-and-flow problem the AST-only engine in this package
|
|
10
|
+
// cannot yet model without false positives every time a property is
|
|
11
|
+
// read through dynamic access. Registered so the typed-key/Go-registry
|
|
12
|
+
// parity check passes and so users can configure the rule, but it
|
|
13
|
+
// intentionally reports nothing until the analysis lands in a
|
|
14
|
+
// follow-up.
|
|
15
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unused-properties.md
|
|
16
|
+
package linthost
|
|
17
|
+
|
|
18
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
19
|
+
|
|
20
|
+
type unicornNoUnusedProperties struct{}
|
|
21
|
+
|
|
22
|
+
func (unicornNoUnusedProperties) Name() string { return "unicorn/no-unused-properties" }
|
|
23
|
+
func (unicornNoUnusedProperties) Visits() []shimast.Kind { return nil }
|
|
24
|
+
func (unicornNoUnusedProperties) Check(_ *Context, _ *shimast.Node) {
|
|
25
|
+
// Intentionally empty — see file header for the escape-hatch rationale.
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
func init() {
|
|
29
|
+
Register(unicornNoUnusedProperties{})
|
|
30
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// unicorn/no-useless-collection-argument: `new Set()`, `new Map()`,
|
|
2
|
+
// `new WeakSet()`, and `new WeakMap()` already start empty. Passing an
|
|
3
|
+
// explicit `null`, `undefined`, or `[]` reads as if the author meant to
|
|
4
|
+
// seed the collection with entries but came up empty — it adds noise
|
|
5
|
+
// without changing behavior. Zero-argument calls are the canonical
|
|
6
|
+
// correct form and are NOT flagged.
|
|
7
|
+
//
|
|
8
|
+
// AST-only and identifier-text-driven: visit every `NewExpression`
|
|
9
|
+
// whose callee identifier is one of the four collection constructors,
|
|
10
|
+
// then match a single argument that is a `null`/`undefined` literal,
|
|
11
|
+
// an `undefined` identifier, or an empty array literal. The receiver
|
|
12
|
+
// chain is not inspected; shadowed `Set`/`Map` bindings are out of
|
|
13
|
+
// scope, mirroring the other constructor-name-only unicorn rules.
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-collection-argument.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornNoUselessCollectionArgument struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornNoUselessCollectionArgument) Name() string {
|
|
22
|
+
return "unicorn/no-useless-collection-argument"
|
|
23
|
+
}
|
|
24
|
+
func (unicornNoUselessCollectionArgument) Visits() []shimast.Kind {
|
|
25
|
+
return []shimast.Kind{shimast.KindNewExpression}
|
|
26
|
+
}
|
|
27
|
+
func (unicornNoUselessCollectionArgument) Check(ctx *Context, node *shimast.Node) {
|
|
28
|
+
ne := node.AsNewExpression()
|
|
29
|
+
if ne == nil {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
switch identifierText(ne.Expression) {
|
|
33
|
+
case "Set", "Map", "WeakSet", "WeakMap":
|
|
34
|
+
default:
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
if ne.Arguments == nil || len(ne.Arguments.Nodes) != 1 {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
arg := stripParens(ne.Arguments.Nodes[0])
|
|
41
|
+
if arg == nil {
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
switch arg.Kind {
|
|
45
|
+
case shimast.KindNullKeyword, shimast.KindUndefinedKeyword:
|
|
46
|
+
ctx.Report(node, "Don't pass a useless initializer to `new <Collection>()`.")
|
|
47
|
+
return
|
|
48
|
+
case shimast.KindIdentifier:
|
|
49
|
+
if identifierText(arg) == "undefined" {
|
|
50
|
+
ctx.Report(node, "Don't pass a useless initializer to `new <Collection>()`.")
|
|
51
|
+
}
|
|
52
|
+
return
|
|
53
|
+
case shimast.KindArrayLiteralExpression:
|
|
54
|
+
if arr := arg.AsArrayLiteralExpression(); arr != nil &&
|
|
55
|
+
(arr.Elements == nil || len(arr.Elements.Nodes) == 0) {
|
|
56
|
+
ctx.Report(node, "Don't pass a useless initializer to `new <Collection>()`.")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
func init() {
|
|
62
|
+
Register(unicornNoUselessCollectionArgument{})
|
|
63
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// unicorn/no-useless-error-capture-stack-trace: `new Error()` already
|
|
2
|
+
// captures a stack trace by default, so calling
|
|
3
|
+
// `Error.captureStackTrace(this, …)` inside an Error-subclass
|
|
4
|
+
// constructor just rebuilds the same trace and adds noise without
|
|
5
|
+
// changing behavior. The rule flags the redundant call.
|
|
6
|
+
//
|
|
7
|
+
// AST-only MVP: visit each `CallExpression`, match when the callee is
|
|
8
|
+
// `Error.captureStackTrace` and the first argument is the `this`
|
|
9
|
+
// keyword. Detecting "inside an Error subclass constructor" is left to
|
|
10
|
+
// a future iteration — the MVP covers the common shape directly and is
|
|
11
|
+
// safe because `Error.captureStackTrace(this, …)` is uniformly useless
|
|
12
|
+
// inside subclasses anyway.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-error-capture-stack-trace.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornNoUselessErrorCaptureStackTrace struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornNoUselessErrorCaptureStackTrace) Name() string {
|
|
21
|
+
return "unicorn/no-useless-error-capture-stack-trace"
|
|
22
|
+
}
|
|
23
|
+
func (unicornNoUselessErrorCaptureStackTrace) Visits() []shimast.Kind {
|
|
24
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
25
|
+
}
|
|
26
|
+
func (unicornNoUselessErrorCaptureStackTrace) Check(ctx *Context, node *shimast.Node) {
|
|
27
|
+
call := node.AsCallExpression()
|
|
28
|
+
if call == nil || call.Expression == nil {
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
if !isMatchingPropertyAccess(call.Expression, "Error", "captureStackTrace") {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) < 1 {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
first := stripParens(call.Arguments.Nodes[0])
|
|
38
|
+
if first == nil || first.Kind != shimast.KindThisKeyword {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
ctx.Report(node, "Don't call `Error.captureStackTrace(this, ...)` in an `Error` subclass — the default capture already happens.")
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func init() {
|
|
45
|
+
Register(unicornNoUselessErrorCaptureStackTrace{})
|
|
46
|
+
}
|