@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
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
/**
|
|
3
|
+
* Gets a static member name, excluding dynamic and private keys.
|
|
4
|
+
* @param name Candidate declaration name.
|
|
5
|
+
* @returns Static name or undefined when the key is dynamic or private.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const name = getStaticMemberName(ts.factory.createIdentifier("run"));
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
const getStaticMemberName = (name) => {
|
|
12
|
+
if (name === void 0 ||
|
|
13
|
+
ts.isPrivateIdentifier(name) ||
|
|
14
|
+
ts.isComputedPropertyName(name)) {
|
|
15
|
+
return void 0;
|
|
16
|
+
}
|
|
17
|
+
return ts.isIdentifier(name) ||
|
|
18
|
+
ts.isStringLiteralLike(name) ||
|
|
19
|
+
ts.isNumericLiteral(name)
|
|
20
|
+
? name.text
|
|
21
|
+
: void 0;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Gets the local name used to identify a supported host.
|
|
25
|
+
* @param node Host declaration.
|
|
26
|
+
* @returns Host name or an anonymous marker.
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const name = getHostName(classDeclaration);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
const getHostName = (node) => {
|
|
33
|
+
if ((ts.isClassDeclaration(node) ||
|
|
34
|
+
ts.isInterfaceDeclaration(node) ||
|
|
35
|
+
ts.isTypeAliasDeclaration(node)) &&
|
|
36
|
+
node.name !== void 0) {
|
|
37
|
+
return node.name.text;
|
|
38
|
+
}
|
|
39
|
+
return ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)
|
|
40
|
+
? node.name.text
|
|
41
|
+
: "<anonymous>";
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Resolves a direct object-literal property symbol before its contextual type.
|
|
45
|
+
* @param checker TypeScript type checker.
|
|
46
|
+
* @param member Member declaration.
|
|
47
|
+
* @param memberName Static member name.
|
|
48
|
+
* @param hostType Type of the containing host.
|
|
49
|
+
* @returns Member symbol when TypeScript can resolve it.
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const symbol = getMemberSymbol(checker, property, "value", hostType);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
const getMemberSymbol = (checker, member, memberName, hostType) => {
|
|
56
|
+
const nameNode = member.name;
|
|
57
|
+
const isObjectMember = ts.isPropertyAssignment(member) ||
|
|
58
|
+
ts.isShorthandPropertyAssignment(member) ||
|
|
59
|
+
ts.isMethodDeclaration(member) ||
|
|
60
|
+
ts.isGetAccessorDeclaration(member) ||
|
|
61
|
+
ts.isSetAccessorDeclaration(member);
|
|
62
|
+
if (isObjectMember && ts.isObjectLiteralExpression(member.parent)) {
|
|
63
|
+
const objectMember = checker.getPropertyOfType(checker.getTypeAtLocation(member.parent), memberName);
|
|
64
|
+
if (objectMember !== void 0) {
|
|
65
|
+
return objectMember;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const directSymbol = nameNode === void 0 ? void 0 : checker.getSymbolAtLocation(nameNode);
|
|
69
|
+
return directSymbol ?? checker.getPropertyOfType(hostType, memberName);
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Unwraps supported expressions to find a direct object-literal initializer.
|
|
73
|
+
* @param expression Variable initializer.
|
|
74
|
+
* @returns Direct object literal or undefined.
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const object = getObjectLiteral(variable.initializer);
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
const getObjectLiteral = (expression) => {
|
|
81
|
+
if (expression === void 0) {
|
|
82
|
+
return void 0;
|
|
83
|
+
}
|
|
84
|
+
if (ts.isObjectLiteralExpression(expression)) {
|
|
85
|
+
return expression;
|
|
86
|
+
}
|
|
87
|
+
return ts.isAsExpression(expression) ||
|
|
88
|
+
ts.isSatisfiesExpression(expression) ||
|
|
89
|
+
ts.isTypeAssertionExpression(expression) ||
|
|
90
|
+
ts.isParenthesizedExpression(expression) ||
|
|
91
|
+
ts.isNonNullExpression(expression)
|
|
92
|
+
? getObjectLiteral(expression.expression)
|
|
93
|
+
: void 0;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Checks whether a class member is public or has implicit public visibility.
|
|
97
|
+
* @param member Class member declaration.
|
|
98
|
+
* @returns True when the member is not private or protected.
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const visible = isPublicClassMember(classMethod);
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
const isPublicClassMember = (member) => {
|
|
105
|
+
const supportsVisibility = ts.isPropertyDeclaration(member) ||
|
|
106
|
+
ts.isMethodDeclaration(member) ||
|
|
107
|
+
ts.isGetAccessorDeclaration(member) ||
|
|
108
|
+
ts.isSetAccessorDeclaration(member);
|
|
109
|
+
if (!supportsVisibility) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const modifiers = ts.canHaveModifiers(member)
|
|
113
|
+
? (ts.getModifiers(member) ?? [])
|
|
114
|
+
: [];
|
|
115
|
+
return modifiers.every((modifier) => modifier.kind !== ts.SyntaxKind.PrivateKeyword &&
|
|
116
|
+
modifier.kind !== ts.SyntaxKind.ProtectedKeyword);
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Checks whether a node is a supported direct property or method.
|
|
120
|
+
* @param member Candidate TypeScript member.
|
|
121
|
+
* @returns True when this rule analyzes the member kind.
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const supported = isSupportedMember(typeMember);
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
const isSupportedMember = (member) => ts.isPropertyDeclaration(member) ||
|
|
128
|
+
ts.isMethodDeclaration(member) ||
|
|
129
|
+
ts.isGetAccessorDeclaration(member) ||
|
|
130
|
+
ts.isSetAccessorDeclaration(member) ||
|
|
131
|
+
ts.isPropertySignature(member) ||
|
|
132
|
+
ts.isMethodSignature(member) ||
|
|
133
|
+
ts.isPropertyAssignment(member) ||
|
|
134
|
+
ts.isShorthandPropertyAssignment(member);
|
|
135
|
+
/**
|
|
136
|
+
* Collects direct class, interface, type-alias, and const-object hosts.
|
|
137
|
+
* @param sourceFile Source file to inspect.
|
|
138
|
+
* @param checker TypeScript type checker.
|
|
139
|
+
* @returns Supported hosts declared by the source file.
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* const hosts = collectMemberHosts(sourceFile, checker);
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
const collectMemberHosts = (sourceFile, checker) => {
|
|
146
|
+
const hosts = [];
|
|
147
|
+
const visit = (node) => {
|
|
148
|
+
if (ts.isClassDeclaration(node)) {
|
|
149
|
+
hosts.push({
|
|
150
|
+
members: node.members,
|
|
151
|
+
name: getHostName(node),
|
|
152
|
+
node,
|
|
153
|
+
symbol: node.name === void 0
|
|
154
|
+
? void 0
|
|
155
|
+
: checker.getSymbolAtLocation(node.name),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else if (ts.isInterfaceDeclaration(node)) {
|
|
159
|
+
hosts.push({
|
|
160
|
+
members: node.members,
|
|
161
|
+
name: getHostName(node),
|
|
162
|
+
node,
|
|
163
|
+
symbol: checker.getSymbolAtLocation(node.name),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
else if (ts.isTypeAliasDeclaration(node) &&
|
|
167
|
+
ts.isTypeLiteralNode(node.type)) {
|
|
168
|
+
hosts.push({
|
|
169
|
+
members: node.type.members,
|
|
170
|
+
name: getHostName(node),
|
|
171
|
+
node,
|
|
172
|
+
symbol: checker.getSymbolAtLocation(node.name),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else if (ts.isVariableDeclaration(node) &&
|
|
176
|
+
ts.isIdentifier(node.name) &&
|
|
177
|
+
ts.isVariableDeclarationList(node.parent) &&
|
|
178
|
+
(node.parent.flags & ts.NodeFlags.Const) !== 0) {
|
|
179
|
+
const objectLiteral = getObjectLiteral(node.initializer);
|
|
180
|
+
if (objectLiteral !== void 0) {
|
|
181
|
+
hosts.push({
|
|
182
|
+
members: objectLiteral.properties,
|
|
183
|
+
name: getHostName(node),
|
|
184
|
+
node,
|
|
185
|
+
symbol: checker.getSymbolAtLocation(node.name),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
ts.forEachChild(node, visit);
|
|
190
|
+
};
|
|
191
|
+
visit(sourceFile);
|
|
192
|
+
return hosts;
|
|
193
|
+
};
|
|
194
|
+
export { collectMemberHosts, getMemberSymbol, getStaticMemberName, isPublicClassMember, isSupportedMember, };
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWhvc3QtdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci1ob3N0LXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQWlCakM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsSUFBeUIsRUFBc0IsRUFBRTtJQUM1RSxJQUNFLElBQUksS0FBSyxLQUFLLENBQUM7UUFDZixFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFDL0IsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDMUIsRUFBRSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztRQUM1QixFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTtRQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFhLEVBQVUsRUFBRTtJQUM1QyxJQUNFLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUMxQixFQUFFLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUNwQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FB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Q0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3pDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQzlDLENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFekQsSUFBSSxhQUFhLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQztvQkFDVCxPQUFPLEVBQUUsYUFBYSxDQUFDLFVBQVU7b0JBQ2pDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUN2QixJQUFJO29CQUNKLE1BQU0sRUFBRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDL0MsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUM7SUFFRixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFbEIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixHQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuLyoqIE9uZSBzdXBwb3J0ZWQgaG9zdCBhbmQgaXRzIGRpcmVjdCBtZW1iZXIgZGVjbGFyYXRpb25zLiAqL1xuaW50ZXJmYWNlIE1lbWJlckhvc3Qge1xuICAvKiogTWVtYmVycyBkZWNsYXJlZCBkaXJlY3RseSBieSB0aGlzIGhvc3QuICovXG4gIG1lbWJlcnM6IHJlYWRvbmx5IHRzLk5vZGVbXTtcblxuICAvKiogRGlzcGxheSBuYW1lIG9mIHRoZSBob3N0LiAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIEhvc3QgZGVjbGFyYXRpb24gbm9kZS4gKi9cbiAgbm9kZTogdHMuTm9kZTtcblxuICAvKiogSG9zdCBzeW1ib2wsIHdoZW4gYXZhaWxhYmxlLiAqL1xuICBzeW1ib2w6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc3RhdGljIG1lbWJlciBuYW1lLCBleGNsdWRpbmcgZHluYW1pYyBhbmQgcHJpdmF0ZSBrZXlzLlxuICogQHBhcmFtIG5hbWUgQ2FuZGlkYXRlIGRlY2xhcmF0aW9uIG5hbWUuXG4gKiBAcmV0dXJucyBTdGF0aWMgbmFtZSBvciB1bmRlZmluZWQgd2hlbiB0aGUga2V5IGlzIGR5bmFtaWMgb3IgcHJpdmF0ZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuYW1lID0gZ2V0U3RhdGljTWVtYmVyTmFtZSh0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoXCJydW5cIikpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldFN0YXRpY01lbWJlck5hbWUgPSAobmFtZTogdHMuTm9kZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChcbiAgICBuYW1lID09PSB2b2lkIDAgfHxcbiAgICB0cy5pc1ByaXZhdGVJZGVudGlmaWVyKG5hbWUpIHx8XG4gICAgdHMuaXNDb21wdXRlZFByb3BlcnR5TmFtZShuYW1lKVxuICApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIHRzLmlzSWRlbnRpZmllcihuYW1lKSB8fFxuICAgIHRzLmlzU3RyaW5nTGl0ZXJhbExpa2UobmFtZSkgfHxcbiAgICB0cy5pc051bWVyaWNMaXRlcmFsKG5hbWUpXG4gICAgPyBuYW1lLnRleHRcbiAgICA6IHZvaWQgMDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbG9jYWwgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IGEgc3VwcG9ydGVkIGhvc3QuXG4gKiBAcGFyYW0gbm9kZSBIb3N0IGRlY2xhcmF0aW9uLlxuICogQHJldHVybnMgSG9zdCBuYW1lIG9yIGFuIGFub255bW91cyBtYXJrZXIuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmFtZSA9IGdldEhvc3ROYW1lKGNsYXNzRGVjbGFyYXRpb24pO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldEhvc3ROYW1lID0gKG5vZGU6IHRzLk5vZGUpOiBzdHJpbmcgPT4ge1xuICBpZiAoXG4gICAgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSB8fFxuICAgICAgdHMuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlKSB8fFxuICAgICAgdHMuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKSkgJiZcbiAgICBub2RlLm5hbWUgIT09IHZvaWQgMFxuICApIHtcbiAgICByZXR1cm4gbm9kZS5uYW1lLnRleHQ7XG4gIH1cblxuICByZXR1cm4gdHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpXG4gICAgPyBub2RlLm5hbWUudGV4dFxuICAgIDogXCI8YW5vbnltb3VzPlwiO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIGRpcmVjdCBvYmplY3QtbGl0ZXJhbCBwcm9wZXJ0eSBzeW1ib2wgYmVmb3JlIGl0cyBjb250ZXh0dWFsIHR5cGUuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSBtZW1iZXIgTWVtYmVyIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIG1lbWJlck5hbWUgU3RhdGljIG1lbWJlciBuYW1lLlxuICogQHBhcmFtIGhvc3RUeXBlIFR5cGUgb2YgdGhlIGNvbnRhaW5pbmcgaG9zdC5cbiAqIEByZXR1cm5zIE1lbWJlciBzeW1ib2wgd2hlbiBUeXBlU2NyaXB0IGNhbiByZXNvbHZlIGl0LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN5bWJvbCA9IGdldE1lbWJlclN5bWJvbChjaGVja2VyLCBwcm9wZXJ0eSwgXCJ2YWx1ZVwiLCBob3N0VHlwZSk7XG4gKiBgYGBcbiAqL1xuY29uc3QgZ2V0TWVtYmVyU3ltYm9sID0gKFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbWVtYmVyOiB0cy5Ob2RlLFxuICBtZW1iZXJOYW1lOiBzdHJpbmcsXG4gIGhvc3RUeXBlOiB0cy5UeXBlLFxuKTogdHMuU3ltYm9sIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgbmFtZU5vZGUgPSAobWVtYmVyIGFzIHRzLk5hbWVkRGVjbGFyYXRpb24pLm5hbWU7XG4gIGNvbnN0IGlzT2JqZWN0TWVtYmVyID1cbiAgICB0cy5pc1Byb3BlcnR5QXNzaWdubWVudChtZW1iZXIpIHx8XG4gICAgdHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQobWVtYmVyKSB8fFxuICAgIHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obWVtYmVyKSB8fFxuICAgIHRzLmlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gICAgdHMuaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG1lbWJlcik7XG5cbiAgaWYgKGlzT2JqZWN0TWVtYmVyICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obWVtYmVyLnBhcmVudCkpIHtcbiAgICBjb25zdCBvYmplY3RNZW1iZXIgPSBjaGVja2VyLmdldFByb3BlcnR5T2ZUeXBlKFxuICAgICAgY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihtZW1iZXIucGFyZW50KSxcbiAgICAgIG1lbWJlck5hbWUsXG4gICAgKTtcblxuICAgIGlmIChvYmplY3RNZW1iZXIgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIG9iamVjdE1lbWJlcjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXJlY3RTeW1ib2wgPVxuICAgIG5hbWVOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obmFtZU5vZGUpO1xuXG4gIHJldHVybiBkaXJlY3RTeW1ib2wgPz8gY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShob3N0VHlwZSwgbWVtYmVyTmFtZSk7XG59O1xuXG4vKipcbiAqIFVud3JhcHMgc3VwcG9ydGVkIGV4cHJlc3Npb25zIHRvIGZpbmQgYSBkaXJlY3Qgb2JqZWN0LWxpdGVyYWwgaW5pdGlhbGl6ZXIuXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBWYXJpYWJsZSBpbml0aWFsaXplci5cbiAqIEByZXR1cm5zIERpcmVjdCBvYmplY3QgbGl0ZXJhbCBvciB1bmRlZmluZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgb2JqZWN0ID0gZ2V0T2JqZWN0TGl0ZXJhbCh2YXJpYWJsZS5pbml0aWFsaXplcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgZ2V0T2JqZWN0TGl0ZXJhbCA9IChcbiAgZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCxcbik6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGV4cHJlc3Npb24gPT09IHZvaWQgMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgcmV0dXJuIHRzLmlzQXNFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNTYXRpc2ZpZXNFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNUeXBlQXNzZXJ0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc05vbk51bGxFeHByZXNzaW9uKGV4cHJlc3Npb24pXG4gICAgPyBnZXRPYmplY3RMaXRlcmFsKGV4cHJlc3Npb24uZXhwcmVzc2lvbilcbiAgICA6IHZvaWQgMDtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjbGFzcyBtZW1iZXIgaXMgcHVibGljIG9yIGhhcyBpbXBsaWNpdCBwdWJsaWMgdmlzaWJpbGl0eS5cbiAqIEBwYXJhbSBtZW1iZXIgQ2xhc3MgbWVtYmVyIGRlY2xhcmF0aW9uLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBtZW1iZXIgaXMgbm90IHByaXZhdGUgb3IgcHJvdGVjdGVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHZpc2libGUgPSBpc1B1YmxpY0NsYXNzTWVtYmVyKGNsYXNzTWV0aG9kKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc1B1YmxpY0NsYXNzTWVtYmVyID0gKG1lbWJlcjogdHMuTm9kZSk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBzdXBwb3J0c1Zpc2liaWxpdHkgPVxuICAgIHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gICAgdHMuaXNNZXRob2REZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gICAgdHMuaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG1lbWJlcikgfHxcbiAgICB0cy5pc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obWVtYmVyKTtcblxuICBpZiAoIXN1cHBvcnRzVmlzaWJpbGl0eSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVycyA9IHRzLmNhbkhhdmVNb2RpZmllcnMobWVtYmVyKVxuICAgID8gKHRzLmdldE1vZGlmaWVycyhtZW1iZXIpID8/IFtdKVxuICAgIDogW107XG5cbiAgcmV0dXJuIG1vZGlmaWVycy5ldmVyeShcbiAgICAobW9kaWZpZXIpID0+XG4gICAgICBtb2RpZmllci5raW5kICE9PSB0cy5TeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkICYmXG4gICAgICBtb2RpZmllci5raW5kICE9PSB0cy5TeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQsXG4gICk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIHN1cHBvcnRlZCBkaXJlY3QgcHJvcGVydHkgb3IgbWV0aG9kLlxuICogQHBhcmFtIG1lbWJlciBDYW5kaWRhdGUgVHlwZVNjcmlwdCBtZW1iZXIuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhpcyBydWxlIGFuYWx5emVzIHRoZSBtZW1iZXIga2luZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdXBwb3J0ZWQgPSBpc1N1cHBvcnRlZE1lbWJlcih0eXBlTWVtYmVyKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc1N1cHBvcnRlZE1lbWJlciA9IChtZW1iZXI6IHRzLk5vZGUpOiBib29sZWFuID0+XG4gIHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gIHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obWVtYmVyKSB8fFxuICB0cy5pc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obWVtYmVyKSB8fFxuICB0cy5pc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obWVtYmVyKSB8fFxuICB0cy5pc1Byb3BlcnR5U2lnbmF0dXJlKG1lbWJlcikgfHxcbiAgdHMuaXNNZXRob2RTaWduYXR1cmUobWVtYmVyKSB8fFxuICB0cy5pc1Byb3BlcnR5QXNzaWdubWVudChtZW1iZXIpIHx8XG4gIHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KG1lbWJlcik7XG5cbi8qKlxuICogQ29sbGVjdHMgZGlyZWN0IGNsYXNzLCBpbnRlcmZhY2UsIHR5cGUtYWxpYXMsIGFuZCBjb25zdC1vYmplY3QgaG9zdHMuXG4gKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJucyBTdXBwb3J0ZWQgaG9zdHMgZGVjbGFyZWQgYnkgdGhlIHNvdXJjZSBmaWxlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGhvc3RzID0gY29sbGVjdE1lbWJlckhvc3RzKHNvdXJjZUZpbGUsIGNoZWNrZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGNvbGxlY3RNZW1iZXJIb3N0cyA9IChcbiAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4pOiBNZW1iZXJIb3N0W10gPT4ge1xuICBjb25zdCBob3N0czogTWVtYmVySG9zdFtdID0gW107XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBob3N0cy5wdXNoKHtcbiAgICAgICAgbWVtYmVyczogbm9kZS5tZW1iZXJzLFxuICAgICAgICBuYW1lOiBnZXRIb3N0TmFtZShub2RlKSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3ltYm9sOlxuICAgICAgICAgIG5vZGUubmFtZSA9PT0gdm9pZCAwXG4gICAgICAgICAgICA/IHZvaWQgMFxuICAgICAgICAgICAgOiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZS5uYW1lKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHMuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaG9zdHMucHVzaCh7XG4gICAgICAgIG1lbWJlcnM6IG5vZGUubWVtYmVycyxcbiAgICAgICAgbmFtZTogZ2V0SG9zdE5hbWUobm9kZSksXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN5bWJvbDogY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUubmFtZSksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHMuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKSAmJlxuICAgICAgdHMuaXNUeXBlTGl0ZXJhbE5vZGUobm9kZS50eXBlKVxuICAgICkge1xuICAgICAgaG9zdHMucHVzaCh7XG4gICAgICAgIG1lbWJlcnM6IG5vZGUudHlwZS5tZW1iZXJzLFxuICAgICAgICBuYW1lOiBnZXRIb3N0TmFtZShub2RlKSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3ltYm9sOiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZS5uYW1lKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiZcbiAgICAgIHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpICYmXG4gICAgICB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUucGFyZW50KSAmJlxuICAgICAgKG5vZGUucGFyZW50LmZsYWdzICYgdHMuTm9kZUZsYWdzLkNvbnN0KSAhPT0gMFxuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IGdldE9iamVjdExpdGVyYWwobm9kZS5pbml0aWFsaXplcik7XG5cbiAgICAgIGlmIChvYmplY3RMaXRlcmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgaG9zdHMucHVzaCh7XG4gICAgICAgICAgbWVtYmVyczogb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLFxuICAgICAgICAgIG5hbWU6IGdldEhvc3ROYW1lKG5vZGUpLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgc3ltYm9sOiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZS5uYW1lKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcblxuICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICByZXR1cm4gaG9zdHM7XG59O1xuXG5leHBvcnQge1xuICBjb2xsZWN0TWVtYmVySG9zdHMsXG4gIGdldE1lbWJlclN5bWJvbCxcbiAgZ2V0U3RhdGljTWVtYmVyTmFtZSxcbiAgaXNQdWJsaWNDbGFzc01lbWJlcixcbiAgaXNTdXBwb3J0ZWRNZW1iZXIsXG59O1xuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { NoUnusedExportsState } from "../no-unused-exports/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether a member is reachable from a configured public API export.
|
|
5
|
+
* @param program TypeScript project program.
|
|
6
|
+
* @param state Normalized public API and test patterns.
|
|
7
|
+
* @param repoRoot Root directory used for glob matching.
|
|
8
|
+
* @param memberSymbol Member symbol being checked.
|
|
9
|
+
* @returns True when an API export exposes the member.
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const exposed = isPublicApiMember(program, state, repoRoot, memberSymbol);
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
declare const isPublicApiMember: (program: ts.Program, state: NoUnusedExportsState, repoRoot: string, memberSymbol: ts.Symbol) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Checks whether a host is exported from a configured public API file.
|
|
18
|
+
* @param program TypeScript project program.
|
|
19
|
+
* @param state Normalized public API and test patterns.
|
|
20
|
+
* @param repoRoot Root directory used for glob matching.
|
|
21
|
+
* @param hostSymbol Host declaration symbol.
|
|
22
|
+
* @returns True when the host is exposed by a non-test API file.
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const isPublic = isPublicApiHost(program, state, repoRoot, hostSymbol);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
declare const isPublicApiHost: (program: ts.Program, state: NoUnusedExportsState, repoRoot: string, hostSymbol: ts.Symbol | undefined) => boolean;
|
|
29
|
+
export { isPublicApiHost, isPublicApiMember };
|
|
30
|
+
//# sourceMappingURL=member-public-api-utilities.d.ts.map
|
package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-public-api-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-public-api-utilities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAwEvE;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,iBAAiB,GACrB,SAAS,EAAE,CAAC,OAAO,EACnB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,cAAc,EAAE,CAAC,MAAM,KACtB,OAsDF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,eAAe,GACnB,SAAS,EAAE,CAAC,OAAO,EACnB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,YAAY,EAAE,CAAC,MAAM,GAAG,SAAS,KAChC,OAsBF,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import { isPublicApiFile, isTestFile, } from "../no-unused-exports/no-unused-exports-options.js";
|
|
4
|
+
import { isSameSymbol, resolveCanonicalSymbol, sourceFileExportsSymbol, } from "../no-unused-exports/no-unused-exports-symbol-utilities.js";
|
|
5
|
+
/**
|
|
6
|
+
* Checks whether a symbol is nested within an exported API type.
|
|
7
|
+
* @param type Type shape of an exported value or type.
|
|
8
|
+
* @param targetSymbol Symbol being searched for.
|
|
9
|
+
* @param checker TypeScript type checker.
|
|
10
|
+
* @param location Node used to resolve property types.
|
|
11
|
+
* @param visitedTypes Types already checked on this search path.
|
|
12
|
+
* @param depth Remaining nested property depth.
|
|
13
|
+
* @returns True when the target occurs in the exported type shape.
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const exposed = typeContainsSymbol(type, member, checker, sourceFile, new Set(), 2);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
const typeContainsSymbol = (type, targetSymbol, checker, location, visitedTypes, depth) => {
|
|
20
|
+
if (depth < 0 || visitedTypes.has(type)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
visitedTypes.add(type);
|
|
24
|
+
if (type.isUnionOrIntersection()) {
|
|
25
|
+
return type.types.some((constituent) => typeContainsSymbol(constituent, targetSymbol, checker, location, visitedTypes, depth));
|
|
26
|
+
}
|
|
27
|
+
for (const property of checker.getPropertiesOfType(type)) {
|
|
28
|
+
if (isSameSymbol(resolveCanonicalSymbol(property, checker), targetSymbol) ||
|
|
29
|
+
typeContainsSymbol(checker.getTypeOfSymbolAtLocation(property, location), targetSymbol, checker, location, visitedTypes, depth - 1)) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Checks whether a member is reachable from a configured public API export.
|
|
37
|
+
* @param program TypeScript project program.
|
|
38
|
+
* @param state Normalized public API and test patterns.
|
|
39
|
+
* @param repoRoot Root directory used for glob matching.
|
|
40
|
+
* @param memberSymbol Member symbol being checked.
|
|
41
|
+
* @returns True when an API export exposes the member.
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const exposed = isPublicApiMember(program, state, repoRoot, memberSymbol);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
const isPublicApiMember = (program, state, repoRoot, memberSymbol) => {
|
|
48
|
+
const checker = program.getTypeChecker();
|
|
49
|
+
const targetSymbol = resolveCanonicalSymbol(memberSymbol, checker);
|
|
50
|
+
const normalizedRoot = path.resolve(repoRoot);
|
|
51
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
52
|
+
if (sourceFile.isDeclarationFile) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const filename = path.resolve(sourceFile.fileName);
|
|
56
|
+
if (!isPublicApiFile(filename, state, normalizedRoot) ||
|
|
57
|
+
isTestFile(filename, state, normalizedRoot)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
|
|
61
|
+
if (moduleSymbol === void 0) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
for (const exportedSymbol of checker.getExportsOfModule(moduleSymbol)) {
|
|
65
|
+
const canonicalExport = resolveCanonicalSymbol(exportedSymbol, checker);
|
|
66
|
+
if (isSameSymbol(canonicalExport, targetSymbol) ||
|
|
67
|
+
typeContainsSymbol(checker.getTypeOfSymbolAtLocation(canonicalExport, sourceFile), targetSymbol, checker, sourceFile, new Set(), 3) ||
|
|
68
|
+
((canonicalExport.flags & ts.SymbolFlags.Type) !== 0 &&
|
|
69
|
+
typeContainsSymbol(checker.getDeclaredTypeOfSymbol(canonicalExport), targetSymbol, checker, sourceFile, new Set(), 3))) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Checks whether a host is exported from a configured public API file.
|
|
78
|
+
* @param program TypeScript project program.
|
|
79
|
+
* @param state Normalized public API and test patterns.
|
|
80
|
+
* @param repoRoot Root directory used for glob matching.
|
|
81
|
+
* @param hostSymbol Host declaration symbol.
|
|
82
|
+
* @returns True when the host is exposed by a non-test API file.
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const isPublic = isPublicApiHost(program, state, repoRoot, hostSymbol);
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
const isPublicApiHost = (program, state, repoRoot, hostSymbol) => {
|
|
89
|
+
if (hostSymbol === void 0) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
const checker = program.getTypeChecker();
|
|
93
|
+
const normalizedRoot = path.resolve(repoRoot);
|
|
94
|
+
const canonicalHost = resolveCanonicalSymbol(hostSymbol, checker);
|
|
95
|
+
return program.getSourceFiles().some((sourceFile) => {
|
|
96
|
+
if (sourceFile.isDeclarationFile) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
const filename = path.resolve(sourceFile.fileName);
|
|
100
|
+
return (isPublicApiFile(filename, state, normalizedRoot) &&
|
|
101
|
+
!isTestFile(filename, state, normalizedRoot) &&
|
|
102
|
+
sourceFileExportsSymbol(sourceFile, checker, canonicalHost));
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
export { isPublicApiHost, isPublicApiMember };
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXB1YmxpYy1hcGktdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci1wdWJsaWMtYXBpLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJakMsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEdBQ1gsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLHNCQUFzQixFQUN0Qix1QkFBdUIsR0FDeEIsTUFBTSx5REFBeUQsQ0FBQztBQUVqRTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixJQUFhLEVBQ2IsWUFBdUIsRUFDdkIsT0FBdUIsRUFDdkIsUUFBaUIsRUFDakIsWUFBMEIsRUFDMUIsS0FBYSxFQUNKLEVBQUU7SUFDWCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdkIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUNyQyxrQkFBa0IsQ0FDaEIsV0FBVyxFQUNYLFlBQVksRUFDWixPQUFPLEVBQ1AsUUFBUSxFQUNSLFlBQVksRUFDWixLQUFLLENBQ04sQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekQsSUFDRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQztZQUNyRSxrQkFBa0IsQ0FDaEIsT0FBTyxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFDckQsWUFBWSxFQUNaLE9BQU8sRUFDUCxRQUFRLEVBQ1IsWUFBWSxFQUNaLEtBQUssR0FBRyxDQUFDLENBQ1YsRUFDRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLE9BQW1CLEVBQ25CLEtBQTJCLEVBQzNCLFFBQWdCLEVBQ2hCLFlBQXVCLEVBQ2QsRUFBRTtJQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxNQUFNLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU5QyxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1FBQ2xELElBQUksVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakMsU0FBUztRQUNYLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRCxJQUNFLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDO1lBQ2pELFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUMzQyxDQUFDO1lBQ0QsU0FBUztRQUNYLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0QsSUFBSSxZQUFZLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixTQUFTO1FBQ1gsQ0FBQztRQUVELEtBQUssTUFBTSxjQUFjLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXhFLElBQ0UsWUFBWSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUM7Z0JBQzNDLGtCQUFrQixDQUNoQixPQUFPLENBQUMseUJBQXlCLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxFQUM5RCxZQUFZLEVBQ1osT0FBTyxFQUNQLFVBQVUsRUFDVixJQUFJLEdBQUcsRUFBRSxFQUNULENBQUMsQ0FDRjtnQkFDRCxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ2xELGtCQUFrQixDQUNoQixPQUFPLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLEVBQ2hELFlBQVksRUFDWixPQUFPLEVBQ1AsVUFBVSxFQUNWLElBQUksR0FBRyxFQUFFLEVBQ1QsQ0FBQyxDQUNGLENBQUMsRUFDSixDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQ3RCLE9BQW1CLEVBQ25CLEtBQTJCLEVBQzNCLFFBQWdCLEVBQ2hCLFVBQWlDLEVBQ3hCLEVBQUU7SUFDWCxJQUFJLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVsRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUNsRCxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sQ0FDTCxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUM7WUFDaEQsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUM7WUFDNUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FDNUQsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHR5cGUgeyBOb1VudXNlZEV4cG9ydHNTdGF0ZSB9IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy90eXBlc1wiO1xuXG5pbXBvcnQge1xuICBpc1B1YmxpY0FwaUZpbGUsXG4gIGlzVGVzdEZpbGUsXG59IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1vcHRpb25zXCI7XG5pbXBvcnQge1xuICBpc1NhbWVTeW1ib2wsXG4gIHJlc29sdmVDYW5vbmljYWxTeW1ib2wsXG4gIHNvdXJjZUZpbGVFeHBvcnRzU3ltYm9sLFxufSBmcm9tIFwiLi4vbm8tdW51c2VkLWV4cG9ydHMvbm8tdW51c2VkLWV4cG9ydHMtc3ltYm9sLXV0aWxpdGllc1wiO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgc3ltYm9sIGlzIG5lc3RlZCB3aXRoaW4gYW4gZXhwb3J0ZWQgQVBJIHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBUeXBlIHNoYXBlIG9mIGFuIGV4cG9ydGVkIHZhbHVlIG9yIHR5cGUuXG4gKiBAcGFyYW0gdGFyZ2V0U3ltYm9sIFN5bWJvbCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSBsb2NhdGlvbiBOb2RlIHVzZWQgdG8gcmVzb2x2ZSBwcm9wZXJ0eSB0eXBlcy5cbiAqIEBwYXJhbSB2aXNpdGVkVHlwZXMgVHlwZXMgYWxyZWFkeSBjaGVja2VkIG9uIHRoaXMgc2VhcmNoIHBhdGguXG4gKiBAcGFyYW0gZGVwdGggUmVtYWluaW5nIG5lc3RlZCBwcm9wZXJ0eSBkZXB0aC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdGFyZ2V0IG9jY3VycyBpbiB0aGUgZXhwb3J0ZWQgdHlwZSBzaGFwZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleHBvc2VkID0gdHlwZUNvbnRhaW5zU3ltYm9sKHR5cGUsIG1lbWJlciwgY2hlY2tlciwgc291cmNlRmlsZSwgbmV3IFNldCgpLCAyKTtcbiAqIGBgYFxuICovXG5jb25zdCB0eXBlQ29udGFpbnNTeW1ib2wgPSAoXG4gIHR5cGU6IHRzLlR5cGUsXG4gIHRhcmdldFN5bWJvbDogdHMuU3ltYm9sLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbG9jYXRpb246IHRzLk5vZGUsXG4gIHZpc2l0ZWRUeXBlczogU2V0PHRzLlR5cGU+LFxuICBkZXB0aDogbnVtYmVyLFxuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChkZXB0aCA8IDAgfHwgdmlzaXRlZFR5cGVzLmhhcyh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZpc2l0ZWRUeXBlcy5hZGQodHlwZSk7XG5cbiAgaWYgKHR5cGUuaXNVbmlvbk9ySW50ZXJzZWN0aW9uKCkpIHtcbiAgICByZXR1cm4gdHlwZS50eXBlcy5zb21lKChjb25zdGl0dWVudCkgPT5cbiAgICAgIHR5cGVDb250YWluc1N5bWJvbChcbiAgICAgICAgY29uc3RpdHVlbnQsXG4gICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgY2hlY2tlcixcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHZpc2l0ZWRUeXBlcyxcbiAgICAgICAgZGVwdGgsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGNoZWNrZXIuZ2V0UHJvcGVydGllc09mVHlwZSh0eXBlKSkge1xuICAgIGlmIChcbiAgICAgIGlzU2FtZVN5bWJvbChyZXNvbHZlQ2Fub25pY2FsU3ltYm9sKHByb3BlcnR5LCBjaGVja2VyKSwgdGFyZ2V0U3ltYm9sKSB8fFxuICAgICAgdHlwZUNvbnRhaW5zU3ltYm9sKFxuICAgICAgICBjaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24ocHJvcGVydHksIGxvY2F0aW9uKSxcbiAgICAgICAgdGFyZ2V0U3ltYm9sLFxuICAgICAgICBjaGVja2VyLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgdmlzaXRlZFR5cGVzLFxuICAgICAgICBkZXB0aCAtIDEsXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbWVtYmVyIGlzIHJlYWNoYWJsZSBmcm9tIGEgY29uZmlndXJlZCBwdWJsaWMgQVBJIGV4cG9ydC5cbiAqIEBwYXJhbSBwcm9ncmFtIFR5cGVTY3JpcHQgcHJvamVjdCBwcm9ncmFtLlxuICogQHBhcmFtIHN0YXRlIE5vcm1hbGl6ZWQgcHVibGljIEFQSSBhbmQgdGVzdCBwYXR0ZXJucy5cbiAqIEBwYXJhbSByZXBvUm9vdCBSb290IGRpcmVjdG9yeSB1c2VkIGZvciBnbG9iIG1hdGNoaW5nLlxuICogQHBhcmFtIG1lbWJlclN5bWJvbCBNZW1iZXIgc3ltYm9sIGJlaW5nIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gYW4gQVBJIGV4cG9ydCBleHBvc2VzIHRoZSBtZW1iZXIuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZXhwb3NlZCA9IGlzUHVibGljQXBpTWVtYmVyKHByb2dyYW0sIHN0YXRlLCByZXBvUm9vdCwgbWVtYmVyU3ltYm9sKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc1B1YmxpY0FwaU1lbWJlciA9IChcbiAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbiAgc3RhdGU6IE5vVW51c2VkRXhwb3J0c1N0YXRlLFxuICByZXBvUm9vdDogc3RyaW5nLFxuICBtZW1iZXJTeW1ib2w6IHRzLlN5bWJvbCxcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBjaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCB0YXJnZXRTeW1ib2wgPSByZXNvbHZlQ2Fub25pY2FsU3ltYm9sKG1lbWJlclN5bWJvbCwgY2hlY2tlcik7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290KTtcblxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgaWYgKHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5yZXNvbHZlKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuXG4gICAgaWYgKFxuICAgICAgIWlzUHVibGljQXBpRmlsZShmaWxlbmFtZSwgc3RhdGUsIG5vcm1hbGl6ZWRSb290KSB8fFxuICAgICAgaXNUZXN0RmlsZShmaWxlbmFtZSwgc3RhdGUsIG5vcm1hbGl6ZWRSb290KVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kdWxlU3ltYm9sID0gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKHNvdXJjZUZpbGUpO1xuXG4gICAgaWYgKG1vZHVsZVN5bWJvbCA9PT0gdm9pZCAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV4cG9ydGVkU3ltYm9sIG9mIGNoZWNrZXIuZ2V0RXhwb3J0c09mTW9kdWxlKG1vZHVsZVN5bWJvbCkpIHtcbiAgICAgIGNvbnN0IGNhbm9uaWNhbEV4cG9ydCA9IHJlc29sdmVDYW5vbmljYWxTeW1ib2woZXhwb3J0ZWRTeW1ib2wsIGNoZWNrZXIpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGlzU2FtZVN5bWJvbChjYW5vbmljYWxFeHBvcnQsIHRhcmdldFN5bWJvbCkgfHxcbiAgICAgICAgdHlwZUNvbnRhaW5zU3ltYm9sKFxuICAgICAgICAgIGNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihjYW5vbmljYWxFeHBvcnQsIHNvdXJjZUZpbGUpLFxuICAgICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgICBjaGVja2VyLFxuICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgbmV3IFNldCgpLFxuICAgICAgICAgIDMsXG4gICAgICAgICkgfHxcbiAgICAgICAgKChjYW5vbmljYWxFeHBvcnQuZmxhZ3MgJiB0cy5TeW1ib2xGbGFncy5UeXBlKSAhPT0gMCAmJlxuICAgICAgICAgIHR5cGVDb250YWluc1N5bWJvbChcbiAgICAgICAgICAgIGNoZWNrZXIuZ2V0RGVjbGFyZWRUeXBlT2ZTeW1ib2woY2Fub25pY2FsRXhwb3J0KSxcbiAgICAgICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgICAgIGNoZWNrZXIsXG4gICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgbmV3IFNldCgpLFxuICAgICAgICAgICAgMyxcbiAgICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBob3N0IGlzIGV4cG9ydGVkIGZyb20gYSBjb25maWd1cmVkIHB1YmxpYyBBUEkgZmlsZS5cbiAqIEBwYXJhbSBwcm9ncmFtIFR5cGVTY3JpcHQgcHJvamVjdCBwcm9ncmFtLlxuICogQHBhcmFtIHN0YXRlIE5vcm1hbGl6ZWQgcHVibGljIEFQSSBhbmQgdGVzdCBwYXR0ZXJucy5cbiAqIEBwYXJhbSByZXBvUm9vdCBSb290IGRpcmVjdG9yeSB1c2VkIGZvciBnbG9iIG1hdGNoaW5nLlxuICogQHBhcmFtIGhvc3RTeW1ib2wgSG9zdCBkZWNsYXJhdGlvbiBzeW1ib2wuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGhvc3QgaXMgZXhwb3NlZCBieSBhIG5vbi10ZXN0IEFQSSBmaWxlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGlzUHVibGljID0gaXNQdWJsaWNBcGlIb3N0KHByb2dyYW0sIHN0YXRlLCByZXBvUm9vdCwgaG9zdFN5bWJvbCk7XG4gKiBgYGBcbiAqL1xuY29uc3QgaXNQdWJsaWNBcGlIb3N0ID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBzdGF0ZTogTm9VbnVzZWRFeHBvcnRzU3RhdGUsXG4gIHJlcG9Sb290OiBzdHJpbmcsXG4gIGhvc3RTeW1ib2w6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoaG9zdFN5bWJvbCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3QpO1xuICBjb25zdCBjYW5vbmljYWxIb3N0ID0gcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbChob3N0U3ltYm9sLCBjaGVja2VyKTtcblxuICByZXR1cm4gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpLnNvbWUoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5yZXNvbHZlKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGlzUHVibGljQXBpRmlsZShmaWxlbmFtZSwgc3RhdGUsIG5vcm1hbGl6ZWRSb290KSAmJlxuICAgICAgIWlzVGVzdEZpbGUoZmlsZW5hbWUsIHN0YXRlLCBub3JtYWxpemVkUm9vdCkgJiZcbiAgICAgIHNvdXJjZUZpbGVFeHBvcnRzU3ltYm9sKHNvdXJjZUZpbGUsIGNoZWNrZXIsIGNhbm9uaWNhbEhvc3QpXG4gICAgKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgeyBpc1B1YmxpY0FwaUhvc3QsIGlzUHVibGljQXBpTWVtYmVyIH07XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
/**
|
|
3
|
+
* Checks whether an expression can be traced back to a symbol.
|
|
4
|
+
* @param expression Expression to inspect.
|
|
5
|
+
* @param targetSymbol Symbol whose value flow is followed.
|
|
6
|
+
* @param checker TypeScript type checker.
|
|
7
|
+
* @param visitedExpressions Expressions already inspected.
|
|
8
|
+
* @returns True when the expression derives from the target symbol.
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const forwarded = expressionReferencesSymbol(value, symbol, checker);
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare const expressionReferencesSymbol: (expression: ts.Expression, targetSymbol: ts.Symbol, checker: ts.TypeChecker, visitedExpressions?: Set<ts.Node>) => boolean;
|
|
15
|
+
export { expressionReferencesSymbol };
|
|
16
|
+
//# sourceMappingURL=member-usage-expression-reference-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-usage-expression-reference-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAOjC;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,0BAA0B,GAC9B,YAAY,EAAE,CAAC,UAAU,EACzB,cAAc,EAAE,CAAC,MAAM,EACvB,SAAS,EAAE,CAAC,WAAW,EACvB,qBAAoB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAa,KAC3C,OAyJF,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { isSameSymbol, resolveCanonicalSymbol, } from "../no-unused-exports/no-unused-exports-symbol-utilities.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether an expression can be traced back to a symbol.
|
|
5
|
+
* @param expression Expression to inspect.
|
|
6
|
+
* @param targetSymbol Symbol whose value flow is followed.
|
|
7
|
+
* @param checker TypeScript type checker.
|
|
8
|
+
* @param visitedExpressions Expressions already inspected.
|
|
9
|
+
* @returns True when the expression derives from the target symbol.
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const forwarded = expressionReferencesSymbol(value, symbol, checker);
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
const expressionReferencesSymbol = (expression, targetSymbol, checker, visitedExpressions = new Set()) => {
|
|
16
|
+
if (visitedExpressions.has(expression)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
visitedExpressions.add(expression);
|
|
20
|
+
if (ts.isIdentifier(expression)) {
|
|
21
|
+
const symbol = ts.isShorthandPropertyAssignment(expression.parent)
|
|
22
|
+
? checker.getShorthandAssignmentValueSymbol(expression.parent)
|
|
23
|
+
: checker.getSymbolAtLocation(expression);
|
|
24
|
+
if (symbol !== void 0 &&
|
|
25
|
+
isSameSymbol(resolveCanonicalSymbol(symbol, checker), resolveCanonicalSymbol(targetSymbol, checker))) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const declaration = symbol?.valueDeclaration;
|
|
29
|
+
if (declaration !== void 0 && ts.isVariableDeclaration(declaration)) {
|
|
30
|
+
return (declaration.initializer !== void 0 &&
|
|
31
|
+
expressionReferencesSymbol(declaration.initializer, targetSymbol, checker, visitedExpressions));
|
|
32
|
+
}
|
|
33
|
+
if (declaration !== void 0 &&
|
|
34
|
+
ts.isBindingElement(declaration) &&
|
|
35
|
+
ts.isObjectBindingPattern(declaration.parent)) {
|
|
36
|
+
const owner = declaration.parent.parent;
|
|
37
|
+
return (ts.isVariableDeclaration(owner) &&
|
|
38
|
+
owner.initializer !== void 0 &&
|
|
39
|
+
expressionReferencesSymbol(owner.initializer, targetSymbol, checker, visitedExpressions));
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (ts.isAsExpression(expression) ||
|
|
44
|
+
ts.isNonNullExpression(expression) ||
|
|
45
|
+
ts.isParenthesizedExpression(expression) ||
|
|
46
|
+
ts.isSatisfiesExpression(expression) ||
|
|
47
|
+
ts.isTypeAssertionExpression(expression)) {
|
|
48
|
+
return expressionReferencesSymbol(expression.expression, targetSymbol, checker, visitedExpressions);
|
|
49
|
+
}
|
|
50
|
+
if (ts.isPropertyAccessExpression(expression)) {
|
|
51
|
+
return expressionReferencesSymbol(expression.expression, targetSymbol, checker, visitedExpressions);
|
|
52
|
+
}
|
|
53
|
+
if (ts.isElementAccessExpression(expression)) {
|
|
54
|
+
return expressionReferencesSymbol(expression.expression, targetSymbol, checker, visitedExpressions);
|
|
55
|
+
}
|
|
56
|
+
if (ts.isCallExpression(expression)) {
|
|
57
|
+
return expression.arguments.some((argument) => expressionReferencesSymbol(argument, targetSymbol, checker, visitedExpressions));
|
|
58
|
+
}
|
|
59
|
+
if (ts.isConditionalExpression(expression)) {
|
|
60
|
+
return (expressionReferencesSymbol(expression.whenTrue, targetSymbol, checker, visitedExpressions) ||
|
|
61
|
+
expressionReferencesSymbol(expression.whenFalse, targetSymbol, checker, visitedExpressions));
|
|
62
|
+
}
|
|
63
|
+
if (ts.isObjectLiteralExpression(expression)) {
|
|
64
|
+
return expression.properties.some((property) => {
|
|
65
|
+
return ts.isSpreadAssignment(property)
|
|
66
|
+
? expressionReferencesSymbol(property.expression, targetSymbol, checker, visitedExpressions)
|
|
67
|
+
: (ts.isPropertyAssignment(property) &&
|
|
68
|
+
expressionReferencesSymbol(property.initializer, targetSymbol, checker, visitedExpressions)) ||
|
|
69
|
+
(ts.isShorthandPropertyAssignment(property) &&
|
|
70
|
+
expressionReferencesSymbol(property.name, targetSymbol, checker, visitedExpressions));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return (ts.isArrayLiteralExpression(expression) &&
|
|
74
|
+
expression.elements.some((element) => expressionReferencesSymbol(element, targetSymbol, checker, visitedExpressions)));
|
|
75
|
+
};
|
|
76
|
+
export { expressionReferencesSymbol };
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLWV4cHJlc3Npb24tcmVmZXJlbmNlLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1wdWJsaWMtbWVtYmVycy9tZW1iZXItdXNhZ2UtZXhwcmVzc2lvbi1yZWZlcmVuY2UtdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDLE9BQU8sRUFDTCxZQUFZLEVBQ1osc0JBQXNCLEdBQ3ZCLE1BQU0seURBQXlELENBQUM7QUFFakU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLDBCQUEwQixHQUFHLENBQ2pDLFVBQXlCLEVBQ3pCLFlBQXVCLEVBQ3ZCLE9BQXVCLEVBQ3ZCLHFCQUFtQyxJQUFJLEdBQUcsRUFBRSxFQUNuQyxFQUFFO0lBQ1gsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN2QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFbkMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDaEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQzlELENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUMsSUFDRSxNQUFNLEtBQUssS0FBSyxDQUFDO1lBQ2pCLFlBQVksQ0FDVixzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQ3ZDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxPQUFP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QUMsUUFBUSxFQUFFLEVBQUU7WUFDN0MsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO2dCQUNwQyxDQUFDLENBQUMsMEJBQTBCLENBQ3hCLFFBQVEsQ0FBQyxVQUFVLEVBQ25CLFlBQVksRUFDWixPQUFPLEVBQ1Asa0JBQWtCLENBQ25CO2dCQUNILENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7b0JBQ2hDLDBCQUEwQixDQUN4QixRQUFRLENBQUMsV0FBVyxFQUNwQixZQUFZLEVBQ1osT0FBTyxFQUNQLGtCQUFrQixDQUNuQixDQUFDO29CQUNGLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQzt3QkFDekMsMEJBQTBCLENBQ3hCLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsWUFBWSxFQUNaLE9BQU8sRUFDUCxrQkFBa0IsQ0FDbkIsQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUNMLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUM7UUFDdkMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNuQywwQkFBMEIsQ0FDeEIsT0FBTyxFQUNQLFlBQVksRUFDWixPQUFPLEVBQ1Asa0JBQWtCLENBQ25CLENBQ0YsQ0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQge1xuICBpc1NhbWVTeW1ib2wsXG4gIHJlc29sdmVDYW5vbmljYWxTeW1ib2wsXG59IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1zeW1ib2wtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gZXhwcmVzc2lvbiBjYW4gYmUgdHJhY2VkIGJhY2sgdG8gYSBzeW1ib2wuXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBFeHByZXNzaW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gdGFyZ2V0U3ltYm9sIFN5bWJvbCB3aG9zZSB2YWx1ZSBmbG93IGlzIGZvbGxvd2VkLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gdmlzaXRlZEV4cHJlc3Npb25zIEV4cHJlc3Npb25zIGFscmVhZHkgaW5zcGVjdGVkLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBleHByZXNzaW9uIGRlcml2ZXMgZnJvbSB0aGUgdGFyZ2V0IHN5bWJvbC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmb3J3YXJkZWQgPSBleHByZXNzaW9uUmVmZXJlbmNlc1N5bWJvbCh2YWx1ZSwgc3ltYm9sLCBjaGVja2VyKTtcbiAqIGBgYFxuICovXG5jb25zdCBleHByZXNzaW9uUmVmZXJlbmNlc1N5bWJvbCA9IChcbiAgZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbixcbiAgdGFyZ2V0U3ltYm9sOiB0cy5TeW1ib2wsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICB2aXNpdGVkRXhwcmVzc2lvbnM6IFNldDx0cy5Ob2RlPiA9IG5ldyBTZXQoKSxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAodmlzaXRlZEV4cHJlc3Npb25zLmhhcyhleHByZXNzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2aXNpdGVkRXhwcmVzc2lvbnMuYWRkKGV4cHJlc3Npb24pO1xuXG4gIGlmICh0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBzeW1ib2wgPSB0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChleHByZXNzaW9uLnBhcmVudClcbiAgICAgID8gY2hlY2tlci5nZXRTaG9ydGhhbmRBc3NpZ25tZW50VmFsdWVTeW1ib2woZXhwcmVzc2lvbi5wYXJlbnQpXG4gICAgICA6IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihleHByZXNzaW9uKTtcblxuICAgIGlmIChcbiAgICAgIHN5bWJvbCAhPT0gdm9pZCAwICYmXG4gICAgICBpc1NhbWVTeW1ib2woXG4gICAgICAgIHJlc29sdmVDYW5vbmljYWxTeW1ib2woc3ltYm9sLCBjaGVja2VyKSxcbiAgICAgICAgcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbCh0YXJnZXRTeW1ib2wsIGNoZWNrZXIpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBzeW1ib2w/LnZhbHVlRGVjbGFyYXRpb247XG4gICAgaWYgKGRlY2xhcmF0aW9uICE9PSB2b2lkIDAgJiYgdHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCAmJlxuICAgICAgICBleHByZXNzaW9uUmVmZXJlbmNlc1N5bWJvbChcbiAgICAgICAgICBkZWNsYXJhdGlvbi5pbml0aWFsaXplcixcbiAgICAgICAgICB0YXJnZXRTeW1ib2wsXG4gICAgICAgICAgY2hlY2tlcixcbiAgICAgICAgICB2aXNpdGVkRXhwcmVzc2lvbnMsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlY2xhcmF0aW9uICE9PSB2b2lkIDAgJiZcbiAgICAgIHRzLmlzQmluZGluZ0VsZW1lbnQoZGVjbGFyYXRpb24pICYmXG4gICAgICB0cy5pc09iamVjdEJpbmRpbmdQYXR0ZXJuKGRlY2xhcmF0aW9uLnBhcmVudClcbiAgICApIHtcbiAgICAgIGNvbnN0IG93bmVyID0gZGVjbGFyYXRpb24ucGFyZW50LnBhcmVudDtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG93bmVyKSAmJlxuICAgICAgICBvd25lci5pbml0aWFsaXplciAhPT0gdm9pZCAwICYmXG4gICAgICAgIGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sKFxuICAgICAgICAgIG93bmVyLmluaXRpYWxpemVyLFxuICAgICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgICBjaGVja2VyLFxuICAgICAgICAgIHZpc2l0ZWRFeHByZXNzaW9ucyxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgdHMuaXNBc0V4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc05vbk51bGxFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzU2F0aXNmaWVzRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzVHlwZUFzc2VydGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sKFxuICAgICAgZXhwcmVzc2lvbi5leHByZXNzaW9uLFxuICAgICAgdGFyZ2V0U3ltYm9sLFxuICAgICAgY2hlY2tlcixcbiAgICAgIHZpc2l0ZWRFeHByZXNzaW9ucyxcbiAgICApO1xuICB9XG5cbiAgaWYgKHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sKFxuICAgICAgZXhwcmVzc2lvbi5leHByZXNzaW9uLFxuICAgICAgdGFyZ2V0U3ltYm9sLFxuICAgICAgY2hlY2tlcixcbiAgICAgIHZpc2l0ZWRFeHByZXNzaW9ucyxcbiAgICApO1xuICB9XG5cbiAgaWYgKHRzLmlzRWxlbWVudEFjY2Vzc0V4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvblJlZmVyZW5jZXNTeW1ib2woXG4gICAgICBleHByZXNzaW9uLmV4cHJlc3Npb24sXG4gICAgICB0YXJnZXRTeW1ib2wsXG4gICAgICBjaGVja2VyLFxuICAgICAgdmlzaXRlZEV4cHJlc3Npb25zLFxuICAgICk7XG4gIH1cblxuICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIHJldHVybiBleHByZXNzaW9uLmFyZ3VtZW50cy5zb21lKChhcmd1bWVudCkgPT5cbiAgICAgIGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sKFxuICAgICAgICBhcmd1bWVudCxcbiAgICAgICAgdGFyZ2V0U3ltYm9sLFxuICAgICAgICBjaGVja2VyLFxuICAgICAgICB2aXNpdGVkRXhwcmVzc2lvbnMsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBpZiAodHMuaXNDb25kaXRpb25hbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXhwcmVzc2lvblJlZmVyZW5jZXNTeW1ib2woXG4gICAgICAgIGV4cHJlc3Npb24ud2hlblRydWUsXG4gICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgY2hlY2tlcixcbiAgICAgICAgdmlzaXRlZEV4cHJlc3Npb25zLFxuICAgICAgKSB8fFxuICAgICAgZXhwcmVzc2lvblJlZmVyZW5jZXNTeW1ib2woXG4gICAgICAgIGV4cHJlc3Npb24ud2hlbkZhbHNlLFxuICAgICAgICB0YXJnZXRTeW1ib2wsXG4gICAgICAgIGNoZWNrZXIsXG4gICAgICAgIHZpc2l0ZWRFeHByZXNzaW9ucyxcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbi5wcm9wZXJ0aWVzLnNvbWUoKHByb3BlcnR5KSA9PiB7XG4gICAgICByZXR1cm4gdHMuaXNTcHJlYWRBc3NpZ25tZW50KHByb3BlcnR5KVxuICAgICAgICA/IGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sKFxuICAgICAgICAgICAgcHJvcGVydHkuZXhwcmVzc2lvbixcbiAgICAgICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgICAgIGNoZWNrZXIsXG4gICAgICAgICAgICB2aXNpdGVkRXhwcmVzc2lvbnMsXG4gICAgICAgICAgKVxuICAgICAgICA6ICh0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiZcbiAgICAgICAgICAgIGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sKFxuICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplcixcbiAgICAgICAgICAgICAgdGFyZ2V0U3ltYm9sLFxuICAgICAgICAgICAgICBjaGVja2VyLFxuICAgICAgICAgICAgICB2aXNpdGVkRXhwcmVzc2lvbnMsXG4gICAgICAgICAgICApKSB8fFxuICAgICAgICAgICAgKHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJlxuICAgICAgICAgICAgICBleHByZXNzaW9uUmVmZXJlbmNlc1N5bWJvbChcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgICAgICAgICBjaGVja2VyLFxuICAgICAgICAgICAgICAgIHZpc2l0ZWRFeHByZXNzaW9ucyxcbiAgICAgICAgICAgICAgKSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSAmJlxuICAgIGV4cHJlc3Npb24uZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT5cbiAgICAgIGV4cHJlc3Npb25SZWZlcmVuY2VzU3ltYm9sKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB0YXJnZXRTeW1ib2wsXG4gICAgICAgIGNoZWNrZXIsXG4gICAgICAgIHZpc2l0ZWRFeHByZXNzaW9ucyxcbiAgICAgICksXG4gICAgKVxuICApO1xufTtcblxuZXhwb3J0IHsgZXhwcmVzc2lvblJlZmVyZW5jZXNTeW1ib2wgfTtcbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { PublicMember } from "./member-declaration-utilities.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether a value is supplied to a typed external call boundary.
|
|
5
|
+
* @param node Candidate call expression.
|
|
6
|
+
* @param checker TypeScript type checker.
|
|
7
|
+
* @param member Member whose usage is being checked.
|
|
8
|
+
* @returns True when an external call contract accepts the member shape.
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const used = isCallArgumentMember(node, checker, member);
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare const isCallArgumentMember: (node: ts.Node, checker: ts.TypeChecker, member: PublicMember) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Checks whether a property value is forwarded into an external object contract.
|
|
17
|
+
* @param node Candidate outer object property.
|
|
18
|
+
* @param checker TypeScript type checker.
|
|
19
|
+
* @param member Member whose host value is being forwarded.
|
|
20
|
+
* @returns True when the receiving property accepts the host shape.
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const used = isObjectContractHandoff(node, checker, member);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare const isObjectContractHandoff: (node: ts.Node, checker: ts.TypeChecker, member: PublicMember) => boolean;
|
|
27
|
+
export { isCallArgumentMember, isObjectContractHandoff };
|
|
28
|
+
//# sourceMappingURL=member-usage-handoff-utilities.d.ts.map
|
package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-usage-handoff-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AA2HnE;;;;;;;;;;GAUG;AACH,QAAA,MAAM,oBAAoB,GACxB,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,KACnB,OA0BF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,uBAAuB,GAC3B,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,KACnB,OA0EF,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,CAAC"}
|