@codeperfect/eslint-plugin 2.11.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +0 -1
  2. package/dist/application/custom-rules.d.ts +3 -0
  3. package/dist/application/custom-rules.d.ts.map +1 -1
  4. package/dist/application/custom-rules.js +3 -2
  5. package/dist/application/index.d.ts +1 -1
  6. package/dist/application/index.d.ts.map +1 -1
  7. package/dist/application/index.js +2 -2
  8. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  9. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts +0 -2
  10. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.d.ts.map +1 -1
  11. package/dist/domain/architecture/consistent-barrel-files/barrel-file-utilities.js +4 -6
  12. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -1
  13. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +12 -15
  14. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +0 -2
  15. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
  16. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +2 -10
  17. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
  18. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +8 -17
  19. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -1
  20. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +6 -8
  21. package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
  22. package/dist/domain/architecture/consistent-barrel-files/rule.js +4 -5
  23. package/dist/domain/architecture/index.d.ts +1 -0
  24. package/dist/domain/architecture/index.d.ts.map +1 -1
  25. package/dist/domain/architecture/index.js +2 -1
  26. package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.d.ts.map +1 -1
  27. package/dist/domain/architecture/no-import-export-extensions/no-import-export-extensions-rule.js +6 -13
  28. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts.map +1 -1
  29. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.js +11 -10
  30. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts.map +1 -1
  31. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.js +5 -9
  32. package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.d.ts.map +1 -1
  33. package/dist/domain/architecture/no-unused-exports/no-unused-exports-options.js +6 -9
  34. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts.map +1 -1
  35. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.js +5 -10
  36. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts.map +1 -1
  37. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.js +4 -8
  38. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map +1 -1
  39. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js +4 -5
  40. package/dist/domain/architecture/no-unused-public-members/index.d.ts +2 -0
  41. package/dist/domain/architecture/no-unused-public-members/index.d.ts.map +1 -0
  42. package/dist/domain/architecture/no-unused-public-members/index.js +2 -0
  43. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts +16 -0
  44. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.d.ts.map +1 -0
  45. package/dist/domain/architecture/no-unused-public-members/member-contract-utilities.js +102 -0
  46. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts +34 -0
  47. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.d.ts.map +1 -0
  48. package/dist/domain/architecture/no-unused-public-members/member-declaration-utilities.js +55 -0
  49. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts +68 -0
  50. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.d.ts.map +1 -0
  51. package/dist/domain/architecture/no-unused-public-members/member-host-utilities.js +195 -0
  52. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts +30 -0
  53. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts.map +1 -0
  54. package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.js +101 -0
  55. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts +28 -0
  56. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts.map +1 -0
  57. package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.js +125 -0
  58. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts +29 -0
  59. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts.map +1 -0
  60. package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.js +108 -0
  61. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts +42 -0
  62. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts.map +1 -0
  63. package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.js +96 -0
  64. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts +18 -0
  65. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts.map +1 -0
  66. package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.js +128 -0
  67. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts +41 -0
  68. package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts.map +1 -0
  69. package/dist/domain/architecture/no-unused-public-members/member-utilities.js +51 -0
  70. package/dist/domain/architecture/no-unused-public-members/rule.d.ts +5 -0
  71. package/dist/domain/architecture/no-unused-public-members/rule.d.ts.map +1 -0
  72. package/dist/domain/architecture/no-unused-public-members/rule.js +78 -0
  73. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts.map +1 -1
  74. package/dist/domain/core/no-multiple-declarators/rule-utilities.js +13 -19
  75. package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
  76. package/dist/domain/core/no-multiple-declarators/rule.js +4 -5
  77. package/dist/domain/core/no-useless-delegation/rule.d.ts.map +1 -1
  78. package/dist/domain/core/no-useless-delegation/rule.js +5 -6
  79. package/dist/domain/core/prefer-interface-types/autofix.js +4 -5
  80. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -1
  81. package/dist/domain/core/prefer-interface-types/rule-utilities.js +7 -9
  82. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
  83. package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +10 -8
  84. package/dist/domain/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -1
  85. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +5 -6
  86. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -1
  87. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +7 -9
  88. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  89. package/dist/domain/docs/no-interface-member-docs/rule.js +2 -5
  90. package/dist/domain/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -1
  91. package/dist/domain/docs/require-example-language/empty-fence-fixes.js +2 -5
  92. package/dist/domain/docs/require-example-language/example-utilities.d.ts +1 -7
  93. package/dist/domain/docs/require-example-language/example-utilities.d.ts.map +1 -1
  94. package/dist/domain/docs/require-example-language/example-utilities.js +6 -14
  95. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  96. package/dist/domain/docs/require-example-language/examples.js +7 -16
  97. package/dist/domain/docs/require-example-language/fixes.d.ts.map +1 -1
  98. package/dist/domain/docs/require-example-language/fixes.js +8 -13
  99. package/dist/domain/docs/require-example-language/reporting.d.ts.map +1 -1
  100. package/dist/domain/docs/require-example-language/reporting.js +4 -8
  101. package/dist/domain/docs/require-example-language/types.d.ts +0 -2
  102. package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
  103. package/dist/domain/docs/require-example-language/types.js +1 -1
  104. package/dist/domain/docs/single-line-jsdoc/rule.d.ts.map +1 -1
  105. package/dist/domain/docs/single-line-jsdoc/rule.js +5 -11
  106. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -1
  107. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-content.js +5 -14
  108. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -1
  109. package/dist/domain/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +5 -9
  110. package/dist/domain/index.d.ts +2 -2
  111. package/dist/domain/index.d.ts.map +1 -1
  112. package/dist/domain/index.js +3 -3
  113. package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
  114. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
  115. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +2 -5
  116. package/dist/domain/testing/aaa/analyzer.analysis.js +6 -11
  117. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
  118. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +5 -14
  119. package/dist/domain/testing/aaa/analyzer.assertions.js +2 -2
  120. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -1
  121. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +12 -16
  122. package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -1
  123. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +11 -21
  124. package/dist/domain/testing/aaa/analyzer.classification.js +2 -2
  125. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  126. package/dist/domain/testing/aaa/analyzer.super.js +5 -6
  127. package/dist/domain/testing/aaa/types.d.ts +0 -4
  128. package/dist/domain/testing/aaa/types.d.ts.map +1 -1
  129. package/dist/domain/testing/aaa/types.js +1 -1
  130. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
  131. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +2 -7
  132. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
  133. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +4 -5
  134. package/dist/domain/testing/index.d.ts +0 -1
  135. package/dist/domain/testing/index.d.ts.map +1 -1
  136. package/dist/domain/testing/index.js +1 -2
  137. package/dist/domain/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -1
  138. package/dist/domain/testing/prefer-vi-mocked-import/fix.js +9 -7
  139. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -1
  140. package/dist/domain/testing/prefer-vi-mocked-import/match-bindings.js +5 -9
  141. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -1
  142. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +2 -7
  143. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -1
  144. package/dist/domain/testing/prefer-vi-mocked-import/match-declarations.js +5 -5
  145. package/dist/domain/testing/prefer-vi-mocked-import/match-helpers.js +3 -5
  146. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -1
  147. package/dist/domain/testing/prefer-vi-mocked-import/match-imports.js +13 -18
  148. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts.map +1 -1
  149. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.js +5 -6
  150. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts +0 -2
  151. package/dist/domain/testing/prefer-vi-mocked-import/types.d.ts.map +1 -1
  152. package/dist/domain/testing/prefer-vi-mocked-import/types.js +1 -1
  153. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  154. package/dist/domain/testing/require-act-result-capture/rule.js +9 -12
  155. package/dist/domain/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -1
  156. package/dist/domain/testing/require-test-companion/require-test-companion-listeners.js +5 -11
  157. package/dist/domain/testing/require-test-companion/require-test-companion-options.js +6 -7
  158. package/dist/domain/testing/require-test-companion/rule.js +2 -2
  159. package/dist/index.d.ts +1 -1
  160. package/dist/index.d.ts.map +1 -1
  161. package/dist/index.js +2 -2
  162. package/dist/infrastructure/codeperfect-plugin.d.ts +2 -2
  163. package/dist/infrastructure/codeperfect-plugin.js +3 -3
  164. package/dist/infrastructure/presets.js +3 -3
  165. package/package.json +26 -27
  166. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts +0 -2
  167. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts.map +0 -1
  168. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.js +0 -2
  169. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts +0 -29
  170. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts.map +0 -1
  171. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.js +0 -200
  172. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts +0 -12
  173. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts.map +0 -1
  174. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.js +0 -151
  175. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts +0 -16
  176. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts.map +0 -1
  177. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.js +0 -109
  178. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts +0 -5
  179. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +0 -1
  180. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +0 -41
