@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.
Files changed (180) hide show
  1. package/README.md +0 -1
  2. package/dist/application/custom-rules.d.ts +3 -0
  3. package/dist/application/custom-rules.d.ts.map +1 -1
  4. package/dist/application/custom-rules.js +3 -2
  5. package/dist/application/index.d.ts +1 -1
  6. package/dist/application/index.d.ts.map +1 -1
  7. package/dist/application/index.js +2 -2
  8. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  9. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts +0 -2
  10. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts.map +1 -1
  11. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +4 -6
  12. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -1
  13. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +12 -15
  14. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +0 -2
  15. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
  16. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +2 -10
  17. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
  18. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +8 -17
  19. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -1
  20. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +6 -8
  21. package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
  22. package/dist/domain/architecture/consistent-barrel-files/rule.js +4 -5
  23. package/dist/domain/architecture/index.d.ts +1 -0
  24. package/dist/domain/architecture/index.d.ts.map +1 -1
  25. package/dist/domain/architecture/index.js +2 -1
  26. package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.d.ts.map +1 -1
  27. package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.js +6 -13
  28. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts.map +1 -1
  29. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.js +11 -10
  30. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts.map +1 -1
  31. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.js +5 -9
  32. package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.d.ts.map +1 -1
  33. package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.js +6 -9
  34. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts.map +1 -1
  35. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.js +5 -10
  36. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts.map +1 -1
  37. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.js +4 -8
  38. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map +1 -1
  39. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js +4 -5
  40. package/dist/domain/architecture/no-unused-public-members/index.d.ts +2 -0
  41. package/dist/domain/architecture/no-unused-public-members/index.d.ts.map +1 -0
  42. package/dist/domain/architecture/no-unused-public-members/index.js +2 -0
  43. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts +16 -0
  44. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts.map +1 -0
  45. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.js +102 -0
  46. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts +34 -0
  47. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts.map +1 -0
  48. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.js +55 -0
  49. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts +68 -0
  50. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts.map +1 -0
  51. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.js +195 -0
  52. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts +30 -0
  53. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts.map +1 -0
  54. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.js +101 -0
  55. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts +28 -0
  56. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts.map +1 -0
  57. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.js +125 -0
  58. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts +29 -0
  59. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts.map +1 -0
  60. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.js +108 -0
  61. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts +42 -0
  62. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts.map +1 -0
  63. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.js +96 -0
  64. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts +18 -0
  65. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts.map +1 -0
  66. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.js +128 -0
  67. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts +41 -0
  68. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts.map +1 -0
  69. package/dist/domain/architecture/no-unused-public-members/member-utilities.js +51 -0
  70. package/dist/domain/architecture/no-unused-public-members/rule.d.ts +5 -0
  71. package/dist/domain/architecture/no-unused-public-members/rule.d.ts.map +1 -0
  72. package/dist/domain/architecture/no-unused-public-members/rule.js +78 -0
  73. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts.map +1 -1
  74. package/dist/domain/core/no-multiple-declarators/rule-utilities.js +13 -19
  75. package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
  76. package/dist/domain/core/no-multiple-declarators/rule.js +4 -5
  77. package/dist/domain/core/no-useless-delegation/rule.d.ts.map +1 -1
  78. package/dist/domain/core/no-useless-delegation/rule.js +5 -6
  79. package/dist/domain/core/prefer-interface-types/autofix.js +4 -5
  80. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -1
  81. package/dist/domain/core/prefer-interface-types/rule-utilities.js +7 -9
  82. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
  83. package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +10 -8
  84. package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -1
  85. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +5 -6
  86. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -1
  87. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +7 -9
  88. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  89. package/dist/domain/docs/no-interface-member-docs/rule.js +2 -5
  90. package/dist/domain/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -1
  91. package/dist/domain/docs/require-example-language/empty-fence-fixes.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 +6 -14
  95. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  96. package/dist/domain/docs/require-example-language/examples.js +7 -16
  97. package/dist/domain/docs/require-example-language/fixes.d.ts.map +1 -1
  98. package/dist/domain/docs/require-example-language/fixes.js +8 -13
  99. package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
  100. package/dist/domain/docs/require-example-language/reporting.js +4 -8
  101. package/dist/domain/docs/require-example-language/types.d.ts +0 -2
  102. package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
  103. package/dist/domain/docs/require-example-language/types.js +1 -1
  104. package/dist/domain/docs/single-line-jsdoc/rule.d.ts.map +1 -1
  105. package/dist/domain/docs/single-line-jsdoc/rule.js +5 -11
  106. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -1
  107. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.js +5 -14
  108. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -1
  109. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +5 -9
  110. package/dist/domain/index.d.ts +2 -2
  111. package/dist/domain/index.d.ts.map +1 -1
  112. package/dist/domain/index.js +3 -3
  113. package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
  114. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
  115. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +2 -5
  116. package/dist/domain/testing/aaa/analyzer.analysis.js +6 -11
  117. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
  118. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +5 -14
  119. package/dist/domain/testing/aaa/analyzer.assertions.js +2 -2
  120. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -1
  121. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +12 -16
  122. package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -1
  123. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +11 -21
  124. package/dist/domain/testing/aaa/analyzer.classification.js +2 -2
  125. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  126. package/dist/domain/testing/aaa/analyzer.super.js +5 -6
  127. package/dist/domain/testing/aaa/types.d.ts +0 -4
  128. package/dist/domain/testing/aaa/types.d.ts.map +1 -1
  129. package/dist/domain/testing/aaa/types.js +1 -1
  130. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
  131. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +2 -7
  132. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
  133. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +4 -5
  134. package/dist/domain/testing/index.d.ts +0 -1
  135. package/dist/domain/testing/index.d.ts.map +1 -1
  136. package/dist/domain/testing/index.js +1 -2
  137. package/dist/domain/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -1
  138. package/dist/domain/testing/prefer-vi-mocked-import/fix.js +9 -7
  139. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -1
  140. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.js +5 -9
  141. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -1
  142. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +2 -7
  143. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -1
  144. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.js +5 -5
  145. package/dist/domain/testing/prefer-vi-mocked-import/match-helpers.js +3 -5
  146. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -1
  147. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.js +13 -18
  148. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts.map +1 -1
  149. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.js +5 -6
  150. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts +0 -2
  151. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts.map +1 -1
  152. package/dist/domain/testing/prefer-vi-mocked-import/types.js +1 -1
  153. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  154. package/dist/domain/testing/require-act-result-capture/rule.js +9 -12
  155. package/dist/domain/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -1
  156. package/dist/domain/testing/require-test-companion/require-test-companion-listeners.js +5 -11
  157. package/dist/domain/testing/require-test-companion/require-test-companion-options.js +6 -7
  158. package/dist/domain/testing/require-test-companion/rule.js +2 -2
  159. package/dist/index.d.ts +1 -1
  160. package/dist/index.d.ts.map +1 -1
  161. package/dist/index.js +2 -2
  162. package/dist/infrastructure/codeperfect-plugin.d.ts +2 -2
  163. package/dist/infrastructure/codeperfect-plugin.js +3 -3
  164. package/dist/infrastructure/presets.js +3 -3
  165. package/package.json +26 -27
  166. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts +0 -2
  167. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts.map +0 -1
  168. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.js +0 -2
  169. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts +0 -29
  170. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts.map +0 -1
  171. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.js +0 -200
  172. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts +0 -12
  173. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts.map +0 -1
  174. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.js +0 -151
  175. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts +0 -16
  176. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts.map +0 -1
  177. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.js +0 -109
  178. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts +0 -5
  179. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +0 -1
  180. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +0 -41
