@codeperfect/eslint-plugin 3.0.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 (99) hide show
  1. package/dist/application/custom-rules.d.ts +3 -0
  2. package/dist/application/custom-rules.d.ts.map +1 -1
  3. package/dist/application/custom-rules.js +3 -2
  4. package/dist/application/index.d.ts +1 -1
  5. package/dist/application/index.d.ts.map +1 -1
  6. package/dist/application/index.js +2 -2
  7. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  8. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts +0 -2
  9. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts.map +1 -1
  10. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +1 -2
  11. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +0 -2
  12. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
  13. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +2 -10
  14. package/dist/domain/architecture/index.d.ts +1 -0
  15. package/dist/domain/architecture/index.d.ts.map +1 -1
  16. package/dist/domain/architecture/index.js +2 -1
  17. package/dist/domain/architecture/no-unused-public-members/index.d.ts +2 -0
  18. package/dist/domain/architecture/no-unused-public-members/index.d.ts.map +1 -0
  19. package/dist/domain/architecture/no-unused-public-members/index.js +2 -0
  20. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts +16 -0
  21. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts.map +1 -0
  22. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.js +102 -0
  23. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts +34 -0
  24. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts.map +1 -0
  25. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.js +55 -0
  26. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts +68 -0
  27. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts.map +1 -0
  28. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.js +195 -0
  29. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts +30 -0
  30. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts.map +1 -0
  31. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.js +101 -0
  32. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts +28 -0
  33. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts.map +1 -0
  34. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.js +125 -0
  35. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts +29 -0
  36. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts.map +1 -0
  37. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.js +108 -0
  38. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts +42 -0
  39. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts.map +1 -0
  40. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.js +96 -0
  41. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts +18 -0
  42. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts.map +1 -0
  43. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.js +128 -0
  44. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts +41 -0
  45. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts.map +1 -0
  46. package/dist/domain/architecture/no-unused-public-members/member-utilities.js +51 -0
  47. package/dist/domain/architecture/no-unused-public-members/rule.d.ts +5 -0
  48. package/dist/domain/architecture/no-unused-public-members/rule.d.ts.map +1 -0
  49. package/dist/domain/architecture/no-unused-public-members/rule.js +78 -0
  50. package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +4 -4
  51. package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -1
  52. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -2
  53. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +4 -4
  54. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  55. package/dist/domain/docs/no-interface-member-docs/rule.js +2 -5
  56. package/dist/domain/docs/require-example-language/example-utilities.d.ts +1 -7
  57. package/dist/domain/docs/require-example-language/example-utilities.d.ts.map +1 -1
  58. package/dist/domain/docs/require-example-language/example-utilities.js +4 -6
  59. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  60. package/dist/domain/docs/require-example-language/examples.js +2 -4
  61. package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
  62. package/dist/domain/docs/require-example-language/reporting.js +1 -4
  63. package/dist/domain/docs/require-example-language/types.d.ts +0 -2
  64. package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
  65. package/dist/domain/docs/require-example-language/types.js +1 -1
  66. package/dist/domain/index.d.ts +1 -1
  67. package/dist/domain/index.d.ts.map +1 -1
  68. package/dist/domain/index.js +2 -2
  69. package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
  70. package/dist/domain/testing/aaa/analyzer.analysis.js +2 -7
  71. package/dist/domain/testing/aaa/analyzer.assertions.js +2 -2
  72. package/dist/domain/testing/aaa/analyzer.classification.js +2 -2
  73. package/dist/domain/testing/aaa/types.d.ts +0 -4
  74. package/dist/domain/testing/aaa/types.d.ts.map +1 -1
  75. package/dist/domain/testing/aaa/types.js +1 -1
  76. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
  77. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +2 -7
  78. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -1
  79. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.js +5 -9
  80. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -1
  81. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +2 -7
  82. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -1
  83. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.js +5 -5
  84. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -1
  85. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.js +13 -20
  86. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts +0 -2
  87. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts.map +1 -1
  88. package/dist/domain/testing/prefer-vi-mocked-import/types.js +1 -1
  89. package/dist/domain/testing/require-test-companion/require-test-companion-options.js +3 -3
  90. package/dist/domain/testing/require-test-companion/rule.js +2 -2
  91. package/dist/index.d.ts +1 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +2 -2
  94. package/dist/infrastructure/codeperfect-plugin.d.ts +2 -0
  95. package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
  96. package/dist/infrastructure/codeperfect-plugin.js +3 -2
  97. package/dist/infrastructure/presets.d.ts.map +1 -1
  98. package/dist/infrastructure/presets.js +3 -1
  99. package/package.json +24 -24
