@codeperfect/eslint-plugin 2.6.0 → 2.8.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 +3 -7
- package/dist/application/custom-rules.d.ts.map +1 -1
- package/dist/application/custom-rules.js +15 -57
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +1 -1
- package/dist/domain/architecture/consistent-barrel-files/index.d.ts +0 -1
- package/dist/domain/architecture/consistent-barrel-files/index.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/index.js +1 -2
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.js +3 -9
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +3 -9
- package/dist/domain/architecture/index.d.ts +2 -1
- package/dist/domain/architecture/index.d.ts.map +1 -1
- package/dist/domain/architecture/index.js +3 -2
- package/dist/domain/architecture/no-import-export-extensions/index.d.ts +2 -0
- package/dist/domain/architecture/no-import-export-extensions/index.d.ts.map +1 -0
- package/dist/domain/architecture/no-import-export-extensions/index.js +2 -0
- package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.d.ts.map +1 -0
- package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.js +171 -0
- package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
- package/dist/domain/core/no-multiple-declarators/rule.js +6 -1
- package/dist/domain/core/no-multiple-declarators/types.js +1 -1
- package/dist/domain/core/no-useless-delegation/rule.d.ts.map +1 -1
- package/dist/domain/core/no-useless-delegation/rule.js +12 -8
- package/dist/domain/core/prefer-interface-types/autofix.d.ts +15 -0
- package/dist/domain/core/prefer-interface-types/autofix.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/autofix.js +196 -0
- package/dist/domain/core/prefer-interface-types/declaration-names.d.ts +23 -0
- package/dist/domain/core/prefer-interface-types/declaration-names.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/declaration-names.js +139 -0
- package/dist/domain/core/prefer-interface-types/naming.d.ts +45 -0
- package/dist/domain/core/prefer-interface-types/naming.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/naming.js +179 -0
- package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts +2 -0
- package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -1
- package/dist/domain/core/prefer-interface-types/rule-utilities.js +1 -1
- package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
- package/dist/domain/core/prefer-interface-types/rule.js +40 -16
- package/dist/domain/core/prefer-interface-types/types.d.ts +80 -0
- package/dist/domain/core/prefer-interface-types/types.d.ts.map +1 -0
- package/dist/domain/core/prefer-interface-types/types.js +2 -0
- package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.js +2 -7
- package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -6
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +2 -5
- package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/rule.js +6 -2
- package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/examples.js +2 -6
- package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/reporting.js +34 -7
- package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/rule.js +6 -1
- package/dist/domain/docs/single-line-jsdoc/rule.d.ts.map +1 -1
- package/dist/domain/docs/single-line-jsdoc/rule.js +5 -3
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -1
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +4 -2
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +1 -1
- package/dist/domain/testing/aaa/analyzer.analysis.js +1 -1
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +27 -3
- package/dist/domain/testing/aaa/analyzer.assertions.operands.js +1 -1
- package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.classification.helpers.js +29 -4
- package/dist/domain/testing/aaa/analyzer.classification.traversal.js +1 -1
- package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.super.helpers.js +1 -1
- package/dist/domain/testing/aaa/analyzer.super.js +10 -3
- package/dist/domain/testing/aaa/index.d.ts +1 -1
- package/dist/domain/testing/aaa/index.d.ts.map +1 -1
- package/dist/domain/testing/aaa/index.js +1 -1
- package/dist/domain/testing/aaa/types.d.ts +7 -9
- package/dist/domain/testing/aaa/types.d.ts.map +1 -1
- package/dist/domain/testing/aaa/types.js +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +2 -18
- package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.js +1 -1
- package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +3 -2
- package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.js +44 -58
- package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-structure/rule.js +4 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +1 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +10 -4
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.js +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.js +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-imports.js +2 -6
- package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/rule.js +10 -4
- package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
- package/dist/domain/testing/require-act-result-capture/rule.js +10 -5
- package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
- package/dist/domain/testing/require-test-companion/rule.js +4 -13
- package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
- package/dist/infrastructure/codeperfect-plugin.js +2 -4
- package/dist/infrastructure/index.js +1 -1
- package/dist/infrastructure/presets.d.ts.map +1 -1
- package/dist/infrastructure/presets.js +2 -4
- package/package.json +24 -23
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.d.ts.map +0 -1
- package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.js +0 -134
- /package/dist/domain/architecture/{consistent-barrel-files → no-import-export-extensions}/no-import-export-extensions-rule.d.ts +0 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
const generatedNameTodo = "// TODO: Review this autogenerated type name";
|
|
2
|
+
/**
|
|
3
|
+
* Checks whether an AST subtree contains a contextual `this` type.
|
|
4
|
+
* @param value Candidate AST value.
|
|
5
|
+
* @returns Whether moving the value would change `this` semantics.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const contextual = containsContextualThis(typeLiteral);
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
function containsContextualThis(value) {
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
return value.some((item) => containsContextualThis(item));
|
|
14
|
+
}
|
|
15
|
+
if (value === null || typeof value !== "object") {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const node = value;
|
|
19
|
+
if (node["type"] === "TSThisType" || node["type"] === "ThisExpression") {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return Object.entries(node).some(([key, child]) => key !== "parent" && containsContextualThis(child));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Checks whether an inner range is fully contained by an outer range.
|
|
26
|
+
* @param outerRange Candidate containing range.
|
|
27
|
+
* @param innerRange Candidate contained range.
|
|
28
|
+
* @returns Whether the inner range is contained by the outer range.
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const contained = containsRange([0, 5], [1, 4]);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
function containsRange(outerRange, innerRange) {
|
|
35
|
+
return innerRange[0] >= outerRange[0] && innerRange[1] <= outerRange[1];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates the sole aggregate fix for all findings when every source range is safe.
|
|
39
|
+
* @param context Rule execution context.
|
|
40
|
+
* @param matches Named inline object type matches.
|
|
41
|
+
* @returns Aggregate fix callback, or undefined when source data is incomplete.
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const fix = createAggregateFix(context, matches);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
function createAggregateFix(context, matches) {
|
|
48
|
+
const sourceCode = getFixSourceCode(context);
|
|
49
|
+
if (sourceCode === void 0 ||
|
|
50
|
+
!hasSafeRanges(matches, sourceCode.text.length) ||
|
|
51
|
+
!hasRelocatableMatches(matches, sourceCode)) {
|
|
52
|
+
return void 0;
|
|
53
|
+
}
|
|
54
|
+
const lineEnding = sourceCode.text.includes("\r\n") ? "\r\n" : "\n";
|
|
55
|
+
const declarations = matches
|
|
56
|
+
.map((match) => `${generatedNameTodo}${lineEnding}interface ${match.name} ${sourceCode.getText(match.node)}`)
|
|
57
|
+
.join(`${lineEnding}${lineEnding}`);
|
|
58
|
+
const appendText = `${getBlockSeparator(sourceCode.text, lineEnding)}${declarations}${lineEnding}`;
|
|
59
|
+
return (fixer) => [
|
|
60
|
+
...matches.map((match) => fixer.replaceTextRange(match.node.range, match.name)),
|
|
61
|
+
fixer.insertTextAfterRange([sourceCode.text.length, sourceCode.text.length], appendText),
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns the blank-line separator required before the generated block.
|
|
66
|
+
* @param sourceText Existing source text.
|
|
67
|
+
* @param lineEnding Detected source line ending.
|
|
68
|
+
* @returns Separator required before generated declarations.
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const separator = getBlockSeparator("const value = 1;", "\n");
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
function getBlockSeparator(sourceText, lineEnding) {
|
|
75
|
+
if (sourceText.length === 0 || sourceText.endsWith(lineEnding + lineEnding)) {
|
|
76
|
+
return "";
|
|
77
|
+
}
|
|
78
|
+
return sourceText.endsWith(lineEnding) ? lineEnding : lineEnding + lineEnding;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Gets the source-code methods only when a complete source payload is available.
|
|
82
|
+
* @param context Rule execution context.
|
|
83
|
+
* @returns Complete source-code payload when available.
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const sourceCode = getFixSourceCode(context);
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
function getFixSourceCode(context) {
|
|
90
|
+
const sourceCode = context.sourceCode;
|
|
91
|
+
return sourceCode !== void 0 &&
|
|
92
|
+
typeof sourceCode.text === "string" &&
|
|
93
|
+
typeof sourceCode.getText === "function" &&
|
|
94
|
+
sourceCode.ast !== void 0
|
|
95
|
+
? sourceCode
|
|
96
|
+
: void 0;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Checks whether a literal belongs to a namespace or ambient module.
|
|
100
|
+
* @param node Inline type literal node.
|
|
101
|
+
* @returns Whether EOF insertion would move the declaration outside its module.
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const nested = hasModuleAncestor(typeLiteral);
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
function hasModuleAncestor(node) {
|
|
108
|
+
let current = node.parent;
|
|
109
|
+
while (current !== null && current !== void 0) {
|
|
110
|
+
if (current.type === "TSModuleDeclaration") {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
current = current.parent;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Checks whether moving every literal to module scope preserves its bindings.
|
|
119
|
+
* @param matches Ranged inline type matches.
|
|
120
|
+
* @param sourceCode Source and scope information for the active file.
|
|
121
|
+
* @returns Whether every literal can safely move to module scope.
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const relocatable = hasRelocatableMatches(matches, sourceCode);
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
function hasRelocatableMatches(matches, sourceCode) {
|
|
128
|
+
const scopes = sourceCode.scopeManager?.scopes;
|
|
129
|
+
if (scopes === void 0) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
for (const match of matches) {
|
|
133
|
+
if (containsContextualThis(match.node) || hasModuleAncestor(match.node)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
for (const scope of scopes) {
|
|
137
|
+
const references = scope.references ?? [];
|
|
138
|
+
for (const reference of references) {
|
|
139
|
+
const referenceRange = reference.identifier?.range;
|
|
140
|
+
if (referenceRange !== void 0 &&
|
|
141
|
+
containsRange(match.node.range, referenceRange) &&
|
|
142
|
+
!isRelocatableReference(match.node.range, reference.resolved?.scope)) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Checks that all replacement ranges exist, are ordered, and do not overlap.
|
|
152
|
+
* @param matches Named inline object type matches.
|
|
153
|
+
* @param sourceLength Existing source length.
|
|
154
|
+
* @returns Whether every replacement range is safe.
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* const safe = hasSafeRanges(matches, sourceText.length);
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
function hasSafeRanges(matches, sourceLength) {
|
|
161
|
+
let previousEnd = -1;
|
|
162
|
+
const orderedMatches = matches.toSorted((left, right) => (left.node.range?.[0] ?? -1) - (right.node.range?.[0] ?? -1));
|
|
163
|
+
for (const match of orderedMatches) {
|
|
164
|
+
const range = match.node.range;
|
|
165
|
+
if (range === void 0 ||
|
|
166
|
+
range[0] < 0 ||
|
|
167
|
+
range[0] < previousEnd ||
|
|
168
|
+
range[1] < range[0] ||
|
|
169
|
+
range[1] > sourceLength) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
previousEnd = range[1];
|
|
173
|
+
}
|
|
174
|
+
return matches.length > 0;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Determines whether a reference keeps the same binding at module scope.
|
|
178
|
+
* @param literalRange Range of the type literal being moved.
|
|
179
|
+
* @param resolvedScope Scope containing the referenced declaration.
|
|
180
|
+
* @returns Whether the reference is module-safe or moves with the literal.
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const relocatable = isRelocatableReference(literalRange, resolvedScope);
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
function isRelocatableReference(literalRange, resolvedScope) {
|
|
187
|
+
if (resolvedScope === void 0 ||
|
|
188
|
+
resolvedScope.type === "global" ||
|
|
189
|
+
resolvedScope.type === "module") {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
const scopeRange = resolvedScope.block?.range;
|
|
193
|
+
return scopeRange !== void 0 && containsRange(literalRange, scopeRange);
|
|
194
|
+
}
|
|
195
|
+
export { createAggregateFix };
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2ZpeC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vY29yZS9wcmVmZXItaW50ZXJmYWNlLXR5cGVzL2F1dG9maXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxpQkFBaUIsR0FBRyw4Q0FBOEMsQ0FBQztBQUV6RTs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsc0JBQXNCLENBQUMsS0FBYztJQUM1QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxLQUFnQyxDQUFDO0lBRTlDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztRQUN2RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUM5QixDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUNwRSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsYUFBYSxDQUNwQixVQUE0QixFQUM1QixVQUE0QjtJQUU1QixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUks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Q0FBQyxJQUFJLEtBQUssUUFBUTtRQUMvQixhQUFhLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFDL0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBRTlDLE9BQU8sVUFBVSxLQUFLLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZpeFNvdXJjZUNvZGUsXG4gIE5hbWVkSW5saW5lVHlwZU1hdGNoLFxuICBOYW1pbmdOb2RlLFxuICBSYW5nZWROYW1lZElubGluZVR5cGVNYXRjaCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgZ2VuZXJhdGVkTmFtZVRvZG8gPSBcIi8vIFRPRE86IFJldmlldyB0aGlzIGF1dG9nZW5lcmF0ZWQgdHlwZSBuYW1lXCI7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gQVNUIHN1YnRyZWUgY29udGFpbnMgYSBjb250ZXh0dWFsIGB0aGlzYCB0eXBlLlxuICogQHBhcmFtIHZhbHVlIENhbmRpZGF0ZSBBU1QgdmFsdWUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIG1vdmluZyB0aGUgdmFsdWUgd291bGQgY2hhbmdlIGB0aGlzYCBzZW1hbnRpY3MuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29udGV4dHVhbCA9IGNvbnRhaW5zQ29udGV4dHVhbFRoaXModHlwZUxpdGVyYWwpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zQ29udGV4dHVhbFRoaXModmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNvbWUoKGl0ZW0pID0+IGNvbnRhaW5zQ29udGV4dHVhbFRoaXMoaXRlbSkpO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vZGUgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAobm9kZVtcInR5cGVcIl0gPT09IFwiVFNUaGlzVHlwZVwiIHx8IG5vZGVbXCJ0eXBlXCJdID09PSBcIlRoaXNFeHByZXNzaW9uXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhub2RlKS5zb21lKFxuICAgIChba2V5LCBjaGlsZF0pID0+IGtleSAhPT0gXCJwYXJlbnRcIiAmJiBjb250YWluc0NvbnRleHR1YWxUaGlzKGNoaWxkKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBpbm5lciByYW5nZSBpcyBmdWxseSBjb250YWluZWQgYnkgYW4gb3V0ZXIgcmFuZ2UuXG4gKiBAcGFyYW0gb3V0ZXJSYW5nZSBDYW5kaWRhdGUgY29udGFpbmluZyByYW5nZS5cbiAqIEBwYXJhbSBpbm5lclJhbmdlIENhbmRpZGF0ZSBjb250YWluZWQgcmFuZ2UuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBpbm5lciByYW5nZSBpcyBjb250YWluZWQgYnkgdGhlIG91dGVyIHJhbmdlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbnRhaW5lZCA9IGNvbnRhaW5zUmFuZ2UoWzAsIDVdLCBbMSwgNF0pO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zUmFuZ2UoXG4gIG91dGVyUmFuZ2U6IFtudW1iZXIsIG51bWJlcl0sXG4gIGlubmVyUmFuZ2U6IFtudW1iZXIsIG51bWJlcl0sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlubmVyUmFuZ2VbMF0gPj0gb3V0ZXJSYW5nZVswXSAmJiBpbm5lclJhbmdlWzFdIDw9IG91dGVyUmFuZ2VbMV07XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgc29sZSBhZ2dyZWdhdGUgZml4IGZvciBhbGwgZmluZGluZ3Mgd2hlbiBldmVyeSBzb3VyY2UgcmFuZ2UgaXMgc2FmZS5cbiAqIEBwYXJhbSBjb250ZXh0IFJ1bGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcGFyYW0gbWF0Y2hlcyBOYW1lZCBpbmxpbmUgb2JqZWN0IHR5cGUgbWF0Y2hlcy5cbiAqIEByZXR1cm5zIEFnZ3JlZ2F0ZSBmaXggY2FsbGJhY2ssIG9yIHVuZGVmaW5lZCB3aGVuIHNvdXJjZSBkYXRhIGlzIGluY29tcGxldGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZml4ID0gY3JlYXRlQWdncmVnYXRlRml4KGNvbnRleHQsIG1hdGNoZXMpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0ZUZpeChcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcbiAgbWF0Y2hlczogcmVhZG9ubHkgTmFtZWRJbmxpbmVUeXBlTWF0Y2hbXSxcbik6ICgoZml4ZXI6IFJ1bGUuUnVsZUZpeGVyKSA9PiBSdWxlLkZpeFtdKSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZUNvZGUgPSBnZXRGaXhTb3VyY2VDb2RlKGNvbnRleHQpO1xuXG4gIGlmIChcbiAgICBzb3VyY2VDb2RlID09PSB2b2lkIDAgfHxcbiAgICAhaGFzU2FmZVJhbmdlcyhtYXRjaGVzLCBzb3VyY2VDb2RlLnRleHQubGVuZ3RoKSB8fFxuICAgICFoYXNSZWxvY2F0YWJsZU1hdGNoZXMobWF0Y2hlcywgc291cmNlQ29kZSlcbiAgKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IGxpbmVFbmRpbmcgPSBzb3VyY2VDb2RlLnRleHQuaW5jbHVkZXMoXCJcXHJcXG5cIikgPyBcIlxcclxcblwiIDogXCJcXG5cIjtcbiAgY29uc3QgZGVjbGFyYXRpb25zID0gbWF0Y2hlc1xuICAgIC5tYXAoXG4gICAgICAobWF0Y2gpID0+XG4gICAgICAgIGAke2dlbmVyYXRlZE5hbWVUb2RvfSR7bGluZUVuZGluZ31pbnRlcmZhY2UgJHttYXRjaC5uYW1lfSAke3NvdXJjZUNvZGUuZ2V0VGV4dChtYXRjaC5ub2RlIGFzIG5ldmVyKX1gLFxuICAgIClcbiAgICAuam9pbihgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKTtcbiAgY29uc3QgYXBwZW5kVGV4dCA9IGAke2dldEJsb2NrU2VwYXJhdG9yKHNvdXJjZUNvZGUudGV4dCwgbGluZUVuZGluZyl9JHtkZWNsYXJhdGlvbnN9JHtsaW5lRW5kaW5nfWA7XG5cbiAgcmV0dXJuIChmaXhlcjogUnVsZS5SdWxlRml4ZXIpOiBSdWxlLkZpeFtdID0+IFtcbiAgICAuLi5tYXRjaGVzLm1hcCgobWF0Y2gpID0+XG4gICAgICBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKG1hdGNoLm5vZGUucmFuZ2UsIG1hdGNoLm5hbWUpLFxuICAgICksXG4gICAgZml4ZXIuaW5zZXJ0VGV4dEFmdGVyUmFuZ2UoXG4gICAgICBbc291cmNlQ29kZS50ZXh0Lmxlbmd0aCwgc291cmNlQ29kZS50ZXh0Lmxlbmd0aF0sXG4gICAgICBhcHBlbmRUZXh0LFxuICAgICksXG4gIF07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmxhbmstbGluZSBzZXBhcmF0b3IgcmVxdWlyZWQgYmVmb3JlIHRoZSBnZW5lcmF0ZWQgYmxvY2suXG4gKiBAcGFyYW0gc291cmNlVGV4dCBFeGlzdGluZyBzb3VyY2UgdGV4dC5cbiAqIEBwYXJhbSBsaW5lRW5kaW5nIERldGVjdGVkIHNvdXJjZSBsaW5lIGVuZGluZy5cbiAqIEByZXR1cm5zIFNlcGFyYXRvciByZXF1aXJlZCBiZWZvcmUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9ucy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzZXBhcmF0b3IgPSBnZXRCbG9ja1NlcGFyYXRvcihcImNvbnN0IHZhbHVlID0gMTtcIiwgXCJcXG5cIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0QmxvY2tTZXBhcmF0b3Ioc291cmNlVGV4dDogc3RyaW5nLCBsaW5lRW5kaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoc291cmNlVGV4dC5sZW5ndGggPT09IDAgfHwgc291cmNlVGV4dC5lbmRzV2l0aChsaW5lRW5kaW5nICsgbGluZUVuZGluZykpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2VUZXh0LmVuZHNXaXRoKGxpbmVFbmRpbmcpID8gbGluZUVuZGluZyA6IGxpbmVFbmRpbmcgKyBsaW5lRW5kaW5nO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNvdXJjZS1jb2RlIG1ldGhvZHMgb25seSB3aGVuIGEgY29tcGxldGUgc291cmNlIHBheWxvYWQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIGNvbnRleHQgUnVsZSBleGVjdXRpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIENvbXBsZXRlIHNvdXJjZS1jb2RlIHBheWxvYWQgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc291cmNlQ29kZSA9IGdldEZpeFNvdXJjZUNvZGUoY29udGV4dCk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0Rml4U291cmNlQ29kZShcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcbik6IEZpeFNvdXJjZUNvZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2VDb2RlID0gY29udGV4dC5zb3VyY2VDb2RlIGFzIFBhcnRpYWw8Rml4U291cmNlQ29kZT4gfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHNvdXJjZUNvZGUgIT09IHZvaWQgMCAmJlxuICAgIHR5cGVvZiBzb3VyY2VDb2RlLnRleHQgPT09IFwic3RyaW5nXCIgJiZcbiAgICB0eXBlb2Ygc291cmNlQ29kZS5nZXRUZXh0ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICBzb3VyY2VDb2RlLmFzdCAhPT0gdm9pZCAwXG4gICAgPyAoc291cmNlQ29kZSBhcyBGaXhTb3VyY2VDb2RlKVxuICAgIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbGl0ZXJhbCBiZWxvbmdzIHRvIGEgbmFtZXNwYWNlIG9yIGFtYmllbnQgbW9kdWxlLlxuICogQHBhcmFtIG5vZGUgSW5saW5lIHR5cGUgbGl0ZXJhbCBub2RlLlxuICogQHJldHVybnMgV2hldGhlciBFT0YgaW5zZXJ0aW9uIHdvdWxkIG1vdmUgdGhlIGRlY2xhcmF0aW9uIG91dHNpZGUgaXRzIG1vZHVsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXN0ZWQgPSBoYXNNb2R1bGVBbmNlc3Rvcih0eXBlTGl0ZXJhbCk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gaGFzTW9kdWxlQW5jZXN0b3Iobm9kZTogTmFtZWRJbmxpbmVUeXBlTWF0Y2hbXCJub2RlXCJdKTogYm9vbGVhbiB7XG4gIGxldCBjdXJyZW50ID0gKG5vZGUgYXMgTmFtaW5nTm9kZSkucGFyZW50O1xuXG4gIHdoaWxlIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQgIT09IHZvaWQgMCkge1xuICAgIGlmIChjdXJyZW50LnR5cGUgPT09IFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgbW92aW5nIGV2ZXJ5IGxpdGVyYWwgdG8gbW9kdWxlIHNjb3BlIHByZXNlcnZlcyBpdHMgYmluZGluZ3MuXG4gKiBAcGFyYW0gbWF0Y2hlcyBSYW5nZWQgaW5saW5lIHR5cGUgbWF0Y2hlcy5cbiAqIEBwYXJhbSBzb3VyY2VDb2RlIFNvdXJjZSBhbmQgc2NvcGUgaW5mb3JtYXRpb24gZm9yIHRoZSBhY3RpdmUgZmlsZS5cbiAqIEByZXR1cm5zIFdoZXRoZXIgZXZlcnkgbGl0ZXJhbCBjYW4gc2FmZWx5IG1vdmUgdG8gbW9kdWxlIHNjb3BlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlbG9jYXRhYmxlID0gaGFzUmVsb2NhdGFibGVNYXRjaGVzKG1hdGNoZXMsIHNvdXJjZUNvZGUpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGhhc1JlbG9jYXRhYmxlTWF0Y2hlcyhcbiAgbWF0Y2hlczogcmVhZG9ubHkgUmFuZ2VkTmFtZWRJbmxpbmVUeXBlTWF0Y2hbXSxcbiAgc291cmNlQ29kZTogRml4U291cmNlQ29kZSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBzY29wZXMgPSBzb3VyY2VDb2RlLnNjb3BlTWFuYWdlcj8uc2NvcGVzO1xuXG4gIGlmIChzY29wZXMgPT09IHZvaWQgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgIGlmIChjb250YWluc0NvbnRleHR1YWxUaGlzKG1hdGNoLm5vZGUpIHx8IGhhc01vZHVsZUFuY2VzdG9yKG1hdGNoLm5vZGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBzY29wZS5yZWZlcmVuY2VzID8/IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZVJhbmdlID0gcmVmZXJlbmNlLmlkZW50aWZpZXI/LnJhbmdlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByZWZlcmVuY2VSYW5nZSAhPT0gdm9pZCAwICYmXG4gICAgICAgICAgY29udGFpbnNSYW5nZShtYXRjaC5ub2RlLnJhbmdlLCByZWZlcmVuY2VSYW5nZSkgJiZcbiAgICAgICAgICAhaXNSZWxvY2F0YWJsZVJlZmVyZW5jZShtYXRjaC5ub2RlLnJhbmdlLCByZWZlcmVuY2UucmVzb2x2ZWQ/LnNjb3BlKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhbGwgcmVwbGFjZW1lbnQgcmFuZ2VzIGV4aXN0LCBhcmUgb3JkZXJlZCwgYW5kIGRvIG5vdCBvdmVybGFwLlxuICogQHBhcmFtIG1hdGNoZXMgTmFtZWQgaW5saW5lIG9iamVjdCB0eXBlIG1hdGNoZXMuXG4gKiBAcGFyYW0gc291cmNlTGVuZ3RoIEV4aXN0aW5nIHNvdXJjZSBsZW5ndGguXG4gKiBAcmV0dXJucyBXaGV0aGVyIGV2ZXJ5IHJlcGxhY2VtZW50IHJhbmdlIGlzIHNhZmUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc2FmZSA9IGhhc1NhZmVSYW5nZXMobWF0Y2hlcywgc291cmNlVGV4dC5sZW5ndGgpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGhhc1NhZmVSYW5nZXMoXG4gIG1hdGNoZXM6IHJlYWRvbmx5IE5hbWVkSW5saW5lVHlwZU1hdGNoW10sXG4gIHNvdXJjZUxlbmd0aDogbnVtYmVyLFxuKTogbWF0Y2hlcyBpcyByZWFkb25seSBSYW5nZWROYW1lZElubGluZVR5cGVNYXRjaFtdIHtcbiAgbGV0IHByZXZpb3VzRW5kID0gLTE7XG5cbiAgY29uc3Qgb3JkZXJlZE1hdGNoZXMgPSBtYXRjaGVzLnRvU29ydGVkKFxuICAgIChsZWZ0LCByaWdodCkgPT5cbiAgICAgIChsZWZ0Lm5vZGUucmFuZ2U/LlswXSA/PyAtMSkgLSAocmlnaHQubm9kZS5yYW5nZT8uWzBdID8/IC0xKSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG9yZGVyZWRNYXRjaGVzKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBtYXRjaC5ub2RlLnJhbmdlO1xuXG4gICAgaWYgKFxuICAgICAgcmFuZ2UgPT09IHZvaWQgMCB8fFxuICAgICAgcmFuZ2VbMF0gPCAwIHx8XG4gICAgICByYW5nZVswXSA8IHByZXZpb3VzRW5kIHx8XG4gICAgICByYW5nZVsxXSA8IHJhbmdlWzBdIHx8XG4gICAgICByYW5nZVsxXSA+IHNvdXJjZUxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByZXZpb3VzRW5kID0gcmFuZ2VbMV07XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJlZmVyZW5jZSBrZWVwcyB0aGUgc2FtZSBiaW5kaW5nIGF0IG1vZHVsZSBzY29wZS5cbiAqIEBwYXJhbSBsaXRlcmFsUmFuZ2UgUmFuZ2Ugb2YgdGhlIHR5cGUgbGl0ZXJhbCBiZWluZyBtb3ZlZC5cbiAqIEBwYXJhbSByZXNvbHZlZFNjb3BlIFNjb3BlIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgbW9kdWxlLXNhZmUgb3IgbW92ZXMgd2l0aCB0aGUgbGl0ZXJhbC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZWxvY2F0YWJsZSA9IGlzUmVsb2NhdGFibGVSZWZlcmVuY2UobGl0ZXJhbFJhbmdlLCByZXNvbHZlZFNjb3BlKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc1JlbG9jYXRhYmxlUmVmZXJlbmNlKFxuICBsaXRlcmFsUmFuZ2U6IFtudW1iZXIsIG51bWJlcl0sXG4gIHJlc29sdmVkU2NvcGU6IGltcG9ydChcIi4vdHlwZXNcIikuU2NvcGUgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgaWYgKFxuICAgIHJlc29sdmVkU2NvcGUgPT09IHZvaWQgMCB8fFxuICAgIHJlc29sdmVkU2NvcGUudHlwZSA9PT0gXCJnbG9iYWxcIiB8fFxuICAgIHJlc29sdmVkU2NvcGUudHlwZSA9PT0gXCJtb2R1bGVcIlxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHNjb3BlUmFuZ2UgPSByZXNvbHZlZFNjb3BlLmJsb2NrPy5yYW5nZTtcblxuICByZXR1cm4gc2NvcGVSYW5nZSAhPT0gdm9pZCAwICYmIGNvbnRhaW5zUmFuZ2UobGl0ZXJhbFJhbmdlLCBzY29wZVJhbmdlKTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlQWdncmVnYXRlRml4IH07XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ScopeManager } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Collects declarations from every lexical scope in a source file.
|
|
4
|
+
* @param scopeManager Parser scope information.
|
|
5
|
+
* @returns Names that could capture a generated type reference.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const names = collectScopeNames(sourceCode.scopeManager);
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
declare function collectScopeNames(scopeManager: ScopeManager | undefined): Set<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Collects all import, value, and type names declared at module scope.
|
|
14
|
+
* @param statements Program statements to inspect.
|
|
15
|
+
* @returns Names already declared at module scope.
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const names = collectTopLevelNames(program.body);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare function collectTopLevelNames(statements: readonly unknown[]): Set<string>;
|
|
22
|
+
export { collectScopeNames, collectTopLevelNames };
|
|
23
|
+
//# sourceMappingURL=declaration-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declaration-names.d.ts","sourceRoot":"","sources":["../../../../src/domain/core/prefer-interface-types/declaration-names.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmG5C;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,CACxB,YAAY,EAAE,YAAY,GAAG,SAAS,GACrC,GAAG,CAAC,MAAM,CAAC,CAeb;AAED;;;;;;;;GAQG;AACH,iBAAS,oBAAoB,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CA8BzE;AAeD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
+
const namedDeclarationTypes = new Set([
|
|
3
|
+
AST_NODE_TYPES.ClassDeclaration,
|
|
4
|
+
AST_NODE_TYPES.FunctionDeclaration,
|
|
5
|
+
AST_NODE_TYPES.TSDeclareFunction,
|
|
6
|
+
AST_NODE_TYPES.TSEnumDeclaration,
|
|
7
|
+
AST_NODE_TYPES.TSInterfaceDeclaration,
|
|
8
|
+
AST_NODE_TYPES.TSModuleDeclaration,
|
|
9
|
+
AST_NODE_TYPES.TSTypeAliasDeclaration,
|
|
10
|
+
AST_NODE_TYPES.VariableDeclaration,
|
|
11
|
+
]);
|
|
12
|
+
/**
|
|
13
|
+
* Adds names introduced by one supported top-level declaration.
|
|
14
|
+
* @param declaration Top-level declaration to inspect.
|
|
15
|
+
* @param names Mutable output set.
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* collectDeclarationNames(declaration, names);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function collectDeclarationNames(declaration, names) {
|
|
22
|
+
if (declaration.type === AST_NODE_TYPES.VariableDeclaration) {
|
|
23
|
+
for (const variable of declaration.declarations) {
|
|
24
|
+
collectPatternNames(variable.id, names);
|
|
25
|
+
}
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if ("id" in declaration &&
|
|
29
|
+
declaration.id !== null &&
|
|
30
|
+
declaration.id.type === AST_NODE_TYPES.Identifier) {
|
|
31
|
+
names.add(declaration.id.name);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Adds identifiers introduced by a top-level binding pattern.
|
|
36
|
+
* @param pattern Binding pattern to inspect.
|
|
37
|
+
* @param names Mutable output set.
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* collectPatternNames(pattern, names);
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
function collectPatternNames(pattern, names) {
|
|
44
|
+
if (pattern.type === AST_NODE_TYPES.Identifier) {
|
|
45
|
+
names.add(pattern.name);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (pattern.type === AST_NODE_TYPES.AssignmentPattern) {
|
|
49
|
+
collectPatternNames(pattern.left, names);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (pattern.type === AST_NODE_TYPES.RestElement) {
|
|
53
|
+
collectPatternNames(pattern.argument, names);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (pattern.type === AST_NODE_TYPES.ArrayPattern) {
|
|
57
|
+
for (const element of pattern.elements) {
|
|
58
|
+
if (element !== null) {
|
|
59
|
+
collectPatternNames(element, names);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (pattern.type === AST_NODE_TYPES.ObjectPattern) {
|
|
65
|
+
for (const property of pattern.properties) {
|
|
66
|
+
collectPatternNames(property.type === AST_NODE_TYPES.Property
|
|
67
|
+
? property.value
|
|
68
|
+
: property.argument, names);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Collects declarations from every lexical scope in a source file.
|
|
74
|
+
* @param scopeManager Parser scope information.
|
|
75
|
+
* @returns Names that could capture a generated type reference.
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* const names = collectScopeNames(sourceCode.scopeManager);
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
function collectScopeNames(scopeManager) {
|
|
82
|
+
const names = new Set();
|
|
83
|
+
const scopes = scopeManager?.scopes ?? [];
|
|
84
|
+
for (const scope of scopes) {
|
|
85
|
+
const variables = scope.variables ?? [];
|
|
86
|
+
for (const variable of variables) {
|
|
87
|
+
if (typeof variable.name === "string") {
|
|
88
|
+
names.add(variable.name);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return names;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Collects all import, value, and type names declared at module scope.
|
|
96
|
+
* @param statements Program statements to inspect.
|
|
97
|
+
* @returns Names already declared at module scope.
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const names = collectTopLevelNames(program.body);
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
function collectTopLevelNames(statements) {
|
|
104
|
+
const names = new Set();
|
|
105
|
+
for (const statement of statements) {
|
|
106
|
+
if (statement.type === AST_NODE_TYPES.ImportDeclaration) {
|
|
107
|
+
for (const specifier of statement.specifiers) {
|
|
108
|
+
names.add(specifier.local.name);
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (statement.type === AST_NODE_TYPES.ExportNamedDeclaration ||
|
|
113
|
+
statement.type === AST_NODE_TYPES.ExportDefaultDeclaration) {
|
|
114
|
+
if (statement.declaration !== null &&
|
|
115
|
+
isNamedDeclaration(statement.declaration)) {
|
|
116
|
+
collectDeclarationNames(statement.declaration, names);
|
|
117
|
+
}
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (isNamedDeclaration(statement)) {
|
|
121
|
+
collectDeclarationNames(statement, names);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return names;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Checks whether a program statement contains a supported declaration.
|
|
128
|
+
* @param node Program node to inspect.
|
|
129
|
+
* @returns Whether the node is a supported declaration.
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* const named = isNamedDeclaration(statement);
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
function isNamedDeclaration(node) {
|
|
136
|
+
return namedDeclarationTypes.has(node.type);
|
|
137
|
+
}
|
|
138
|
+
export { collectScopeNames, collectTopLevelNames };
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjbGFyYXRpb24tbmFtZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL2NvcmUvcHJlZmVyLWludGVyZmFjZS10eXBlcy9kZWNsYXJhdGlvbi1uYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBZXpFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQVM7SUFDNUMsY0FBYyxDQUFDLGdCQUFnQjtJQUMvQixjQUFjLENBQUMsbUJBQW1CO0lBQ2xDLGNBQWMsQ0FBQyxpQkFBaUI7SUFDaEMsY0FBYyxDQUFDLGlCQUFpQjtJQUNoQyxjQUFjLENBQUMsc0JBQXNCO0lBQ3JDLGNBQWMsQ0FBQyxtQkFBbUI7SUFDbEMsY0FBYyxDQUFDLHNCQUFzQjtJQUNyQyxjQUFjLENBQUMsbUJBQW1CO0NBQ25DLENBQUMsQ0FBQztBQUVIOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsV0FBNkIsRUFDN0IsS0FBa0I7SUFFbEIsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzVELEtBQUssTUFBTSxRQUFRLElBQUksV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hELG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELE9BQU87SUFDVCxDQUFDO0lBRUQsSUFDRSxJQUFJLElBQUksV0FBVztRQUNuQixXQUFXLENBQUMsRUFBRSxLQUFLLElBQUk7UUFDdkIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLFVBQVUsRUFDakQsQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0FBQ0gsQ0FBQztB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RUFDMUQsQ0FBQztZQUNELElBQ0UsU0FBUyxDQUFDLFdBQVcsS0FBSyxJQUFJO2dCQUM5QixrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQ3pDLENBQUM7Z0JBQ0QsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLElBQW1CO0lBQzdDLE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBU1RfTk9ERV9UWVBFUywgdHlwZSBUU0VTVHJlZSB9IGZyb20gXCJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHNcIjtcblxuaW1wb3J0IHR5cGUgeyBTY29wZU1hbmFnZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKiogRGVjbGFyYXRpb24gc2hhcGVzIHRoYXQgaW50cm9kdWNlIG5hbWVzIGF0IG1vZHVsZSBzY29wZS4gKi9cbnR5cGUgTmFtZWREZWNsYXJhdGlvbiA9XG4gIHwgVFNFU1RyZWUuQ2xhc3NEZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLkZ1bmN0aW9uRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU0RlY2xhcmVGdW5jdGlvblxuICB8IFRTRVNUcmVlLlRTRW51bURlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuVFNJbnRlcmZhY2VEZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTTW9kdWxlRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuVmFyaWFibGVEZWNsYXJhdGlvbjtcblxuY29uc3QgbmFtZWREZWNsYXJhdGlvblR5cGVzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgQVNUX05PREVfVFlQRVMuQ2xhc3NEZWNsYXJhdGlvbixcbiAgQVNUX05PREVfVFlQRVMuRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgQVNUX05PREVfVFlQRVMuVFNEZWNsYXJlRnVuY3Rpb24sXG4gIEFTVF9OT0RFX1RZUEVTLlRTRW51bURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU01vZHVsZURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5WYXJpYWJsZURlY2xhcmF0aW9uLFxuXSk7XG5cbi8qKlxuICogQWRkcyBuYW1lcyBpbnRyb2R1Y2VkIGJ5IG9uZSBzdXBwb3J0ZWQgdG9wLWxldmVsIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIGRlY2xhcmF0aW9uIFRvcC1sZXZlbCBkZWNsYXJhdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIG5hbWVzIE11dGFibGUgb3V0cHV0IHNldC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb2xsZWN0RGVjbGFyYXRpb25OYW1lcyhkZWNsYXJhdGlvbiwgbmFtZXMpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3REZWNsYXJhdGlvbk5hbWVzKFxuICBkZWNsYXJhdGlvbjogTmFtZWREZWNsYXJhdGlvbixcbiAgbmFtZXM6IFNldDxzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgIGNvbGxlY3RQYXR0ZXJuTmFtZXModmFyaWFibGUuaWQsIG5hbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICAgIFwiaWRcIiBpbiBkZWNsYXJhdGlvbiAmJlxuICAgIGRlY2xhcmF0aW9uLmlkICE9PSBudWxsICYmXG4gICAgZGVjbGFyYXRpb24uaWQudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSWRlbnRpZmllclxuICApIHtcbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIGlkZW50aWZpZXJzIGludHJvZHVjZWQgYnkgYSB0b3AtbGV2ZWwgYmluZGluZyBwYXR0ZXJuLlxuICogQHBhcmFtIHBhdHRlcm4gQmluZGluZyBwYXR0ZXJuIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gbmFtZXMgTXV0YWJsZSBvdXRwdXQgc2V0LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybiwgbmFtZXMpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybjogVFNFU1RyZWUuTm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gIGlmIChwYXR0ZXJuLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICBuYW1lcy5hZGQocGF0dGVybi5uYW1lKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5Bc3NpZ25tZW50UGF0dGVybikge1xuICAgIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybi5sZWZ0LCBuYW1lcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhdHRlcm4udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUmVzdEVsZW1lbnQpIHtcbiAgICBjb2xsZWN0UGF0dGVybk5hbWVzKHBhdHRlcm4uYXJndW1lbnQsIG5hbWVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5BcnJheVBhdHRlcm4pIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGF0dGVybi5lbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhlbGVtZW50LCBuYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwYXR0ZXJuLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLk9iamVjdFBhdHRlcm4pIHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHBhdHRlcm4ucHJvcGVydGllcykge1xuICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhcbiAgICAgICAgcHJvcGVydHkudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUHJvcGVydHlcbiAgICAgICAgICA/IHByb3BlcnR5LnZhbHVlXG4gICAgICAgICAgOiBwcm9wZXJ0eS5hcmd1bWVudCxcbiAgICAgICAgbmFtZXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIGRlY2xhcmF0aW9ucyBmcm9tIGV2ZXJ5IGxleGljYWwgc2NvcGUgaW4gYSBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSBzY29wZU1hbmFnZXIgUGFyc2VyIHNjb3BlIGluZm9ybWF0aW9uLlxuICogQHJldHVybnMgTmFtZXMgdGhhdCBjb3VsZCBjYXB0dXJlIGEgZ2VuZXJhdGVkIHR5cGUgcmVmZXJlbmNlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5hbWVzID0gY29sbGVjdFNjb3BlTmFtZXMoc291cmNlQ29kZS5zY29wZU1hbmFnZXIpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTY29wZU5hbWVzKFxuICBzY29wZU1hbmFnZXI6IFNjb3BlTWFuYWdlciB8IHVuZGVmaW5lZCxcbik6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgc2NvcGVzID0gc2NvcGVNYW5hZ2VyPy5zY29wZXMgPz8gW107XG5cbiAgZm9yIChjb25zdCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSBzY29wZS52YXJpYWJsZXMgPz8gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHR5cGVvZiB2YXJpYWJsZS5uYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5hbWVzLmFkZCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgYWxsIGltcG9ydCwgdmFsdWUsIGFuZCB0eXBlIG5hbWVzIGRlY2xhcmVkIGF0IG1vZHVsZSBzY29wZS5cbiAqIEBwYXJhbSBzdGF0ZW1lbnRzIFByb2dyYW0gc3RhdGVtZW50cyB0byBpbnNwZWN0LlxuICogQHJldHVybnMgTmFtZXMgYWxyZWFkeSBkZWNsYXJlZCBhdCBtb2R1bGUgc2NvcGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmFtZXMgPSBjb2xsZWN0VG9wTGV2ZWxOYW1lcyhwcm9ncmFtLmJvZHkpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUb3BMZXZlbE5hbWVzKHN0YXRlbWVudHM6IHJlYWRvbmx5IHVua25vd25bXSk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzIGFzIFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnRbXSkge1xuICAgIGlmIChzdGF0ZW1lbnQudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSW1wb3J0RGVjbGFyYXRpb24pIHtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHN0YXRlbWVudC5zcGVjaWZpZXJzKSB7XG4gICAgICAgIG5hbWVzLmFkZChzcGVjaWZpZXIubG9jYWwubmFtZSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzdGF0ZW1lbnQudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuRXhwb3J0TmFtZWREZWNsYXJhdGlvbiB8fFxuICAgICAgc3RhdGVtZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBzdGF0ZW1lbnQuZGVjbGFyYXRpb24gIT09IG51bGwgJiZcbiAgICAgICAgaXNOYW1lZERlY2xhcmF0aW9uKHN0YXRlbWVudC5kZWNsYXJhdGlvbilcbiAgICAgICkge1xuICAgICAgICBjb2xsZWN0RGVjbGFyYXRpb25OYW1lcyhzdGF0ZW1lbnQuZGVjbGFyYXRpb24sIG5hbWVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc05hbWVkRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgY29sbGVjdERlY2xhcmF0aW9uTmFtZXMoc3RhdGVtZW50LCBuYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgcHJvZ3JhbSBzdGF0ZW1lbnQgY29udGFpbnMgYSBzdXBwb3J0ZWQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gbm9kZSBQcm9ncmFtIG5vZGUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBzdXBwb3J0ZWQgZGVjbGFyYXRpb24uXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmFtZWQgPSBpc05hbWVkRGVjbGFyYXRpb24oc3RhdGVtZW50KTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc05hbWVkRGVjbGFyYXRpb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgTmFtZWREZWNsYXJhdGlvbiB7XG4gIHJldHVybiBuYW1lZERlY2xhcmF0aW9uVHlwZXMuaGFzKG5vZGUudHlwZSk7XG59XG5cbmV4cG9ydCB7IGNvbGxlY3RTY29wZU5hbWVzLCBjb2xsZWN0VG9wTGV2ZWxOYW1lcyB9O1xuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { InlineTypeMatch, NamedInlineTypeMatch } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Allocates unique PascalCase names for collected inline object types.
|
|
4
|
+
* @param matches Collected inline object types in report order.
|
|
5
|
+
* @param topLevelStatements Program statements used for collision detection.
|
|
6
|
+
* @param reservedNames Names declared in lexical scopes that could capture a generated reference.
|
|
7
|
+
* @returns Matches paired with collision-free names.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const namedMatches = allocateNames(matches, program.body);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
declare function allocateNames(matches: readonly InlineTypeMatch[], topLevelStatements: readonly unknown[], reservedNames?: ReadonlySet<string>): NamedInlineTypeMatch[];
|
|
14
|
+
/**
|
|
15
|
+
* Gets an identifier name from a parameter, including supported wrappers.
|
|
16
|
+
* @param parameter Parameter node to inspect.
|
|
17
|
+
* @returns Parameter identifier or the required fallback.
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const name = getParameterBaseName(parameter);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function getParameterBaseName(parameter: unknown): string;
|
|
24
|
+
/**
|
|
25
|
+
* Resolves the nearest declared name for a function-like return type.
|
|
26
|
+
* @param functionNode Function-like node owning the return annotation.
|
|
27
|
+
* @returns Nearby identifier or the anonymous-context fallback.
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const name = getReturnBaseName(functionNode);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare function getReturnBaseName(functionNode: unknown): string;
|
|
34
|
+
/**
|
|
35
|
+
* Gets the declared identifier for a variable annotation.
|
|
36
|
+
* @param variableNode Variable declarator node.
|
|
37
|
+
* @returns Variable identifier or the anonymous-context fallback.
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const name = getVariableBaseName(variableNode);
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare function getVariableBaseName(variableNode: unknown): string;
|
|
44
|
+
export { allocateNames, getParameterBaseName, getReturnBaseName, getVariableBaseName, };
|
|
45
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../../../src/domain/core/prefer-interface-types/naming.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EAErB,MAAM,SAAS,CAAC;AAIjB;;;;;;;;;;GAUG;AACH,iBAAS,aAAa,CACpB,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,kBAAkB,EAAE,SAAS,OAAO,EAAE,EACtC,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,GAC7C,oBAAoB,EAAE,CAsBxB;AAiCD;;;;;;;;GAQG;AACH,iBAAS,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CA8BxD;AA8BD;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CA8BxD;AAED;;;;;;;;GAQG;AACH,iBAAS,mBAAmB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAE1D;AA2BD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,CAAC"}
|