@ttsc/lint 0.13.1 → 0.14.0-dev.20260528.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +948 -69
- package/lib/defaultFormat.d.ts +9 -6
- package/lib/defaultFormat.js +9 -6
- package/lib/defaultFormat.js.map +1 -1
- package/lib/index.d.ts +46 -0
- package/lib/index.js +35 -10
- package/lib/index.js.map +1 -1
- package/lib/structures/ITtscLintConfig.d.ts +12 -6
- package/lib/structures/{ITtscLintFormatConfig.d.ts → ITtscLintFormat.d.ts} +2 -2
- package/lib/structures/{TtscLintRuleMap.js → ITtscLintFormat.js} +1 -1
- package/lib/structures/ITtscLintFormat.js.map +1 -0
- package/lib/structures/TtscLintRuleSetting.d.ts +49 -0
- package/lib/structures/{TtscLintRuleOptions.js → TtscLintRuleSetting.js} +1 -1
- package/lib/structures/TtscLintRuleSetting.js.map +1 -0
- package/lib/structures/index.d.ts +3 -4
- package/lib/structures/index.js +3 -4
- package/lib/structures/index.js.map +1 -1
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +104 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +14 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +79 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.js +3 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintContributorRules.d.ts +17 -0
- package/lib/structures/rules/ITtscLintContributorRules.js +3 -0
- package/lib/structures/rules/ITtscLintContributorRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintCoreRules.d.ts +1257 -0
- package/lib/structures/{ITtscLintFormatConfig.js → rules/ITtscLintCoreRules.js} +1 -1
- package/lib/structures/rules/ITtscLintCoreRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +17 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js +10 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintCypressRules.d.ts +129 -0
- package/lib/structures/rules/ITtscLintCypressRules.js +3 -0
- package/lib/structures/rules/ITtscLintCypressRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +157 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +13 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +167 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.js +3 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJestRules.d.ts +201 -0
- package/lib/structures/rules/ITtscLintJestRules.js +3 -0
- package/lib/structures/rules/ITtscLintJestRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJsdocRules.d.ts +140 -0
- package/lib/structures/rules/ITtscLintJsdocRules.js +3 -0
- package/lib/structures/rules/ITtscLintJsdocRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +302 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.js +3 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintNextjsRules.d.ts +185 -0
- package/lib/structures/rules/ITtscLintNextjsRules.js +3 -0
- package/lib/structures/rules/ITtscLintNextjsRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +330 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.js +3 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintPromiseRules.d.ts +188 -0
- package/lib/structures/rules/ITtscLintPromiseRules.js +3 -0
- package/lib/structures/rules/ITtscLintPromiseRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +18 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js +8 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +51 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.js +3 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +39 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js +12 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactRules.d.ts +289 -0
- package/lib/structures/rules/ITtscLintReactRules.js +3 -0
- package/lib/structures/rules/ITtscLintReactRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintRegexpRules.d.ts +190 -0
- package/lib/structures/rules/ITtscLintRegexpRules.js +3 -0
- package/lib/structures/rules/ITtscLintRegexpRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +66 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.js +3 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.js.map +1 -0
- package/lib/structures/rules/ITtscLintRules.d.ts +55 -0
- package/lib/structures/{TtscLintRule.js → rules/ITtscLintRules.js} +1 -1
- package/lib/structures/rules/ITtscLintRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintSecurityRules.d.ts +148 -0
- package/lib/structures/rules/ITtscLintSecurityRules.js +3 -0
- package/lib/structures/rules/ITtscLintSecurityRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintSolidRules.d.ts +181 -0
- package/lib/structures/rules/ITtscLintSolidRules.js +3 -0
- package/lib/structures/rules/ITtscLintSolidRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +21 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.js +9 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintStorybookRules.d.ts +174 -0
- package/lib/structures/rules/ITtscLintStorybookRules.js +3 -0
- package/lib/structures/rules/ITtscLintStorybookRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +94 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.js +3 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +22 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js +10 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +310 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.js +3 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +1132 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.js +3 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintUnicornRules.d.ts +997 -0
- package/lib/structures/rules/ITtscLintUnicornRules.js +3 -0
- package/lib/structures/rules/ITtscLintUnicornRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintVitestRules.d.ts +141 -0
- package/lib/structures/rules/ITtscLintVitestRules.js +3 -0
- package/lib/structures/rules/ITtscLintVitestRules.js.map +1 -0
- package/lib/structures/rules/index.d.ts +31 -0
- package/lib/structures/rules/index.js +48 -0
- package/lib/structures/rules/index.js.map +1 -0
- package/linthost/ast_helpers.go +30 -5
- package/linthost/config.go +48 -17
- package/linthost/config_format.go +9 -9
- package/linthost/directives.go +67 -25
- package/linthost/dispatch.go +14 -3
- package/linthost/engine.go +152 -31
- package/linthost/fix.go +2 -2
- package/linthost/lsp.go +747 -0
- package/linthost/print_dispatch.go +2 -2
- package/linthost/print_nodes_function.go +2 -2
- package/linthost/print_nodes_object.go +1 -1
- package/linthost/rule_names.go +14 -0
- package/linthost/rules_arrays.go +2 -2
- package/linthost/rules_boundaries.go +532 -0
- package/linthost/rules_camelcase.go +133 -0
- package/linthost/rules_complexity.go +94 -0
- package/linthost/rules_consistent_return.go +130 -0
- package/linthost/rules_console.go +1 -1
- package/linthost/rules_core_extra.go +739 -0
- package/linthost/rules_curly.go +70 -0
- package/linthost/rules_cypress.go +608 -0
- package/linthost/rules_debugger.go +2 -2
- package/linthost/rules_default_case.go +39 -0
- package/linthost/rules_default_case_last.go +46 -0
- package/linthost/rules_dupes.go +3 -3
- package/linthost/rules_empty.go +3 -3
- package/linthost/rules_escape.go +44 -24
- package/linthost/rules_eval.go +2 -2
- package/linthost/rules_finally.go +2 -2
- package/linthost/rules_format_jsdoc.go +1 -1
- package/linthost/rules_format_print_width.go +9 -9
- package/linthost/rules_format_quotes.go +1 -1
- package/linthost/rules_format_semi.go +1 -1
- package/linthost/rules_format_sort_imports.go +1 -1
- package/linthost/rules_format_trailing_comma.go +1 -1
- package/linthost/rules_functional.go +967 -0
- package/linthost/rules_gap.go +24 -45
- package/linthost/rules_grouped_accessor_pairs.go +87 -0
- package/linthost/rules_guard_for_in.go +198 -0
- package/linthost/rules_id_length.go +77 -0
- package/linthost/rules_imports.go +70 -2
- package/linthost/rules_init_declarations.go +53 -0
- package/linthost/rules_jest.go +618 -0
- package/linthost/rules_jsdoc.go +502 -0
- package/linthost/rules_jsx_a11y.go +1264 -0
- package/linthost/rules_logic.go +12 -12
- package/linthost/rules_loops.go +1 -1
- package/linthost/rules_max_classes_per_file.go +58 -0
- package/linthost/rules_max_depth.go +83 -0
- package/linthost/rules_max_lines.go +101 -0
- package/linthost/rules_max_lines_per_function.go +57 -0
- package/linthost/rules_max_nested_callbacks.go +61 -0
- package/linthost/rules_max_params.go +49 -0
- package/linthost/rules_max_statements.go +59 -0
- package/linthost/rules_misc.go +1 -1
- package/linthost/rules_nextjs.go +697 -0
- package/linthost/rules_no_else_return.go +75 -0
- package/linthost/rules_no_empty_named_blocks.go +91 -0
- package/linthost/rules_no_extend_native.go +51 -0
- package/linthost/rules_no_import_assign.go +140 -0
- package/linthost/rules_no_invalid_this.go +52 -0
- package/linthost/rules_no_loop_func.go +85 -0
- package/linthost/rules_no_magic_numbers.go +123 -0
- package/linthost/rules_no_mixed_operators.go +80 -0
- package/linthost/rules_no_param_reassign.go +98 -0
- package/linthost/rules_no_redeclare.go +270 -0
- package/linthost/rules_no_restricted_imports.go +105 -0
- package/linthost/rules_no_restricted_syntax.go +49 -0
- package/linthost/rules_no_shadow.go +147 -0
- package/linthost/rules_no_unreachable.go +77 -0
- package/linthost/rules_no_useless_assignment.go +120 -0
- package/linthost/rules_no_useless_constructor.go +245 -0
- package/linthost/rules_no_useless_return.go +51 -0
- package/linthost/rules_params.go +1 -1
- package/linthost/rules_playwright.go +788 -0
- package/linthost/rules_prefer_arrow_callback.go +124 -0
- package/linthost/rules_prefer_destructuring.go +98 -0
- package/linthost/rules_prefer_named_capture_group.go +129 -0
- package/linthost/rules_prefer_rest_params.go +94 -0
- package/linthost/rules_problems.go +41 -30
- package/linthost/rules_promise.go +1128 -73
- package/linthost/rules_protos.go +2 -2
- package/linthost/rules_react.go +773 -0
- package/linthost/rules_react_extras.go +227 -0
- package/linthost/rules_react_hooks.go +848 -0
- package/linthost/rules_react_perf.go +293 -0
- package/linthost/rules_react_refresh.go +583 -0
- package/linthost/rules_regexp.go +410 -0
- package/linthost/rules_security.go +830 -0
- package/linthost/rules_self.go +2 -2
- package/linthost/rules_solid.go +1073 -0
- package/linthost/rules_sort_imports.go +69 -0
- package/linthost/rules_sort_keys.go +134 -0
- package/linthost/rules_storybook.go +1176 -0
- package/linthost/rules_strings.go +4 -4
- package/linthost/rules_suggestions.go +38 -38
- package/linthost/rules_tanstack_query.go +844 -0
- package/linthost/rules_testing_library.go +1204 -0
- package/linthost/rules_throw.go +1 -1
- package/linthost/rules_ts.go +19 -19
- package/linthost/rules_ts_async.go +399 -0
- package/linthost/rules_ts_class_literal_property_style.go +115 -0
- package/linthost/rules_ts_consistent_type_exports.go +256 -0
- package/linthost/rules_ts_explicit_function_return_type.go +67 -0
- package/linthost/rules_ts_extra.go +155 -36
- package/linthost/rules_ts_no_base_to_string.go +218 -0
- package/linthost/rules_ts_no_confusing_void.go +72 -0
- package/linthost/rules_ts_no_deprecated.go +195 -0
- package/linthost/rules_ts_no_for_in_array.go +84 -0
- package/linthost/rules_ts_no_magic_numbers.go +124 -0
- package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
- package/linthost/rules_ts_no_misused_spread.go +104 -0
- package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
- package/linthost/rules_ts_no_restricted_types.go +62 -0
- package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
- package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
- package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
- package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
- package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
- package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
- package/linthost/rules_ts_no_unsafe_argument.go +82 -0
- package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
- package/linthost/rules_ts_no_unsafe_call.go +82 -0
- package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
- package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
- package/linthost/rules_ts_no_unsafe_return.go +126 -0
- package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
- package/linthost/rules_ts_no_useless_constructor.go +52 -0
- package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
- package/linthost/rules_ts_parameter_properties.go +38 -0
- package/linthost/rules_ts_prefer_find.go +178 -0
- package/linthost/rules_ts_prefer_includes.go +255 -0
- package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
- package/linthost/rules_ts_prefer_optional_chain.go +228 -0
- package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
- package/linthost/rules_ts_prefer_readonly.go +73 -0
- package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
- package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
- package/linthost/rules_ts_prefer_return_this_type.go +135 -0
- package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
- package/linthost/rules_ts_promise_function_async.go +77 -0
- package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
- package/linthost/rules_ts_require_array_sort_compare.go +96 -0
- package/linthost/rules_ts_restrict_plus_operands.go +127 -0
- package/linthost/rules_ts_restrict_template_expressions.go +95 -0
- package/linthost/rules_ts_simple.go +387 -0
- package/linthost/rules_ts_sort_type_constituents.go +144 -0
- package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
- package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
- package/linthost/rules_ts_unbound_method.go +126 -0
- package/linthost/rules_tsdoc.go +136 -0
- package/linthost/rules_unicorn_better_regex.go +27 -0
- package/linthost/rules_unicorn_catch_error_name.go +46 -0
- package/linthost/rules_unicorn_consistent_assert.go +47 -0
- package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
- package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
- package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
- package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
- package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
- package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
- package/linthost/rules_unicorn_custom_error_definition.go +138 -0
- package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
- package/linthost/rules_unicorn_error_message.go +64 -0
- package/linthost/rules_unicorn_escape_case.go +51 -0
- package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
- package/linthost/rules_unicorn_explicit_length_check.go +88 -0
- package/linthost/rules_unicorn_filename_case.go +29 -0
- package/linthost/rules_unicorn_import_style.go +28 -0
- package/linthost/rules_unicorn_isolated_functions.go +29 -0
- package/linthost/rules_unicorn_new_for_builtins.go +87 -0
- package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
- package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
- package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
- package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
- package/linthost/rules_unicorn_no_array_for_each.go +40 -0
- package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
- package/linthost/rules_unicorn_no_array_reduce.go +41 -0
- package/linthost/rules_unicorn_no_array_reverse.go +44 -0
- package/linthost/rules_unicorn_no_array_sort.go +43 -0
- package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
- package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
- package/linthost/rules_unicorn_no_console_spaces.go +61 -0
- package/linthost/rules_unicorn_no_document_cookie.go +41 -0
- package/linthost/rules_unicorn_no_empty_file.go +44 -0
- package/linthost/rules_unicorn_no_for_loop.go +102 -0
- package/linthost/rules_unicorn_no_hex_escape.go +42 -0
- package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
- package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
- package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
- package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
- package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
- package/linthost/rules_unicorn_no_lonely_if.go +44 -0
- package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
- package/linthost/rules_unicorn_no_named_default.go +54 -0
- package/linthost/rules_unicorn_no_negated_condition.go +85 -0
- package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
- package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
- package/linthost/rules_unicorn_no_new_array.go +30 -0
- package/linthost/rules_unicorn_no_new_buffer.go +31 -0
- package/linthost/rules_unicorn_no_null.go +24 -0
- package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
- package/linthost/rules_unicorn_no_process_exit.go +43 -0
- package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
- package/linthost/rules_unicorn_no_static_only_class.go +56 -0
- package/linthost/rules_unicorn_no_thenable.go +74 -0
- package/linthost/rules_unicorn_no_this_assignment.go +35 -0
- package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
- package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
- package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
- package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
- package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
- package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
- package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
- package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
- package/linthost/rules_unicorn_no_unused_properties.go +30 -0
- package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
- package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
- package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
- package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
- package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
- package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
- package/linthost/rules_unicorn_no_useless_spread.go +67 -0
- package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
- package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
- package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
- package/linthost/rules_unicorn_number_literal_case.go +69 -0
- package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
- package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
- package/linthost/rules_unicorn_prefer_array_find.go +51 -0
- package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
- package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
- package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
- package/linthost/rules_unicorn_prefer_array_some.go +67 -0
- package/linthost/rules_unicorn_prefer_at.go +77 -0
- package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
- package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
- package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
- package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
- package/linthost/rules_unicorn_prefer_code_point.go +49 -0
- package/linthost/rules_unicorn_prefer_date_now.go +78 -0
- package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
- package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
- package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
- package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
- package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
- package/linthost/rules_unicorn_prefer_event_target.go +36 -0
- package/linthost/rules_unicorn_prefer_export_from.go +129 -0
- package/linthost/rules_unicorn_prefer_global_this.go +127 -0
- package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
- package/linthost/rules_unicorn_prefer_includes.go +149 -0
- package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
- package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
- package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
- package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
- package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
- package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
- package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
- package/linthost/rules_unicorn_prefer_module.go +50 -0
- package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
- package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
- package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
- package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
- package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
- package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
- package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
- package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
- package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
- package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
- package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
- package/linthost/rules_unicorn_prefer_set_has.go +42 -0
- package/linthost/rules_unicorn_prefer_set_size.go +48 -0
- package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
- package/linthost/rules_unicorn_prefer_single_call.go +96 -0
- package/linthost/rules_unicorn_prefer_spread.go +51 -0
- package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
- package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
- package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
- package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
- package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
- package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
- package/linthost/rules_unicorn_prefer_switch.go +103 -0
- package/linthost/rules_unicorn_prefer_ternary.go +71 -0
- package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
- package/linthost/rules_unicorn_prefer_type_error.go +127 -0
- package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
- package/linthost/rules_unicorn_relative_url_style.go +49 -0
- package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
- package/linthost/rules_unicorn_require_module_attributes.go +54 -0
- package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
- package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
- package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
- package/linthost/rules_unicorn_string_content.go +27 -0
- package/linthost/rules_unicorn_switch_case_braces.go +42 -0
- package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
- package/linthost/rules_unicorn_template_indent.go +28 -0
- package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
- package/linthost/rules_unicorn_throw_new_error.go +61 -0
- package/linthost/rules_var.go +4 -4
- package/linthost/rules_vitest.go +568 -0
- package/package.json +3 -3
- package/plugin/main.go +49 -3
- package/rule/astutil/astutil.go +10 -3
- package/rule/rule.go +12 -10
- package/src/defaultFormat.ts +11 -8
- package/src/index.ts +40 -16
- package/src/structures/ITtscLintConfig.ts +12 -6
- package/src/structures/{ITtscLintFormatConfig.ts → ITtscLintFormat.ts} +2 -2
- package/src/structures/TtscLintRuleSetting.ts +55 -0
- package/src/structures/index.ts +3 -4
- package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +128 -0
- package/src/structures/rules/ITtscLintBoundariesRules.ts +95 -0
- package/src/structures/rules/ITtscLintContributorRules.ts +21 -0
- package/src/structures/rules/ITtscLintCoreRules.ts +1406 -0
- package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
- package/src/structures/rules/ITtscLintCypressRules.ts +145 -0
- package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +213 -0
- package/src/structures/rules/ITtscLintFunctionalRules.ts +202 -0
- package/src/structures/rules/ITtscLintJestRules.ts +220 -0
- package/src/structures/rules/ITtscLintJsdocRules.ts +153 -0
- package/src/structures/rules/ITtscLintJsxA11yRules.ts +339 -0
- package/src/structures/rules/ITtscLintNextjsRules.ts +206 -0
- package/src/structures/rules/ITtscLintPlaywrightRules.ts +361 -0
- package/src/structures/rules/ITtscLintPromiseRules.ts +205 -0
- package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
- package/src/structures/rules/ITtscLintReactPerfRules.ts +55 -0
- package/src/structures/rules/ITtscLintReactRuleOptions.ts +43 -0
- package/src/structures/rules/ITtscLintReactRules.ts +321 -0
- package/src/structures/rules/ITtscLintRegexpRules.ts +212 -0
- package/src/structures/rules/ITtscLintRuleOptionsMap.ts +89 -0
- package/src/structures/rules/ITtscLintRules.ts +77 -0
- package/src/structures/rules/ITtscLintSecurityRules.ts +162 -0
- package/src/structures/rules/ITtscLintSolidRules.ts +202 -0
- package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +23 -0
- package/src/structures/rules/ITtscLintStorybookRules.ts +193 -0
- package/src/structures/rules/ITtscLintTanstackQueryRules.ts +102 -0
- package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +24 -0
- package/src/structures/rules/ITtscLintTestingLibraryRules.ts +342 -0
- package/src/structures/rules/ITtscLintTypeScriptRules.ts +1230 -0
- package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
- package/src/structures/rules/ITtscLintVitestRules.ts +154 -0
- package/src/structures/rules/index.ts +31 -0
- package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
- package/lib/structures/TtscLintRule.d.ts +0 -17
- package/lib/structures/TtscLintRule.js.map +0 -1
- package/lib/structures/TtscLintRuleMap.d.ts +0 -46
- package/lib/structures/TtscLintRuleMap.js.map +0 -1
- package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
- package/lib/structures/TtscLintRuleOptions.js.map +0 -1
- package/src/structures/TtscLintRule.ts +0 -160
- package/src/structures/TtscLintRuleMap.ts +0 -55
- package/src/structures/TtscLintRuleOptions.ts +0 -151
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// unicorn/prevent-abbreviations: abbreviated identifier names (`err`,
|
|
2
|
+
// `cb`, `ctx`, `idx`) are a project-wide readability tax — every
|
|
3
|
+
// reader has to expand the shorthand mentally on the spot. The
|
|
4
|
+
// upstream rule maintains a large allowlist + replacements map; this
|
|
5
|
+
// MVP carries the most universal abbreviations only and fires on any
|
|
6
|
+
// identifier whose lower-cased text matches one of them, in both
|
|
7
|
+
// reference and declaration positions, so a `param` parameter and a
|
|
8
|
+
// `void param` read are both reported.
|
|
9
|
+
//
|
|
10
|
+
// AST-only: visit every `Identifier`, lowercase the lexeme, look it up
|
|
11
|
+
// in `unicornPreventAbbreviationsDictionary`. No scope analysis is
|
|
12
|
+
// performed because the rule's diagnostic is about the *name*, not the
|
|
13
|
+
// binding — every occurrence of `idx` is equally noisy.
|
|
14
|
+
//
|
|
15
|
+
// Hot-path budget: `KindIdentifier` is the most frequent AST kind in
|
|
16
|
+
// any TypeScript program, so this Check is invoked tens-of-thousands
|
|
17
|
+
// of times per file. A length pre-filter eliminates ~90 % of inputs
|
|
18
|
+
// without touching memory (the longest dictionary entry is six
|
|
19
|
+
// characters); an additional `isAllLowerASCII` check skips
|
|
20
|
+
// `strings.ToLower`'s allocation for the common case of already-
|
|
21
|
+
// lower-cased identifiers.
|
|
22
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prevent-abbreviations.md
|
|
23
|
+
package linthost
|
|
24
|
+
|
|
25
|
+
import (
|
|
26
|
+
"strings"
|
|
27
|
+
|
|
28
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
// unicornPreventAbbreviationsDictionary is the MVP allowlist of
|
|
32
|
+
// abbreviations that fire the rule. Lower-cased keys; the rule
|
|
33
|
+
// case-folds the identifier before lookup. Intentionally conservative
|
|
34
|
+
// — picks the abbreviations universally agreed across upstream
|
|
35
|
+
// presets so the rule doesn't flap on neutral words.
|
|
36
|
+
var unicornPreventAbbreviationsDictionary = map[string]struct{}{
|
|
37
|
+
"arr": {},
|
|
38
|
+
"args": {},
|
|
39
|
+
"attr": {},
|
|
40
|
+
"btn": {},
|
|
41
|
+
"cb": {},
|
|
42
|
+
"cmd": {},
|
|
43
|
+
"ctx": {},
|
|
44
|
+
"db": {},
|
|
45
|
+
"dest": {},
|
|
46
|
+
"dir": {},
|
|
47
|
+
"doc": {},
|
|
48
|
+
"el": {},
|
|
49
|
+
"elem": {},
|
|
50
|
+
"env": {},
|
|
51
|
+
"err": {},
|
|
52
|
+
"evt": {},
|
|
53
|
+
"fn": {},
|
|
54
|
+
"func": {},
|
|
55
|
+
"idx": {},
|
|
56
|
+
"len": {},
|
|
57
|
+
"lib": {},
|
|
58
|
+
"mgr": {},
|
|
59
|
+
"mod": {},
|
|
60
|
+
"msg": {},
|
|
61
|
+
"num": {},
|
|
62
|
+
"obj": {},
|
|
63
|
+
"opts": {},
|
|
64
|
+
"param": {},
|
|
65
|
+
"params": {},
|
|
66
|
+
"pkg": {},
|
|
67
|
+
"prev": {},
|
|
68
|
+
"prop": {},
|
|
69
|
+
"props": {},
|
|
70
|
+
"ref": {},
|
|
71
|
+
"res": {},
|
|
72
|
+
"ret": {},
|
|
73
|
+
"src": {},
|
|
74
|
+
"str": {},
|
|
75
|
+
"tmp": {},
|
|
76
|
+
"val": {},
|
|
77
|
+
"var": {},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// unicornPreventAbbreviationsMaxLen is the longest dictionary key
|
|
81
|
+
// length. Any identifier longer than this cannot match — the Check
|
|
82
|
+
// returns immediately without touching the dictionary.
|
|
83
|
+
const unicornPreventAbbreviationsMaxLen = 6
|
|
84
|
+
|
|
85
|
+
type unicornPreventAbbreviations struct{}
|
|
86
|
+
|
|
87
|
+
func (unicornPreventAbbreviations) Name() string { return "unicorn/prevent-abbreviations" }
|
|
88
|
+
func (unicornPreventAbbreviations) Visits() []shimast.Kind {
|
|
89
|
+
return []shimast.Kind{shimast.KindIdentifier}
|
|
90
|
+
}
|
|
91
|
+
func (unicornPreventAbbreviations) Check(ctx *Context, node *shimast.Node) {
|
|
92
|
+
name := identifierText(node)
|
|
93
|
+
if name == "" || len(name) > unicornPreventAbbreviationsMaxLen {
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
// Fast path: dictionary keys are pre-lowercased, so an
|
|
97
|
+
// already-lower-case identifier avoids `strings.ToLower`'s
|
|
98
|
+
// allocation entirely. The Check is invoked once per identifier
|
|
99
|
+
// in the file, so the saved allocations multiply.
|
|
100
|
+
lookup := name
|
|
101
|
+
if !isAllLowerASCII(name) {
|
|
102
|
+
lookup = strings.ToLower(name)
|
|
103
|
+
}
|
|
104
|
+
if _, ok := unicornPreventAbbreviationsDictionary[lookup]; !ok {
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
ctx.Report(node, "Prefer the long form over abbreviated identifiers (e.g. `error` over `err`).")
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// isAllLowerASCII reports whether `s` is a non-empty ASCII string
|
|
111
|
+
// whose every byte is a lower-case letter. Used by hot-path Checks
|
|
112
|
+
// that look up an already-normalized dictionary — the result is
|
|
113
|
+
// equivalent to `s == strings.ToLower(s)` for all-ASCII inputs but
|
|
114
|
+
// avoids the lowercase allocation.
|
|
115
|
+
func isAllLowerASCII(s string) bool {
|
|
116
|
+
for i := 0; i < len(s); i++ {
|
|
117
|
+
c := s[i]
|
|
118
|
+
if c >= 'A' && c <= 'Z' {
|
|
119
|
+
return false
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return true
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
func init() {
|
|
126
|
+
Register(unicornPreventAbbreviations{})
|
|
127
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// unicorn/relative-url-style: `new URL("./foo", base)` and
|
|
2
|
+
// `new URL("foo", base)` resolve identically, so the leading `./` is
|
|
3
|
+
// noise. The rule normalizes on the "never leading `./`" style and
|
|
4
|
+
// fires whenever a `new URL(…)` literal first argument starts with
|
|
5
|
+
// `./`.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit `KindNewExpression`, accept when the callee is the
|
|
8
|
+
// bare `URL` identifier, and inspect the first argument — when it's a
|
|
9
|
+
// string-shaped literal whose text starts with `./`, report the
|
|
10
|
+
// argument node. Absolute URLs (`http://…`), schemeless protocol
|
|
11
|
+
// references, and paths starting with `/` or `../` are untouched; only
|
|
12
|
+
// the explicit `./` prefix is the redundant case the rule targets.
|
|
13
|
+
//
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/relative-url-style.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import (
|
|
18
|
+
"strings"
|
|
19
|
+
|
|
20
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
type unicornRelativeURLStyle struct{}
|
|
24
|
+
|
|
25
|
+
func (unicornRelativeURLStyle) Name() string { return "unicorn/relative-url-style" }
|
|
26
|
+
func (unicornRelativeURLStyle) Visits() []shimast.Kind {
|
|
27
|
+
return []shimast.Kind{shimast.KindNewExpression}
|
|
28
|
+
}
|
|
29
|
+
func (unicornRelativeURLStyle) Check(ctx *Context, node *shimast.Node) {
|
|
30
|
+
expr := node.AsNewExpression()
|
|
31
|
+
if expr == nil || identifierText(expr.Expression) != "URL" {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
if expr.Arguments == nil || len(expr.Arguments.Nodes) == 0 {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
arg := expr.Arguments.Nodes[0]
|
|
38
|
+
text := stringLiteralText(arg)
|
|
39
|
+
if text == "" {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
if strings.HasPrefix(text, "./") {
|
|
43
|
+
ctx.Report(arg, "Drop the leading `./` from relative URLs passed to `new URL`.")
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
func init() {
|
|
48
|
+
Register(unicornRelativeURLStyle{})
|
|
49
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// unicorn/require-array-join-separator: `Array#join()` defaults its
|
|
2
|
+
// separator to a comma when called with no arguments. Authors rarely
|
|
3
|
+
// mean to rely on that — the implicit separator is locale-flavored in
|
|
4
|
+
// related APIs (`Intl.ListFormat`) and the comma default is one of the
|
|
5
|
+
// quieter sources of "why is this comma here?" diffs. The rule pushes
|
|
6
|
+
// every call site to spell out the separator so the intent is in the
|
|
7
|
+
// source.
|
|
8
|
+
//
|
|
9
|
+
// AST-only: visit each `CallExpression`, accept only the property-access
|
|
10
|
+
// `x.join` shape, and report when the call carries zero arguments. Any
|
|
11
|
+
// explicit argument — empty string included — passes.
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-array-join-separator.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
type unicornRequireArrayJoinSeparator struct{}
|
|
18
|
+
|
|
19
|
+
func (unicornRequireArrayJoinSeparator) Name() string {
|
|
20
|
+
return "unicorn/require-array-join-separator"
|
|
21
|
+
}
|
|
22
|
+
func (unicornRequireArrayJoinSeparator) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
24
|
+
}
|
|
25
|
+
func (unicornRequireArrayJoinSeparator) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
call := node.AsCallExpression()
|
|
27
|
+
if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
31
|
+
if access == nil {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
if identifierText(access.Name()) != "join" {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
if call.Arguments != nil && len(call.Arguments.Nodes) > 0 {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
ctx.Report(node, "Pass an explicit separator argument to `Array#join()`.")
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
func init() {
|
|
44
|
+
Register(unicornRequireArrayJoinSeparator{})
|
|
45
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// unicorn/require-module-attributes: import / export `with { … }`
|
|
2
|
+
// clauses carry semantic information (`type: "json"`, `type: "css"`).
|
|
3
|
+
// Writing `with {}` with no entries serves no purpose and is almost
|
|
4
|
+
// always a mistake. The rule fires when an import or export carries an
|
|
5
|
+
// attributes clause with zero attribute entries.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit `KindImportDeclaration` and `KindExportDeclaration`,
|
|
8
|
+
// follow the `.Attributes` field (an `ImportAttributesNode`), descend
|
|
9
|
+
// into its inner `ImportAttributes.Attributes` list, and report when
|
|
10
|
+
// the list is present but empty. The clause-present-but-empty shape is
|
|
11
|
+
// rare in practice but legal syntax, so a precise zero-entry check is
|
|
12
|
+
// the right anchor.
|
|
13
|
+
//
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-module-attributes.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornRequireModuleAttributes struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornRequireModuleAttributes) Name() string {
|
|
22
|
+
return "unicorn/require-module-attributes"
|
|
23
|
+
}
|
|
24
|
+
func (unicornRequireModuleAttributes) Visits() []shimast.Kind {
|
|
25
|
+
return []shimast.Kind{shimast.KindImportDeclaration, shimast.KindExportDeclaration}
|
|
26
|
+
}
|
|
27
|
+
func (unicornRequireModuleAttributes) Check(ctx *Context, node *shimast.Node) {
|
|
28
|
+
var attrs *shimast.Node
|
|
29
|
+
switch node.Kind {
|
|
30
|
+
case shimast.KindImportDeclaration:
|
|
31
|
+
if decl := node.AsImportDeclaration(); decl != nil {
|
|
32
|
+
attrs = decl.Attributes
|
|
33
|
+
}
|
|
34
|
+
case shimast.KindExportDeclaration:
|
|
35
|
+
if decl := node.AsExportDeclaration(); decl != nil {
|
|
36
|
+
attrs = decl.Attributes
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if attrs == nil {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
imp := attrs.AsImportAttributes()
|
|
43
|
+
if imp == nil {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
if imp.Attributes != nil && len(imp.Attributes.Nodes) > 0 {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
ctx.Report(node, "Import/export `with {}` should have at least one attribute.")
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func init() {
|
|
53
|
+
Register(unicornRequireModuleAttributes{})
|
|
54
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// unicorn/require-module-specifiers: an `import "x"` with no bindings
|
|
2
|
+
// or an `export {} from "x"` declares the module dependency without
|
|
3
|
+
// pulling anything from it; both shapes are almost always either dead
|
|
4
|
+
// imports left over from a refactor or accidental side-effect imports
|
|
5
|
+
// that the author meant to bind. The rule asks for an explicit specifier
|
|
6
|
+
// list so the dependency makes its purpose visible in the source.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit every `ImportDeclaration` and `ExportDeclaration`.
|
|
9
|
+
// Import side fires when the declaration has no `ImportClause` at all
|
|
10
|
+
// (the side-effect form). Export side fires when the declaration has an
|
|
11
|
+
// empty NamedExports `{}` (with or without a `from`).
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-module-specifiers.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
type unicornRequireModuleSpecifiers struct{}
|
|
18
|
+
|
|
19
|
+
func (unicornRequireModuleSpecifiers) Name() string {
|
|
20
|
+
return "unicorn/require-module-specifiers"
|
|
21
|
+
}
|
|
22
|
+
func (unicornRequireModuleSpecifiers) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindImportDeclaration, shimast.KindExportDeclaration}
|
|
24
|
+
}
|
|
25
|
+
func (unicornRequireModuleSpecifiers) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
switch node.Kind {
|
|
27
|
+
case shimast.KindImportDeclaration:
|
|
28
|
+
decl := node.AsImportDeclaration()
|
|
29
|
+
if decl == nil {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
// `import "x"` parses with a nil ImportClause; any binding shape
|
|
33
|
+
// (`import x`, `import {a}`, `import * as ns`) installs a clause.
|
|
34
|
+
if decl.ImportClause == nil {
|
|
35
|
+
ctx.Report(node, "Empty import/export specifier list is not allowed.")
|
|
36
|
+
}
|
|
37
|
+
case shimast.KindExportDeclaration:
|
|
38
|
+
decl := node.AsExportDeclaration()
|
|
39
|
+
if decl == nil || decl.ExportClause == nil {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
if decl.ExportClause.Kind != shimast.KindNamedExports {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
named := decl.ExportClause.AsNamedExports()
|
|
46
|
+
if named == nil || named.Elements == nil || len(named.Elements.Nodes) > 0 {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
ctx.Report(node, "Empty import/export specifier list is not allowed.")
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
func init() {
|
|
54
|
+
Register(unicornRequireModuleSpecifiers{})
|
|
55
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// unicorn/require-number-to-fixed-digits-argument: `Number#toFixed()`
|
|
2
|
+
// with no argument is equivalent to `.toFixed(0)`, which rounds away
|
|
3
|
+
// every fractional digit. Authors almost always mean a non-zero digit
|
|
4
|
+
// count, and the no-arg form is one of the more common silent
|
|
5
|
+
// truncation bugs. The rule asks every call site to spell out the digit
|
|
6
|
+
// count.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit each `CallExpression`, accept only the property-access
|
|
9
|
+
// `x.toFixed` shape, and report when the call carries zero arguments.
|
|
10
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-number-to-fixed-digits-argument.md
|
|
11
|
+
package linthost
|
|
12
|
+
|
|
13
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
14
|
+
|
|
15
|
+
type unicornRequireNumberToFixedDigitsArgument struct{}
|
|
16
|
+
|
|
17
|
+
func (unicornRequireNumberToFixedDigitsArgument) Name() string {
|
|
18
|
+
return "unicorn/require-number-to-fixed-digits-argument"
|
|
19
|
+
}
|
|
20
|
+
func (unicornRequireNumberToFixedDigitsArgument) Visits() []shimast.Kind {
|
|
21
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
22
|
+
}
|
|
23
|
+
func (unicornRequireNumberToFixedDigitsArgument) 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.Name()) != "toFixed" {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
if call.Arguments != nil && len(call.Arguments.Nodes) > 0 {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
ctx.Report(node, "Pass an explicit digits argument to `Number#toFixed()`.")
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func init() {
|
|
42
|
+
Register(unicornRequireNumberToFixedDigitsArgument{})
|
|
43
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// unicorn/require-post-message-target-origin: `Window#postMessage` and
|
|
2
|
+
// `Worker#postMessage` take a `targetOrigin` (or `transfer`) argument
|
|
3
|
+
// that scopes which document/worker may receive the message. Omitting
|
|
4
|
+
// it defaults to the receiver's own origin, which is a quiet security
|
|
5
|
+
// footgun — cross-origin frames silently lose the message. The rule
|
|
6
|
+
// asks every call site to pass an explicit second argument.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit each `CallExpression`, accept only the property-access
|
|
9
|
+
// `x.postMessage` shape, and report when the call carries exactly one
|
|
10
|
+
// argument (the message payload, with no targetOrigin to follow).
|
|
11
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/require-post-message-target-origin.md
|
|
12
|
+
package linthost
|
|
13
|
+
|
|
14
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
15
|
+
|
|
16
|
+
type unicornRequirePostMessageTargetOrigin struct{}
|
|
17
|
+
|
|
18
|
+
func (unicornRequirePostMessageTargetOrigin) Name() string {
|
|
19
|
+
return "unicorn/require-post-message-target-origin"
|
|
20
|
+
}
|
|
21
|
+
func (unicornRequirePostMessageTargetOrigin) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornRequirePostMessageTargetOrigin) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
call := node.AsCallExpression()
|
|
26
|
+
if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
30
|
+
if access == nil {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
if identifierText(access.Name()) != "postMessage" {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
ctx.Report(node, "Pass an explicit `targetOrigin` argument to `postMessage`.")
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
func init() {
|
|
43
|
+
Register(unicornRequirePostMessageTargetOrigin{})
|
|
44
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// unicorn/string-content: rewrites configured substrings inside string
|
|
2
|
+
// literals (e.g. straight quotes -> curly quotes, `...` -> `…`). The
|
|
3
|
+
// rule has NO defaults; behavior depends entirely on the user-supplied
|
|
4
|
+
// `patterns: { match: replacement }` configuration. Without that
|
|
5
|
+
// per-pattern configuration plumbing in the host's rule-options
|
|
6
|
+
// pipeline, the rule has nothing to enforce.
|
|
7
|
+
//
|
|
8
|
+
// Registered as a no-op stub to keep
|
|
9
|
+
// `TestTypedKeysMatchRegisteredRules` aligned with the typed
|
|
10
|
+
// `ITtscLintUnicornRules` surface. The matching fixture under
|
|
11
|
+
// `tests/test-lint/src/cases/unicorn-string-content.ts` keeps its
|
|
12
|
+
// `@ttsc-corpus-skip` directive.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/string-content.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornStringContent struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornStringContent) Name() string { return "unicorn/string-content" }
|
|
21
|
+
func (unicornStringContent) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindSourceFile} }
|
|
22
|
+
func (unicornStringContent) Check(_ *Context, _ *shimast.Node) {
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
func init() {
|
|
26
|
+
Register(unicornStringContent{})
|
|
27
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// unicorn/switch-case-braces: `case` and `default` clauses share their
|
|
2
|
+
// parent switch's scope, so an unbraced `case x: let y = …;` leaks `y`
|
|
3
|
+
// into every subsequent case. The default-on "always" mode of this rule
|
|
4
|
+
// requires every clause body to be a single `{ … }` block, which both
|
|
5
|
+
// scopes declarations and visually delimits clause bodies.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit each `CaseClause` and `DefaultClause` and report when
|
|
8
|
+
// the clause's statements list is anything other than exactly one
|
|
9
|
+
// `Block`. Empty fall-through clauses (`case "a":` with no statements)
|
|
10
|
+
// also fire — the rule's "always" mode wants the brace pair even when
|
|
11
|
+
// the body is empty.
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/switch-case-braces.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
type unicornSwitchCaseBraces struct{}
|
|
18
|
+
|
|
19
|
+
func (unicornSwitchCaseBraces) Name() string { return "unicorn/switch-case-braces" }
|
|
20
|
+
func (unicornSwitchCaseBraces) Visits() []shimast.Kind {
|
|
21
|
+
return []shimast.Kind{shimast.KindCaseClause, shimast.KindDefaultClause}
|
|
22
|
+
}
|
|
23
|
+
func (unicornSwitchCaseBraces) Check(ctx *Context, node *shimast.Node) {
|
|
24
|
+
clause := node.AsCaseOrDefaultClause()
|
|
25
|
+
if clause == nil || clause.Statements == nil {
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
stmts := clause.Statements.Nodes
|
|
29
|
+
if len(stmts) == 0 {
|
|
30
|
+
// Empty fall-through (`case "a":` followed immediately by another
|
|
31
|
+
// clause) is not the "missing braces" shape the rule targets.
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
if len(stmts) == 1 && stmts[0] != nil && stmts[0].Kind == shimast.KindBlock {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
ctx.Report(node, "Wrap `case` clause body in a block (`case x: { ... }`).")
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
func init() {
|
|
41
|
+
Register(unicornSwitchCaseBraces{})
|
|
42
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// unicorn/switch-case-break-position: the upstream rule rejects a
|
|
2
|
+
// `break` / `return` / `throw` that is followed by further statements
|
|
3
|
+
// inside the same `case` / `default` clause, because the trailing
|
|
4
|
+
// statements are dead code.
|
|
5
|
+
//
|
|
6
|
+
// In a well-formed TypeScript program the TypeScript-Go checker already
|
|
7
|
+
// emits an `unreachable code` diagnostic for statements following a
|
|
8
|
+
// terminator, so this AST-only port would either duplicate that
|
|
9
|
+
// diagnostic (when reused as an MVP) or need scope/CFG analysis to
|
|
10
|
+
// reproduce the exact upstream surface. The rule is registered as a
|
|
11
|
+
// no-op until a follow-up exposes the unreachable-statement metadata
|
|
12
|
+
// the checker computes for switch clauses.
|
|
13
|
+
//
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/switch-case-break-position.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornSwitchCaseBreakPosition struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornSwitchCaseBreakPosition) Name() string {
|
|
22
|
+
return "unicorn/switch-case-break-position"
|
|
23
|
+
}
|
|
24
|
+
func (unicornSwitchCaseBreakPosition) Visits() []shimast.Kind { return nil }
|
|
25
|
+
func (unicornSwitchCaseBreakPosition) Check(*Context, *shimast.Node) {
|
|
26
|
+
// Intentionally empty; see file-level comment.
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
func init() {
|
|
30
|
+
Register(unicornSwitchCaseBreakPosition{})
|
|
31
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// unicorn/template-indent: re-indents the contents of tagged template
|
|
2
|
+
// literals (`outdent`, `dedent`, `stripIndent`, etc.) so the inner text
|
|
3
|
+
// is column-aligned with the surrounding code. The autofix has to
|
|
4
|
+
// detect the common leading-whitespace prefix of every line in the
|
|
5
|
+
// template body, decide what the desired indent level is from the
|
|
6
|
+
// template's own column, then rewrite every interior line — substantial
|
|
7
|
+
// whitespace analysis well beyond a pattern match.
|
|
8
|
+
//
|
|
9
|
+
// Registered as a no-op stub to keep
|
|
10
|
+
// `TestTypedKeysMatchRegisteredRules` aligned with the typed
|
|
11
|
+
// `ITtscLintUnicornRules` surface. The matching fixture under
|
|
12
|
+
// `tests/test-lint/src/cases/unicorn-template-indent.ts` keeps its
|
|
13
|
+
// `@ttsc-corpus-skip` directive.
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/template-indent.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornTemplateIndent struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornTemplateIndent) Name() string { return "unicorn/template-indent" }
|
|
22
|
+
func (unicornTemplateIndent) Visits() []shimast.Kind { return []shimast.Kind{shimast.KindSourceFile} }
|
|
23
|
+
func (unicornTemplateIndent) Check(_ *Context, _ *shimast.Node) {
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
func init() {
|
|
27
|
+
Register(unicornTemplateIndent{})
|
|
28
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// unicorn/text-encoding-identifier-case: the IANA text-encoding labels
|
|
2
|
+
// `UTF-8`, `utf8`, `ASCII`, etc. all resolve to the same encoding in
|
|
3
|
+
// browsers and Node, but the surrounding ecosystem (HTTP headers,
|
|
4
|
+
// `TextDecoder`, file APIs) varies on which spelling it echoes back.
|
|
5
|
+
// Picking one canonical form per encoding makes string-equality checks
|
|
6
|
+
// against those echoes stable. The rule asks every encoding-shaped
|
|
7
|
+
// literal to use the canonical lowercase, hyphenated form.
|
|
8
|
+
//
|
|
9
|
+
// AST-only: visit `StringLiteral` and `NoSubstitutionTemplateLiteral`
|
|
10
|
+
// nodes. The literal's lowercased text is matched against the well-known
|
|
11
|
+
// encoding identifiers; a mismatch with the canonical form (the same
|
|
12
|
+
// identifier already in canonical case) fires the rule.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/text-encoding-identifier-case.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import (
|
|
17
|
+
"strings"
|
|
18
|
+
|
|
19
|
+
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
type unicornTextEncodingIdentifierCase struct{}
|
|
23
|
+
|
|
24
|
+
// unicornCanonicalTextEncodings maps the lowercased label to its canonical
|
|
25
|
+
// spelling. Authors who already wrote the canonical form pass; anything
|
|
26
|
+
// else with the same lowercased label fires.
|
|
27
|
+
var unicornCanonicalTextEncodings = map[string]string{
|
|
28
|
+
"utf-8": "utf-8",
|
|
29
|
+
"utf-16le": "utf-16le",
|
|
30
|
+
"utf-16be": "utf-16be",
|
|
31
|
+
"ascii": "ascii",
|
|
32
|
+
"latin1": "latin1",
|
|
33
|
+
"iso-8859-1": "iso-8859-1",
|
|
34
|
+
"windows-1252": "windows-1252",
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
func (unicornTextEncodingIdentifierCase) Name() string {
|
|
38
|
+
return "unicorn/text-encoding-identifier-case"
|
|
39
|
+
}
|
|
40
|
+
func (unicornTextEncodingIdentifierCase) Visits() []shimast.Kind {
|
|
41
|
+
return []shimast.Kind{shimast.KindStringLiteral, shimast.KindNoSubstitutionTemplateLiteral}
|
|
42
|
+
}
|
|
43
|
+
func (unicornTextEncodingIdentifierCase) Check(ctx *Context, node *shimast.Node) {
|
|
44
|
+
text := stringLiteralText(node)
|
|
45
|
+
if text == "" {
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
lower := strings.ToLower(text)
|
|
49
|
+
canonical, ok := unicornCanonicalTextEncodings[lower]
|
|
50
|
+
if !ok {
|
|
51
|
+
// `utf8`/`UTF8` share a canonical form with `utf-8` but lowercase
|
|
52
|
+
// differently — handle the hyphen-stripped aliases explicitly.
|
|
53
|
+
switch lower {
|
|
54
|
+
case "utf8":
|
|
55
|
+
canonical = "utf-8"
|
|
56
|
+
case "utf16le":
|
|
57
|
+
canonical = "utf-16le"
|
|
58
|
+
case "utf16be":
|
|
59
|
+
canonical = "utf-16be"
|
|
60
|
+
default:
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if text == canonical {
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
ctx.Report(node, "Use the canonical lowercase form for text-encoding identifiers (e.g. `utf-8`).")
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
func init() {
|
|
71
|
+
Register(unicornTextEncodingIdentifierCase{})
|
|
72
|
+
}
|