@codeperfect/eslint-plugin 3.0.0 → 3.2.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/dist/adapters/angular/angular-template-block-usage-utilities.d.ts +4 -0
- package/dist/adapters/angular/angular-template-block-usage-utilities.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-block-usage-utilities.js +69 -0
- package/dist/adapters/angular/angular-template-expression-utilities.d.ts +5 -0
- package/dist/adapters/angular/angular-template-expression-utilities.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-expression-utilities.js +121 -0
- package/dist/adapters/angular/angular-template-node-usage-utilities.d.ts +4 -0
- package/dist/adapters/angular/angular-template-node-usage-utilities.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-node-usage-utilities.js +47 -0
- package/dist/adapters/angular/angular-template-usage-context.d.ts +26 -0
- package/dist/adapters/angular/angular-template-usage-context.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-usage-context.js +12 -0
- package/dist/adapters/angular/index.d.ts +2 -0
- package/dist/adapters/angular/index.d.ts.map +1 -0
- package/dist/adapters/angular/index.js +2 -0
- package/dist/adapters/angular/no-unused-public-members-template-adapter.d.ts +15 -0
- package/dist/adapters/angular/no-unused-public-members-template-adapter.d.ts.map +1 -0
- package/dist/adapters/angular/no-unused-public-members-template-adapter.js +126 -0
- package/dist/adapters/angular/plugin.d.ts +12 -0
- package/dist/adapters/angular/plugin.d.ts.map +1 -0
- package/dist/adapters/angular/plugin.js +14 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +2 -0
- package/dist/application/custom-rules.d.ts +3 -0
- package/dist/application/custom-rules.d.ts.map +1 -1
- package/dist/application/custom-rules.js +3 -2
- package/dist/application/index.d.ts +1 -1
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +2 -2
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts +0 -2
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +1 -2
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +0 -2
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +2 -10
- package/dist/domain/architecture/index.d.ts +1 -0
- package/dist/domain/architecture/index.d.ts.map +1 -1
- package/dist/domain/architecture/index.js +2 -1
- package/dist/domain/architecture/no-unused-public-members/index.d.ts +2 -0
- package/dist/domain/architecture/no-unused-public-members/index.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/index.js +2 -0
- package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts +16 -0
- package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.js +102 -0
- package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts +34 -0
- package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.js +55 -0
- package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts +68 -0
- package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-host-utilities.js +195 -0
- package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts +30 -0
- package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.js +106 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.d.ts +16 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.js +77 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts +28 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.js +151 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.d.ts +16 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.js +151 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts +29 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.js +115 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.d.ts +30 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.js +107 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts +64 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.js +152 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts +22 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.js +137 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.d.ts +43 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.js +126 -0
- package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts +43 -0
- package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-utilities.js +52 -0
- package/dist/domain/architecture/no-unused-public-members/rule.d.ts +16 -0
- package/dist/domain/architecture/no-unused-public-members/rule.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/rule.js +88 -0
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +4 -4
- 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 -2
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +4 -4
- package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/rule.js +2 -5
- package/dist/domain/docs/require-example-language/example-utilities.d.ts +1 -7
- package/dist/domain/docs/require-example-language/example-utilities.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/example-utilities.js +4 -6
- package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/examples.js +2 -4
- package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/reporting.js +1 -4
- package/dist/domain/docs/require-example-language/types.d.ts +0 -2
- package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/types.js +1 -1
- package/dist/domain/index.d.ts +1 -1
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +2 -2
- package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.analysis.js +2 -7
- package/dist/domain/testing/aaa/analyzer.assertions.js +2 -2
- package/dist/domain/testing/aaa/analyzer.classification.js +2 -2
- package/dist/domain/testing/aaa/types.d.ts +0 -4
- 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 -7
- package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.js +5 -9
- package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +2 -7
- package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.js +5 -5
- 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 +13 -20
- package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts +0 -2
- package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/types.js +1 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-options.js +3 -3
- package/dist/domain/testing/require-test-companion/rule.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/infrastructure/codeperfect-plugin.d.ts +2 -0
- package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
- package/dist/infrastructure/codeperfect-plugin.js +3 -2
- package/dist/infrastructure/presets.d.ts.map +1 -1
- package/dist/infrastructure/presets.js +3 -1
- package/package.json +36 -24
package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { expressionReferencesSymbol } from "./member-usage-expression-reference-utilities.js";
|
|
3
|
+
import { carriesMember, containsSerializedMember, expressionCarriesMemberValue, } from "./member-usage-value-utilities.js";
|
|
4
|
+
/**
|
|
5
|
+
* Checks whether a local call serializes the value supplied to a parameter.
|
|
6
|
+
* @param node Candidate local call expression.
|
|
7
|
+
* @param checker TypeScript type checker.
|
|
8
|
+
* @param member Member whose value is being consumed.
|
|
9
|
+
* @param program TypeScript project program.
|
|
10
|
+
* @returns True when the argument is traced into standard JSON serialization.
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const used = isLocalCallArgumentSerialized(node, checker, member, program);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
const isLocalCallArgumentSerialized = (node, checker, member, program) => {
|
|
17
|
+
if (!ts.isCallExpression(node)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const declaration = checker.getResolvedSignature(node)?.getDeclaration();
|
|
21
|
+
if (declaration === void 0 ||
|
|
22
|
+
!("body" in declaration) ||
|
|
23
|
+
declaration.body === void 0 ||
|
|
24
|
+
!ts.isBlock(declaration.body) ||
|
|
25
|
+
declaration.parameters.length === 0) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const body = declaration.body;
|
|
29
|
+
return node.arguments.some((argument, argumentIndex) => {
|
|
30
|
+
const parameter = declaration.parameters[Math.min(argumentIndex, declaration.parameters.length - 1)];
|
|
31
|
+
const parameterSymbol = parameter === void 0 || !ts.isIdentifier(parameter.name)
|
|
32
|
+
? void 0
|
|
33
|
+
: checker.getSymbolAtLocation(parameter.name);
|
|
34
|
+
if (parameterSymbol === void 0 ||
|
|
35
|
+
!expressionCarriesMemberValue(argument, checker, member)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const isSerializedParameter = (candidate) => {
|
|
39
|
+
if (candidate !== declaration && ts.isFunctionLike(candidate)) {
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
return ts.isCallExpression(candidate) &&
|
|
43
|
+
isStandardJsonStringifyCall(candidate, checker, program) &&
|
|
44
|
+
candidate.arguments.length === 1 &&
|
|
45
|
+
candidate.arguments[0] !== void 0 &&
|
|
46
|
+
expressionReferencesSymbol(candidate.arguments[0], parameterSymbol, checker)
|
|
47
|
+
? true
|
|
48
|
+
: ts.forEachChild(candidate, isSerializedParameter);
|
|
49
|
+
};
|
|
50
|
+
return isSerializedParameter(body) === true;
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Checks whether a call resolves to standard-library JSON.stringify.
|
|
55
|
+
* @param node Candidate call expression.
|
|
56
|
+
* @param checker TypeScript type checker.
|
|
57
|
+
* @param program TypeScript project used to identify standard declarations.
|
|
58
|
+
* @returns True when the call is the standard JSON serializer.
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const isJson = isStandardJsonStringifyCall(node, checker, program);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
const isStandardJsonStringifyCall = (node, checker, program) => {
|
|
65
|
+
if (!ts.isCallExpression(node)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const declaration = checker.getResolvedSignature(node)?.getDeclaration();
|
|
69
|
+
return (declaration !== void 0 &&
|
|
70
|
+
ts.isMethodSignature(declaration) &&
|
|
71
|
+
ts.isIdentifier(declaration.name) &&
|
|
72
|
+
declaration.name.text === "stringify" &&
|
|
73
|
+
ts.isInterfaceDeclaration(declaration.parent) &&
|
|
74
|
+
declaration.parent.name.text === "JSON" &&
|
|
75
|
+
program.isSourceFileDefaultLibrary(declaration.getSourceFile()));
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Checks whether an operation copies or serializes a member-bearing value.
|
|
79
|
+
* @param node Candidate spread or call expression.
|
|
80
|
+
* @param checker TypeScript type checker.
|
|
81
|
+
* @param member Member whose value is being consumed.
|
|
82
|
+
* @param program TypeScript program used to identify standard library declarations.
|
|
83
|
+
* @returns True when the operation consumes the object's own properties.
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const used = isWholeObjectRead(node, checker, member, program);
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
const isWholeObjectRead = (node, checker, member, program) => {
|
|
90
|
+
if (ts.isClassDeclaration(member.hostDeclaration) &&
|
|
91
|
+
!ts.isPropertyDeclaration(member.declaration)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
if (ts.isSpreadAssignment(node)) {
|
|
95
|
+
return carriesMember(node.expression, checker, member);
|
|
96
|
+
}
|
|
97
|
+
if (!ts.isCallExpression(node) || node.arguments.length !== 1) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
const argument = node.arguments[0];
|
|
101
|
+
return (isStandardJsonStringifyCall(node, checker, program) &&
|
|
102
|
+
argument !== void 0 &&
|
|
103
|
+
(carriesMember(argument, checker, member) ||
|
|
104
|
+
containsSerializedMember(checker.getTypeAtLocation(argument), checker, member, new Set(), 5)));
|
|
105
|
+
};
|
|
106
|
+
export { isLocalCallArgumentSerialized, isWholeObjectRead };
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLXNlcmlhbGl6YXRpb24tdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci11c2FnZS1zZXJpYWxpemF0aW9uLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUlqQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUMzRixPQUFPLEVBQ0wsYUFBYSxFQUNiLHdCQUF3QixFQUN4Qiw0QkFBNEIsR0FDN0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sNkJBQTZCLEdBQUcsQ0FDcEMsSUFBYSxFQUNiLE9BQXVCLEVBQ3ZCLE1BQW9CLEVBQ3BCLE9BQW1CLEVBQ1YsRUFBRTtJQUNYLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDekUsSUFDRSxXQUFXLEtBQUssS0FBSyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDO1FBQ3hCLFdBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO1FBQzNCLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzdCLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDbkMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7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QWtCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUM3QyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQzdDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkMsT0FBTyxDQUNMLDJCQUEyQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO1FBQ25ELFFBQVEsS0FBSyxLQUFLLENBQUM7UUFDbkIsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDdkMsd0JBQXdCLENBQ3RCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFDbkMsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEdBQUcsRUFBRSxFQUNULENBQUMsQ0FDRixDQUFDLENBQ0wsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHR5cGUgeyBQdWJsaWNNZW1iZXIgfSBmcm9tIFwiLi9tZW1iZXItZGVjbGFyYXRpb24tdXRpbGl0aWVzXCI7XG5cbmltcG9ydCB7IGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sIH0gZnJvbSBcIi4vbWVtYmVyLXVzYWdlLWV4cHJlc3Npb24tcmVmZXJlbmNlLXV0aWxpdGllc1wiO1xuaW1wb3J0IHtcbiAgY2Fycmllc01lbWJlcixcbiAgY29udGFpbnNTZXJpYWxpemVkTWVtYmVyLFxuICBleHByZXNzaW9uQ2Fycmllc01lbWJlclZhbHVlLFxufSBmcm9tIFwiLi9tZW1iZXItdXNhZ2UtdmFsdWUtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBsb2NhbCBjYWxsIHNlcmlhbGl6ZXMgdGhlIHZhbHVlIHN1cHBsaWVkIHRvIGEgcGFyYW1ldGVyLlxuICogQHBhcmFtIG5vZGUgQ2FuZGlkYXRlIGxvY2FsIGNhbGwgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHBhcmFtIG1lbWJlciBNZW1iZXIgd2hvc2UgdmFsdWUgaXMgYmVpbmcgY29uc3VtZWQuXG4gKiBAcGFyYW0gcHJvZ3JhbSBUeXBlU2NyaXB0IHByb2plY3QgcHJvZ3JhbS5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgYXJndW1lbnQgaXMgdHJhY2VkIGludG8gc3RhbmRhcmQgSlNPTiBzZXJpYWxpemF0aW9uLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVzZWQgPSBpc0xvY2FsQ2FsbEFyZ3VtZW50U2VyaWFsaXplZChub2RlLCBjaGVja2VyLCBtZW1iZXIsIHByb2dyYW0pO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzTG9jYWxDYWxsQXJndW1lbnRTZXJpYWxpemVkID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbWVtYmVyOiBQdWJsaWNNZW1iZXIsXG4gIHByb2dyYW06IHRzLlByb2dyYW0sXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKCF0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZGVjbGFyYXRpb24gPSBjaGVja2VyLmdldFJlc29sdmVkU2lnbmF0dXJlKG5vZGUpPy5nZXREZWNsYXJhdGlvbigpO1xuICBpZiAoXG4gICAgZGVjbGFyYXRpb24gPT09IHZvaWQgMCB8fFxuICAgICEoXCJib2R5XCIgaW4gZGVjbGFyYXRpb24pIHx8XG4gICAgZGVjbGFyYXRpb24uYm9keSA9PT0gdm9pZCAwIHx8XG4gICAgIXRzLmlzQmxvY2soZGVjbGFyYXRpb24uYm9keSkgfHxcbiAgICBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMFxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgYm9keSA9IGRlY2xhcmF0aW9uLmJvZHk7XG5cbiAgcmV0dXJuIG5vZGUuYXJndW1lbnRzLnNvbWUoKGFyZ3VtZW50LCBhcmd1bWVudEluZGV4KSA9PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyID1cbiAgICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnNbXG4gICAgICAgIE1hdGgubWluKGFyZ3VtZW50SW5kZXgsIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubGVuZ3RoIC0gMSlcbiAgICAgIF07XG4gICAgY29uc3QgcGFyYW1ldGVyU3ltYm9sID1cbiAgICAgIHBhcmFtZXRlciA9PT0gdm9pZCAwIHx8ICF0cy5pc0lkZW50aWZpZXIocGFyYW1ldGVyLm5hbWUpXG4gICAgICAgID8gdm9pZCAwXG4gICAgICAgIDogY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKHBhcmFtZXRlci5uYW1lKTtcblxuICAgIGlmIChcbiAgICAgIHBhcmFtZXRlclN5bWJvbCA9PT0gdm9pZCAwIHx8XG4gICAgICAhZXhwcmVzc2lvbkNhcnJpZXNNZW1iZXJWYWx1ZShhcmd1bWVudCwgY2hlY2tlciwgbWVtYmVyKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzU2VyaWFsaXplZFBhcmFtZXRlciA9IChjYW5kaWRhdGU6IHRzLk5vZGUpOiB0cnVlIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmIChjYW5kaWRhdGUgIT09IGRlY2xhcmF0aW9uICYmIHRzLmlzRnVuY3Rpb25MaWtlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRzLmlzQ2FsbEV4cHJlc3Npb24oY2FuZGlkYXRlKSAmJlxuICAgICAgICBpc1N0YW5kYXJkSnNvblN0cmluZ2lmeUNhbGwoY2FuZGlkYXRlLCBjaGVja2VyLCBwcm9ncmFtKSAmJlxuICAgICAgICBjYW5kaWRhdGUuYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBjYW5kaWRhdGUuYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgJiZcbiAgICAgICAgZXhwcmVzc2lvblJlZmVyZW5jZXNTeW1ib2woXG4gICAgICAgICAgY2FuZGlkYXRlLmFyZ3VtZW50c1swXSxcbiAgICAgICAgICBwYXJhbWV0ZXJTeW1ib2wsXG4gICAgICAgICAgY2hlY2tlcixcbiAgICAgICAgKVxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiB0cy5mb3JFYWNoQ2hpbGQoY2FuZGlkYXRlLCBpc1NlcmlhbGl6ZWRQYXJhbWV0ZXIpO1xuICAgIH07XG5cbiAgICByZXR1cm4gaXNTZXJpYWxpemVkUGFyYW1ldGVyKGJvZHkpID09PSB0cnVlO1xuICB9KTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjYWxsIHJlc29sdmVzIHRvIHN0YW5kYXJkLWxpYnJhcnkgSlNPTi5zdHJpbmdpZnkuXG4gKiBAcGFyYW0gbm9kZSBDYW5kaWRhdGUgY2FsbCBleHByZXNzaW9uLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gcHJvZ3JhbSBUeXBlU2NyaXB0IHByb2plY3QgdXNlZCB0byBpZGVudGlmeSBzdGFuZGFyZCBkZWNsYXJhdGlvbnMuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGNhbGwgaXMgdGhlIHN0YW5kYXJkIEpTT04gc2VyaWFsaXplci5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBpc0pzb24gPSBpc1N0YW5kYXJkSnNvblN0cmluZ2lmeUNhbGwobm9kZSwgY2hlY2tlciwgcHJvZ3JhbSk7XG4gKiBgYGBcbiAqL1xuY29uc3QgaXNTdGFuZGFyZEpzb25TdHJpbmdpZnlDYWxsID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIXRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGNoZWNrZXIuZ2V0UmVzb2x2ZWRTaWduYXR1cmUobm9kZSk/LmdldERlY2xhcmF0aW9uKCk7XG5cbiAgcmV0dXJuIChcbiAgICBkZWNsYXJhdGlvbiAhPT0gdm9pZCAwICYmXG4gICAgdHMuaXNNZXRob2RTaWduYXR1cmUoZGVjbGFyYXRpb24pICYmXG4gICAgdHMuaXNJZGVudGlmaWVyKGRlY2xhcmF0aW9uLm5hbWUpICYmXG4gICAgZGVjbGFyYXRpb24ubmFtZS50ZXh0ID09PSBcInN0cmluZ2lmeVwiICYmXG4gICAgdHMuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihkZWNsYXJhdGlvbi5wYXJlbnQpICYmXG4gICAgZGVjbGFyYXRpb24ucGFyZW50Lm5hbWUudGV4dCA9PT0gXCJKU09OXCIgJiZcbiAgICBwcm9ncmFtLmlzU291cmNlRmlsZURlZmF1bHRMaWJyYXJ5KGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKSlcbiAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gb3BlcmF0aW9uIGNvcGllcyBvciBzZXJpYWxpemVzIGEgbWVtYmVyLWJlYXJpbmcgdmFsdWUuXG4gKiBAcGFyYW0gbm9kZSBDYW5kaWRhdGUgc3ByZWFkIG9yIGNhbGwgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHBhcmFtIG1lbWJlciBNZW1iZXIgd2hvc2UgdmFsdWUgaXMgYmVpbmcgY29uc3VtZWQuXG4gKiBAcGFyYW0gcHJvZ3JhbSBUeXBlU2NyaXB0IHByb2dyYW0gdXNlZCB0byBpZGVudGlmeSBzdGFuZGFyZCBsaWJyYXJ5IGRlY2xhcmF0aW9ucy5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgb3BlcmF0aW9uIGNvbnN1bWVzIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB1c2VkID0gaXNXaG9sZU9iamVjdFJlYWQobm9kZSwgY2hlY2tlciwgbWVtYmVyLCBwcm9ncmFtKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc1dob2xlT2JqZWN0UmVhZCA9IChcbiAgbm9kZTogdHMuTm9kZSxcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChcbiAgICB0cy5pc0NsYXNzRGVjbGFyYXRpb24obWVtYmVyLmhvc3REZWNsYXJhdGlvbikgJiZcbiAgICAhdHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG1lbWJlci5kZWNsYXJhdGlvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHRzLmlzU3ByZWFkQXNzaWdubWVudChub2RlKSkge1xuICAgIHJldHVybiBjYXJyaWVzTWVtYmVyKG5vZGUuZXhwcmVzc2lvbiwgY2hlY2tlciwgbWVtYmVyKTtcbiAgfVxuXG4gIGlmICghdHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSB8fCBub2RlLmFyZ3VtZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuXG4gIHJldHVybiAoXG4gICAgaXNTdGFuZGFyZEpzb25TdHJpbmdpZnlDYWxsKG5vZGUsIGNoZWNrZXIsIHByb2dyYW0pICYmXG4gICAgYXJndW1lbnQgIT09IHZvaWQgMCAmJlxuICAgIChjYXJyaWVzTWVtYmVyKGFyZ3VtZW50LCBjaGVja2VyLCBtZW1iZXIpIHx8XG4gICAgICBjb250YWluc1NlcmlhbGl6ZWRNZW1iZXIoXG4gICAgICAgIGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oYXJndW1lbnQpLFxuICAgICAgICBjaGVja2VyLFxuICAgICAgICBtZW1iZXIsXG4gICAgICAgIG5ldyBTZXQoKSxcbiAgICAgICAgNSxcbiAgICAgICkpXG4gICk7XG59O1xuXG5leHBvcnQgeyBpc0xvY2FsQ2FsbEFyZ3VtZW50U2VyaWFsaXplZCwgaXNXaG9sZU9iamVjdFJlYWQgfTtcbiJdfQ==
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { PublicMember } from "./member-declaration-utilities.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether a value type carries a structurally corresponding member.
|
|
5
|
+
* @param valueType Type of the value being inspected.
|
|
6
|
+
* @param member Member whose host shape is required.
|
|
7
|
+
* @param checker TypeScript type checker.
|
|
8
|
+
* @returns True when TypeScript relates the value and host shapes.
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const matches = hasCompatibleMemberShape(valueType, member, checker);
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare const hasCompatibleMemberShape: (valueType: ts.Type, member: PublicMember, checker: ts.TypeChecker) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Gets the property type supplied by an object's contextual contract.
|
|
17
|
+
* @param objectType Expected shape for the object literal.
|
|
18
|
+
* @param propertyName Property name in the object literal.
|
|
19
|
+
* @param location Node used to resolve the property type.
|
|
20
|
+
* @param checker TypeScript type checker.
|
|
21
|
+
* @returns Contextual property type when one is declared.
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const type = getContextualPropertyType(objectType, "docs", node, checker);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare const getContextualPropertyType: (objectType: ts.Type | undefined, propertyName: string, location: ts.Node, checker: ts.TypeChecker) => ts.Type | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Gets the resolved parameter type for a call argument.
|
|
30
|
+
* @param call Call expression containing the argument.
|
|
31
|
+
* @param argument Argument expression to inspect.
|
|
32
|
+
* @param checker TypeScript type checker.
|
|
33
|
+
* @returns Parameter type when TypeScript resolves the call.
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const parameterType = getCallArgumentType(call, argument, checker);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
declare const getCallArgumentType: (call: ts.CallExpression, argument: ts.Expression, checker: ts.TypeChecker) => ts.Type | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Checks whether a method declaration contains only a contract.
|
|
42
|
+
* @param declaration Candidate method declaration.
|
|
43
|
+
* @returns True when the declaration has no implementation body.
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const declarationOnly = isDeclarationOnlyMethod(declaration);
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
declare const isDeclarationOnlyMethod: (declaration: ts.Node) => boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Checks whether a typed handoff carries a member into a compatible contract.
|
|
52
|
+
* @param sourceExpression Value being forwarded.
|
|
53
|
+
* @param targetType Type expected at the receiving boundary.
|
|
54
|
+
* @param member Member whose usage is being checked.
|
|
55
|
+
* @param checker TypeScript type checker.
|
|
56
|
+
* @returns True when the receiving contract accepts the corresponding member.
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const used = isMemberHandoff(expression, targetType, member, checker);
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
declare const isMemberHandoff: (sourceExpression: ts.Expression, targetType: ts.Type | undefined, member: PublicMember, checker: ts.TypeChecker) => boolean;
|
|
63
|
+
export { getCallArgumentType, getContextualPropertyType, hasCompatibleMemberShape, isDeclarationOnlyMethod, isMemberHandoff, };
|
|
64
|
+
//# sourceMappingURL=member-usage-type-utilities.d.ts.map
|
package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-usage-type-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-type-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AA0BnE;;;;;;;;;;GAUG;AACH,QAAA,MAAM,wBAAwB,GAC5B,WAAW,EAAE,CAAC,IAAI,EAClB,QAAQ,YAAY,EACpB,SAAS,EAAE,CAAC,WAAW,KACtB,OAgBF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,yBAAyB,GAC7B,YAAY,EAAE,CAAC,IAAI,GAAG,SAAS,EAC/B,cAAc,MAAM,EACpB,UAAU,EAAE,CAAC,IAAI,EACjB,SAAS,EAAE,CAAC,WAAW,KACtB,EAAE,CAAC,IAAI,GAAG,SASZ,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,mBAAmB,GACvB,MAAM,EAAE,CAAC,cAAc,EACvB,UAAU,EAAE,CAAC,UAAU,EACvB,SAAS,EAAE,CAAC,WAAW,KACtB,EAAE,CAAC,IAAI,GAAG,SAeZ,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,uBAAuB,GAAI,aAAa,EAAE,CAAC,IAAI,KAAG,OAIc,CAAC;AAyBvE;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,eAAe,GACnB,kBAAkB,EAAE,CAAC,UAAU,EAC/B,YAAY,EAAE,CAAC,IAAI,GAAG,SAAS,EAC/B,QAAQ,YAAY,EACpB,SAAS,EAAE,CAAC,WAAW,KACtB,OAgDF,CAAC;AAEF,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,GAChB,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { carriesMember } from "./member-usage-value-utilities.js";
|
|
3
|
+
/**
|
|
4
|
+
* Gets the declared type of the host that owns a public member.
|
|
5
|
+
* @param member Member whose host type is needed.
|
|
6
|
+
* @param checker TypeScript type checker.
|
|
7
|
+
* @returns Host type used for structural usage checks.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const hostType = getMemberHostType(member, checker);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
const getMemberHostType = (member, checker) => {
|
|
14
|
+
const declaration = member.hostDeclaration;
|
|
15
|
+
const location = ts.isVariableDeclaration(declaration)
|
|
16
|
+
? declaration.name
|
|
17
|
+
: declaration;
|
|
18
|
+
return checker.getTypeAtLocation(location);
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Checks whether a value type carries a structurally corresponding member.
|
|
22
|
+
* @param valueType Type of the value being inspected.
|
|
23
|
+
* @param member Member whose host shape is required.
|
|
24
|
+
* @param checker TypeScript type checker.
|
|
25
|
+
* @returns True when TypeScript relates the value and host shapes.
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const matches = hasCompatibleMemberShape(valueType, member, checker);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
const hasCompatibleMemberShape = (valueType, member, checker) => {
|
|
32
|
+
const hostType = checker.getNonNullableType(getMemberHostType(member, checker));
|
|
33
|
+
const observedType = checker.getNonNullableType(valueType);
|
|
34
|
+
const hostProperty = checker.getPropertyOfType(hostType, member.memberName);
|
|
35
|
+
const observedProperty = checker.getPropertyOfType(observedType, member.memberName);
|
|
36
|
+
return (hostProperty !== void 0 &&
|
|
37
|
+
observedProperty !== void 0 &&
|
|
38
|
+
checker.isTypeAssignableTo(hostType, observedType));
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Gets the property type supplied by an object's contextual contract.
|
|
42
|
+
* @param objectType Expected shape for the object literal.
|
|
43
|
+
* @param propertyName Property name in the object literal.
|
|
44
|
+
* @param location Node used to resolve the property type.
|
|
45
|
+
* @param checker TypeScript type checker.
|
|
46
|
+
* @returns Contextual property type when one is declared.
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const type = getContextualPropertyType(objectType, "docs", node, checker);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
const getContextualPropertyType = (objectType, propertyName, location, checker) => {
|
|
53
|
+
const property = objectType === void 0
|
|
54
|
+
? void 0
|
|
55
|
+
: checker.getPropertyOfType(objectType, propertyName);
|
|
56
|
+
return property === void 0
|
|
57
|
+
? void 0
|
|
58
|
+
: checker.getTypeOfSymbolAtLocation(property, location);
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Gets the resolved parameter type for a call argument.
|
|
62
|
+
* @param call Call expression containing the argument.
|
|
63
|
+
* @param argument Argument expression to inspect.
|
|
64
|
+
* @param checker TypeScript type checker.
|
|
65
|
+
* @returns Parameter type when TypeScript resolves the call.
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const parameterType = getCallArgumentType(call, argument, checker);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
const getCallArgumentType = (call, argument, checker) => {
|
|
72
|
+
const contextualType = checker.getContextualType(argument);
|
|
73
|
+
if (contextualType !== void 0) {
|
|
74
|
+
return contextualType;
|
|
75
|
+
}
|
|
76
|
+
const argumentIndex = call.arguments.indexOf(argument);
|
|
77
|
+
const signature = checker.getResolvedSignature(call);
|
|
78
|
+
const parameter = signature === void 0 ? void 0 : signature.parameters[argumentIndex];
|
|
79
|
+
return parameter === void 0
|
|
80
|
+
? void 0
|
|
81
|
+
: checker.getTypeOfSymbolAtLocation(parameter, call);
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Checks whether a method declaration contains only a contract.
|
|
85
|
+
* @param declaration Candidate method declaration.
|
|
86
|
+
* @returns True when the declaration has no implementation body.
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const declarationOnly = isDeclarationOnlyMethod(declaration);
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
const isDeclarationOnlyMethod = (declaration) => ts.isCallSignatureDeclaration(declaration) ||
|
|
93
|
+
ts.isFunctionTypeNode(declaration) ||
|
|
94
|
+
ts.isMethodSignature(declaration) ||
|
|
95
|
+
(ts.isMethodDeclaration(declaration) && declaration.body === void 0);
|
|
96
|
+
/**
|
|
97
|
+
* Resolves a named property or the string-index contract accepting it.
|
|
98
|
+
* @param type Object type whose member is being forwarded.
|
|
99
|
+
* @param member Member supplying the property name and type location.
|
|
100
|
+
* @param checker TypeScript type checker.
|
|
101
|
+
* @returns Explicit property type or string-index value type.
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const valueType = getPropertyOrIndexType(type, member, checker);
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
const getPropertyOrIndexType = (type, member, checker) => {
|
|
108
|
+
const property = checker.getPropertyOfType(type, member.memberName);
|
|
109
|
+
return property === void 0
|
|
110
|
+
? checker.getIndexTypeOfType(type, ts.IndexKind.String)
|
|
111
|
+
: checker.getTypeOfSymbolAtLocation(property, member.declaration);
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Checks whether a typed handoff carries a member into a compatible contract.
|
|
115
|
+
* @param sourceExpression Value being forwarded.
|
|
116
|
+
* @param targetType Type expected at the receiving boundary.
|
|
117
|
+
* @param member Member whose usage is being checked.
|
|
118
|
+
* @param checker TypeScript type checker.
|
|
119
|
+
* @returns True when the receiving contract accepts the corresponding member.
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const used = isMemberHandoff(expression, targetType, member, checker);
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
const isMemberHandoff = (sourceExpression, targetType, member, checker) => {
|
|
126
|
+
if (targetType === void 0) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
const hostType = checker.getNonNullableType(getMemberHostType(member, checker));
|
|
130
|
+
const forwardedType = checker.getNonNullableType(checker.getTypeAtLocation(sourceExpression));
|
|
131
|
+
const receivingType = checker.getNonNullableType(targetType);
|
|
132
|
+
if (receivingType.isUnion()) {
|
|
133
|
+
return receivingType.types.some((part) => isMemberHandoff(sourceExpression, part, member, checker));
|
|
134
|
+
}
|
|
135
|
+
if (checker.getPropertyOfType(receivingType, member.memberName) === void 0 &&
|
|
136
|
+
!carriesMember(sourceExpression, checker, member)) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
const hostPropertyType = getPropertyOrIndexType(hostType, member, checker);
|
|
140
|
+
const forwardedPropertyType = getPropertyOrIndexType(forwardedType, member, checker);
|
|
141
|
+
const receivingPropertyType = getPropertyOrIndexType(receivingType, member, checker);
|
|
142
|
+
return (hostPropertyType !== void 0 &&
|
|
143
|
+
forwardedPropertyType !== void 0 &&
|
|
144
|
+
receivingPropertyType !== void 0 &&
|
|
145
|
+
(checker.isTypeAssignableTo(forwardedType, hostType) ||
|
|
146
|
+
checker.isTypeAssignableTo(hostType, forwardedType)) &&
|
|
147
|
+
checker.isTypeAssignableTo(hostType, receivingType) &&
|
|
148
|
+
(checker.isTypeAssignableTo(hostPropertyType, receivingPropertyType) ||
|
|
149
|
+
checker.isTypeAssignableTo(receivingPropertyType, hostPropertyType)));
|
|
150
|
+
};
|
|
151
|
+
export { getCallArgumentType, getContextualPropertyType, hasCompatibleMemberShape, isDeclarationOnlyMethod, isMemberHandoff, };
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLXR5cGUtdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci11c2FnZS10eXBlLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUlqQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFL0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixNQUFvQixFQUNwQixPQUF1QixFQUNkLEVBQUU7SUFDWCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO0lBQzNDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJO1FBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFFaEIsT0FBTyxPQUFPLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsQ0FDL0IsU0FBa0IsRUFDbEIsTUFBb0IsRUFDcEIsT0FBdUIsRUFDZCxFQUFFO0lBQ1gsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUN6QyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQ25DLENBQUM7SUFDRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxPQUFP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YUFBYSxFQUNiLE1BQU0sRUFDTixPQUFPLENBQ1IsQ0FBQztJQUVGLE9BQU8sQ0FDTCxnQkFBZ0IsS0FBSyxLQUFLLENBQUM7UUFDM0IscUJBQXFCLEtBQUssS0FBSyxDQUFDO1FBQ2hDLHFCQUFxQixLQUFLLEtBQUssQ0FBQztRQUNoQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUM7UUFDbkQsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUscUJBQXFCLENBQUM7WUFDbEUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FDdkUsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qix1QkFBdUIsRUFDdkIsZUFBZSxHQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHR5cGUgeyBQdWJsaWNNZW1iZXIgfSBmcm9tIFwiLi9tZW1iZXItZGVjbGFyYXRpb24tdXRpbGl0aWVzXCI7XG5cbmltcG9ydCB7IGNhcnJpZXNNZW1iZXIgfSBmcm9tIFwiLi9tZW1iZXItdXNhZ2UtdmFsdWUtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogR2V0cyB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgaG9zdCB0aGF0IG93bnMgYSBwdWJsaWMgbWVtYmVyLlxuICogQHBhcmFtIG1lbWJlciBNZW1iZXIgd2hvc2UgaG9zdCB0eXBlIGlzIG5lZWRlZC5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHJldHVybnMgSG9zdCB0eXBlIHVzZWQgZm9yIHN0cnVjdHVyYWwgdXNhZ2UgY2hlY2tzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGhvc3RUeXBlID0gZ2V0TWVtYmVySG9zdFR5cGUobWVtYmVyLCBjaGVja2VyKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXRNZW1iZXJIb3N0VHlwZSA9IChcbiAgbWVtYmVyOiBQdWJsaWNNZW1iZXIsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuKTogdHMuVHlwZSA9PiB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gbWVtYmVyLmhvc3REZWNsYXJhdGlvbjtcbiAgY29uc3QgbG9jYXRpb24gPSB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pXG4gICAgPyBkZWNsYXJhdGlvbi5uYW1lXG4gICAgOiBkZWNsYXJhdGlvbjtcblxuICByZXR1cm4gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihsb2NhdGlvbik7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgdHlwZSBjYXJyaWVzIGEgc3RydWN0dXJhbGx5IGNvcnJlc3BvbmRpbmcgbWVtYmVyLlxuICogQHBhcmFtIHZhbHVlVHlwZSBUeXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBpbnNwZWN0ZWQuXG4gKiBAcGFyYW0gbWVtYmVyIE1lbWJlciB3aG9zZSBob3N0IHNoYXBlIGlzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gVHlwZVNjcmlwdCByZWxhdGVzIHRoZSB2YWx1ZSBhbmQgaG9zdCBzaGFwZXMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWF0Y2hlcyA9IGhhc0NvbXBhdGlibGVNZW1iZXJTaGFwZSh2YWx1ZVR5cGUsIG1lbWJlciwgY2hlY2tlcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgaGFzQ29tcGF0aWJsZU1lbWJlclNoYXBlID0gKFxuICB2YWx1ZVR5cGU6IHRzLlR5cGUsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBob3N0VHlwZSA9IGNoZWNrZXIuZ2V0Tm9uTnVsbGFibGVUeXBlKFxuICAgIGdldE1lbWJlckhvc3RUeXBlKG1lbWJlciwgY2hlY2tlciksXG4gICk7XG4gIGNvbnN0IG9ic2VydmVkVHlwZSA9IGNoZWNrZXIuZ2V0Tm9uTnVsbGFibGVUeXBlKHZhbHVlVHlwZSk7XG4gIGNvbnN0IGhvc3RQcm9wZXJ0eSA9IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUoaG9zdFR5cGUsIG1lbWJlci5tZW1iZXJOYW1lKTtcbiAgY29uc3Qgb2JzZXJ2ZWRQcm9wZXJ0eSA9IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUoXG4gICAgb2JzZXJ2ZWRUeXBlLFxuICAgIG1lbWJlci5tZW1iZXJOYW1lLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgaG9zdFByb3BlcnR5ICE9PSB2b2lkIDAgJiZcbiAgICBvYnNlcnZlZFByb3BlcnR5ICE9PSB2b2lkIDAgJiZcbiAgICBjaGVja2VyLmlzVHlwZUFzc2lnbmFibGVUbyhob3N0VHlwZSwgb2JzZXJ2ZWRUeXBlKVxuICApO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSB0eXBlIHN1cHBsaWVkIGJ5IGFuIG9iamVjdCdzIGNvbnRleHR1YWwgY29udHJhY3QuXG4gKiBAcGFyYW0gb2JqZWN0VHlwZSBFeHBlY3RlZCBzaGFwZSBmb3IgdGhlIG9iamVjdCBsaXRlcmFsLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBuYW1lIGluIHRoZSBvYmplY3QgbGl0ZXJhbC5cbiAqIEBwYXJhbSBsb2NhdGlvbiBOb2RlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvcGVydHkgdHlwZS5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHJldHVybnMgQ29udGV4dHVhbCBwcm9wZXJ0eSB0eXBlIHdoZW4gb25lIGlzIGRlY2xhcmVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHR5cGUgPSBnZXRDb250ZXh0dWFsUHJvcGVydHlUeXBlKG9iamVjdFR5cGUsIFwiZG9jc1wiLCBub2RlLCBjaGVja2VyKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXRDb250ZXh0dWFsUHJvcGVydHlUeXBlID0gKFxuICBvYmplY3RUeXBlOiB0cy5UeXBlIHwgdW5kZWZpbmVkLFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgbG9jYXRpb246IHRzLk5vZGUsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuKTogdHMuVHlwZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHByb3BlcnR5ID1cbiAgICBvYmplY3RUeXBlID09PSB2b2lkIDBcbiAgICAgID8gdm9pZCAwXG4gICAgICA6IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUob2JqZWN0VHlwZSwgcHJvcGVydHlOYW1lKTtcblxuICByZXR1cm4gcHJvcGVydHkgPT09IHZvaWQgMFxuICAgID8gdm9pZCAwXG4gICAgOiBjaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24ocHJvcGVydHksIGxvY2F0aW9uKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgcmVzb2x2ZWQgcGFyYW1ldGVyIHR5cGUgZm9yIGEgY2FsbCBhcmd1bWVudC5cbiAqIEBwYXJhbSBjYWxsIENhbGwgZXhwcmVzc2lvbiBjb250YWluaW5nIHRoZSBhcmd1bWVudC5cbiAqIEBwYXJhbSBhcmd1bWVudCBBcmd1bWVudCBleHByZXNzaW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEByZXR1cm5zIFBhcmFtZXRlciB0eXBlIHdoZW4gVHlwZVNjcmlwdCByZXNvbHZlcyB0aGUgY2FsbC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwYXJhbWV0ZXJUeXBlID0gZ2V0Q2FsbEFyZ3VtZW50VHlwZShjYWxsLCBhcmd1bWVudCwgY2hlY2tlcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgZ2V0Q2FsbEFyZ3VtZW50VHlwZSA9IChcbiAgY2FsbDogdHMuQ2FsbEV4cHJlc3Npb24sXG4gIGFyZ3VtZW50OiB0cy5FeHByZXNzaW9uLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IHRzLlR5cGUgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBjb250ZXh0dWFsVHlwZSA9IGNoZWNrZXIuZ2V0Q29udGV4dHVhbFR5cGUoYXJndW1lbnQpO1xuXG4gIGlmIChjb250ZXh0dWFsVHlwZSAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGNvbnRleHR1YWxUeXBlO1xuICB9XG5cbiAgY29uc3QgYXJndW1lbnRJbmRleCA9IGNhbGwuYXJndW1lbnRzLmluZGV4T2YoYXJndW1lbnQpO1xuICBjb25zdCBzaWduYXR1cmUgPSBjaGVja2VyLmdldFJlc29sdmVkU2lnbmF0dXJlKGNhbGwpO1xuICBjb25zdCBwYXJhbWV0ZXIgPVxuICAgIHNpZ25hdHVyZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2lnbmF0dXJlLnBhcmFtZXRlcnNbYXJndW1lbnRJbmRleF07XG5cbiAgcmV0dXJuIHBhcmFtZXRlciA9PT0gdm9pZCAwXG4gICAgPyB2b2lkIDBcbiAgICA6IGNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihwYXJhbWV0ZXIsIGNhbGwpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBkZWNsYXJhdGlvbiBjb250YWlucyBvbmx5IGEgY29udHJhY3QuXG4gKiBAcGFyYW0gZGVjbGFyYXRpb24gQ2FuZGlkYXRlIG1ldGhvZCBkZWNsYXJhdGlvbi5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIGltcGxlbWVudGF0aW9uIGJvZHkuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGVjbGFyYXRpb25Pbmx5ID0gaXNEZWNsYXJhdGlvbk9ubHlNZXRob2QoZGVjbGFyYXRpb24pO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzRGVjbGFyYXRpb25Pbmx5TWV0aG9kID0gKGRlY2xhcmF0aW9uOiB0cy5Ob2RlKTogYm9vbGVhbiA9PlxuICB0cy5pc0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikgfHxcbiAgdHMuaXNGdW5jdGlvblR5cGVOb2RlKGRlY2xhcmF0aW9uKSB8fFxuICB0cy5pc01ldGhvZFNpZ25hdHVyZShkZWNsYXJhdGlvbikgfHxcbiAgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pICYmIGRlY2xhcmF0aW9uLmJvZHkgPT09IHZvaWQgMCk7XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBuYW1lZCBwcm9wZXJ0eSBvciB0aGUgc3RyaW5nLWluZGV4IGNvbnRyYWN0IGFjY2VwdGluZyBpdC5cbiAqIEBwYXJhbSB0eXBlIE9iamVjdCB0eXBlIHdob3NlIG1lbWJlciBpcyBiZWluZyBmb3J3YXJkZWQuXG4gKiBAcGFyYW0gbWVtYmVyIE1lbWJlciBzdXBwbHlpbmcgdGhlIHByb3BlcnR5IG5hbWUgYW5kIHR5cGUgbG9jYXRpb24uXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEByZXR1cm5zIEV4cGxpY2l0IHByb3BlcnR5IHR5cGUgb3Igc3RyaW5nLWluZGV4IHZhbHVlIHR5cGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdmFsdWVUeXBlID0gZ2V0UHJvcGVydHlPckluZGV4VHlwZSh0eXBlLCBtZW1iZXIsIGNoZWNrZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldFByb3BlcnR5T3JJbmRleFR5cGUgPSAoXG4gIHR5cGU6IHRzLlR5cGUsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IHRzLlR5cGUgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBwcm9wZXJ0eSA9IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUodHlwZSwgbWVtYmVyLm1lbWJlck5hbWUpO1xuXG4gIHJldHVybiBwcm9wZXJ0eSA9PT0gdm9pZCAwXG4gICAgPyBjaGVja2VyLmdldEluZGV4VHlwZU9mVHlwZSh0eXBlLCB0cy5JbmRleEtpbmQuU3RyaW5nKVxuICAgIDogY2hlY2tlci5nZXRUeXBlT2ZTeW1ib2xBdExvY2F0aW9uKHByb3BlcnR5LCBtZW1iZXIuZGVjbGFyYXRpb24pO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHR5cGVkIGhhbmRvZmYgY2FycmllcyBhIG1lbWJlciBpbnRvIGEgY29tcGF0aWJsZSBjb250cmFjdC5cbiAqIEBwYXJhbSBzb3VyY2VFeHByZXNzaW9uIFZhbHVlIGJlaW5nIGZvcndhcmRlZC5cbiAqIEBwYXJhbSB0YXJnZXRUeXBlIFR5cGUgZXhwZWN0ZWQgYXQgdGhlIHJlY2VpdmluZyBib3VuZGFyeS5cbiAqIEBwYXJhbSBtZW1iZXIgTWVtYmVyIHdob3NlIHVzYWdlIGlzIGJlaW5nIGNoZWNrZWQuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbnRyYWN0IGFjY2VwdHMgdGhlIGNvcnJlc3BvbmRpbmcgbWVtYmVyLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVzZWQgPSBpc01lbWJlckhhbmRvZmYoZXhwcmVzc2lvbiwgdGFyZ2V0VHlwZSwgbWVtYmVyLCBjaGVja2VyKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc01lbWJlckhhbmRvZmYgPSAoXG4gIHNvdXJjZUV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sXG4gIHRhcmdldFR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAodGFyZ2V0VHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaG9zdFR5cGUgPSBjaGVja2VyLmdldE5vbk51bGxhYmxlVHlwZShcbiAgICBnZXRNZW1iZXJIb3N0VHlwZShtZW1iZXIsIGNoZWNrZXIpLFxuICApO1xuICBjb25zdCBmb3J3YXJkZWRUeXBlID0gY2hlY2tlci5nZXROb25OdWxsYWJsZVR5cGUoXG4gICAgY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihzb3VyY2VFeHByZXNzaW9uKSxcbiAgKTtcbiAgY29uc3QgcmVjZWl2aW5nVHlwZSA9IGNoZWNrZXIuZ2V0Tm9uTnVsbGFibGVUeXBlKHRhcmdldFR5cGUpO1xuXG4gIGlmIChyZWNlaXZpbmdUeXBlLmlzVW5pb24oKSkge1xuICAgIHJldHVybiByZWNlaXZpbmdUeXBlLnR5cGVzLnNvbWUoKHBhcnQpID0+XG4gICAgICBpc01lbWJlckhhbmRvZmYoc291cmNlRXhwcmVzc2lvbiwgcGFydCwgbWVtYmVyLCBjaGVja2VyKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUocmVjZWl2aW5nVHlwZSwgbWVtYmVyLm1lbWJlck5hbWUpID09PSB2b2lkIDAgJiZcbiAgICAhY2Fycmllc01lbWJlcihzb3VyY2VFeHByZXNzaW9uLCBjaGVja2VyLCBtZW1iZXIpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhvc3RQcm9wZXJ0eVR5cGUgPSBnZXRQcm9wZXJ0eU9ySW5kZXhUeXBlKGhvc3RUeXBlLCBtZW1iZXIsIGNoZWNrZXIpO1xuICBjb25zdCBmb3J3YXJkZWRQcm9wZXJ0eVR5cGUgPSBnZXRQcm9wZXJ0eU9ySW5kZXhUeXBlKFxuICAgIGZvcndhcmRlZFR5cGUsXG4gICAgbWVtYmVyLFxuICAgIGNoZWNrZXIsXG4gICk7XG4gIGNvbnN0IHJlY2VpdmluZ1Byb3BlcnR5VHlwZSA9IGdldFByb3BlcnR5T3JJbmRleFR5cGUoXG4gICAgcmVjZWl2aW5nVHlwZSxcbiAgICBtZW1iZXIsXG4gICAgY2hlY2tlcixcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIGhvc3RQcm9wZXJ0eVR5cGUgIT09IHZvaWQgMCAmJlxuICAgIGZvcndhcmRlZFByb3BlcnR5VHlwZSAhPT0gdm9pZCAwICYmXG4gICAgcmVjZWl2aW5nUHJvcGVydHlUeXBlICE9PSB2b2lkIDAgJiZcbiAgICAoY2hlY2tlci5pc1R5cGVBc3NpZ25hYmxlVG8oZm9yd2FyZGVkVHlwZSwgaG9zdFR5cGUpIHx8XG4gICAgICBjaGVja2VyLmlzVHlwZUFzc2lnbmFibGVUbyhob3N0VHlwZSwgZm9yd2FyZGVkVHlwZSkpICYmXG4gICAgY2hlY2tlci5pc1R5cGVBc3NpZ25hYmxlVG8oaG9zdFR5cGUsIHJlY2VpdmluZ1R5cGUpICYmXG4gICAgKGNoZWNrZXIuaXNUeXBlQXNzaWduYWJsZVRvKGhvc3RQcm9wZXJ0eVR5cGUsIHJlY2VpdmluZ1Byb3BlcnR5VHlwZSkgfHxcbiAgICAgIGNoZWNrZXIuaXNUeXBlQXNzaWduYWJsZVRvKHJlY2VpdmluZ1Byb3BlcnR5VHlwZSwgaG9zdFByb3BlcnR5VHlwZSkpXG4gICk7XG59O1xuXG5leHBvcnQge1xuICBnZXRDYWxsQXJndW1lbnRUeXBlLFxuICBnZXRDb250ZXh0dWFsUHJvcGVydHlUeXBlLFxuICBoYXNDb21wYXRpYmxlTWVtYmVyU2hhcGUsXG4gIGlzRGVjbGFyYXRpb25Pbmx5TWV0aG9kLFxuICBpc01lbWJlckhhbmRvZmYsXG59O1xuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { NoUnusedExportsState } from "../no-unused-exports/types.js";
|
|
3
|
+
import type { PublicMember } from "./member-declaration-utilities.js";
|
|
4
|
+
/** Framework-specific member usage detector supplied by an opt-in adapter. */
|
|
5
|
+
type MemberUsageAdapter = (sourceFile: ts.SourceFile, checker: ts.TypeChecker, member: PublicMember) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Checks whether a member has a concrete reference in production TypeScript.
|
|
8
|
+
* @param program TypeScript project program.
|
|
9
|
+
* @param state Normalized public API and test patterns.
|
|
10
|
+
* @param repoRoot Root directory used for glob matching.
|
|
11
|
+
* @param member Member whose production usage is being checked.
|
|
12
|
+
* @param usageAdapters Optional framework-specific usage detectors.
|
|
13
|
+
* @returns True when production code references the member.
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const used = hasProductionUsage(program, state, repoRoot, member);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare const hasProductionUsage: (program: ts.Program, state: NoUnusedExportsState, repoRoot: string, member: PublicMember, usageAdapters?: readonly MemberUsageAdapter[]) => boolean;
|
|
20
|
+
export { hasProductionUsage };
|
|
21
|
+
export type { MemberUsageAdapter };
|
|
22
|
+
//# sourceMappingURL=member-usage-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-usage-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-utilities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAsBnE,8EAA8E;AAC9E,KAAK,kBAAkB,GAAG,CACxB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,MAAM,EAAE,YAAY,KACjB,OAAO,CAAC;AA0Eb;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,kBAAkB,GACtB,SAAS,EAAE,CAAC,OAAO,EACnB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,QAAQ,YAAY,EACpB,gBAAe,SAAS,kBAAkB,EAAO,KAChD,OA8EF,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import { isTestFile } from "../no-unused-exports/no-unused-exports-options.js";
|
|
4
|
+
import { isSameSymbol, resolveCanonicalSymbol, } from "../no-unused-exports/no-unused-exports-symbol-utilities.js";
|
|
5
|
+
import { collectHeritageMemberSymbols } from "./member-contract-utilities.js";
|
|
6
|
+
import { isCallArgumentMember, isObjectContractHandoff, } from "./member-usage-handoff-utilities.js";
|
|
7
|
+
import { isLocalCallArgumentTransmitted } from "./member-usage-local-flow-utilities.js";
|
|
8
|
+
import { isComputedMemberRead, isStructuralPropertyRead, } from "./member-usage-reference-utilities.js";
|
|
9
|
+
import { isLocalCallArgumentSerialized, isWholeObjectRead, } from "./member-usage-serialization-utilities.js";
|
|
10
|
+
/**
|
|
11
|
+
* Resolves destructured member names or direct reference symbols.
|
|
12
|
+
* @param node Candidate reference node.
|
|
13
|
+
* @param checker TypeScript type checker.
|
|
14
|
+
* @returns Referenced member symbol when available.
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const symbol = getUsageSymbol(propertyIdentifier, checker);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
const getUsageSymbol = (node, checker) => {
|
|
21
|
+
const parent = node.parent;
|
|
22
|
+
if (ts.isIdentifier(node) &&
|
|
23
|
+
ts.isBindingElement(parent) &&
|
|
24
|
+
parent.name === node &&
|
|
25
|
+
parent.propertyName === void 0 &&
|
|
26
|
+
ts.isObjectBindingPattern(parent.parent)) {
|
|
27
|
+
const owner = parent.parent.parent;
|
|
28
|
+
const sourceType = ts.isVariableDeclaration(owner)
|
|
29
|
+
? owner.initializer === void 0
|
|
30
|
+
? void 0
|
|
31
|
+
: checker.getTypeAtLocation(owner.initializer)
|
|
32
|
+
: ts.isParameter(owner)
|
|
33
|
+
? checker.getTypeAtLocation(owner)
|
|
34
|
+
: void 0;
|
|
35
|
+
return sourceType === void 0
|
|
36
|
+
? checker.getSymbolAtLocation(node)
|
|
37
|
+
: checker.getPropertyOfType(sourceType, node.text);
|
|
38
|
+
}
|
|
39
|
+
return checker.getSymbolAtLocation(node);
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Identifies declaration names that are not member references.
|
|
43
|
+
* @param node Candidate reference node.
|
|
44
|
+
* @returns True when the node is only declaring a name.
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const declarationOnly = isDeclarationName(propertyName);
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
const isDeclarationName = (node) => {
|
|
51
|
+
const parent = node.parent;
|
|
52
|
+
return (((ts.isPropertyDeclaration(parent) ||
|
|
53
|
+
ts.isMethodDeclaration(parent) ||
|
|
54
|
+
ts.isGetAccessorDeclaration(parent) ||
|
|
55
|
+
ts.isSetAccessorDeclaration(parent) ||
|
|
56
|
+
ts.isPropertySignature(parent) ||
|
|
57
|
+
ts.isMethodSignature(parent) ||
|
|
58
|
+
ts.isPropertyAssignment(parent) ||
|
|
59
|
+
ts.isShorthandPropertyAssignment(parent)) &&
|
|
60
|
+
parent.name === node) ||
|
|
61
|
+
(ts.isVariableDeclaration(parent) && parent.name === node) ||
|
|
62
|
+
((ts.isClassDeclaration(parent) ||
|
|
63
|
+
ts.isInterfaceDeclaration(parent) ||
|
|
64
|
+
ts.isTypeAliasDeclaration(parent) ||
|
|
65
|
+
ts.isFunctionDeclaration(parent)) &&
|
|
66
|
+
parent.name === node) ||
|
|
67
|
+
(ts.isParameter(parent) && parent.name === node));
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Checks whether a member has a concrete reference in production TypeScript.
|
|
71
|
+
* @param program TypeScript project program.
|
|
72
|
+
* @param state Normalized public API and test patterns.
|
|
73
|
+
* @param repoRoot Root directory used for glob matching.
|
|
74
|
+
* @param member Member whose production usage is being checked.
|
|
75
|
+
* @param usageAdapters Optional framework-specific usage detectors.
|
|
76
|
+
* @returns True when production code references the member.
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const used = hasProductionUsage(program, state, repoRoot, member);
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
const hasProductionUsage = (program, state, repoRoot, member, usageAdapters = []) => {
|
|
83
|
+
const checker = program.getTypeChecker();
|
|
84
|
+
const relatedSymbols = [
|
|
85
|
+
resolveCanonicalSymbol(member.memberSymbol, checker),
|
|
86
|
+
...collectHeritageMemberSymbols(program, checker, member).map((symbol) => resolveCanonicalSymbol(symbol, checker)),
|
|
87
|
+
];
|
|
88
|
+
const variableDeclaration = ts.isVariableDeclaration(member.hostDeclaration)
|
|
89
|
+
? member.hostDeclaration
|
|
90
|
+
: void 0;
|
|
91
|
+
if (variableDeclaration !== void 0) {
|
|
92
|
+
const declaredType = checker.getTypeAtLocation(variableDeclaration.name);
|
|
93
|
+
const declaredMember = checker.getPropertyOfType(declaredType, member.memberName);
|
|
94
|
+
if (declaredMember !== void 0 &&
|
|
95
|
+
relatedSymbols.every((symbol) => !isSameSymbol(symbol, declaredMember))) {
|
|
96
|
+
relatedSymbols.push(resolveCanonicalSymbol(declaredMember, checker));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const normalizedRoot = path.resolve(repoRoot);
|
|
100
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
101
|
+
const filename = path.resolve(sourceFile.fileName);
|
|
102
|
+
if (sourceFile.isDeclarationFile ||
|
|
103
|
+
isTestFile(filename, state, normalizedRoot)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (usageAdapters.some((adapter) => adapter(sourceFile, checker, member))) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
const findUsageSymbol = (node) => {
|
|
110
|
+
if ((ts.isIdentifier(node) || ts.isStringLiteralLike(node)) &&
|
|
111
|
+
!isDeclarationName(node)) {
|
|
112
|
+
const candidate = getUsageSymbol(node, checker);
|
|
113
|
+
if (candidate !== void 0 &&
|
|
114
|
+
relatedSymbols.some((symbol) => isSameSymbol(symbol, candidate))) {
|
|
115
|
+
return candidate;
|
|
116
|
+
}
|
|
117
|
+
if (isStructuralPropertyRead(node, checker, member)) {
|
|
118
|
+
return member.memberSymbol;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return isComputedMemberRead(node, checker, member, relatedSymbols) ||
|
|
122
|
+
isWholeObjectRead(node, checker, member, program) ||
|
|
123
|
+
isLocalCallArgumentSerialized(node, checker, member, program) ||
|
|
124
|
+
isLocalCallArgumentTransmitted(node, checker, member) ||
|
|
125
|
+
isCallArgumentMember(node, checker, member) ||
|
|
126
|
+
isObjectContractHandoff(node, checker, member)
|
|
127
|
+
? member.memberSymbol
|
|
128
|
+
: ts.forEachChild(node, findUsageSymbol);
|
|
129
|
+
};
|
|
130
|
+
if (findUsageSymbol(sourceFile) !== void 0) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
};
|
|
136
|
+
export { hasProductionUsage };
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1wdWJsaWMtbWVtYmVycy9tZW1iZXItdXNhZ2UtdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUtqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDNUUsT0FBTyxFQUNMLFlBQVksRUFDWixzQkFBc0IsR0FDdkIsTUFBTSx5REFBeUQsQ0FBQztBQUNqRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHVCQUF1QixHQUN4QixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsd0JBQXdCLEdBQ3pCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUNMLDZCQUE2QixFQUM3QixpQkFBaUIsR0FDbEIsTUFBTSx3Q0FBd0MsQ0FBQztBQVNoRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUNyQixJQUFhLEVBQ2IsT0FBdUIsRUFDQSxFQUFFO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFFM0IsSUFDRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUNyQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSTtRQUNwQixNQUFNLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQztRQUM5QixFQUFFLENBQUMsc0JBQXNC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M0MsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWTtnQkFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUVGLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgdHlwZSB7IE5vVW51c2VkRXhwb3J0c1N0YXRlIH0gZnJvbSBcIi4uL25vLXVudXNlZC1leHBvcnRzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1YmxpY01lbWJlciB9IGZyb20gXCIuL21lbWJlci1kZWNsYXJhdGlvbi11dGlsaXRpZXNcIjtcblxuaW1wb3J0IHsgaXNUZXN0RmlsZSB9IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1vcHRpb25zXCI7XG5pbXBvcnQge1xuICBpc1NhbWVTeW1ib2wsXG4gIHJlc29sdmVDYW5vbmljYWxTeW1ib2wsXG59IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1zeW1ib2wtdXRpbGl0aWVzXCI7XG5pbXBvcnQgeyBjb2xsZWN0SGVyaXRhZ2VNZW1iZXJTeW1ib2xzIH0gZnJvbSBcIi4vbWVtYmVyLWNvbnRyYWN0LXV0aWxpdGllc1wiO1xuaW1wb3J0IHtcbiAgaXNDYWxsQXJndW1lbnRNZW1iZXIsXG4gIGlzT2JqZWN0Q29udHJhY3RIYW5kb2ZmLFxufSBmcm9tIFwiLi9tZW1iZXItdXNhZ2UtaGFuZG9mZi11dGlsaXRpZXNcIjtcbmltcG9ydCB7IGlzTG9jYWxDYWxsQXJndW1lbnRUcmFuc21pdHRlZCB9IGZyb20gXCIuL21lbWJlci11c2FnZS1sb2NhbC1mbG93LXV0aWxpdGllc1wiO1xuaW1wb3J0IHtcbiAgaXNDb21wdXRlZE1lbWJlclJlYWQsXG4gIGlzU3RydWN0dXJhbFByb3BlcnR5UmVhZCxcbn0gZnJvbSBcIi4vbWVtYmVyLXVzYWdlLXJlZmVyZW5jZS11dGlsaXRpZXNcIjtcbmltcG9ydCB7XG4gIGlzTG9jYWxDYWxsQXJndW1lbnRTZXJpYWxpemVkLFxuICBpc1dob2xlT2JqZWN0UmVhZCxcbn0gZnJvbSBcIi4vbWVtYmVyLXVzYWdlLXNlcmlhbGl6YXRpb24tdXRpbGl0aWVzXCI7XG5cbi8qKiBGcmFtZXdvcmstc3BlY2lmaWMgbWVtYmVyIHVzYWdlIGRldGVjdG9yIHN1cHBsaWVkIGJ5IGFuIG9wdC1pbiBhZGFwdGVyLiAqL1xudHlwZSBNZW1iZXJVc2FnZUFkYXB0ZXIgPSAoXG4gIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICBtZW1iZXI6IFB1YmxpY01lbWJlcixcbikgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBSZXNvbHZlcyBkZXN0cnVjdHVyZWQgbWVtYmVyIG5hbWVzIG9yIGRpcmVjdCByZWZlcmVuY2Ugc3ltYm9scy5cbiAqIEBwYXJhbSBub2RlIENhbmRpZGF0ZSByZWZlcmVuY2Ugbm9kZS5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHJldHVybnMgUmVmZXJlbmNlZCBtZW1iZXIgc3ltYm9sIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN5bWJvbCA9IGdldFVzYWdlU3ltYm9sKHByb3BlcnR5SWRlbnRpZmllciwgY2hlY2tlcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgZ2V0VXNhZ2VTeW1ib2wgPSAoXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuKTogdHMuU3ltYm9sIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKFxuICAgIHRzLmlzSWRlbnRpZmllcihub2RlKSAmJlxuICAgIHRzLmlzQmluZGluZ0VsZW1lbnQocGFyZW50KSAmJlxuICAgIHBhcmVudC5uYW1lID09PSBub2RlICYmXG4gICAgcGFyZW50LnByb3BlcnR5TmFtZSA9PT0gdm9pZCAwICYmXG4gICAgdHMuaXNPYmplY3RCaW5kaW5nUGF0dGVybihwYXJlbnQucGFyZW50KVxuICApIHtcbiAgICBjb25zdCBvd25lciA9IHBhcmVudC5wYXJlbnQucGFyZW50O1xuICAgIGNvbnN0IHNvdXJjZVR5cGUgPSB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24ob3duZXIpXG4gICAgICA/IG93bmVyLmluaXRpYWxpemVyID09PSB2b2lkIDBcbiAgICAgICAgPyB2b2lkIDBcbiAgICAgICAgOiBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKG93bmVyLmluaXRpYWxpemVyKVxuICAgICAgOiB0cy5pc1BhcmFtZXRlcihvd25lcilcbiAgICAgICAgPyBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKG93bmVyKVxuICAgICAgICA6IHZvaWQgMDtcblxuICAgIHJldHVybiBzb3VyY2VUeXBlID09PSB2b2lkIDBcbiAgICAgID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpXG4gICAgICA6IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUoc291cmNlVHlwZSwgbm9kZS50ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG59O1xuXG4vKipcbiAqIElkZW50aWZpZXMgZGVjbGFyYXRpb24gbmFtZXMgdGhhdCBhcmUgbm90IG1lbWJlciByZWZlcmVuY2VzLlxuICogQHBhcmFtIG5vZGUgQ2FuZGlkYXRlIHJlZmVyZW5jZSBub2RlLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBub2RlIGlzIG9ubHkgZGVjbGFyaW5nIGEgbmFtZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkZWNsYXJhdGlvbk9ubHkgPSBpc0RlY2xhcmF0aW9uTmFtZShwcm9wZXJ0eU5hbWUpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzRGVjbGFyYXRpb25OYW1lID0gKG5vZGU6IHRzLk5vZGUpOiBib29sZWFuID0+IHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgcmV0dXJuIChcbiAgICAoKHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihwYXJlbnQpIHx8XG4gICAgICB0cy5pc01ldGhvZERlY2xhcmF0aW9uKHBhcmVudCkgfHxcbiAgICAgIHRzLmlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihwYXJlbnQpIHx8XG4gICAgICB0cy5pc1NldEFjY2Vzc29yRGVjbGFyYXRpb24ocGFyZW50KSB8fFxuICAgICAgdHMuaXNQcm9wZXJ0eVNpZ25hdHVyZShwYXJlbnQpIHx8XG4gICAgICB0cy5pc01ldGhvZFNpZ25hdHVyZShwYXJlbnQpIHx8XG4gICAgICB0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwYXJlbnQpIHx8XG4gICAgICB0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwYXJlbnQpKSAmJlxuICAgICAgcGFyZW50Lm5hbWUgPT09IG5vZGUpIHx8XG4gICAgKHRzLmlzVmFyaWFibGVEZWNsYXJhdGlvbihwYXJlbnQpICYmIHBhcmVudC5uYW1lID09PSBub2RlKSB8fFxuICAgICgodHMuaXNDbGFzc0RlY2xhcmF0aW9uKHBhcmVudCkgfHxcbiAgICAgIHRzLmlzSW50ZXJmYWNlRGVjbGFyYXRpb24ocGFyZW50KSB8fFxuICAgICAgdHMuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihwYXJlbnQpIHx8XG4gICAgICB0cy5pc0Z1bmN0aW9uRGVjbGFyYXRpb24ocGFyZW50KSkgJiZcbiAgICAgIHBhcmVudC5uYW1lID09PSBub2RlKSB8fFxuICAgICh0cy5pc1BhcmFtZXRlcihwYXJlbnQpICYmIHBhcmVudC5uYW1lID09PSBub2RlKVxuICApO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG1lbWJlciBoYXMgYSBjb25jcmV0ZSByZWZlcmVuY2UgaW4gcHJvZHVjdGlvbiBUeXBlU2NyaXB0LlxuICogQHBhcmFtIHByb2dyYW0gVHlwZVNjcmlwdCBwcm9qZWN0IHByb2dyYW0uXG4gKiBAcGFyYW0gc3RhdGUgTm9ybWFsaXplZCBwdWJsaWMgQVBJIGFuZCB0ZXN0IHBhdHRlcm5zLlxuICogQHBhcmFtIHJlcG9Sb290IFJvb3QgZGlyZWN0b3J5IHVzZWQgZm9yIGdsb2IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0gbWVtYmVyIE1lbWJlciB3aG9zZSBwcm9kdWN0aW9uIHVzYWdlIGlzIGJlaW5nIGNoZWNrZWQuXG4gKiBAcGFyYW0gdXNhZ2VBZGFwdGVycyBPcHRpb25hbCBmcmFtZXdvcmstc3BlY2lmaWMgdXNhZ2UgZGV0ZWN0b3JzLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHByb2R1Y3Rpb24gY29kZSByZWZlcmVuY2VzIHRoZSBtZW1iZXIuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXNlZCA9IGhhc1Byb2R1Y3Rpb25Vc2FnZShwcm9ncmFtLCBzdGF0ZSwgcmVwb1Jvb3QsIG1lbWJlcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgaGFzUHJvZHVjdGlvblVzYWdlID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBzdGF0ZTogTm9VbnVzZWRFeHBvcnRzU3RhdGUsXG4gIHJlcG9Sb290OiBzdHJpbmcsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuICB1c2FnZUFkYXB0ZXJzOiByZWFkb25seSBNZW1iZXJVc2FnZUFkYXB0ZXJbXSA9IFtdLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IHJlbGF0ZWRTeW1ib2xzID0gW1xuICAgIHJlc29sdmVDYW5vbmljYWxTeW1ib2wobWVtYmVyLm1lbWJlclN5bWJvbCwgY2hlY2tlciksXG4gICAgLi4uY29sbGVjdEhlcml0YWdlTWVtYmVyU3ltYm9scyhwcm9ncmFtLCBjaGVja2VyLCBtZW1iZXIpLm1hcCgoc3ltYm9sKSA9PlxuICAgICAgcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbChzeW1ib2wsIGNoZWNrZXIpLFxuICAgICksXG4gIF07XG4gIGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb24gPSB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obWVtYmVyLmhvc3REZWNsYXJhdGlvbilcbiAgICA/IG1lbWJlci5ob3N0RGVjbGFyYXRpb25cbiAgICA6IHZvaWQgMDtcblxuICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbiAhPT0gdm9pZCAwKSB7XG4gICAgY29uc3QgZGVjbGFyZWRUeXBlID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbih2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpO1xuICAgIGNvbnN0IGRlY2xhcmVkTWVtYmVyID0gY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShcbiAgICAgIGRlY2xhcmVkVHlwZSxcbiAgICAgIG1lbWJlci5tZW1iZXJOYW1lLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBkZWNsYXJlZE1lbWJlciAhPT0gdm9pZCAwICYmXG4gICAgICByZWxhdGVkU3ltYm9scy5ldmVyeSgoc3ltYm9sKSA9PiAhaXNTYW1lU3ltYm9sKHN5bWJvbCwgZGVjbGFyZWRNZW1iZXIpKVxuICAgICkge1xuICAgICAgcmVsYXRlZFN5bWJvbHMucHVzaChyZXNvbHZlQ2Fub25pY2FsU3ltYm9sKGRlY2xhcmVkTWVtYmVyLCBjaGVja2VyKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3QpO1xuXG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGgucmVzb2x2ZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUgfHxcbiAgICAgIGlzVGVzdEZpbGUoZmlsZW5hbWUsIHN0YXRlLCBub3JtYWxpemVkUm9vdClcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh1c2FnZUFkYXB0ZXJzLnNvbWUoKGFkYXB0ZXIpID0+IGFkYXB0ZXIoc291cmNlRmlsZSwgY2hlY2tlciwgbWVtYmVyKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmRVc2FnZVN5bWJvbCA9IChub2RlOiB0cy5Ob2RlKTogdHMuU3ltYm9sIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgKHRzLmlzSWRlbnRpZmllcihub2RlKSB8fCB0cy5pc1N0cmluZ0xpdGVyYWxMaWtlKG5vZGUpKSAmJlxuICAgICAgICAhaXNEZWNsYXJhdGlvbk5hbWUobm9kZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBnZXRVc2FnZVN5bWJvbChub2RlLCBjaGVja2VyKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2FuZGlkYXRlICE9PSB2b2lkIDAgJiZcbiAgICAgICAgICByZWxhdGVkU3ltYm9scy5zb21lKChzeW1ib2wpID0+IGlzU2FtZVN5bWJvbChzeW1ib2wsIGNhbmRpZGF0ZSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTdHJ1Y3R1cmFsUHJvcGVydHlSZWFkKG5vZGUsIGNoZWNrZXIsIG1lbWJlcikpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVyLm1lbWJlclN5bWJvbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNDb21wdXRlZE1lbWJlclJlYWQobm9kZSwgY2hlY2tlciwgbWVtYmVyLCByZWxhdGVkU3ltYm9scykgfHxcbiAgICAgICAgaXNXaG9sZU9iamVjdFJlYWQobm9kZSwgY2hlY2tlciwgbWVtYmVyLCBwcm9ncmFtKSB8fFxuICAgICAgICBpc0xvY2FsQ2FsbEFyZ3VtZW50U2VyaWFsaXplZChub2RlLCBjaGVja2VyLCBtZW1iZXIsIHByb2dyYW0pIHx8XG4gICAgICAgIGlzTG9jYWxDYWxsQXJndW1lbnRUcmFuc21pdHRlZChub2RlLCBjaGVja2VyLCBtZW1iZXIpIHx8XG4gICAgICAgIGlzQ2FsbEFyZ3VtZW50TWVtYmVyKG5vZGUsIGNoZWNrZXIsIG1lbWJlcikgfHxcbiAgICAgICAgaXNPYmplY3RDb250cmFjdEhhbmRvZmYobm9kZSwgY2hlY2tlciwgbWVtYmVyKVxuICAgICAgICA/IG1lbWJlci5tZW1iZXJTeW1ib2xcbiAgICAgICAgOiB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgZmluZFVzYWdlU3ltYm9sKTtcbiAgICB9O1xuXG4gICAgaWYgKGZpbmRVc2FnZVN5bWJvbChzb3VyY2VGaWxlKSAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgeyBoYXNQcm9kdWN0aW9uVXNhZ2UgfTtcbmV4cG9ydCB0eXBlIHsgTWVtYmVyVXNhZ2VBZGFwdGVyIH07XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { PublicMember } from "./member-declaration-utilities.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether an expression carries the member's declaration.
|
|
5
|
+
* @param expression Value being copied or serialized.
|
|
6
|
+
* @param checker TypeScript type checker.
|
|
7
|
+
* @param member Member whose declaration must be present.
|
|
8
|
+
* @param visitedExpressions Expressions already inspected across local return paths.
|
|
9
|
+
* @returns True when the expression carries this member rather than an unrelated matching shape.
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const matches = carriesMember(expression, checker, member);
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
declare const carriesMember: (expression: ts.Expression, checker: ts.TypeChecker, member: PublicMember, visitedExpressions?: Set<ts.Expression>) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Checks serialized property types without following method signatures.
|
|
18
|
+
* @param type Type whose enumerable data may be serialized.
|
|
19
|
+
* @param checker TypeScript type checker.
|
|
20
|
+
* @param member Member whose declaration must be reachable.
|
|
21
|
+
* @param visitedTypes Types already searched.
|
|
22
|
+
* @param depth Remaining nested data depth.
|
|
23
|
+
* @returns Whether the serialized data contains the member declaration.
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const used = containsSerializedMember(type, checker, member, new Set(), 5);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare const containsSerializedMember: (type: ts.Type, checker: ts.TypeChecker, member: PublicMember, visitedTypes: Set<ts.Type>, depth: number) => boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Checks whether an expression contains a value carrying the member.
|
|
32
|
+
* @param expression Value expression to inspect.
|
|
33
|
+
* @param checker TypeScript type checker.
|
|
34
|
+
* @param member Member whose value is being searched for.
|
|
35
|
+
* @returns True when the expression contains the member or its host value.
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const carries = expressionCarriesMemberValue(value, checker, member);
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
declare const expressionCarriesMemberValue: (expression: ts.Expression, checker: ts.TypeChecker, member: PublicMember) => boolean;
|
|
42
|
+
export { carriesMember, containsSerializedMember, expressionCarriesMemberValue, };
|
|
43
|
+
//# sourceMappingURL=member-usage-value-utilities.d.ts.map
|
package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-usage-value-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-value-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAOnE;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,aAAa,GACjB,YAAY,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,EACpB,qBAAoB,GAAG,CAAC,EAAE,CAAC,UAAU,CAAa,KACjD,OAiEF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,wBAAwB,GAC5B,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,EACpB,cAAc,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAC1B,OAAO,MAAM,KACZ,OA8CF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,4BAA4B,GAChC,YAAY,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,KACnB,OAmCF,CAAC;AAEF,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,4BAA4B,GAC7B,CAAC"}
|