@ttsc/lint 0.13.0 → 0.14.0-dev.20260528
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 +60 -37
- 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/compile.go +33 -2
- 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 +160 -40
- package/linthost/fix.go +2 -2
- package/linthost/flags_gen.go +17 -15
- package/linthost/host.go +40 -3
- 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 +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 +11 -8
- package/src/index.ts +65 -43
- 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,51 @@
|
|
|
1
|
+
// unicorn/no-invalid-remove-event-listener: passing a fresh function
|
|
2
|
+
// literal to `removeEventListener` is a no-op because event-target
|
|
3
|
+
// internals match listeners by reference identity. The handler that was
|
|
4
|
+
// originally registered still fires; the call silently does nothing.
|
|
5
|
+
//
|
|
6
|
+
// AST-only: visit each `CallExpression`, match when the callee is a
|
|
7
|
+
// `PropertyAccessExpression(_, removeEventListener)` and the second
|
|
8
|
+
// argument (after stripping parens) is a fresh arrow function or
|
|
9
|
+
// function expression. Fire on the call so the diagnostic lands at the
|
|
10
|
+
// no-op site.
|
|
11
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-remove-event-listener.md
|
|
12
|
+
package linthost
|
|
13
|
+
|
|
14
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
15
|
+
|
|
16
|
+
type unicornNoInvalidRemoveEventListener struct{}
|
|
17
|
+
|
|
18
|
+
func (unicornNoInvalidRemoveEventListener) Name() string {
|
|
19
|
+
return "unicorn/no-invalid-remove-event-listener"
|
|
20
|
+
}
|
|
21
|
+
func (unicornNoInvalidRemoveEventListener) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornNoInvalidRemoveEventListener) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
call := node.AsCallExpression()
|
|
26
|
+
if call == nil || call.Expression == nil {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
if call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
33
|
+
if access == nil || identifierText(access.Name()) != "removeEventListener" {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) < 2 {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
handler := stripParens(call.Arguments.Nodes[1])
|
|
40
|
+
if handler == nil {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
switch handler.Kind {
|
|
44
|
+
case shimast.KindArrowFunction, shimast.KindFunctionExpression:
|
|
45
|
+
ctx.Report(node, "Calling `removeEventListener` with a fresh function reference removes nothing — store and reuse the handler.")
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func init() {
|
|
50
|
+
Register(unicornNoInvalidRemoveEventListener{})
|
|
51
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// unicorn/no-keyword-prefix: identifiers like `newFoo` or `classBar`
|
|
2
|
+
// embed a reserved word at the prefix position so the reader has to
|
|
3
|
+
// re-parse the identifier each time. The rule discourages the prefix in
|
|
4
|
+
// declarations so the codebase converges on names whose first segment
|
|
5
|
+
// is not a JavaScript keyword.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit every `Identifier` and fire only on declaration
|
|
8
|
+
// positions (parameter, variable, function, class, method, accessor,
|
|
9
|
+
// property, binding-element names). Reads of an already-named binding
|
|
10
|
+
// are NOT flagged — the diagnostic is anchored on the declaration so
|
|
11
|
+
// the rename happens once. Uses the same value-position-gate logic as
|
|
12
|
+
// `prefer-global-this`, inverted: this rule needs the identifier to be
|
|
13
|
+
// in a *name* slot, not a value-expression slot.
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-keyword-prefix.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornNoKeywordPrefix struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornNoKeywordPrefix) Name() string { return "unicorn/no-keyword-prefix" }
|
|
22
|
+
func (unicornNoKeywordPrefix) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindIdentifier}
|
|
24
|
+
}
|
|
25
|
+
func (unicornNoKeywordPrefix) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
name := identifierText(node)
|
|
27
|
+
if !hasKeywordPrefix(name) {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
if !isUnicornDeclarationPositionIdentifier(node) {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
ctx.Report(node, "Don't prefix identifiers with a reserved word (`new` / `class`).")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// hasKeywordPrefix reports whether `name` starts with `new` or `class`
|
|
37
|
+
// followed by an uppercase ASCII letter. The case-sensitive prefix +
|
|
38
|
+
// the uppercase next letter together pin the camelCase pattern the rule
|
|
39
|
+
// targets (`newFoo`, `classBar`); plain words like `news` or `classic`
|
|
40
|
+
// share the prefix bytes but not the camelCase break and are out of
|
|
41
|
+
// scope.
|
|
42
|
+
func hasKeywordPrefix(name string) bool {
|
|
43
|
+
for _, prefix := range []string{"new", "class"} {
|
|
44
|
+
if len(name) <= len(prefix) {
|
|
45
|
+
continue
|
|
46
|
+
}
|
|
47
|
+
if name[:len(prefix)] != prefix {
|
|
48
|
+
continue
|
|
49
|
+
}
|
|
50
|
+
next := name[len(prefix)]
|
|
51
|
+
if next >= 'A' && next <= 'Z' {
|
|
52
|
+
return true
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return false
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// isUnicornDeclarationPositionIdentifier reports whether `node` (a bare
|
|
59
|
+
// Identifier) appears as a *name* slot of a declaration, i.e. the slot
|
|
60
|
+
// reserved by the language for introducing a new binding. Reads,
|
|
61
|
+
// property keys on accesses, type references, and labels are filtered
|
|
62
|
+
// out so the rule only fires on declarations.
|
|
63
|
+
func isUnicornDeclarationPositionIdentifier(node *shimast.Node) bool {
|
|
64
|
+
if node == nil || node.Kind != shimast.KindIdentifier || node.Parent == nil {
|
|
65
|
+
return false
|
|
66
|
+
}
|
|
67
|
+
parent := node.Parent
|
|
68
|
+
switch parent.Kind {
|
|
69
|
+
case shimast.KindVariableDeclaration:
|
|
70
|
+
decl := parent.AsVariableDeclaration()
|
|
71
|
+
return decl != nil && decl.Name() == node
|
|
72
|
+
case shimast.KindBindingElement:
|
|
73
|
+
elem := parent.AsBindingElement()
|
|
74
|
+
return elem != nil && elem.Name() == node
|
|
75
|
+
case shimast.KindParameter:
|
|
76
|
+
param := parent.AsParameterDeclaration()
|
|
77
|
+
return param != nil && param.Name() == node
|
|
78
|
+
case shimast.KindFunctionDeclaration:
|
|
79
|
+
fn := parent.AsFunctionDeclaration()
|
|
80
|
+
return fn != nil && fn.Name() == node
|
|
81
|
+
case shimast.KindFunctionExpression:
|
|
82
|
+
fn := parent.AsFunctionExpression()
|
|
83
|
+
return fn != nil && fn.Name() == node
|
|
84
|
+
case shimast.KindClassDeclaration:
|
|
85
|
+
cls := parent.AsClassDeclaration()
|
|
86
|
+
return cls != nil && cls.Name() == node
|
|
87
|
+
case shimast.KindClassExpression:
|
|
88
|
+
cls := parent.AsClassExpression()
|
|
89
|
+
return cls != nil && cls.Name() == node
|
|
90
|
+
case shimast.KindMethodDeclaration,
|
|
91
|
+
shimast.KindGetAccessor,
|
|
92
|
+
shimast.KindSetAccessor,
|
|
93
|
+
shimast.KindPropertyDeclaration:
|
|
94
|
+
return true
|
|
95
|
+
}
|
|
96
|
+
return false
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
func init() {
|
|
100
|
+
Register(unicornNoKeywordPrefix{})
|
|
101
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// unicorn/no-lonely-if: `else { if (cond) { … } }` collapses to
|
|
2
|
+
// `else if (cond) { … }`. Wrapping a single `if` in an `else` block
|
|
3
|
+
// adds an extra brace pair and an extra indentation level without
|
|
4
|
+
// changing semantics, so the rule flags it as redundant punctuation.
|
|
5
|
+
//
|
|
6
|
+
// AST-only and parent-walking: visit every `IfStatement`, then check
|
|
7
|
+
// whether its parent is a `Block` containing exactly this one
|
|
8
|
+
// statement AND that block is the `ElseStatement` of an outer
|
|
9
|
+
// `IfStatement`. Mirrors the core `no-lonely-if` rule shape.
|
|
10
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-lonely-if.md
|
|
11
|
+
package linthost
|
|
12
|
+
|
|
13
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
14
|
+
|
|
15
|
+
type unicornNoLonelyIf struct{}
|
|
16
|
+
|
|
17
|
+
func (unicornNoLonelyIf) Name() string { return "unicorn/no-lonely-if" }
|
|
18
|
+
func (unicornNoLonelyIf) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindIfStatement} }
|
|
19
|
+
func (unicornNoLonelyIf) Check(ctx *Context, node *shimast.Node) {
|
|
20
|
+
parent := node.Parent
|
|
21
|
+
if parent == nil || parent.Kind != shimast.KindBlock {
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
block := parent.AsBlock()
|
|
25
|
+
if block == nil || block.Statements == nil {
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
if len(block.Statements.Nodes) != 1 {
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
grand := parent.Parent
|
|
32
|
+
if grand == nil || grand.Kind != shimast.KindIfStatement {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
gif := grand.AsIfStatement()
|
|
36
|
+
if gif == nil || gif.ElseStatement != parent {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
ctx.Report(node, "Use `else if` instead of an `if` as the only statement inside an `else` block.")
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
func init() {
|
|
43
|
+
Register(unicornNoLonelyIf{})
|
|
44
|
+
}
|
|
@@ -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
|
+
}
|