@ttsc/lint 0.13.0 → 0.14.0-dev.20250530.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +955 -85
- package/lib/defaultFormat.d.ts +15 -8
- package/lib/defaultFormat.js +15 -8
- package/lib/defaultFormat.js.map +1 -1
- package/lib/index.d.ts +46 -0
- package/lib/index.js +60 -37
- package/lib/index.js.map +1 -1
- package/lib/structures/ITtscLintConfig.d.ts +12 -6
- package/lib/structures/TtscLintRuleSetting.d.ts +49 -0
- package/lib/structures/{TtscLintRuleOptions.js → TtscLintRuleSetting.js} +1 -1
- package/lib/structures/TtscLintRuleSetting.js.map +1 -0
- package/lib/structures/format/ITtscLintFormat.d.ts +128 -0
- package/lib/structures/{TtscLintRuleMap.js → format/ITtscLintFormat.js} +1 -1
- package/lib/structures/format/ITtscLintFormat.js.map +1 -0
- package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +17 -0
- package/lib/structures/{ITtscLintFormatConfig.js → format/ITtscLintFormatJsDoc.js} +1 -1
- package/lib/structures/format/ITtscLintFormatJsDoc.js.map +1 -0
- package/lib/structures/format/ITtscLintFormatSortImports.d.ts +54 -0
- package/lib/structures/format/ITtscLintFormatSortImports.js +3 -0
- package/lib/structures/format/ITtscLintFormatSortImports.js.map +1 -0
- package/lib/structures/format/index.d.ts +3 -0
- package/lib/structures/format/index.js +20 -0
- package/lib/structures/format/index.js.map +1 -0
- package/lib/structures/index.d.ts +3 -4
- package/lib/structures/index.js +3 -4
- package/lib/structures/index.js.map +1 -1
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +95 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +13 -0
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +75 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.js +3 -0
- package/lib/structures/rules/ITtscLintBoundariesRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintContributorRules.d.ts +16 -0
- package/lib/structures/rules/ITtscLintContributorRules.js +3 -0
- package/lib/structures/rules/ITtscLintContributorRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintCoreRules.d.ts +1229 -0
- package/lib/structures/rules/ITtscLintCoreRules.js +3 -0
- package/lib/structures/rules/ITtscLintCoreRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +17 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js +10 -0
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintCypressRules.d.ts +125 -0
- package/lib/structures/rules/ITtscLintCypressRules.js +3 -0
- package/lib/structures/rules/ITtscLintCypressRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +154 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +13 -0
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +162 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.js +3 -0
- package/lib/structures/rules/ITtscLintFunctionalRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJestRules.d.ts +190 -0
- package/lib/structures/rules/ITtscLintJestRules.js +3 -0
- package/lib/structures/rules/ITtscLintJestRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJsdocRules.d.ts +133 -0
- package/lib/structures/rules/ITtscLintJsdocRules.js +3 -0
- package/lib/structures/rules/ITtscLintJsdocRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +294 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.js +3 -0
- package/lib/structures/rules/ITtscLintJsxA11yRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintNextjsRules.d.ts +180 -0
- package/lib/structures/rules/ITtscLintNextjsRules.js +3 -0
- package/lib/structures/rules/ITtscLintNextjsRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +312 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.js +3 -0
- package/lib/structures/rules/ITtscLintPlaywrightRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintPromiseRules.d.ts +179 -0
- package/lib/structures/rules/ITtscLintPromiseRules.js +3 -0
- package/lib/structures/rules/ITtscLintPromiseRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +18 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js +8 -0
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +49 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.js +3 -0
- package/lib/structures/rules/ITtscLintReactPerfRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +37 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js +11 -0
- package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintReactRules.d.ts +276 -0
- package/lib/structures/rules/ITtscLintReactRules.js +3 -0
- package/lib/structures/rules/ITtscLintReactRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintRegexpRules.d.ts +182 -0
- package/lib/structures/rules/ITtscLintRegexpRules.js +3 -0
- package/lib/structures/rules/ITtscLintRegexpRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +65 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.js +3 -0
- package/lib/structures/rules/ITtscLintRuleOptionsMap.js.map +1 -0
- package/lib/structures/rules/ITtscLintRules.d.ts +55 -0
- package/lib/structures/{TtscLintRule.js → rules/ITtscLintRules.js} +1 -1
- package/lib/structures/rules/ITtscLintRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintSecurityRules.d.ts +141 -0
- package/lib/structures/rules/ITtscLintSecurityRules.js +3 -0
- package/lib/structures/rules/ITtscLintSecurityRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintSolidRules.d.ts +178 -0
- package/lib/structures/rules/ITtscLintSolidRules.js +3 -0
- package/lib/structures/rules/ITtscLintSolidRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +20 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.js +9 -0
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintStorybookRules.d.ts +165 -0
- package/lib/structures/rules/ITtscLintStorybookRules.js +3 -0
- package/lib/structures/rules/ITtscLintStorybookRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +88 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.js +3 -0
- package/lib/structures/rules/ITtscLintTanstackQueryRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +21 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js +10 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +293 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.js +3 -0
- package/lib/structures/rules/ITtscLintTestingLibraryRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +1074 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.js +3 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintUnicornRules.d.ts +997 -0
- package/lib/structures/rules/ITtscLintUnicornRules.js +3 -0
- package/lib/structures/rules/ITtscLintUnicornRules.js.map +1 -0
- package/lib/structures/rules/ITtscLintVitestRules.d.ts +133 -0
- package/lib/structures/rules/ITtscLintVitestRules.js +3 -0
- package/lib/structures/rules/ITtscLintVitestRules.js.map +1 -0
- package/lib/structures/rules/index.d.ts +31 -0
- package/lib/structures/rules/index.js +48 -0
- package/lib/structures/rules/index.js.map +1 -0
- package/linthost/ast_helpers.go +30 -5
- package/linthost/compile.go +33 -2
- package/linthost/config.go +118 -71
- package/linthost/config_format.go +270 -104
- package/linthost/directives.go +67 -25
- package/linthost/dispatch.go +14 -3
- package/linthost/engine.go +160 -40
- package/linthost/fix.go +10 -3
- package/linthost/flags_gen.go +17 -15
- package/linthost/format.go +222 -25
- package/linthost/format_editor_settings.go +262 -0
- package/linthost/host.go +40 -3
- package/linthost/lsp.go +898 -0
- package/linthost/print_dispatch.go +5 -2
- package/linthost/print_engine.go +5 -5
- package/linthost/print_nodes_call.go +149 -67
- package/linthost/print_nodes_function.go +27 -2
- package/linthost/print_nodes_list.go +40 -5
- package/linthost/print_nodes_object.go +1 -1
- package/linthost/print_nodes_ternary.go +86 -0
- package/linthost/rule_names.go +14 -0
- package/linthost/rules_arrays.go +2 -2
- package/linthost/rules_boundaries.go +532 -0
- package/linthost/rules_camelcase.go +133 -0
- package/linthost/rules_complexity.go +95 -0
- package/linthost/rules_consistent_return.go +130 -0
- package/linthost/rules_console.go +1 -1
- package/linthost/rules_core_extra.go +739 -0
- package/linthost/rules_curly.go +70 -0
- package/linthost/rules_cypress.go +608 -0
- package/linthost/rules_debugger.go +2 -2
- package/linthost/rules_default_case.go +39 -0
- package/linthost/rules_default_case_last.go +46 -0
- package/linthost/rules_dupes.go +3 -3
- package/linthost/rules_empty.go +3 -3
- package/linthost/rules_escape.go +44 -24
- package/linthost/rules_eval.go +2 -2
- package/linthost/rules_finally.go +2 -2
- package/linthost/rules_format_arrow_parens.go +167 -0
- package/linthost/rules_format_bracket_spacing.go +117 -0
- package/linthost/rules_format_clause_join.go +172 -0
- package/linthost/rules_format_declaration_header.go +595 -0
- package/linthost/rules_format_indent.go +372 -0
- package/linthost/rules_format_jsdoc.go +5 -5
- package/linthost/rules_format_orphan_semi.go +106 -0
- package/linthost/rules_format_parameter_properties.go +175 -0
- package/linthost/rules_format_print_width.go +66 -55
- package/linthost/rules_format_quote_props.go +169 -0
- package/linthost/rules_format_quotes.go +76 -30
- package/linthost/rules_format_semi.go +186 -11
- package/linthost/rules_format_sort_imports.go +437 -118
- package/linthost/rules_format_statement_split.go +343 -0
- package/linthost/rules_format_ternary_nullish_parens.go +77 -0
- package/linthost/rules_format_trailing_comma.go +22 -3
- package/linthost/rules_format_whitespace.go +336 -0
- package/linthost/rules_functional.go +967 -0
- package/linthost/rules_gap.go +24 -45
- package/linthost/rules_grouped_accessor_pairs.go +87 -0
- package/linthost/rules_guard_for_in.go +198 -0
- package/linthost/rules_id_length.go +77 -0
- package/linthost/rules_imports.go +70 -2
- package/linthost/rules_init_declarations.go +53 -0
- package/linthost/rules_jest.go +618 -0
- package/linthost/rules_jsdoc.go +502 -0
- package/linthost/rules_jsx_a11y.go +1264 -0
- package/linthost/rules_logic.go +12 -12
- package/linthost/rules_loops.go +1 -1
- package/linthost/rules_max_classes_per_file.go +58 -0
- package/linthost/rules_max_depth.go +83 -0
- package/linthost/rules_max_lines.go +101 -0
- package/linthost/rules_max_lines_per_function.go +57 -0
- package/linthost/rules_max_nested_callbacks.go +61 -0
- package/linthost/rules_max_params.go +49 -0
- package/linthost/rules_max_statements.go +59 -0
- package/linthost/rules_misc.go +1 -1
- package/linthost/rules_nextjs.go +697 -0
- package/linthost/rules_no_else_return.go +75 -0
- package/linthost/rules_no_empty_named_blocks.go +91 -0
- package/linthost/rules_no_extend_native.go +51 -0
- package/linthost/rules_no_import_assign.go +140 -0
- package/linthost/rules_no_invalid_this.go +52 -0
- package/linthost/rules_no_loop_func.go +85 -0
- package/linthost/rules_no_magic_numbers.go +123 -0
- package/linthost/rules_no_mixed_operators.go +80 -0
- package/linthost/rules_no_param_reassign.go +98 -0
- package/linthost/rules_no_redeclare.go +270 -0
- package/linthost/rules_no_restricted_imports.go +105 -0
- package/linthost/rules_no_restricted_syntax.go +49 -0
- package/linthost/rules_no_shadow.go +147 -0
- package/linthost/rules_no_unreachable.go +77 -0
- package/linthost/rules_no_useless_assignment.go +120 -0
- package/linthost/rules_no_useless_constructor.go +245 -0
- package/linthost/rules_no_useless_return.go +51 -0
- package/linthost/rules_params.go +1 -1
- package/linthost/rules_playwright.go +788 -0
- package/linthost/rules_prefer_arrow_callback.go +124 -0
- package/linthost/rules_prefer_destructuring.go +98 -0
- package/linthost/rules_prefer_named_capture_group.go +129 -0
- package/linthost/rules_prefer_rest_params.go +94 -0
- package/linthost/rules_problems.go +41 -30
- package/linthost/rules_promise.go +1057 -2
- package/linthost/rules_protos.go +2 -2
- package/linthost/rules_react.go +773 -0
- package/linthost/rules_react_extras.go +227 -0
- package/linthost/rules_react_hooks.go +848 -0
- package/linthost/rules_react_perf.go +293 -0
- package/linthost/rules_react_refresh.go +583 -0
- package/linthost/rules_regexp.go +410 -0
- package/linthost/rules_security.go +830 -0
- package/linthost/rules_self.go +2 -2
- package/linthost/rules_solid.go +1073 -0
- package/linthost/rules_sort_imports.go +69 -0
- package/linthost/rules_sort_keys.go +134 -0
- package/linthost/rules_storybook.go +1176 -0
- package/linthost/rules_strings.go +4 -4
- package/linthost/rules_suggestions.go +38 -38
- package/linthost/rules_tanstack_query.go +844 -0
- package/linthost/rules_testing_library.go +1204 -0
- package/linthost/rules_throw.go +1 -1
- package/linthost/rules_ts.go +19 -19
- package/linthost/rules_ts_async.go +399 -0
- package/linthost/rules_ts_class_literal_property_style.go +115 -0
- package/linthost/rules_ts_consistent_type_exports.go +256 -0
- package/linthost/rules_ts_explicit_function_return_type.go +67 -0
- package/linthost/rules_ts_extra.go +159 -36
- package/linthost/rules_ts_no_base_to_string.go +218 -0
- package/linthost/rules_ts_no_confusing_void.go +72 -0
- package/linthost/rules_ts_no_deprecated.go +195 -0
- package/linthost/rules_ts_no_for_in_array.go +84 -0
- package/linthost/rules_ts_no_magic_numbers.go +124 -0
- package/linthost/rules_ts_no_meaningless_void_operator.go +84 -0
- package/linthost/rules_ts_no_misused_spread.go +104 -0
- package/linthost/rules_ts_no_redundant_type_constituents.go +113 -0
- package/linthost/rules_ts_no_restricted_types.go +62 -0
- package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +129 -0
- package/linthost/rules_ts_no_unnecessary_condition.go +250 -0
- package/linthost/rules_ts_no_unnecessary_qualifier.go +118 -0
- package/linthost/rules_ts_no_unnecessary_template_expression.go +178 -0
- package/linthost/rules_ts_no_unnecessary_type_arguments.go +234 -0
- package/linthost/rules_ts_no_unnecessary_type_assertion.go +157 -0
- package/linthost/rules_ts_no_unsafe_argument.go +82 -0
- package/linthost/rules_ts_no_unsafe_assignment.go +102 -0
- package/linthost/rules_ts_no_unsafe_call.go +82 -0
- package/linthost/rules_ts_no_unsafe_enum_comparison.go +235 -0
- package/linthost/rules_ts_no_unsafe_member_access.go +58 -0
- package/linthost/rules_ts_no_unsafe_return.go +126 -0
- package/linthost/rules_ts_no_unsafe_unary_minus.go +81 -0
- package/linthost/rules_ts_no_useless_constructor.go +52 -0
- package/linthost/rules_ts_non_nullable_type_assertion_style.go +108 -0
- package/linthost/rules_ts_parameter_properties.go +38 -0
- package/linthost/rules_ts_prefer_find.go +178 -0
- package/linthost/rules_ts_prefer_includes.go +255 -0
- package/linthost/rules_ts_prefer_nullish_coalescing.go +104 -0
- package/linthost/rules_ts_prefer_optional_chain.go +228 -0
- package/linthost/rules_ts_prefer_promise_reject_errors.go +176 -0
- package/linthost/rules_ts_prefer_readonly.go +73 -0
- package/linthost/rules_ts_prefer_reduce_type_parameter.go +116 -0
- package/linthost/rules_ts_prefer_regexp_exec.go +122 -0
- package/linthost/rules_ts_prefer_return_this_type.go +135 -0
- package/linthost/rules_ts_prefer_string_starts_ends_with.go +360 -0
- package/linthost/rules_ts_promise_function_async.go +77 -0
- package/linthost/rules_ts_related_getter_setter_pairs.go +113 -0
- package/linthost/rules_ts_require_array_sort_compare.go +96 -0
- package/linthost/rules_ts_restrict_plus_operands.go +127 -0
- package/linthost/rules_ts_restrict_template_expressions.go +95 -0
- package/linthost/rules_ts_simple.go +387 -0
- package/linthost/rules_ts_sort_type_constituents.go +144 -0
- package/linthost/rules_ts_strict_boolean_expressions.go +157 -0
- package/linthost/rules_ts_switch_exhaustiveness_check.go +147 -0
- package/linthost/rules_ts_unbound_method.go +126 -0
- package/linthost/rules_tsdoc.go +136 -0
- package/linthost/rules_unicorn_better_regex.go +27 -0
- package/linthost/rules_unicorn_catch_error_name.go +46 -0
- package/linthost/rules_unicorn_consistent_assert.go +47 -0
- package/linthost/rules_unicorn_consistent_date_clone.go +54 -0
- package/linthost/rules_unicorn_consistent_destructuring.go +25 -0
- package/linthost/rules_unicorn_consistent_empty_array_spread.go +62 -0
- package/linthost/rules_unicorn_consistent_existence_index_check.go +80 -0
- package/linthost/rules_unicorn_consistent_function_scoping.go +25 -0
- package/linthost/rules_unicorn_consistent_template_literal_escape.go +25 -0
- package/linthost/rules_unicorn_custom_error_definition.go +138 -0
- package/linthost/rules_unicorn_empty_brace_spaces.go +73 -0
- package/linthost/rules_unicorn_error_message.go +64 -0
- package/linthost/rules_unicorn_escape_case.go +51 -0
- package/linthost/rules_unicorn_expiring_todo_comments.go +78 -0
- package/linthost/rules_unicorn_explicit_length_check.go +88 -0
- package/linthost/rules_unicorn_filename_case.go +29 -0
- package/linthost/rules_unicorn_import_style.go +28 -0
- package/linthost/rules_unicorn_isolated_functions.go +29 -0
- package/linthost/rules_unicorn_new_for_builtins.go +87 -0
- package/linthost/rules_unicorn_no_abusive_eslint_disable.go +63 -0
- package/linthost/rules_unicorn_no_accessor_recursion.go +115 -0
- package/linthost/rules_unicorn_no_anonymous_default_export.go +74 -0
- package/linthost/rules_unicorn_no_array_callback_reference.go +65 -0
- package/linthost/rules_unicorn_no_array_for_each.go +40 -0
- package/linthost/rules_unicorn_no_array_method_this_argument.go +61 -0
- package/linthost/rules_unicorn_no_array_reduce.go +41 -0
- package/linthost/rules_unicorn_no_array_reverse.go +44 -0
- package/linthost/rules_unicorn_no_array_sort.go +43 -0
- package/linthost/rules_unicorn_no_await_expression_member.go +40 -0
- package/linthost/rules_unicorn_no_await_in_promise_methods.go +69 -0
- package/linthost/rules_unicorn_no_console_spaces.go +61 -0
- package/linthost/rules_unicorn_no_document_cookie.go +41 -0
- package/linthost/rules_unicorn_no_empty_file.go +44 -0
- package/linthost/rules_unicorn_no_for_loop.go +102 -0
- package/linthost/rules_unicorn_no_hex_escape.go +42 -0
- package/linthost/rules_unicorn_no_immediate_mutation.go +90 -0
- package/linthost/rules_unicorn_no_instanceof_builtins.go +66 -0
- package/linthost/rules_unicorn_no_invalid_fetch_options.go +79 -0
- package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +51 -0
- package/linthost/rules_unicorn_no_keyword_prefix.go +101 -0
- package/linthost/rules_unicorn_no_lonely_if.go +44 -0
- package/linthost/rules_unicorn_no_magic_array_flat_depth.go +51 -0
- package/linthost/rules_unicorn_no_named_default.go +54 -0
- package/linthost/rules_unicorn_no_negated_condition.go +85 -0
- package/linthost/rules_unicorn_no_negation_in_equality_check.go +50 -0
- package/linthost/rules_unicorn_no_nested_ternary.go +43 -0
- package/linthost/rules_unicorn_no_new_array.go +30 -0
- package/linthost/rules_unicorn_no_new_buffer.go +31 -0
- package/linthost/rules_unicorn_no_null.go +24 -0
- package/linthost/rules_unicorn_no_object_as_default_parameter.go +48 -0
- package/linthost/rules_unicorn_no_process_exit.go +43 -0
- package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +59 -0
- package/linthost/rules_unicorn_no_static_only_class.go +56 -0
- package/linthost/rules_unicorn_no_thenable.go +74 -0
- package/linthost/rules_unicorn_no_this_assignment.go +35 -0
- package/linthost/rules_unicorn_no_typeof_undefined.go +58 -0
- package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +49 -0
- package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +70 -0
- package/linthost/rules_unicorn_no_unnecessary_await.go +51 -0
- package/linthost/rules_unicorn_no_unnecessary_polyfills.go +32 -0
- package/linthost/rules_unicorn_no_unnecessary_slice_end.go +48 -0
- package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +115 -0
- package/linthost/rules_unicorn_no_unreadable_iife.go +50 -0
- package/linthost/rules_unicorn_no_unused_properties.go +30 -0
- package/linthost/rules_unicorn_no_useless_collection_argument.go +63 -0
- package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +46 -0
- package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +81 -0
- package/linthost/rules_unicorn_no_useless_iterator_to_array.go +72 -0
- package/linthost/rules_unicorn_no_useless_length_check.go +144 -0
- package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +81 -0
- package/linthost/rules_unicorn_no_useless_spread.go +67 -0
- package/linthost/rules_unicorn_no_useless_switch_case.go +55 -0
- package/linthost/rules_unicorn_no_useless_undefined.go +55 -0
- package/linthost/rules_unicorn_no_zero_fractions.go +52 -0
- package/linthost/rules_unicorn_number_literal_case.go +69 -0
- package/linthost/rules_unicorn_numeric_separators_style.go +75 -0
- package/linthost/rules_unicorn_prefer_add_event_listener.go +66 -0
- package/linthost/rules_unicorn_prefer_array_find.go +51 -0
- package/linthost/rules_unicorn_prefer_array_flat.go +52 -0
- package/linthost/rules_unicorn_prefer_array_flat_map.go +63 -0
- package/linthost/rules_unicorn_prefer_array_index_of.go +147 -0
- package/linthost/rules_unicorn_prefer_array_some.go +67 -0
- package/linthost/rules_unicorn_prefer_at.go +77 -0
- package/linthost/rules_unicorn_prefer_bigint_literals.go +77 -0
- package/linthost/rules_unicorn_prefer_blob_reading_methods.go +44 -0
- package/linthost/rules_unicorn_prefer_class_fields.go +93 -0
- package/linthost/rules_unicorn_prefer_classlist_toggle.go +120 -0
- package/linthost/rules_unicorn_prefer_code_point.go +49 -0
- package/linthost/rules_unicorn_prefer_date_now.go +78 -0
- package/linthost/rules_unicorn_prefer_default_parameters.go +144 -0
- package/linthost/rules_unicorn_prefer_dom_node_append.go +40 -0
- package/linthost/rules_unicorn_prefer_dom_node_dataset.go +55 -0
- package/linthost/rules_unicorn_prefer_dom_node_remove.go +41 -0
- package/linthost/rules_unicorn_prefer_dom_node_text_content.go +37 -0
- package/linthost/rules_unicorn_prefer_event_target.go +36 -0
- package/linthost/rules_unicorn_prefer_export_from.go +129 -0
- package/linthost/rules_unicorn_prefer_global_this.go +127 -0
- package/linthost/rules_unicorn_prefer_import_meta_properties.go +66 -0
- package/linthost/rules_unicorn_prefer_includes.go +149 -0
- package/linthost/rules_unicorn_prefer_json_parse_buffer.go +65 -0
- package/linthost/rules_unicorn_prefer_keyboard_event_key.go +38 -0
- package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +48 -0
- package/linthost/rules_unicorn_prefer_math_min_max.go +60 -0
- package/linthost/rules_unicorn_prefer_math_trunc.go +62 -0
- package/linthost/rules_unicorn_prefer_modern_dom_apis.go +47 -0
- package/linthost/rules_unicorn_prefer_modern_math_apis.go +70 -0
- package/linthost/rules_unicorn_prefer_module.go +50 -0
- package/linthost/rules_unicorn_prefer_native_coercion_functions.go +114 -0
- package/linthost/rules_unicorn_prefer_negative_index.go +74 -0
- package/linthost/rules_unicorn_prefer_node_protocol.go +122 -0
- package/linthost/rules_unicorn_prefer_number_properties.go +88 -0
- package/linthost/rules_unicorn_prefer_object_from_entries.go +55 -0
- package/linthost/rules_unicorn_prefer_optional_catch_binding.go +62 -0
- package/linthost/rules_unicorn_prefer_prototype_methods.go +54 -0
- package/linthost/rules_unicorn_prefer_query_selector.go +56 -0
- package/linthost/rules_unicorn_prefer_reflect_apply.go +36 -0
- package/linthost/rules_unicorn_prefer_regexp_test_rule.go +80 -0
- package/linthost/rules_unicorn_prefer_response_static_json.go +53 -0
- package/linthost/rules_unicorn_prefer_set_has.go +42 -0
- package/linthost/rules_unicorn_prefer_set_size.go +48 -0
- package/linthost/rules_unicorn_prefer_simple_condition_first.go +34 -0
- package/linthost/rules_unicorn_prefer_single_call.go +96 -0
- package/linthost/rules_unicorn_prefer_spread.go +51 -0
- package/linthost/rules_unicorn_prefer_string_raw.go +43 -0
- package/linthost/rules_unicorn_prefer_string_replace_all.go +95 -0
- package/linthost/rules_unicorn_prefer_string_slice.go +43 -0
- package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +148 -0
- package/linthost/rules_unicorn_prefer_string_trim_start_end.go +48 -0
- package/linthost/rules_unicorn_prefer_structured_clone.go +71 -0
- package/linthost/rules_unicorn_prefer_switch.go +103 -0
- package/linthost/rules_unicorn_prefer_ternary.go +71 -0
- package/linthost/rules_unicorn_prefer_top_level_await.go +72 -0
- package/linthost/rules_unicorn_prefer_type_error.go +127 -0
- package/linthost/rules_unicorn_prevent_abbreviations.go +127 -0
- package/linthost/rules_unicorn_relative_url_style.go +49 -0
- package/linthost/rules_unicorn_require_array_join_separator.go +45 -0
- package/linthost/rules_unicorn_require_module_attributes.go +54 -0
- package/linthost/rules_unicorn_require_module_specifiers.go +55 -0
- package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +43 -0
- package/linthost/rules_unicorn_require_post_message_target_origin.go +44 -0
- package/linthost/rules_unicorn_string_content.go +27 -0
- package/linthost/rules_unicorn_switch_case_braces.go +42 -0
- package/linthost/rules_unicorn_switch_case_break_position.go +31 -0
- package/linthost/rules_unicorn_template_indent.go +28 -0
- package/linthost/rules_unicorn_text_encoding_identifier_case.go +72 -0
- package/linthost/rules_unicorn_throw_new_error.go +61 -0
- package/linthost/rules_var.go +10 -4
- package/linthost/rules_vitest.go +568 -0
- package/package.json +3 -3
- package/plugin/main.go +49 -3
- package/rule/astutil/astutil.go +10 -3
- package/rule/rule.go +12 -10
- package/src/defaultFormat.ts +17 -10
- package/src/index.ts +65 -43
- package/src/structures/ITtscLintConfig.ts +14 -8
- package/src/structures/TtscLintRuleSetting.ts +55 -0
- package/src/structures/format/ITtscLintFormat.ts +141 -0
- package/src/structures/format/ITtscLintFormatJsDoc.ts +18 -0
- package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
- package/src/structures/format/index.ts +3 -0
- package/src/structures/index.ts +3 -4
- package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +117 -0
- package/src/structures/rules/ITtscLintBoundariesRules.ts +91 -0
- package/src/structures/rules/ITtscLintContributorRules.ts +20 -0
- package/src/structures/rules/ITtscLintCoreRules.ts +1378 -0
- package/src/structures/rules/ITtscLintCypressRuleOptions.ts +18 -0
- package/src/structures/rules/ITtscLintCypressRules.ts +141 -0
- package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +200 -0
- package/src/structures/rules/ITtscLintFunctionalRules.ts +197 -0
- package/src/structures/rules/ITtscLintJestRules.ts +209 -0
- package/src/structures/rules/ITtscLintJsdocRules.ts +146 -0
- package/src/structures/rules/ITtscLintJsxA11yRules.ts +331 -0
- package/src/structures/rules/ITtscLintNextjsRules.ts +201 -0
- package/src/structures/rules/ITtscLintPlaywrightRules.ts +343 -0
- package/src/structures/rules/ITtscLintPromiseRules.ts +196 -0
- package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +19 -0
- package/src/structures/rules/ITtscLintReactPerfRules.ts +53 -0
- package/src/structures/rules/ITtscLintReactRuleOptions.ts +41 -0
- package/src/structures/rules/ITtscLintReactRules.ts +308 -0
- package/src/structures/rules/ITtscLintRegexpRules.ts +204 -0
- package/src/structures/rules/ITtscLintRuleOptionsMap.ts +88 -0
- package/src/structures/rules/ITtscLintRules.ts +77 -0
- package/src/structures/rules/ITtscLintSecurityRules.ts +155 -0
- package/src/structures/rules/ITtscLintSolidRules.ts +199 -0
- package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +22 -0
- package/src/structures/rules/ITtscLintStorybookRules.ts +184 -0
- package/src/structures/rules/ITtscLintTanstackQueryRules.ts +96 -0
- package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +23 -0
- package/src/structures/rules/ITtscLintTestingLibraryRules.ts +325 -0
- package/src/structures/rules/ITtscLintTypeScriptRules.ts +1172 -0
- package/src/structures/rules/ITtscLintUnicornRules.ts +1143 -0
- package/src/structures/rules/ITtscLintVitestRules.ts +146 -0
- package/src/structures/rules/index.ts +31 -0
- package/lib/structures/ITtscLintFormatConfig.d.ts +0 -153
- package/lib/structures/ITtscLintFormatConfig.js.map +0 -1
- package/lib/structures/TtscLintRule.d.ts +0 -17
- package/lib/structures/TtscLintRule.js.map +0 -1
- package/lib/structures/TtscLintRuleMap.d.ts +0 -46
- package/lib/structures/TtscLintRuleMap.js.map +0 -1
- package/lib/structures/TtscLintRuleOptions.d.ts +0 -137
- package/lib/structures/TtscLintRuleOptions.js.map +0 -1
- package/src/structures/ITtscLintFormatConfig.ts +0 -168
- package/src/structures/TtscLintRule.ts +0 -160
- package/src/structures/TtscLintRuleMap.ts +0 -55
- package/src/structures/TtscLintRuleOptions.ts +0 -151
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// unicorn/prefer-logical-operator-over-ternary: `x ? x : y` evaluates `x`
|
|
2
|
+
// twice and adds a branch only to reproduce what `x || y` (for truthy
|
|
3
|
+
// preservation) or `x ?? y` (for nullish-only) already say in one
|
|
4
|
+
// shorter, allocation-free token. The ternary spelling tends to crop up
|
|
5
|
+
// when authors forget the short-circuit operators exist; the rule nudges
|
|
6
|
+
// them back to the canonical form.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit `KindConditionalExpression`. Fire when the textual form
|
|
9
|
+
// of `cond` (after `stripParens`) equals the textual form of `whenTrue`.
|
|
10
|
+
// That covers the `cond ? cond : alt` shape. The negated `!x ? y : x`
|
|
11
|
+
// case is left to a future iteration to keep the rule focused on a
|
|
12
|
+
// single shape.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-logical-operator-over-ternary.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornPreferLogicalOperatorOverTernary struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornPreferLogicalOperatorOverTernary) Name() string {
|
|
21
|
+
return "unicorn/prefer-logical-operator-over-ternary"
|
|
22
|
+
}
|
|
23
|
+
func (unicornPreferLogicalOperatorOverTernary) Visits() []shimast.Kind {
|
|
24
|
+
return []shimast.Kind{shimast.KindConditionalExpression}
|
|
25
|
+
}
|
|
26
|
+
func (unicornPreferLogicalOperatorOverTernary) Check(ctx *Context, node *shimast.Node) {
|
|
27
|
+
cond := node.AsConditionalExpression()
|
|
28
|
+
if cond == nil {
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
condExpr := stripParens(cond.Condition)
|
|
32
|
+
whenTrue := stripParens(cond.WhenTrue)
|
|
33
|
+
if condExpr == nil || whenTrue == nil {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
condText := nodeText(ctx.File, condExpr)
|
|
37
|
+
if condText == "" {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
if condText != nodeText(ctx.File, whenTrue) {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
ctx.Report(node, "Prefer `a || b` / `a ?? b` over the equivalent ternary `a ? a : b`.")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func init() {
|
|
47
|
+
Register(unicornPreferLogicalOperatorOverTernary{})
|
|
48
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// unicorn/prefer-math-min-max: `a < b ? a : b` is the long-hand spelling
|
|
2
|
+
// of `Math.min(a, b)`; the conditional adds a branch and reads each
|
|
3
|
+
// operand twice to do what the built-in does in one call. The built-ins
|
|
4
|
+
// also handle the NaN edge case the conditional silently mis-routes,
|
|
5
|
+
// so the rule pushes authors to switch.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit `KindConditionalExpression`. Fire when the condition
|
|
8
|
+
// (after `stripParens`) is a `KindBinaryExpression` whose operator is one
|
|
9
|
+
// of `<`, `<=`, `>`, `>=` AND its two operands read textually as the
|
|
10
|
+
// two branches of the conditional (either order — `a < b ? a : b` and
|
|
11
|
+
// `a < b ? b : a` both qualify, since the rule covers both `Math.min`
|
|
12
|
+
// and `Math.max`).
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-math-min-max.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornPreferMathMinMax struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornPreferMathMinMax) Name() string { return "unicorn/prefer-math-min-max" }
|
|
21
|
+
func (unicornPreferMathMinMax) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindConditionalExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornPreferMathMinMax) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
cond := node.AsConditionalExpression()
|
|
26
|
+
if cond == nil {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
condExpr := stripParens(cond.Condition)
|
|
30
|
+
if condExpr == nil || condExpr.Kind != shimast.KindBinaryExpression {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
bin := condExpr.AsBinaryExpression()
|
|
34
|
+
if bin == nil || bin.OperatorToken == nil {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
switch bin.OperatorToken.Kind {
|
|
38
|
+
case shimast.KindLessThanToken,
|
|
39
|
+
shimast.KindLessThanEqualsToken,
|
|
40
|
+
shimast.KindGreaterThanToken,
|
|
41
|
+
shimast.KindGreaterThanEqualsToken:
|
|
42
|
+
default:
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
leftText := nodeText(ctx.File, stripParens(bin.Left))
|
|
46
|
+
rightText := nodeText(ctx.File, stripParens(bin.Right))
|
|
47
|
+
if leftText == "" || rightText == "" {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
trueText := nodeText(ctx.File, stripParens(cond.WhenTrue))
|
|
51
|
+
falseText := nodeText(ctx.File, stripParens(cond.WhenFalse))
|
|
52
|
+
if (leftText == trueText && rightText == falseText) ||
|
|
53
|
+
(leftText == falseText && rightText == trueText) {
|
|
54
|
+
ctx.Report(node, "Prefer `Math.min` / `Math.max` over a conditional comparing the same two values.")
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
func init() {
|
|
59
|
+
Register(unicornPreferMathMinMax{})
|
|
60
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// unicorn/prefer-math-trunc: `~~x` and `x | 0` are folk idioms for
|
|
2
|
+
// integer truncation that ride on the implicit Int32 coercion of the
|
|
3
|
+
// bitwise operators. They lose values outside the int32 range and
|
|
4
|
+
// confuse readers expecting a real math function. `Math.trunc(x)`
|
|
5
|
+
// expresses the intent directly and handles the full numeric range.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit `KindBinaryExpression` and `KindPrefixUnaryExpression`.
|
|
8
|
+
// Fire on:
|
|
9
|
+
//
|
|
10
|
+
// - `x | 0` — a BinaryExpression with `|` whose right operand is the
|
|
11
|
+
// numeric literal `0`.
|
|
12
|
+
// - `~~x` — a PrefixUnaryExpression with `~` whose operand is itself
|
|
13
|
+
// a PrefixUnaryExpression with `~` (the parser nests them as
|
|
14
|
+
// `~(~x)`).
|
|
15
|
+
//
|
|
16
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-math-trunc.md
|
|
17
|
+
package linthost
|
|
18
|
+
|
|
19
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
20
|
+
|
|
21
|
+
type unicornPreferMathTrunc struct{}
|
|
22
|
+
|
|
23
|
+
func (unicornPreferMathTrunc) Name() string { return "unicorn/prefer-math-trunc" }
|
|
24
|
+
func (unicornPreferMathTrunc) Visits() []shimast.Kind {
|
|
25
|
+
return []shimast.Kind{shimast.KindBinaryExpression, shimast.KindPrefixUnaryExpression}
|
|
26
|
+
}
|
|
27
|
+
func (unicornPreferMathTrunc) Check(ctx *Context, node *shimast.Node) {
|
|
28
|
+
switch node.Kind {
|
|
29
|
+
case shimast.KindBinaryExpression:
|
|
30
|
+
expr := node.AsBinaryExpression()
|
|
31
|
+
if expr == nil || expr.OperatorToken == nil ||
|
|
32
|
+
expr.OperatorToken.Kind != shimast.KindBarToken {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
right := stripParens(expr.Right)
|
|
36
|
+
if right == nil || right.Kind != shimast.KindNumericLiteral {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
if numericLiteralText(right) != "0" {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
ctx.Report(node, "Prefer `Math.trunc(x)` over `~~x` / `x | 0` for integer truncation.")
|
|
43
|
+
case shimast.KindPrefixUnaryExpression:
|
|
44
|
+
outer := node.AsPrefixUnaryExpression()
|
|
45
|
+
if outer == nil || outer.Operator != shimast.KindTildeToken || outer.Operand == nil {
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
operand := stripParens(outer.Operand)
|
|
49
|
+
if operand == nil || operand.Kind != shimast.KindPrefixUnaryExpression {
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
inner := operand.AsPrefixUnaryExpression()
|
|
53
|
+
if inner == nil || inner.Operator != shimast.KindTildeToken {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
ctx.Report(node, "Prefer `Math.trunc(x)` over `~~x` / `x | 0` for integer truncation.")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func init() {
|
|
61
|
+
Register(unicornPreferMathTrunc{})
|
|
62
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// unicorn/prefer-modern-dom-apis: `Node#insertBefore`, `Node#replaceChild`,
|
|
2
|
+
// and `Element#insertAdjacentText` are the legacy mutation methods that
|
|
3
|
+
// still require the caller to thread a parent node and pass arguments in
|
|
4
|
+
// a specific order. The `before` / `after` / `replaceWith` family on
|
|
5
|
+
// `ChildNode` is the supported modern shape and accepts a variadic list
|
|
6
|
+
// of nodes and strings without needing the parent reference.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit each `CallExpression`, match a property-access callee
|
|
9
|
+
// whose method identifier is one of the legacy mutation names, and fire
|
|
10
|
+
// on the call. Receivers and argument shapes are not validated — the
|
|
11
|
+
// method name alone is the signal the rule wants to discourage.
|
|
12
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-modern-dom-apis.md
|
|
13
|
+
package linthost
|
|
14
|
+
|
|
15
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
16
|
+
|
|
17
|
+
var unicornPreferModernDomApisMethods = map[string]struct{}{
|
|
18
|
+
"insertBefore": {},
|
|
19
|
+
"replaceChild": {},
|
|
20
|
+
"insertAdjacentText": {},
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type unicornPreferModernDomApis struct{}
|
|
24
|
+
|
|
25
|
+
func (unicornPreferModernDomApis) Name() string { return "unicorn/prefer-modern-dom-apis" }
|
|
26
|
+
func (unicornPreferModernDomApis) Visits() []shimast.Kind {
|
|
27
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
28
|
+
}
|
|
29
|
+
func (unicornPreferModernDomApis) Check(ctx *Context, node *shimast.Node) {
|
|
30
|
+
call := node.AsCallExpression()
|
|
31
|
+
if call == nil || call.Expression == nil || call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
35
|
+
if access == nil {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
method := identifierText(access.Name())
|
|
39
|
+
if _, ok := unicornPreferModernDomApisMethods[method]; !ok {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
ctx.Report(node, "Prefer `before` / `after` / `replaceWith` over `"+method+"`.")
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
func init() {
|
|
46
|
+
Register(unicornPreferModernDomApis{})
|
|
47
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// unicorn/prefer-modern-math-apis: `Math.log(x) * Math.LOG10E` is the
|
|
2
|
+
// classical pre-ES2015 spelling of `Math.log10(x)`. The arithmetic
|
|
3
|
+
// identity is exact in the abstract but loses precision once it goes
|
|
4
|
+
// through IEEE-754 multiplication, and the modern call also reads as
|
|
5
|
+
// the operation it actually performs. The rule flags the multiplication
|
|
6
|
+
// form for `LOG10E` and `LOG2E`.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit `KindBinaryExpression`. Fire when the operator is `*`
|
|
9
|
+
// and one operand is `Math.log(...)` while the other is
|
|
10
|
+
// `PropertyAccess(Identifier("Math"), LOG10E)` or `LOG2E`. The
|
|
11
|
+
// commutative `*` operator means `Math.log(x) * Math.LOG10E` and
|
|
12
|
+
// `Math.LOG10E * Math.log(x)` both match.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-modern-math-apis.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornPreferModernMathApis struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornPreferModernMathApis) Name() string { return "unicorn/prefer-modern-math-apis" }
|
|
21
|
+
func (unicornPreferModernMathApis) Visits() []shimast.Kind {
|
|
22
|
+
return []shimast.Kind{shimast.KindBinaryExpression}
|
|
23
|
+
}
|
|
24
|
+
func (unicornPreferModernMathApis) Check(ctx *Context, node *shimast.Node) {
|
|
25
|
+
bin := node.AsBinaryExpression()
|
|
26
|
+
if bin == nil || bin.OperatorToken == nil ||
|
|
27
|
+
bin.OperatorToken.Kind != shimast.KindAsteriskToken {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
left := stripParens(bin.Left)
|
|
31
|
+
right := stripParens(bin.Right)
|
|
32
|
+
if unicornPreferModernMathApisMatchesPair(left, right) ||
|
|
33
|
+
unicornPreferModernMathApisMatchesPair(right, left) {
|
|
34
|
+
ctx.Report(node, "Prefer `Math.log10(x)` / `Math.log2(x)` over `Math.log(x) * Math.LOG10E` / `Math.log(x) * Math.LOG2E`.")
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// unicornPreferModernMathApisMatchesPair reports whether `callSide` is
|
|
39
|
+
// `Math.log(...)` and `constSide` is `Math.LOG10E` or `Math.LOG2E`.
|
|
40
|
+
func unicornPreferModernMathApisMatchesPair(callSide, constSide *shimast.Node) bool {
|
|
41
|
+
if callSide == nil || constSide == nil {
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
44
|
+
if callSide.Kind != shimast.KindCallExpression {
|
|
45
|
+
return false
|
|
46
|
+
}
|
|
47
|
+
call := callSide.AsCallExpression()
|
|
48
|
+
if call == nil || call.Expression == nil {
|
|
49
|
+
return false
|
|
50
|
+
}
|
|
51
|
+
if !isMatchingPropertyAccess(call.Expression, "Math", "log") {
|
|
52
|
+
return false
|
|
53
|
+
}
|
|
54
|
+
if constSide.Kind != shimast.KindPropertyAccessExpression {
|
|
55
|
+
return false
|
|
56
|
+
}
|
|
57
|
+
prop := constSide.AsPropertyAccessExpression()
|
|
58
|
+
if prop == nil || identifierText(prop.Expression) != "Math" {
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
switch identifierText(prop.Name()) {
|
|
62
|
+
case "LOG10E", "LOG2E":
|
|
63
|
+
return true
|
|
64
|
+
}
|
|
65
|
+
return false
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
func init() {
|
|
69
|
+
Register(unicornPreferModernMathApis{})
|
|
70
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// unicorn/prefer-module: ES modules are the spec-blessed module
|
|
2
|
+
// system and provide cross-runtime semantics that CommonJS does not.
|
|
3
|
+
// `require(...)` is dynamic, synchronous, and tied to Node's module
|
|
4
|
+
// resolver; `__dirname` and `__filename` only exist inside CJS modules
|
|
5
|
+
// and silently turn into `undefined` under ESM. The rule flags the
|
|
6
|
+
// CommonJS-only constructs so the codebase converges on ESM-native
|
|
7
|
+
// equivalents (`import` / `import.meta.dirname` / `import.meta.filename`).
|
|
8
|
+
//
|
|
9
|
+
// AST-only: visit `CallExpression` to match bare `require(...)` calls
|
|
10
|
+
// and visit `Identifier` to match value-position reads of
|
|
11
|
+
// `__dirname` / `__filename`. Identifier matches are gated by the
|
|
12
|
+
// shared value-position helper so binding sites, property keys, and
|
|
13
|
+
// type references are filtered out.
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-module.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornPreferModule struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornPreferModule) Name() string { return "unicorn/prefer-module" }
|
|
22
|
+
func (unicornPreferModule) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindCallExpression, shimast.KindIdentifier}
|
|
24
|
+
}
|
|
25
|
+
func (unicornPreferModule) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
switch node.Kind {
|
|
27
|
+
case shimast.KindCallExpression:
|
|
28
|
+
call := node.AsCallExpression()
|
|
29
|
+
if call == nil || call.Expression == nil {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
if identifierText(call.Expression) != "require" {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
ctx.Report(node, "Prefer ES modules over CommonJS — use `import` / `import.meta.dirname` / `import.meta.filename`.")
|
|
36
|
+
case shimast.KindIdentifier:
|
|
37
|
+
name := identifierText(node)
|
|
38
|
+
if name != "__dirname" && name != "__filename" {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
if !isUnicornValuePositionIdentifier(node) {
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
ctx.Report(node, "Prefer ES modules over CommonJS — use `import` / `import.meta.dirname` / `import.meta.filename`.")
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func init() {
|
|
49
|
+
Register(unicornPreferModule{})
|
|
50
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// unicorn/prefer-native-coercion-functions: an arrow that does nothing
|
|
2
|
+
// but pass its parameter to `String` / `Number` / `Boolean` / `BigInt`
|
|
3
|
+
// / `Symbol` is a wrapper around a function that already has the same
|
|
4
|
+
// signature. Passing the built-in reference directly drops a closure
|
|
5
|
+
// allocation, a stack frame, and a layer of indirection at every call
|
|
6
|
+
// site while reading as the operation it actually performs.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit `KindArrowFunction` and `KindFunctionExpression`. Fire
|
|
9
|
+
// when the function takes exactly one bare-identifier parameter AND its
|
|
10
|
+
// body is either an arrow expression body that calls one of the named
|
|
11
|
+
// constructors with the parameter as the sole argument, or a block body
|
|
12
|
+
// with a single `return <Name>(<param>);` statement.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-native-coercion-functions.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
type unicornPreferNativeCoercionFunctions struct{}
|
|
19
|
+
|
|
20
|
+
func (unicornPreferNativeCoercionFunctions) Name() string {
|
|
21
|
+
return "unicorn/prefer-native-coercion-functions"
|
|
22
|
+
}
|
|
23
|
+
func (unicornPreferNativeCoercionFunctions) Visits() []shimast.Kind {
|
|
24
|
+
return []shimast.Kind{shimast.KindArrowFunction, shimast.KindFunctionExpression}
|
|
25
|
+
}
|
|
26
|
+
func (unicornPreferNativeCoercionFunctions) Check(ctx *Context, node *shimast.Node) {
|
|
27
|
+
params := node.Parameters()
|
|
28
|
+
if len(params) != 1 {
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
paramName := parameterIdentifierName(params[0])
|
|
32
|
+
if paramName == "" {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
var body *shimast.Node
|
|
36
|
+
switch node.Kind {
|
|
37
|
+
case shimast.KindArrowFunction:
|
|
38
|
+
if arrow := node.AsArrowFunction(); arrow != nil {
|
|
39
|
+
body = arrow.Body
|
|
40
|
+
}
|
|
41
|
+
case shimast.KindFunctionExpression:
|
|
42
|
+
if fn := node.AsFunctionExpression(); fn != nil {
|
|
43
|
+
body = fn.Body
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if body == nil {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
call := unicornPreferNativeCoercionBodyCall(body)
|
|
50
|
+
if call == nil {
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
if !unicornPreferNativeCoercionIsCoercion(call, paramName) {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
ctx.Report(node, "Use the bare `String` / `Number` / `Boolean` / `BigInt` function reference instead of an arrow wrapper.")
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// unicornPreferNativeCoercionBodyCall normalizes a function body to the
|
|
60
|
+
// inner `CallExpression`. A concise arrow body returns its expression
|
|
61
|
+
// directly; a block body must contain exactly one `return <expr>;` and
|
|
62
|
+
// the returned expression must itself be a call.
|
|
63
|
+
func unicornPreferNativeCoercionBodyCall(body *shimast.Node) *shimast.Node {
|
|
64
|
+
if body == nil {
|
|
65
|
+
return nil
|
|
66
|
+
}
|
|
67
|
+
if body.Kind != shimast.KindBlock {
|
|
68
|
+
expr := stripParens(body)
|
|
69
|
+
if expr == nil || expr.Kind != shimast.KindCallExpression {
|
|
70
|
+
return nil
|
|
71
|
+
}
|
|
72
|
+
return expr
|
|
73
|
+
}
|
|
74
|
+
block := body.AsBlock()
|
|
75
|
+
if block == nil || block.Statements == nil || len(block.Statements.Nodes) != 1 {
|
|
76
|
+
return nil
|
|
77
|
+
}
|
|
78
|
+
stmt := block.Statements.Nodes[0]
|
|
79
|
+
if stmt == nil || stmt.Kind != shimast.KindReturnStatement {
|
|
80
|
+
return nil
|
|
81
|
+
}
|
|
82
|
+
ret := stmt.AsReturnStatement()
|
|
83
|
+
if ret == nil || ret.Expression == nil {
|
|
84
|
+
return nil
|
|
85
|
+
}
|
|
86
|
+
expr := stripParens(ret.Expression)
|
|
87
|
+
if expr == nil || expr.Kind != shimast.KindCallExpression {
|
|
88
|
+
return nil
|
|
89
|
+
}
|
|
90
|
+
return expr
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// unicornPreferNativeCoercionIsCoercion reports whether `call` is a
|
|
94
|
+
// `String|Number|Boolean|BigInt|Symbol(<param>)` invocation where the
|
|
95
|
+
// single argument is the parameter identifier.
|
|
96
|
+
func unicornPreferNativeCoercionIsCoercion(call *shimast.Node, paramName string) bool {
|
|
97
|
+
c := call.AsCallExpression()
|
|
98
|
+
if c == nil || c.Expression == nil {
|
|
99
|
+
return false
|
|
100
|
+
}
|
|
101
|
+
switch identifierText(c.Expression) {
|
|
102
|
+
case "String", "Number", "Boolean", "BigInt", "Symbol":
|
|
103
|
+
default:
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
106
|
+
if c.Arguments == nil || len(c.Arguments.Nodes) != 1 {
|
|
107
|
+
return false
|
|
108
|
+
}
|
|
109
|
+
return identifierText(stripParens(c.Arguments.Nodes[0])) == paramName
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
func init() {
|
|
113
|
+
Register(unicornPreferNativeCoercionFunctions{})
|
|
114
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// unicorn/prefer-negative-index: `arr.slice(arr.length - N)` is the
|
|
2
|
+
// long-hand spelling of `arr.slice(-N)`. The subtraction repeats the
|
|
3
|
+
// receiver, allocates an extra read, and obscures the intent. The same
|
|
4
|
+
// idiom shows up across `slice`, `splice`, `toSpliced`, `at`, and
|
|
5
|
+
// `lastIndexOf`; all five accept a negative index that means the same
|
|
6
|
+
// thing the subtraction expresses, so the rule pushes authors there.
|
|
7
|
+
//
|
|
8
|
+
// AST-only: visit `KindCallExpression`. Fire when the callee is
|
|
9
|
+
// `PropertyAccess(_, name)` for one of those five method names AND the
|
|
10
|
+
// first argument is a `KindBinaryExpression` with operator `-`, LHS a
|
|
11
|
+
// `PropertyAccess(_, length)`, and RHS a positive numeric literal.
|
|
12
|
+
// Reports on the offending argument so the diagnostic anchors to the
|
|
13
|
+
// expression the author would rewrite.
|
|
14
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-negative-index.md
|
|
15
|
+
package linthost
|
|
16
|
+
|
|
17
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
18
|
+
|
|
19
|
+
type unicornPreferNegativeIndex struct{}
|
|
20
|
+
|
|
21
|
+
func (unicornPreferNegativeIndex) Name() string { return "unicorn/prefer-negative-index" }
|
|
22
|
+
func (unicornPreferNegativeIndex) Visits() []shimast.Kind {
|
|
23
|
+
return []shimast.Kind{shimast.KindCallExpression}
|
|
24
|
+
}
|
|
25
|
+
func (unicornPreferNegativeIndex) Check(ctx *Context, node *shimast.Node) {
|
|
26
|
+
call := node.AsCallExpression()
|
|
27
|
+
if call == nil || call.Expression == nil {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
if call.Expression.Kind != shimast.KindPropertyAccessExpression {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
access := call.Expression.AsPropertyAccessExpression()
|
|
34
|
+
if access == nil {
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
switch identifierText(access.Name()) {
|
|
38
|
+
case "slice", "splice", "toSpliced", "at", "lastIndexOf":
|
|
39
|
+
default:
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) == 0 {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
first := stripParens(call.Arguments.Nodes[0])
|
|
46
|
+
if first == nil || first.Kind != shimast.KindBinaryExpression {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
bin := first.AsBinaryExpression()
|
|
50
|
+
if bin == nil || bin.OperatorToken == nil ||
|
|
51
|
+
bin.OperatorToken.Kind != shimast.KindMinusToken {
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
left := stripParens(bin.Left)
|
|
55
|
+
if left == nil || left.Kind != shimast.KindPropertyAccessExpression {
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
prop := left.AsPropertyAccessExpression()
|
|
59
|
+
if prop == nil || identifierText(prop.Name()) != "length" {
|
|
60
|
+
return
|
|
61
|
+
}
|
|
62
|
+
right := stripParens(bin.Right)
|
|
63
|
+
if right == nil || right.Kind != shimast.KindNumericLiteral {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
if !unicornPreferAtIsPositiveInteger(numericLiteralText(right)) {
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
ctx.Report(first, "Use a negative index (`-N`) instead of `arr.length - N`.")
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
func init() {
|
|
73
|
+
Register(unicornPreferNegativeIndex{})
|
|
74
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// unicorn/prefer-node-protocol: the bare Node built-in specifier
|
|
2
|
+
// (`import "fs"` / `require("fs")`) is ambiguous — a userland package
|
|
3
|
+
// named `fs` on the module path resolves first, silently hijacking
|
|
4
|
+
// what readers assume is the Node built-in. The `node:` prefix removes
|
|
5
|
+
// the ambiguity and is supported by every modern Node release.
|
|
6
|
+
//
|
|
7
|
+
// AST-only: visit `ImportDeclaration` for the static-import case and
|
|
8
|
+
// `CallExpression` for the `require(...)` case. Both reduce to a
|
|
9
|
+
// single string-literal specifier compared against the allowlist of
|
|
10
|
+
// Node built-in module names; matching specifiers (without the
|
|
11
|
+
// `node:` prefix) fire on the literal node itself so the diagnostic
|
|
12
|
+
// underlines the specifier text the reader needs to change.
|
|
13
|
+
// https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-node-protocol.md
|
|
14
|
+
package linthost
|
|
15
|
+
|
|
16
|
+
import shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
|
+
|
|
18
|
+
// unicornPreferNodeProtocolBuiltins enumerates the bare Node built-in
|
|
19
|
+
// module specifiers that must be rewritten to use the `node:` prefix.
|
|
20
|
+
var unicornPreferNodeProtocolBuiltins = map[string]struct{}{
|
|
21
|
+
"assert": {},
|
|
22
|
+
"assert/strict": {},
|
|
23
|
+
"async_hooks": {},
|
|
24
|
+
"buffer": {},
|
|
25
|
+
"child_process": {},
|
|
26
|
+
"cluster": {},
|
|
27
|
+
"console": {},
|
|
28
|
+
"constants": {},
|
|
29
|
+
"crypto": {},
|
|
30
|
+
"dgram": {},
|
|
31
|
+
"diagnostics_channel": {},
|
|
32
|
+
"dns": {},
|
|
33
|
+
"dns/promises": {},
|
|
34
|
+
"domain": {},
|
|
35
|
+
"events": {},
|
|
36
|
+
"fs": {},
|
|
37
|
+
"fs/promises": {},
|
|
38
|
+
"http": {},
|
|
39
|
+
"http2": {},
|
|
40
|
+
"https": {},
|
|
41
|
+
"inspector": {},
|
|
42
|
+
"module": {},
|
|
43
|
+
"net": {},
|
|
44
|
+
"os": {},
|
|
45
|
+
"path": {},
|
|
46
|
+
"path/posix": {},
|
|
47
|
+
"path/win32": {},
|
|
48
|
+
"perf_hooks": {},
|
|
49
|
+
"process": {},
|
|
50
|
+
"punycode": {},
|
|
51
|
+
"querystring": {},
|
|
52
|
+
"readline": {},
|
|
53
|
+
"readline/promises": {},
|
|
54
|
+
"repl": {},
|
|
55
|
+
"stream": {},
|
|
56
|
+
"stream/consumers": {},
|
|
57
|
+
"stream/promises": {},
|
|
58
|
+
"stream/web": {},
|
|
59
|
+
"string_decoder": {},
|
|
60
|
+
"sys": {},
|
|
61
|
+
"timers": {},
|
|
62
|
+
"timers/promises": {},
|
|
63
|
+
"tls": {},
|
|
64
|
+
"trace_events": {},
|
|
65
|
+
"tty": {},
|
|
66
|
+
"url": {},
|
|
67
|
+
"util": {},
|
|
68
|
+
"util/types": {},
|
|
69
|
+
"v8": {},
|
|
70
|
+
"vm": {},
|
|
71
|
+
"wasi": {},
|
|
72
|
+
"worker_threads": {},
|
|
73
|
+
"zlib": {},
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
type unicornPreferNodeProtocol struct{}
|
|
77
|
+
|
|
78
|
+
func (unicornPreferNodeProtocol) Name() string { return "unicorn/prefer-node-protocol" }
|
|
79
|
+
func (unicornPreferNodeProtocol) Visits() []shimast.Kind {
|
|
80
|
+
return []shimast.Kind{shimast.KindImportDeclaration, shimast.KindCallExpression}
|
|
81
|
+
}
|
|
82
|
+
func (unicornPreferNodeProtocol) Check(ctx *Context, node *shimast.Node) {
|
|
83
|
+
switch node.Kind {
|
|
84
|
+
case shimast.KindImportDeclaration:
|
|
85
|
+
imp := node.AsImportDeclaration()
|
|
86
|
+
if imp == nil || imp.ModuleSpecifier == nil {
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
if imp.ModuleSpecifier.Kind != shimast.KindStringLiteral {
|
|
90
|
+
return
|
|
91
|
+
}
|
|
92
|
+
specifier := stringLiteralText(imp.ModuleSpecifier)
|
|
93
|
+
if _, ok := unicornPreferNodeProtocolBuiltins[specifier]; !ok {
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
ctx.Report(imp.ModuleSpecifier, "Prefer `node:` protocol when importing Node built-ins.")
|
|
97
|
+
case shimast.KindCallExpression:
|
|
98
|
+
call := node.AsCallExpression()
|
|
99
|
+
if call == nil || call.Expression == nil {
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
if identifierText(call.Expression) != "require" {
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
if call.Arguments == nil || len(call.Arguments.Nodes) != 1 {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
arg := call.Arguments.Nodes[0]
|
|
109
|
+
if arg == nil || arg.Kind != shimast.KindStringLiteral {
|
|
110
|
+
return
|
|
111
|
+
}
|
|
112
|
+
specifier := stringLiteralText(arg)
|
|
113
|
+
if _, ok := unicornPreferNodeProtocolBuiltins[specifier]; !ok {
|
|
114
|
+
return
|
|
115
|
+
}
|
|
116
|
+
ctx.Report(arg, "Prefer `node:` protocol when importing Node built-ins.")
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
func init() {
|
|
121
|
+
Register(unicornPreferNodeProtocol{})
|
|
122
|
+
}
|