@@ -0,0 +1,101 @@
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
+ for (const property of checker.getPropertiesOfType(type)) {
25
+ if (isSameSymbol(resolveCanonicalSymbol(property, checker), targetSymbol) ||
26
+ typeContainsSymbol(checker.getTypeOfSymbolAtLocation(property, location), targetSymbol, checker, location, visitedTypes, depth - 1)) {
27
+ return true;
28
+ }
29
+ }
30
+ return false;
31
+ };
32
+ /**
33
+ * Checks whether a member is reachable from a configured public API export.
34
+ * @param program TypeScript project program.
35
+ * @param state Normalized public API and test patterns.
36
+ * @param repoRoot Root directory used for glob matching.
37
+ * @param memberSymbol Member symbol being checked.
38
+ * @returns True when an API export exposes the member.
39
+ * @example
40
+ * ```typescript
41
+ * const exposed = isPublicApiMember(program, state, repoRoot, memberSymbol);
42
+ * ```
43
+ */
44
+ const isPublicApiMember = (program, state, repoRoot, memberSymbol) => {
45
+ const checker = program.getTypeChecker();
46
+ const targetSymbol = resolveCanonicalSymbol(memberSymbol, checker);
47
+ const normalizedRoot = path.resolve(repoRoot);
48
+ for (const sourceFile of program.getSourceFiles()) {
49
+ if (sourceFile.isDeclarationFile) {
50
+ continue;
51
+ }
52
+ const filename = path.resolve(sourceFile.fileName);
53
+ if (!isPublicApiFile(filename, state, normalizedRoot) ||
54
+ isTestFile(filename, state, normalizedRoot)) {
55
+ continue;
56
+ }
57
+ const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
58
+ if (moduleSymbol === void 0) {
59
+ continue;
60
+ }
61
+ for (const exportedSymbol of checker.getExportsOfModule(moduleSymbol)) {
62
+ const canonicalExport = resolveCanonicalSymbol(exportedSymbol, checker);
63
+ if (isSameSymbol(canonicalExport, targetSymbol) ||
64
+ typeContainsSymbol(checker.getTypeOfSymbolAtLocation(canonicalExport, sourceFile), targetSymbol, checker, sourceFile, new Set(), 3)) {
65
+ return true;
66
+ }
67
+ }
68
+ }
69
+ return false;
70
+ };
71
+ /**
72
+ * Checks whether a host is exported from a configured public API file.
73
+ * @param program TypeScript project program.
74
+ * @param state Normalized public API and test patterns.
75
+ * @param repoRoot Root directory used for glob matching.
76
+ * @param hostSymbol Host declaration symbol.
77
+ * @returns True when the host is exposed by a non-test API file.
78
+ * @example
79
+ * ```typescript
80
+ * const isPublic = isPublicApiHost(program, state, repoRoot, hostSymbol);
81
+ * ```
82
+ */
83
+ const isPublicApiHost = (program, state, repoRoot, hostSymbol) => {
84
+ if (hostSymbol === void 0) {
85
+ return false;
86
+ }
87
+ const checker = program.getTypeChecker();
88
+ const normalizedRoot = path.resolve(repoRoot);
89
+ const canonicalHost = resolveCanonicalSymbol(hostSymbol, checker);
90
+ return program.getSourceFiles().some((sourceFile) => {
91
+ if (sourceFile.isDeclarationFile) {
92
+ return false;
93
+ }
94
+ const filename = path.resolve(sourceFile.fileName);
95
+ return (isPublicApiFile(filename, state, normalizedRoot) &&
96
+ !isTestFile(filename, state, normalizedRoot) &&
97
+ sourceFileExportsSymbol(sourceFile, checker, canonicalHost));
98
+ });
99
+ };
100
+ export { isPublicApiHost, isPublicApiMember };
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXB1YmxpYy1hcGktdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci1wdWJsaWMtYXBpLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJakMsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEdBQ1gsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLHNCQUFzQixFQUN0Qix1QkFBdUIsR0FDeEIsTUFBTSx5REFBeUQsQ0FBQztBQUVqRTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixJQUFhLEVBQ2IsWUFBdUIsRUFDdkIsT0FBdUIsRUFDdkIsUUFBaUIsRUFDakIsWUFBMEIsRUFDMUIsS0FBYSxFQUNKLEVBQUU7SUFDWCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6RCxJQUNFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDO1lBQ3JFLGtCQUFrQixDQUNoQixPQUFPLENBQUMseUJBQXlCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUNyRCxZQUFZLEVBQ1osT0FBTyxFQUNQLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxH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LEVBQUUsY0FBYyxDQUFDO1lBQzVDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQzVELENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbmltcG9ydCB0eXBlIHsgTm9VbnVzZWRFeHBvcnRzU3RhdGUgfSBmcm9tIFwiLi4vbm8tdW51c2VkLWV4cG9ydHMvdHlwZXNcIjtcblxuaW1wb3J0IHtcbiAgaXNQdWJsaWNBcGlGaWxlLFxuICBpc1Rlc3RGaWxlLFxufSBmcm9tIFwiLi4vbm8tdW51c2VkLWV4cG9ydHMvbm8tdW51c2VkLWV4cG9ydHMtb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgaXNTYW1lU3ltYm9sLFxuICByZXNvbHZlQ2Fub25pY2FsU3ltYm9sLFxuICBzb3VyY2VGaWxlRXhwb3J0c1N5bWJvbCxcbn0gZnJvbSBcIi4uL25vLXVudXNlZC1leHBvcnRzL25vLXVudXNlZC1leHBvcnRzLXN5bWJvbC11dGlsaXRpZXNcIjtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHN5bWJvbCBpcyBuZXN0ZWQgd2l0aGluIGFuIGV4cG9ydGVkIEFQSSB0eXBlLlxuICogQHBhcmFtIHR5cGUgVHlwZSBzaGFwZSBvZiBhbiBleHBvcnRlZCB2YWx1ZSBvciB0eXBlLlxuICogQHBhcmFtIHRhcmdldFN5bWJvbCBTeW1ib2wgYmVpbmcgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gbG9jYXRpb24gTm9kZSB1c2VkIHRvIHJlc29sdmUgcHJvcGVydHkgdHlwZXMuXG4gKiBAcGFyYW0gdmlzaXRlZFR5cGVzIFR5cGVzIGFscmVhZHkgY2hlY2tlZCBvbiB0aGlzIHNlYXJjaCBwYXRoLlxuICogQHBhcmFtIGRlcHRoIFJlbWFpbmluZyBuZXN0ZWQgcHJvcGVydHkgZGVwdGguXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHRhcmdldCBvY2N1cnMgaW4gdGhlIGV4cG9ydGVkIHR5cGUgc2hhcGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZXhwb3NlZCA9IHR5cGVDb250YWluc1N5bWJvbCh0eXBlLCBtZW1iZXIsIGNoZWNrZXIsIHNvdXJjZUZpbGUsIG5ldyBTZXQoKSwgMik7XG4gKiBgYGBcbiAqL1xuY29uc3QgdHlwZUNvbnRhaW5zU3ltYm9sID0gKFxuICB0eXBlOiB0cy5UeXBlLFxuICB0YXJnZXRTeW1ib2w6IHRzLlN5bWJvbCxcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIGxvY2F0aW9uOiB0cy5Ob2RlLFxuICB2aXNpdGVkVHlwZXM6IFNldDx0cy5UeXBlPixcbiAgZGVwdGg6IG51bWJlcixcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGVwdGggPCAwIHx8IHZpc2l0ZWRUeXBlcy5oYXModHlwZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2aXNpdGVkVHlwZXMuYWRkKHR5cGUpO1xuXG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY2hlY2tlci5nZXRQcm9wZXJ0aWVzT2ZUeXBlKHR5cGUpKSB7XG4gICAgaWYgKFxuICAgICAgaXNTYW1lU3ltYm9sKHJlc29sdmVDYW5vbmljYWxTeW1ib2wocHJvcGVydHksIGNoZWNrZXIpLCB0YXJnZXRTeW1ib2wpIHx8XG4gICAgICB0eXBlQ29udGFpbnNTeW1ib2woXG4gICAgICAgIGNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihwcm9wZXJ0eSwgbG9jYXRpb24pLFxuICAgICAgICB0YXJnZXRTeW1ib2wsXG4gICAgICAgIGNoZWNrZXIsXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICB2aXNpdGVkVHlwZXMsXG4gICAgICAgIGRlcHRoIC0gMSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBtZW1iZXIgaXMgcmVhY2hhYmxlIGZyb20gYSBjb25maWd1cmVkIHB1YmxpYyBBUEkgZXhwb3J0LlxuICogQHBhcmFtIHByb2dyYW0gVHlwZVNjcmlwdCBwcm9qZWN0IHByb2dyYW0uXG4gKiBAcGFyYW0gc3RhdGUgTm9ybWFsaXplZCBwdWJsaWMgQVBJIGFuZCB0ZXN0IHBhdHRlcm5zLlxuICogQHBhcmFtIHJlcG9Sb290IFJvb3QgZGlyZWN0b3J5IHVzZWQgZm9yIGdsb2IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0gbWVtYmVyU3ltYm9sIE1lbWJlciBzeW1ib2wgYmVpbmcgY2hlY2tlZC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiBhbiBBUEkgZXhwb3J0IGV4cG9zZXMgdGhlIG1lbWJlci5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleHBvc2VkID0gaXNQdWJsaWNBcGlNZW1iZXIocHJvZ3JhbSwgc3RhdGUsIHJlcG9Sb290LCBtZW1iZXJTeW1ib2wpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzUHVibGljQXBpTWVtYmVyID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBzdGF0ZTogTm9VbnVzZWRFeHBvcnRzU3RhdGUsXG4gIHJlcG9Sb290OiBzdHJpbmcsXG4gIG1lbWJlclN5bWJvbDogdHMuU3ltYm9sLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IHRhcmdldFN5bWJvbCA9IHJlc29sdmVDYW5vbmljYWxTeW1ib2wobWVtYmVyU3ltYm9sLCBjaGVja2VyKTtcbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3QpO1xuXG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLnJlc29sdmUoc291cmNlRmlsZS5maWxlTmFtZSk7XG5cbiAgICBpZiAoXG4gICAgICAhaXNQdWJsaWNBcGlGaWxlKGZpbGVuYW1lLCBzdGF0ZSwgbm9ybWFsaXplZFJvb3QpIHx8XG4gICAgICBpc1Rlc3RGaWxlKGZpbGVuYW1lLCBzdGF0ZSwgbm9ybWFsaXplZFJvb3QpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGVTeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oc291cmNlRmlsZSk7XG5cbiAgICBpZiAobW9kdWxlU3ltYm9sID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXhwb3J0ZWRTeW1ib2wgb2YgY2hlY2tlci5nZXRFeHBvcnRzT2ZNb2R1bGUobW9kdWxlU3ltYm9sKSkge1xuICAgICAgY29uc3QgY2Fub25pY2FsRXhwb3J0ID0gcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbChleHBvcnRlZFN5bWJvbCwgY2hlY2tlcik7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTYW1lU3ltYm9sKGNhbm9uaWNhbEV4cG9ydCwgdGFyZ2V0U3ltYm9sKSB8fFxuICAgICAgICB0eXBlQ29udGFpbnNTeW1ib2woXG4gICAgICAgICAgY2hlY2tlci5nZXRUeXBlT2ZTeW1ib2xBdExvY2F0aW9uKGNhbm9uaWNhbEV4cG9ydCwgc291cmNlRmlsZSksXG4gICAgICAgICAgdGFyZ2V0U3ltYm9sLFxuICAgICAgICAgIGNoZWNrZXIsXG4gICAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgICBuZXcgU2V0KCksXG4gICAgICAgICAgMyxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBob3N0IGlzIGV4cG9ydGVkIGZyb20gYSBjb25maWd1cmVkIHB1YmxpYyBBUEkgZmlsZS5cbiAqIEBwYXJhbSBwcm9ncmFtIFR5cGVTY3JpcHQgcHJvamVjdCBwcm9ncmFtLlxuICogQHBhcmFtIHN0YXRlIE5vcm1hbGl6ZWQgcHVibGljIEFQSSBhbmQgdGVzdCBwYXR0ZXJucy5cbiAqIEBwYXJhbSByZXBvUm9vdCBSb290IGRpcmVjdG9yeSB1c2VkIGZvciBnbG9iIG1hdGNoaW5nLlxuICogQHBhcmFtIGhvc3RTeW1ib2wgSG9zdCBkZWNsYXJhdGlvbiBzeW1ib2wuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGhvc3QgaXMgZXhwb3NlZCBieSBhIG5vbi10ZXN0IEFQSSBmaWxlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGlzUHVibGljID0gaXNQdWJsaWNBcGlIb3N0KHByb2dyYW0sIHN0YXRlLCByZXBvUm9vdCwgaG9zdFN5bWJvbCk7XG4gKiBgYGBcbiAqL1xuY29uc3QgaXNQdWJsaWNBcGlIb3N0ID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBzdGF0ZTogTm9VbnVzZWRFeHBvcnRzU3RhdGUsXG4gIHJlcG9Sb290OiBzdHJpbmcsXG4gIGhvc3RTeW1ib2w6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoaG9zdFN5bWJvbCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3QpO1xuICBjb25zdCBjYW5vbmljYWxIb3N0ID0gcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbChob3N0U3ltYm9sLCBjaGVja2VyKTtcblxuICByZXR1cm4gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpLnNvbWUoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5yZXNvbHZlKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGlzUHVibGljQXBpRmlsZShmaWxlbmFtZSwgc3RhdGUsIG5vcm1hbGl6ZWRSb290KSAmJlxuICAgICAgIWlzVGVzdEZpbGUoZmlsZW5hbWUsIHN0YXRlLCBub3JtYWxpemVkUm9vdCkgJiZcbiAgICAgIHNvdXJjZUZpbGVFeHBvcnRzU3ltYm9sKHNvdXJjZUZpbGUsIGNoZWNrZXIsIGNhbm9uaWNhbEhvc3QpXG4gICAgKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgeyBpc1B1YmxpY0FwaUhvc3QsIGlzUHVibGljQXBpTWVtYmVyIH07XG4iXX0=
@@ -0,0 +1,28 @@
1
+ import * as ts from "typescript";
2
+ import type { PublicMember } from "./member-declaration-utilities.js";
3
+ /**
4
+ * Checks whether an object property is supplied to a typed call boundary.
5
+ * @param node Candidate property assignment.
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;AA0FnE;;;;;;;;;;GAUG;AACH,QAAA,MAAM,oBAAoB,GACxB,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,KACnB,OA8BF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,uBAAuB,GAC3B,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,KACnB,OAkDF,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,125 @@
1
+ import * as ts from "typescript";
2
+ import { getContextualPropertyType, isMemberHandoff, } from "./member-usage-type-utilities.js";
3
+ /**
4
+ * Finds a call argument's resolved parameter type.
5
+ * @param call Call expression containing the argument.
6
+ * @param argument Argument expression to inspect.
7
+ * @param checker TypeScript type checker.
8
+ * @returns Parameter type when TypeScript resolves the call.
9
+ * @example
10
+ * ```typescript
11
+ * const parameterType = getCallArgumentType(call, argument, checker);
12
+ * ```
13
+ */
14
+ const getCallArgumentType = (call, argument, checker) => {
15
+ const contextualType = checker.getContextualType(argument);
16
+ if (contextualType !== void 0) {
17
+ return contextualType;
18
+ }
19
+ const argumentIndex = call.arguments.indexOf(argument);
20
+ const signature = checker.getResolvedSignature(call);
21
+ const parameter = signature === void 0 ? void 0 : signature.parameters[argumentIndex];
22
+ return parameter === void 0
23
+ ? void 0
24
+ : checker.getTypeOfSymbolAtLocation(parameter, call);
25
+ };
26
+ /**
27
+ * Checks whether a contextual property comes from an external declaration.
28
+ * @param objectType Contextual type of the containing object literal.
29
+ * @param propertyName Property name in the object literal.
30
+ * @param checker TypeScript type checker.
31
+ * @returns True when the contract is declared outside the project source.
32
+ * @example
33
+ * ```typescript
34
+ * const external = isExternalPropertyContract(objectType, "docs", checker);
35
+ * ```
36
+ */
37
+ const isExternalPropertyContract = (objectType, propertyName, checker) => {
38
+ const property = objectType === void 0
39
+ ? void 0
40
+ : checker.getPropertyOfType(objectType, propertyName);
41
+ return (property?.declarations?.some((declaration) => declaration.getSourceFile().isDeclarationFile) ?? false);
42
+ };
43
+ /**
44
+ * Checks whether a call resolves to a declaration with a local implementation.
45
+ * @param call Call expression to inspect.
46
+ * @param checker TypeScript type checker.
47
+ * @returns True when the resolved declaration has a body.
48
+ * @example
49
+ * ```typescript
50
+ * const implemented = hasCallImplementation(call, checker);
51
+ * ```
52
+ */
53
+ const hasCallImplementation = (call, checker) => {
54
+ const declaration = checker.getResolvedSignature(call)?.getDeclaration();
55
+ return (declaration !== void 0 &&
56
+ "body" in declaration &&
57
+ declaration.body !== void 0);
58
+ };
59
+ /**
60
+ * Checks whether an object property is supplied to a typed call boundary.
61
+ * @param node Candidate property assignment.
62
+ * @param checker TypeScript type checker.
63
+ * @param member Member whose usage is being checked.
64
+ * @returns True when an external call contract accepts the member shape.
65
+ * @example
66
+ * ```typescript
67
+ * const used = isCallArgumentMember(node, checker, member);
68
+ * ```
69
+ */
70
+ const isCallArgumentMember = (node, checker, member) => {
71
+ if (!ts.isPropertyAssignment(node) ||
72
+ (!ts.isIdentifier(node.name) && !ts.isStringLiteralLike(node.name)) ||
73
+ !ts.isObjectLiteralExpression(node.parent)) {
74
+ return false;
75
+ }
76
+ const call = node.parent.parent;
77
+ if (!ts.isCallExpression(call) ||
78
+ hasCallImplementation(call, checker) ||
79
+ !call.arguments.some((argument) => argument === node.parent)) {
80
+ return false;
81
+ }
82
+ const targetType = getCallArgumentType(call, node.parent, checker);
83
+ return (node.name.text === member.memberName &&
84
+ isMemberHandoff(checker.getTypeAtLocation(node.parent), targetType, member, checker));
85
+ };
86
+ /**
87
+ * Checks whether a property value is forwarded into an external object contract.
88
+ * @param node Candidate outer object property.
89
+ * @param checker TypeScript type checker.
90
+ * @param member Member whose host value is being forwarded.
91
+ * @returns True when the receiving property accepts the host shape.
92
+ * @example
93
+ * ```typescript
94
+ * const used = isObjectContractHandoff(node, checker, member);
95
+ * ```
96
+ */
97
+ const isObjectContractHandoff = (node, checker, member) => {
98
+ if (ts.isPropertyAssignment(node) &&
99
+ ts.isObjectLiteralExpression(node.parent)) {
100
+ const name = node.name;
101
+ if (!ts.isIdentifier(name) && !ts.isStringLiteralLike(name)) {
102
+ return false;
103
+ }
104
+ const objectType = checker.getContextualType(node.parent);
105
+ if (!isExternalPropertyContract(objectType, name.text, checker)) {
106
+ return false;
107
+ }
108
+ const sourceType = checker.getTypeAtLocation(node.initializer);
109
+ const targetType = getContextualPropertyType(objectType, name.text, node, checker);
110
+ return isMemberHandoff(sourceType, targetType, member, checker);
111
+ }
112
+ if (ts.isShorthandPropertyAssignment(node) &&
113
+ ts.isObjectLiteralExpression(node.parent)) {
114
+ const objectType = checker.getContextualType(node.parent);
115
+ if (!isExternalPropertyContract(objectType, node.name.text, checker)) {
116
+ return false;
117
+ }
118
+ const sourceType = checker.getTypeAtLocation(node.name);
119
+ const targetType = getContextualPropertyType(objectType, node.name.text, node, checker);
120
+ return isMemberHandoff(sourceType, targetType, member, checker);
121
+ }
122
+ return false;
123
+ };
124
+ export { isCallArgumentMember, isObjectContractHandoff };
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLWhhbmRvZmYtdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci11c2FnZS1oYW5kb2ZmLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUlqQyxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGVBQWUsR0FDaEIsTUFBTSwrQkFBK0IsQ0FBQztBQUV2Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixJQUF1QixFQUN2QixRQUF1QixFQUN2QixPQUF1QixFQUNGLEVBQUU7SUFDdkIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTNELElBQUksY0FBYyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxNQUFNLFNBQVMsR0FDYixTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRXRFLE9BQU8sU0FBUyxLQUFLLEtBQUssQ0FBQztRQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ1IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7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QUVGLE9BQU8sZUFBZSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHR5cGUgeyBQdWJsaWNNZW1iZXIgfSBmcm9tIFwiLi9tZW1iZXItZGVjbGFyYXRpb24tdXRpbGl0aWVzXCI7XG5cbmltcG9ydCB7XG4gIGdldENvbnRleHR1YWxQcm9wZXJ0eVR5cGUsXG4gIGlzTWVtYmVySGFuZG9mZixcbn0gZnJvbSBcIi4vbWVtYmVyLXVzYWdlLXR5cGUtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogRmluZHMgYSBjYWxsIGFyZ3VtZW50J3MgcmVzb2x2ZWQgcGFyYW1ldGVyIHR5cGUuXG4gKiBAcGFyYW0gY2FsbCBDYWxsIGV4cHJlc3Npb24gY29udGFpbmluZyB0aGUgYXJndW1lbnQuXG4gKiBAcGFyYW0gYXJndW1lbnQgQXJndW1lbnQgZXhwcmVzc2lvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJucyBQYXJhbWV0ZXIgdHlwZSB3aGVuIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdGhlIGNhbGwuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcGFyYW1ldGVyVHlwZSA9IGdldENhbGxBcmd1bWVudFR5cGUoY2FsbCwgYXJndW1lbnQsIGNoZWNrZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldENhbGxBcmd1bWVudFR5cGUgPSAoXG4gIGNhbGw6IHRzLkNhbGxFeHByZXNzaW9uLFxuICBhcmd1bWVudDogdHMuRXhwcmVzc2lvbixcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4pOiB0cy5UeXBlIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgY29udGV4dHVhbFR5cGUgPSBjaGVja2VyLmdldENvbnRleHR1YWxUeXBlKGFyZ3VtZW50KTtcblxuICBpZiAoY29udGV4dHVhbFR5cGUgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBjb250ZXh0dWFsVHlwZTtcbiAgfVxuXG4gIGNvbnN0IGFyZ3VtZW50SW5kZXggPSBjYWxsLmFyZ3VtZW50cy5pbmRleE9mKGFyZ3VtZW50KTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gY2hlY2tlci5nZXRSZXNvbHZlZFNpZ25hdHVyZShjYWxsKTtcbiAgY29uc3QgcGFyYW1ldGVyID1cbiAgICBzaWduYXR1cmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNpZ25hdHVyZS5wYXJhbWV0ZXJzW2FyZ3VtZW50SW5kZXhdO1xuXG4gIHJldHVybiBwYXJhbWV0ZXIgPT09IHZvaWQgMFxuICAgID8gdm9pZCAwXG4gICAgOiBjaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24ocGFyYW1ldGVyLCBjYWxsKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjb250ZXh0dWFsIHByb3BlcnR5IGNvbWVzIGZyb20gYW4gZXh0ZXJuYWwgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gb2JqZWN0VHlwZSBDb250ZXh0dWFsIHR5cGUgb2YgdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGxpdGVyYWwuXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IG5hbWUgaW4gdGhlIG9iamVjdCBsaXRlcmFsLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGNvbnRyYWN0IGlzIGRlY2xhcmVkIG91dHNpZGUgdGhlIHByb2plY3Qgc291cmNlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGV4dGVybmFsID0gaXNFeHRlcm5hbFByb3BlcnR5Q29udHJhY3Qob2JqZWN0VHlwZSwgXCJkb2NzXCIsIGNoZWNrZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzRXh0ZXJuYWxQcm9wZXJ0eUNvbnRyYWN0ID0gKFxuICBvYmplY3RUeXBlOiB0cy5UeXBlIHwgdW5kZWZpbmVkLFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgcHJvcGVydHkgPVxuICAgIG9iamVjdFR5cGUgPT09IHZvaWQgMFxuICAgICAgPyB2b2lkIDBcbiAgICAgIDogY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShvYmplY3RUeXBlLCBwcm9wZXJ0eU5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgcHJvcGVydHk/LmRlY2xhcmF0aW9ucz8uc29tZShcbiAgICAgIChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpLmlzRGVjbGFyYXRpb25GaWxlLFxuICAgICkgPz8gZmFsc2VcbiAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjYWxsIHJlc29sdmVzIHRvIGEgZGVjbGFyYXRpb24gd2l0aCBhIGxvY2FsIGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIGNhbGwgQ2FsbCBleHByZXNzaW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgcmVzb2x2ZWQgZGVjbGFyYXRpb24gaGFzIGEgYm9keS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBpbXBsZW1lbnRlZCA9IGhhc0NhbGxJbXBsZW1lbnRhdGlvbihjYWxsLCBjaGVja2VyKTtcbiAqIGBgYFxuICovXG5jb25zdCBoYXNDYWxsSW1wbGVtZW50YXRpb24gPSAoXG4gIGNhbGw6IHRzLkNhbGxFeHByZXNzaW9uLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IGNoZWNrZXIuZ2V0UmVzb2x2ZWRTaWduYXR1cmUoY2FsbCk/LmdldERlY2xhcmF0aW9uKCk7XG5cbiAgcmV0dXJuIChcbiAgICBkZWNsYXJhdGlvbiAhPT0gdm9pZCAwICYmXG4gICAgXCJib2R5XCIgaW4gZGVjbGFyYXRpb24gJiZcbiAgICBkZWNsYXJhdGlvbi5ib2R5ICE9PSB2b2lkIDBcbiAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gb2JqZWN0IHByb3BlcnR5IGlzIHN1cHBsaWVkIHRvIGEgdHlwZWQgY2FsbCBib3VuZGFyeS5cbiAqIEBwYXJhbSBub2RlIENhbmRpZGF0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50LlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gbWVtYmVyIE1lbWJlciB3aG9zZSB1c2FnZSBpcyBiZWluZyBjaGVja2VkLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGFuIGV4dGVybmFsIGNhbGwgY29udHJhY3QgYWNjZXB0cyB0aGUgbWVtYmVyIHNoYXBlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVzZWQgPSBpc0NhbGxBcmd1bWVudE1lbWJlcihub2RlLCBjaGVja2VyLCBtZW1iZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzQ2FsbEFyZ3VtZW50TWVtYmVyID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbWVtYmVyOiBQdWJsaWNNZW1iZXIsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKFxuICAgICF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChub2RlKSB8fFxuICAgICghdHMuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbExpa2Uobm9kZS5uYW1lKSkgfHxcbiAgICAhdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLnBhcmVudClcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY2FsbCA9IG5vZGUucGFyZW50LnBhcmVudDtcblxuICBpZiAoXG4gICAgIXRzLmlzQ2FsbEV4cHJlc3Npb24oY2FsbCkgfHxcbiAgICBoYXNDYWxsSW1wbGVtZW50YXRpb24oY2FsbCwgY2hlY2tlcikgfHxcbiAgICAhY2FsbC5hcmd1bWVudHMuc29tZSgoYXJndW1lbnQpID0+IGFyZ3VtZW50ID09PSBub2RlLnBhcmVudClcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldENhbGxBcmd1bWVudFR5cGUoY2FsbCwgbm9kZS5wYXJlbnQsIGNoZWNrZXIpO1xuXG4gIHJldHVybiAoXG4gICAgbm9kZS5uYW1lLnRleHQgPT09IG1lbWJlci5tZW1iZXJOYW1lICYmXG4gICAgaXNNZW1iZXJIYW5kb2ZmKFxuICAgICAgY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihub2RlLnBhcmVudCksXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgbWVtYmVyLFxuICAgICAgY2hlY2tlcixcbiAgICApXG4gICk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgcHJvcGVydHkgdmFsdWUgaXMgZm9yd2FyZGVkIGludG8gYW4gZXh0ZXJuYWwgb2JqZWN0IGNvbnRyYWN0LlxuICogQHBhcmFtIG5vZGUgQ2FuZGlkYXRlIG91dGVyIG9iamVjdCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHBhcmFtIG1lbWJlciBNZW1iZXIgd2hvc2UgaG9zdCB2YWx1ZSBpcyBiZWluZyBmb3J3YXJkZWQuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHJlY2VpdmluZyBwcm9wZXJ0eSBhY2NlcHRzIHRoZSBob3N0IHNoYXBlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVzZWQgPSBpc09iamVjdENvbnRyYWN0SGFuZG9mZihub2RlLCBjaGVja2VyLCBtZW1iZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzT2JqZWN0Q29udHJhY3RIYW5kb2ZmID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbWVtYmVyOiBQdWJsaWNNZW1iZXIsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKFxuICAgIHRzLmlzUHJvcGVydHlBc3NpZ25tZW50KG5vZGUpICYmXG4gICAgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLnBhcmVudClcbiAgKSB7XG4gICAgY29uc3QgbmFtZSA9IG5vZGUubmFtZTtcblxuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKG5hbWUpICYmICF0cy5pc1N0cmluZ0xpdGVyYWxMaWtlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqZWN0VHlwZSA9IGNoZWNrZXIuZ2V0Q29udGV4dHVhbFR5cGUobm9kZS5wYXJlbnQpO1xuXG4gICAgaWYgKCFpc0V4dGVybmFsUHJvcGVydHlDb250cmFjdChvYmplY3RUeXBlLCBuYW1lLnRleHQsIGNoZWNrZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlVHlwZSA9IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24obm9kZS5pbml0aWFsaXplcik7XG4gICAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldENvbnRleHR1YWxQcm9wZXJ0eVR5cGUoXG4gICAgICBvYmplY3RUeXBlLFxuICAgICAgbmFtZS50ZXh0LFxuICAgICAgbm9kZSxcbiAgICAgIGNoZWNrZXIsXG4gICAgKTtcblxuICAgIHJldHVybiBpc01lbWJlckhhbmRvZmYoc291cmNlVHlwZSwgdGFyZ2V0VHlwZSwgbWVtYmVyLCBjaGVja2VyKTtcbiAgfVxuXG4gIGlmIChcbiAgICB0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChub2RlKSAmJlxuICAgIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5wYXJlbnQpXG4gICkge1xuICAgIGNvbnN0IG9iamVjdFR5cGUgPSBjaGVja2VyLmdldENvbnRleHR1YWxUeXBlKG5vZGUucGFyZW50KTtcblxuICAgIGlmICghaXNFeHRlcm5hbFByb3BlcnR5Q29udHJhY3Qob2JqZWN0VHlwZSwgbm9kZS5uYW1lLnRleHQsIGNoZWNrZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlVHlwZSA9IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24obm9kZS5uYW1lKTtcbiAgICBjb25zdCB0YXJnZXRUeXBlID0gZ2V0Q29udGV4dHVhbFByb3BlcnR5VHlwZShcbiAgICAgIG9iamVjdFR5cGUsXG4gICAgICBub2RlLm5hbWUudGV4dCxcbiAgICAgIG5vZGUsXG4gICAgICBjaGVja2VyLFxuICAgICk7XG5cbiAgICByZXR1cm4gaXNNZW1iZXJIYW5kb2ZmKHNvdXJjZVR5cGUsIHRhcmdldFR5cGUsIG1lbWJlciwgY2hlY2tlcik7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgeyBpc0NhbGxBcmd1bWVudE1lbWJlciwgaXNPYmplY3RDb250cmFjdEhhbmRvZmYgfTtcbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import * as ts from "typescript";
2
+ import type { PublicMember } from "./member-declaration-utilities.js";
3
+ /**
4
+ * Checks whether a property read uses a structurally related host shape.
5
+ * @param node Candidate read node.
6
+ * @param checker TypeScript type checker.
7
+ * @param member Member whose usage is being checked.
8
+ * @returns True when the read resolves through a structural contract.
9
+ * @example
10
+ * ```typescript
11
+ * const used = isStructuralPropertyRead(node, checker, member);
12
+ * ```
13
+ */
14
+ declare const isStructuralPropertyRead: (node: ts.Node, checker: ts.TypeChecker, member: PublicMember) => boolean;
15
+ /**
16
+ * Checks whether a computed property access resolves to a member symbol.
17
+ * @param node Candidate element access expression.
18
+ * @param checker TypeScript type checker.
19
+ * @param member Member whose usage is being checked.
20
+ * @param relatedSymbols Member and contract symbols accepted as usage.
21
+ * @returns True when a resolved key selects the member.
22
+ * @example
23
+ * ```typescript
24
+ * const used = isComputedMemberRead(node, checker, member, relatedSymbols);
25
+ * ```
26
+ */
27
+ declare const isComputedMemberRead: (node: ts.Node, checker: ts.TypeChecker, member: PublicMember, relatedSymbols: ts.Symbol[]) => boolean;
28
+ export { isComputedMemberRead, isStructuralPropertyRead };
29
+ //# sourceMappingURL=member-usage-reference-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member-usage-reference-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-reference-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AA8DnE;;;;;;;;;;GAUG;AACH,QAAA,MAAM,wBAAwB,GAC5B,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,KACnB,OAQF,CAAC;AAyBF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,oBAAoB,GACxB,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,EACvB,QAAQ,YAAY,EACpB,gBAAgB,EAAE,CAAC,MAAM,EAAE,KAC1B,OAqBF,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,108 @@
1
+ import * as ts from "typescript";
2
+ import { isSameSymbol } from "../no-unused-exports/no-unused-exports-symbol-utilities.js";
3
+ import { hasCompatibleMemberShape } from "./member-usage-type-utilities.js";
4
+ /**
5
+ * Gets the source type and key for a property read or destructuring use.
6
+ * @param node Candidate member-name node.
7
+ * @param checker TypeScript type checker.
8
+ * @returns Access details when the node reads a property.
9
+ * @example
10
+ * ```typescript
11
+ * const access = getPropertyAccess(node, checker);
12
+ * ```
13
+ */
14
+ const getPropertyAccess = (node, checker) => {
15
+ const parent = node.parent;
16
+ if (ts.isPropertyAccessExpression(parent) && parent.name === node) {
17
+ return {
18
+ name: parent.name.text,
19
+ sourceType: checker.getTypeAtLocation(parent.expression),
20
+ };
21
+ }
22
+ if (ts.isBindingElement(parent) &&
23
+ (parent.name === node || parent.propertyName === node) &&
24
+ ts.isObjectBindingPattern(parent.parent)) {
25
+ const owner = parent.parent.parent;
26
+ const sourceType = ts.isVariableDeclaration(owner)
27
+ ? owner.initializer === void 0
28
+ ? void 0
29
+ : checker.getTypeAtLocation(owner.initializer)
30
+ : ts.isParameter(owner)
31
+ ? checker.getTypeAtLocation(owner)
32
+ : void 0;
33
+ const nameNode = parent.propertyName ?? parent.name;
34
+ return sourceType === void 0
35
+ ? void 0
36
+ : ts.isIdentifier(nameNode) || ts.isStringLiteralLike(nameNode)
37
+ ? { name: nameNode.text, sourceType }
38
+ : void 0;
39
+ }
40
+ return void 0;
41
+ };
42
+ /**
43
+ * Checks whether a property read uses a structurally related host shape.
44
+ * @param node Candidate read node.
45
+ * @param checker TypeScript type checker.
46
+ * @param member Member whose usage is being checked.
47
+ * @returns True when the read resolves through a structural contract.
48
+ * @example
49
+ * ```typescript
50
+ * const used = isStructuralPropertyRead(node, checker, member);
51
+ * ```
52
+ */
53
+ const isStructuralPropertyRead = (node, checker, member) => {
54
+ const access = getPropertyAccess(node, checker);
55
+ return (access !== void 0 &&
56
+ access.name === member.memberName &&
57
+ hasCompatibleMemberShape(access.sourceType, member, checker));
58
+ };
59
+ /**
60
+ * Gets the literal string keys represented by a TypeScript key type.
61
+ * @param type Key type from an element access expression.
62
+ * @returns Literal keys represented by the type.
63
+ * @example
64
+ * ```typescript
65
+ * const keys = getStringLiteralKeys(keyType);
66
+ * ```
67
+ */
68
+ const getStringLiteralKeys = (type) => {
69
+ if (type.isUnionOrIntersection()) {
70
+ return type.types.flatMap((part) => getStringLiteralKeys(part));
71
+ }
72
+ if ((type.flags & ts.TypeFlags.StringLiteral) !== 0) {
73
+ return [type.value];
74
+ }
75
+ return (type.flags & ts.TypeFlags.NumberLiteral) === 0
76
+ ? []
77
+ : [type.value.toFixed(0)];
78
+ };
79
+ /**
80
+ * Checks whether a computed property access resolves to a member symbol.
81
+ * @param node Candidate element access expression.
82
+ * @param checker TypeScript type checker.
83
+ * @param member Member whose usage is being checked.
84
+ * @param relatedSymbols Member and contract symbols accepted as usage.
85
+ * @returns True when a resolved key selects the member.
86
+ * @example
87
+ * ```typescript
88
+ * const used = isComputedMemberRead(node, checker, member, relatedSymbols);
89
+ * ```
90
+ */
91
+ const isComputedMemberRead = (node, checker, member, relatedSymbols) => {
92
+ if (!ts.isElementAccessExpression(node)) {
93
+ return false;
94
+ }
95
+ const objectType = checker.getTypeAtLocation(node.expression);
96
+ const keyType = checker.getTypeAtLocation(node.argumentExpression);
97
+ return getStringLiteralKeys(keyType).some((name) => {
98
+ if (name !== member.memberName) {
99
+ return false;
100
+ }
101
+ const property = checker.getPropertyOfType(objectType, name);
102
+ return (property !== void 0 &&
103
+ (relatedSymbols.some((symbol) => isSameSymbol(symbol, property)) ||
104
+ hasCompatibleMemberShape(objectType, member, checker)));
105
+ });
106
+ };
107
+ export { isComputedMemberRead, isStructuralPropertyRead };
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLXJlZmVyZW5jZS11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL2FyY2hpdGVjdHVyZS9uby11bnVzZWQtcHVibGljLW1lbWJlcnMvbWVtYmVyLXVzYWdlLXJlZmVyZW5jZS11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBV3pFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0saUJBQWlCLEdBQUcsQ0FDeEIsSUFBYSxFQUNiLE9BQXVCLEVBQ1ksRUFBRTtJQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRTNCLElBQUksRUFBRSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbEUsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUk7WUFDdEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1NBQ3pELENBQUM7SUFDSixDQUFDO0lBRUQsSUFDRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQzNCLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUM7UUFDdEQsRUFBRSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDeEMsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ25DLE1BQU0sVUFBVSxHQUFH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T0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNqRCxJQUFJLElBQUksS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU3RCxPQUFPLENBQ0wsUUFBUSxLQUFLLEtBQUssQ0FBQztZQUNuQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzlELHdCQUF3QixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDekQsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgdHlwZSB7IFB1YmxpY01lbWJlciB9IGZyb20gXCIuL21lbWJlci1kZWNsYXJhdGlvbi11dGlsaXRpZXNcIjtcblxuaW1wb3J0IHsgaXNTYW1lU3ltYm9sIH0gZnJvbSBcIi4uL25vLXVudXNlZC1leHBvcnRzL25vLXVudXNlZC1leHBvcnRzLXN5bWJvbC11dGlsaXRpZXNcIjtcbmltcG9ydCB7IGhhc0NvbXBhdGlibGVNZW1iZXJTaGFwZSB9IGZyb20gXCIuL21lbWJlci11c2FnZS10eXBlLXV0aWxpdGllc1wiO1xuXG4vKiogU291cmNlIHR5cGUgYW5kIG5hbWUgZm9yIGEgcHJvcGVydHkgYWNjZXNzIG9yIGRlc3RydWN0dXJpbmcgcmVhZC4gKi9cbmludGVyZmFjZSBQcm9wZXJ0eUFjY2Vzc0RldGFpbHMge1xuICAvKiogUHJvcGVydHkgbmFtZSBzZWxlY3RlZCBieSB0aGUgYWNjZXNzLiAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFR5cGUgb2YgdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyByZWFkLiAqL1xuICBzb3VyY2VUeXBlOiB0cy5UeXBlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNvdXJjZSB0eXBlIGFuZCBrZXkgZm9yIGEgcHJvcGVydHkgcmVhZCBvciBkZXN0cnVjdHVyaW5nIHVzZS5cbiAqIEBwYXJhbSBub2RlIENhbmRpZGF0ZSBtZW1iZXItbmFtZSBub2RlLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJucyBBY2Nlc3MgZGV0YWlscyB3aGVuIHRoZSBub2RlIHJlYWRzIGEgcHJvcGVydHkuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWNjZXNzID0gZ2V0UHJvcGVydHlBY2Nlc3Mobm9kZSwgY2hlY2tlcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgZ2V0UHJvcGVydHlBY2Nlc3MgPSAoXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuKTogUHJvcGVydHlBY2Nlc3NEZXRhaWxzIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKHBhcmVudCkgJiYgcGFyZW50Lm5hbWUgPT09IG5vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogcGFyZW50Lm5hbWUudGV4dCxcbiAgICAgIHNvdXJjZVR5cGU6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24ocGFyZW50LmV4cHJlc3Npb24pLFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgdHMuaXNCaW5kaW5nRWxlbWVudChwYXJlbnQpICYmXG4gICAgKHBhcmVudC5uYW1lID09PSBub2RlIHx8IHBhcmVudC5wcm9wZXJ0eU5hbWUgPT09IG5vZGUpICYmXG4gICAgdHMuaXNPYmplY3RCaW5kaW5nUGF0dGVybihwYXJlbnQucGFyZW50KVxuICApIHtcbiAgICBjb25zdCBvd25lciA9IHBhcmVudC5wYXJlbnQucGFyZW50O1xuICAgIGNvbnN0IHNvdXJjZVR5cGUgPSB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24ob3duZXIpXG4gICAgICA/IG93bmVyLmluaXRpYWxpemVyID09PSB2b2lkIDBcbiAgICAgICAgPyB2b2lkIDBcbiAgICAgICAgOiBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKG93bmVyLmluaXRpYWxpemVyKVxuICAgICAgOiB0cy5pc1BhcmFtZXRlcihvd25lcilcbiAgICAgICAgPyBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKG93bmVyKVxuICAgICAgICA6IHZvaWQgMDtcbiAgICBjb25zdCBuYW1lTm9kZSA9IHBhcmVudC5wcm9wZXJ0eU5hbWUgPz8gcGFyZW50Lm5hbWU7XG5cbiAgICByZXR1cm4gc291cmNlVHlwZSA9PT0gdm9pZCAwXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiB0cy5pc0lkZW50aWZpZXIobmFtZU5vZGUpIHx8IHRzLmlzU3RyaW5nTGl0ZXJhbExpa2UobmFtZU5vZGUpXG4gICAgICAgID8geyBuYW1lOiBuYW1lTm9kZS50ZXh0LCBzb3VyY2VUeXBlIH1cbiAgICAgICAgOiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gdm9pZCAwO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHByb3BlcnR5IHJlYWQgdXNlcyBhIHN0cnVjdHVyYWxseSByZWxhdGVkIGhvc3Qgc2hhcGUuXG4gKiBAcGFyYW0gbm9kZSBDYW5kaWRhdGUgcmVhZCBub2RlLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gbWVtYmVyIE1lbWJlciB3aG9zZSB1c2FnZSBpcyBiZWluZyBjaGVja2VkLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSByZWFkIHJlc29sdmVzIHRocm91Z2ggYSBzdHJ1Y3R1cmFsIGNvbnRyYWN0LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVzZWQgPSBpc1N0cnVjdHVyYWxQcm9wZXJ0eVJlYWQobm9kZSwgY2hlY2tlciwgbWVtYmVyKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc1N0cnVjdHVyYWxQcm9wZXJ0eVJlYWQgPSAoXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICBtZW1iZXI6IFB1YmxpY01lbWJlcixcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBhY2Nlc3MgPSBnZXRQcm9wZXJ0eUFjY2Vzcyhub2RlLCBjaGVja2VyKTtcblxuICByZXR1cm4gKFxuICAgIGFjY2VzcyAhPT0gdm9pZCAwICYmXG4gICAgYWNjZXNzLm5hbWUgPT09IG1lbWJlci5tZW1iZXJOYW1lICYmXG4gICAgaGFzQ29tcGF0aWJsZU1lbWJlclNoYXBlKGFjY2Vzcy5zb3VyY2VUeXBlLCBtZW1iZXIsIGNoZWNrZXIpXG4gICk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGxpdGVyYWwgc3RyaW5nIGtleXMgcmVwcmVzZW50ZWQgYnkgYSBUeXBlU2NyaXB0IGtleSB0eXBlLlxuICogQHBhcmFtIHR5cGUgS2V5IHR5cGUgZnJvbSBhbiBlbGVtZW50IGFjY2VzcyBleHByZXNzaW9uLlxuICogQHJldHVybnMgTGl0ZXJhbCBrZXlzIHJlcHJlc2VudGVkIGJ5IHRoZSB0eXBlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGtleXMgPSBnZXRTdHJpbmdMaXRlcmFsS2V5cyhrZXlUeXBlKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXRTdHJpbmdMaXRlcmFsS2V5cyA9ICh0eXBlOiB0cy5UeXBlKTogc3RyaW5nW10gPT4ge1xuICBpZiAodHlwZS5pc1VuaW9uT3JJbnRlcnNlY3Rpb24oKSkge1xuICAgIHJldHVybiB0eXBlLnR5cGVzLmZsYXRNYXAoKHBhcnQpID0+IGdldFN0cmluZ0xpdGVyYWxLZXlzKHBhcnQpKTtcbiAgfVxuXG4gIGlmICgodHlwZS5mbGFncyAmIHRzLlR5cGVGbGFncy5TdHJpbmdMaXRlcmFsKSAhPT0gMCkge1xuICAgIHJldHVybiBbKHR5cGUgYXMgdHMuU3RyaW5nTGl0ZXJhbFR5cGUpLnZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiAodHlwZS5mbGFncyAmIHRzLlR5cGVGbGFncy5OdW1iZXJMaXRlcmFsKSA9PT0gMFxuICAgID8gW11cbiAgICA6IFsodHlwZSBhcyB0cy5OdW1iZXJMaXRlcmFsVHlwZSkudmFsdWUudG9GaXhlZCgwKV07XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgY29tcHV0ZWQgcHJvcGVydHkgYWNjZXNzIHJlc29sdmVzIHRvIGEgbWVtYmVyIHN5bWJvbC5cbiAqIEBwYXJhbSBub2RlIENhbmRpZGF0ZSBlbGVtZW50IGFjY2VzcyBleHByZXNzaW9uLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gbWVtYmVyIE1lbWJlciB3aG9zZSB1c2FnZSBpcyBiZWluZyBjaGVja2VkLlxuICogQHBhcmFtIHJlbGF0ZWRTeW1ib2xzIE1lbWJlciBhbmQgY29udHJhY3Qgc3ltYm9scyBhY2NlcHRlZCBhcyB1c2FnZS5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiBhIHJlc29sdmVkIGtleSBzZWxlY3RzIHRoZSBtZW1iZXIuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXNlZCA9IGlzQ29tcHV0ZWRNZW1iZXJSZWFkKG5vZGUsIGNoZWNrZXIsIG1lbWJlciwgcmVsYXRlZFN5bWJvbHMpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzQ29tcHV0ZWRNZW1iZXJSZWFkID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbWVtYmVyOiBQdWJsaWNNZW1iZXIsXG4gIHJlbGF0ZWRTeW1ib2xzOiB0cy5TeW1ib2xbXSxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIXRzLmlzRWxlbWVudEFjY2Vzc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvYmplY3RUeXBlID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihub2RlLmV4cHJlc3Npb24pO1xuICBjb25zdCBrZXlUeXBlID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihub2RlLmFyZ3VtZW50RXhwcmVzc2lvbik7XG5cbiAgcmV0dXJuIGdldFN0cmluZ0xpdGVyYWxLZXlzKGtleVR5cGUpLnNvbWUoKG5hbWUpID0+IHtcbiAgICBpZiAobmFtZSAhPT0gbWVtYmVyLm1lbWJlck5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUob2JqZWN0VHlwZSwgbmFtZSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgcHJvcGVydHkgIT09IHZvaWQgMCAmJlxuICAgICAgKHJlbGF0ZWRTeW1ib2xzLnNvbWUoKHN5bWJvbCkgPT4gaXNTYW1lU3ltYm9sKHN5bWJvbCwgcHJvcGVydHkpKSB8fFxuICAgICAgICBoYXNDb21wYXRpYmxlTWVtYmVyU2hhcGUob2JqZWN0VHlwZSwgbWVtYmVyLCBjaGVja2VyKSlcbiAgICApO1xuICB9KTtcbn07XG5cbmV4cG9ydCB7IGlzQ29tcHV0ZWRNZW1iZXJSZWFkLCBpc1N0cnVjdHVyYWxQcm9wZXJ0eVJlYWQgfTtcbiJdfQ==
@@ -0,0 +1,42 @@
1
+ import * as ts from "typescript";
2
+ import type { PublicMember } from "./member-declaration-utilities.js";
3
+ /**
4
+ * Checks whether a value type carries a structurally corresponding member.
5
+ * @param valueType Type of the value being inspected.
6
+ * @param member Member whose host shape is required.
7
+ * @param checker TypeScript type checker.
8
+ * @returns True when TypeScript relates the value and host shapes.
9
+ * @example
10
+ * ```typescript
11
+ * const matches = hasCompatibleMemberShape(valueType, member, checker);
12
+ * ```
13
+ */
14
+ declare const hasCompatibleMemberShape: (valueType: ts.Type, member: PublicMember, checker: ts.TypeChecker) => boolean;
15
+ /**
16
+ * Gets the property type supplied by an object's contextual contract.
17
+ * @param objectType Expected shape for the object literal.
18
+ * @param propertyName Property name in the object literal.
19
+ * @param location Node used to resolve the property type.
20
+ * @param checker TypeScript type checker.
21
+ * @returns Contextual property type when one is declared.
22
+ * @example
23
+ * ```typescript
24
+ * const type = getContextualPropertyType(objectType, "docs", node, checker);
25
+ * ```
26
+ */
27
+ declare const getContextualPropertyType: (objectType: ts.Type | undefined, propertyName: string, location: ts.Node, checker: ts.TypeChecker) => ts.Type | undefined;
28
+ /**
29
+ * Checks whether a typed handoff carries a member into a compatible contract.
30
+ * @param sourceType Type of the value being forwarded.
31
+ * @param targetType Type expected at the receiving boundary.
32
+ * @param member Member whose usage is being checked.
33
+ * @param checker TypeScript type checker.
34
+ * @returns True when the receiving contract accepts the corresponding member.
35
+ * @example
36
+ * ```typescript
37
+ * const used = isMemberHandoff(sourceType, targetType, member, checker);
38
+ * ```
39
+ */
40
+ declare const isMemberHandoff: (sourceType: ts.Type | undefined, targetType: ts.Type | undefined, member: PublicMember, checker: ts.TypeChecker) => boolean;
41
+ export { getContextualPropertyType, hasCompatibleMemberShape, isMemberHandoff };
42
+ //# sourceMappingURL=member-usage-type-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member-usage-type-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-type-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAwBnE;;;;;;;;;;GAUG;AACH,QAAA,MAAM,wBAAwB,GAC5B,WAAW,EAAE,CAAC,IAAI,EAClB,QAAQ,YAAY,EACpB,SAAS,EAAE,CAAC,WAAW,KACtB,OAiBF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,yBAAyB,GAC7B,YAAY,EAAE,CAAC,IAAI,GAAG,SAAS,EAC/B,cAAc,MAAM,EACpB,UAAU,EAAE,CAAC,IAAI,EACjB,SAAS,EAAE,CAAC,WAAW,KACtB,EAAE,CAAC,IAAI,GAAG,SASZ,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,eAAe,GACnB,YAAY,EAAE,CAAC,IAAI,GAAG,SAAS,EAC/B,YAAY,EAAE,CAAC,IAAI,GAAG,SAAS,EAC/B,QAAQ,YAAY,EACpB,SAAS,EAAE,CAAC,WAAW,KACtB,OA8CF,CAAC;AAEF,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,96 @@
1
+ import * as ts from "typescript";
2
+ /**
3
+ * Gets the declared type of the host that owns a public member.
4
+ * @param member Member whose host type is needed.
5
+ * @param checker TypeScript type checker.
6
+ * @returns Host type used for structural usage checks.
7
+ * @example
8
+ * ```typescript
9
+ * const hostType = getMemberHostType(member, checker);
10
+ * ```
11
+ */
12
+ const getMemberHostType = (member, checker) => {
13
+ const declaration = member.hostDeclaration;
14
+ const location = ts.isVariableDeclaration(declaration)
15
+ ? declaration.name
16
+ : declaration;
17
+ return checker.getTypeAtLocation(location);
18
+ };
19
+ /**
20
+ * Checks whether a value type carries a structurally corresponding member.
21
+ * @param valueType Type of the value being inspected.
22
+ * @param member Member whose host shape is required.
23
+ * @param checker TypeScript type checker.
24
+ * @returns True when TypeScript relates the value and host shapes.
25
+ * @example
26
+ * ```typescript
27
+ * const matches = hasCompatibleMemberShape(valueType, member, checker);
28
+ * ```
29
+ */
30
+ const hasCompatibleMemberShape = (valueType, member, checker) => {
31
+ const hostType = checker.getNonNullableType(getMemberHostType(member, checker));
32
+ const observedType = checker.getNonNullableType(valueType);
33
+ const hostProperty = checker.getPropertyOfType(hostType, member.memberName);
34
+ const observedProperty = checker.getPropertyOfType(observedType, member.memberName);
35
+ return (hostProperty !== void 0 &&
36
+ observedProperty !== void 0 &&
37
+ checker.isTypeAssignableTo(observedType, hostType) &&
38
+ checker.isTypeAssignableTo(hostType, observedType));
39
+ };
40
+ /**
41
+ * Gets the property type supplied by an object's contextual contract.
42
+ * @param objectType Expected shape for the object literal.
43
+ * @param propertyName Property name in the object literal.
44
+ * @param location Node used to resolve the property type.
45
+ * @param checker TypeScript type checker.
46
+ * @returns Contextual property type when one is declared.
47
+ * @example
48
+ * ```typescript
49
+ * const type = getContextualPropertyType(objectType, "docs", node, checker);
50
+ * ```
51
+ */
52
+ const getContextualPropertyType = (objectType, propertyName, location, checker) => {
53
+ const property = objectType === void 0
54
+ ? void 0
55
+ : checker.getPropertyOfType(objectType, propertyName);
56
+ return property === void 0
57
+ ? void 0
58
+ : checker.getTypeOfSymbolAtLocation(property, location);
59
+ };
60
+ /**
61
+ * Checks whether a typed handoff carries a member into a compatible contract.
62
+ * @param sourceType Type of the value being forwarded.
63
+ * @param targetType Type expected at the receiving boundary.
64
+ * @param member Member whose usage is being checked.
65
+ * @param checker TypeScript type checker.
66
+ * @returns True when the receiving contract accepts the corresponding member.
67
+ * @example
68
+ * ```typescript
69
+ * const used = isMemberHandoff(sourceType, targetType, member, checker);
70
+ * ```
71
+ */
72
+ const isMemberHandoff = (sourceType, targetType, member, checker) => {
73
+ if (sourceType === void 0 || targetType === void 0) {
74
+ return false;
75
+ }
76
+ const hostType = checker.getNonNullableType(getMemberHostType(member, checker));
77
+ const forwardedType = checker.getNonNullableType(sourceType);
78
+ const receivingType = checker.getNonNullableType(targetType);
79
+ const hostProperty = checker.getPropertyOfType(hostType, member.memberName);
80
+ const forwardedProperty = checker.getPropertyOfType(forwardedType, member.memberName);
81
+ const receivingProperty = checker.getPropertyOfType(receivingType, member.memberName);
82
+ if (hostProperty === void 0 ||
83
+ forwardedProperty === void 0 ||
84
+ receivingProperty === void 0 ||
85
+ !(checker.isTypeAssignableTo(forwardedType, hostType) ||
86
+ checker.isTypeAssignableTo(hostType, forwardedType)) ||
87
+ !checker.isTypeAssignableTo(hostType, receivingType)) {
88
+ return false;
89
+ }
90
+ const hostPropertyType = checker.getTypeOfSymbolAtLocation(hostProperty, member.declaration);
91
+ const receivingPropertyType = checker.getTypeOfSymbolAtLocation(receivingProperty, member.declaration);
92
+ return (checker.isTypeAssignableTo(hostPropertyType, receivingPropertyType) ||
93
+ checker.isTypeAssignableTo(receivingPropertyType, hostPropertyType));
94
+ };
95
+ export { getContextualPropertyType, hasCompatibleMemberShape, isMemberHandoff };
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLXR5cGUtdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci11c2FnZS10eXBlLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUlqQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLE1BQW9CLEVBQ3BCLE9BQXVCLEVBQ2QsRUFBRTtJQUNYLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7SUFDM0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQztRQUNwRCxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUk7UUFDbEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUVoQixPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3QyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUMvQixTQUFrQixFQUNsQixNQUFvQixFQUNwQixPQUF1QixFQUNkLEVBQUU7SUFDWCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQ3pDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FDbkMsQ0FBQztJQUNGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RSxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FDaEQsWUFBWSxFQUNaLE1BQU0sQ0FBQyxVQUFV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TyxFQUFFLHlCQUF5QixFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHR5cGUgeyBQdWJsaWNNZW1iZXIgfSBmcm9tIFwiLi9tZW1iZXItZGVjbGFyYXRpb24tdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogR2V0cyB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgaG9zdCB0aGF0IG93bnMgYSBwdWJsaWMgbWVtYmVyLlxuICogQHBhcmFtIG1lbWJlciBNZW1iZXIgd2hvc2UgaG9zdCB0eXBlIGlzIG5lZWRlZC5cbiAqIEBwYXJhbSBjaGVja2VyIFR5cGVTY3JpcHQgdHlwZSBjaGVja2VyLlxuICogQHJldHVybnMgSG9zdCB0eXBlIHVzZWQgZm9yIHN0cnVjdHVyYWwgdXNhZ2UgY2hlY2tzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGhvc3RUeXBlID0gZ2V0TWVtYmVySG9zdFR5cGUobWVtYmVyLCBjaGVja2VyKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXRNZW1iZXJIb3N0VHlwZSA9IChcbiAgbWVtYmVyOiBQdWJsaWNNZW1iZXIsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuKTogdHMuVHlwZSA9PiB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gbWVtYmVyLmhvc3REZWNsYXJhdGlvbjtcbiAgY29uc3QgbG9jYXRpb24gPSB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pXG4gICAgPyBkZWNsYXJhdGlvbi5uYW1lXG4gICAgOiBkZWNsYXJhdGlvbjtcblxuICByZXR1cm4gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihsb2NhdGlvbik7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgdHlwZSBjYXJyaWVzIGEgc3RydWN0dXJhbGx5IGNvcnJlc3BvbmRpbmcgbWVtYmVyLlxuICogQHBhcmFtIHZhbHVlVHlwZSBUeXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBpbnNwZWN0ZWQuXG4gKiBAcGFyYW0gbWVtYmVyIE1lbWJlciB3aG9zZSBob3N0IHNoYXBlIGlzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gVHlwZVNjcmlwdCByZWxhdGVzIHRoZSB2YWx1ZSBhbmQgaG9zdCBzaGFwZXMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWF0Y2hlcyA9IGhhc0NvbXBhdGlibGVNZW1iZXJTaGFwZSh2YWx1ZVR5cGUsIG1lbWJlciwgY2hlY2tlcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgaGFzQ29tcGF0aWJsZU1lbWJlclNoYXBlID0gKFxuICB2YWx1ZVR5cGU6IHRzLlR5cGUsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBob3N0VHlwZSA9IGNoZWNrZXIuZ2V0Tm9uTnVsbGFibGVUeXBlKFxuICAgIGdldE1lbWJlckhvc3RUeXBlKG1lbWJlciwgY2hlY2tlciksXG4gICk7XG4gIGNvbnN0IG9ic2VydmVkVHlwZSA9IGNoZWNrZXIuZ2V0Tm9uTnVsbGFibGVUeXBlKHZhbHVlVHlwZSk7XG4gIGNvbnN0IGhvc3RQcm9wZXJ0eSA9IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUoaG9zdFR5cGUsIG1lbWJlci5tZW1iZXJOYW1lKTtcbiAgY29uc3Qgb2JzZXJ2ZWRQcm9wZXJ0eSA9IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUoXG4gICAgb2JzZXJ2ZWRUeXBlLFxuICAgIG1lbWJlci5tZW1iZXJOYW1lLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgaG9zdFByb3BlcnR5ICE9PSB2b2lkIDAgJiZcbiAgICBvYnNlcnZlZFByb3BlcnR5ICE9PSB2b2lkIDAgJiZcbiAgICBjaGVja2VyLmlzVHlwZUFzc2lnbmFibGVUbyhvYnNlcnZlZFR5cGUsIGhvc3RUeXBlKSAmJlxuICAgIGNoZWNrZXIuaXNUeXBlQXNzaWduYWJsZVRvKGhvc3RUeXBlLCBvYnNlcnZlZFR5cGUpXG4gICk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IHR5cGUgc3VwcGxpZWQgYnkgYW4gb2JqZWN0J3MgY29udGV4dHVhbCBjb250cmFjdC5cbiAqIEBwYXJhbSBvYmplY3RUeXBlIEV4cGVjdGVkIHNoYXBlIGZvciB0aGUgb2JqZWN0IGxpdGVyYWwuXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IG5hbWUgaW4gdGhlIG9iamVjdCBsaXRlcmFsLlxuICogQHBhcmFtIGxvY2F0aW9uIE5vZGUgdXNlZCB0byByZXNvbHZlIHRoZSBwcm9wZXJ0eSB0eXBlLlxuICogQHBhcmFtIGNoZWNrZXIgVHlwZVNjcmlwdCB0eXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJucyBDb250ZXh0dWFsIHByb3BlcnR5IHR5cGUgd2hlbiBvbmUgaXMgZGVjbGFyZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHlwZSA9IGdldENvbnRleHR1YWxQcm9wZXJ0eVR5cGUob2JqZWN0VHlwZSwgXCJkb2NzXCIsIG5vZGUsIGNoZWNrZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldENvbnRleHR1YWxQcm9wZXJ0eVR5cGUgPSAoXG4gIG9iamVjdFR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQsXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICBsb2NhdGlvbjogdHMuTm9kZSxcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4pOiB0cy5UeXBlIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcHJvcGVydHkgPVxuICAgIG9iamVjdFR5cGUgPT09IHZvaWQgMFxuICAgICAgPyB2b2lkIDBcbiAgICAgIDogY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShvYmplY3RUeXBlLCBwcm9wZXJ0eU5hbWUpO1xuXG4gIHJldHVybiBwcm9wZXJ0eSA9PT0gdm9pZCAwXG4gICAgPyB2b2lkIDBcbiAgICA6IGNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihwcm9wZXJ0eSwgbG9jYXRpb24pO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHR5cGVkIGhhbmRvZmYgY2FycmllcyBhIG1lbWJlciBpbnRvIGEgY29tcGF0aWJsZSBjb250cmFjdC5cbiAqIEBwYXJhbSBzb3VyY2VUeXBlIFR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIGZvcndhcmRlZC5cbiAqIEBwYXJhbSB0YXJnZXRUeXBlIFR5cGUgZXhwZWN0ZWQgYXQgdGhlIHJlY2VpdmluZyBib3VuZGFyeS5cbiAqIEBwYXJhbSBtZW1iZXIgTWVtYmVyIHdob3NlIHVzYWdlIGlzIGJlaW5nIGNoZWNrZWQuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbnRyYWN0IGFjY2VwdHMgdGhlIGNvcnJlc3BvbmRpbmcgbWVtYmVyLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVzZWQgPSBpc01lbWJlckhhbmRvZmYoc291cmNlVHlwZSwgdGFyZ2V0VHlwZSwgbWVtYmVyLCBjaGVja2VyKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc01lbWJlckhhbmRvZmYgPSAoXG4gIHNvdXJjZVR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQsXG4gIHRhcmdldFR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoc291cmNlVHlwZSA9PT0gdm9pZCAwIHx8IHRhcmdldFR5cGUgPT09IHZvaWQgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhvc3RUeXBlID0gY2hlY2tlci5nZXROb25OdWxsYWJsZVR5cGUoXG4gICAgZ2V0TWVtYmVySG9zdFR5cGUobWVtYmVyLCBjaGVja2VyKSxcbiAgKTtcbiAgY29uc3QgZm9yd2FyZGVkVHlwZSA9IGNoZWNrZXIuZ2V0Tm9uTnVsbGFibGVUeXBlKHNvdXJjZVR5cGUpO1xuICBjb25zdCByZWNlaXZpbmdUeXBlID0gY2hlY2tlci5nZXROb25OdWxsYWJsZVR5cGUodGFyZ2V0VHlwZSk7XG4gIGNvbnN0IGhvc3RQcm9wZXJ0eSA9IGNoZWNrZXIuZ2V0UHJvcGVydHlPZlR5cGUoaG9zdFR5cGUsIG1lbWJlci5tZW1iZXJOYW1lKTtcbiAgY29uc3QgZm9yd2FyZGVkUHJvcGVydHkgPSBjaGVja2VyLmdldFByb3BlcnR5T2ZUeXBlKFxuICAgIGZvcndhcmRlZFR5cGUsXG4gICAgbWVtYmVyLm1lbWJlck5hbWUsXG4gICk7XG4gIGNvbnN0IHJlY2VpdmluZ1Byb3BlcnR5ID0gY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShcbiAgICByZWNlaXZpbmdUeXBlLFxuICAgIG1lbWJlci5tZW1iZXJOYW1lLFxuICApO1xuXG4gIGlmIChcbiAgICBob3N0UHJvcGVydHkgPT09IHZvaWQgMCB8fFxuICAgIGZvcndhcmRlZFByb3BlcnR5ID09PSB2b2lkIDAgfHxcbiAgICByZWNlaXZpbmdQcm9wZXJ0eSA9PT0gdm9pZCAwIHx8XG4gICAgIShcbiAgICAgIGNoZWNrZXIuaXNUeXBlQXNzaWduYWJsZVRvKGZvcndhcmRlZFR5cGUsIGhvc3RUeXBlKSB8fFxuICAgICAgY2hlY2tlci5pc1R5cGVBc3NpZ25hYmxlVG8oaG9zdFR5cGUsIGZvcndhcmRlZFR5cGUpXG4gICAgKSB8fFxuICAgICFjaGVja2VyLmlzVHlwZUFzc2lnbmFibGVUbyhob3N0VHlwZSwgcmVjZWl2aW5nVHlwZSlcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaG9zdFByb3BlcnR5VHlwZSA9IGNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihcbiAgICBob3N0UHJvcGVydHksXG4gICAgbWVtYmVyLmRlY2xhcmF0aW9uLFxuICApO1xuICBjb25zdCByZWNlaXZpbmdQcm9wZXJ0eVR5cGUgPSBjaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24oXG4gICAgcmVjZWl2aW5nUHJvcGVydHksXG4gICAgbWVtYmVyLmRlY2xhcmF0aW9uLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgY2hlY2tlci5pc1R5cGVBc3NpZ25hYmxlVG8oaG9zdFByb3BlcnR5VHlwZSwgcmVjZWl2aW5nUHJvcGVydHlUeXBlKSB8fFxuICAgIGNoZWNrZXIuaXNUeXBlQXNzaWduYWJsZVRvKHJlY2VpdmluZ1Byb3BlcnR5VHlwZSwgaG9zdFByb3BlcnR5VHlwZSlcbiAgKTtcbn07XG5cbmV4cG9ydCB7IGdldENvbnRleHR1YWxQcm9wZXJ0eVR5cGUsIGhhc0NvbXBhdGlibGVNZW1iZXJTaGFwZSwgaXNNZW1iZXJIYW5kb2ZmIH07XG4iXX0=