@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,133 @@
|
|
|
1
|
+
// camelcase reports declaration names that are neither camelCase nor
|
|
2
|
+
// PascalCase. snake_case bindings are the canonical failure: the
|
|
3
|
+
// underscore between two letters signals a non-JavaScript naming
|
|
4
|
+
// convention and the rule pushes authors back to the language norm.
|
|
5
|
+
// https://eslint.org/docs/latest/rules/camelcase
|
|
6
|
+
//
|
|
7
|
+
// Conservative baseline: only the four declaration kinds the ESLint
|
|
8
|
+
// rule documents as in-scope are inspected — variable, function, class,
|
|
9
|
+
// and parameter declarations. Each is checked through its `Name()`
|
|
10
|
+
// accessor so destructuring patterns and computed property names are
|
|
11
|
+
// skipped automatically (they return non-Identifier nodes). Leading
|
|
12
|
+
// and trailing underscores plus a single all-uppercase form
|
|
13
|
+
// (`MAX_VALUE`) are tolerated because ESLint exempts them too.
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import (
|
|
17
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
type camelcase struct{}
|
|
21
|
+
|
|
22
|
+
func (camelcase) Name() string { return "camelcase" }
|
|
23
|
+
func (camelcase) Visits() []shimast.Kind {
|
|
24
|
+
return []shimast.Kind{
|
|
25
|
+
shimast.KindVariableDeclaration,
|
|
26
|
+
shimast.KindParameter,
|
|
27
|
+
shimast.KindFunctionDeclaration,
|
|
28
|
+
shimast.KindClassDeclaration,
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
func (camelcase) Check(ctx *Context, node *shimast.Node) {
|
|
32
|
+
var nameNode *shimast.Node
|
|
33
|
+
switch node.Kind {
|
|
34
|
+
case shimast.KindVariableDeclaration:
|
|
35
|
+
decl := node.AsVariableDeclaration()
|
|
36
|
+
if decl == nil {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
nameNode = decl.Name()
|
|
40
|
+
case shimast.KindParameter:
|
|
41
|
+
decl := node.AsParameterDeclaration()
|
|
42
|
+
if decl == nil {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
nameNode = decl.Name()
|
|
46
|
+
case shimast.KindFunctionDeclaration:
|
|
47
|
+
decl := node.AsFunctionDeclaration()
|
|
48
|
+
if decl == nil {
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
nameNode = decl.Name()
|
|
52
|
+
case shimast.KindClassDeclaration:
|
|
53
|
+
decl := node.AsClassDeclaration()
|
|
54
|
+
if decl == nil {
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
nameNode = decl.Name()
|
|
58
|
+
}
|
|
59
|
+
name := identifierText(nameNode)
|
|
60
|
+
if name == "" {
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
if isCamelOrPascalCaseName(name) {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
ctx.Report(nameNode, "Identifier '"+name+"' is not in camelCase.")
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// isCamelOrPascalCaseName reports whether `name` matches the convention
|
|
70
|
+
// the rule accepts. The canonical violation is a snake_case binding —
|
|
71
|
+
// an underscore wedged between two letters — so the predicate inspects
|
|
72
|
+
// the trimmed interior of the name. Leading and trailing underscores
|
|
73
|
+
// are stripped first (`_foo`, `foo__`) because ESLint deliberately
|
|
74
|
+
// allows the private-prefix and trailing-underscore conventions. An
|
|
75
|
+
// all-uppercase residue (`MAX_VALUE` → `MAX_VALUE`) is treated as a
|
|
76
|
+
// SCREAMING_SNAKE constant and accepted; everything else with an
|
|
77
|
+
// interior underscore is reported.
|
|
78
|
+
func isCamelOrPascalCaseName(name string) bool {
|
|
79
|
+
if name == "" {
|
|
80
|
+
return true
|
|
81
|
+
}
|
|
82
|
+
trimmed := trimUnderscores(name)
|
|
83
|
+
if trimmed == "" {
|
|
84
|
+
return true
|
|
85
|
+
}
|
|
86
|
+
if !containsUnderscore(trimmed) {
|
|
87
|
+
return true
|
|
88
|
+
}
|
|
89
|
+
return isAllUpperOrUnderscore(trimmed)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
func trimUnderscores(s string) string {
|
|
93
|
+
start, end := 0, len(s)
|
|
94
|
+
for start < end && s[start] == '_' {
|
|
95
|
+
start++
|
|
96
|
+
}
|
|
97
|
+
for end > start && s[end-1] == '_' {
|
|
98
|
+
end--
|
|
99
|
+
}
|
|
100
|
+
return s[start:end]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
func containsUnderscore(s string) bool {
|
|
104
|
+
for i := 0; i < len(s); i++ {
|
|
105
|
+
if s[i] == '_' {
|
|
106
|
+
return true
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return false
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// isAllUpperOrUnderscore returns true when every character is either an
|
|
113
|
+
// uppercase ASCII letter, a digit, or an underscore. Lowercase letters
|
|
114
|
+
// disqualify the string and force the rule to report.
|
|
115
|
+
func isAllUpperOrUnderscore(s string) bool {
|
|
116
|
+
hasUpper := false
|
|
117
|
+
for i := 0; i < len(s); i++ {
|
|
118
|
+
ch := s[i]
|
|
119
|
+
switch {
|
|
120
|
+
case ch >= 'A' && ch <= 'Z':
|
|
121
|
+
hasUpper = true
|
|
122
|
+
case ch >= '0' && ch <= '9':
|
|
123
|
+
case ch == '_':
|
|
124
|
+
default:
|
|
125
|
+
return false
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return hasUpper
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
func init() {
|
|
132
|
+
Register(camelcase{})
|
|
133
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// complexity: a function whose cyclomatic complexity exceeds the
|
|
2
|
+
// configured limit is almost always doing more than one job — every
|
|
3
|
+
// branching point doubles the number of paths a reader (and a test
|
|
4
|
+
// suite) has to keep in mind. ESLint's default is `{ max: 20 }`, which
|
|
5
|
+
// @ttsc/lint mirrors as the only built-in threshold (option-decoding is
|
|
6
|
+
// deferred). The metric starts at 1 for the function entry path and
|
|
7
|
+
// then adds 1 for each branching construct inside the body:
|
|
8
|
+
// - `if` (each `else if` parses as a nested IfStatement, so it is
|
|
9
|
+
// counted by the same arm),
|
|
10
|
+
// - `case` clauses inside `switch`,
|
|
11
|
+
// - `catch` clauses on `try`,
|
|
12
|
+
// - ternary (`?:`) expressions,
|
|
13
|
+
// - short-circuit operators `&&`, `||`, `??`.
|
|
14
|
+
// Nested function-likes start their own complexity counter and are
|
|
15
|
+
// visited independently, so an inner closure's branches do not
|
|
16
|
+
// inflate the outer function's score.
|
|
17
|
+
// https://eslint.org/docs/latest/rules/complexity
|
|
18
|
+
package linthost
|
|
19
|
+
|
|
20
|
+
import (
|
|
21
|
+
"fmt"
|
|
22
|
+
|
|
23
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
// complexityLimit is the cyclomatic-complexity ceiling. Above this
|
|
27
|
+
// value the rule fires. Mirrors the ESLint default of 20.
|
|
28
|
+
const complexityLimit = 20
|
|
29
|
+
|
|
30
|
+
type complexity struct{}
|
|
31
|
+
|
|
32
|
+
func (complexity) Name() string { return "complexity" }
|
|
33
|
+
func (complexity) Visits() []shimast.Kind {
|
|
34
|
+
return []shimast.Kind{
|
|
35
|
+
shimast.KindFunctionDeclaration,
|
|
36
|
+
shimast.KindFunctionExpression,
|
|
37
|
+
shimast.KindArrowFunction,
|
|
38
|
+
shimast.KindMethodDeclaration,
|
|
39
|
+
shimast.KindGetAccessor,
|
|
40
|
+
shimast.KindSetAccessor,
|
|
41
|
+
shimast.KindConstructor,
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
func (complexity) Check(ctx *Context, node *shimast.Node) {
|
|
45
|
+
if node == nil {
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
body := node.Body()
|
|
49
|
+
if body == nil || body.Kind != shimast.KindBlock {
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
score := 1
|
|
53
|
+
walkComplexityBody(body, node, &score)
|
|
54
|
+
if score > complexityLimit {
|
|
55
|
+
ctx.Report(node, fmt.Sprintf("Function has a complexity of %d. Maximum allowed is %d.", score, complexityLimit))
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// walkComplexityBody descends through `root` adding 1 to `score` at
|
|
60
|
+
// every branching construct without crossing nested function-like
|
|
61
|
+
// scopes. Each nested function is left for its own visit.
|
|
62
|
+
func walkComplexityBody(node *shimast.Node, fn *shimast.Node, score *int) {
|
|
63
|
+
if node == nil {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
if node != fn && isFunctionLikeKind(node) {
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
switch node.Kind {
|
|
70
|
+
case shimast.KindIfStatement,
|
|
71
|
+
shimast.KindCaseClause,
|
|
72
|
+
shimast.KindCatchClause,
|
|
73
|
+
shimast.KindConditionalExpression:
|
|
74
|
+
*score++
|
|
75
|
+
case shimast.KindBinaryExpression:
|
|
76
|
+
bin := node.AsBinaryExpression()
|
|
77
|
+
if bin != nil && bin.OperatorToken != nil {
|
|
78
|
+
switch bin.OperatorToken.Kind {
|
|
79
|
+
case shimast.KindAmpersandAmpersandToken,
|
|
80
|
+
shimast.KindBarBarToken,
|
|
81
|
+
shimast.KindQuestionQuestionToken:
|
|
82
|
+
*score++
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
node.ForEachChild(func(child *shimast.Node) bool {
|
|
87
|
+
walkComplexityBody(child, fn, score)
|
|
88
|
+
return false
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
func init() {
|
|
93
|
+
Register(complexity{})
|
|
94
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// consistentReturn reports a function whose `return` statements
|
|
2
|
+
// disagree on shape: at least one `return X;` carries a value and at
|
|
3
|
+
// least one bare `return;` (or implicit fall-through from the body)
|
|
4
|
+
// returns nothing. The resulting `T | undefined` return shape almost
|
|
5
|
+
// always indicates a missed branch — readers expect every caller to
|
|
6
|
+
// receive `T`, but a path leaks `undefined`.
|
|
7
|
+
// https://eslint.org/docs/latest/rules/consistent-return
|
|
8
|
+
//
|
|
9
|
+
// Conservative baseline: the walk stops at nested function-like
|
|
10
|
+
// boundaries so an inner closure's `return` does not get attributed
|
|
11
|
+
// to the surrounding function. Constructors are excluded — the
|
|
12
|
+
// language semantics of `return` inside `new`-invoked constructors
|
|
13
|
+
// are governed by `no-constructor-return` instead. Arrow functions
|
|
14
|
+
// with concise (expression-body) form are also excluded because they
|
|
15
|
+
// implicitly return their expression and have no `return` statement
|
|
16
|
+
// to disagree with.
|
|
17
|
+
package linthost
|
|
18
|
+
|
|
19
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
20
|
+
|
|
21
|
+
type consistentReturn struct{}
|
|
22
|
+
|
|
23
|
+
func (consistentReturn) Name() string { return "consistent-return" }
|
|
24
|
+
func (consistentReturn) Visits() []shimast.Kind {
|
|
25
|
+
return []shimast.Kind{
|
|
26
|
+
shimast.KindFunctionDeclaration,
|
|
27
|
+
shimast.KindFunctionExpression,
|
|
28
|
+
shimast.KindArrowFunction,
|
|
29
|
+
shimast.KindMethodDeclaration,
|
|
30
|
+
shimast.KindGetAccessor,
|
|
31
|
+
shimast.KindSetAccessor,
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
func (consistentReturn) Check(ctx *Context, node *shimast.Node) {
|
|
35
|
+
body := node.Body()
|
|
36
|
+
if body == nil || body.Kind != shimast.KindBlock {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
withValue := false
|
|
40
|
+
withoutValue := false
|
|
41
|
+
walkConsistentReturnBody(body, func(ret *shimast.Node) {
|
|
42
|
+
stmt := ret.AsReturnStatement()
|
|
43
|
+
if stmt == nil {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
if stmt.Expression != nil {
|
|
47
|
+
withValue = true
|
|
48
|
+
} else {
|
|
49
|
+
withoutValue = true
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
if withValue && withoutValue {
|
|
53
|
+
ctx.Report(node, "Function expected to either always or never specify a return value.")
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
// A function that returns a value on at least one path but can
|
|
57
|
+
// also fall through the end of its block leaks an implicit
|
|
58
|
+
// `undefined`. Flag it the same as the explicit mix above.
|
|
59
|
+
if withValue && !blockAlwaysExits(body) {
|
|
60
|
+
ctx.Report(node, "Function expected to either always or never specify a return value.")
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// walkConsistentReturnBody visits every `return` statement inside
|
|
65
|
+
// `root` without crossing nested function-like scopes. Nested
|
|
66
|
+
// function-likes report their own returns through their own visit.
|
|
67
|
+
func walkConsistentReturnBody(root *shimast.Node, visit func(*shimast.Node)) {
|
|
68
|
+
if root == nil {
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
var walk func(*shimast.Node)
|
|
72
|
+
walk = func(n *shimast.Node) {
|
|
73
|
+
if n == nil {
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
if n != root && isFunctionLikeKind(n) {
|
|
77
|
+
return
|
|
78
|
+
}
|
|
79
|
+
if n.Kind == shimast.KindReturnStatement {
|
|
80
|
+
visit(n)
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
n.ForEachChild(func(child *shimast.Node) bool {
|
|
84
|
+
walk(child)
|
|
85
|
+
return false
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
walk(root)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// blockAlwaysExits reports whether a function-body block can never
|
|
92
|
+
// fall off its end — every reachable path terminates with `return`,
|
|
93
|
+
// `throw`, or a nested block / `if` whose branches all terminate.
|
|
94
|
+
// Mirrors the shallow approximation `getter-return` uses.
|
|
95
|
+
func blockAlwaysExits(body *shimast.Node) bool {
|
|
96
|
+
if body == nil || body.Kind != shimast.KindBlock {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
stmts := body.Statements()
|
|
100
|
+
if len(stmts) == 0 {
|
|
101
|
+
return false
|
|
102
|
+
}
|
|
103
|
+
return statementAlwaysExits(stmts[len(stmts)-1])
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// statementAlwaysExits reports whether `stmt` cannot fall through to
|
|
107
|
+
// the next statement: a `return`, a `throw`, a block ending in either
|
|
108
|
+
// of those, or an `if` whose branches both terminate.
|
|
109
|
+
func statementAlwaysExits(stmt *shimast.Node) bool {
|
|
110
|
+
if stmt == nil {
|
|
111
|
+
return false
|
|
112
|
+
}
|
|
113
|
+
switch stmt.Kind {
|
|
114
|
+
case shimast.KindReturnStatement, shimast.KindThrowStatement:
|
|
115
|
+
return true
|
|
116
|
+
case shimast.KindBlock:
|
|
117
|
+
return blockAlwaysExits(stmt)
|
|
118
|
+
case shimast.KindIfStatement:
|
|
119
|
+
ifStmt := stmt.AsIfStatement()
|
|
120
|
+
if ifStmt == nil || ifStmt.ThenStatement == nil || ifStmt.ElseStatement == nil {
|
|
121
|
+
return false
|
|
122
|
+
}
|
|
123
|
+
return statementAlwaysExits(ifStmt.ThenStatement) && statementAlwaysExits(ifStmt.ElseStatement)
|
|
124
|
+
}
|
|
125
|
+
return false
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
func init() {
|
|
129
|
+
Register(consistentReturn{})
|
|
130
|
+
}
|
|
@@ -2,7 +2,7 @@ package linthost
|
|
|
2
2
|
|
|
3
3
|
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
4
4
|
|
|
5
|
-
//
|
|
5
|
+
// noConsole: forbid `console.*` calls. This implementation models the
|
|
6
6
|
// default rule shape and flags every console method.
|
|
7
7
|
// https://eslint.org/docs/latest/rules/no-console
|
|
8
8
|
type noConsole struct{}
|