@codeperfect/eslint-plugin 2.4.0 → 2.6.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 (163) hide show
  1. package/README.md +2 -0
  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 +6 -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/consistent-barrel-files-options.d.ts +1 -11
  10. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
  11. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +6 -14
  12. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
  13. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +2 -4
  14. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts.map +1 -1
  15. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.js +4 -134
  16. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts +14 -0
  17. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts.map +1 -0
  18. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.js +154 -0
  19. package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.d.ts.map +1 -1
  20. package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.js +10 -12
  21. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
  22. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +4 -11
  23. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -1
  24. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +2 -12
  25. package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
  26. package/dist/domain/architecture/consistent-barrel-files/rule.js +4 -3
  27. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts +14 -0
  28. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts.map +1 -0
  29. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.js +187 -0
  30. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts +26 -0
  31. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts.map +1 -0
  32. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.js +95 -0
  33. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts +32 -0
  34. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts.map +1 -0
  35. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.js +78 -0
  36. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts +18 -0
  37. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts.map +1 -0
  38. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.js +45 -0
  39. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts +34 -0
  40. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts.map +1 -0
  41. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.js +44 -0
  42. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts +59 -0
  43. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map +1 -0
  44. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js +133 -0
  45. package/dist/domain/architecture/no-unused-exports/{no-unused-exports-utilities.d.ts → no-unused-exports-usage-utilities.d.ts} +2 -23
  46. package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.d.ts.map +1 -0
  47. package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.js +106 -0
  48. package/dist/domain/architecture/no-unused-exports/rule.js +4 -2
  49. package/dist/domain/core/index.d.ts +1 -0
  50. package/dist/domain/core/index.d.ts.map +1 -1
  51. package/dist/domain/core/index.js +2 -1
  52. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts +58 -0
  53. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts.map +1 -0
  54. package/dist/domain/core/no-multiple-declarators/rule-utilities.js +204 -0
  55. package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
  56. package/dist/domain/core/no-multiple-declarators/rule.js +9 -211
  57. package/dist/domain/core/no-multiple-declarators/types.js +2 -2
  58. package/dist/domain/core/no-useless-delegation/index.d.ts +2 -0
  59. package/dist/domain/core/no-useless-delegation/index.d.ts.map +1 -0
  60. package/dist/domain/core/no-useless-delegation/index.js +2 -0
  61. package/dist/domain/core/no-useless-delegation/rule.d.ts +5 -0
  62. package/dist/domain/core/no-useless-delegation/rule.d.ts.map +1 -0
  63. package/dist/domain/core/no-useless-delegation/rule.js +200 -0
  64. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts +57 -0
  65. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -0
  66. package/dist/domain/core/prefer-interface-types/rule-utilities.js +105 -0
  67. package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
  68. package/dist/domain/core/prefer-interface-types/rule.js +2 -104
  69. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts +25 -0
  70. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts.map +1 -0
  71. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.js +64 -0
  72. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts +2 -24
  73. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
  74. package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +3 -65
  75. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -2
  76. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +2 -2
  77. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  78. package/dist/domain/docs/no-interface-member-docs/rule.js +3 -2
  79. package/dist/domain/docs/require-example-language/examples-collect.d.ts +15 -0
  80. package/dist/domain/docs/require-example-language/examples-collect.d.ts.map +1 -0
  81. package/dist/domain/docs/require-example-language/examples-collect.js +113 -0
  82. package/dist/domain/docs/require-example-language/examples.d.ts +24 -13
  83. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  84. package/dist/domain/docs/require-example-language/examples.js +2 -111
  85. package/dist/domain/docs/require-example-language/fixes.js +4 -4
  86. package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
  87. package/dist/domain/docs/require-example-language/rule.js +9 -8
  88. package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
  89. package/dist/domain/docs/require-example-language/types.js +1 -1
  90. package/dist/domain/index.d.ts +1 -1
  91. package/dist/domain/index.d.ts.map +1 -1
  92. package/dist/domain/index.js +2 -2
  93. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
  94. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +8 -8
  95. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
  96. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +10 -9
  97. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -1
  98. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +2 -5
  99. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +14 -16
  100. package/dist/domain/testing/aaa/analyzer.classification.traversal.js +6 -4
  101. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  102. package/dist/domain/testing/aaa/analyzer.super.js +10 -8
  103. package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -1
  104. package/dist/domain/testing/assert-actual-expected-names/rule.js +21 -23
  105. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
  106. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +1 -1
  107. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts.map +1 -1
  108. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.js +2 -160
  109. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts +41 -0
  110. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts.map +1 -0
  111. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.js +161 -0
  112. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
  113. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +2 -2
  114. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts +81 -0
  115. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts.map +1 -0
  116. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.js +181 -0
  117. package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
  118. package/dist/domain/testing/enforce-aaa-structure/rule.js +28 -217
  119. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts +29 -0
  120. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts.map +1 -0
  121. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.js +200 -0
  122. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts +12 -0
  123. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts.map +1 -0
  124. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.js +151 -0
  125. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts +16 -0
  126. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts.map +1 -0
  127. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.js +109 -0
  128. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +1 -1
  129. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +18 -450
  130. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.d.ts.map +1 -1
  131. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.js +7 -4
  132. package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.d.ts.map +1 -1
  133. package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +7 -4
  134. package/dist/domain/testing/prefer-vi-mocked-import/fix.js +2 -2
  135. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts +18 -0
  136. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -0
  137. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +162 -0
  138. package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -1
  139. package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.js +5 -4
  140. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts +29 -0
  141. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts.map +1 -0
  142. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.js +100 -0
  143. package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts.map +1 -1
  144. package/dist/domain/testing/prefer-vi-mocked-import/match.js +5 -246
  145. package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
  146. package/dist/domain/testing/prefer-vi-mocked-import/rule.js +18 -20
  147. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  148. package/dist/domain/testing/require-act-result-capture/rule.js +47 -21
  149. package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
  150. package/dist/domain/testing/require-test-companion/rule.js +2 -4
  151. package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -1
  152. package/dist/domain/testing/single-act-statement/rule.js +20 -22
  153. package/dist/index.d.ts +1 -1
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +2 -2
  156. package/dist/infrastructure/codeperfect-plugin.d.ts +2 -0
  157. package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
  158. package/dist/infrastructure/codeperfect-plugin.js +3 -2
  159. package/dist/infrastructure/presets.d.ts.map +1 -1
  160. package/dist/infrastructure/presets.js +3 -1
  161. package/package.json +60 -69
  162. package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.d.ts.map +0 -1
  163. package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.js +0 -612