@@ -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=
@@ -0,0 +1,18 @@
1
+ import * as ts from "typescript";
2
+ import type { NoUnusedExportsState } from "../no-unused-exports/types.js";
3
+ import type { PublicMember } from "./member-declaration-utilities.js";
4
+ /**
5
+ * Checks whether a member has a concrete reference in production TypeScript.
6
+ * @param program TypeScript project program.
7
+ * @param state Normalized public API and test patterns.
8
+ * @param repoRoot Root directory used for glob matching.
9
+ * @param member Member whose production usage is being checked.
10
+ * @returns True when production code references the member.
11
+ * @example
12
+ * ```typescript
13
+ * const used = hasProductionUsage(program, state, repoRoot, member);
14
+ * ```
15
+ */
16
+ declare const hasProductionUsage: (program: ts.Program, state: NoUnusedExportsState, repoRoot: string, member: PublicMember) => boolean;
17
+ export { hasProductionUsage };
18
+ //# sourceMappingURL=member-usage-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member-usage-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-usage-utilities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAyFnE;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,kBAAkB,GACtB,SAAS,EAAE,CAAC,OAAO,EACnB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,QAAQ,YAAY,KACnB,OAuEF,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,128 @@
1
+ import path from "node:path";
2
+ import * as ts from "typescript";
3
+ import { isTestFile } from "../no-unused-exports/no-unused-exports-options.js";
4
+ import { isSameSymbol, resolveCanonicalSymbol, } from "../no-unused-exports/no-unused-exports-symbol-utilities.js";
5
+ import { collectHeritageMemberSymbols } from "./member-contract-utilities.js";
6
+ import { isCallArgumentMember, isObjectContractHandoff, } from "./member-usage-handoff-utilities.js";
7
+ import { isComputedMemberRead, isStructuralPropertyRead, } from "./member-usage-reference-utilities.js";
8
+ /**
9
+ * Resolves destructured member names or direct reference symbols.
10
+ * @param node Candidate reference node.
11
+ * @param checker TypeScript type checker.
12
+ * @returns Referenced member symbol when available.
13
+ * @example
14
+ * ```typescript
15
+ * const symbol = getUsageSymbol(propertyIdentifier, checker);
16
+ * ```
17
+ */
18
+ const getUsageSymbol = (node, checker) => {
19
+ const parent = node.parent;
20
+ if (ts.isIdentifier(node) &&
21
+ ts.isBindingElement(parent) &&
22
+ parent.name === node &&
23
+ parent.propertyName === void 0 &&
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
+ return sourceType === void 0
34
+ ? checker.getSymbolAtLocation(node)
35
+ : checker.getPropertyOfType(sourceType, node.text);
36
+ }
37
+ return checker.getSymbolAtLocation(node);
38
+ };
39
+ /**
40
+ * Identifies declaration names that are not member references.
41
+ * @param node Candidate reference node.
42
+ * @returns True when the node is only declaring a name.
43
+ * @example
44
+ * ```typescript
45
+ * const declarationOnly = isDeclarationName(propertyName);
46
+ * ```
47
+ */
48
+ const isDeclarationName = (node) => {
49
+ const parent = node.parent;
50
+ return (((ts.isPropertyDeclaration(parent) ||
51
+ ts.isMethodDeclaration(parent) ||
52
+ ts.isGetAccessorDeclaration(parent) ||
53
+ ts.isSetAccessorDeclaration(parent) ||
54
+ ts.isPropertySignature(parent) ||
55
+ ts.isMethodSignature(parent) ||
56
+ ts.isPropertyAssignment(parent) ||
57
+ ts.isShorthandPropertyAssignment(parent)) &&
58
+ parent.name === node) ||
59
+ (ts.isVariableDeclaration(parent) && parent.name === node) ||
60
+ ((ts.isClassDeclaration(parent) ||
61
+ ts.isInterfaceDeclaration(parent) ||
62
+ ts.isTypeAliasDeclaration(parent) ||
63
+ ts.isFunctionDeclaration(parent)) &&
64
+ parent.name === node) ||
65
+ (ts.isParameter(parent) && parent.name === node));
66
+ };
67
+ /**
68
+ * Checks whether a member has a concrete reference in production TypeScript.
69
+ * @param program TypeScript project program.
70
+ * @param state Normalized public API and test patterns.
71
+ * @param repoRoot Root directory used for glob matching.
72
+ * @param member Member whose production usage is being checked.
73
+ * @returns True when production code references the member.
74
+ * @example
75
+ * ```typescript
76
+ * const used = hasProductionUsage(program, state, repoRoot, member);
77
+ * ```
78
+ */
79
+ const hasProductionUsage = (program, state, repoRoot, member) => {
80
+ const checker = program.getTypeChecker();
81
+ const relatedSymbols = [
82
+ resolveCanonicalSymbol(member.memberSymbol, checker),
83
+ ...collectHeritageMemberSymbols(program, checker, member).map((symbol) => resolveCanonicalSymbol(symbol, checker)),
84
+ ];
85
+ const variableDeclaration = ts.isVariableDeclaration(member.hostDeclaration)
86
+ ? member.hostDeclaration
87
+ : void 0;
88
+ if (variableDeclaration !== void 0) {
89
+ const declaredType = checker.getTypeAtLocation(variableDeclaration.name);
90
+ const declaredMember = checker.getPropertyOfType(declaredType, member.memberName);
91
+ if (declaredMember !== void 0 &&
92
+ relatedSymbols.every((symbol) => !isSameSymbol(symbol, declaredMember))) {
93
+ relatedSymbols.push(resolveCanonicalSymbol(declaredMember, checker));
94
+ }
95
+ }
96
+ const normalizedRoot = path.resolve(repoRoot);
97
+ for (const sourceFile of program.getSourceFiles()) {
98
+ const filename = path.resolve(sourceFile.fileName);
99
+ if (sourceFile.isDeclarationFile ||
100
+ isTestFile(filename, state, normalizedRoot)) {
101
+ continue;
102
+ }
103
+ const findUsageSymbol = (node) => {
104
+ if ((ts.isIdentifier(node) || ts.isStringLiteralLike(node)) &&
105
+ !isDeclarationName(node)) {
106
+ const candidate = getUsageSymbol(node, checker);
107
+ if (candidate !== void 0 &&
108
+ relatedSymbols.some((symbol) => isSameSymbol(symbol, candidate))) {
109
+ return candidate;
110
+ }
111
+ if (isStructuralPropertyRead(node, checker, member)) {
112
+ return member.memberSymbol;
113
+ }
114
+ }
115
+ return isComputedMemberRead(node, checker, member, relatedSymbols) ||
116
+ isCallArgumentMember(node, checker, member) ||
117
+ isObjectContractHandoff(node, checker, member)
118
+ ? member.memberSymbol
119
+ : ts.forEachChild(node, findUsageSymbol);
120
+ };
121
+ if (findUsageSymbol(sourceFile) !== void 0) {
122
+ return true;
123
+ }
124
+ }
125
+ return false;
126
+ };
127
+ export { hasProductionUsage };
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXVzYWdlLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1wdWJsaWMtbWVtYmVycy9tZW1iZXItdXNhZ2UtdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUtqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDNUUsT0FBTyxFQUNMLFlBQVksRUFDWixzQkFBc0IsR0FDdkIsTUFBTSx5REFBeUQsQ0FBQztBQUNqRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHVCQUF1QixHQUN4QixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsd0JBQXdCLEdBQ3pCLE1BQU0sb0NBQW9DLENBQUM7QUFFNUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FDckIsSUFBYSxFQUNiLE9BQXVCLEVBQ0EsRUFBRTtJQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRTNCLElBQ0UsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDckIsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLENBQUMsSUFBSSxLQUFLLElBQUk7UUFDcEIsTUFBTSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUM7UUFDOUIsRUFBRSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDeEMsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ25DLE1BQU0sVUFBVSxH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LENBQUMsRUFDeEIsQ0FBQztnQkFDRCxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUVoRCxJQUNFLFNBQVMsS0FBSyxLQUFLLENBQUM7b0JBQ3BCLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFDaEUsQ0FBQztvQkFDRCxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQztnQkFFRCxJQUFJLHdCQUF3QixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDcEQsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sb0JBQW9CLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO2dCQUNoRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztnQkFDM0MsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWTtnQkFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUVGLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgdHlwZSB7IE5vVW51c2VkRXhwb3J0c1N0YXRlIH0gZnJvbSBcIi4uL25vLXVudXNlZC1leHBvcnRzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1YmxpY01lbWJlciB9IGZyb20gXCIuL21lbWJlci1kZWNsYXJhdGlvbi11dGlsaXRpZXNcIjtcblxuaW1wb3J0IHsgaXNUZXN0RmlsZSB9IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1vcHRpb25zXCI7XG5pbXBvcnQge1xuICBpc1NhbWVTeW1ib2wsXG4gIHJlc29sdmVDYW5vbmljYWxTeW1ib2wsXG59IGZyb20gXCIuLi9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1zeW1ib2wtdXRpbGl0aWVzXCI7XG5pbXBvcnQgeyBjb2xsZWN0SGVyaXRhZ2VNZW1iZXJTeW1ib2xzIH0gZnJvbSBcIi4vbWVtYmVyLWNvbnRyYWN0LXV0aWxpdGllc1wiO1xuaW1wb3J0IHtcbiAgaXNDYWxsQXJndW1lbnRNZW1iZXIsXG4gIGlzT2JqZWN0Q29udHJhY3RIYW5kb2ZmLFxufSBmcm9tIFwiLi9tZW1iZXItdXNhZ2UtaGFuZG9mZi11dGlsaXRpZXNcIjtcbmltcG9ydCB7XG4gIGlzQ29tcHV0ZWRNZW1iZXJSZWFkLFxuICBpc1N0cnVjdHVyYWxQcm9wZXJ0eVJlYWQsXG59IGZyb20gXCIuL21lbWJlci11c2FnZS1yZWZlcmVuY2UtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogUmVzb2x2ZXMgZGVzdHJ1Y3R1cmVkIG1lbWJlciBuYW1lcyBvciBkaXJlY3QgcmVmZXJlbmNlIHN5bWJvbHMuXG4gKiBAcGFyYW0gbm9kZSBDYW5kaWRhdGUgcmVmZXJlbmNlIG5vZGUuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlci5cbiAqIEByZXR1cm5zIFJlZmVyZW5jZWQgbWVtYmVyIHN5bWJvbCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzeW1ib2wgPSBnZXRVc2FnZVN5bWJvbChwcm9wZXJ0eUlkZW50aWZpZXIsIGNoZWNrZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldFVzYWdlU3ltYm9sID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmIChcbiAgICB0cy5pc0lkZW50aWZpZXIobm9kZSkgJiZcbiAgICB0cy5pc0JpbmRpbmdFbGVtZW50KHBhcmVudCkgJiZcbiAgICBwYXJlbnQubmFtZSA9PT0gbm9kZSAmJlxuICAgIHBhcmVudC5wcm9wZXJ0eU5hbWUgPT09IHZvaWQgMCAmJlxuICAgIHRzLmlzT2JqZWN0QmluZGluZ1BhdHRlcm4ocGFyZW50LnBhcmVudClcbiAgKSB7XG4gICAgY29uc3Qgb3duZXIgPSBwYXJlbnQucGFyZW50LnBhcmVudDtcbiAgICBjb25zdCBzb3VyY2VUeXBlID0gdHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG93bmVyKVxuICAgICAgPyBvd25lci5pbml0aWFsaXplciA9PT0gdm9pZCAwXG4gICAgICAgID8gdm9pZCAwXG4gICAgICAgIDogY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihvd25lci5pbml0aWFsaXplcilcbiAgICAgIDogdHMuaXNQYXJhbWV0ZXIob3duZXIpXG4gICAgICAgID8gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihvd25lcilcbiAgICAgICAgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gc291cmNlVHlwZSA9PT0gdm9pZCAwXG4gICAgICA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihub2RlKVxuICAgICAgOiBjaGVja2VyLmdldFByb3BlcnR5T2ZUeXBlKHNvdXJjZVR5cGUsIG5vZGUudGV4dCk7XG4gIH1cblxuICByZXR1cm4gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpO1xufTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIGRlY2xhcmF0aW9uIG5hbWVzIHRoYXQgYXJlIG5vdCBtZW1iZXIgcmVmZXJlbmNlcy5cbiAqIEBwYXJhbSBub2RlIENhbmRpZGF0ZSByZWZlcmVuY2Ugbm9kZS5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgbm9kZSBpcyBvbmx5IGRlY2xhcmluZyBhIG5hbWUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGVjbGFyYXRpb25Pbmx5ID0gaXNEZWNsYXJhdGlvbk5hbWUocHJvcGVydHlOYW1lKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc0RlY2xhcmF0aW9uTmFtZSA9IChub2RlOiB0cy5Ob2RlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIHJldHVybiAoXG4gICAgKCh0cy5pc1Byb3BlcnR5RGVjbGFyYXRpb24ocGFyZW50KSB8fFxuICAgICAgdHMuaXNNZXRob2REZWNsYXJhdGlvbihwYXJlbnQpIHx8XG4gICAgICB0cy5pc0dldEFjY2Vzc29yRGVjbGFyYXRpb24ocGFyZW50KSB8fFxuICAgICAgdHMuaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKHBhcmVudCkgfHxcbiAgICAgIHRzLmlzUHJvcGVydHlTaWduYXR1cmUocGFyZW50KSB8fFxuICAgICAgdHMuaXNNZXRob2RTaWduYXR1cmUocGFyZW50KSB8fFxuICAgICAgdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocGFyZW50KSB8fFxuICAgICAgdHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocGFyZW50KSkgJiZcbiAgICAgIHBhcmVudC5uYW1lID09PSBub2RlKSB8fFxuICAgICh0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24ocGFyZW50KSAmJiBwYXJlbnQubmFtZSA9PT0gbm9kZSkgfHxcbiAgICAoKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihwYXJlbnQpIHx8XG4gICAgICB0cy5pc0ludGVyZmFjZURlY2xhcmF0aW9uKHBhcmVudCkgfHxcbiAgICAgIHRzLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24ocGFyZW50KSB8fFxuICAgICAgdHMuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKHBhcmVudCkpICYmXG4gICAgICBwYXJlbnQubmFtZSA9PT0gbm9kZSkgfHxcbiAgICAodHMuaXNQYXJhbWV0ZXIocGFyZW50KSAmJiBwYXJlbnQubmFtZSA9PT0gbm9kZSlcbiAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBtZW1iZXIgaGFzIGEgY29uY3JldGUgcmVmZXJlbmNlIGluIHByb2R1Y3Rpb24gVHlwZVNjcmlwdC5cbiAqIEBwYXJhbSBwcm9ncmFtIFR5cGVTY3JpcHQgcHJvamVjdCBwcm9ncmFtLlxuICogQHBhcmFtIHN0YXRlIE5vcm1hbGl6ZWQgcHVibGljIEFQSSBhbmQgdGVzdCBwYXR0ZXJucy5cbiAqIEBwYXJhbSByZXBvUm9vdCBSb290IGRpcmVjdG9yeSB1c2VkIGZvciBnbG9iIG1hdGNoaW5nLlxuICogQHBhcmFtIG1lbWJlciBNZW1iZXIgd2hvc2UgcHJvZHVjdGlvbiB1c2FnZSBpcyBiZWluZyBjaGVja2VkLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHByb2R1Y3Rpb24gY29kZSByZWZlcmVuY2VzIHRoZSBtZW1iZXIuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXNlZCA9IGhhc1Byb2R1Y3Rpb25Vc2FnZShwcm9ncmFtLCBzdGF0ZSwgcmVwb1Jvb3QsIG1lbWJlcik7XG4gKiBgYGBcbiAqL1xuY29uc3QgaGFzUHJvZHVjdGlvblVzYWdlID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBzdGF0ZTogTm9VbnVzZWRFeHBvcnRzU3RhdGUsXG4gIHJlcG9Sb290OiBzdHJpbmcsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IHJlbGF0ZWRTeW1ib2xzID0gW1xuICAgIHJlc29sdmVDYW5vbmljYWxTeW1ib2wobWVtYmVyLm1lbWJlclN5bWJvbCwgY2hlY2tlciksXG4gICAgLi4uY29sbGVjdEhlcml0YWdlTWVtYmVyU3ltYm9scyhwcm9ncmFtLCBjaGVja2VyLCBtZW1iZXIpLm1hcCgoc3ltYm9sKSA9PlxuICAgICAgcmVzb2x2ZUNhbm9uaWNhbFN5bWJvbChzeW1ib2wsIGNoZWNrZXIpLFxuICAgICksXG4gIF07XG4gIGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb24gPSB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obWVtYmVyLmhvc3REZWNsYXJhdGlvbilcbiAgICA/IG1lbWJlci5ob3N0RGVjbGFyYXRpb25cbiAgICA6IHZvaWQgMDtcblxuICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbiAhPT0gdm9pZCAwKSB7XG4gICAgY29uc3QgZGVjbGFyZWRUeXBlID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbih2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpO1xuICAgIGNvbnN0IGRlY2xhcmVkTWVtYmVyID0gY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShcbiAgICAgIGRlY2xhcmVkVHlwZSxcbiAgICAgIG1lbWJlci5tZW1iZXJOYW1lLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBkZWNsYXJlZE1lbWJlciAhPT0gdm9pZCAwICYmXG4gICAgICByZWxhdGVkU3ltYm9scy5ldmVyeSgoc3ltYm9sKSA9PiAhaXNTYW1lU3ltYm9sKHN5bWJvbCwgZGVjbGFyZWRNZW1iZXIpKVxuICAgICkge1xuICAgICAgcmVsYXRlZFN5bWJvbHMucHVzaChyZXNvbHZlQ2Fub25pY2FsU3ltYm9sKGRlY2xhcmVkTWVtYmVyLCBjaGVja2VyKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3QpO1xuXG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGgucmVzb2x2ZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUgfHxcbiAgICAgIGlzVGVzdEZpbGUoZmlsZW5hbWUsIHN0YXRlLCBub3JtYWxpemVkUm9vdClcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmRVc2FnZVN5bWJvbCA9IChub2RlOiB0cy5Ob2RlKTogdHMuU3ltYm9sIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgKHRzLmlzSWRlbnRpZmllcihub2RlKSB8fCB0cy5pc1N0cmluZ0xpdGVyYWxMaWtlKG5vZGUpKSAmJlxuICAgICAgICAhaXNEZWNsYXJhdGlvbk5hbWUobm9kZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBnZXRVc2FnZVN5bWJvbChub2RlLCBjaGVja2VyKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2FuZGlkYXRlICE9PSB2b2lkIDAgJiZcbiAgICAgICAgICByZWxhdGVkU3ltYm9scy5zb21lKChzeW1ib2wpID0+IGlzU2FtZVN5bWJvbChzeW1ib2wsIGNhbmRpZGF0ZSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTdHJ1Y3R1cmFsUHJvcGVydHlSZWFkKG5vZGUsIGNoZWNrZXIsIG1lbWJlcikpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVyLm1lbWJlclN5bWJvbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNDb21wdXRlZE1lbWJlclJlYWQobm9kZSwgY2hlY2tlciwgbWVtYmVyLCByZWxhdGVkU3ltYm9scykgfHxcbiAgICAgICAgaXNDYWxsQXJndW1lbnRNZW1iZXIobm9kZSwgY2hlY2tlciwgbWVtYmVyKSB8fFxuICAgICAgICBpc09iamVjdENvbnRyYWN0SGFuZG9mZihub2RlLCBjaGVja2VyLCBtZW1iZXIpXG4gICAgICAgID8gbWVtYmVyLm1lbWJlclN5bWJvbFxuICAgICAgICA6IHRzLmZvckVhY2hDaGlsZChub2RlLCBmaW5kVXNhZ2VTeW1ib2wpO1xuICAgIH07XG5cbiAgICBpZiAoZmluZFVzYWdlU3ltYm9sKHNvdXJjZUZpbGUpICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCB7IGhhc1Byb2R1Y3Rpb25Vc2FnZSB9O1xuIl19
@@ -0,0 +1,41 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ import * as ts from "typescript";
3
+ import type { NoUnusedExportsState } from "../no-unused-exports/types.js";
4
+ type ParserServices = ReturnType<typeof ESLintUtils.getParserServices>;
5
+ /**
6
+ * Collects unused direct public members from a linted source file.
7
+ * @param sourceFile Source file being linted.
8
+ * @param program TypeScript project program.
9
+ * @param state Normalized public API and test patterns.
10
+ * @param repoRoot Root directory used for glob matching.
11
+ * @param parserServices TypeScript and ESTree node maps.
12
+ * @returns Members outside the public API with no production use.
13
+ * @example
14
+ * ```typescript
15
+ * const unused = collectUnusedPublicMembers(sourceFile, program, state, repoRoot, services);
16
+ * ```
17
+ */
18
+ declare const collectUnusedPublicMembers: (sourceFile: ts.SourceFile, program: ts.Program, state: NoUnusedExportsState, repoRoot: string, parserServices: ParserServices) => import("./member-declaration-utilities.js").PublicMember[];
19
+ /**
20
+ * Finds the program source file matching an absolute lint filename.
21
+ * @param program TypeScript project program.
22
+ * @param filename Absolute filename to find.
23
+ * @returns Matching source file when it belongs to the program.
24
+ * @example
25
+ * ```typescript
26
+ * const sourceFile = getProgramSourceFile(program, context.filename);
27
+ * ```
28
+ */
29
+ declare const getProgramSourceFile: (program: ts.Program, filename: string) => ts.SourceFile | undefined;
30
+ /**
31
+ * Returns the absolute project root from the TypeScript program.
32
+ * @param program TypeScript project program.
33
+ * @returns Absolute TypeScript project root.
34
+ * @example
35
+ * ```typescript
36
+ * const projectRoot = getProjectRoot(program);
37
+ * ```
38
+ */
39
+ declare const getProjectRoot: (program: ts.Program) => string;
40
+ export { collectUnusedPublicMembers, getProgramSourceFile, getProjectRoot };
41
+ //# sourceMappingURL=member-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/member-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AASvE,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,0BAA0B,GAC9B,YAAY,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,CAAC,OAAO,EACnB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,gBAAgB,cAAc,4DAU/B,CAAC;AAEF;;;;;;;;;GASG;AACH,QAAA,MAAM,oBAAoB,GACxB,SAAS,EAAE,CAAC,OAAO,EACnB,UAAU,MAAM,KACf,EAAE,CAAC,UAAU,GAAG,SAOd,CAAC;AAEN;;;;;;;;GAQG;AACH,QAAA,MAAM,cAAc,GAAI,SAAS,EAAE,CAAC,OAAO,KAAG,MACD,CAAC;AAE9C,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ import path from "node:path";
3
+ import * as ts from "typescript";
4
+ import { collectPublicMembers } from "./member-declaration-utilities.js";
5
+ import { isPublicApiHost, isPublicApiMember, } from "./member-public-api-utilities.js";
6
+ import { hasProductionUsage } from "./member-usage-utilities.js";
7
+ /**
8
+ * Collects unused direct public members from a linted source file.
9
+ * @param sourceFile Source file being linted.
10
+ * @param program TypeScript project program.
11
+ * @param state Normalized public API and test patterns.
12
+ * @param repoRoot Root directory used for glob matching.
13
+ * @param parserServices TypeScript and ESTree node maps.
14
+ * @returns Members outside the public API with no production use.
15
+ * @example
16
+ * ```typescript
17
+ * const unused = collectUnusedPublicMembers(sourceFile, program, state, repoRoot, services);
18
+ * ```
19
+ */
20
+ const collectUnusedPublicMembers = (sourceFile, program, state, repoRoot, parserServices) => {
21
+ const checker = program.getTypeChecker();
22
+ return collectPublicMembers(sourceFile, checker, parserServices).filter((member) => !isPublicApiHost(program, state, repoRoot, member.hostSymbol) &&
23
+ !isPublicApiMember(program, state, repoRoot, member.memberSymbol) &&
24
+ !hasProductionUsage(program, state, repoRoot, member));
25
+ };
26
+ /**
27
+ * Finds the program source file matching an absolute lint filename.
28
+ * @param program TypeScript project program.
29
+ * @param filename Absolute filename to find.
30
+ * @returns Matching source file when it belongs to the program.
31
+ * @example
32
+ * ```typescript
33
+ * const sourceFile = getProgramSourceFile(program, context.filename);
34
+ * ```
35
+ */
36
+ const getProgramSourceFile = (program, filename) => program
37
+ .getSourceFiles()
38
+ .find((sourceFile) => path.resolve(sourceFile.fileName).toLowerCase() ===
39
+ path.resolve(filename).toLowerCase());
40
+ /**
41
+ * Returns the absolute project root from the TypeScript program.
42
+ * @param program TypeScript project program.
43
+ * @returns Absolute TypeScript project root.
44
+ * @example
45
+ * ```typescript
46
+ * const projectRoot = getProjectRoot(program);
47
+ * ```
48
+ */
49
+ const getProjectRoot = (program) => path.resolve(program.getCurrentDirectory());
50
+ export { collectUnusedPublicMembers, getProgramSourceFile, getProjectRoot };
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1wdWJsaWMtbWVtYmVycy9tZW1iZXItdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJakMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUNMLGVBQWUsRUFDZixpQkFBaUIsR0FDbEIsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUk5RDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLDBCQUEwQixHQUFHLENBQ2pDLFVBQXlCLEVBQ3pCLE9BQW1CLEVBQ25CLEtBQTJCLEVBQzNCLFFBQWdCLEVBQ2hCLGNBQThCLEVBQzlCLEVBQUU7SUFDRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7SUFFekMsT0FBTyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FDckUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNULENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDN0QsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ2pFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQ3hELENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLG9CQUFvQixHQUFHLENBQzNCLE9BQW1CLEVBQ25CLFFBQWdCLEVBQ1csRUFBRSxDQUM3QixPQUFPO0tBQ0osY0FBYyxFQUFFO0tBQ2hCLElBQUksQ0FDSCxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFO0lBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQ3ZDLENBQUM7QUFFTjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBbUIsRUFBVSxFQUFFLENBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztBQUU5QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFU0xpbnRVdGlscyB9IGZyb20gXCJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbmltcG9ydCB0eXBlIHsgTm9VbnVzZWRFeHBvcnRzU3RhdGUgfSBmcm9tIFwiLi4vbm8tdW51c2VkLWV4cG9ydHMvdHlwZXNcIjtcblxuaW1wb3J0IHsgY29sbGVjdFB1YmxpY01lbWJlcnMgfSBmcm9tIFwiLi9tZW1iZXItZGVjbGFyYXRpb24tdXRpbGl0aWVzXCI7XG5pbXBvcnQge1xuICBpc1B1YmxpY0FwaUhvc3QsXG4gIGlzUHVibGljQXBpTWVtYmVyLFxufSBmcm9tIFwiLi9tZW1iZXItcHVibGljLWFwaS11dGlsaXRpZXNcIjtcbmltcG9ydCB7IGhhc1Byb2R1Y3Rpb25Vc2FnZSB9IGZyb20gXCIuL21lbWJlci11c2FnZS11dGlsaXRpZXNcIjtcblxudHlwZSBQYXJzZXJTZXJ2aWNlcyA9IFJldHVyblR5cGU8dHlwZW9mIEVTTGludFV0aWxzLmdldFBhcnNlclNlcnZpY2VzPjtcblxuLyoqXG4gKiBDb2xsZWN0cyB1bnVzZWQgZGlyZWN0IHB1YmxpYyBtZW1iZXJzIGZyb20gYSBsaW50ZWQgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSBiZWluZyBsaW50ZWQuXG4gKiBAcGFyYW0gcHJvZ3JhbSBUeXBlU2NyaXB0IHByb2plY3QgcHJvZ3JhbS5cbiAqIEBwYXJhbSBzdGF0ZSBOb3JtYWxpemVkIHB1YmxpYyBBUEkgYW5kIHRlc3QgcGF0dGVybnMuXG4gKiBAcGFyYW0gcmVwb1Jvb3QgUm9vdCBkaXJlY3RvcnkgdXNlZCBmb3IgZ2xvYiBtYXRjaGluZy5cbiAqIEBwYXJhbSBwYXJzZXJTZXJ2aWNlcyBUeXBlU2NyaXB0IGFuZCBFU1RyZWUgbm9kZSBtYXBzLlxuICogQHJldHVybnMgTWVtYmVycyBvdXRzaWRlIHRoZSBwdWJsaWMgQVBJIHdpdGggbm8gcHJvZHVjdGlvbiB1c2UuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdW51c2VkID0gY29sbGVjdFVudXNlZFB1YmxpY01lbWJlcnMoc291cmNlRmlsZSwgcHJvZ3JhbSwgc3RhdGUsIHJlcG9Sb290LCBzZXJ2aWNlcyk7XG4gKiBgYGBcbiAqL1xuY29uc3QgY29sbGVjdFVudXNlZFB1YmxpY01lbWJlcnMgPSAoXG4gIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gIHByb2dyYW06IHRzLlByb2dyYW0sXG4gIHN0YXRlOiBOb1VudXNlZEV4cG9ydHNTdGF0ZSxcbiAgcmVwb1Jvb3Q6IHN0cmluZyxcbiAgcGFyc2VyU2VydmljZXM6IFBhcnNlclNlcnZpY2VzLFxuKSA9PiB7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG5cbiAgcmV0dXJuIGNvbGxlY3RQdWJsaWNNZW1iZXJzKHNvdXJjZUZpbGUsIGNoZWNrZXIsIHBhcnNlclNlcnZpY2VzKS5maWx0ZXIoXG4gICAgKG1lbWJlcikgPT5cbiAgICAgICFpc1B1YmxpY0FwaUhvc3QocHJvZ3JhbSwgc3RhdGUsIHJlcG9Sb290LCBtZW1iZXIuaG9zdFN5bWJvbCkgJiZcbiAgICAgICFpc1B1YmxpY0FwaU1lbWJlcihwcm9ncmFtLCBzdGF0ZSwgcmVwb1Jvb3QsIG1lbWJlci5tZW1iZXJTeW1ib2wpICYmXG4gICAgICAhaGFzUHJvZHVjdGlvblVzYWdlKHByb2dyYW0sIHN0YXRlLCByZXBvUm9vdCwgbWVtYmVyKSxcbiAgKTtcbn07XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2dyYW0gc291cmNlIGZpbGUgbWF0Y2hpbmcgYW4gYWJzb2x1dGUgbGludCBmaWxlbmFtZS5cbiAqIEBwYXJhbSBwcm9ncmFtIFR5cGVTY3JpcHQgcHJvamVjdCBwcm9ncmFtLlxuICogQHBhcmFtIGZpbGVuYW1lIEFic29sdXRlIGZpbGVuYW1lIHRvIGZpbmQuXG4gKiBAcmV0dXJucyBNYXRjaGluZyBzb3VyY2UgZmlsZSB3aGVuIGl0IGJlbG9uZ3MgdG8gdGhlIHByb2dyYW0uXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc291cmNlRmlsZSA9IGdldFByb2dyYW1Tb3VyY2VGaWxlKHByb2dyYW0sIGNvbnRleHQuZmlsZW5hbWUpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldFByb2dyYW1Tb3VyY2VGaWxlID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuKTogdHMuU291cmNlRmlsZSB8IHVuZGVmaW5lZCA9PlxuICBwcm9ncmFtXG4gICAgLmdldFNvdXJjZUZpbGVzKClcbiAgICAuZmluZChcbiAgICAgIChzb3VyY2VGaWxlKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUoc291cmNlRmlsZS5maWxlTmFtZSkudG9Mb3dlckNhc2UoKSA9PT1cbiAgICAgICAgcGF0aC5yZXNvbHZlKGZpbGVuYW1lKS50b0xvd2VyQ2FzZSgpLFxuICAgICk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcHJvamVjdCByb290IGZyb20gdGhlIFR5cGVTY3JpcHQgcHJvZ3JhbS5cbiAqIEBwYXJhbSBwcm9ncmFtIFR5cGVTY3JpcHQgcHJvamVjdCBwcm9ncmFtLlxuICogQHJldHVybnMgQWJzb2x1dGUgVHlwZVNjcmlwdCBwcm9qZWN0IHJvb3QuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcHJvamVjdFJvb3QgPSBnZXRQcm9qZWN0Um9vdChwcm9ncmFtKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXRQcm9qZWN0Um9vdCA9IChwcm9ncmFtOiB0cy5Qcm9ncmFtKTogc3RyaW5nID0+XG4gIHBhdGgucmVzb2x2ZShwcm9ncmFtLmdldEN1cnJlbnREaXJlY3RvcnkoKSk7XG5cbmV4cG9ydCB7IGNvbGxlY3RVbnVzZWRQdWJsaWNNZW1iZXJzLCBnZXRQcm9ncmFtU291cmNlRmlsZSwgZ2V0UHJvamVjdFJvb3QgfTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import type { Rule } from "eslint";
2
+ /** ESLint rule flagging public members unused by production code. */
3
+ declare const noUnusedPublicMembersRule: Rule.RuleModule;
4
+ export { noUnusedPublicMembersRule };
5
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-public-members/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiBnC,qEAAqE;AACrE,QAAA,MAAM,yBAAyB,EAAE,IAAI,CAAC,UAsFrC,CAAC;AAEF,OAAO,EAAE,yBAAyB,EAAE,CAAC"}