@ttsc/lint 0.18.4 → 0.19.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 +125 -43
- package/go.mod +5 -4
- package/internal/rulecode/rulecode.go +88 -0
- package/lib/index.d.ts +10 -1
- package/lib/index.js +45 -17
- package/lib/index.js.map +1 -1
- package/lib/structures/ITtscLintConfig.d.ts +3 -0
- package/lib/structures/TtscLintRuleSetting.d.ts +3 -2
- package/lib/structures/format/ITtscLintFormat.d.ts +3 -2
- package/lib/structures/format/ITtscLintFormatSortImports.d.ts +20 -4
- package/lib/structures/rules/ITtscLintBoundariesRuleOptions.d.ts +80 -8
- package/lib/structures/rules/ITtscLintBoundariesRules.d.ts +6 -8
- package/lib/structures/rules/ITtscLintContributorRules.d.ts +18 -2
- package/lib/structures/rules/ITtscLintCoreRuleOptions.d.ts +347 -0
- package/lib/structures/rules/ITtscLintCoreRuleOptions.js +3 -0
- package/lib/structures/rules/ITtscLintCoreRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintCoreRules.d.ts +101 -67
- package/lib/structures/rules/ITtscLintRegexpRules.d.ts +7 -2
- package/lib/structures/rules/ITtscLintRuleOptionsMap.d.ts +53 -7
- package/lib/structures/rules/ITtscLintRules.d.ts +6 -2
- package/lib/structures/rules/ITtscLintSolidRules.d.ts +0 -8
- package/lib/structures/rules/ITtscLintTypeScriptRuleOptions.d.ts +206 -0
- package/lib/structures/rules/ITtscLintTypeScriptRuleOptions.js +8 -0
- package/lib/structures/rules/ITtscLintTypeScriptRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintTypeScriptRules.d.ts +55 -42
- package/lib/structures/rules/ITtscLintUnicornRuleOptions.d.ts +276 -0
- package/lib/structures/rules/ITtscLintUnicornRuleOptions.js +3 -0
- package/lib/structures/rules/ITtscLintUnicornRuleOptions.js.map +1 -0
- package/lib/structures/rules/ITtscLintUnicornRules.d.ts +44 -36
- package/lib/structures/rules/index.d.ts +3 -0
- package/lib/structures/rules/index.js +3 -0
- package/lib/structures/rules/index.js.map +1 -1
- package/linthost/ast_helpers.go +521 -23
- package/linthost/ast_selector_matcher.go +1628 -0
- package/linthost/ast_selector_parser.go +628 -0
- package/linthost/comment_scan.go +154 -0
- package/linthost/compile.go +129 -79
- package/linthost/config.go +352 -88
- package/linthost/config_format.go +15 -1
- package/linthost/contrib_adapter.go +47 -8
- package/linthost/declaration_rules.go +12 -11
- package/linthost/directives.go +9 -67
- package/linthost/dispatch.go +37 -3
- package/linthost/engine.go +368 -53
- package/linthost/escape_string.go +77 -0
- package/linthost/fix.go +133 -23
- package/linthost/flags_gen.go +18 -17
- package/linthost/format.go +73 -167
- package/linthost/format_editor_settings.go +134 -26
- package/linthost/grapheme_tables_gen.go +1920 -0
- package/linthost/host.go +159 -61
- package/linthost/literal_escape_scan.go +117 -0
- package/linthost/lsp.go +545 -98
- package/linthost/numeric_literal_precision.go +228 -0
- package/linthost/polyfill_browserslist.go +1439 -0
- package/linthost/polyfill_browserslist_config.go +603 -0
- package/linthost/polyfill_corejs.go +750 -0
- package/linthost/polyfill_data.go +113 -0
- package/linthost/polyfill_data_gen.json +39868 -0
- package/linthost/print_nodes_array.go +7 -1
- package/linthost/print_nodes_object.go +7 -1
- package/linthost/project_engine.go +231 -0
- package/linthost/project_rules.go +78 -0
- package/linthost/regex_clean.go +191 -0
- package/linthost/regex_tree.go +1544 -0
- package/linthost/regex_tree_optimizer.go +1685 -0
- package/linthost/regexp_cache.go +44 -0
- package/linthost/rule_codes.go +105 -0
- package/linthost/rule_codes.json +745 -0
- package/linthost/rules_ban_ts_comment.go +312 -0
- package/linthost/rules_boundaries.go +128 -43
- package/linthost/rules_boundaries_dependencies.go +1013 -0
- package/linthost/rules_core_extra.go +62 -92
- package/linthost/rules_cypress.go +1 -1
- package/linthost/rules_default_case.go +87 -11
- package/linthost/rules_dupes.go +38 -13
- package/linthost/rules_empty.go +188 -20
- package/linthost/rules_escape.go +62 -48
- package/linthost/rules_format_arrow_parens.go +19 -5
- package/linthost/rules_format_bracket_spacing.go +1 -1
- package/linthost/rules_format_clause_join.go +1 -1
- package/linthost/rules_format_declaration_header.go +31 -19
- package/linthost/rules_format_indent.go +1 -1
- package/linthost/rules_format_jsdoc.go +1 -1
- package/linthost/rules_format_orphan_semi.go +1 -1
- package/linthost/rules_format_parameter_properties.go +17 -7
- package/linthost/rules_format_print_width.go +1 -1
- package/linthost/rules_format_quote_props.go +1 -1
- package/linthost/rules_format_quotes.go +1 -1
- package/linthost/rules_format_semi.go +106 -79
- package/linthost/rules_format_sort_imports.go +79 -45
- package/linthost/rules_format_statement_split.go +1 -1
- package/linthost/rules_format_ternary_nullish_parens.go +1 -1
- package/linthost/rules_format_trailing_comma.go +64 -1
- package/linthost/rules_format_whitespace.go +1 -1
- package/linthost/rules_functional.go +21 -22
- package/linthost/rules_gap.go +80 -3
- package/linthost/rules_grouped_accessor_pairs.go +84 -25
- package/linthost/rules_guard_for_in.go +64 -147
- package/linthost/rules_jsx_a11y.go +232 -22
- package/linthost/rules_logic.go +84 -38
- package/linthost/rules_nextjs.go +105 -16
- package/linthost/rules_no_class_assign.go +70 -0
- package/linthost/rules_no_duplicate_imports.go +266 -0
- package/linthost/rules_no_else_return.go +156 -38
- package/linthost/rules_no_extend_native.go +113 -17
- package/linthost/rules_no_fallthrough.go +1013 -0
- package/linthost/rules_no_func_assign.go +70 -0
- package/linthost/rules_no_import_assign.go +278 -86
- package/linthost/rules_no_inner_declarations.go +186 -0
- package/linthost/rules_no_loop_func.go +438 -53
- package/linthost/rules_no_mixed_operators.go +208 -52
- package/linthost/rules_no_param_reassign.go +376 -61
- package/linthost/rules_no_promise_executor_return.go +156 -0
- package/linthost/rules_no_restricted_imports.go +1013 -57
- package/linthost/rules_no_restricted_syntax.go +190 -26
- package/linthost/rules_no_useless_constructor.go +6 -36
- package/linthost/rules_problems.go +154 -311
- package/linthost/rules_promise.go +2578 -109
- package/linthost/rules_react_extras.go +71 -45
- package/linthost/rules_react_hooks.go +18 -2
- package/linthost/rules_react_perf.go +1 -0
- package/linthost/rules_react_refresh.go +1 -1
- package/linthost/rules_regexp.go +230 -14
- package/linthost/rules_security.go +45 -19
- package/linthost/rules_self.go +21 -1
- package/linthost/rules_solid.go +13 -7
- package/linthost/rules_storybook.go +1 -1
- package/linthost/rules_suggestions.go +490 -84
- package/linthost/rules_testing_library.go +12 -1
- package/linthost/rules_ts.go +227 -54
- package/linthost/rules_ts_async.go +0 -131
- package/linthost/rules_ts_no_base_to_string.go +3 -4
- package/linthost/rules_ts_no_misused_promises.go +817 -0
- package/linthost/rules_ts_no_restricted_types.go +320 -34
- package/linthost/rules_ts_no_unnecessary_qualifier.go +132 -55
- package/linthost/rules_ts_no_unsafe_assignment.go +608 -60
- package/linthost/rules_ts_require_array_sort_compare.go +5 -5
- package/linthost/rules_ts_switch_exhaustiveness_check.go +556 -86
- package/linthost/rules_unicorn_better_regex.go +224 -16
- package/linthost/rules_unicorn_consistent_destructuring.go +1002 -7
- package/linthost/rules_unicorn_consistent_existence_index_check.go +208 -29
- package/linthost/rules_unicorn_consistent_function_scoping.go +1041 -8
- package/linthost/rules_unicorn_consistent_template_literal_escape.go +178 -7
- package/linthost/rules_unicorn_escape_case.go +30 -19
- package/linthost/rules_unicorn_filename_case.go +763 -16
- package/linthost/rules_unicorn_import_style.go +783 -17
- package/linthost/rules_unicorn_isolated_functions.go +934 -14
- package/linthost/rules_unicorn_no_hex_escape.go +26 -11
- package/linthost/rules_unicorn_no_typeof_undefined.go +234 -25
- package/linthost/rules_unicorn_no_unnecessary_polyfills.go +376 -21
- package/linthost/rules_unicorn_no_unused_properties.go +756 -19
- package/linthost/rules_unicorn_number_literal_case.go +58 -39
- package/linthost/rules_unicorn_prefer_at.go +7 -3
- package/linthost/rules_unicorn_prefer_number_properties.go +381 -48
- package/linthost/rules_unicorn_prefer_optional_catch_binding.go +24 -24
- package/linthost/rules_unicorn_prefer_simple_condition_first.go +597 -19
- package/linthost/rules_unicorn_prefer_string_raw.go +147 -16
- package/linthost/rules_unicorn_prevent_abbreviations.go +1963 -95
- package/linthost/rules_unicorn_string_content.go +611 -15
- package/linthost/rules_unicorn_switch_case_break_position.go +172 -15
- package/linthost/rules_unicorn_template_indent.go +923 -18
- package/linthost/rules_unicorn_text_encoding_identifier_case.go +202 -42
- package/linthost/rules_unicorn_throw_new_error.go +218 -26
- package/linthost/rules_var.go +829 -142
- package/linthost/string_length.go +222 -0
- package/package.json +4 -3
- package/rule/project.go +206 -0
- package/rule/rule.go +58 -1
- package/src/index.ts +58 -17
- package/src/structures/ITtscLintConfig.ts +3 -0
- package/src/structures/TtscLintRuleSetting.ts +3 -2
- package/src/structures/format/ITtscLintFormat.ts +3 -2
- package/src/structures/format/ITtscLintFormatSortImports.ts +21 -4
- package/src/structures/rules/ITtscLintBoundariesRuleOptions.ts +122 -8
- package/src/structures/rules/ITtscLintBoundariesRules.ts +6 -8
- package/src/structures/rules/ITtscLintContributorRules.ts +18 -2
- package/src/structures/rules/ITtscLintCoreRuleOptions.ts +465 -0
- package/src/structures/rules/ITtscLintCoreRules.ts +122 -67
- package/src/structures/rules/ITtscLintRegexpRules.ts +7 -2
- package/src/structures/rules/ITtscLintRuleOptionsMap.ts +88 -7
- package/src/structures/rules/ITtscLintRules.ts +7 -2
- package/src/structures/rules/ITtscLintSolidRules.ts +0 -9
- package/src/structures/rules/ITtscLintTypeScriptRuleOptions.ts +248 -0
- package/src/structures/rules/ITtscLintTypeScriptRules.ts +64 -42
- package/src/structures/rules/ITtscLintUnicornRuleOptions.ts +350 -0
- package/src/structures/rules/ITtscLintUnicornRules.ts +60 -36
- package/src/structures/rules/index.ts +3 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
package linthost
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"regexp"
|
|
5
|
+
"sync"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
// userPatternCache memoizes RE2 compilation of option-supplied regex patterns.
|
|
9
|
+
//
|
|
10
|
+
// Several rules accept a custom regex option — no-fallthrough's and
|
|
11
|
+
// default-case's `commentPattern`, functional's identifier patterns,
|
|
12
|
+
// no-param-reassign's `ignorePropertyModificationsForRegex` — and compile it
|
|
13
|
+
// inside Check. That recompiles the same immutable, config-derived automaton on
|
|
14
|
+
// every invocation: once per visited node, or once per candidate name in an
|
|
15
|
+
// inner loop. The pattern is invariant for a whole run, so compiling it once and
|
|
16
|
+
// reusing the result collapses the per-node cost to a single compile. Distinct
|
|
17
|
+
// option patterns come from configuration and are therefore few and bounded, so
|
|
18
|
+
// the cache cannot grow without bound.
|
|
19
|
+
//
|
|
20
|
+
// The engine walks files in parallel, so access is synchronized. Both the
|
|
21
|
+
// compiled regexp and a compile error are cached so every caller keeps its
|
|
22
|
+
// existing success/failure handling — an invalid custom pattern still surfaces
|
|
23
|
+
// its error, just without recompiling on each visit.
|
|
24
|
+
var userPatternCache sync.Map // map[string]userPatternResult
|
|
25
|
+
|
|
26
|
+
type userPatternResult struct {
|
|
27
|
+
re *regexp.Regexp
|
|
28
|
+
err error
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// compileUserPattern compiles an option-supplied RE2 pattern, memoizing the
|
|
32
|
+
// (regexp, error) result keyed by the pattern text. It is a drop-in replacement
|
|
33
|
+
// for regexp.Compile at option-derived call sites that run during dispatch, with
|
|
34
|
+
// identical return semantics.
|
|
35
|
+
func compileUserPattern(pattern string) (*regexp.Regexp, error) {
|
|
36
|
+
if cached, ok := userPatternCache.Load(pattern); ok {
|
|
37
|
+
result := cached.(userPatternResult)
|
|
38
|
+
return result.re, result.err
|
|
39
|
+
}
|
|
40
|
+
re, err := regexp.Compile(pattern)
|
|
41
|
+
actual, _ := userPatternCache.LoadOrStore(pattern, userPatternResult{re: re, err: err})
|
|
42
|
+
result := actual.(userPatternResult)
|
|
43
|
+
return result.re, result.err
|
|
44
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
package linthost
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
_ "embed"
|
|
5
|
+
"encoding/json"
|
|
6
|
+
"fmt"
|
|
7
|
+
"sort"
|
|
8
|
+
"sync"
|
|
9
|
+
|
|
10
|
+
"github.com/samchon/ttsc/packages/lint/internal/rulecode"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
//go:generate go run ../tools/rulecodes -root ..
|
|
14
|
+
|
|
15
|
+
// ruleCodeLedgerJSON is the append-only compatibility ledger for built-in
|
|
16
|
+
// rules. Removed names stay in the ledger so their codes are never reused.
|
|
17
|
+
//
|
|
18
|
+
//go:embed rule_codes.json
|
|
19
|
+
var ruleCodeLedgerJSON []byte
|
|
20
|
+
|
|
21
|
+
var builtInRuleCodes = mustLoadBuiltInRuleCodes()
|
|
22
|
+
|
|
23
|
+
var runtimeRuleCodes = struct {
|
|
24
|
+
sync.Mutex
|
|
25
|
+
codes map[string]int32
|
|
26
|
+
dirty bool
|
|
27
|
+
}{dirty: true}
|
|
28
|
+
|
|
29
|
+
func mustLoadBuiltInRuleCodes() map[string]int32 {
|
|
30
|
+
var ledger map[string]int32
|
|
31
|
+
if err := json.Unmarshal(ruleCodeLedgerJSON, &ledger); err != nil {
|
|
32
|
+
panic(fmt.Sprintf("@ttsc/lint: parse rule code ledger: %v", err))
|
|
33
|
+
}
|
|
34
|
+
if len(ledger) == 0 {
|
|
35
|
+
panic("@ttsc/lint: rule code ledger is empty; restore it from version control")
|
|
36
|
+
}
|
|
37
|
+
validated, err := rulecode.Allocate(ledger, nil)
|
|
38
|
+
if err != nil {
|
|
39
|
+
panic(fmt.Sprintf("@ttsc/lint: invalid rule code ledger: %v", err))
|
|
40
|
+
}
|
|
41
|
+
return validated
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// invalidateRuntimeRuleCodes marks the contributed-rule assignment stale.
|
|
45
|
+
// Register calls it only for names absent from the frozen built-in ledger.
|
|
46
|
+
func invalidateRuntimeRuleCodes() {
|
|
47
|
+
runtimeRuleCodes.Lock()
|
|
48
|
+
runtimeRuleCodes.dirty = true
|
|
49
|
+
runtimeRuleCodes.Unlock()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// RuleCode returns the collision-free positive TS-style code for a rule.
|
|
53
|
+
// Built-in assignments come from the append-only ledger. Runtime contributor
|
|
54
|
+
// assignments are recomputed over the complete sorted contributor set, so the
|
|
55
|
+
// same set receives the same codes regardless of registration order.
|
|
56
|
+
func RuleCode(name string) int32 {
|
|
57
|
+
if code, exists := builtInRuleCodes[name]; exists {
|
|
58
|
+
return code
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
runtimeRuleCodes.Lock()
|
|
62
|
+
defer runtimeRuleCodes.Unlock()
|
|
63
|
+
_, isFileRule := registered.rules[name]
|
|
64
|
+
_, isProjectRule := registeredProjectRules[name]
|
|
65
|
+
isRegistered := isFileRule || isProjectRule
|
|
66
|
+
if !runtimeRuleCodes.dirty && isRegistered {
|
|
67
|
+
if code, exists := runtimeRuleCodes.codes[name]; exists {
|
|
68
|
+
return code
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
names := make([]string, 0, len(registered.rules)+1)
|
|
73
|
+
for registeredName := range registered.rules {
|
|
74
|
+
if _, builtIn := builtInRuleCodes[registeredName]; !builtIn {
|
|
75
|
+
names = append(names, registeredName)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
for registeredName := range registeredProjectRules {
|
|
79
|
+
if _, builtIn := builtInRuleCodes[registeredName]; !builtIn {
|
|
80
|
+
names = append(names, registeredName)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if !isRegistered {
|
|
84
|
+
names = append(names, name)
|
|
85
|
+
}
|
|
86
|
+
sort.Strings(names)
|
|
87
|
+
assigned, err := rulecode.Allocate(builtInRuleCodes, names)
|
|
88
|
+
if err != nil {
|
|
89
|
+
panic(fmt.Sprintf("@ttsc/lint: allocate diagnostic code for %q: %v", name, err))
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
runtimeRuleCodes.codes = make(map[string]int32, len(names))
|
|
93
|
+
for _, registeredName := range names {
|
|
94
|
+
_, fileRule := registered.rules[registeredName]
|
|
95
|
+
_, projectRule := registeredProjectRules[registeredName]
|
|
96
|
+
if fileRule || projectRule {
|
|
97
|
+
runtimeRuleCodes.codes[registeredName] = assigned[registeredName]
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
runtimeRuleCodes.dirty = false
|
|
101
|
+
return assigned[name]
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ruleCode is the internal alias used by native diagnostic construction.
|
|
105
|
+
func ruleCode(name string) int32 { return RuleCode(name) }
|