@ttsc/lint 0.13.1 → 0.14.0-dev.20260528.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 +948 -69
- package/lib/defaultFormat.d.ts +9 -6
- package/lib/defaultFormat.js +9 -6
- 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/{ITtscLintFormatConfig.d.ts → ITtscLintFormat.d.ts} +2 -2
- package/lib/structures/{TtscLintRuleMap.js → ITtscLintFormat.js} +1 -1
- package/lib/structures/ITtscLintFormat.js.map +1 -0
- 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/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 +104 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +14 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +79 -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 +17 -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 +1257 -0
- package/lib/structures/{ITtscLintFormatConfig.js → rules/ITtscLintCoreRules.js} +1 -1
- 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 +129 -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 +157 -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 +167 -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 +201 -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 +140 -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 +302 -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 +185 -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 +330 -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 +188 -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 +51 -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 +39 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js +12 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactRules.d.ts +289 -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 +190 -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 +66 -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 +148 -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 +181 -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 +21 -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 +174 -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 +94 -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 +22 -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 +310 -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 +1132 -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 +141 -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 +48 -17
- package/linthost/config_format.go +9 -9
- package/linthost/directives.go +67 -25
- package/linthost/dispatch.go +14 -3
- package/linthost/engine.go +152 -31
- package/linthost/fix.go +2 -2
- package/linthost/lsp.go +747 -0
- package/linthost/print_dispatch.go +2 -2
- package/linthost/print_nodes_function.go +2 -2
- package/linthost/print_nodes_object.go +1 -1
- 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 +94 -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_jsdoc.go +1 -1
- package/linthost/rules_format_print_width.go +9 -9
- package/linthost/rules_format_quotes.go +1 -1
- package/linthost/rules_format_semi.go +1 -1
- package/linthost/rules_format_sort_imports.go +1 -1
- package/linthost/rules_format_trailing_comma.go +1 -1
- 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 +1128 -73
- 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 +155 -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 +11 -8
- package/src/index.ts +40 -16
- package/src/structures/ITtscLintConfig.ts +12 -6
- package/src/structures/{ITtscLintFormatConfig.ts → ITtscLintFormat.ts} +2 -2
- package/src/structures/TtscLintRuleSetting.ts +55 -0
- package/src/structures/index.ts +3 -4
- package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +128 -0
- package/src/structures/rules/ITtscLintBoundariesRules.ts +95 -0
- package/src/structures/rules/ITtscLintContributorRules.ts +21 -0
- package/src/structures/rules/ITtscLintCoreRules.ts +1406 -0
- package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
- package/src/structures/rules/ITtscLintCypressRules.ts +145 -0
- package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +213 -0
- package/src/structures/rules/ITtscLintFunctionalRules.ts +202 -0
- package/src/structures/rules/ITtscLintJestRules.ts +220 -0
- package/src/structures/rules/ITtscLintJsdocRules.ts +153 -0
- package/src/structures/rules/ITtscLintJsxA11yRules.ts +339 -0
- package/src/structures/rules/ITtscLintNextjsRules.ts +206 -0
- package/src/structures/rules/ITtscLintPlaywrightRules.ts +361 -0
- package/src/structures/rules/ITtscLintPromiseRules.ts +205 -0
- package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
- package/src/structures/rules/ITtscLintReactPerfRules.ts +55 -0
- package/src/structures/rules/ITtscLintReactRuleOptions.ts +43 -0
- package/src/structures/rules/ITtscLintReactRules.ts +321 -0
- package/src/structures/rules/ITtscLintRegexpRules.ts +212 -0
- package/src/structures/rules/ITtscLintRuleOptionsMap.ts +89 -0
- package/src/structures/rules/ITtscLintRules.ts +77 -0
- package/src/structures/rules/ITtscLintSecurityRules.ts +162 -0
- package/src/structures/rules/ITtscLintSolidRules.ts +202 -0
- package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +23 -0
- package/src/structures/rules/ITtscLintStorybookRules.ts +193 -0
- package/src/structures/rules/ITtscLintTanstackQueryRules.ts +102 -0
- package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +24 -0
- package/src/structures/rules/ITtscLintTestingLibraryRules.ts +342 -0
- package/src/structures/rules/ITtscLintTypeScriptRules.ts +1230 -0
- package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
- package/src/structures/rules/ITtscLintVitestRules.ts +154 -0
- package/src/structures/rules/index.ts +31 -0
- 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/TtscLintRule.ts +0 -160
- package/src/structures/TtscLintRuleMap.ts +0 -55
- package/src/structures/TtscLintRuleOptions.ts +0 -151
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// unicorn/no-single-promise-in-promise-methods:
|
|
2
|
+
// `Promise.all([single])`, `Promise.allSettled([single])`,
|
|
3
|
+
// `Promise.race([single])`, and `Promise.any([single])` are redundant
|
|
4
|
+
// wrappers — the result is just `single` (or a one-element array
|
|
5
|
+
// wrapping its resolution, which the caller can produce trivially).
|
|
6
|
+
// The wrapper hides the fact that there is only one promise in flight
|
|
7
|
+
// and forces an extra allocation for no behavioral difference.
|
|
8
|
+
//
|
|
9
|
+
// AST-only and identifier-text-driven: dispatch on `CallExpression`,
|
|
10
|
+
// match a `Promise.<method>` callee against the four collection
|
|
11
|
+
// methods, and require exactly one argument whose stripped form is an
|
|
12
|
+
// `ArrayLiteralExpression` with exactly one element. Shadowed
|
|
13
|
+
// `Promise` bindings are out of scope; the syntactic shape is the
|
|
14
|
+
// signal.
|
|
15
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md
|
|
16
|
+
package linthost
|
|
17
|
+
|
|
18
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
19
|
+
|
|
20
|
+
type unicornNoSinglePromiseInPromiseMethods struct{}
|
|
21
|
+
|
|
22
|
+
func (unicornNoSinglePromiseInPromiseMethods) Name() string {
|
|
23
|
+
return "unicorn/no-single-promise-in-promise-methods"
|
|
24
|
+
}
|
|
25
|
+
func (unicornNoSinglePromiseInPromiseMethods) Visits() []shimast.Kind {
|
|
26
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
27
|
+
}
|
|
28
|
+
func (unicornNoSinglePromiseInPromiseMethods) Check(ctx *Context, node *shimast.Node) {
|
|
29
|
+
call := node.AsCallExpression()
|
|
30
|
+
if call == nil || call.Expression == nil ||
|
|
31
|
+
call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
35
|
+
if access == nil || identifierText(access.Expression) != "Promise" {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
switch identifierText(access.Name()) {
|
|
39
|
+
case "all", "allSettled", "race", "any":
|
|
40
|
+
default:
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
arg := stripParens(call.Arguments.Nodes[0])
|
|
47
|
+
if arg == nil || arg.Kind != shimast.KindArrayLiteralExpression {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
arr := arg.AsArrayLiteralExpression()
|
|
51
|
+
if arr == nil || arr.Elements == nil || len(arr.Elements.Nodes) != 1 {
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
ctx.Report(node, "Don't wrap a single promise in `Promise.<method>([...])` — the wrapper is redundant.")
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
func init() {
|
|
58
|
+
Register(unicornNoSinglePromiseInPromiseMethods{})
|
|
59
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// unicorn/no-static-only-class: a class whose every member is `static`
|
|
2
|
+
// is a namespace dressed up as a class. The `class` keyword introduces
|
|
3
|
+
// a constructor, a prototype chain, and `new`-able semantics that the
|
|
4
|
+
// static-only form never uses. A plain object literal or a module
|
|
5
|
+
// namespace is the more honest shape.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit both `ClassDeclaration` and `ClassExpression`. The
|
|
8
|
+
// rule requires at least one member (empty classes are handled by a
|
|
9
|
+
// separate rule) and every member must be a method, property, getter,
|
|
10
|
+
// or setter declaration with the `static` modifier. Constructors,
|
|
11
|
+
// index signatures, and any non-static member disqualify the class.
|
|
12
|
+
// Classes with heritage clauses (`extends`, `implements`) are also
|
|
13
|
+
// skipped — the inheritance IS the reason the class exists, so it
|
|
14
|
+
// can't be replaced by a plain object.
|
|
15
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-static-only-class.md
|
|
16
|
+
package linthost
|
|
17
|
+
|
|
18
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
19
|
+
|
|
20
|
+
type unicornNoStaticOnlyClass struct{}
|
|
21
|
+
|
|
22
|
+
func (unicornNoStaticOnlyClass) Name() string { return "unicorn/no-static-only-class" }
|
|
23
|
+
func (unicornNoStaticOnlyClass) Visits() []shimast.Kind {
|
|
24
|
+
return []shimast.Kind{shimast.KindClassDeclaration, shimast.KindClassExpression}
|
|
25
|
+
}
|
|
26
|
+
func (unicornNoStaticOnlyClass) Check(ctx *Context, node *shimast.Node) {
|
|
27
|
+
if classHasHeritage(node) {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
members := classMembers(node)
|
|
31
|
+
if len(members) == 0 {
|
|
32
|
+
// Empty classes are out of scope — separate rule territory.
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
for _, member := range members {
|
|
36
|
+
if member == nil {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
switch member.Kind {
|
|
40
|
+
case shimast.KindMethodDeclaration,
|
|
41
|
+
shimast.KindPropertyDeclaration,
|
|
42
|
+
shimast.KindGetAccessor,
|
|
43
|
+
shimast.KindSetAccessor:
|
|
44
|
+
if !hasModifier(member, shimast.KindStaticKeyword) {
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
default:
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
ctx.Report(node, "A class with only static members can be replaced by a plain object or module namespace.")
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
func init() {
|
|
55
|
+
Register(unicornNoStaticOnlyClass{})
|
|
56
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// unicorn/no-thenable: an object that exposes a callable `then` property
|
|
2
|
+
// becomes accidentally thenable — the runtime's `Promise.resolve(value)`
|
|
3
|
+
// pipeline treats every such value as a promise, so awaiting it invokes
|
|
4
|
+
// the user's `then` instead of resolving to the object itself. This is a
|
|
5
|
+
// common source of surprises in plain data objects and class shapes that
|
|
6
|
+
// were never intended as promises.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: dispatch on every property-defining node form (data
|
|
9
|
+
// property, method, shorthand property, getter, setter) and fire when
|
|
10
|
+
// the name node is an Identifier `then` or a StringLiteral `"then"`.
|
|
11
|
+
// `moduleExportNameText` already returns the right textual value for
|
|
12
|
+
// both shapes; computed names and other syntactic forms are skipped.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-thenable.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornNoThenable struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornNoThenable) Name() string { return "unicorn/no-thenable" }
|
|
21
|
+
func (unicornNoThenable) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{
|
|
23
|
+
shimast.KindPropertyAssignment,
|
|
24
|
+
shimast.KindMethodDeclaration,
|
|
25
|
+
shimast.KindShorthandPropertyAssignment,
|
|
26
|
+
shimast.KindGetAccessor,
|
|
27
|
+
shimast.KindSetAccessor,
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
func (unicornNoThenable) Check(ctx *Context, node *shimast.Node) {
|
|
31
|
+
var name *shimast.Node
|
|
32
|
+
switch node.Kind {
|
|
33
|
+
case shimast.KindPropertyAssignment:
|
|
34
|
+
if a := node.AsPropertyAssignment(); a != nil {
|
|
35
|
+
name = a.Name()
|
|
36
|
+
}
|
|
37
|
+
case shimast.KindMethodDeclaration:
|
|
38
|
+
if m := node.AsMethodDeclaration(); m != nil {
|
|
39
|
+
name = m.Name()
|
|
40
|
+
}
|
|
41
|
+
case shimast.KindShorthandPropertyAssignment:
|
|
42
|
+
if s := node.AsShorthandPropertyAssignment(); s != nil {
|
|
43
|
+
name = s.Name()
|
|
44
|
+
}
|
|
45
|
+
case shimast.KindGetAccessor:
|
|
46
|
+
if g := node.AsGetAccessorDeclaration(); g != nil {
|
|
47
|
+
name = g.Name()
|
|
48
|
+
}
|
|
49
|
+
case shimast.KindSetAccessor:
|
|
50
|
+
if s := node.AsSetAccessorDeclaration(); s != nil {
|
|
51
|
+
name = s.Name()
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if name == nil {
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
switch name.Kind {
|
|
58
|
+
case shimast.KindIdentifier:
|
|
59
|
+
if identifierText(name) != "then" {
|
|
60
|
+
return
|
|
61
|
+
}
|
|
62
|
+
case shimast.KindStringLiteral:
|
|
63
|
+
if stringLiteralText(name) != "then" {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
default:
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
ctx.Report(node, "Don't define a property named `then` — it makes the object accidentally thenable.")
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
func init() {
|
|
73
|
+
Register(unicornNoThenable{})
|
|
74
|
+
}
|
|
@@ -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
|
+
}
|