@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.
Files changed (135) hide show
  1. package/dist/adapters/angular/angular-template-block-usage-utilities.d.ts +4 -0
  2. package/dist/adapters/angular/angular-template-block-usage-utilities.d.ts.map +1 -0
  3. package/dist/adapters/angular/angular-template-block-usage-utilities.js +69 -0
  4. package/dist/adapters/angular/angular-template-expression-utilities.d.ts +5 -0
  5. package/dist/adapters/angular/angular-template-expression-utilities.d.ts.map +1 -0
  6. package/dist/adapters/angular/angular-template-expression-utilities.js +121 -0
  7. package/dist/adapters/angular/angular-template-node-usage-utilities.d.ts +4 -0
  8. package/dist/adapters/angular/angular-template-node-usage-utilities.d.ts.map +1 -0
  9. package/dist/adapters/angular/angular-template-node-usage-utilities.js +47 -0
  10. package/dist/adapters/angular/angular-template-usage-context.d.ts +26 -0
  11. package/dist/adapters/angular/angular-template-usage-context.d.ts.map +1 -0
  12. package/dist/adapters/angular/angular-template-usage-context.js +12 -0
  13. package/dist/adapters/angular/index.d.ts +2 -0
  14. package/dist/adapters/angular/index.d.ts.map +1 -0
  15. package/dist/adapters/angular/index.js +2 -0
  16. package/dist/adapters/angular/no-unused-public-members-template-adapter.d.ts +15 -0
  17. package/dist/adapters/angular/no-unused-public-members-template-adapter.d.ts.map +1 -0
  18. package/dist/adapters/angular/no-unused-public-members-template-adapter.js +126 -0
  19. package/dist/adapters/angular/plugin.d.ts +12 -0
  20. package/dist/adapters/angular/plugin.d.ts.map +1 -0
  21. package/dist/adapters/angular/plugin.js +14 -0
  22. package/dist/adapters/index.d.ts +2 -0
  23. package/dist/adapters/index.d.ts.map +1 -0
  24. package/dist/adapters/index.js +2 -0
  25. package/dist/application/custom-rules.d.ts +3 -0
  26. package/dist/application/custom-rules.d.ts.map +1 -1
  27. package/dist/application/custom-rules.js +3 -2
  28. package/dist/application/index.d.ts +1 -1
  29. package/dist/application/index.d.ts.map +1 -1
  30. package/dist/application/index.js +2 -2
  31. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  32. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts +0 -2
  33. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts.map +1 -1
  34. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +1 -2
  35. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +0 -2
  36. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
  37. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +2 -10
  38. package/dist/domain/architecture/index.d.ts +1 -0
  39. package/dist/domain/architecture/index.d.ts.map +1 -1
  40. package/dist/domain/architecture/index.js +2 -1
  41. package/dist/domain/architecture/no-unused-public-members/index.d.ts +2 -0
  42. package/dist/domain/architecture/no-unused-public-members/index.d.ts.map +1 -0
  43. package/dist/domain/architecture/no-unused-public-members/index.js +2 -0
  44. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts +16 -0
  45. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts.map +1 -0
  46. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.js +102 -0
  47. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts +34 -0
  48. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts.map +1 -0
  49. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.js +55 -0
  50. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts +68 -0
  51. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts.map +1 -0
  52. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.js +195 -0
  53. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts +30 -0
  54. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts.map +1 -0
  55. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.js +106 -0
  56. package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.d.ts +16 -0
  57. package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.d.ts.map +1 -0
  58. package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.js +77 -0
  59. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts +28 -0
  60. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts.map +1 -0
  61. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.js +151 -0
  62. package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.d.ts +16 -0
  63. package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.d.ts.map +1 -0
  64. package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.js +151 -0
  65. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts +29 -0
  66. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts.map +1 -0
  67. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.js +115 -0
  68. package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.d.ts +30 -0
  69. package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.d.ts.map +1 -0
  70. package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.js +107 -0
  71. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts +64 -0
  72. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts.map +1 -0
  73. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.js +152 -0
  74. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts +22 -0
  75. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts.map +1 -0
  76. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.js +137 -0
  77. package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.d.ts +43 -0
  78. package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.d.ts.map +1 -0
  79. package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.js +126 -0
  80. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts +43 -0
  81. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts.map +1 -0
  82. package/dist/domain/architecture/no-unused-public-members/member-utilities.js +52 -0
  83. package/dist/domain/architecture/no-unused-public-members/rule.d.ts +16 -0
  84. package/dist/domain/architecture/no-unused-public-members/rule.d.ts.map +1 -0
  85. package/dist/domain/architecture/no-unused-public-members/rule.js +88 -0
  86. package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +4 -4
  87. package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -1
  88. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -2
  89. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +4 -4
  90. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  91. package/dist/domain/docs/no-interface-member-docs/rule.js +2 -5
  92. package/dist/domain/docs/require-example-language/example-utilities.d.ts +1 -7
  93. package/dist/domain/docs/require-example-language/example-utilities.d.ts.map +1 -1
  94. package/dist/domain/docs/require-example-language/example-utilities.js +4 -6
  95. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  96. package/dist/domain/docs/require-example-language/examples.js +2 -4
  97. package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
  98. package/dist/domain/docs/require-example-language/reporting.js +1 -4
  99. package/dist/domain/docs/require-example-language/types.d.ts +0 -2
  100. package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
  101. package/dist/domain/docs/require-example-language/types.js +1 -1
  102. package/dist/domain/index.d.ts +1 -1
  103. package/dist/domain/index.d.ts.map +1 -1
  104. package/dist/domain/index.js +2 -2
  105. package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
  106. package/dist/domain/testing/aaa/analyzer.analysis.js +2 -7
  107. package/dist/domain/testing/aaa/analyzer.assertions.js +2 -2
  108. package/dist/domain/testing/aaa/analyzer.classification.js +2 -2
  109. package/dist/domain/testing/aaa/types.d.ts +0 -4
  110. package/dist/domain/testing/aaa/types.d.ts.map +1 -1
  111. package/dist/domain/testing/aaa/types.js +1 -1
  112. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
  113. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +2 -7
  114. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -1
  115. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.js +5 -9
  116. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -1
  117. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +2 -7
  118. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -1
  119. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.js +5 -5
  120. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -1
  121. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.js +13 -20
  122. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts +0 -2
  123. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts.map +1 -1
  124. package/dist/domain/testing/prefer-vi-mocked-import/types.js +1 -1
  125. package/dist/domain/testing/require-test-companion/require-test-companion-options.js +3 -3
  126. package/dist/domain/testing/require-test-companion/rule.js +2 -2
  127. package/dist/index.d.ts +2 -1
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +3 -2
  130. package/dist/infrastructure/codeperfect-plugin.d.ts +2 -0
  131. package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
  132. package/dist/infrastructure/codeperfect-plugin.js +3 -2
  133. package/dist/infrastructure/presets.d.ts.map +1 -1
  134. package/dist/infrastructure/presets.js +3 -1
  135. 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
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXB1YmxpYy1hcGktdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci1wdWJsaWMtYXBpLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJakMsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEdBQ1gsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLHNCQUFzQixFQUN0Qix1QkFBdUIsR0FDeEIsTUFBTSx5REFBeUQsQ0FBQztBQUVqRTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixJQUFhLEVBQ2IsWUFBdUIsRUFDdkIsT0FBdUIsRUFDdkIsUUFBaUIsRUFDakIsWUFBMEIsRUFDMUIsS0FBYSxFQUNKLEVBQUU7SUFDWCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdkIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUNyQyxrQkFBa0IsQ0FDaEIsV0FBVyxFQUNYLFlBQVksRUFDWixPQUFPLEVBQ1AsUUFBUSxFQUNSLFlBQVksRUFDWixLQUFLLENBQ04sQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFD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QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVsRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUNsRCxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sQ0FDTCxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUM7WUFDaEQsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUM7WUFDNUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FDNUQsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHR5cGUgeyBOb1VudXNlZEV4cG9ydHNTdGF0ZSB9IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy90eXBlc1wiO1xuXG5pbXBvcnQge1xuICBpc1B1YmxpY0FwaUZpbGUsXG4gIGlzVGVzdEZpbGUsXG59IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1vcHRpb25zXCI7XG5pbXBvcnQge1xuICBpc1NhbWVTeW1ib2wsXG4gIHJlc29sdmVDYW5vbmljYWxTeW1ib2wsXG4gIHNvdXJjZUZpbGVFeHBvcnRzU3ltYm9sLFxufSBmcm9tIFwiLi4vbm8tdW51c2VkLWV4cG9ydHMvbm8tdW51c2VkLWV4cG9ydHMtc3ltYm9sLXV0aWxpdGllc1wiO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgc3ltYm9sIGlzIG5lc3RlZCB3aXRoaW4gYW4gZXhwb3J0ZWQgQVBJIHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBUeXBlIHNoYXBlIG9mIGFuIGV4cG9ydGVkIHZhbHVlIG9yIHR5cGUuXG4gKiBAcGFyYW0gdGFyZ2V0U3ltYm9sIFN5bWJvbCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSBsb2NhdGlvbiBOb2RlIHVzZWQgdG8gcmVzb2x2ZSBwcm9wZXJ0eSB0eXBlcy5cbiAqIEBwYXJhbSB2aXNpdGVkVHlwZXMgVHlwZXMgYWxyZWFkeSBjaGVja2VkIG9uIHRoaXMgc2VhcmNoIHBhdGguXG4gKiBAcGFyYW0gZGVwdGggUmVtYWluaW5nIG5lc3RlZCBwcm9wZXJ0eSBkZXB0aC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdGFyZ2V0IG9jY3VycyBpbiB0aGUgZXhwb3J0ZWQgdHlwZSBzaGFwZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleHBvc2VkID0gdHlwZUNvbnRhaW5zU3ltYm9sKHR5cGUsIG1lbWJlciwgY2hlY2tlciwgc291cmNlRmlsZSwgbmV3IFNldCgpLCAyKTtcbiAqIGBgYFxuICovXG5jb25zdCB0eXBlQ29udGFpbnNTeW1ib2wgPSAoXG4gIHR5cGU6IHRzLlR5cGUsXG4gIHRhcmdldFN5bWJvbDogdHMuU3ltYm9sLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbG9jYXRpb246IHRzLk5vZGUsXG4gIHZpc2l0ZWRUeXBlczogU2V0PHRzLlR5cGU+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
@@ -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"}