@codeperfect/eslint-plugin 2.7.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.
Files changed (72) hide show
  1. package/README.md +2 -7
  2. package/dist/application/custom-rules.d.ts.map +1 -1
  3. package/dist/application/custom-rules.js +15 -57
  4. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  5. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +1 -1
  6. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts.map +1 -1
  7. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.js +3 -9
  8. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
  9. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +3 -9
  10. package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.d.ts.map +1 -1
  11. package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.js +2 -9
  12. package/dist/domain/core/no-multiple-declarators/types.js +1 -1
  13. package/dist/domain/core/prefer-interface-types/autofix.d.ts +15 -0
  14. package/dist/domain/core/prefer-interface-types/autofix.d.ts.map +1 -0
  15. package/dist/domain/core/prefer-interface-types/autofix.js +196 -0
  16. package/dist/domain/core/prefer-interface-types/declaration-names.d.ts +23 -0
  17. package/dist/domain/core/prefer-interface-types/declaration-names.d.ts.map +1 -0
  18. package/dist/domain/core/prefer-interface-types/declaration-names.js +139 -0
  19. package/dist/domain/core/prefer-interface-types/naming.d.ts +45 -0
  20. package/dist/domain/core/prefer-interface-types/naming.d.ts.map +1 -0
  21. package/dist/domain/core/prefer-interface-types/naming.js +179 -0
  22. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts +2 -0
  23. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -1
  24. package/dist/domain/core/prefer-interface-types/rule-utilities.js +1 -1
  25. package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
  26. package/dist/domain/core/prefer-interface-types/rule.js +40 -16
  27. package/dist/domain/core/prefer-interface-types/types.d.ts +80 -0
  28. package/dist/domain/core/prefer-interface-types/types.d.ts.map +1 -0
  29. package/dist/domain/core/prefer-interface-types/types.js +2 -0
  30. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts.map +1 -1
  31. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.js +2 -7
  32. package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -1
  33. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -6
  34. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -1
  35. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +2 -5
  36. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  37. package/dist/domain/docs/require-example-language/examples.js +2 -6
  38. package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
  39. package/dist/domain/docs/require-example-language/reporting.js +3 -11
  40. package/dist/domain/docs/single-line-jsdoc/rule.js +1 -1
  41. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +1 -1
  42. package/dist/domain/testing/aaa/analyzer.analysis.js +1 -1
  43. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
  44. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +27 -3
  45. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +1 -1
  46. package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -1
  47. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +29 -4
  48. package/dist/domain/testing/aaa/analyzer.classification.traversal.js +1 -1
  49. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  50. package/dist/domain/testing/aaa/analyzer.super.helpers.js +1 -1
  51. package/dist/domain/testing/aaa/analyzer.super.js +10 -3
  52. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +1 -1
  53. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-identifiers.js +1 -1
  54. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
  55. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +3 -2
  56. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts.map +1 -1
  57. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.js +2 -7
  58. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-statements.js +1 -1
  59. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.js +1 -1
  60. package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +1 -1
  61. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -1
  62. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.js +2 -6
  63. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  64. package/dist/domain/testing/require-act-result-capture/rule.js +10 -5
  65. package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
  66. package/dist/domain/testing/require-test-companion/rule.js +4 -13
  67. package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
  68. package/dist/infrastructure/codeperfect-plugin.js +2 -4
  69. package/dist/infrastructure/index.js +1 -1
  70. package/dist/infrastructure/presets.d.ts.map +1 -1
  71. package/dist/infrastructure/presets.js +2 -4
  72. package/package.json +15 -14
@@ -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"}