@codeperfect/eslint-plugin 2.11.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- 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 +4 -6
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +12 -15
- 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/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +8 -17
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +6 -8
- package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
- package/dist/domain/architecture/consistent-barrel-files/rule.js +4 -5
- 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-import-export-extensions/no-import-export-extensions-rule.d.ts.map +1 -1
- package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.js +6 -13
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.js +11 -10
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.js +5 -9
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.js +6 -9
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.js +5 -10
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.js +4 -8
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js +4 -5
- 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 +101 -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 +125 -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 +108 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts +42 -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 +96 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts +18 -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 +128 -0
- package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts +41 -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 +51 -0
- package/dist/domain/architecture/no-unused-public-members/rule.d.ts +5 -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 +78 -0
- package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts.map +1 -1
- package/dist/domain/core/no-multiple-declarators/rule-utilities.js +13 -19
- package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
- package/dist/domain/core/no-multiple-declarators/rule.js +4 -5
- package/dist/domain/core/no-useless-delegation/rule.d.ts.map +1 -1
- package/dist/domain/core/no-useless-delegation/rule.js +5 -6
- package/dist/domain/core/prefer-interface-types/autofix.js +4 -5
- package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -1
- package/dist/domain/core/prefer-interface-types/rule-utilities.js +7 -9
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +10 -8
- 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 +5 -6
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -1
- package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +7 -9
- 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/empty-fence-fixes.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/empty-fence-fixes.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 +6 -14
- package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/examples.js +7 -16
- package/dist/domain/docs/require-example-language/fixes.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/fixes.js +8 -13
- package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
- package/dist/domain/docs/require-example-language/reporting.js +4 -8
- 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/docs/single-line-jsdoc/rule.d.ts.map +1 -1
- package/dist/domain/docs/single-line-jsdoc/rule.js +5 -11
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -1
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.js +5 -14
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -1
- package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +5 -9
- package/dist/domain/index.d.ts +2 -2
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +3 -3
- package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +2 -5
- package/dist/domain/testing/aaa/analyzer.analysis.js +6 -11
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +5 -14
- package/dist/domain/testing/aaa/analyzer.assertions.js +2 -2
- package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.assertions.operands.js +12 -16
- package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.classification.helpers.js +11 -21
- package/dist/domain/testing/aaa/analyzer.classification.js +2 -2
- package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
- package/dist/domain/testing/aaa/analyzer.super.js +5 -6
- 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/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
- package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +4 -5
- package/dist/domain/testing/index.d.ts +0 -1
- package/dist/domain/testing/index.d.ts.map +1 -1
- package/dist/domain/testing/index.js +1 -2
- package/dist/domain/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/fix.js +9 -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-helpers.js +3 -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 -18
- package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts.map +1 -1
- package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.js +5 -6
- 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-act-result-capture/rule.d.ts.map +1 -1
- package/dist/domain/testing/require-act-result-capture/rule.js +9 -12
- package/dist/domain/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -1
- package/dist/domain/testing/require-test-companion/require-test-companion-listeners.js +5 -11
- package/dist/domain/testing/require-test-companion/require-test-companion-options.js +6 -7
- package/dist/domain/testing/require-test-companion/rule.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/infrastructure/codeperfect-plugin.d.ts +2 -2
- package/dist/infrastructure/codeperfect-plugin.js +3 -3
- package/dist/infrastructure/presets.js +3 -3
- package/package.json +26 -27
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts +0 -2
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts.map +0 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.js +0 -2
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts +0 -29
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts.map +0 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.js +0 -200
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts +0 -12
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts.map +0 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.js +0 -151
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts +0 -16
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts.map +0 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.js +0 -109
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts +0 -5
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +0 -1
- package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +0 -41
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { noUnusedPublicMembersRule } from "./rule.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL2FyY2hpdGVjdHVyZS9uby11bnVzZWQtcHVibGljLW1lbWJlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgbm9VbnVzZWRQdWJsaWNNZW1iZXJzUnVsZSB9IGZyb20gXCIuL3J1bGVcIjtcbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { PublicMember } from "./member-declaration-utilities.js";
|
|
3
|
+
/**
|
|
4
|
+
* Collects member symbols linked by implemented or inherited types.
|
|
5
|
+
* @param program TypeScript project program.
|
|
6
|
+
* @param checker TypeScript type checker.
|
|
7
|
+
* @param targetMember Member whose related contracts are being found.
|
|
8
|
+
* @returns Related member symbols from contract declarations.
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const symbols = collectHeritageMemberSymbols(program, checker, member);
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare const collectHeritageMemberSymbols: (program: ts.Program, checker: ts.TypeChecker, targetMember: PublicMember) => ts.Symbol[];
|
|
15
|
+
export { collectHeritageMemberSymbols };
|
|
16
|
+
//# sourceMappingURL=member-contract-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-contract-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-contract-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAyDnE;;;;;;;;;;GAUG;AACH,QAAA,MAAM,4BAA4B,GAChC,SAAS,EAAE,CAAC,OAAO,EACnB,SAAS,EAAE,CAAC,WAAW,EACvB,cAAc,YAAY,KACzB,EAAE,CAAC,MAAM,EA+EX,CAAC;AAEF,OAAO,EAAE,4BAA4B,EAAE,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { isSameSymbol, resolveCanonicalSymbol, } from "../no-unused-exports/no-unused-exports-symbol-utilities.js";
|
|
3
|
+
import { isSupportedMember } from "./member-host-utilities.js";
|
|
4
|
+
/**
|
|
5
|
+
* Extracts the static key from a supported member declaration.
|
|
6
|
+
* @param declaration TypeScript member node to inspect.
|
|
7
|
+
* @returns Static name when the declaration is supported.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const name = getDeclaredMemberName(memberDeclaration);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
const getDeclaredMemberName = (declaration) => {
|
|
14
|
+
if (!isSupportedMember(declaration)) {
|
|
15
|
+
return void 0;
|
|
16
|
+
}
|
|
17
|
+
const name = declaration.name;
|
|
18
|
+
return name !== void 0 &&
|
|
19
|
+
(ts.isIdentifier(name) || ts.isStringLiteralLike(name))
|
|
20
|
+
? name.text
|
|
21
|
+
: void 0;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Gets the symbol for one direct member declaration.
|
|
25
|
+
* @param checker TypeScript type checker.
|
|
26
|
+
* @param declaration TypeScript syntax node naming the member.
|
|
27
|
+
* @param memberName Static member name.
|
|
28
|
+
* @returns Member symbol when available.
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const symbol = getDeclaredMemberSymbol(checker, declaration, "run");
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
const getDeclaredMemberSymbol = (checker, declaration, memberName) => {
|
|
35
|
+
const name = declaration.name;
|
|
36
|
+
return name === void 0
|
|
37
|
+
? void 0
|
|
38
|
+
: (checker.getSymbolAtLocation(name) ??
|
|
39
|
+
checker.getPropertyOfType(checker.getTypeAtLocation(declaration.parent), memberName));
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Collects member symbols linked by implemented or inherited types.
|
|
43
|
+
* @param program TypeScript project program.
|
|
44
|
+
* @param checker TypeScript type checker.
|
|
45
|
+
* @param targetMember Member whose related contracts are being found.
|
|
46
|
+
* @returns Related member symbols from contract declarations.
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const symbols = collectHeritageMemberSymbols(program, checker, member);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
const collectHeritageMemberSymbols = (program, checker, targetMember) => {
|
|
53
|
+
const relatedSymbols = [];
|
|
54
|
+
const targetSymbol = resolveCanonicalSymbol(targetMember.memberSymbol, checker);
|
|
55
|
+
const addSymbol = (candidate) => {
|
|
56
|
+
if (candidate !== void 0 &&
|
|
57
|
+
relatedSymbols.every((symbol) => !isSameSymbol(symbol, candidate))) {
|
|
58
|
+
relatedSymbols.push(candidate);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const visit = (node) => {
|
|
62
|
+
if (ts.isClassDeclaration(node) ||
|
|
63
|
+
ts.isInterfaceDeclaration(node) ||
|
|
64
|
+
ts.isClassExpression(node)) {
|
|
65
|
+
const ownMembers = node.members.filter((member) => getDeclaredMemberName(member) === targetMember.memberName);
|
|
66
|
+
const matchingHeritageSymbols = [];
|
|
67
|
+
const heritageClauses = node.heritageClauses ?? [];
|
|
68
|
+
for (const clause of heritageClauses) {
|
|
69
|
+
for (const heritageType of clause.types) {
|
|
70
|
+
const inheritedMember = checker.getPropertyOfType(checker.getTypeAtLocation(heritageType), targetMember.memberName);
|
|
71
|
+
if (inheritedMember !== void 0 &&
|
|
72
|
+
(isSameSymbol(resolveCanonicalSymbol(inheritedMember, checker), targetSymbol) ||
|
|
73
|
+
node === targetMember.declaration.parent)) {
|
|
74
|
+
matchingHeritageSymbols.push(inheritedMember);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (node === targetMember.declaration.parent) {
|
|
79
|
+
for (const member of ownMembers) {
|
|
80
|
+
addSymbol(getDeclaredMemberSymbol(checker, member, targetMember.memberName));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (matchingHeritageSymbols.length > 0) {
|
|
84
|
+
for (const member of ownMembers) {
|
|
85
|
+
addSymbol(getDeclaredMemberSymbol(checker, member, targetMember.memberName));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
for (const symbol of matchingHeritageSymbols) {
|
|
89
|
+
addSymbol(symbol);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
ts.forEachChild(node, visit);
|
|
93
|
+
};
|
|
94
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
95
|
+
if (!sourceFile.isDeclarationFile) {
|
|
96
|
+
visit(sourceFile);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return relatedSymbols;
|
|
100
|
+
};
|
|
101
|
+
export { collectHeritageMemberSymbols };
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWNvbnRyYWN0LXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1wdWJsaWMtbWVtYmVycy9tZW1iZXItY29udHJhY3QtdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBSWpDLE9BQU8sRUFDTCxZQUFZLEVBQ1osc0JBQXNCLEdBQ3ZCLE1BQU0seURBQXlELENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFNUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsV0FBb0IsRUFBc0IsRUFBRTtJQUN6RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLElBQUksR0FBSSxXQUFtQyxDQUFDLElBQUksQ0FBQztJQUV2RCxPQUFPLElBQUksS0FBSyxLQUFLLENBQUM7UUFDcEIsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUk7UUFDWCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxDQUM5QixPQUF1QixFQUN2QixXQUFvQixFQUNwQixVQUFrQixFQUNLLEVBQUU7SUFDekIsTUFBTSxJQUFJLEdBQUksV0FBbUMsQ0FBQyxJQUFJLENBQUM7SUFFdkQsT0FBTyxJQUFJLEtBQUssS0FBSyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDUixD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QUssTUFBTSxNQUFNLElBQUksdUJBQXVCLEVBQUUsQ0FBQztnQkFDN0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDO0lBRUYsS0FBSyxNQUFNLFVBQVUsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgdHlwZSB7IFB1YmxpY01lbWJlciB9IGZyb20gXCIuL21lbWJlci1kZWNsYXJhdGlvbi11dGlsaXRpZXNcIjtcblxuaW1wb3J0IHtcbiAgaXNTYW1lU3ltYm9sLFxuICByZXNvbHZlQ2Fub25pY2FsU3ltYm9sLFxufSBmcm9tIFwiLi4vbm8tdW51c2VkLWV4cG9ydHMvbm8tdW51c2VkLWV4cG9ydHMtc3ltYm9sLXV0aWxpdGllc1wiO1xuaW1wb3J0IHsgaXNTdXBwb3J0ZWRNZW1iZXIgfSBmcm9tIFwiLi9tZW1iZXItaG9zdC11dGlsaXRpZXNcIjtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgc3RhdGljIGtleSBmcm9tIGEgc3VwcG9ydGVkIG1lbWJlciBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSBkZWNsYXJhdGlvbiBUeXBlU2NyaXB0IG1lbWJlciBub2RlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBTdGF0aWMgbmFtZSB3aGVuIHRoZSBkZWNsYXJhdGlvbiBpcyBzdXBwb3J0ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmFtZSA9IGdldERlY2xhcmVkTWVtYmVyTmFtZShtZW1iZXJEZWNsYXJhdGlvbik7XG4gKiBgYGBcbiAqL1xuY29uc3QgZ2V0RGVjbGFyZWRNZW1iZXJOYW1lID0gKGRlY2xhcmF0aW9uOiB0cy5Ob2RlKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1N1cHBvcnRlZE1lbWJlcihkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgbmFtZSA9IChkZWNsYXJhdGlvbiBhcyB0cy5OYW1lZERlY2xhcmF0aW9uKS5uYW1lO1xuXG4gIHJldHVybiBuYW1lICE9PSB2b2lkIDAgJiZcbiAgICAodHMuaXNJZGVudGlmaWVyKG5hbWUpIHx8IHRzLmlzU3RyaW5nTGl0ZXJhbExpa2UobmFtZSkpXG4gICAgPyBuYW1lLnRleHRcbiAgICA6IHZvaWQgMDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgc3ltYm9sIGZvciBvbmUgZGlyZWN0IG1lbWJlciBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHBhcmFtIGRlY2xhcmF0aW9uIFR5cGVTY3JpcHQgc3ludGF4IG5vZGUgbmFtaW5nIHRoZSBtZW1iZXIuXG4gKiBAcGFyYW0gbWVtYmVyTmFtZSBTdGF0aWMgbWVtYmVyIG5hbWUuXG4gKiBAcmV0dXJucyBNZW1iZXIgc3ltYm9sIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN5bWJvbCA9IGdldERlY2xhcmVkTWVtYmVyU3ltYm9sKGNoZWNrZXIsIGRlY2xhcmF0aW9uLCBcInJ1blwiKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXREZWNsYXJlZE1lbWJlclN5bWJvbCA9IChcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIGRlY2xhcmF0aW9uOiB0cy5Ob2RlLFxuICBtZW1iZXJOYW1lOiBzdHJpbmcsXG4pOiB0cy5TeW1ib2wgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBuYW1lID0gKGRlY2xhcmF0aW9uIGFzIHRzLk5hbWVkRGVjbGFyYXRpb24pLm5hbWU7XG5cbiAgcmV0dXJuIG5hbWUgPT09IHZvaWQgMFxuICAgID8gdm9pZCAwXG4gICAgOiAoY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5hbWUpID8/XG4gICAgICAgIGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUoXG4gICAgICAgICAgY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihkZWNsYXJhdGlvbi5wYXJlbnQpLFxuICAgICAgICAgIG1lbWJlck5hbWUsXG4gICAgICAgICkpO1xufTtcblxuLyoqXG4gKiBDb2xsZWN0cyBtZW1iZXIgc3ltYm9scyBsaW5rZWQgYnkgaW1wbGVtZW50ZWQgb3IgaW5oZXJpdGVkIHR5cGVzLlxuICogQHBhcmFtIHByb2dyYW0gVHlwZVNjcmlwdCBwcm9qZWN0IHByb2dyYW0uXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSB0YXJnZXRNZW1iZXIgTWVtYmVyIHdob3NlIHJlbGF0ZWQgY29udHJhY3RzIGFyZSBiZWluZyBmb3VuZC5cbiAqIEByZXR1cm5zIFJlbGF0ZWQgbWVtYmVyIHN5bWJvbHMgZnJvbSBjb250cmFjdCBkZWNsYXJhdGlvbnMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3ltYm9scyA9IGNvbGxlY3RIZXJpdGFnZU1lbWJlclN5bWJvbHMocHJvZ3JhbSwgY2hlY2tlciwgbWVtYmVyKTtcbiAqIGBgYFxuICovXG5jb25zdCBjb2xsZWN0SGVyaXRhZ2VNZW1iZXJTeW1ib2xzID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgdGFyZ2V0TWVtYmVyOiBQdWJsaWNNZW1iZXIsXG4pOiB0cy5TeW1ib2xbXSA9PiB7XG4gIGNvbnN0IHJlbGF0ZWRTeW1ib2xzOiB0cy5TeW1ib2xbXSA9IFtdO1xuICBjb25zdCB0YXJnZXRTeW1ib2wgPSByZXNvbHZlQ2Fub25pY2FsU3ltYm9sKFxuICAgIHRhcmdldE1lbWJlci5tZW1iZXJTeW1ib2wsXG4gICAgY2hlY2tlcixcbiAgKTtcbiAgY29uc3QgYWRkU3ltYm9sID0gKGNhbmRpZGF0ZTogdHMuU3ltYm9sIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gICAgaWYgKFxuICAgICAgY2FuZGlkYXRlICE9PSB2b2lkIDAgJiZcbiAgICAgIHJlbGF0ZWRTeW1ib2xzLmV2ZXJ5KChzeW1ib2wpID0+ICFpc1NhbWVTeW1ib2woc3ltYm9sLCBjYW5kaWRhdGUpKVxuICAgICkge1xuICAgICAgcmVsYXRlZFN5bWJvbHMucHVzaChjYW5kaWRhdGUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKFxuICAgICAgdHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpIHx8XG4gICAgICB0cy5pc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpIHx8XG4gICAgICB0cy5pc0NsYXNzRXhwcmVzc2lvbihub2RlKVxuICAgICkge1xuICAgICAgY29uc3Qgb3duTWVtYmVycyA9IG5vZGUubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtZW1iZXIpID0+IGdldERlY2xhcmVkTWVtYmVyTmFtZShtZW1iZXIpID09PSB0YXJnZXRNZW1iZXIubWVtYmVyTmFtZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXRjaGluZ0hlcml0YWdlU3ltYm9sczogdHMuU3ltYm9sW10gPSBbXTtcblxuICAgICAgY29uc3QgaGVyaXRhZ2VDbGF1c2VzID0gbm9kZS5oZXJpdGFnZUNsYXVzZXMgPz8gW107XG5cbiAgICAgIGZvciAoY29uc3QgY2xhdXNlIG9mIGhlcml0YWdlQ2xhdXNlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGhlcml0YWdlVHlwZSBvZiBjbGF1c2UudHlwZXMpIHtcbiAgICAgICAgICBjb25zdCBpbmhlcml0ZWRNZW1iZXIgPSBjaGVja2VyLmdldFByb3BlcnR5T2ZUeXBlKFxuICAgICAgICAgICAgY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihoZXJpdGFnZVR5cGUpLFxuICAgICAgICAgICAgdGFyZ2V0TWVtYmVyLm1lbWJlck5hbWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGluaGVyaXRlZE1lbWJlciAhPT0gdm9pZCAwICYmXG4gICAgICAgICAgICAoaXNTYW1lU3ltYm9sKFxuICAgICAgICAgICAgICByZXNvbHZlQ2Fub25pY2FsU3ltYm9sKGluaGVyaXRlZE1lbWJlciwgY2hlY2tlciksXG4gICAgICAgICAgICAgIHRhcmdldFN5bWJvbCxcbiAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgbm9kZSA9PT0gdGFyZ2V0TWVtYmVyLmRlY2xhcmF0aW9uLnBhcmVudClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hdGNoaW5nSGVyaXRhZ2VTeW1ib2xzLnB1c2goaW5oZXJpdGVkTWVtYmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IHRhcmdldE1lbWJlci5kZWNsYXJhdGlvbi5wYXJlbnQpIHtcbiAgICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2Ygb3duTWVtYmVycykge1xuICAgICAgICAgIGFkZFN5bWJvbChcbiAgICAgICAgICAgIGdldERlY2xhcmVkTWVtYmVyU3ltYm9sKGNoZWNrZXIsIG1lbWJlciwgdGFyZ2V0TWVtYmVyLm1lbWJlck5hbWUpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoaW5nSGVyaXRhZ2VTeW1ib2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2Ygb3duTWVtYmVycykge1xuICAgICAgICAgIGFkZFN5bWJvbChcbiAgICAgICAgICAgIGdldERlY2xhcmVkTWVtYmVyU3ltYm9sKGNoZWNrZXIsIG1lbWJlciwgdGFyZ2V0TWVtYmVyLm1lbWJlck5hbWUpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBzeW1ib2wgb2YgbWF0Y2hpbmdIZXJpdGFnZVN5bWJvbHMpIHtcbiAgICAgICAgYWRkU3ltYm9sKHN5bWJvbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgaWYgKCFzb3VyY2VGaWxlLmlzRGVjbGFyYXRpb25GaWxlKSB7XG4gICAgICB2aXNpdChzb3VyY2VGaWxlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVsYXRlZFN5bWJvbHM7XG59O1xuXG5leHBvcnQgeyBjb2xsZWN0SGVyaXRhZ2VNZW1iZXJTeW1ib2xzIH07XG4iXX0=
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
/** One public member and its owning declaration. */
|
|
4
|
+
export interface PublicMember {
|
|
5
|
+
/** Member declaration in the TypeScript source tree. */
|
|
6
|
+
declaration: ts.Node;
|
|
7
|
+
/** Host declaration used to resolve declared member types. */
|
|
8
|
+
hostDeclaration: ts.Node;
|
|
9
|
+
/** Display name of the host. */
|
|
10
|
+
hostName: string;
|
|
11
|
+
/** Symbol of the host declaration, when available. */
|
|
12
|
+
hostSymbol: ts.Symbol | undefined;
|
|
13
|
+
/** Name used for contract matching and diagnostics. */
|
|
14
|
+
memberName: string;
|
|
15
|
+
/** TypeScript symbol for the member declaration. */
|
|
16
|
+
memberSymbol: ts.Symbol;
|
|
17
|
+
/** ESTree node used for the diagnostic location. */
|
|
18
|
+
reportNode: ReturnType<ParserServices["tsNodeToESTreeNodeMap"]["get"]>;
|
|
19
|
+
}
|
|
20
|
+
type ParserServices = ReturnType<typeof ESLintUtils.getParserServices>;
|
|
21
|
+
/**
|
|
22
|
+
* Collects direct public members from one source file.
|
|
23
|
+
* @param sourceFile Source file being analyzed.
|
|
24
|
+
* @param checker TypeScript type checker.
|
|
25
|
+
* @param parserServices TypeScript and ESTree node maps.
|
|
26
|
+
* @returns Public member declarations with resolved symbols.
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const members = collectPublicMembers(sourceFile, checker, parserServices);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare const collectPublicMembers: (sourceFile: ts.SourceFile, checker: ts.TypeChecker, parserServices: ParserServices) => PublicMember[];
|
|
33
|
+
export { collectPublicMembers };
|
|
34
|
+
//# sourceMappingURL=member-declaration-utilities.d.ts.map
|
package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-declaration-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-declaration-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAWjC,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC;IAErB,8DAA8D;IAC9D,eAAe,EAAE,EAAE,CAAC,IAAI,CAAC;IAEzB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IAEjB,sDAAsD;IACtD,UAAU,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC;IAElC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IAEnB,oDAAoD;IACpD,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC;IAExB,oDAAoD;IACpD,UAAU,EAAE,UAAU,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;CACxE;AAED,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,QAAA,MAAM,oBAAoB,GACxB,YAAY,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,CAAC,WAAW,EACvB,gBAAgB,cAAc,KAC7B,YAAY,EA2Dd,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import { isSameSymbol } from "../no-unused-exports/no-unused-exports-symbol-utilities.js";
|
|
4
|
+
import { collectMemberHosts, getMemberSymbol, getStaticMemberName, isPublicClassMember, isSupportedMember, } from "./member-host-utilities.js";
|
|
5
|
+
/**
|
|
6
|
+
* Collects direct public members from one source file.
|
|
7
|
+
* @param sourceFile Source file being analyzed.
|
|
8
|
+
* @param checker TypeScript type checker.
|
|
9
|
+
* @param parserServices TypeScript and ESTree node maps.
|
|
10
|
+
* @returns Public member declarations with resolved symbols.
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const members = collectPublicMembers(sourceFile, checker, parserServices);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
const collectPublicMembers = (sourceFile, checker, parserServices) => {
|
|
17
|
+
const members = [];
|
|
18
|
+
for (const host of collectMemberHosts(sourceFile, checker)) {
|
|
19
|
+
const hostType = checker.getTypeAtLocation(host.node);
|
|
20
|
+
const isClassHost = ts.isClassDeclaration(host.node);
|
|
21
|
+
for (const declaration of host.members) {
|
|
22
|
+
if (!isSupportedMember(declaration) ||
|
|
23
|
+
(isClassHost && !isPublicClassMember(declaration))) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const nameNode = declaration.name;
|
|
27
|
+
const memberName = getStaticMemberName(nameNode);
|
|
28
|
+
if (memberName === "constructor" ||
|
|
29
|
+
nameNode === void 0 ||
|
|
30
|
+
memberName === void 0 ||
|
|
31
|
+
!parserServices.tsNodeToESTreeNodeMap.has(nameNode)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const memberSymbol = getMemberSymbol(checker, declaration, memberName, hostType);
|
|
35
|
+
if (memberSymbol === void 0 ||
|
|
36
|
+
members.some((existing) => existing.hostSymbol === host.symbol &&
|
|
37
|
+
existing.hostName === host.name &&
|
|
38
|
+
isSameSymbol(existing.memberSymbol, memberSymbol))) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
members.push({
|
|
42
|
+
declaration,
|
|
43
|
+
hostDeclaration: host.node,
|
|
44
|
+
hostName: host.name,
|
|
45
|
+
hostSymbol: host.symbol,
|
|
46
|
+
memberName,
|
|
47
|
+
memberSymbol,
|
|
48
|
+
reportNode: parserServices.tsNodeToESTreeNodeMap.get(nameNode),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return members;
|
|
53
|
+
};
|
|
54
|
+
export { collectPublicMembers };
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWRlY2xhcmF0aW9uLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1wdWJsaWMtbWVtYmVycy9tZW1iZXItZGVjbGFyYXRpb24tdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seURBQXlELENBQUM7QUFDdkYsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsR0FDbEIsTUFBTSx5QkFBeUIsQ0FBQztBQTRCakM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FDM0IsVUFBeUIsRUFDekIsT0FBdUIsRUFDdkIsY0FBOEIsRUFDZCxFQUFFO0lBQ2xCLE1BQU0sT0FBTyxHQUFtQixFQUFFLENBQUM7SUFFbkMsS0FBSyxNQUFNLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsSUFDRSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztnQkFDL0IsQ0FBQyxXQUFXLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUNsRCxDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUksV0FBbUMsQ0FBQyxJQUFJLENBQUM7WUFDM0QsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFakQsSUFDRSxVQUFVLEtBQUssYUFBYTtnQkFDNUIsUUFBUSxLQUFLLEtBQUssQ0FBQztnQkFDbkIsVUFBVSxLQUFLLEtBQUssQ0FBQztnQkFDckIsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUNuRCxDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUNsQyxPQUFPLEVBQ1AsV0FBVyxFQUNYLFVBQVUsRUFDVixRQUFRLENBQ1QsQ0FBQztZQUVGLElBQ0UsWUFBWSxLQUFLLEtBQUssQ0FBQztnQkFDdkIsT0FBTyxDQUFDLElBQUksQ0FDVixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ1gsUUFBUSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsTUFBTTtvQkFDbkMsUUFBUSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSTtvQkFDL0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQ3BELEVBQ0QsQ0FBQztnQkFDRCxTQUFTO1lBQ1gsQ0FBQztZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsV0FBVztnQkFDWCxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUN2QixVQUFVO2dCQUNWLFlBQVk7Z0JBQ1osVUFBVSxFQUFFLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2FBQy9ELENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFU0xpbnRVdGlscyB9IGZyb20gXCJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHNcIjtcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbmltcG9ydCB7IGlzU2FtZVN5bWJvbCB9IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1zeW1ib2wtdXRpbGl0aWVzXCI7XG5pbXBvcnQge1xuICBjb2xsZWN0TWVtYmVySG9zdHMsXG4gIGdldE1lbWJlclN5bWJvbCxcbiAgZ2V0U3RhdGljTWVtYmVyTmFtZSxcbiAgaXNQdWJsaWNDbGFzc01lbWJlcixcbiAgaXNTdXBwb3J0ZWRNZW1iZXIsXG59IGZyb20gXCIuL21lbWJlci1ob3N0LXV0aWxpdGllc1wiO1xuXG4vKiogT25lIHB1YmxpYyBtZW1iZXIgYW5kIGl0cyBvd25pbmcgZGVjbGFyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFB1YmxpY01lbWJlciB7XG4gIC8qKiBNZW1iZXIgZGVjbGFyYXRpb24gaW4gdGhlIFR5cGVTY3JpcHQgc291cmNlIHRyZWUuICovXG4gIGRlY2xhcmF0aW9uOiB0cy5Ob2RlO1xuXG4gIC8qKiBIb3N0IGRlY2xhcmF0aW9uIHVzZWQgdG8gcmVzb2x2ZSBkZWNsYXJlZCBtZW1iZXIgdHlwZXMuICovXG4gIGhvc3REZWNsYXJhdGlvbjogdHMuTm9kZTtcblxuICAvKiogRGlzcGxheSBuYW1lIG9mIHRoZSBob3N0LiAqL1xuICBob3N0TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBTeW1ib2wgb2YgdGhlIGhvc3QgZGVjbGFyYXRpb24sIHdoZW4gYXZhaWxhYmxlLiAqL1xuICBob3N0U3ltYm9sOiB0cy5TeW1ib2wgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIE5hbWUgdXNlZCBmb3IgY29udHJhY3QgbWF0Y2hpbmcgYW5kIGRpYWdub3N0aWNzLiAqL1xuICBtZW1iZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFR5cGVTY3JpcHQgc3ltYm9sIGZvciB0aGUgbWVtYmVyIGRlY2xhcmF0aW9uLiAqL1xuICBtZW1iZXJTeW1ib2w6IHRzLlN5bWJvbDtcblxuICAvKiogRVNUcmVlIG5vZGUgdXNlZCBmb3IgdGhlIGRpYWdub3N0aWMgbG9jYXRpb24uICovXG4gIHJlcG9ydE5vZGU6IFJldHVyblR5cGU8UGFyc2VyU2VydmljZXNbXCJ0c05vZGVUb0VTVHJlZU5vZGVNYXBcIl1bXCJnZXRcIl0+O1xufVxuXG50eXBlIFBhcnNlclNlcnZpY2VzID0gUmV0dXJuVHlwZTx0eXBlb2YgRVNMaW50VXRpbHMuZ2V0UGFyc2VyU2VydmljZXM+O1xuXG4vKipcbiAqIENvbGxlY3RzIGRpcmVjdCBwdWJsaWMgbWVtYmVycyBmcm9tIG9uZSBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSBzb3VyY2VGaWxlIFNvdXJjZSBmaWxlIGJlaW5nIGFuYWx5emVkLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gcGFyc2VyU2VydmljZXMgVHlwZVNjcmlwdCBhbmQgRVNUcmVlIG5vZGUgbWFwcy5cbiAqIEByZXR1cm5zIFB1YmxpYyBtZW1iZXIgZGVjbGFyYXRpb25zIHdpdGggcmVzb2x2ZWQgc3ltYm9scy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZW1iZXJzID0gY29sbGVjdFB1YmxpY01lbWJlcnMoc291cmNlRmlsZSwgY2hlY2tlciwgcGFyc2VyU2VydmljZXMpO1xuICogYGBgXG4gKi9cbmNvbnN0IGNvbGxlY3RQdWJsaWNNZW1iZXJzID0gKFxuICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgcGFyc2VyU2VydmljZXM6IFBhcnNlclNlcnZpY2VzLFxuKTogUHVibGljTWVtYmVyW10gPT4ge1xuICBjb25zdCBtZW1iZXJzOiBQdWJsaWNNZW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBjb2xsZWN0TWVtYmVySG9zdHMoc291cmNlRmlsZSwgY2hlY2tlcikpIHtcbiAgICBjb25zdCBob3N0VHlwZSA9IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oaG9zdC5ub2RlKTtcbiAgICBjb25zdCBpc0NsYXNzSG9zdCA9IHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihob3N0Lm5vZGUpO1xuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBob3N0Lm1lbWJlcnMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWlzU3VwcG9ydGVkTWVtYmVyKGRlY2xhcmF0aW9uKSB8fFxuICAgICAgICAoaXNDbGFzc0hvc3QgJiYgIWlzUHVibGljQ2xhc3NNZW1iZXIoZGVjbGFyYXRpb24pKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lTm9kZSA9IChkZWNsYXJhdGlvbiBhcyB0cy5OYW1lZERlY2xhcmF0aW9uKS5uYW1lO1xuICAgICAgY29uc3QgbWVtYmVyTmFtZSA9IGdldFN0YXRpY01lbWJlck5hbWUobmFtZU5vZGUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIG1lbWJlck5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fFxuICAgICAgICBuYW1lTm9kZSA9PT0gdm9pZCAwIHx8XG4gICAgICAgIG1lbWJlck5hbWUgPT09IHZvaWQgMCB8fFxuICAgICAgICAhcGFyc2VyU2VydmljZXMudHNOb2RlVG9FU1RyZWVOb2RlTWFwLmhhcyhuYW1lTm9kZSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVtYmVyU3ltYm9sID0gZ2V0TWVtYmVyU3ltYm9sKFxuICAgICAgICBjaGVja2VyLFxuICAgICAgICBkZWNsYXJhdGlvbixcbiAgICAgICAgbWVtYmVyTmFtZSxcbiAgICAgICAgaG9zdFR5cGUsXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgIG1lbWJlclN5bWJvbCA9PT0gdm9pZCAwIHx8XG4gICAgICAgIG1lbWJlcnMuc29tZShcbiAgICAgICAgICAoZXhpc3RpbmcpID0+XG4gICAgICAgICAgICBleGlzdGluZy5ob3N0U3ltYm9sID09PSBob3N0LnN5bWJvbCAmJlxuICAgICAgICAgICAgZXhpc3RpbmcuaG9zdE5hbWUgPT09IGhvc3QubmFtZSAmJlxuICAgICAgICAgICAgaXNTYW1lU3ltYm9sKGV4aXN0aW5nLm1lbWJlclN5bWJvbCwgbWVtYmVyU3ltYm9sKSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBtZW1iZXJzLnB1c2goe1xuICAgICAgICBkZWNsYXJhdGlvbixcbiAgICAgICAgaG9zdERlY2xhcmF0aW9uOiBob3N0Lm5vZGUsXG4gICAgICAgIGhvc3ROYW1lOiBob3N0Lm5hbWUsXG4gICAgICAgIGhvc3RTeW1ib2w6IGhvc3Quc3ltYm9sLFxuICAgICAgICBtZW1iZXJOYW1lLFxuICAgICAgICBtZW1iZXJTeW1ib2wsXG4gICAgICAgIHJlcG9ydE5vZGU6IHBhcnNlclNlcnZpY2VzLnRzTm9kZVRvRVNUcmVlTm9kZU1hcC5nZXQobmFtZU5vZGUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lbWJlcnM7XG59O1xuXG5leHBvcnQgeyBjb2xsZWN0UHVibGljTWVtYmVycyB9O1xuIl19
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
/** One supported host and its direct member declarations. */
|
|
3
|
+
interface MemberHost {
|
|
4
|
+
/** Members declared directly by this host. */
|
|
5
|
+
members: readonly ts.Node[];
|
|
6
|
+
/** Display name of the host. */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Host declaration node. */
|
|
9
|
+
node: ts.Node;
|
|
10
|
+
/** Host symbol, when available. */
|
|
11
|
+
symbol: ts.Symbol | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Gets a static member name, excluding dynamic and private keys.
|
|
15
|
+
* @param name Candidate declaration name.
|
|
16
|
+
* @returns Static name or undefined when the key is dynamic or private.
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const name = getStaticMemberName(ts.factory.createIdentifier("run"));
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare const getStaticMemberName: (name: ts.Node | undefined) => string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Resolves a direct object-literal property symbol before its contextual type.
|
|
25
|
+
* @param checker TypeScript type checker.
|
|
26
|
+
* @param member Member declaration.
|
|
27
|
+
* @param memberName Static member name.
|
|
28
|
+
* @param hostType Type of the containing host.
|
|
29
|
+
* @returns Member symbol when TypeScript can resolve it.
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const symbol = getMemberSymbol(checker, property, "value", hostType);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
declare const getMemberSymbol: (checker: ts.TypeChecker, member: ts.Node, memberName: string, hostType: ts.Type) => ts.Symbol | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Checks whether a class member is public or has implicit public visibility.
|
|
38
|
+
* @param member Class member declaration.
|
|
39
|
+
* @returns True when the member is not private or protected.
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const visible = isPublicClassMember(classMethod);
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
declare const isPublicClassMember: (member: ts.Node) => boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Checks whether a node is a supported direct property or method.
|
|
48
|
+
* @param member Candidate TypeScript member.
|
|
49
|
+
* @returns True when this rule analyzes the member kind.
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const supported = isSupportedMember(typeMember);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
declare const isSupportedMember: (member: ts.Node) => boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Collects direct class, interface, type-alias, and const-object hosts.
|
|
58
|
+
* @param sourceFile Source file to inspect.
|
|
59
|
+
* @param checker TypeScript type checker.
|
|
60
|
+
* @returns Supported hosts declared by the source file.
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const hosts = collectMemberHosts(sourceFile, checker);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
declare const collectMemberHosts: (sourceFile: ts.SourceFile, checker: ts.TypeChecker) => MemberHost[];
|
|
67
|
+
export { collectMemberHosts, getMemberSymbol, getStaticMemberName, isPublicClassMember, isSupportedMember, };
|
|
68
|
+
//# sourceMappingURL=member-host-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-host-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-host-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,6DAA6D;AAC7D,UAAU,UAAU;IAClB,8CAA8C;IAC9C,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;IAE5B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IAEd,mCAAmC;IACnC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,mBAAmB,GAAI,MAAM,EAAE,CAAC,IAAI,GAAG,SAAS,KAAG,MAAM,GAAG,SAcjE,CAAC;AA0BF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,eAAe,GACnB,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,EAAE,CAAC,IAAI,EACf,YAAY,MAAM,EAClB,UAAU,EAAE,CAAC,IAAI,KAChB,EAAE,CAAC,MAAM,GAAG,SAwBd,CAAC;AA+BF;;;;;;;;GAQG;AACH,QAAA,MAAM,mBAAmB,GAAI,QAAQ,EAAE,CAAC,IAAI,KAAG,OAoB9C,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,iBAAiB,GAAI,QAAQ,EAAE,CAAC,IAAI,KAAG,OAQH,CAAC;AAE3C;;;;;;;;;GASG;AACH,QAAA,MAAM,kBAAkB,GACtB,YAAY,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,CAAC,WAAW,KACtB,UAAU,EAsDZ,CAAC;AAEF,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAClB,CAAC"}
|
|
@@ -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;AA2DvE;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,iBAAiB,GACrB,SAAS,EAAE,CAAC,OAAO,EACnB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,cAAc,EAAE,CAAC,MAAM,KACtB,OA6CF,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"}
|