@ttsc/lint 0.13.0 → 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 +60 -37
- 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/compile.go +33 -2
- 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 +160 -40
- package/linthost/fix.go +10 -3
- package/linthost/flags_gen.go +17 -15
- package/linthost/format.go +222 -25
- package/linthost/format_editor_settings.go +262 -0
- package/linthost/host.go +40 -3
- 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 +10 -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 +65 -43
- 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,51 @@
|
|
|
1
|
+
// unicorn/no-magic-array-flat-depth: `Array#flat(depth)` accepts a numeric
|
|
2
|
+
// argument that controls how many nested levels are flattened. Magic
|
|
3
|
+
// numbers like `.flat(2)` or `.flat(3)` make the call hard to scan —
|
|
4
|
+
// readers must mentally model the input shape to decide whether the
|
|
5
|
+
// depth is correct. The rule allows `1` (the default depth, common
|
|
6
|
+
// enough to read at a glance) and `Infinity` (an explicit named value)
|
|
7
|
+
// but flags every other numeric literal so authors switch to either
|
|
8
|
+
// `Infinity` or a named constant.
|
|
9
|
+
//
|
|
10
|
+
// AST-only: dispatch on `KindCallExpression`, require a property-access
|
|
11
|
+
// callee whose method identifier is `flat`, exactly one argument, and
|
|
12
|
+
// that argument to be `KindNumericLiteral` with text other than "1".
|
|
13
|
+
// `Infinity` is parsed as an Identifier, not a NumericLiteral, so the
|
|
14
|
+
// kind check alone exempts it without a separate value branch.
|
|
15
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md
|
|
16
|
+
package linthost
|
|
17
|
+
|
|
18
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
19
|
+
|
|
20
|
+
type unicornNoMagicArrayFlatDepth struct{}
|
|
21
|
+
|
|
22
|
+
func (unicornNoMagicArrayFlatDepth) Name() string { return "unicorn/no-magic-array-flat-depth" }
|
|
23
|
+
func (unicornNoMagicArrayFlatDepth) Visits() []shimast.Kind {
|
|
24
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
25
|
+
}
|
|
26
|
+
func (unicornNoMagicArrayFlatDepth) Check(ctx *Context, node *shimast.Node) {
|
|
27
|
+
call := node.AsCallExpression()
|
|
28
|
+
if call == nil || call.Expression == nil ||
|
|
29
|
+
call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
33
|
+
if access == nil || identifierText(access.Name()) != "flat" {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
arg := stripParens(call.Arguments.Nodes[0])
|
|
40
|
+
if arg == nil || arg.Kind != shimast.KindNumericLiteral {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
if numericLiteralText(arg) == "1" {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
ctx.Report(node, "Don't use a magic-number depth in `Array#flat()` — use `Infinity` or a named constant.")
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func init() {
|
|
50
|
+
Register(unicornNoMagicArrayFlatDepth{})
|
|
51
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// unicorn/no-named-default: a named-import specifier that re-aliases the
|
|
2
|
+
// module's default export (`import { default as Foo } from "mod"`) does
|
|
3
|
+
// the same job as the dedicated default-import form `import Foo from "mod"`
|
|
4
|
+
// but obscures the intent — reviewers reading the named-import list have
|
|
5
|
+
// to notice the `default as` prefix to realize the binding is the
|
|
6
|
+
// module's default, not a named export named "default". The rule flags
|
|
7
|
+
// every such specifier so authors use the default-import syntax instead.
|
|
8
|
+
//
|
|
9
|
+
// AST-only: dispatch on `KindImportDeclaration`, descend through the
|
|
10
|
+
// import clause's NamedImports list, and fire on each specifier whose
|
|
11
|
+
// `PropertyName` is an identifier named "default". The default-import
|
|
12
|
+
// case (`clause.Name()`) and namespace imports (`* as`) are not
|
|
13
|
+
// affected; the property-name check matches both `import { default as X }`
|
|
14
|
+
// and the deprecated string form `import { "default" as X }`.
|
|
15
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-named-default.md
|
|
16
|
+
package linthost
|
|
17
|
+
|
|
18
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
19
|
+
|
|
20
|
+
type unicornNoNamedDefault struct{}
|
|
21
|
+
|
|
22
|
+
func (unicornNoNamedDefault) Name() string { return "unicorn/no-named-default" }
|
|
23
|
+
func (unicornNoNamedDefault) Visits() []shimast.Kind {
|
|
24
|
+
return []shimast.Kind{shimast.KindImportDeclaration}
|
|
25
|
+
}
|
|
26
|
+
func (unicornNoNamedDefault) Check(ctx *Context, node *shimast.Node) {
|
|
27
|
+
decl := node.AsImportDeclaration()
|
|
28
|
+
if decl == nil || decl.ImportClause == nil {
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
clause := decl.ImportClause.AsImportClause()
|
|
32
|
+
if clause == nil || clause.NamedBindings == nil ||
|
|
33
|
+
clause.NamedBindings.Kind != shimast.KindNamedImports {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
named := clause.NamedBindings.AsNamedImports()
|
|
37
|
+
if named == nil || named.Elements == nil {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
for _, spec := range named.Elements.Nodes {
|
|
41
|
+
s := spec.AsImportSpecifier()
|
|
42
|
+
if s == nil || s.PropertyName == nil {
|
|
43
|
+
continue
|
|
44
|
+
}
|
|
45
|
+
if moduleExportNameText(s.PropertyName) != "default" {
|
|
46
|
+
continue
|
|
47
|
+
}
|
|
48
|
+
ctx.Report(spec, "Don't import a default export under a named alias — use `import X from \"...\"` instead.")
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func init() {
|
|
53
|
+
Register(unicornNoNamedDefault{})
|
|
54
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// unicorn/no-negated-condition: a negated condition with an `else`
|
|
2
|
+
// branch forces the reader to mentally invert the test before they can
|
|
3
|
+
// pair branches with outcomes. Swapping the two branches and dropping
|
|
4
|
+
// the negation reads in source order. The rule fires on `if` / `else`
|
|
5
|
+
// pairs and on ternaries where both branches are present.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit `KindIfStatement` and `KindConditionalExpression`.
|
|
8
|
+
// Match when the condition (after `stripParens`) is either a `!`
|
|
9
|
+
// prefix-unary expression or a `!=` / `!==` binary expression AND the
|
|
10
|
+
// other branch is also present. Fire on the if / ternary node.
|
|
11
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negated-condition.md
|
|
12
|
+
package linthost
|
|
13
|
+
|
|
14
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
15
|
+
|
|
16
|
+
type unicornNoNegatedCondition struct{}
|
|
17
|
+
|
|
18
|
+
func (unicornNoNegatedCondition) Name() string { return "unicorn/no-negated-condition" }
|
|
19
|
+
func (unicornNoNegatedCondition) Visits() []shimast.Kind {
|
|
20
|
+
return []shimast.Kind{shimast.KindIfStatement, shimast.KindConditionalExpression}
|
|
21
|
+
}
|
|
22
|
+
func (unicornNoNegatedCondition) Check(ctx *Context, node *shimast.Node) {
|
|
23
|
+
var condition *shimast.Node
|
|
24
|
+
switch node.Kind {
|
|
25
|
+
case shimast.KindIfStatement:
|
|
26
|
+
stmt := node.AsIfStatement()
|
|
27
|
+
if stmt == nil || stmt.ElseStatement == nil {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
// An `else if` chain (else is itself an IfStatement) reads
|
|
31
|
+
// fine after inversion only when the else has its own else;
|
|
32
|
+
// otherwise inverting reshapes the chain. Keep the rule
|
|
33
|
+
// conservative and only fire when else is a Block.
|
|
34
|
+
if stmt.ElseStatement.Kind == shimast.KindIfStatement {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
condition = stmt.Expression
|
|
38
|
+
case shimast.KindConditionalExpression:
|
|
39
|
+
cond := node.AsConditionalExpression()
|
|
40
|
+
if cond == nil || cond.WhenTrue == nil || cond.WhenFalse == nil {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
condition = cond.Condition
|
|
44
|
+
}
|
|
45
|
+
if condition == nil {
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
condition = stripParens(condition)
|
|
49
|
+
if condition == nil {
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
if !unicornNoNegatedConditionIsNegated(condition) {
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
ctx.Report(node, "Avoid negated conditions in `if` / `else` and ternaries when the positive form is shorter.")
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// unicornNoNegatedConditionIsNegated reports whether `node` is a `!`
|
|
59
|
+
// prefix-unary expression or a `!=` / `!==` binary expression — the
|
|
60
|
+
// two shapes the rule treats as "negated".
|
|
61
|
+
func unicornNoNegatedConditionIsNegated(node *shimast.Node) bool {
|
|
62
|
+
if node == nil {
|
|
63
|
+
return false
|
|
64
|
+
}
|
|
65
|
+
switch node.Kind {
|
|
66
|
+
case shimast.KindPrefixUnaryExpression:
|
|
67
|
+
prefix := node.AsPrefixUnaryExpression()
|
|
68
|
+
return prefix != nil && prefix.Operator == shimast.KindExclamationToken
|
|
69
|
+
case shimast.KindBinaryExpression:
|
|
70
|
+
bin := node.AsBinaryExpression()
|
|
71
|
+
if bin == nil || bin.OperatorToken == nil {
|
|
72
|
+
return false
|
|
73
|
+
}
|
|
74
|
+
switch bin.OperatorToken.Kind {
|
|
75
|
+
case shimast.KindExclamationEqualsToken,
|
|
76
|
+
shimast.KindExclamationEqualsEqualsToken:
|
|
77
|
+
return true
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
func init() {
|
|
84
|
+
Register(unicornNoNegatedCondition{})
|
|
85
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// unicorn/no-negation-in-equality-check: `!a === b` parses as
|
|
2
|
+
// `(!a) === b`, comparing the *boolean* `!a` against `b`. Readers
|
|
3
|
+
// almost always expect `!(a === b)` instead, so the rule rejects the
|
|
4
|
+
// `!a === b` / `!a !== b` shape and asks the author to either switch
|
|
5
|
+
// the comparison operator (`a !== b`) or wrap the negation in parens.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit each `BinaryExpression`, match the operator against
|
|
8
|
+
// the four equality tokens, and check whether the LEFT operand is a
|
|
9
|
+
// `!` prefix-unary expression. Parens are the documented escape hatch
|
|
10
|
+
// (`(!a) === b`), so the check does NOT strip them. Fire on the binary
|
|
11
|
+
// expression so the report covers the full ambiguous shape.
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
type unicornNoNegationInEqualityCheck struct{}
|
|
18
|
+
|
|
19
|
+
func (unicornNoNegationInEqualityCheck) Name() string {
|
|
20
|
+
return "unicorn/no-negation-in-equality-check"
|
|
21
|
+
}
|
|
22
|
+
func (unicornNoNegationInEqualityCheck) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindBinaryExpression}
|
|
24
|
+
}
|
|
25
|
+
func (unicornNoNegationInEqualityCheck) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
bin := node.AsBinaryExpression()
|
|
27
|
+
if bin == nil || bin.OperatorToken == nil || bin.Left == nil {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
switch bin.OperatorToken.Kind {
|
|
31
|
+
case shimast.KindEqualsEqualsEqualsToken,
|
|
32
|
+
shimast.KindEqualsEqualsToken,
|
|
33
|
+
shimast.KindExclamationEqualsEqualsToken,
|
|
34
|
+
shimast.KindExclamationEqualsToken:
|
|
35
|
+
default:
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
if bin.Left.Kind != shimast.KindPrefixUnaryExpression {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
prefix := bin.Left.AsPrefixUnaryExpression()
|
|
42
|
+
if prefix == nil || prefix.Operator != shimast.KindExclamationToken {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
ctx.Report(node, "Don't negate the left operand of an equality check — use `!==` directly, or wrap in parens.")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func init() {
|
|
49
|
+
Register(unicornNoNegationInEqualityCheck{})
|
|
50
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// unicorn/no-nested-ternary: `a ? b : c ? d : e` packs two decision
|
|
2
|
+
// points into one expression and forces the reader to track operator
|
|
3
|
+
// precedence to know which branch each value belongs to. Unlike the
|
|
4
|
+
// core ESLint rule of the same name, the unicorn variant fires on every
|
|
5
|
+
// nested level rather than only the outermost — each inner conditional
|
|
6
|
+
// is its own offense and is reported in place.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit every `ConditionalExpression` and report on it when
|
|
9
|
+
// its parent is also a `ConditionalExpression`. `stripParens` makes the
|
|
10
|
+
// match insensitive to grouping parens.
|
|
11
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-nested-ternary.md
|
|
12
|
+
package linthost
|
|
13
|
+
|
|
14
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
15
|
+
|
|
16
|
+
type unicornNoNestedTernary struct{}
|
|
17
|
+
|
|
18
|
+
func (unicornNoNestedTernary) Name() string { return "unicorn/no-nested-ternary" }
|
|
19
|
+
func (unicornNoNestedTernary) Visits() []shimast.Kind {
|
|
20
|
+
return []shimast.Kind{shimast.KindConditionalExpression}
|
|
21
|
+
}
|
|
22
|
+
func (unicornNoNestedTernary) Check(ctx *Context, node *shimast.Node) {
|
|
23
|
+
cond := node.AsConditionalExpression()
|
|
24
|
+
if cond == nil {
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
if hasUnicornNestedConditional(cond.WhenTrue) {
|
|
28
|
+
ctx.Report(stripParens(cond.WhenTrue), "Do not nest ternary expressions.")
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
if hasUnicornNestedConditional(cond.WhenFalse) {
|
|
32
|
+
ctx.Report(stripParens(cond.WhenFalse), "Do not nest ternary expressions.")
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
func hasUnicornNestedConditional(node *shimast.Node) bool {
|
|
37
|
+
expr := stripParens(node)
|
|
38
|
+
return expr != nil && expr.Kind == shimast.KindConditionalExpression
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func init() {
|
|
42
|
+
Register(unicornNoNestedTernary{})
|
|
43
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// unicorn/no-new-array: `new Array(n)` is a sharp edge — with a single
|
|
2
|
+
// numeric argument it allocates a sparse array of length `n`, with
|
|
3
|
+
// anything else it constructs from the arguments. The two readings
|
|
4
|
+
// share one syntax, so the same expression silently switches meaning
|
|
5
|
+
// when its input shape changes. The replacement is an array literal,
|
|
6
|
+
// `Array.from`, or `Array.of`.
|
|
7
|
+
//
|
|
8
|
+
// AST-only and identifier-text-driven: any `NewExpression` whose callee
|
|
9
|
+
// is an `Identifier` named `Array` fires. Shadowed `Array` bindings,
|
|
10
|
+
// argument count, and argument types are not part of the match,
|
|
11
|
+
// mirroring `unicorn/no-new-buffer`.
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-new-array.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
type unicornNoNewArray struct{}
|
|
18
|
+
|
|
19
|
+
func (unicornNoNewArray) Name() string { return "unicorn/no-new-array" }
|
|
20
|
+
func (unicornNoNewArray) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindNewExpression} }
|
|
21
|
+
func (unicornNoNewArray) Check(ctx *Context, node *shimast.Node) {
|
|
22
|
+
ne := node.AsNewExpression()
|
|
23
|
+
if ne != nil && identifierText(ne.Expression) == "Array" {
|
|
24
|
+
ctx.Report(node, "Don't use `new Array(...)` — use an array literal or `Array.from`/`Array.of` instead.")
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
func init() {
|
|
29
|
+
Register(unicornNoNewArray{})
|
|
30
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// unicorn/no-new-buffer: the `new Buffer(...)` constructor was deprecated
|
|
2
|
+
// in Node because its overloads route on argument type at runtime — an
|
|
3
|
+
// integer allocates uninitialized memory, a string decodes bytes, an array
|
|
4
|
+
// copies them — so the same call site silently changes meaning when its
|
|
5
|
+
// input shape changes. The replacement is the explicit `Buffer.from()` /
|
|
6
|
+
// `Buffer.alloc()` pair.
|
|
7
|
+
//
|
|
8
|
+
// AST-only and identifier-text-driven: the rule fires on any `NewExpression`
|
|
9
|
+
// whose callee is an `Identifier` named `Buffer`. Shadowed `Buffer`
|
|
10
|
+
// bindings and import sources are out of scope; argument count and shape
|
|
11
|
+
// are not part of the match, so `new Buffer(10)`, `new Buffer("ascii")`,
|
|
12
|
+
// and `new Buffer([])` all report.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-new-buffer.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornNoNewBuffer struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornNoNewBuffer) Name() string { return "unicorn/no-new-buffer" }
|
|
21
|
+
func (unicornNoNewBuffer) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindNewExpression} }
|
|
22
|
+
func (unicornNoNewBuffer) Check(ctx *Context, node *shimast.Node) {
|
|
23
|
+
ne := node.AsNewExpression()
|
|
24
|
+
if ne != nil && identifierText(ne.Expression) == "Buffer" {
|
|
25
|
+
ctx.Report(node, "`new Buffer()` is deprecated, use `Buffer.from()` or `Buffer.alloc()` instead.")
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
func init() {
|
|
30
|
+
Register(unicornNoNewBuffer{})
|
|
31
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// unicorn/no-null: the bare `null` literal is treated as a code smell —
|
|
2
|
+
// the rule's policy is that `undefined` is the single absent-value token
|
|
3
|
+
// in user code. Every occurrence of the keyword anywhere in the source is
|
|
4
|
+
// flagged so the codebase converges on one convention.
|
|
5
|
+
//
|
|
6
|
+
// AST-only: the engine dispatches once per `NullKeyword` node and the
|
|
7
|
+
// rule reports unconditionally on that node. There is no fixer in this
|
|
8
|
+
// pass — the diagnostic alone is the contract.
|
|
9
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-null.md
|
|
10
|
+
package linthost
|
|
11
|
+
|
|
12
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
13
|
+
|
|
14
|
+
type unicornNoNull struct{}
|
|
15
|
+
|
|
16
|
+
func (unicornNoNull) Name() string { return "unicorn/no-null" }
|
|
17
|
+
func (unicornNoNull) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindNullKeyword} }
|
|
18
|
+
func (unicornNoNull) Check(ctx *Context, node *shimast.Node) {
|
|
19
|
+
ctx.Report(node, "Use `undefined` instead of `null`.")
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
func init() {
|
|
23
|
+
Register(unicornNoNull{})
|
|
24
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// unicorn/no-object-as-default-parameter: writing
|
|
2
|
+
// `function f(opts = { tag: "x" })` ships a hidden default object that
|
|
3
|
+
// is hard to override granularly — callers either supply the whole
|
|
4
|
+
// object or get every default at once, and the option keys are
|
|
5
|
+
// invisible at the call site. Destructuring with per-key defaults
|
|
6
|
+
// (`function f({ tag = "x" } = {})`) is the canonical replacement.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: dispatch on `ParameterDeclaration`. Fire when the parameter
|
|
9
|
+
// has a non-empty object-literal initializer and the parameter name
|
|
10
|
+
// itself is a bare identifier (already-destructured parameters are
|
|
11
|
+
// covered by the destructuring form the rule recommends). Empty
|
|
12
|
+
// objects `param = {}` are out of scope — that pattern is a different
|
|
13
|
+
// rule.
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-object-as-default-parameter.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornNoObjectAsDefaultParameter struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornNoObjectAsDefaultParameter) Name() string {
|
|
22
|
+
return "unicorn/no-object-as-default-parameter"
|
|
23
|
+
}
|
|
24
|
+
func (unicornNoObjectAsDefaultParameter) Visits() []shimast.Kind {
|
|
25
|
+
return []shimast.Kind{shimast.KindParameter}
|
|
26
|
+
}
|
|
27
|
+
func (unicornNoObjectAsDefaultParameter) Check(ctx *Context, node *shimast.Node) {
|
|
28
|
+
param := node.AsParameterDeclaration()
|
|
29
|
+
if param == nil || param.Initializer == nil || param.Name() == nil {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
if param.Name().Kind != shimast.KindIdentifier {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
init := stripParens(param.Initializer)
|
|
36
|
+
if init == nil || init.Kind != shimast.KindObjectLiteralExpression {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
obj := init.AsObjectLiteralExpression()
|
|
40
|
+
if obj == nil || obj.Properties == nil || len(obj.Properties.Nodes) == 0 {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
ctx.Report(node, "Don't use an object literal as a default parameter — destructure the option instead.")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func init() {
|
|
47
|
+
Register(unicornNoObjectAsDefaultParameter{})
|
|
48
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// unicorn/no-process-exit: calling `process.exit(...)` short-circuits the
|
|
2
|
+
// Node runtime before pending I/O, timers, or microtasks drain, which
|
|
3
|
+
// turns ordinary error paths into silent data loss. The rule pushes
|
|
4
|
+
// authors toward throwing or returning a non-zero status so the host
|
|
5
|
+
// process owns the termination decision.
|
|
6
|
+
//
|
|
7
|
+
// AST-only first pass: a `CallExpression` whose callee is a
|
|
8
|
+
// `PropertyAccessExpression` of the literal form `process.exit` fires.
|
|
9
|
+
// Computed access (`process["exit"]`), optional chaining
|
|
10
|
+
// (`process?.exit()`), and shadowed `process` bindings are intentionally
|
|
11
|
+
// out of scope — only the bare callsite is reported.
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-process-exit.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
type unicornNoProcessExit struct{}
|
|
18
|
+
|
|
19
|
+
func (unicornNoProcessExit) Name() string { return "unicorn/no-process-exit" }
|
|
20
|
+
func (unicornNoProcessExit) Visits() []shimast.Kind {
|
|
21
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
22
|
+
}
|
|
23
|
+
func (unicornNoProcessExit) Check(ctx *Context, node *shimast.Node) {
|
|
24
|
+
call := node.AsCallExpression()
|
|
25
|
+
if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
29
|
+
if access == nil {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
if identifierText(access.Expression) != "process" {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
if identifierText(access.Name()) != "exit" {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
ctx.Report(node, "Don't use `process.exit()`. Throw an error or return a non-zero status instead.")
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func init() {
|
|
42
|
+
Register(unicornNoProcessExit{})
|
|
43
|
+
}
|
|
@@ -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
|
+
}
|