@ttsc/lint 0.14.0-dev.20260529.1 → 0.14.0
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 +85 -87
- package/lib/defaultFormat.d.ts +10 -6
- package/lib/defaultFormat.js +10 -6
- package/lib/defaultFormat.js.map +1 -1
- package/lib/structures/ITtscLintConfig.d.ts +5 -5
- package/lib/structures/TtscLintRuleSetting.d.ts +19 -19
- package/lib/structures/{ITtscLintFormat.d.ts → format/ITtscLintFormat.d.ts} +45 -70
- package/lib/structures/format/ITtscLintFormat.js.map +1 -0
- package/lib/structures/format/ITtscLintFormatJsDoc.d.ts +15 -0
- package/lib/structures/format/ITtscLintFormatJsDoc.js +3 -0
- 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 +1 -1
- package/lib/structures/index.js +1 -1
- package/lib/structures/index.js.map +1 -1
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +18 -27
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js +4 -5
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.js.map +1 -1
- package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +29 -33
- package/lib/structures/rules/ITtscLintContributorRules.d.ts +6 -7
- package/lib/structures/rules/ITtscLintCoreRules.d.ts +380 -408
- package/lib/structures/rules/ITtscLintCypressRuleOptions.d.ts +5 -5
- package/lib/structures/rules/ITtscLintCypressRuleOptions.js +2 -2
- package/lib/structures/rules/ITtscLintCypressRules.d.ts +34 -38
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.d.ts +21 -24
- package/lib/structures/rules/ITtscLintFunctionalRuleOptions.js +2 -2
- package/lib/structures/rules/ITtscLintFunctionalRules.d.ts +51 -56
- package/lib/structures/rules/ITtscLintJestRules.d.ts +63 -74
- package/lib/structures/rules/ITtscLintJsdocRules.d.ts +47 -54
- package/lib/structures/rules/ITtscLintJsxA11yRules.d.ts +94 -102
- package/lib/structures/rules/ITtscLintNextjsRules.d.ts +50 -55
- package/lib/structures/rules/ITtscLintPlaywrightRules.d.ts +104 -122
- package/lib/structures/rules/ITtscLintPromiseRules.d.ts +62 -71
- package/lib/structures/rules/ITtscLintReactPerfRuleOptions.d.ts +4 -4
- package/lib/structures/rules/ITtscLintReactPerfRules.d.ts +17 -19
- package/lib/structures/rules/ITtscLintReactRuleOptions.d.ts +8 -10
- package/lib/structures/rules/ITtscLintReactRuleOptions.js +1 -2
- package/lib/structures/rules/ITtscLintReactRuleOptions.js.map +1 -1
- package/lib/structures/rules/ITtscLintReactRules.d.ts +91 -104
- package/lib/structures/rules/ITtscLintRegexpRules.d.ts +46 -54
- package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +7 -8
- package/lib/structures/rules/ITtscLintSecurityRules.d.ts +45 -52
- package/lib/structures/rules/ITtscLintSolidRules.d.ts +53 -56
- package/lib/structures/rules/ITtscLintStorybookRuleOptions.d.ts +3 -4
- package/lib/structures/rules/ITtscLintStorybookRules.d.ts +60 -69
- package/lib/structures/rules/ITtscLintTanstackQueryRules.d.ts +31 -37
- package/lib/structures/rules/ITtscLintTestingLibraryRuleOptions.d.ts +2 -3
- package/lib/structures/rules/ITtscLintTestingLibraryRules.d.ts +102 -119
- package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +460 -518
- package/lib/structures/rules/ITtscLintVitestRules.d.ts +43 -51
- package/linthost/config.go +89 -72
- package/linthost/config_format.go +265 -99
- package/linthost/directives.go +5 -1
- package/linthost/display_width.go +72 -0
- package/linthost/fix.go +26 -1
- package/linthost/format.go +222 -25
- package/linthost/format_editor_settings.go +262 -0
- package/linthost/lsp.go +8 -4
- package/linthost/print_dispatch.go +3 -0
- package/linthost/print_doc.go +13 -0
- package/linthost/print_engine.go +68 -11
- package/linthost/print_nodes_array.go +108 -5
- package/linthost/print_nodes_call.go +515 -74
- package/linthost/print_nodes_function.go +25 -0
- package/linthost/print_nodes_imports.go +47 -14
- package/linthost/print_nodes_list.go +191 -8
- package/linthost/print_nodes_object.go +12 -6
- package/linthost/print_nodes_ternary.go +106 -0
- package/linthost/rules_boundaries.go +400 -400
- package/linthost/rules_camelcase.go +81 -81
- package/linthost/rules_complexity.go +52 -51
- package/linthost/rules_consistent_return.go +81 -81
- package/linthost/rules_core_extra.go +472 -472
- package/linthost/rules_curly.go +43 -43
- package/linthost/rules_default_case.go +15 -15
- package/linthost/rules_default_case_last.go +22 -22
- 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 +664 -0
- package/linthost/rules_format_indent.go +616 -0
- package/linthost/rules_format_jsdoc.go +4 -4
- 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 +185 -69
- package/linthost/rules_format_quote_props.go +169 -0
- package/linthost/rules_format_quotes.go +75 -29
- package/linthost/rules_format_semi.go +185 -10
- package/linthost/rules_format_sort_imports.go +456 -121
- package/linthost/rules_format_statement_split.go +368 -0
- package/linthost/rules_format_ternary_nullish_parens.go +77 -0
- package/linthost/rules_format_trailing_comma.go +21 -2
- package/linthost/rules_format_whitespace.go +336 -0
- package/linthost/rules_functional.go +688 -688
- package/linthost/rules_gap.go +146 -11
- package/linthost/rules_grouped_accessor_pairs.go +60 -60
- package/linthost/rules_guard_for_in.go +122 -122
- package/linthost/rules_id_length.go +44 -44
- package/linthost/rules_imports.go +11 -3
- package/linthost/rules_init_declarations.go +25 -25
- package/linthost/rules_jsx_a11y.go +844 -844
- package/linthost/rules_max_classes_per_file.go +24 -24
- package/linthost/rules_max_depth.go +43 -43
- package/linthost/rules_max_lines.go +53 -53
- package/linthost/rules_max_lines_per_function.go +28 -28
- package/linthost/rules_max_nested_callbacks.go +26 -26
- package/linthost/rules_max_params.go +20 -20
- package/linthost/rules_max_statements.go +29 -29
- package/linthost/rules_nextjs.go +5 -5
- package/linthost/rules_no_else_return.go +38 -38
- package/linthost/rules_no_empty_named_blocks.go +45 -45
- package/linthost/rules_no_import_assign.go +96 -96
- package/linthost/rules_no_invalid_this.go +19 -19
- package/linthost/rules_no_loop_func.go +43 -43
- package/linthost/rules_no_magic_numbers.go +60 -60
- package/linthost/rules_no_mixed_operators.go +44 -44
- package/linthost/rules_no_param_reassign.go +64 -64
- package/linthost/rules_no_restricted_imports.go +45 -45
- package/linthost/rules_no_restricted_syntax.go +17 -17
- package/linthost/rules_no_shadow.go +112 -112
- package/linthost/rules_no_unreachable.go +36 -36
- package/linthost/rules_no_useless_assignment.go +79 -79
- package/linthost/rules_no_useless_constructor.go +167 -167
- package/linthost/rules_no_useless_return.go +28 -28
- package/linthost/rules_prefer_arrow_callback.go +74 -74
- package/linthost/rules_prefer_destructuring.go +61 -61
- package/linthost/rules_prefer_named_capture_group.go +87 -87
- package/linthost/rules_prefer_rest_params.go +61 -61
- package/linthost/rules_promise.go +800 -800
- package/linthost/rules_react.go +600 -600
- package/linthost/rules_react_extras.go +162 -162
- package/linthost/rules_react_hooks.go +2 -2
- package/linthost/rules_react_perf.go +231 -231
- package/linthost/rules_regexp.go +293 -293
- package/linthost/rules_security.go +613 -613
- package/linthost/rules_sort_imports.go +37 -37
- package/linthost/rules_sort_keys.go +88 -88
- package/linthost/rules_suggestions.go +13 -0
- package/linthost/rules_ts.go +2 -2
- package/linthost/rules_ts_async.go +247 -247
- package/linthost/rules_ts_class_literal_property_style.go +64 -64
- package/linthost/rules_ts_consistent_type_exports.go +209 -209
- package/linthost/rules_ts_explicit_function_return_type.go +35 -35
- package/linthost/rules_ts_extra.go +6 -2
- package/linthost/rules_ts_no_base_to_string.go +140 -140
- package/linthost/rules_ts_no_confusing_void.go +28 -28
- package/linthost/rules_ts_no_deprecated.go +110 -110
- package/linthost/rules_ts_no_for_in_array.go +45 -45
- package/linthost/rules_ts_no_magic_numbers.go +67 -67
- package/linthost/rules_ts_no_meaningless_void_operator.go +44 -44
- package/linthost/rules_ts_no_misused_spread.go +64 -64
- package/linthost/rules_ts_no_redundant_type_constituents.go +72 -72
- package/linthost/rules_ts_no_restricted_types.go +28 -28
- package/linthost/rules_ts_no_unnecessary_boolean_literal_compare.go +87 -87
- package/linthost/rules_ts_no_unnecessary_condition.go +184 -184
- package/linthost/rules_ts_no_unnecessary_qualifier.go +72 -72
- package/linthost/rules_ts_no_unnecessary_template_expression.go +120 -120
- package/linthost/rules_ts_no_unnecessary_type_arguments.go +171 -171
- package/linthost/rules_ts_no_unnecessary_type_assertion.go +90 -90
- package/linthost/rules_ts_no_unsafe_argument.go +50 -50
- package/linthost/rules_ts_no_unsafe_assignment.go +60 -60
- package/linthost/rules_ts_no_unsafe_call.go +40 -40
- package/linthost/rules_ts_no_unsafe_enum_comparison.go +147 -147
- package/linthost/rules_ts_no_unsafe_member_access.go +29 -29
- package/linthost/rules_ts_no_unsafe_return.go +64 -64
- package/linthost/rules_ts_no_unsafe_unary_minus.go +42 -42
- package/linthost/rules_ts_no_useless_constructor.go +20 -20
- package/linthost/rules_ts_non_nullable_type_assertion_style.go +60 -60
- package/linthost/rules_ts_parameter_properties.go +10 -10
- package/linthost/rules_ts_prefer_find.go +116 -116
- package/linthost/rules_ts_prefer_includes.go +173 -173
- package/linthost/rules_ts_prefer_nullish_coalescing.go +54 -54
- package/linthost/rules_ts_prefer_optional_chain.go +156 -156
- package/linthost/rules_ts_prefer_promise_reject_errors.go +104 -104
- package/linthost/rules_ts_prefer_readonly.go +31 -31
- package/linthost/rules_ts_prefer_reduce_type_parameter.go +74 -74
- package/linthost/rules_ts_prefer_regexp_exec.go +69 -69
- package/linthost/rules_ts_prefer_return_this_type.go +79 -79
- package/linthost/rules_ts_prefer_string_starts_ends_with.go +237 -237
- package/linthost/rules_ts_promise_function_async.go +41 -41
- package/linthost/rules_ts_related_getter_setter_pairs.go +61 -61
- package/linthost/rules_ts_require_array_sort_compare.go +58 -58
- package/linthost/rules_ts_restrict_plus_operands.go +82 -82
- package/linthost/rules_ts_restrict_template_expressions.go +50 -50
- package/linthost/rules_ts_simple.go +249 -249
- package/linthost/rules_ts_sort_type_constituents.go +88 -88
- package/linthost/rules_ts_strict_boolean_expressions.go +103 -103
- package/linthost/rules_ts_switch_exhaustiveness_check.go +90 -90
- package/linthost/rules_ts_unbound_method.go +65 -65
- package/linthost/rules_tsdoc.go +88 -88
- package/linthost/rules_unicorn_better_regex.go +1 -1
- package/linthost/rules_unicorn_catch_error_name.go +19 -19
- package/linthost/rules_unicorn_consistent_assert.go +20 -20
- package/linthost/rules_unicorn_consistent_date_clone.go +27 -27
- package/linthost/rules_unicorn_consistent_destructuring.go +3 -3
- package/linthost/rules_unicorn_consistent_empty_array_spread.go +34 -34
- package/linthost/rules_unicorn_consistent_existence_index_check.go +42 -42
- package/linthost/rules_unicorn_consistent_function_scoping.go +3 -3
- package/linthost/rules_unicorn_consistent_template_literal_escape.go +3 -3
- package/linthost/rules_unicorn_custom_error_definition.go +92 -92
- package/linthost/rules_unicorn_empty_brace_spaces.go +47 -47
- package/linthost/rules_unicorn_error_message.go +34 -34
- package/linthost/rules_unicorn_escape_case.go +14 -14
- package/linthost/rules_unicorn_expiring_todo_comments.go +36 -36
- package/linthost/rules_unicorn_explicit_length_check.go +51 -51
- package/linthost/rules_unicorn_filename_case.go +1 -1
- package/linthost/rules_unicorn_import_style.go +1 -1
- package/linthost/rules_unicorn_isolated_functions.go +2 -2
- package/linthost/rules_unicorn_new_for_builtins.go +49 -49
- package/linthost/rules_unicorn_no_abusive_eslint_disable.go +31 -31
- package/linthost/rules_unicorn_no_accessor_recursion.go +69 -69
- package/linthost/rules_unicorn_no_anonymous_default_export.go +40 -40
- package/linthost/rules_unicorn_no_array_callback_reference.go +33 -33
- package/linthost/rules_unicorn_no_array_for_each.go +14 -14
- package/linthost/rules_unicorn_no_array_method_this_argument.go +29 -29
- package/linthost/rules_unicorn_no_array_reduce.go +15 -15
- package/linthost/rules_unicorn_no_array_reverse.go +17 -17
- package/linthost/rules_unicorn_no_array_sort.go +17 -17
- package/linthost/rules_unicorn_no_await_expression_member.go +12 -12
- package/linthost/rules_unicorn_no_await_in_promise_methods.go +38 -38
- package/linthost/rules_unicorn_no_console_spaces.go +30 -30
- package/linthost/rules_unicorn_no_document_cookie.go +13 -13
- package/linthost/rules_unicorn_no_empty_file.go +16 -16
- package/linthost/rules_unicorn_no_for_loop.go +58 -58
- package/linthost/rules_unicorn_no_hex_escape.go +11 -11
- package/linthost/rules_unicorn_no_immediate_mutation.go +55 -55
- package/linthost/rules_unicorn_no_instanceof_builtins.go +34 -34
- package/linthost/rules_unicorn_no_invalid_fetch_options.go +52 -52
- package/linthost/rules_unicorn_no_invalid_remove_event_listener.go +25 -25
- package/linthost/rules_unicorn_no_keyword_prefix.go +56 -56
- package/linthost/rules_unicorn_no_lonely_if.go +21 -21
- package/linthost/rules_unicorn_no_magic_array_flat_depth.go +22 -22
- package/linthost/rules_unicorn_no_named_default.go +25 -25
- package/linthost/rules_unicorn_no_negated_condition.go +54 -54
- package/linthost/rules_unicorn_no_negation_in_equality_check.go +23 -23
- package/linthost/rules_unicorn_no_nested_ternary.go +15 -15
- package/linthost/rules_unicorn_no_new_array.go +5 -5
- package/linthost/rules_unicorn_no_new_buffer.go +5 -5
- package/linthost/rules_unicorn_no_null.go +2 -2
- package/linthost/rules_unicorn_no_object_as_default_parameter.go +19 -19
- package/linthost/rules_unicorn_no_process_exit.go +17 -17
- package/linthost/rules_unicorn_no_single_promise_in_promise_methods.go +29 -29
- package/linthost/rules_unicorn_no_static_only_class.go +27 -27
- package/linthost/rules_unicorn_no_thenable.go +47 -47
- package/linthost/rules_unicorn_no_this_assignment.go +10 -10
- package/linthost/rules_unicorn_no_typeof_undefined.go +31 -31
- package/linthost/rules_unicorn_no_unnecessary_array_flat_depth.go +23 -23
- package/linthost/rules_unicorn_no_unnecessary_array_splice_count.go +37 -37
- package/linthost/rules_unicorn_no_unnecessary_await.go +24 -24
- package/linthost/rules_unicorn_no_unnecessary_slice_end.go +22 -22
- package/linthost/rules_unicorn_no_unreadable_array_destructuring.go +67 -67
- package/linthost/rules_unicorn_no_unreadable_iife.go +22 -22
- package/linthost/rules_unicorn_no_useless_collection_argument.go +34 -34
- package/linthost/rules_unicorn_no_useless_error_capture_stack_trace.go +18 -18
- package/linthost/rules_unicorn_no_useless_fallback_in_spread.go +49 -49
- package/linthost/rules_unicorn_no_useless_iterator_to_array.go +41 -41
- package/linthost/rules_unicorn_no_useless_length_check.go +82 -82
- package/linthost/rules_unicorn_no_useless_promise_resolve_reject.go +42 -42
- package/linthost/rules_unicorn_no_useless_spread.go +38 -38
- package/linthost/rules_unicorn_no_useless_switch_case.go +29 -29
- package/linthost/rules_unicorn_no_useless_undefined.go +25 -25
- package/linthost/rules_unicorn_no_zero_fractions.go +17 -17
- package/linthost/rules_unicorn_number_literal_case.go +33 -33
- package/linthost/rules_unicorn_numeric_separators_style.go +36 -36
- package/linthost/rules_unicorn_prefer_add_event_listener.go +30 -30
- package/linthost/rules_unicorn_prefer_array_find.go +27 -27
- package/linthost/rules_unicorn_prefer_array_flat.go +25 -25
- package/linthost/rules_unicorn_prefer_array_flat_map.go +37 -37
- package/linthost/rules_unicorn_prefer_array_index_of.go +108 -108
- package/linthost/rules_unicorn_prefer_array_some.go +43 -43
- package/linthost/rules_unicorn_prefer_at.go +42 -42
- package/linthost/rules_unicorn_prefer_bigint_literals.go +42 -42
- package/linthost/rules_unicorn_prefer_blob_reading_methods.go +15 -15
- package/linthost/rules_unicorn_prefer_class_fields.go +57 -57
- package/linthost/rules_unicorn_prefer_classlist_toggle.go +76 -76
- package/linthost/rules_unicorn_prefer_code_point.go +21 -21
- package/linthost/rules_unicorn_prefer_date_now.go +47 -47
- package/linthost/rules_unicorn_prefer_default_parameters.go +96 -96
- package/linthost/rules_unicorn_prefer_dom_node_append.go +14 -14
- package/linthost/rules_unicorn_prefer_dom_node_dataset.go +27 -27
- package/linthost/rules_unicorn_prefer_dom_node_remove.go +17 -17
- package/linthost/rules_unicorn_prefer_dom_node_text_content.go +11 -11
- package/linthost/rules_unicorn_prefer_event_target.go +10 -10
- package/linthost/rules_unicorn_prefer_export_from.go +99 -99
- package/linthost/rules_unicorn_prefer_global_this.go +91 -91
- package/linthost/rules_unicorn_prefer_import_meta_properties.go +38 -38
- package/linthost/rules_unicorn_prefer_includes.go +108 -108
- package/linthost/rules_unicorn_prefer_json_parse_buffer.go +37 -37
- package/linthost/rules_unicorn_prefer_keyboard_event_key.go +10 -10
- package/linthost/rules_unicorn_prefer_logical_operator_over_ternary.go +20 -20
- package/linthost/rules_unicorn_prefer_math_min_max.go +33 -33
- package/linthost/rules_unicorn_prefer_math_trunc.go +32 -32
- package/linthost/rules_unicorn_prefer_modern_dom_apis.go +18 -18
- package/linthost/rules_unicorn_prefer_modern_math_apis.go +38 -38
- package/linthost/rules_unicorn_prefer_module.go +22 -22
- package/linthost/rules_unicorn_prefer_native_coercion_functions.go +73 -73
- package/linthost/rules_unicorn_prefer_negative_index.go +46 -46
- package/linthost/rules_unicorn_prefer_node_protocol.go +90 -90
- package/linthost/rules_unicorn_prefer_number_properties.go +57 -57
- package/linthost/rules_unicorn_prefer_object_from_entries.go +26 -26
- package/linthost/rules_unicorn_prefer_optional_catch_binding.go +24 -24
- package/linthost/rules_unicorn_prefer_prototype_methods.go +25 -25
- package/linthost/rules_unicorn_prefer_query_selector.go +25 -25
- package/linthost/rules_unicorn_prefer_reflect_apply.go +10 -10
- package/linthost/rules_unicorn_prefer_regexp_test_rule.go +47 -47
- package/linthost/rules_unicorn_prefer_response_static_json.go +26 -26
- package/linthost/rules_unicorn_prefer_set_has.go +16 -16
- package/linthost/rules_unicorn_prefer_set_size.go +22 -22
- package/linthost/rules_unicorn_prefer_simple_condition_first.go +3 -3
- package/linthost/rules_unicorn_prefer_single_call.go +59 -59
- package/linthost/rules_unicorn_prefer_spread.go +24 -24
- package/linthost/rules_unicorn_prefer_string_raw.go +12 -12
- package/linthost/rules_unicorn_prefer_string_replace_all.go +46 -46
- package/linthost/rules_unicorn_prefer_string_slice.go +17 -17
- package/linthost/rules_unicorn_prefer_string_starts_ends_with.go +104 -104
- package/linthost/rules_unicorn_prefer_string_trim_start_end.go +21 -21
- package/linthost/rules_unicorn_prefer_structured_clone.go +36 -36
- package/linthost/rules_unicorn_prefer_switch.go +65 -65
- package/linthost/rules_unicorn_prefer_ternary.go +35 -35
- package/linthost/rules_unicorn_prefer_top_level_await.go +34 -34
- package/linthost/rules_unicorn_prefer_type_error.go +84 -84
- package/linthost/rules_unicorn_prevent_abbreviations.go +68 -68
- package/linthost/rules_unicorn_relative_url_style.go +19 -19
- package/linthost/rules_unicorn_require_array_join_separator.go +18 -18
- package/linthost/rules_unicorn_require_module_attributes.go +25 -25
- package/linthost/rules_unicorn_require_module_specifiers.go +28 -28
- package/linthost/rules_unicorn_require_number_to_fixed_digits_argument.go +18 -18
- package/linthost/rules_unicorn_require_post_message_target_origin.go +18 -18
- package/linthost/rules_unicorn_string_content.go +1 -1
- package/linthost/rules_unicorn_switch_case_braces.go +16 -16
- package/linthost/rules_unicorn_switch_case_break_position.go +3 -3
- package/linthost/rules_unicorn_template_indent.go +1 -1
- package/linthost/rules_unicorn_text_encoding_identifier_case.go +36 -36
- package/linthost/rules_unicorn_throw_new_error.go +30 -30
- package/linthost/rules_var.go +273 -3
- package/package.json +3 -3
- package/src/defaultFormat.ts +11 -7
- package/src/structures/ITtscLintConfig.ts +5 -5
- package/src/structures/TtscLintRuleSetting.ts +19 -19
- package/src/structures/{ITtscLintFormat.ts → format/ITtscLintFormat.ts} +48 -75
- package/src/structures/format/ITtscLintFormatJsDoc.ts +16 -0
- package/src/structures/format/ITtscLintFormatSortImports.ts +62 -0
- package/src/structures/format/index.ts +3 -0
- package/src/structures/index.ts +1 -1
- package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +20 -31
- package/src/structures/rules/ITtscLintBoundariesRules.ts +32 -36
- package/src/structures/rules/ITtscLintContributorRules.ts +6 -7
- package/src/structures/rules/ITtscLintCoreRules.ts +380 -408
- package/src/structures/rules/ITtscLintCypressRuleOptions.ts +5 -5
- package/src/structures/rules/ITtscLintCypressRules.ts +34 -38
- package/src/structures/rules/ITtscLintFunctionalRuleOptions.ts +28 -41
- package/src/structures/rules/ITtscLintFunctionalRules.ts +51 -56
- package/src/structures/rules/ITtscLintJestRules.ts +63 -74
- package/src/structures/rules/ITtscLintJsdocRules.ts +47 -54
- package/src/structures/rules/ITtscLintJsxA11yRules.ts +94 -102
- package/src/structures/rules/ITtscLintNextjsRules.ts +50 -55
- package/src/structures/rules/ITtscLintPlaywrightRules.ts +104 -122
- package/src/structures/rules/ITtscLintPromiseRules.ts +62 -71
- package/src/structures/rules/ITtscLintReactPerfRuleOptions.ts +4 -4
- package/src/structures/rules/ITtscLintReactPerfRules.ts +17 -19
- package/src/structures/rules/ITtscLintReactRuleOptions.ts +8 -10
- package/src/structures/rules/ITtscLintReactRules.ts +91 -104
- package/src/structures/rules/ITtscLintRegexpRules.ts +46 -54
- package/src/structures/rules/ITtscLintRuleOptionsMap.ts +7 -8
- package/src/structures/rules/ITtscLintSecurityRules.ts +45 -52
- package/src/structures/rules/ITtscLintSolidRules.ts +53 -56
- package/src/structures/rules/ITtscLintStorybookRuleOptions.ts +3 -4
- package/src/structures/rules/ITtscLintStorybookRules.ts +60 -69
- package/src/structures/rules/ITtscLintTanstackQueryRules.ts +31 -37
- package/src/structures/rules/ITtscLintTestingLibraryRuleOptions.ts +2 -3
- package/src/structures/rules/ITtscLintTestingLibraryRules.ts +102 -119
- package/src/structures/rules/ITtscLintTypeScriptRules.ts +460 -518
- package/src/structures/rules/ITtscLintVitestRules.ts +43 -51
- package/lib/structures/ITtscLintFormat.js.map +0 -1
- /package/lib/structures/{ITtscLintFormat.js → format/ITtscLintFormat.js} +0 -0
|
@@ -59,35 +59,63 @@ func (formatQuotes) Check(ctx *Context, node *shimast.Node) {
|
|
|
59
59
|
}
|
|
60
60
|
src := ctx.File.Text()
|
|
61
61
|
raw := src[pos:end]
|
|
62
|
+
isDouble := raw[0] == '"' && raw[len(raw)-1] == '"'
|
|
63
|
+
isSingle := raw[0] == '\'' && raw[len(raw)-1] == '\''
|
|
64
|
+
if !isDouble && !isSingle {
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
inner := raw[1 : len(raw)-1]
|
|
68
|
+
|
|
69
|
+
// Prettier's quote rule chooses the quote that yields fewer escapes and
|
|
70
|
+
// only falls back to the configured preference on a tie. So the rule
|
|
71
|
+
// must inspect both directions regardless of the literal's current
|
|
72
|
+
// quote: a double-quoted `"\""` (one escape) is rewritten to single
|
|
73
|
+
// `'"'` (zero escapes) even under prefer:"double", and symmetrically a
|
|
74
|
+
// single-quoted literal flips to double when double is strictly cheaper
|
|
75
|
+
// even under prefer:"single". On a tie the preferred quote wins, which
|
|
76
|
+
// for a literal already in the preferred quote means no edit (keeping
|
|
77
|
+
// the rule idempotent).
|
|
62
78
|
if preferSingle {
|
|
63
|
-
if
|
|
79
|
+
if isDouble {
|
|
80
|
+
// Tie resolves to single (the preference), so convert whenever
|
|
81
|
+
// single is no worse, exactly convertDoubleQuotedToSingle's `ok`.
|
|
82
|
+
converted, ok := convertDoubleQuotedToSingle(inner)
|
|
83
|
+
if ok && converted != raw {
|
|
84
|
+
ctx.ReportRangeFix(pos, end, "Strings must use single quotes.",
|
|
85
|
+
TextEdit{Pos: pos, End: end, Text: converted})
|
|
86
|
+
}
|
|
64
87
|
return
|
|
65
88
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
89
|
+
// Already single: only flip to double when double is STRICTLY cheaper,
|
|
90
|
+
// so a tie keeps the preferred single quote.
|
|
91
|
+
escapedSingle, unescapedDouble := countSingleEscapes(inner)
|
|
92
|
+
if unescapedDouble < escapedSingle {
|
|
93
|
+
if converted, ok := convertSingleQuotedToDouble(inner); ok && converted != raw {
|
|
94
|
+
ctx.ReportRangeFix(pos, end, "Strings must use double quotes.",
|
|
95
|
+
TextEdit{Pos: pos, End: end, Text: converted})
|
|
96
|
+
}
|
|
69
97
|
}
|
|
70
|
-
ctx.ReportRangeFix(
|
|
71
|
-
pos,
|
|
72
|
-
end,
|
|
73
|
-
"Strings must use single quotes.",
|
|
74
|
-
TextEdit{Pos: pos, End: end, Text: converted},
|
|
75
|
-
)
|
|
76
98
|
return
|
|
77
99
|
}
|
|
78
|
-
if
|
|
100
|
+
if isSingle {
|
|
101
|
+
// Tie resolves to double (the preference), so convert whenever double
|
|
102
|
+
// is no worse, exactly convertSingleQuotedToDouble's `ok`.
|
|
103
|
+
converted, ok := convertSingleQuotedToDouble(inner)
|
|
104
|
+
if ok && converted != raw {
|
|
105
|
+
ctx.ReportRangeFix(pos, end, "Strings must use double quotes.",
|
|
106
|
+
TextEdit{Pos: pos, End: end, Text: converted})
|
|
107
|
+
}
|
|
79
108
|
return
|
|
80
109
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
110
|
+
// Already double: only flip to single when single is STRICTLY cheaper,
|
|
111
|
+
// so a tie keeps the preferred double quote.
|
|
112
|
+
escapedDouble, unescapedSingle := countDoubleEscapes(inner)
|
|
113
|
+
if unescapedSingle < escapedDouble {
|
|
114
|
+
if converted, ok := convertDoubleQuotedToSingle(inner); ok && converted != raw {
|
|
115
|
+
ctx.ReportRangeFix(pos, end, "Strings must use single quotes.",
|
|
116
|
+
TextEdit{Pos: pos, End: end, Text: converted})
|
|
117
|
+
}
|
|
84
118
|
}
|
|
85
|
-
ctx.ReportRangeFix(
|
|
86
|
-
pos,
|
|
87
|
-
end,
|
|
88
|
-
"Strings must use double quotes.",
|
|
89
|
-
TextEdit{Pos: pos, End: end, Text: converted},
|
|
90
|
-
)
|
|
91
119
|
}
|
|
92
120
|
|
|
93
121
|
// convertDoubleQuotedToSingle walks the inner text of a double-quoted
|
|
@@ -133,14 +161,25 @@ func convertDoubleQuotedToSingle(inner string) (string, bool) {
|
|
|
133
161
|
return b.String(), true
|
|
134
162
|
}
|
|
135
163
|
|
|
136
|
-
// countDoubleEscapes returns
|
|
137
|
-
//
|
|
138
|
-
//
|
|
164
|
+
// countDoubleEscapes returns, for a double-quoted literal's text, the
|
|
165
|
+
// escape cost of each quote style: `escapedDouble` is how many `"` are
|
|
166
|
+
// escaped today, `unescapedSingle` is how many `'` characters the value
|
|
167
|
+
// holds (each would need escaping if the literal were single-quoted).
|
|
168
|
+
// Pairs with countSingleEscapes.
|
|
169
|
+
//
|
|
170
|
+
// A `'` reaches the value two ways inside double quotes: bare (`'`) or as
|
|
171
|
+
// a redundant escape (`\'`). Both are a single-quote character in the
|
|
172
|
+
// cooked string, so both count toward unescapedSingle, otherwise a
|
|
173
|
+
// literal like `"a\'b"` looks like a 0-vs-0 tie and flips to single,
|
|
174
|
+
// where Prettier keeps double because single would cost the one escape.
|
|
139
175
|
func countDoubleEscapes(inner string) (escapedDouble, unescapedSingle int) {
|
|
140
176
|
for i := 0; i < len(inner); {
|
|
141
177
|
if inner[i] == '\\' && i+1 < len(inner) {
|
|
142
|
-
|
|
178
|
+
switch inner[i+1] {
|
|
179
|
+
case '"':
|
|
143
180
|
escapedDouble++
|
|
181
|
+
case '\'':
|
|
182
|
+
unescapedSingle++
|
|
144
183
|
}
|
|
145
184
|
i += 2
|
|
146
185
|
continue
|
|
@@ -196,15 +235,22 @@ func convertSingleQuotedToDouble(inner string) (string, bool) {
|
|
|
196
235
|
return b.String(), true
|
|
197
236
|
}
|
|
198
237
|
|
|
199
|
-
// countSingleEscapes
|
|
200
|
-
//
|
|
201
|
-
//
|
|
202
|
-
//
|
|
238
|
+
// countSingleEscapes is the mirror of countDoubleEscapes for a
|
|
239
|
+
// single-quoted literal's text: `escapedSingle` is how many `'` are
|
|
240
|
+
// escaped today, `unescapedDouble` is how many `"` characters the value
|
|
241
|
+
// holds (each would need escaping if the literal were double-quoted). A
|
|
242
|
+
// `"` reaches the value either bare (`"`) or as a redundant escape
|
|
243
|
+
// (`\"`), and both count toward unescapedDouble so a literal like
|
|
244
|
+
// `'a\"b'` does not look like a tie and flip to double, Prettier keeps
|
|
245
|
+
// single because double would cost the one escape.
|
|
203
246
|
func countSingleEscapes(inner string) (escapedSingle, unescapedDouble int) {
|
|
204
247
|
for i := 0; i < len(inner); {
|
|
205
248
|
if inner[i] == '\\' && i+1 < len(inner) {
|
|
206
|
-
|
|
249
|
+
switch inner[i+1] {
|
|
250
|
+
case '\'':
|
|
207
251
|
escapedSingle++
|
|
252
|
+
case '"':
|
|
253
|
+
unescapedDouble++
|
|
208
254
|
}
|
|
209
255
|
i += 2
|
|
210
256
|
continue
|
|
@@ -43,6 +43,16 @@ func (formatSemi) Visits() []shimast.Kind {
|
|
|
43
43
|
shimast.KindExportAssignment,
|
|
44
44
|
shimast.KindPropertyDeclaration,
|
|
45
45
|
shimast.KindTypeAliasDeclaration,
|
|
46
|
+
// Interface / type-literal members. Prettier drops their trailing
|
|
47
|
+
// `;` under semi:false when they are newline-separated; see
|
|
48
|
+
// stripMemberSemicolon for the per-context hazard rules.
|
|
49
|
+
shimast.KindPropertySignature,
|
|
50
|
+
shimast.KindMethodSignature,
|
|
51
|
+
shimast.KindIndexSignature,
|
|
52
|
+
shimast.KindCallSignature,
|
|
53
|
+
shimast.KindConstructSignature,
|
|
54
|
+
shimast.KindGetAccessor,
|
|
55
|
+
shimast.KindSetAccessor,
|
|
46
56
|
}
|
|
47
57
|
}
|
|
48
58
|
|
|
@@ -59,6 +69,21 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
|
|
|
59
69
|
if end <= 0 || end > len(src) {
|
|
60
70
|
return
|
|
61
71
|
}
|
|
72
|
+
// Interface / type-literal members and class fields carry their own
|
|
73
|
+
// ASI rules, distinct from top-level statements, so the never
|
|
74
|
+
// direction routes through a dedicated stripper. Class fields keep
|
|
75
|
+
// their existing always-direction insertion (falling through below);
|
|
76
|
+
// inserting a missing interface/type member terminator is out of scope
|
|
77
|
+
// for this strip fix, so type members short-circuit in always mode.
|
|
78
|
+
isClassField := node.Kind == shimast.KindPropertyDeclaration
|
|
79
|
+
isTypeMember := isTypeMemberKind(node.Kind)
|
|
80
|
+
if preferNever && (isClassField || isTypeMember) {
|
|
81
|
+
stripMemberSemicolon(ctx, src, node, isClassField)
|
|
82
|
+
return
|
|
83
|
+
}
|
|
84
|
+
if isTypeMember {
|
|
85
|
+
return
|
|
86
|
+
}
|
|
62
87
|
hasSemi := src[end-1] == ';'
|
|
63
88
|
if preferNever {
|
|
64
89
|
if !hasSemi {
|
|
@@ -66,7 +91,7 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
|
|
|
66
91
|
}
|
|
67
92
|
if !preferNeverSafeKind(node.Kind) {
|
|
68
93
|
// Dropping the `;` after a class field or a type alias can
|
|
69
|
-
// change parse
|
|
94
|
+
// change parse, e.g. `class A { x: number; [k](): void {} }`
|
|
70
95
|
// would reparse `[k]` as a computed index access on `number`.
|
|
71
96
|
// Keep the terminator on those kinds even in prefer:"never"
|
|
72
97
|
// mode.
|
|
@@ -96,7 +121,7 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
|
|
|
96
121
|
}
|
|
97
122
|
// Diagnostic anchors on the last character of the statement so the
|
|
98
123
|
// banner underlines "the place a semicolon should follow". The fix
|
|
99
|
-
// itself is a zero-width insertion at node.End()
|
|
124
|
+
// itself is a zero-width insertion at node.End(), keeping the edit
|
|
100
125
|
// disjoint from any other rule's edits on the same statement.
|
|
101
126
|
pos := end - 1
|
|
102
127
|
if pos < 0 {
|
|
@@ -119,11 +144,14 @@ func (formatSemi) Check(ctx *Context, node *shimast.Node) {
|
|
|
119
144
|
//
|
|
120
145
|
// Hazard tokens per the ASI spec:
|
|
121
146
|
//
|
|
122
|
-
// - `[
|
|
123
|
-
// - `(
|
|
124
|
-
// - “ `
|
|
125
|
-
// - `+`, `-`,
|
|
126
|
-
// -
|
|
147
|
+
// - `[`: bracket access continues an expression
|
|
148
|
+
// - `(`: call expression continues
|
|
149
|
+
// - “ ` “: tagged template literal continues
|
|
150
|
+
// - `+`, `-`, `*`: binary operator continues
|
|
151
|
+
// - `,`: comma operator continues
|
|
152
|
+
// - `/`: division operator or regex literal continues; handled by
|
|
153
|
+
// the comment-or-regex branch below (a leading `//` or `/*` is not a
|
|
154
|
+
// hazard, a bare `/` is), so it is absent from the token switch.
|
|
127
155
|
func nextStatementHasASIHazard(src string, end int) bool {
|
|
128
156
|
for i := end; i < len(src); i++ {
|
|
129
157
|
c := src[i]
|
|
@@ -147,11 +175,18 @@ func nextStatementHasASIHazard(src string, end int) bool {
|
|
|
147
175
|
}
|
|
148
176
|
continue
|
|
149
177
|
}
|
|
150
|
-
// bare `/` starts a regex literal or division
|
|
178
|
+
// bare `/` starts a regex literal or division, hazard.
|
|
151
179
|
return true
|
|
152
180
|
}
|
|
153
181
|
switch c {
|
|
154
|
-
|
|
182
|
+
// If the next significant byte is one of these, dropping the terminator
|
|
183
|
+
// could let the following line re-associate with the prior expression.
|
|
184
|
+
// `( [`, a unary `+ -`, and a tagged-template backtick are the cases
|
|
185
|
+
// actually reachable from a valid statement start; `<` matters in .tsx
|
|
186
|
+
// (a leading `<` opens a JSX element). The remaining infix bytes cannot
|
|
187
|
+
// begin a valid statement on their own, but are listed defensively so
|
|
188
|
+
// the strip always cedes rather than risk a parse-changing edit.
|
|
189
|
+
case '[', '(', '`', '+', '-', '*', ',', '.', '<', '>', '=', '?', '%', '&', '|', '^':
|
|
155
190
|
return true
|
|
156
191
|
}
|
|
157
192
|
return false
|
|
@@ -179,12 +214,152 @@ func preferNeverSafeKind(kind shimast.Kind) bool {
|
|
|
179
214
|
shimast.KindImportDeclaration,
|
|
180
215
|
shimast.KindImportEqualsDeclaration,
|
|
181
216
|
shimast.KindExportDeclaration,
|
|
182
|
-
shimast.KindExportAssignment
|
|
217
|
+
shimast.KindExportAssignment,
|
|
218
|
+
// `type T = …;` is a statement-position declaration; Prettier drops
|
|
219
|
+
// its terminator under semi:false. The nextStatementHasASIHazard
|
|
220
|
+
// guard keeps it whenever removal would let ASI mis-associate the
|
|
221
|
+
// following statement (e.g. a leading `(`/`[`).
|
|
222
|
+
shimast.KindTypeAliasDeclaration:
|
|
183
223
|
return true
|
|
184
224
|
}
|
|
185
225
|
return false
|
|
186
226
|
}
|
|
187
227
|
|
|
228
|
+
// isTypeMemberKind reports whether `kind` is an interface or
|
|
229
|
+
// object-type-literal member whose trailing `;` Prettier strips under
|
|
230
|
+
// semi:false. Class fields (KindPropertyDeclaration) are handled
|
|
231
|
+
// separately because their initializer is an expression and so they
|
|
232
|
+
// carry the full expression-ASI hazard set, while type members only
|
|
233
|
+
// risk a call/construct-signature (`(`) or generic-call-signature (`<`)
|
|
234
|
+
// continuation.
|
|
235
|
+
func isTypeMemberKind(kind shimast.Kind) bool {
|
|
236
|
+
switch kind {
|
|
237
|
+
case
|
|
238
|
+
shimast.KindPropertySignature,
|
|
239
|
+
shimast.KindMethodSignature,
|
|
240
|
+
shimast.KindIndexSignature,
|
|
241
|
+
shimast.KindCallSignature,
|
|
242
|
+
shimast.KindConstructSignature,
|
|
243
|
+
shimast.KindGetAccessor,
|
|
244
|
+
shimast.KindSetAccessor:
|
|
245
|
+
return true
|
|
246
|
+
}
|
|
247
|
+
return false
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// stripMemberSemicolon removes a redundant trailing `;` from an
|
|
251
|
+
// interface / type-literal member or a class field under semi:false.
|
|
252
|
+
//
|
|
253
|
+
// The member-terminating `;` is located robustly: typescript-go parses
|
|
254
|
+
// the terminator as a separate token (parseTypeMemberSemicolon /
|
|
255
|
+
// parseSemicolonAfterPropertyName run after finishNode), so a member
|
|
256
|
+
// node's End() may sit before the `;`. Accept either a `;` already at
|
|
257
|
+
// End()-1 or the first `;` reached scanning horizontal whitespace
|
|
258
|
+
// forward from End().
|
|
259
|
+
//
|
|
260
|
+
// The `;` is dropped only when it is redundant, see
|
|
261
|
+
// memberSemicolonRedundant, so single-line separators stay intact and
|
|
262
|
+
// ASI-hazardous continuations keep their terminator. Idempotent: once
|
|
263
|
+
// removed, no `;` remains for the rule to act on.
|
|
264
|
+
func stripMemberSemicolon(ctx *Context, src string, node *shimast.Node, isClassField bool) {
|
|
265
|
+
end := node.End()
|
|
266
|
+
semiPos := -1
|
|
267
|
+
if end-1 >= 0 && src[end-1] == ';' {
|
|
268
|
+
semiPos = end - 1
|
|
269
|
+
} else {
|
|
270
|
+
i := end
|
|
271
|
+
for i < len(src) && (src[i] == ' ' || src[i] == '\t') {
|
|
272
|
+
i++
|
|
273
|
+
}
|
|
274
|
+
if i < len(src) && src[i] == ';' {
|
|
275
|
+
semiPos = i
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if semiPos < 0 {
|
|
279
|
+
return
|
|
280
|
+
}
|
|
281
|
+
if !memberSemicolonRedundant(src, semiPos+1, isClassField) {
|
|
282
|
+
return
|
|
283
|
+
}
|
|
284
|
+
ctx.ReportRangeFix(
|
|
285
|
+
semiPos,
|
|
286
|
+
semiPos+1,
|
|
287
|
+
"Unexpected trailing semicolon.",
|
|
288
|
+
TextEdit{Pos: semiPos, End: semiPos + 1, Text: ""},
|
|
289
|
+
)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// memberSemicolonRedundant reports whether the member terminator `;`
|
|
293
|
+
// whose following byte is at `after` can be dropped without changing the
|
|
294
|
+
// parse. It scans past trivia (whitespace + comments) to the next
|
|
295
|
+
// significant byte and applies Prettier's semi:false member rules:
|
|
296
|
+
//
|
|
297
|
+
// - The closing `}` (or end of file) always makes the `;` redundant.
|
|
298
|
+
// - A next member on the SAME line (no newline crossed) keeps the `;`
|
|
299
|
+
// as a required separator, the rule never inserts the newline that
|
|
300
|
+
// would let ASI take over, so dropping it here would corrupt the
|
|
301
|
+
// source.
|
|
302
|
+
// - A newline-separated next member drops the `;` unless its lead token
|
|
303
|
+
// would re-associate with the prior member: the full expression-ASI
|
|
304
|
+
// hazard set for class fields (`[ ( ` + - * / ,`), or just a
|
|
305
|
+
// call/construct/generic signature (`(` / `<`) for type members
|
|
306
|
+
// (a leading `[` is an index signature there, not a continuation).
|
|
307
|
+
func memberSemicolonRedundant(src string, after int, isClassField bool) bool {
|
|
308
|
+
sawNewline := false
|
|
309
|
+
for i := after; i < len(src); {
|
|
310
|
+
c := src[i]
|
|
311
|
+
if c == '\n' {
|
|
312
|
+
sawNewline = true
|
|
313
|
+
i++
|
|
314
|
+
continue
|
|
315
|
+
}
|
|
316
|
+
if c == ' ' || c == '\t' || c == '\r' {
|
|
317
|
+
i++
|
|
318
|
+
continue
|
|
319
|
+
}
|
|
320
|
+
if c == '/' && i+1 < len(src) {
|
|
321
|
+
if src[i+1] == '/' {
|
|
322
|
+
for i < len(src) && src[i] != '\n' {
|
|
323
|
+
i++
|
|
324
|
+
}
|
|
325
|
+
continue
|
|
326
|
+
}
|
|
327
|
+
if src[i+1] == '*' {
|
|
328
|
+
i += 2
|
|
329
|
+
for i+1 < len(src) && !(src[i] == '*' && src[i+1] == '/') {
|
|
330
|
+
if src[i] == '\n' {
|
|
331
|
+
sawNewline = true
|
|
332
|
+
}
|
|
333
|
+
i++
|
|
334
|
+
}
|
|
335
|
+
if i+1 < len(src) {
|
|
336
|
+
i += 2
|
|
337
|
+
}
|
|
338
|
+
continue
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if c == '}' {
|
|
342
|
+
return true
|
|
343
|
+
}
|
|
344
|
+
if !sawNewline {
|
|
345
|
+
return false
|
|
346
|
+
}
|
|
347
|
+
if isClassField {
|
|
348
|
+
switch c {
|
|
349
|
+
case '[', '(', '`', '+', '-', '*', '/', ',':
|
|
350
|
+
return false
|
|
351
|
+
}
|
|
352
|
+
} else {
|
|
353
|
+
switch c {
|
|
354
|
+
case '(', '<':
|
|
355
|
+
return false
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return true
|
|
359
|
+
}
|
|
360
|
+
return true
|
|
361
|
+
}
|
|
362
|
+
|
|
188
363
|
func init() {
|
|
189
364
|
Register(formatSemi{})
|
|
190
365
|
}
|