@@ -0,0 +1,187 @@
1
+ import { collectPatternIdentifierNames, getExportSpecifierLocalName, getExportSpecifierName, } from "./no-unused-exports-pattern-utilities.js";
2
+ import { asRecord, readArrayProperty, readStringProperty, } from "./no-unused-exports-record-utilities.js";
3
+ /** Declaration statement types that own one named `id` property. */
4
+ const NAMED_DECLARATION_TYPES = new Set([
5
+ "ClassDeclaration",
6
+ "FunctionDeclaration",
7
+ "TSEnumDeclaration",
8
+ "TSInterfaceDeclaration",
9
+ "TSTypeAliasDeclaration",
10
+ ]);
11
+ /**
12
+ * Records variable declarator names as value declarations.
13
+ * @param declarationNames Map from declared name to declaration metadata.
14
+ * @param declarations Variable declarator candidates.
15
+ * @param statement Owning statement used for diagnostics.
16
+ * @example
17
+ * ```typescript
18
+ * addVariableDeclaratorNames(declarationNames, declarations, statement);
19
+ * ```
20
+ */
21
+ const addVariableDeclaratorNames = (declarationNames, declarations, statement) => {
22
+ for (const declaration of declarations) {
23
+ const declarationRecord = asRecord(declaration);
24
+ if (declarationRecord === void 0) {
25
+ continue;
26
+ }
27
+ const patternNames = collectPatternIdentifierNames(declarationRecord["id"]);
28
+ for (const name of patternNames) {
29
+ declarationNames.set(name, { kind: "value", node: statement });
30
+ }
31
+ }
32
+ };
33
+ /**
34
+ * Collects top-level declaration names owned by the current module.
35
+ * @param body Program body statements.
36
+ * @returns Map from locally declared name to its declaration metadata.
37
+ * @example
38
+ * ```typescript
39
+ * const declarations = collectLocalDeclarationNames(program.body);
40
+ * ```
41
+ */
42
+ const collectLocalDeclarationNames = (body) => {
43
+ const declarationNames = new Map();
44
+ for (const statement of body) {
45
+ const declarationCandidate = statement.type === "ExportNamedDeclaration" &&
46
+ statement.declaration !== null &&
47
+ statement.declaration !== void 0
48
+ ? statement.declaration
49
+ : statement;
50
+ const declarationCandidateRecord = asRecord(declarationCandidate);
51
+ const declarationCandidateType = readStringProperty(declarationCandidate, "type");
52
+ if (declarationCandidateRecord === void 0 ||
53
+ declarationCandidateType === void 0) {
54
+ continue;
55
+ }
56
+ if (NAMED_DECLARATION_TYPES.has(declarationCandidateType)) {
57
+ const declarationName = readStringProperty(declarationCandidateRecord["id"], "name");
58
+ if (declarationName !== void 0) {
59
+ declarationNames.set(declarationName, {
60
+ kind: declarationCandidateType === "TSInterfaceDeclaration" ||
61
+ declarationCandidateType === "TSTypeAliasDeclaration"
62
+ ? "type"
63
+ : "value",
64
+ node: statement,
65
+ });
66
+ }
67
+ continue;
68
+ }
69
+ if (declarationCandidateType !== "VariableDeclaration") {
70
+ continue;
71
+ }
72
+ const declarations = readArrayProperty(declarationCandidateRecord, "declarations");
73
+ if (declarations === void 0) {
74
+ continue;
75
+ }
76
+ addVariableDeclaratorNames(declarationNames, declarations, statement);
77
+ }
78
+ return declarationNames;
79
+ };
80
+ /**
81
+ * Adds exported elements described by one export declaration site.
82
+ * @param exportedElements Mutable exported-element accumulator.
83
+ * @param statement Named export statement being inspected.
84
+ * @example
85
+ * ```typescript
86
+ * addDeclarationExportElements(exportedElements, statement);
87
+ * ```
88
+ */
89
+ const addDeclarationExportElements = (exportedElements, statement) => {
90
+ const declaration = asRecord(statement.declaration);
91
+ if (readStringProperty(declaration, "type") === "VariableDeclaration") {
92
+ const variableDeclarations = readArrayProperty(declaration, "declarations");
93
+ if (variableDeclarations !== void 0) {
94
+ for (const variable of variableDeclarations) {
95
+ const patternNames = collectPatternIdentifierNames(asRecord(variable)?.["id"]);
96
+ for (const name of patternNames) {
97
+ exportedElements.push({
98
+ exportedName: name,
99
+ exportKind: "value",
100
+ node: statement,
101
+ });
102
+ }
103
+ }
104
+ }
105
+ return;
106
+ }
107
+ const declarationName = readStringProperty(declaration?.["id"], "name");
108
+ const declarationType = readStringProperty(declaration, "type");
109
+ const exportKind = declarationType === "TSInterfaceDeclaration" ||
110
+ declarationType === "TSTypeAliasDeclaration"
111
+ ? "type"
112
+ : "value";
113
+ if (typeof declarationName === "string") {
114
+ exportedElements.push({
115
+ exportedName: declarationName,
116
+ exportKind,
117
+ node: statement,
118
+ });
119
+ }
120
+ };
121
+ /**
122
+ * Adds exported elements for the specifiers of one named export statement.
123
+ * @param exportedElements Mutable exported-element accumulator.
124
+ * @param localDeclarationNames Locally declared names for specifier lookup.
125
+ * @param statement Named export statement being inspected.
126
+ * @example
127
+ * ```typescript
128
+ * addSpecifierExportElements(exportedElements, localDeclarationNames, statement);
129
+ * ```
130
+ */
131
+ const addSpecifierExportElements = (exportedElements, localDeclarationNames, statement) => {
132
+ for (const specifier of statement.specifiers) {
133
+ const localName = getExportSpecifierLocalName(specifier);
134
+ const localDeclaration = localName === void 0 ? void 0 : localDeclarationNames.get(localName);
135
+ if (localDeclaration === void 0) {
136
+ continue;
137
+ }
138
+ const exportedName = getExportSpecifierName(specifier);
139
+ if (exportedName !== void 0) {
140
+ const statementExportKind = readStringProperty(statement, "exportKind");
141
+ const specifierExportKind = readStringProperty(specifier, "exportKind");
142
+ const isTypeOnlyExport = statementExportKind === "type" || specifierExportKind === "type";
143
+ exportedElements.push({
144
+ exportedName,
145
+ exportKind: isTypeOnlyExport ? "type" : localDeclaration.kind,
146
+ node: localDeclaration.node,
147
+ });
148
+ }
149
+ }
150
+ };
151
+ /**
152
+ * Collects exported elements from one program body.
153
+ * @param body Program body statements.
154
+ * @returns Exported elements in declaration order.
155
+ * @example
156
+ * ```typescript
157
+ * const exported = collectExportedElements(program.body);
158
+ * ```
159
+ */
160
+ const collectExportedElements = (body) => {
161
+ const exportedElements = [];
162
+ const localDeclarationNames = collectLocalDeclarationNames(body);
163
+ for (const statement of body) {
164
+ if (statement.type === "ExportDefaultDeclaration") {
165
+ exportedElements.push({
166
+ exportedName: "default",
167
+ exportKind: "value",
168
+ node: statement,
169
+ });
170
+ continue;
171
+ }
172
+ if (statement.type !== "ExportNamedDeclaration") {
173
+ continue;
174
+ }
175
+ if (statement.source !== null && statement.source !== void 0) {
176
+ continue;
177
+ }
178
+ if (statement.declaration !== null && statement.declaration !== void 0) {
179
+ addDeclarationExportElements(exportedElements, statement);
180
+ continue;
181
+ }
182
+ addSpecifierExportElements(exportedElements, localDeclarationNames, statement);
183
+ }
184
+ return exportedElements;
185
+ };
186
+ export { collectExportedElements };
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLWV4cG9ydHMtZGVjbGFyYXRpb24tdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLWV4cG9ydHMvbm8tdW51c2VkLWV4cG9ydHMtZGVjbGFyYXRpb24tdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsMkJBQTJCLEVBQzNCLHNCQUFzQixHQUN2QixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLG9FQUFvRTtBQUNwRSxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3RDLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLHdCQUF3QjtJQUN4Qix3QkFBd0I7Q0FDekIsQ0FBQyxDQUFDO0FBV0g7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxDQUNqQyxnQkFBK0MsRUFDL0MsWUFBZ0MsRUFDaEMsU0FBc0MsRUFDaEMsRUFBRTtJQUNSLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFaEQsSUFBSSxpQkFBaUIsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFNBQVM7UUFDWCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsNkJBQTZCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUU1RSxLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2hDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUks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QUFJLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdELFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxTQUFTLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxTQUFTLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkUsNEJBQTRCLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFMUQsU0FBUztRQUNYLENBQUM7UUFFRCwwQkFBMEIsQ0FDeEIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixTQUFTLENBQ1YsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBU1QgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSAqIGFzIEVTVHJlZSBmcm9tIFwiZXN0cmVlXCI7XG5cbmltcG9ydCB0eXBlIHsgRXhwb3J0ZWRFbGVtZW50LCBFeHBvcnRLaW5kIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW1wb3J0IHtcbiAgY29sbGVjdFBhdHRlcm5JZGVudGlmaWVyTmFtZXMsXG4gIGdldEV4cG9ydFNwZWNpZmllckxvY2FsTmFtZSxcbiAgZ2V0RXhwb3J0U3BlY2lmaWVyTmFtZSxcbn0gZnJvbSBcIi4vbm8tdW51c2VkLWV4cG9ydHMtcGF0dGVybi11dGlsaXRpZXNcIjtcbmltcG9ydCB7XG4gIGFzUmVjb3JkLFxuICByZWFkQXJyYXlQcm9wZXJ0eSxcbiAgcmVhZFN0cmluZ1Byb3BlcnR5LFxufSBmcm9tIFwiLi9uby11bnVzZWQtZXhwb3J0cy1yZWNvcmQtdXRpbGl0aWVzXCI7XG5cbi8qKiBEZWNsYXJhdGlvbiBzdGF0ZW1lbnQgdHlwZXMgdGhhdCBvd24gb25lIG5hbWVkIGBpZGAgcHJvcGVydHkuICovXG5jb25zdCBOQU1FRF9ERUNMQVJBVElPTl9UWVBFUyA9IG5ldyBTZXQoW1xuICBcIkNsYXNzRGVjbGFyYXRpb25cIixcbiAgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIsXG4gIFwiVFNFbnVtRGVjbGFyYXRpb25cIixcbiAgXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIsXG4gIFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiLFxuXSk7XG5cbi8qKiBMb2NhbCB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gZGlzY292ZXJlZCB3aGVuIGNvbGxlY3RpbmcgZXhwb3J0IHNvdXJjZXMuICovXG5pbnRlcmZhY2UgTG9jYWxEZWNsYXJhdGlvbiB7XG4gIC8qKiBFeHBvcnQga2luZCBpbXBsaWVkIGJ5IHRoZSBkZWNsYXJhdGlvbi4gKi9cbiAga2luZDogRXhwb3J0S2luZDtcblxuICAvKiogRGVjbGFyYXRpb24gc3RhdGVtZW50IHVzZWQgZm9yIGRpYWdub3N0aWNzLiAqL1xuICBub2RlOiBBU1QuUHJvZ3JhbVtcImJvZHlcIl1bbnVtYmVyXTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHZhcmlhYmxlIGRlY2xhcmF0b3IgbmFtZXMgYXMgdmFsdWUgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIGRlY2xhcmF0aW9uTmFtZXMgTWFwIGZyb20gZGVjbGFyZWQgbmFtZSB0byBkZWNsYXJhdGlvbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSBkZWNsYXJhdGlvbnMgVmFyaWFibGUgZGVjbGFyYXRvciBjYW5kaWRhdGVzLlxuICogQHBhcmFtIHN0YXRlbWVudCBPd25pbmcgc3RhdGVtZW50IHVzZWQgZm9yIGRpYWdub3N0aWNzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGFkZFZhcmlhYmxlRGVjbGFyYXRvck5hbWVzKGRlY2xhcmF0aW9uTmFtZXMsIGRlY2xhcmF0aW9ucywgc3RhdGVtZW50KTtcbiAqIGBgYFxuICovXG5jb25zdCBhZGRWYXJpYWJsZURlY2xhcmF0b3JOYW1lcyA9IChcbiAgZGVjbGFyYXRpb25OYW1lczogTWFwPHN0cmluZywgTG9jYWxEZWNsYXJhdGlvbj4sXG4gIGRlY2xhcmF0aW9uczogcmVhZG9ubHkgdW5rbm93bltdLFxuICBzdGF0ZW1lbnQ6IEFTVC5Qcm9ncmFtW1wiYm9keVwiXVtudW1iZXJdLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25SZWNvcmQgPSBhc1JlY29yZChkZWNsYXJhdGlvbik7XG5cbiAgICBpZiAoZGVjbGFyYXRpb25SZWNvcmQgPT09IHZvaWQgMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybk5hbWVzID0gY29sbGVjdFBhdHRlcm5JZGVudGlmaWVyTmFtZXMoZGVjbGFyYXRpb25SZWNvcmRbXCJpZFwiXSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGF0dGVybk5hbWVzKSB7XG4gICAgICBkZWNsYXJhdGlvbk5hbWVzLnNldChuYW1lLCB7IGtpbmQ6IFwidmFsdWVcIiwgbm9kZTogc3RhdGVtZW50IH0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDb2xsZWN0cyB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gbmFtZXMgb3duZWQgYnkgdGhlIGN1cnJlbnQgbW9kdWxlLlxuICogQHBhcmFtIGJvZHkgUHJvZ3JhbSBib2R5IHN0YXRlbWVudHMuXG4gKiBAcmV0dXJucyBNYXAgZnJvbSBsb2NhbGx5IGRlY2xhcmVkIG5hbWUgdG8gaXRzIGRlY2xhcmF0aW9uIG1ldGFkYXRhLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGNvbGxlY3RMb2NhbERlY2xhcmF0aW9uTmFtZXMocHJvZ3JhbS5ib2R5KTtcbiAqIGBgYFxuICovXG5jb25zdCBjb2xsZWN0TG9jYWxEZWNsYXJhdGlvbk5hbWVzID0gKFxuICBib2R5OiBBU1QuUHJvZ3JhbVtcImJvZHlcIl0sXG4pOiBNYXA8c3RyaW5nLCBMb2NhbERlY2xhcmF0aW9uPiA9PiB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uTmFtZXMgPSBuZXcgTWFwPHN0cmluZywgTG9jYWxEZWNsYXJhdGlvbj4oKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBib2R5KSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25DYW5kaWRhdGUgPVxuICAgICAgc3RhdGVtZW50LnR5cGUgPT09IFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiICYmXG4gICAgICBzdGF0ZW1lbnQuZGVjbGFyYXRpb24gIT09IG51bGwgJiZcbiAgICAgIHN0YXRlbWVudC5kZWNsYXJhdGlvbiAhPT0gdm9pZCAwXG4gICAgICAgID8gc3RhdGVtZW50LmRlY2xhcmF0aW9uXG4gICAgICAgIDogc3RhdGVtZW50O1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uQ2FuZGlkYXRlUmVjb3JkID0gYXNSZWNvcmQoZGVjbGFyYXRpb25DYW5kaWRhdGUpO1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uQ2FuZGlkYXRlVHlwZSA9IHJlYWRTdHJpbmdQcm9wZXJ0eShcbiAgICAgIGRlY2xhcmF0aW9uQ2FuZGlkYXRlLFxuICAgICAgXCJ0eXBlXCIsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIGRlY2xhcmF0aW9uQ2FuZGlkYXRlUmVjb3JkID09PSB2b2lkIDAgfHxcbiAgICAgIGRlY2xhcmF0aW9uQ2FuZGlkYXRlVHlwZSA9PT0gdm9pZCAwXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoTkFNRURfREVDTEFSQVRJT05fVFlQRVMuaGFzKGRlY2xhcmF0aW9uQ2FuZGlkYXRlVHlwZSkpIHtcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9uTmFtZSA9IHJlYWRTdHJpbmdQcm9wZXJ0eShcbiAgICAgICAgZGVjbGFyYXRpb25DYW5kaWRhdGVSZWNvcmRbXCJpZFwiXSxcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZGVjbGFyYXRpb25OYW1lICE9PSB2b2lkIDApIHtcbiAgICAgICAgZGVjbGFyYXRpb25OYW1lcy5zZXQoZGVjbGFyYXRpb25OYW1lLCB7XG4gICAgICAgICAga2luZDpcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uQ2FuZGlkYXRlVHlwZSA9PT0gXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIgfHxcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uQ2FuZGlkYXRlVHlwZSA9PT0gXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCJcbiAgICAgICAgICAgICAgPyBcInR5cGVcIlxuICAgICAgICAgICAgICA6IFwidmFsdWVcIixcbiAgICAgICAgICBub2RlOiBzdGF0ZW1lbnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZGVjbGFyYXRpb25DYW5kaWRhdGVUeXBlICE9PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyYXRpb25zID0gcmVhZEFycmF5UHJvcGVydHkoXG4gICAgICBkZWNsYXJhdGlvbkNhbmRpZGF0ZVJlY29yZCxcbiAgICAgIFwiZGVjbGFyYXRpb25zXCIsXG4gICAgKTtcblxuICAgIGlmIChkZWNsYXJhdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYWRkVmFyaWFibGVEZWNsYXJhdG9yTmFtZXMoZGVjbGFyYXRpb25OYW1lcywgZGVjbGFyYXRpb25zLCBzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGRlY2xhcmF0aW9uTmFtZXM7XG59O1xuXG4vKipcbiAqIEFkZHMgZXhwb3J0ZWQgZWxlbWVudHMgZGVzY3JpYmVkIGJ5IG9uZSBleHBvcnQgZGVjbGFyYXRpb24gc2l0ZS5cbiAqIEBwYXJhbSBleHBvcnRlZEVsZW1lbnRzIE11dGFibGUgZXhwb3J0ZWQtZWxlbWVudCBhY2N1bXVsYXRvci5cbiAqIEBwYXJhbSBzdGF0ZW1lbnQgTmFtZWQgZXhwb3J0IHN0YXRlbWVudCBiZWluZyBpbnNwZWN0ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogYWRkRGVjbGFyYXRpb25FeHBvcnRFbGVtZW50cyhleHBvcnRlZEVsZW1lbnRzLCBzdGF0ZW1lbnQpO1xuICogYGBgXG4gKi9cbmNvbnN0IGFkZERlY2xhcmF0aW9uRXhwb3J0RWxlbWVudHMgPSAoXG4gIGV4cG9ydGVkRWxlbWVudHM6IEV4cG9ydGVkRWxlbWVudFtdLFxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5FeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gYXNSZWNvcmQoc3RhdGVtZW50LmRlY2xhcmF0aW9uKTtcblxuICBpZiAocmVhZFN0cmluZ1Byb3BlcnR5KGRlY2xhcmF0aW9uLCBcInR5cGVcIikgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XG4gICAgY29uc3QgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSByZWFkQXJyYXlQcm9wZXJ0eShkZWNsYXJhdGlvbiwgXCJkZWNsYXJhdGlvbnNcIik7XG5cbiAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbnMgIT09IHZvaWQgMCkge1xuICAgICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZURlY2xhcmF0aW9ucykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuTmFtZXMgPSBjb2xsZWN0UGF0dGVybklkZW50aWZpZXJOYW1lcyhcbiAgICAgICAgICBhc1JlY29yZCh2YXJpYWJsZSk/LltcImlkXCJdLFxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBwYXR0ZXJuTmFtZXMpIHtcbiAgICAgICAgICBleHBvcnRlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgZXhwb3J0ZWROYW1lOiBuYW1lLFxuICAgICAgICAgICAgZXhwb3J0S2luZDogXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgbm9kZTogc3RhdGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVjbGFyYXRpb25OYW1lID0gcmVhZFN0cmluZ1Byb3BlcnR5KGRlY2xhcmF0aW9uPy5bXCJpZFwiXSwgXCJuYW1lXCIpO1xuICBjb25zdCBkZWNsYXJhdGlvblR5cGUgPSByZWFkU3RyaW5nUHJvcGVydHkoZGVjbGFyYXRpb24sIFwidHlwZVwiKTtcbiAgY29uc3QgZXhwb3J0S2luZDogRXhwb3J0S2luZCA9XG4gICAgZGVjbGFyYXRpb25UeXBlID09PSBcIlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cIiB8fFxuICAgIGRlY2xhcmF0aW9uVHlwZSA9PT0gXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCJcbiAgICAgID8gXCJ0eXBlXCJcbiAgICAgIDogXCJ2YWx1ZVwiO1xuXG4gIGlmICh0eXBlb2YgZGVjbGFyYXRpb25OYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgZXhwb3J0ZWRFbGVtZW50cy5wdXNoKHtcbiAgICAgIGV4cG9ydGVkTmFtZTogZGVjbGFyYXRpb25OYW1lLFxuICAgICAgZXhwb3J0S2luZCxcbiAgICAgIG5vZGU6IHN0YXRlbWVudCxcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBBZGRzIGV4cG9ydGVkIGVsZW1lbnRzIGZvciB0aGUgc3BlY2lmaWVycyBvZiBvbmUgbmFtZWQgZXhwb3J0IHN0YXRlbWVudC5cbiAqIEBwYXJhbSBleHBvcnRlZEVsZW1lbnRzIE11dGFibGUgZXhwb3J0ZWQtZWxlbWVudCBhY2N1bXVsYXRvci5cbiAqIEBwYXJhbSBsb2NhbERlY2xhcmF0aW9uTmFtZXMgTG9jYWxseSBkZWNsYXJlZCBuYW1lcyBmb3Igc3BlY2lmaWVyIGxvb2t1cC5cbiAqIEBwYXJhbSBzdGF0ZW1lbnQgTmFtZWQgZXhwb3J0IHN0YXRlbWVudCBiZWluZyBpbnNwZWN0ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogYWRkU3BlY2lmaWVyRXhwb3J0RWxlbWVudHMoZXhwb3J0ZWRFbGVtZW50cywgbG9jYWxEZWNsYXJhdGlvbk5hbWVzLCBzdGF0ZW1lbnQpO1xuICogYGBgXG4gKi9cbmNvbnN0IGFkZFNwZWNpZmllckV4cG9ydEVsZW1lbnRzID0gKFxuICBleHBvcnRlZEVsZW1lbnRzOiBFeHBvcnRlZEVsZW1lbnRbXSxcbiAgbG9jYWxEZWNsYXJhdGlvbk5hbWVzOiBSZWFkb25seU1hcDxzdHJpbmcsIExvY2FsRGVjbGFyYXRpb24+LFxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5FeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHN0YXRlbWVudC5zcGVjaWZpZXJzKSB7XG4gICAgY29uc3QgbG9jYWxOYW1lID0gZ2V0RXhwb3J0U3BlY2lmaWVyTG9jYWxOYW1lKHNwZWNpZmllcik7XG4gICAgY29uc3QgbG9jYWxEZWNsYXJhdGlvbiA9XG4gICAgICBsb2NhbE5hbWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsRGVjbGFyYXRpb25OYW1lcy5nZXQobG9jYWxOYW1lKTtcblxuICAgIGlmIChsb2NhbERlY2xhcmF0aW9uID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cG9ydGVkTmFtZSA9IGdldEV4cG9ydFNwZWNpZmllck5hbWUoc3BlY2lmaWVyKTtcblxuICAgIGlmIChleHBvcnRlZE5hbWUgIT09IHZvaWQgMCkge1xuICAgICAgY29uc3Qgc3RhdGVtZW50RXhwb3J0S2luZCA9IHJlYWRTdHJpbmdQcm9wZXJ0eShzdGF0ZW1lbnQsIFwiZXhwb3J0S2luZFwiKTtcbiAgICAgIGNvbnN0IHNwZWNpZmllckV4cG9ydEtpbmQgPSByZWFkU3RyaW5nUHJvcGVydHkoc3BlY2lmaWVyLCBcImV4cG9ydEtpbmRcIik7XG4gICAgICBjb25zdCBpc1R5cGVPbmx5RXhwb3J0ID1cbiAgICAgICAgc3RhdGVtZW50RXhwb3J0S2luZCA9PT0gXCJ0eXBlXCIgfHwgc3BlY2lmaWVyRXhwb3J0S2luZCA9PT0gXCJ0eXBlXCI7XG5cbiAgICAgIGV4cG9ydGVkRWxlbWVudHMucHVzaCh7XG4gICAgICAgIGV4cG9ydGVkTmFtZSxcbiAgICAgICAgZXhwb3J0S2luZDogaXNUeXBlT25seUV4cG9ydCA/IFwidHlwZVwiIDogbG9jYWxEZWNsYXJhdGlvbi5raW5kLFxuICAgICAgICBub2RlOiBsb2NhbERlY2xhcmF0aW9uLm5vZGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdHMgZXhwb3J0ZWQgZWxlbWVudHMgZnJvbSBvbmUgcHJvZ3JhbSBib2R5LlxuICogQHBhcmFtIGJvZHkgUHJvZ3JhbSBib2R5IHN0YXRlbWVudHMuXG4gKiBAcmV0dXJucyBFeHBvcnRlZCBlbGVtZW50cyBpbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleHBvcnRlZCA9IGNvbGxlY3RFeHBvcnRlZEVsZW1lbnRzKHByb2dyYW0uYm9keSk7XG4gKiBgYGBcbiAqL1xuY29uc3QgY29sbGVjdEV4cG9ydGVkRWxlbWVudHMgPSAoXG4gIGJvZHk6IEFTVC5Qcm9ncmFtW1wiYm9keVwiXSxcbik6IEV4cG9ydGVkRWxlbWVudFtdID0+IHtcbiAgY29uc3QgZXhwb3J0ZWRFbGVtZW50czogRXhwb3J0ZWRFbGVtZW50W10gPSBbXTtcbiAgY29uc3QgbG9jYWxEZWNsYXJhdGlvbk5hbWVzID0gY29sbGVjdExvY2FsRGVjbGFyYXRpb25OYW1lcyhib2R5KTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBib2R5KSB7XG4gICAgaWYgKHN0YXRlbWVudC50eXBlID09PSBcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiKSB7XG4gICAgICBleHBvcnRlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICBleHBvcnRlZE5hbWU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBleHBvcnRLaW5kOiBcInZhbHVlXCIsXG4gICAgICAgIG5vZGU6IHN0YXRlbWVudCxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudC5zb3VyY2UgIT09IG51bGwgJiYgc3RhdGVtZW50LnNvdXJjZSAhPT0gdm9pZCAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50LmRlY2xhcmF0aW9uICE9PSBudWxsICYmIHN0YXRlbWVudC5kZWNsYXJhdGlvbiAhPT0gdm9pZCAwKSB7XG4gICAgICBhZGREZWNsYXJhdGlvbkV4cG9ydEVsZW1lbnRzKGV4cG9ydGVkRWxlbWVudHMsIHN0YXRlbWVudCk7XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGFkZFNwZWNpZmllckV4cG9ydEVsZW1lbnRzKFxuICAgICAgZXhwb3J0ZWRFbGVtZW50cyxcbiAgICAgIGxvY2FsRGVjbGFyYXRpb25OYW1lcyxcbiAgICAgIHN0YXRlbWVudCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGV4cG9ydGVkRWxlbWVudHM7XG59O1xuXG5leHBvcnQgeyBjb2xsZWN0RXhwb3J0ZWRFbGVtZW50cyB9O1xuIl19
@@ -0,0 +1,26 @@
1
+ import type { Rule } from "eslint";
2
+ import * as ts from "typescript";
3
+ import type { ExportKind } from "./types.js";
4
+ /**
5
+ * Resolves TypeScript parser services program when available.
6
+ * @param context Rule context.
7
+ * @returns TypeScript program when available.
8
+ * @example
9
+ * ```typescript
10
+ * const program = getTypeScriptProgram(context);
11
+ * ```
12
+ */
13
+ declare const getTypeScriptProgram: (context: Rule.RuleContext) => ts.Program | undefined;
14
+ /**
15
+ * Checks whether one identifier is one concrete usage candidate for the export kind.
16
+ * @param identifier Identifier node.
17
+ * @param exportKind Whether type-only or value usage is required.
18
+ * @returns True when the identifier can satisfy usage.
19
+ * @example
20
+ * ```typescript
21
+ * const concrete = isConcreteUsageIdentifier(identifier, "value");
22
+ * ```
23
+ */
24
+ declare const isConcreteUsageIdentifier: (identifier: ts.Identifier, exportKind: ExportKind) => boolean;
25
+ export { getTypeScriptProgram, isConcreteUsageIdentifier };
26
+ //# sourceMappingURL=no-unused-exports-identifier-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unused-exports-identifier-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;GAQG;AACH,QAAA,MAAM,oBAAoB,GACxB,SAAS,IAAI,CAAC,WAAW,KACxB,EAAE,CAAC,OAAO,GAAG,SAOf,CAAC;AAsEF;;;;;;;;;GASG;AACH,QAAA,MAAM,yBAAyB,GAC7B,YAAY,EAAE,CAAC,UAAU,EACzB,YAAY,UAAU,KACrB,OAQF,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ import * as ts from "typescript";
3
+ /**
4
+ * Resolves TypeScript parser services program when available.
5
+ * @param context Rule context.
6
+ * @returns TypeScript program when available.
7
+ * @example
8
+ * ```typescript
9
+ * const program = getTypeScriptProgram(context);
10
+ * ```
11
+ */
12
+ const getTypeScriptProgram = (context) => {
13
+ try {
14
+ const services = ESLintUtils.getParserServices(context);
15
+ return services.program;
16
+ }
17
+ catch {
18
+ return void 0;
19
+ }
20
+ };
21
+ /**
22
+ * Checks whether an identifier participates in one declaration/import/export site.
23
+ * @param identifier Identifier node to evaluate.
24
+ * @returns True when the identifier is declaration-only syntax.
25
+ * @example
26
+ * ```typescript
27
+ * const declaration = isDeclarationOnlyIdentifier(identifier);
28
+ * ```
29
+ */
30
+ const isDeclarationOnlyIdentifier = (identifier) => {
31
+ const parent = identifier.parent;
32
+ return (ts.isImportSpecifier(parent) ||
33
+ ts.isImportClause(parent) ||
34
+ ts.isNamespaceImport(parent) ||
35
+ ts.isImportEqualsDeclaration(parent) ||
36
+ ts.isExportSpecifier(parent) ||
37
+ ts.isTypeAliasDeclaration(parent) ||
38
+ ts.isInterfaceDeclaration(parent) ||
39
+ ts.isTypeParameterDeclaration(parent) ||
40
+ (ts.isVariableDeclaration(parent) && parent.name === identifier) ||
41
+ (ts.isFunctionDeclaration(parent) && parent.name === identifier) ||
42
+ (ts.isClassDeclaration(parent) && parent.name === identifier) ||
43
+ (ts.isParameter(parent) && parent.name === identifier));
44
+ };
45
+ /**
46
+ * Checks whether one identifier node appears under a type node.
47
+ * @param identifier Candidate identifier.
48
+ * @returns True when the identifier is inside type-only syntax.
49
+ * @example
50
+ * ```typescript
51
+ * const typePosition = isTypePositionIdentifier(identifier);
52
+ * ```
53
+ */
54
+ const isTypePositionIdentifier = (identifier) => {
55
+ const visitNode = (current) => {
56
+ if (ts.isTypeQueryNode(current)) {
57
+ return false;
58
+ }
59
+ if (ts.isTypeNode(current)) {
60
+ return true;
61
+ }
62
+ if (ts.isExpressionStatement(current) ||
63
+ ts.isCallExpression(current) ||
64
+ ts.isPropertyAccessExpression(current) ||
65
+ ts.isElementAccessExpression(current) ||
66
+ ts.isVariableDeclaration(current) ||
67
+ ts.isReturnStatement(current)) {
68
+ return false;
69
+ }
70
+ if (ts.isSourceFile(current)) {
71
+ return false;
72
+ }
73
+ return visitNode(current.parent);
74
+ };
75
+ return visitNode(identifier);
76
+ };
77
+ /**
78
+ * Checks whether one identifier is one concrete usage candidate for the export kind.
79
+ * @param identifier Identifier node.
80
+ * @param exportKind Whether type-only or value usage is required.
81
+ * @returns True when the identifier can satisfy usage.
82
+ * @example
83
+ * ```typescript
84
+ * const concrete = isConcreteUsageIdentifier(identifier, "value");
85
+ * ```
86
+ */
87
+ const isConcreteUsageIdentifier = (identifier, exportKind) => {
88
+ if (isDeclarationOnlyIdentifier(identifier)) {
89
+ return false;
90
+ }
91
+ const isInTypePosition = isTypePositionIdentifier(identifier);
92
+ return exportKind === "type" ? isInTypePosition : !isInTypePosition;
93
+ };
94
+ export { getTypeScriptProgram, isConcreteUsageIdentifier };
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLWV4cG9ydHMtaWRlbnRpZmllci11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL2FyY2hpdGVjdHVyZS9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1pZGVudGlmaWVyLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJakM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLENBQzNCLE9BQXlCLEVBQ0QsRUFBRTtJQUMxQixJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUMsT0FBZ0IsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUMsQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsVUFBeUIsRUFBVyxFQUFFO0lBQ3pFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFFakMsT0FBTyxDQUNMLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDNUIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDekIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUM1QixFQUFFLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDNUIsRUFBRSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztRQUNqQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDO1FBQ2pDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUM7UUFDckMsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7UUFDaEUsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7UUFDaEUsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7UUFDN0QsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQ3ZELENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxVQUF5QixFQUFXLEVBQUU7SUFDdEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFnQixFQUFXLEVBQUU7UUFDOUMsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFDRSxFQUFFLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7WUFDNUIsRUFBRSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQztZQUN0QyxFQUFFLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUM7WUFDakMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUM3QixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0seUJBQXlCLEdBQUcsQ0FDaEMsVUFBeUIsRUFDekIsVUFBc0IsRUFDYixFQUFFO0lBQ1gsSUFBSSwyQkFBMkIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFOUQsT0FBTyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztBQUN0RSxDQUFDLENBQUM7QUFFRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHsgRVNMaW50VXRpbHMgfSBmcm9tIFwiQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzXCI7XG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgdHlwZSB7IEV4cG9ydEtpbmQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFJlc29sdmVzIFR5cGVTY3JpcHQgcGFyc2VyIHNlcnZpY2VzIHByb2dyYW0gd2hlbiBhdmFpbGFibGUuXG4gKiBAcGFyYW0gY29udGV4dCBSdWxlIGNvbnRleHQuXG4gKiBAcmV0dXJucyBUeXBlU2NyaXB0IHByb2dyYW0gd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcHJvZ3JhbSA9IGdldFR5cGVTY3JpcHRQcm9ncmFtKGNvbnRleHQpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldFR5cGVTY3JpcHRQcm9ncmFtID0gKFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0LFxuKTogdHMuUHJvZ3JhbSB8IHVuZGVmaW5lZCA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VydmljZXMgPSBFU0xpbnRVdGlscy5nZXRQYXJzZXJTZXJ2aWNlcyhjb250ZXh0IGFzIG5ldmVyKTtcbiAgICByZXR1cm4gc2VydmljZXMucHJvZ3JhbTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBpZGVudGlmaWVyIHBhcnRpY2lwYXRlcyBpbiBvbmUgZGVjbGFyYXRpb24vaW1wb3J0L2V4cG9ydCBzaXRlLlxuICogQHBhcmFtIGlkZW50aWZpZXIgSWRlbnRpZmllciBub2RlIHRvIGV2YWx1YXRlLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBpZGVudGlmaWVyIGlzIGRlY2xhcmF0aW9uLW9ubHkgc3ludGF4LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlY2xhcmF0aW9uID0gaXNEZWNsYXJhdGlvbk9ubHlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzRGVjbGFyYXRpb25Pbmx5SWRlbnRpZmllciA9IChpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHBhcmVudCA9IGlkZW50aWZpZXIucGFyZW50O1xuXG4gIHJldHVybiAoXG4gICAgdHMuaXNJbXBvcnRTcGVjaWZpZXIocGFyZW50KSB8fFxuICAgIHRzLmlzSW1wb3J0Q2xhdXNlKHBhcmVudCkgfHxcbiAgICB0cy5pc05hbWVzcGFjZUltcG9ydChwYXJlbnQpIHx8XG4gICAgdHMuaXNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbihwYXJlbnQpIHx8XG4gICAgdHMuaXNFeHBvcnRTcGVjaWZpZXIocGFyZW50KSB8fFxuICAgIHRzLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24ocGFyZW50KSB8fFxuICAgIHRzLmlzSW50ZXJmYWNlRGVjbGFyYXRpb24ocGFyZW50KSB8fFxuICAgIHRzLmlzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKHBhcmVudCkgfHxcbiAgICAodHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKHBhcmVudCkgJiYgcGFyZW50Lm5hbWUgPT09IGlkZW50aWZpZXIpIHx8XG4gICAgKHRzLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihwYXJlbnQpICYmIHBhcmVudC5uYW1lID09PSBpZGVudGlmaWVyKSB8fFxuICAgICh0cy5pc0NsYXNzRGVjbGFyYXRpb24ocGFyZW50KSAmJiBwYXJlbnQubmFtZSA9PT0gaWRlbnRpZmllcikgfHxcbiAgICAodHMuaXNQYXJhbWV0ZXIocGFyZW50KSAmJiBwYXJlbnQubmFtZSA9PT0gaWRlbnRpZmllcilcbiAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgb25lIGlkZW50aWZpZXIgbm9kZSBhcHBlYXJzIHVuZGVyIGEgdHlwZSBub2RlLlxuICogQHBhcmFtIGlkZW50aWZpZXIgQ2FuZGlkYXRlIGlkZW50aWZpZXIuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGlkZW50aWZpZXIgaXMgaW5zaWRlIHR5cGUtb25seSBzeW50YXguXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHlwZVBvc2l0aW9uID0gaXNUeXBlUG9zaXRpb25JZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzVHlwZVBvc2l0aW9uSWRlbnRpZmllciA9IChpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHZpc2l0Tm9kZSA9IChjdXJyZW50OiB0cy5Ob2RlKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHRzLmlzVHlwZVF1ZXJ5Tm9kZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0cy5pc1R5cGVOb2RlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0cy5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoY3VycmVudCkgfHxcbiAgICAgIHRzLmlzQ2FsbEV4cHJlc3Npb24oY3VycmVudCkgfHxcbiAgICAgIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKGN1cnJlbnQpIHx8XG4gICAgICB0cy5pc0VsZW1lbnRBY2Nlc3NFeHByZXNzaW9uKGN1cnJlbnQpIHx8XG4gICAgICB0cy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oY3VycmVudCkgfHxcbiAgICAgIHRzLmlzUmV0dXJuU3RhdGVtZW50KGN1cnJlbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRzLmlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB2aXNpdE5vZGUoY3VycmVudC5wYXJlbnQpO1xuICB9O1xuXG4gIHJldHVybiB2aXNpdE5vZGUoaWRlbnRpZmllcik7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIG9uZSBpZGVudGlmaWVyIGlzIG9uZSBjb25jcmV0ZSB1c2FnZSBjYW5kaWRhdGUgZm9yIHRoZSBleHBvcnQga2luZC5cbiAqIEBwYXJhbSBpZGVudGlmaWVyIElkZW50aWZpZXIgbm9kZS5cbiAqIEBwYXJhbSBleHBvcnRLaW5kIFdoZXRoZXIgdHlwZS1vbmx5IG9yIHZhbHVlIHVzYWdlIGlzIHJlcXVpcmVkLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBpZGVudGlmaWVyIGNhbiBzYXRpc2Z5IHVzYWdlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbmNyZXRlID0gaXNDb25jcmV0ZVVzYWdlSWRlbnRpZmllcihpZGVudGlmaWVyLCBcInZhbHVlXCIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGlzQ29uY3JldGVVc2FnZUlkZW50aWZpZXIgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIsXG4gIGV4cG9ydEtpbmQ6IEV4cG9ydEtpbmQsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKGlzRGVjbGFyYXRpb25Pbmx5SWRlbnRpZmllcihpZGVudGlmaWVyKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlzSW5UeXBlUG9zaXRpb24gPSBpc1R5cGVQb3NpdGlvbklkZW50aWZpZXIoaWRlbnRpZmllcik7XG5cbiAgcmV0dXJuIGV4cG9ydEtpbmQgPT09IFwidHlwZVwiID8gaXNJblR5cGVQb3NpdGlvbiA6ICFpc0luVHlwZVBvc2l0aW9uO1xufTtcblxuZXhwb3J0IHsgZ2V0VHlwZVNjcmlwdFByb2dyYW0sIGlzQ29uY3JldGVVc2FnZUlkZW50aWZpZXIgfTtcbiJdfQ==
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Collects identifier names from one variable pattern.
3
+ * @param node Variable pattern candidate.
4
+ * @returns Identifier names declared by the pattern.
5
+ * @example
6
+ * ```typescript
7
+ * const names = collectPatternIdentifierNames(pattern);
8
+ * ```
9
+ */
10
+ declare const collectPatternIdentifierNames: (node: unknown) => string[];
11
+ /**
12
+ * Reads one export specifier name.
13
+ * @param specifier Export specifier candidate.
14
+ * @returns Exported name when available.
15
+ * @example
16
+ * ```typescript
17
+ * const name = getExportSpecifierName(specifier);
18
+ * ```
19
+ */
20
+ declare const getExportSpecifierName: (specifier: unknown) => string | undefined;
21
+ /**
22
+ * Reads one local export specifier name.
23
+ * @param specifier Export specifier candidate.
24
+ * @returns Local specifier name when available.
25
+ * @example
26
+ * ```typescript
27
+ * const name = getExportSpecifierLocalName(specifier);
28
+ * ```
29
+ */
30
+ declare const getExportSpecifierLocalName: (specifier: unknown) => string | undefined;
31
+ export { collectPatternIdentifierNames, getExportSpecifierLocalName, getExportSpecifierName, };
32
+ //# sourceMappingURL=no-unused-exports-pattern-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unused-exports-pattern-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,QAAA,MAAM,6BAA6B,GAAI,MAAM,OAAO,KAAG,MAAM,EA+C5D,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,sBAAsB,GAAI,WAAW,OAAO,KAAG,MAAM,GAAG,SAW7D,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,2BAA2B,GAC/B,WAAW,OAAO,KACjB,MAAM,GAAG,SAIX,CAAC;AAEF,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,EAC3B,sBAAsB,GACvB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { asRecord, readArrayProperty, readStringProperty, } from "./no-unused-exports-record-utilities.js";
2
+ /**
3
+ * Collects identifier names from one variable pattern.
4
+ * @param node Variable pattern candidate.
5
+ * @returns Identifier names declared by the pattern.
6
+ * @example
7
+ * ```typescript
8
+ * const names = collectPatternIdentifierNames(pattern);
9
+ * ```
10
+ */
11
+ const collectPatternIdentifierNames = (node) => {
12
+ const pattern = asRecord(node);
13
+ if (pattern === void 0) {
14
+ return [];
15
+ }
16
+ const patternType = readStringProperty(pattern, "type");
17
+ if (patternType === "Identifier") {
18
+ const name = readStringProperty(pattern, "name");
19
+ return name === void 0 ? [] : [name];
20
+ }
21
+ if (patternType === "RestElement") {
22
+ return collectPatternIdentifierNames(pattern["argument"]);
23
+ }
24
+ if (patternType === "AssignmentPattern") {
25
+ return collectPatternIdentifierNames(pattern["left"]);
26
+ }
27
+ if (patternType === "ArrayPattern") {
28
+ const elements = readArrayProperty(pattern, "elements");
29
+ return elements === void 0
30
+ ? []
31
+ : elements.flatMap((element) => collectPatternIdentifierNames(element));
32
+ }
33
+ if (patternType === "ObjectPattern") {
34
+ const properties = readArrayProperty(pattern, "properties");
35
+ return properties === void 0
36
+ ? []
37
+ : properties.flatMap((property) => {
38
+ if (readStringProperty(property, "type") === "RestElement") {
39
+ return collectPatternIdentifierNames(asRecord(property)?.["argument"]);
40
+ }
41
+ return collectPatternIdentifierNames(asRecord(property)?.["value"]);
42
+ });
43
+ }
44
+ return [];
45
+ };
46
+ /**
47
+ * Reads one export specifier name.
48
+ * @param specifier Export specifier candidate.
49
+ * @returns Exported name when available.
50
+ * @example
51
+ * ```typescript
52
+ * const name = getExportSpecifierName(specifier);
53
+ * ```
54
+ */
55
+ const getExportSpecifierName = (specifier) => {
56
+ const candidate = asRecord(specifier);
57
+ const exportedName = readStringProperty(candidate?.["exported"], "name");
58
+ if (typeof exportedName === "string") {
59
+ return exportedName;
60
+ }
61
+ const localName = readStringProperty(candidate?.["local"], "name");
62
+ return typeof localName === "string" ? localName : void 0;
63
+ };
64
+ /**
65
+ * Reads one local export specifier name.
66
+ * @param specifier Export specifier candidate.
67
+ * @returns Local specifier name when available.
68
+ * @example
69
+ * ```typescript
70
+ * const name = getExportSpecifierLocalName(specifier);
71
+ * ```
72
+ */
73
+ const getExportSpecifierLocalName = (specifier) => {
74
+ const candidate = asRecord(specifier);
75
+ return readStringProperty(candidate?.["local"], "name");
76
+ };
77
+ export { collectPatternIdentifierNames, getExportSpecifierLocalName, getExportSpecifierName, };
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLWV4cG9ydHMtcGF0dGVybi11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL2FyY2hpdGVjdHVyZS9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1wYXR0ZXJuLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLGlCQUFpQixFQUNqQixrQkFBa0IsR0FDbkIsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxJQUFhLEVBQVksRUFBRTtJQUNoRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFL0IsSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFeEQsSUFBSSxXQUFXLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksV0FBVyxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sNkJBQTZCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksV0FBVyxLQUFLLG1CQUFtQixFQUFFLENBQUM7UUFDeEMsT0FBTyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxXQUFXLEtBQUssY0FBYyxFQUFFLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXhELE9BQU8sUUFBUSxLQUFLLEtBQUssQ0FBQztZQUN4QixDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFJLFdBQVcsS0FBSyxlQUFlLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFNUQsT0FBTyxVQUFVLEtBQUssS0FBSyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDOUIsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssYUFBYSxFQUFFLENBQUM7b0JBQzNELE9BQU8sNkJBQTZCLENBQ2xDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUNqQyxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsT0FBTyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsU0FBa0IsRUFBc0IsRUFBRTtJQUN4RSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFekUsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFbkUsT0FBTyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLDJCQUEyQixHQUFHLENBQ2xDLFNBQWtCLEVBQ0UsRUFBRTtJQUN0QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdEMsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUM7QUFFRixPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLDJCQUEyQixFQUMzQixzQkFBc0IsR0FDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFzUmVjb3JkLFxuICByZWFkQXJyYXlQcm9wZXJ0eSxcbiAgcmVhZFN0cmluZ1Byb3BlcnR5LFxufSBmcm9tIFwiLi9uby11bnVzZWQtZXhwb3J0cy1yZWNvcmQtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogQ29sbGVjdHMgaWRlbnRpZmllciBuYW1lcyBmcm9tIG9uZSB2YXJpYWJsZSBwYXR0ZXJuLlxuICogQHBhcmFtIG5vZGUgVmFyaWFibGUgcGF0dGVybiBjYW5kaWRhdGUuXG4gKiBAcmV0dXJucyBJZGVudGlmaWVyIG5hbWVzIGRlY2xhcmVkIGJ5IHRoZSBwYXR0ZXJuLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5hbWVzID0gY29sbGVjdFBhdHRlcm5JZGVudGlmaWVyTmFtZXMocGF0dGVybik7XG4gKiBgYGBcbiAqL1xuY29uc3QgY29sbGVjdFBhdHRlcm5JZGVudGlmaWVyTmFtZXMgPSAobm9kZTogdW5rbm93bik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgcGF0dGVybiA9IGFzUmVjb3JkKG5vZGUpO1xuXG4gIGlmIChwYXR0ZXJuID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYXR0ZXJuVHlwZSA9IHJlYWRTdHJpbmdQcm9wZXJ0eShwYXR0ZXJuLCBcInR5cGVcIik7XG5cbiAgaWYgKHBhdHRlcm5UeXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgIGNvbnN0IG5hbWUgPSByZWFkU3RyaW5nUHJvcGVydHkocGF0dGVybiwgXCJuYW1lXCIpO1xuICAgIHJldHVybiBuYW1lID09PSB2b2lkIDAgPyBbXSA6IFtuYW1lXTtcbiAgfVxuXG4gIGlmIChwYXR0ZXJuVHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKSB7XG4gICAgcmV0dXJuIGNvbGxlY3RQYXR0ZXJuSWRlbnRpZmllck5hbWVzKHBhdHRlcm5bXCJhcmd1bWVudFwiXSk7XG4gIH1cblxuICBpZiAocGF0dGVyblR5cGUgPT09IFwiQXNzaWdubWVudFBhdHRlcm5cIikge1xuICAgIHJldHVybiBjb2xsZWN0UGF0dGVybklkZW50aWZpZXJOYW1lcyhwYXR0ZXJuW1wibGVmdFwiXSk7XG4gIH1cblxuICBpZiAocGF0dGVyblR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHJlYWRBcnJheVByb3BlcnR5KHBhdHRlcm4sIFwiZWxlbWVudHNcIik7XG5cbiAgICByZXR1cm4gZWxlbWVudHMgPT09IHZvaWQgMFxuICAgICAgPyBbXVxuICAgICAgOiBlbGVtZW50cy5mbGF0TWFwKChlbGVtZW50KSA9PiBjb2xsZWN0UGF0dGVybklkZW50aWZpZXJOYW1lcyhlbGVtZW50KSk7XG4gIH1cblxuICBpZiAocGF0dGVyblR5cGUgPT09IFwiT2JqZWN0UGF0dGVyblwiKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHJlYWRBcnJheVByb3BlcnR5KHBhdHRlcm4sIFwicHJvcGVydGllc1wiKTtcblxuICAgIHJldHVybiBwcm9wZXJ0aWVzID09PSB2b2lkIDBcbiAgICAgID8gW11cbiAgICAgIDogcHJvcGVydGllcy5mbGF0TWFwKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgIGlmIChyZWFkU3RyaW5nUHJvcGVydHkocHJvcGVydHksIFwidHlwZVwiKSA9PT0gXCJSZXN0RWxlbWVudFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdFBhdHRlcm5JZGVudGlmaWVyTmFtZXMoXG4gICAgICAgICAgICAgIGFzUmVjb3JkKHByb3BlcnR5KT8uW1wiYXJndW1lbnRcIl0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2xsZWN0UGF0dGVybklkZW50aWZpZXJOYW1lcyhhc1JlY29yZChwcm9wZXJ0eSk/LltcInZhbHVlXCJdKTtcbiAgICAgICAgfSk7XG4gIH1cblxuICByZXR1cm4gW107XG59O1xuXG4vKipcbiAqIFJlYWRzIG9uZSBleHBvcnQgc3BlY2lmaWVyIG5hbWUuXG4gKiBAcGFyYW0gc3BlY2lmaWVyIEV4cG9ydCBzcGVjaWZpZXIgY2FuZGlkYXRlLlxuICogQHJldHVybnMgRXhwb3J0ZWQgbmFtZSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuYW1lID0gZ2V0RXhwb3J0U3BlY2lmaWVyTmFtZShzcGVjaWZpZXIpO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldEV4cG9ydFNwZWNpZmllck5hbWUgPSAoc3BlY2lmaWVyOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgY2FuZGlkYXRlID0gYXNSZWNvcmQoc3BlY2lmaWVyKTtcbiAgY29uc3QgZXhwb3J0ZWROYW1lID0gcmVhZFN0cmluZ1Byb3BlcnR5KGNhbmRpZGF0ZT8uW1wiZXhwb3J0ZWRcIl0sIFwibmFtZVwiKTtcblxuICBpZiAodHlwZW9mIGV4cG9ydGVkTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBleHBvcnRlZE5hbWU7XG4gIH1cblxuICBjb25zdCBsb2NhbE5hbWUgPSByZWFkU3RyaW5nUHJvcGVydHkoY2FuZGlkYXRlPy5bXCJsb2NhbFwiXSwgXCJuYW1lXCIpO1xuXG4gIHJldHVybiB0eXBlb2YgbG9jYWxOYW1lID09PSBcInN0cmluZ1wiID8gbG9jYWxOYW1lIDogdm9pZCAwO1xufTtcblxuLyoqXG4gKiBSZWFkcyBvbmUgbG9jYWwgZXhwb3J0IHNwZWNpZmllciBuYW1lLlxuICogQHBhcmFtIHNwZWNpZmllciBFeHBvcnQgc3BlY2lmaWVyIGNhbmRpZGF0ZS5cbiAqIEByZXR1cm5zIExvY2FsIHNwZWNpZmllciBuYW1lIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5hbWUgPSBnZXRFeHBvcnRTcGVjaWZpZXJMb2NhbE5hbWUoc3BlY2lmaWVyKTtcbiAqIGBgYFxuICovXG5jb25zdCBnZXRFeHBvcnRTcGVjaWZpZXJMb2NhbE5hbWUgPSAoXG4gIHNwZWNpZmllcjogdW5rbm93bixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGFzUmVjb3JkKHNwZWNpZmllcik7XG5cbiAgcmV0dXJuIHJlYWRTdHJpbmdQcm9wZXJ0eShjYW5kaWRhdGU/LltcImxvY2FsXCJdLCBcIm5hbWVcIik7XG59O1xuXG5leHBvcnQge1xuICBjb2xsZWN0UGF0dGVybklkZW50aWZpZXJOYW1lcyxcbiAgZ2V0RXhwb3J0U3BlY2lmaWVyTG9jYWxOYW1lLFxuICBnZXRFeHBvcnRTcGVjaWZpZXJOYW1lLFxufTtcbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import * as ts from "typescript";
2
+ import type { ExportUsage, NoUnusedExportsState } from "./types.js";
3
+ /**
4
+ * Collects public API exposure usages for one exported symbol.
5
+ * @param program TypeScript program.
6
+ * @param sourceFilename Source filename where export is defined.
7
+ * @param state Normalized rule options.
8
+ * @param repoRoot Absolute repository root used for file classification.
9
+ * @param targetSymbol Export symbol being classified.
10
+ * @returns Public API exposure usages for the exported symbol.
11
+ * @example
12
+ * ```typescript
13
+ * const usages = collectPublicApiExposureUsages(program, sourceFilename, state, repoRoot, targetSymbol);
14
+ * ```
15
+ */
16
+ declare const collectPublicApiExposureUsages: (program: ts.Program, sourceFilename: string, state: NoUnusedExportsState, repoRoot: string, targetSymbol: ts.Symbol) => ExportUsage[];
17
+ export { collectPublicApiExposureUsages };
18
+ //# sourceMappingURL=no-unused-exports-public-api-usage-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unused-exports-public-api-usage-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAQjE;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,8BAA8B,GAClC,SAAS,EAAE,CAAC,OAAO,EACnB,gBAAgB,MAAM,EACtB,OAAO,oBAAoB,EAC3B,UAAU,MAAM,EAChB,cAAc,EAAE,CAAC,MAAM,KACtB,WAAW,EAiCb,CAAC;AAEF,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
@@ -0,0 +1,45 @@
1
+ import path from "node:path";
2
+ import * as ts from "typescript";
3
+ import { isPublicApiFile, isTestFile } from "./no-unused-exports-options.js";
4
+ import { sourceFileExportsSymbol, toComparableAbsolutePath, } from "./no-unused-exports-symbol-utilities.js";
5
+ /**
6
+ * Collects public API exposure usages for one exported symbol.
7
+ * @param program TypeScript program.
8
+ * @param sourceFilename Source filename where export is defined.
9
+ * @param state Normalized rule options.
10
+ * @param repoRoot Absolute repository root used for file classification.
11
+ * @param targetSymbol Export symbol being classified.
12
+ * @returns Public API exposure usages for the exported symbol.
13
+ * @example
14
+ * ```typescript
15
+ * const usages = collectPublicApiExposureUsages(program, sourceFilename, state, repoRoot, targetSymbol);
16
+ * ```
17
+ */
18
+ const collectPublicApiExposureUsages = (program, sourceFilename, state, repoRoot, targetSymbol) => {
19
+ const checker = program.getTypeChecker();
20
+ const normalizedSourceFilename = toComparableAbsolutePath(sourceFilename);
21
+ const normalizedRepoRoot = path.resolve(repoRoot);
22
+ const usages = [];
23
+ for (const sourceFile of program.getSourceFiles()) {
24
+ if (sourceFile.isDeclarationFile) {
25
+ continue;
26
+ }
27
+ const publicApiFilename = path.resolve(sourceFile.fileName);
28
+ const normalizedPublicApiFilename = toComparableAbsolutePath(publicApiFilename);
29
+ if (normalizedPublicApiFilename === normalizedSourceFilename) {
30
+ continue;
31
+ }
32
+ if (!isPublicApiFile(publicApiFilename, state, normalizedRepoRoot)) {
33
+ continue;
34
+ }
35
+ if (!sourceFileExportsSymbol(sourceFile, checker, targetSymbol)) {
36
+ continue;
37
+ }
38
+ usages.push({
39
+ isTestFile: isTestFile(publicApiFilename, state, normalizedRepoRoot),
40
+ });
41
+ }
42
+ return usages;
43
+ };
44
+ export { collectPublicApiExposureUsages };
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLWV4cG9ydHMtcHVibGljLWFwaS11c2FnZS11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL2FyY2hpdGVjdHVyZS9uby11bnVzZWQtZXhwb3J0cy9uby11bnVzZWQtZXhwb3J0cy1wdWJsaWMtYXBpLXVzYWdlLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixHQUN6QixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sOEJBQThCLEdBQUcsQ0FDckMsT0FBbUIsRUFDbkIsY0FBc0IsRUFDdEIsS0FBMkIsRUFDM0IsUUFBZ0IsRUFDaEIsWUFBdUIsRUFDUixFQUFFO0lBQ2pCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxNQUFNLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxNQUFNLE1BQU0sR0FBa0IsRUFBRSxDQUFDO0lBRWpDLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDbEQsSUFBSSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqQyxTQUFTO1FBQ1gsQ0FBQztRQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSwyQkFBMkIsR0FDL0Isd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU5QyxJQUFJLDJCQUEyQixLQUFLLHdCQUF3QixFQUFFLENBQUM7WUFDN0QsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDbkUsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hFLFNBQVM7UUFDWCxDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNWLFVBQVUsRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDO1NBQ3JFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbmltcG9ydCB0eXBlIHsgRXhwb3J0VXNhZ2UsIE5vVW51c2VkRXhwb3J0c1N0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgaXNQdWJsaWNBcGlGaWxlLCBpc1Rlc3RGaWxlIH0gZnJvbSBcIi4vbm8tdW51c2VkLWV4cG9ydHMtb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgc291cmNlRmlsZUV4cG9ydHNTeW1ib2wsXG4gIHRvQ29tcGFyYWJsZUFic29sdXRlUGF0aCxcbn0gZnJvbSBcIi4vbm8tdW51c2VkLWV4cG9ydHMtc3ltYm9sLXV0aWxpdGllc1wiO1xuXG4vKipcbiAqIENvbGxlY3RzIHB1YmxpYyBBUEkgZXhwb3N1cmUgdXNhZ2VzIGZvciBvbmUgZXhwb3J0ZWQgc3ltYm9sLlxuICogQHBhcmFtIHByb2dyYW0gVHlwZVNjcmlwdCBwcm9ncmFtLlxuICogQHBhcmFtIHNvdXJjZUZpbGVuYW1lIFNvdXJjZSBmaWxlbmFtZSB3aGVyZSBleHBvcnQgaXMgZGVmaW5lZC5cbiAqIEBwYXJhbSBzdGF0ZSBOb3JtYWxpemVkIHJ1bGUgb3B0aW9ucy5cbiAqIEBwYXJhbSByZXBvUm9vdCBBYnNvbHV0ZSByZXBvc2l0b3J5IHJvb3QgdXNlZCBmb3IgZmlsZSBjbGFzc2lmaWNhdGlvbi5cbiAqIEBwYXJhbSB0YXJnZXRTeW1ib2wgRXhwb3J0IHN5bWJvbCBiZWluZyBjbGFzc2lmaWVkLlxuICogQHJldHVybnMgUHVibGljIEFQSSBleHBvc3VyZSB1c2FnZXMgZm9yIHRoZSBleHBvcnRlZCBzeW1ib2wuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXNhZ2VzID0gY29sbGVjdFB1YmxpY0FwaUV4cG9zdXJlVXNhZ2VzKHByb2dyYW0sIHNvdXJjZUZpbGVuYW1lLCBzdGF0ZSwgcmVwb1Jvb3QsIHRhcmdldFN5bWJvbCk7XG4gKiBgYGBcbiAqL1xuY29uc3QgY29sbGVjdFB1YmxpY0FwaUV4cG9zdXJlVXNhZ2VzID0gKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBzb3VyY2VGaWxlbmFtZTogc3RyaW5nLFxuICBzdGF0ZTogTm9VbnVzZWRFeHBvcnRzU3RhdGUsXG4gIHJlcG9Sb290OiBzdHJpbmcsXG4gIHRhcmdldFN5bWJvbDogdHMuU3ltYm9sLFxuKTogRXhwb3J0VXNhZ2VbXSA9PiB7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTb3VyY2VGaWxlbmFtZSA9IHRvQ29tcGFyYWJsZUFic29sdXRlUGF0aChzb3VyY2VGaWxlbmFtZSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvUm9vdCA9IHBhdGgucmVzb2x2ZShyZXBvUm9vdCk7XG4gIGNvbnN0IHVzYWdlczogRXhwb3J0VXNhZ2VbXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHVibGljQXBpRmlsZW5hbWUgPSBwYXRoLnJlc29sdmUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFB1YmxpY0FwaUZpbGVuYW1lID1cbiAgICAgIHRvQ29tcGFyYWJsZUFic29sdXRlUGF0aChwdWJsaWNBcGlGaWxlbmFtZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZFB1YmxpY0FwaUZpbGVuYW1lID09PSBub3JtYWxpemVkU291cmNlRmlsZW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNQdWJsaWNBcGlGaWxlKHB1YmxpY0FwaUZpbGVuYW1lLCBzdGF0ZSwgbm9ybWFsaXplZFJlcG9Sb290KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFzb3VyY2VGaWxlRXhwb3J0c1N5bWJvbChzb3VyY2VGaWxlLCBjaGVja2VyLCB0YXJnZXRTeW1ib2wpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB1c2FnZXMucHVzaCh7XG4gICAgICBpc1Rlc3RGaWxlOiBpc1Rlc3RGaWxlKHB1YmxpY0FwaUZpbGVuYW1lLCBzdGF0ZSwgbm9ybWFsaXplZFJlcG9Sb290KSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB1c2FnZXM7XG59O1xuXG5leHBvcnQgeyBjb2xsZWN0UHVibGljQXBpRXhwb3N1cmVVc2FnZXMgfTtcbiJdfQ==
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Converts one unknown value into an indexable record.
3
+ * @param value Candidate value.
4
+ * @returns Record view when the value is object-like.
5
+ * @example
6
+ * ```typescript
7
+ * const record = asRecord({ type: "Identifier" });
8
+ * ```
9
+ */
10
+ declare const asRecord: (value: unknown) => Record<string, unknown> | undefined;
11
+ /**
12
+ * Reads one array property from an object-like value.
13
+ * @param value Candidate object.
14
+ * @param key Lookup key used to read the property.
15
+ * @returns Array value when present.
16
+ * @example
17
+ * ```typescript
18
+ * const items = readArrayProperty({ elements: [1, 2] }, "elements");
19
+ * ```
20
+ */
21
+ declare const readArrayProperty: (value: unknown, key: string) => undefined | unknown[];
22
+ /**
23
+ * Reads one string property from an object-like value.
24
+ * @param value Candidate object.
25
+ * @param key Lookup key used to read the property.
26
+ * @returns String value when present.
27
+ * @example
28
+ * ```typescript
29
+ * const name = readStringProperty({ name: "feature" }, "name");
30
+ * ```
31
+ */
32
+ declare const readStringProperty: (value: unknown, key: string) => string | undefined;
33
+ export { asRecord, readArrayProperty, readStringProperty };
34
+ //# sourceMappingURL=no-unused-exports-record-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unused-exports-record-utilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,QAAA,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAGjD,CAAC;AAEb;;;;;;;;;GASG;AACH,QAAA,MAAM,iBAAiB,GACrB,OAAO,OAAO,EACd,KAAK,MAAM,KACV,SAAS,GAAG,OAAO,EAIrB,CAAC;AAEF;;;;;;;;;GASG;AACH,QAAA,MAAM,kBAAkB,GACtB,OAAO,OAAO,EACd,KAAK,MAAM,KACV,MAAM,GAAG,SAIX,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC"}