@@ -1,151 +0,0 @@
1
- import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
- /** Node types that introduce top-level names. */
3
- const namedDeclarationTypes = new Set([
4
- AST_NODE_TYPES.ClassDeclaration,
5
- AST_NODE_TYPES.FunctionDeclaration,
6
- AST_NODE_TYPES.TSEnumDeclaration,
7
- AST_NODE_TYPES.TSInterfaceDeclaration,
8
- AST_NODE_TYPES.TSModuleDeclaration,
9
- AST_NODE_TYPES.TSTypeAliasDeclaration,
10
- AST_NODE_TYPES.VariableDeclaration,
11
- ]);
12
- /** Type-like declaration node types handled by the name collector. */
13
- const typeLikeDeclarationTypes = new Set([
14
- AST_NODE_TYPES.TSEnumDeclaration,
15
- AST_NODE_TYPES.TSInterfaceDeclaration,
16
- AST_NODE_TYPES.TSTypeAliasDeclaration,
17
- ]);
18
- /**
19
- * Collects declaration identifiers from top-level declarations.
20
- * @param declaration Declaration node.
21
- * @param names Output name set.
22
- * @example
23
- * ```ts
24
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
25
- * ```
26
- */
27
- function collectDeclarationNames(declaration, names) {
28
- if (declaration.type === AST_NODE_TYPES.FunctionDeclaration ||
29
- declaration.type === AST_NODE_TYPES.ClassDeclaration) {
30
- if (declaration.id !== null) {
31
- names.add(declaration.id.name);
32
- }
33
- return;
34
- }
35
- if (declaration.type === AST_NODE_TYPES.VariableDeclaration) {
36
- for (const variableDeclaration of declaration.declarations) {
37
- collectPatternNames(variableDeclaration.id, names);
38
- }
39
- return;
40
- }
41
- if (isTypeLikeDeclaration(declaration)) {
42
- names.add(declaration.id.name);
43
- return;
44
- }
45
- if (declaration.id.type === AST_NODE_TYPES.Identifier) {
46
- names.add(declaration.id.name);
47
- }
48
- }
49
- /**
50
- * Collects identifiers from a binding pattern.
51
- * @param pattern Binding pattern.
52
- * @param names Output name set.
53
- * @example
54
- * ```ts
55
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
56
- * ```
57
- */
58
- function collectPatternNames(pattern, names) {
59
- if (pattern.type === AST_NODE_TYPES.Identifier) {
60
- names.add(pattern.name);
61
- return;
62
- }
63
- if (pattern.type === AST_NODE_TYPES.AssignmentPattern) {
64
- collectPatternNames(pattern.left, names);
65
- return;
66
- }
67
- if (pattern.type === AST_NODE_TYPES.RestElement) {
68
- collectPatternNames(pattern.argument, names);
69
- return;
70
- }
71
- if (pattern.type === AST_NODE_TYPES.ArrayPattern) {
72
- for (const element of pattern.elements) {
73
- if (element !== null) {
74
- collectPatternNames(element, names);
75
- }
76
- }
77
- }
78
- if (pattern.type === AST_NODE_TYPES.ObjectPattern) {
79
- for (const property of pattern.properties) {
80
- if (property.type === AST_NODE_TYPES.Property) {
81
- collectPatternNames(property.value, names);
82
- }
83
- if (property.type === AST_NODE_TYPES.RestElement) {
84
- collectPatternNames(property.argument, names);
85
- }
86
- }
87
- }
88
- }
89
- /**
90
- * Collects top-level binding names to avoid collisions with inserted imports.
91
- * @param statements Program statements.
92
- * @returns All top-level names in the file.
93
- * @example
94
- * ```ts
95
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
96
- * ```
97
- */
98
- function collectTopLevelNames(statements) {
99
- const names = new Set();
100
- for (const statement of statements) {
101
- if (statement.type === AST_NODE_TYPES.ImportDeclaration) {
102
- for (const specifier of statement.specifiers) {
103
- names.add(specifier.local.name);
104
- }
105
- continue;
106
- }
107
- if (statement.type === AST_NODE_TYPES.ExportNamedDeclaration) {
108
- if (statement.declaration !== null &&
109
- isNamedDeclaration(statement.declaration)) {
110
- collectDeclarationNames(statement.declaration, names);
111
- }
112
- continue;
113
- }
114
- if (statement.type === AST_NODE_TYPES.ExportDefaultDeclaration) {
115
- if (isNamedDeclaration(statement.declaration)) {
116
- collectDeclarationNames(statement.declaration, names);
117
- }
118
- continue;
119
- }
120
- if (isNamedDeclaration(statement)) {
121
- collectDeclarationNames(statement, names);
122
- }
123
- }
124
- return names;
125
- }
126
- /**
127
- * Checks whether a node is a declaration that introduces top-level names.
128
- * @param node Node to inspect.
129
- * @returns True when the node is a supported declaration.
130
- * @example
131
- * ```ts
132
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
133
- * ```
134
- */
135
- function isNamedDeclaration(node) {
136
- return namedDeclarationTypes.has(node.type);
137
- }
138
- /**
139
- * Checks whether a declaration introduces a type-like top-level name.
140
- * @param declaration Declaration to inspect.
141
- * @returns True when the declaration is a type alias, interface, or enum.
142
- * @example
143
- * ```ts
144
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
145
- * ```
146
- */
147
- function isTypeLikeDeclaration(declaration) {
148
- return typeLikeDeclarationTypes.has(declaration.type);
149
- }
150
- export { collectTopLevelNames };
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1uYW1lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9uby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0L3J1bGUtbmFtZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQVl6RSxpREFBaUQ7QUFDakQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNwQyxjQUFjLENBQUMsZ0JBQWdCO0lBQy9CLGNBQWMsQ0FBQyxtQkFBbUI7SUFDbEMsY0FBYyxDQUFDLGlCQUFpQjtJQUNoQyxjQUFjLENBQUMsc0JBQXNCO0lBQ3JDLGNBQWMsQ0FBQyxtQkFBbUI7SUFDbEMsY0FBYyxDQUFDLHNCQUFzQjtJQUNyQyxjQUFjLENBQUMsbUJBQW1CO0NBQ25DLENBQUMsQ0FBQztBQUVILHNFQUFzRTtBQUN0RSxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3ZDLGNBQWMsQ0FBQyxpQkFBaUI7SUFDaEMsY0FBYyxDQUFDLHNCQUFzQjtJQUNyQyxjQUFjLENBQUMsc0JBQXNCO0NBQ3RDLENBQUMsQ0FBQztBQUVIOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsV0FBNkIsRUFDN0IsS0FBa0I7SUFFbEIsSUFDRSxXQUFXLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUI7UUFDdkQsV0FBVyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsZ0JBQWdCLEVBQ3BELENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM1RCxLQUFLLE1BQU0sbUJBQW1CLElBQUksV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzNELG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDdkMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLE9BQXNCLEVBQUUsS0FBa0I7SUFDckUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN0RCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqRCxLQUFLLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsbUJBQW1CLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEQsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDOUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakQsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLFVBQThCO0lBQzFELE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFaEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUF5QyxFQUFFLENBQUM7UUFDbEUsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3hELEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUNELFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzdELElBQ0UsU0FBUyxDQUFDLFdBQVcsS0FBSyxJQUFJO2dCQUM5QixrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQ3pDLENBQUM7Z0JBQ0QsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDL0QsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixJQUU2QjtJQUU3QixPQUFPLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsV0FBNkI7SUFLN0IsT0FBTyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVF9OT0RFX1RZUEVTLCB0eXBlIFRTRVNUcmVlIH0gZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC91dGlsc1wiO1xuXG4vKiogU3VwcG9ydGVkIGRlY2xhcmF0aW9uIHNoYXBlcyB0aGF0IGNhbiBpbnRyb2R1Y2UgdG9wLWxldmVsIG5hbWVzLiAqL1xudHlwZSBOYW1lZERlY2xhcmF0aW9uID1cbiAgfCBUU0VTVHJlZS5DbGFzc0RlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuRnVuY3Rpb25EZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTRW51bURlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuVFNJbnRlcmZhY2VEZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTTW9kdWxlRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuVmFyaWFibGVEZWNsYXJhdGlvbjtcblxuLyoqIE5vZGUgdHlwZXMgdGhhdCBpbnRyb2R1Y2UgdG9wLWxldmVsIG5hbWVzLiAqL1xuY29uc3QgbmFtZWREZWNsYXJhdGlvblR5cGVzID0gbmV3IFNldChbXG4gIEFTVF9OT0RFX1RZUEVTLkNsYXNzRGVjbGFyYXRpb24sXG4gIEFTVF9OT0RFX1RZUEVTLkZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEFTVF9OT0RFX1RZUEVTLlRTRW51bURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU01vZHVsZURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5WYXJpYWJsZURlY2xhcmF0aW9uLFxuXSk7XG5cbi8qKiBUeXBlLWxpa2UgZGVjbGFyYXRpb24gbm9kZSB0eXBlcyBoYW5kbGVkIGJ5IHRoZSBuYW1lIGNvbGxlY3Rvci4gKi9cbmNvbnN0IHR5cGVMaWtlRGVjbGFyYXRpb25UeXBlcyA9IG5ldyBTZXQoW1xuICBBU1RfTk9ERV9UWVBFUy5UU0VudW1EZWNsYXJhdGlvbixcbiAgQVNUX05PREVfVFlQRVMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgQVNUX05PREVfVFlQRVMuVFNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbl0pO1xuXG4vKipcbiAqIENvbGxlY3RzIGRlY2xhcmF0aW9uIGlkZW50aWZpZXJzIGZyb20gdG9wLWxldmVsIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSBkZWNsYXJhdGlvbiBEZWNsYXJhdGlvbiBub2RlLlxuICogQHBhcmFtIG5hbWVzIE91dHB1dCBuYW1lIHNldC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3REZWNsYXJhdGlvbk5hbWVzKFxuICBkZWNsYXJhdGlvbjogTmFtZWREZWNsYXJhdGlvbixcbiAgbmFtZXM6IFNldDxzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGlmIChcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8XG4gICAgZGVjbGFyYXRpb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuQ2xhc3NEZWNsYXJhdGlvblxuICApIHtcbiAgICBpZiAoZGVjbGFyYXRpb24uaWQgIT09IG51bGwpIHtcbiAgICAgIG5hbWVzLmFkZChkZWNsYXJhdGlvbi5pZC5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zKSB7XG4gICAgICBjb2xsZWN0UGF0dGVybk5hbWVzKHZhcmlhYmxlRGVjbGFyYXRpb24uaWQsIG5hbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzVHlwZUxpa2VEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRlY2xhcmF0aW9uLmlkLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBpZGVudGlmaWVycyBmcm9tIGEgYmluZGluZyBwYXR0ZXJuLlxuICogQHBhcmFtIHBhdHRlcm4gQmluZGluZyBwYXR0ZXJuLlxuICogQHBhcmFtIG5hbWVzIE91dHB1dCBuYW1lIHNldC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybjogVFNFU1RyZWUuTm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gIGlmIChwYXR0ZXJuLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICBuYW1lcy5hZGQocGF0dGVybi5uYW1lKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5Bc3NpZ25tZW50UGF0dGVybikge1xuICAgIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybi5sZWZ0LCBuYW1lcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhdHRlcm4udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUmVzdEVsZW1lbnQpIHtcbiAgICBjb2xsZWN0UGF0dGVybk5hbWVzKHBhdHRlcm4uYXJndW1lbnQsIG5hbWVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5BcnJheVBhdHRlcm4pIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGF0dGVybi5lbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhlbGVtZW50LCBuYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhdHRlcm4udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuT2JqZWN0UGF0dGVybikge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcGF0dGVybi5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAocHJvcGVydHkudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUHJvcGVydHkpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhwcm9wZXJ0eS52YWx1ZSwgbmFtZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHkudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUmVzdEVsZW1lbnQpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhwcm9wZXJ0eS5hcmd1bWVudCwgbmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIHRvcC1sZXZlbCBiaW5kaW5nIG5hbWVzIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBpbnNlcnRlZCBpbXBvcnRzLlxuICogQHBhcmFtIHN0YXRlbWVudHMgUHJvZ3JhbSBzdGF0ZW1lbnRzLlxuICogQHJldHVybnMgQWxsIHRvcC1sZXZlbCBuYW1lcyBpbiB0aGUgZmlsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUb3BMZXZlbE5hbWVzKHN0YXRlbWVudHM6IHJlYWRvbmx5IHVua25vd25bXSk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzIGFzIFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnRbXSkge1xuICAgIGlmIChzdGF0ZW1lbnQudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSW1wb3J0RGVjbGFyYXRpb24pIHtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHN0YXRlbWVudC5zcGVjaWZpZXJzKSB7XG4gICAgICAgIG5hbWVzLmFkZChzcGVjaWZpZXIubG9jYWwubmFtZSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhdGVtZW50LmRlY2xhcmF0aW9uICE9PSBudWxsICYmXG4gICAgICAgIGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQuZGVjbGFyYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgY29sbGVjdERlY2xhcmF0aW9uTmFtZXMoc3RhdGVtZW50LmRlY2xhcmF0aW9uLCBuYW1lcyk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbikge1xuICAgICAgaWYgKGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQuZGVjbGFyYXRpb24pKSB7XG4gICAgICAgIGNvbGxlY3REZWNsYXJhdGlvbk5hbWVzKHN0YXRlbWVudC5kZWNsYXJhdGlvbiwgbmFtZXMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICBjb2xsZWN0RGVjbGFyYXRpb25OYW1lcyhzdGF0ZW1lbnQsIG5hbWVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCBpbnRyb2R1Y2VzIHRvcC1sZXZlbCBuYW1lcy5cbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgbm9kZSBpcyBhIHN1cHBvcnRlZCBkZWNsYXJhdGlvbi5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGlzTmFtZWREZWNsYXJhdGlvbihcbiAgbm9kZTpcbiAgICB8IFRTRVNUcmVlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbltcImRlY2xhcmF0aW9uXCJdXG4gICAgfCBUU0VTVHJlZS5Qcm9ncmFtU3RhdGVtZW50LFxuKTogbm9kZSBpcyBOYW1lZERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIG5hbWVkRGVjbGFyYXRpb25UeXBlcy5oYXMobm9kZS50eXBlKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGRlY2xhcmF0aW9uIGludHJvZHVjZXMgYSB0eXBlLWxpa2UgdG9wLWxldmVsIG5hbWUuXG4gKiBAcGFyYW0gZGVjbGFyYXRpb24gRGVjbGFyYXRpb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgZGVjbGFyYXRpb24gaXMgYSB0eXBlIGFsaWFzLCBpbnRlcmZhY2UsIG9yIGVudW0uXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc1R5cGVMaWtlRGVjbGFyYXRpb24oXG4gIGRlY2xhcmF0aW9uOiBOYW1lZERlY2xhcmF0aW9uLFxuKTogZGVjbGFyYXRpb24gaXNcbiAgfCBUU0VTVHJlZS5UU0VudW1EZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHR5cGVMaWtlRGVjbGFyYXRpb25UeXBlcy5oYXMoZGVjbGFyYXRpb24udHlwZSk7XG59XG5cbmV4cG9ydCB7IGNvbGxlY3RUb3BMZXZlbE5hbWVzIH07XG4iXX0=
@@ -1,16 +0,0 @@
1
- import type { Rule } from "eslint";
2
- import type { MockFactoryMatch } from "./rule-detection.js";
3
- /**
4
- * Builds all fixes for one unsafe mock factory.
5
- * @param context Rule context.
6
- * @param fixer ESLint fixer.
7
- * @param match Unsafe mock factory details.
8
- * @returns All fixer operations.
9
- * @example
10
- * ```ts
11
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
12
- * ```
13
- */
14
- declare function buildFixes(context: Rule.RuleContext, fixer: Rule.RuleFixer, match: MockFactoryMatch): Rule.Fix[];
15
- export { buildFixes };
16
- //# sourceMappingURL=rule-reporting.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rule-reporting.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAmBzD;;;;;;;;;;GAUG;AACH,iBAAS,UAAU,CACjB,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,KAAK,EAAE,IAAI,CAAC,SAAS,EACrB,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAAC,GAAG,EAAE,CAuBZ;AA0GD,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -1,109 +0,0 @@
1
- import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
- import { collectTopLevelNames } from "./rule-names.js";
3
- /** Default suffix for generated namespace imports. */
4
- const moduleTypeSuffix = "Module";
5
- /**
6
- * Builds all fixes for one unsafe mock factory.
7
- * @param context Rule context.
8
- * @param fixer ESLint fixer.
9
- * @param match Unsafe mock factory details.
10
- * @returns All fixer operations.
11
- * @example
12
- * ```ts
13
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
14
- * ```
15
- */
16
- function buildFixes(context, fixer, match) {
17
- const sourceCode = context.sourceCode;
18
- const moduleTypeImport = resolveModuleTypeImport(sourceCode, match.moduleSpecifier);
19
- const factoryText = `createMockProxy<typeof ${moduleTypeImport.namespaceName}>(${sourceCode.getText(match.mockExpression)})`;
20
- const fixes = [
21
- fixer.replaceTextRange(match.mockFactoryNode.range, factoryText),
22
- ];
23
- if (!moduleTypeImport.isExisting) {
24
- const importText = `import type * as ${moduleTypeImport.namespaceName} from ${JSON.stringify(match.moduleSpecifier)};`;
25
- const insertionRange = getImportInsertionRange(sourceCode);
26
- fixes.push(insertionRange === void 0
27
- ? fixer.insertTextBeforeRange([0, 0], `${importText}\n\n`)
28
- : fixer.insertTextAfterRange(insertionRange, `\n${importText}`));
29
- }
30
- return fixes;
31
- }
32
- /**
33
- * Creates a namespace import name from a module specifier.
34
- * @param moduleSpecifier Module path.
35
- * @returns PascalCase namespace name.
36
- * @example
37
- * ```ts
38
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
39
- * ```
40
- */
41
- function createNamespaceName(moduleSpecifier) {
42
- const baseName = moduleSpecifier
43
- .split("/")
44
- .findLast((segment) => segment.length > 0 && segment !== ".")
45
- ?.replace(/\.[^./\\]+$/, "") ?? "Module";
46
- const pascalName = baseName
47
- .replaceAll(/[^\dA-Za-z]+/g, " ")
48
- .split(" ")
49
- .filter((segment) => segment.length > 0)
50
- .map((segment) => segment.slice(0, 1).toUpperCase() + segment.slice(1))
51
- .join("");
52
- return pascalName.endsWith(moduleTypeSuffix)
53
- ? pascalName
54
- : `${pascalName}${moduleTypeSuffix}`;
55
- }
56
- /**
57
- * Returns the range after the final import declaration.
58
- * @param sourceCode Source code to inspect.
59
- * @returns Range of the last import statement when present.
60
- * @example
61
- * ```ts
62
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
63
- * ```
64
- */
65
- function getImportInsertionRange(sourceCode) {
66
- let lastImportRange;
67
- for (const statement of sourceCode.ast.body) {
68
- if (statement.type === AST_NODE_TYPES.ImportDeclaration &&
69
- statement.range !== void 0) {
70
- lastImportRange = statement.range;
71
- }
72
- }
73
- return lastImportRange;
74
- }
75
- /**
76
- * Resolves the namespace import to use for `typeof Namespace`.
77
- * @param sourceCode Source code for import inspection.
78
- * @param moduleSpecifier Module path being mocked.
79
- * @returns Existing or generated namespace import details.
80
- * @example
81
- * ```ts
82
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
83
- * ```
84
- */
85
- function resolveModuleTypeImport(sourceCode, moduleSpecifier) {
86
- const statements = sourceCode.ast.body;
87
- const preferredName = createNamespaceName(moduleSpecifier);
88
- for (const statement of statements) {
89
- if (statement.type !== AST_NODE_TYPES.ImportDeclaration ||
90
- statement.source.value !== moduleSpecifier) {
91
- continue;
92
- }
93
- for (const specifier of statement.specifiers) {
94
- if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {
95
- return { isExisting: true, namespaceName: specifier.local.name };
96
- }
97
- }
98
- }
99
- const usedNames = collectTopLevelNames(statements);
100
- let namespaceName = preferredName;
101
- let suffix = 1;
102
- while (usedNames.has(namespaceName)) {
103
- namespaceName = `${preferredName}${suffix.toFixed(0)}`;
104
- suffix += 1;
105
- }
106
- return { isExisting: false, namespaceName };
107
- }
108
- export { buildFixes };
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1yZXBvcnRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3Rpbmcvbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC9ydWxlLXJlcG9ydGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBSXpFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWNwRCxzREFBc0Q7QUFDdEQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsVUFBVSxDQUNqQixPQUF5QixFQUN6QixLQUFxQixFQUNyQixLQUF1QjtJQUV2QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQXVCLENBQzlDLFVBQVUsRUFDVixLQUFLLENBQUMsZUFBZSxDQUN0QixDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLGdCQUFnQixDQUFDLGFBQWEsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUF1QixDQUFDLEdBQUcsQ0FBQztJQUN0SSxNQUFNLEtBQUssR0FBZTtRQUN4QixLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO0tBQ2pFLENBQUM7SUFFRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLGdCQUFnQixDQUFDLGFBQWEsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO1FBQ3ZILE1BQU0sY0FBYyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNELEtBQUssQ0FBQyxJ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b0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxJQUFJLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDbEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDcEMsYUFBYSxHQUFHLEdBQUcsYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzlDLENBQUM7QUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5cbmltcG9ydCB7IEFTVF9OT0RFX1RZUEVTLCB0eXBlIFRTRVNUcmVlIH0gZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC91dGlsc1wiO1xuXG5pbXBvcnQgdHlwZSB7IE1vY2tGYWN0b3J5TWF0Y2ggfSBmcm9tIFwiLi9ydWxlLWRldGVjdGlvblwiO1xuXG5pbXBvcnQgeyBjb2xsZWN0VG9wTGV2ZWxOYW1lcyB9IGZyb20gXCIuL3J1bGUtbmFtZXNcIjtcblxuLyoqIE5hbWVzcGFjZSBpbXBvcnQgZGV0YWlscyBmb3IgdGhlIG1vY2tlZCBtb2R1bGUuICovXG5pbnRlcmZhY2UgTW9kdWxlVHlwZUltcG9ydCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBuYW1lc3BhY2UgaW1wb3J0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBmaWxlLiAqL1xuICBpc0V4aXN0aW5nOiBib29sZWFuO1xuXG4gIC8qKiBOYW1lc3BhY2UgaWRlbnRpZmllciB1c2VkIGluIGB0eXBlb2YgTmFtZXNwYWNlYC4gKi9cbiAgbmFtZXNwYWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogTWluaW1hbCBzb3VyY2UtY29kZSBzdXJmYWNlIHVzZWQgYnkgdGhlIHJ1bGUuICovXG50eXBlIFNvdXJjZUNvZGVMaWtlID0gUGljazxSdWxlLlJ1bGVDb250ZXh0W1wic291cmNlQ29kZVwiXSwgXCJhc3RcIiB8IFwiZ2V0VGV4dFwiPjtcblxuLyoqIERlZmF1bHQgc3VmZml4IGZvciBnZW5lcmF0ZWQgbmFtZXNwYWNlIGltcG9ydHMuICovXG5jb25zdCBtb2R1bGVUeXBlU3VmZml4ID0gXCJNb2R1bGVcIjtcblxuLyoqXG4gKiBCdWlsZHMgYWxsIGZpeGVzIGZvciBvbmUgdW5zYWZlIG1vY2sgZmFjdG9yeS5cbiAqIEBwYXJhbSBjb250ZXh0IFJ1bGUgY29udGV4dC5cbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXG4gKiBAcGFyYW0gbWF0Y2ggVW5zYWZlIG1vY2sgZmFjdG9yeSBkZXRhaWxzLlxuICogQHJldHVybnMgQWxsIGZpeGVyIG9wZXJhdGlvbnMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBidWlsZEZpeGVzKFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0LFxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXG4gIG1hdGNoOiBNb2NrRmFjdG9yeU1hdGNoLFxuKTogUnVsZS5GaXhbXSB7XG4gIGNvbnN0IHNvdXJjZUNvZGUgPSBjb250ZXh0LnNvdXJjZUNvZGU7XG4gIGNvbnN0IG1vZHVsZVR5cGVJbXBvcnQgPSByZXNvbHZlTW9kdWxlVHlwZUltcG9ydChcbiAgICBzb3VyY2VDb2RlLFxuICAgIG1hdGNoLm1vZHVsZVNwZWNpZmllcixcbiAgKTtcbiAgY29uc3QgZmFjdG9yeVRleHQgPSBgY3JlYXRlTW9ja1Byb3h5PHR5cGVvZiAke21vZHVsZVR5cGVJbXBvcnQubmFtZXNwYWNlTmFtZX0+KCR7c291cmNlQ29kZS5nZXRUZXh0KG1hdGNoLm1vY2tFeHByZXNzaW9uIGFzIG5ldmVyKX0pYDtcbiAgY29uc3QgZml4ZXM6IFJ1bGUuRml4W10gPSBbXG4gICAgZml4ZXIucmVwbGFjZVRleHRSYW5nZShtYXRjaC5tb2NrRmFjdG9yeU5vZGUucmFuZ2UsIGZhY3RvcnlUZXh0KSxcbiAgXTtcblxuICBpZiAoIW1vZHVsZVR5cGVJbXBvcnQuaXNFeGlzdGluZykge1xuICAgIGNvbnN0IGltcG9ydFRleHQgPSBgaW1wb3J0IHR5cGUgKiBhcyAke21vZHVsZVR5cGVJbXBvcnQubmFtZXNwYWNlTmFtZX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KG1hdGNoLm1vZHVsZVNwZWNpZmllcil9O2A7XG4gICAgY29uc3QgaW5zZXJ0aW9uUmFuZ2UgPSBnZXRJbXBvcnRJbnNlcnRpb25SYW5nZShzb3VyY2VDb2RlKTtcblxuICAgIGZpeGVzLnB1c2goXG4gICAgICBpbnNlcnRpb25SYW5nZSA9PT0gdm9pZCAwXG4gICAgICAgID8gZml4ZXIuaW5zZXJ0VGV4dEJlZm9yZVJhbmdlKFswLCAwXSwgYCR7aW1wb3J0VGV4dH1cXG5cXG5gKVxuICAgICAgICA6IGZpeGVyLmluc2VydFRleHRBZnRlclJhbmdlKGluc2VydGlvblJhbmdlLCBgXFxuJHtpbXBvcnRUZXh0fWApLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZml4ZXM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5hbWVzcGFjZSBpbXBvcnQgbmFtZSBmcm9tIGEgbW9kdWxlIHNwZWNpZmllci5cbiAqIEBwYXJhbSBtb2R1bGVTcGVjaWZpZXIgTW9kdWxlIHBhdGguXG4gKiBAcmV0dXJucyBQYXNjYWxDYXNlIG5hbWVzcGFjZSBuYW1lLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTmFtZXNwYWNlTmFtZShtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2VOYW1lID1cbiAgICBtb2R1bGVTcGVjaWZpZXJcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5maW5kTGFzdCgoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwICYmIHNlZ21lbnQgIT09IFwiLlwiKVxuICAgICAgPy5yZXBsYWNlKC9cXC5bXi4vXFxcXF0rJC8sIFwiXCIpID8/IFwiTW9kdWxlXCI7XG5cbiAgY29uc3QgcGFzY2FsTmFtZSA9IGJhc2VOYW1lXG4gICAgLnJlcGxhY2VBbGwoL1teXFxkQS1aYS16XSsvZywgXCIgXCIpXG4gICAgLnNwbGl0KFwiIFwiKVxuICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQubGVuZ3RoID4gMClcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzZWdtZW50LnNsaWNlKDEpKVxuICAgIC5qb2luKFwiXCIpO1xuXG4gIHJldHVybiBwYXNjYWxOYW1lLmVuZHNXaXRoKG1vZHVsZVR5cGVTdWZmaXgpXG4gICAgPyBwYXNjYWxOYW1lXG4gICAgOiBgJHtwYXNjYWxOYW1lfSR7bW9kdWxlVHlwZVN1ZmZpeH1gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJhbmdlIGFmdGVyIHRoZSBmaW5hbCBpbXBvcnQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gc291cmNlQ29kZSBTb3VyY2UgY29kZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgUmFuZ2Ugb2YgdGhlIGxhc3QgaW1wb3J0IHN0YXRlbWVudCB3aGVuIHByZXNlbnQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRJbXBvcnRJbnNlcnRpb25SYW5nZShcbiAgc291cmNlQ29kZTogU291cmNlQ29kZUxpa2UsXG4pOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGxhc3RJbXBvcnRSYW5nZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2VDb2RlLmFzdC5ib2R5IGFzIHVua25vd24gYXMge1xuICAgIC8qKiBTdGF0ZW1lbnQgcmFuZ2Ugd2hlbiBwcm92aWRlZCBieSBwYXJzZXIgb3B0aW9ucy4gKi9cbiAgICByYW5nZT86IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAvKiogVG9wLWxldmVsIHN0YXRlbWVudCBub2RlIHR5cGUuICovXG4gICAgdHlwZTogVFNFU1RyZWUuUHJvZ3JhbVN0YXRlbWVudFtcInR5cGVcIl07XG4gIH1bXSkge1xuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5JbXBvcnREZWNsYXJhdGlvbiAmJlxuICAgICAgc3RhdGVtZW50LnJhbmdlICE9PSB2b2lkIDBcbiAgICApIHtcbiAgICAgIGxhc3RJbXBvcnRSYW5nZSA9IHN0YXRlbWVudC5yYW5nZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGFzdEltcG9ydFJhbmdlO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBuYW1lc3BhY2UgaW1wb3J0IHRvIHVzZSBmb3IgYHR5cGVvZiBOYW1lc3BhY2VgLlxuICogQHBhcmFtIHNvdXJjZUNvZGUgU291cmNlIGNvZGUgZm9yIGltcG9ydCBpbnNwZWN0aW9uLlxuICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBNb2R1bGUgcGF0aCBiZWluZyBtb2NrZWQuXG4gKiBAcmV0dXJucyBFeGlzdGluZyBvciBnZW5lcmF0ZWQgbmFtZXNwYWNlIGltcG9ydCBkZXRhaWxzLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZHVsZVR5cGVJbXBvcnQoXG4gIHNvdXJjZUNvZGU6IFNvdXJjZUNvZGVMaWtlLFxuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyxcbik6IE1vZHVsZVR5cGVJbXBvcnQge1xuICBjb25zdCBzdGF0ZW1lbnRzID0gc291cmNlQ29kZS5hc3QuYm9keTtcbiAgY29uc3QgcHJlZmVycmVkTmFtZSA9IGNyZWF0ZU5hbWVzcGFjZU5hbWUobW9kdWxlU3BlY2lmaWVyKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzIGFzIFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnRbXSkge1xuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudC50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5JbXBvcnREZWNsYXJhdGlvbiB8fFxuICAgICAgc3RhdGVtZW50LnNvdXJjZS52YWx1ZSAhPT0gbW9kdWxlU3BlY2lmaWVyXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNwZWNpZmllciBvZiBzdGF0ZW1lbnQuc3BlY2lmaWVycykge1xuICAgICAgaWYgKHNwZWNpZmllci50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNFeGlzdGluZzogdHJ1ZSwgbmFtZXNwYWNlTmFtZTogc3BlY2lmaWVyLmxvY2FsLm5hbWUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB1c2VkTmFtZXMgPSBjb2xsZWN0VG9wTGV2ZWxOYW1lcyhzdGF0ZW1lbnRzKTtcbiAgbGV0IG5hbWVzcGFjZU5hbWUgPSBwcmVmZXJyZWROYW1lO1xuICBsZXQgc3VmZml4ID0gMTtcblxuICB3aGlsZSAodXNlZE5hbWVzLmhhcyhuYW1lc3BhY2VOYW1lKSkge1xuICAgIG5hbWVzcGFjZU5hbWUgPSBgJHtwcmVmZXJyZWROYW1lfSR7c3VmZml4LnRvRml4ZWQoMCl9YDtcbiAgICBzdWZmaXggKz0gMTtcbiAgfVxuXG4gIHJldHVybiB7IGlzRXhpc3Rpbmc6IGZhbHNlLCBuYW1lc3BhY2VOYW1lIH07XG59XG5cbmV4cG9ydCB7IGJ1aWxkRml4ZXMgfTtcbiJdfQ==
@@ -1,5 +0,0 @@
1
- import type { Rule } from "eslint";
2
- /** Disallows casted `vi.mock` and `vi.doMock` factories. */
3
- declare const noUnsafeVitestMockFactoryCastRule: Rule.RuleModule;
4
- export { noUnsafeVitestMockFactoryCastRule };
5
- //# sourceMappingURL=rule.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAKnC,4DAA4D;AAC5D,QAAA,MAAM,iCAAiC,EAAE,IAAI,CAAC,UA0C7C,CAAC;AAEF,OAAO,EAAE,iCAAiC,EAAE,CAAC"}
@@ -1,41 +0,0 @@
1
- import { getMockFactoryMatch } from "./rule-detection.js";
2
- import { buildFixes } from "./rule-reporting.js";
3
- /** Disallows casted `vi.mock` and `vi.doMock` factories. */
4
- const noUnsafeVitestMockFactoryCastRule = {
5
- create: (context) => ({
6
- CallExpression(node) {
7
- const match = getMockFactoryMatch(node);
8
- if (match === void 0) {
9
- return;
10
- }
11
- const fix = match.canAutofix
12
- ? (fixer) => buildFixes(context, fixer, match)
13
- : void 0;
14
- context.report({
15
- ...(fix !== void 0 && { fix }),
16
- messageId: "noUnsafeVitestMockFactoryCast",
17
- node: match.node,
18
- ...(fix !== void 0 && {
19
- suggest: [{ fix, messageId: "replaceWithCreateMockProxy" }],
20
- }),
21
- });
22
- },
23
- }),
24
- meta: {
25
- docs: {
26
- description: "Disallow casted vi.mock and vi.doMock factories and prefer createMockProxy(...) for partial module mocks.",
27
- recommended: true,
28
- url: "https://github.com/parloti/eslint-plugin/blob/main/docs/rules/no-unsafe-vitest-mock-factory-cast.md",
29
- },
30
- fixable: "code",
31
- hasSuggestions: true,
32
- messages: {
33
- noUnsafeVitestMockFactoryCast: "Avoid casting vi.mock/vi.doMock factory results; use createMockProxy(...) with a type-only module import instead.",
34
- replaceWithCreateMockProxy: "Replace the casted factory with createMockProxy(...).",
35
- },
36
- schema: [],
37
- type: "problem",
38
- },
39
- };
40
- export { noUnsafeVitestMockFactoryCastRule };
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9uby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0L3J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLDREQUE0RDtBQUM1RCxNQUFNLGlDQUFpQyxHQUFvQjtJQUN6RCxNQUFNLEVBQUUsQ0FBQyxPQUF5QixFQUFxQixFQUFFLENBQ3ZELENBQUM7UUFDQyxjQUFjLENBQUMsSUFBSTtZQUNqQixNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxJQUErQixDQUFDLENBQUM7WUFDbkUsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsVUFBVTtnQkFDMUIsQ0FBQyxDQUFDLENBQUMsS0FBcUIsRUFBYyxFQUFFLENBQ3BDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztnQkFDckMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRVgsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDYixHQUFHLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQzlCLFNBQVMsRUFBRSwrQkFBK0I7Z0JBQzFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsR0FBRyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsSUFBSTtvQkFDcEIsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLDRCQUE0QixFQUFFLENBQUM7aUJBQzVELENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBNkI7SUFDaEMsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULDJHQUEyRztZQUM3RyxXQUFXLEVBQUUsSUFBSTtZQUNqQixHQUFHLEVBQUUscUdBQXFHO1NBQzNHO1FBQ0QsT0FBTyxFQUFFLE1BQU07UUFDZixjQUFjLEVBQUUsSUFBSTtRQUNwQixRQUFRLEVBQUU7WUFDUiw2QkFBNkIsRUFDM0IsbUhBQW1IO1lBQ3JILDBCQUEwQixFQUN4Qix1REFBdUQ7U0FDMUQ7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxTQUFTO0tBQ2hCO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUU0VTVHJlZSB9IGZyb20gXCJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHsgZ2V0TW9ja0ZhY3RvcnlNYXRjaCB9IGZyb20gXCIuL3J1bGUtZGV0ZWN0aW9uXCI7XG5pbXBvcnQgeyBidWlsZEZpeGVzIH0gZnJvbSBcIi4vcnVsZS1yZXBvcnRpbmdcIjtcblxuLyoqIERpc2FsbG93cyBjYXN0ZWQgYHZpLm1vY2tgIGFuZCBgdmkuZG9Nb2NrYCBmYWN0b3JpZXMuICovXG5jb25zdCBub1Vuc2FmZVZpdGVzdE1vY2tGYWN0b3J5Q2FzdFJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlOiAoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyID0+XG4gICAgKHtcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBnZXRNb2NrRmFjdG9yeU1hdGNoKG5vZGUgYXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24pO1xuICAgICAgICBpZiAobWF0Y2ggPT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpeCA9IG1hdGNoLmNhbkF1dG9maXhcbiAgICAgICAgICA/IChmaXhlcjogUnVsZS5SdWxlRml4ZXIpOiBSdWxlLkZpeFtdID0+XG4gICAgICAgICAgICAgIGJ1aWxkRml4ZXMoY29udGV4dCwgZml4ZXIsIG1hdGNoKVxuICAgICAgICAgIDogdm9pZCAwO1xuXG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAuLi4oZml4ICE9PSB2b2lkIDAgJiYgeyBmaXggfSksXG4gICAgICAgICAgbWVzc2FnZUlkOiBcIm5vVW5zYWZlVml0ZXN0TW9ja0ZhY3RvcnlDYXN0XCIsXG4gICAgICAgICAgbm9kZTogbWF0Y2gubm9kZSxcbiAgICAgICAgICAuLi4oZml4ICE9PSB2b2lkIDAgJiYge1xuICAgICAgICAgICAgc3VnZ2VzdDogW3sgZml4LCBtZXNzYWdlSWQ6IFwicmVwbGFjZVdpdGhDcmVhdGVNb2NrUHJveHlcIiB9XSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pIHNhdGlzZmllcyBSdWxlLlJ1bGVMaXN0ZW5lcixcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRpc2FsbG93IGNhc3RlZCB2aS5tb2NrIGFuZCB2aS5kb01vY2sgZmFjdG9yaWVzIGFuZCBwcmVmZXIgY3JlYXRlTW9ja1Byb3h5KC4uLikgZm9yIHBhcnRpYWwgbW9kdWxlIG1vY2tzLlwiLFxuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgICB1cmw6IFwiaHR0cHM6Ly9naXRodWIuY29tL3BhcmxvdGkvZXNsaW50LXBsdWdpbi9ibG9iL21haW4vZG9jcy9ydWxlcy9uby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0Lm1kXCIsXG4gICAgfSxcbiAgICBmaXhhYmxlOiBcImNvZGVcIixcbiAgICBoYXNTdWdnZXN0aW9uczogdHJ1ZSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgbm9VbnNhZmVWaXRlc3RNb2NrRmFjdG9yeUNhc3Q6XG4gICAgICAgIFwiQXZvaWQgY2FzdGluZyB2aS5tb2NrL3ZpLmRvTW9jayBmYWN0b3J5IHJlc3VsdHM7IHVzZSBjcmVhdGVNb2NrUHJveHkoLi4uKSB3aXRoIGEgdHlwZS1vbmx5IG1vZHVsZSBpbXBvcnQgaW5zdGVhZC5cIixcbiAgICAgIHJlcGxhY2VXaXRoQ3JlYXRlTW9ja1Byb3h5OlxuICAgICAgICBcIlJlcGxhY2UgdGhlIGNhc3RlZCBmYWN0b3J5IHdpdGggY3JlYXRlTW9ja1Byb3h5KC4uLikuXCIsXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICAgIHR5cGU6IFwicHJvYmxlbVwiLFxuICB9LFxufTtcblxuZXhwb3J0IHsgbm9VbnNhZmVWaXRlc3RNb2NrRmFjdG9yeUNhc3RSdWxlIH07XG4iXX0=