@codeperfect/eslint-plugin 1.0.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 (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts +16 -0
  5. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -0
  6. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +131 -0
  7. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +48 -0
  8. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -0
  9. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.js +126 -0
  10. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +40 -0
  11. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +1 -0
  12. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +90 -0
  13. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts +11 -0
  14. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -0
  15. package/dist/architecture/consistent-barrel-files/exports-only-rule.js +218 -0
  16. package/dist/architecture/consistent-barrel-files/index.d.ts +5 -0
  17. package/dist/architecture/consistent-barrel-files/index.d.ts.map +1 -0
  18. package/dist/architecture/consistent-barrel-files/index.js +4 -0
  19. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts +11 -0
  20. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -0
  21. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +100 -0
  22. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +40 -0
  23. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +1 -0
  24. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +90 -0
  25. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts +65 -0
  26. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -0
  27. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +154 -0
  28. package/dist/architecture/consistent-barrel-files/rule.d.ts +11 -0
  29. package/dist/architecture/consistent-barrel-files/rule.d.ts.map +1 -0
  30. package/dist/architecture/consistent-barrel-files/rule.js +58 -0
  31. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts +141 -0
  32. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts.map +1 -0
  33. package/dist/architecture/consistent-barrel-files/test-helpers.js +229 -0
  34. package/dist/architecture/consistent-barrel-files/types.d.ts +25 -0
  35. package/dist/architecture/consistent-barrel-files/types.d.ts.map +1 -0
  36. package/dist/architecture/consistent-barrel-files/types.js +2 -0
  37. package/dist/architecture/index.d.ts +2 -0
  38. package/dist/architecture/index.d.ts.map +1 -0
  39. package/dist/architecture/index.js +2 -0
  40. package/dist/benchmark-rules.d.ts +83 -0
  41. package/dist/benchmark-rules.d.ts.map +1 -0
  42. package/dist/benchmark-rules.js +175 -0
  43. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  44. package/dist/codeperfect-plugin.d.ts +46 -0
  45. package/dist/codeperfect-plugin.d.ts.map +1 -0
  46. package/dist/codeperfect-plugin.js +29 -0
  47. package/dist/core/index.d.ts +3 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +3 -0
  50. package/dist/core/no-multiple-declarators/index.d.ts +2 -0
  51. package/dist/core/no-multiple-declarators/index.d.ts.map +1 -0
  52. package/dist/core/no-multiple-declarators/index.js +2 -0
  53. package/dist/core/no-multiple-declarators/rule.d.ts +4 -0
  54. package/dist/core/no-multiple-declarators/rule.d.ts.map +1 -0
  55. package/dist/core/no-multiple-declarators/rule.js +100 -0
  56. package/dist/core/prefer-interface-types/index.d.ts +2 -0
  57. package/dist/core/prefer-interface-types/index.d.ts.map +1 -0
  58. package/dist/core/prefer-interface-types/index.js +2 -0
  59. package/dist/core/prefer-interface-types/rule.d.ts +5 -0
  60. package/dist/core/prefer-interface-types/rule.d.ts.map +1 -0
  61. package/dist/core/prefer-interface-types/rule.js +145 -0
  62. package/dist/core/prefer-interface-types/test-helpers.d.ts +110 -0
  63. package/dist/core/prefer-interface-types/test-helpers.d.ts.map +1 -0
  64. package/dist/core/prefer-interface-types/test-helpers.js +116 -0
  65. package/dist/custom-rule-documentation.d.ts +36 -0
  66. package/dist/custom-rule-documentation.d.ts.map +1 -0
  67. package/dist/custom-rule-documentation.js +35 -0
  68. package/dist/custom-rules.d.ts +61 -0
  69. package/dist/custom-rules.d.ts.map +1 -0
  70. package/dist/custom-rules.js +70 -0
  71. package/dist/docs/index.d.ts +4 -0
  72. package/dist/docs/index.d.ts.map +1 -0
  73. package/dist/docs/index.js +4 -0
  74. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts +89 -0
  75. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -0
  76. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.js +129 -0
  77. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts +48 -0
  78. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -0
  79. package/dist/docs/no-interface-member-docs/comment-utilities.js +146 -0
  80. package/dist/docs/no-interface-member-docs/index.d.ts +2 -0
  81. package/dist/docs/no-interface-member-docs/index.d.ts.map +1 -0
  82. package/dist/docs/no-interface-member-docs/index.js +2 -0
  83. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts +13 -0
  84. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -0
  85. package/dist/docs/no-interface-member-docs/parameter-tags.js +101 -0
  86. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts +24 -0
  87. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -0
  88. package/dist/docs/no-interface-member-docs/parameter-utilities.js +125 -0
  89. package/dist/docs/no-interface-member-docs/rule.d.ts +5 -0
  90. package/dist/docs/no-interface-member-docs/rule.d.ts.map +1 -0
  91. package/dist/docs/no-interface-member-docs/rule.js +168 -0
  92. package/dist/docs/no-interface-member-docs/test-helpers.d.ts +103 -0
  93. package/dist/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
  94. package/dist/docs/no-interface-member-docs/test-helpers.js +157 -0
  95. package/dist/docs/no-interface-member-docs/types.d.ts +30 -0
  96. package/dist/docs/no-interface-member-docs/types.d.ts.map +1 -0
  97. package/dist/docs/no-interface-member-docs/types.js +2 -0
  98. package/dist/docs/require-example-language/empty-fence-fixes.d.ts +29 -0
  99. package/dist/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -0
  100. package/dist/docs/require-example-language/empty-fence-fixes.js +169 -0
  101. package/dist/docs/require-example-language/example-utilities.d.ts +70 -0
  102. package/dist/docs/require-example-language/example-utilities.d.ts.map +1 -0
  103. package/dist/docs/require-example-language/example-utilities.js +76 -0
  104. package/dist/docs/require-example-language/examples.d.ts +36 -0
  105. package/dist/docs/require-example-language/examples.d.ts.map +1 -0
  106. package/dist/docs/require-example-language/examples.js +181 -0
  107. package/dist/docs/require-example-language/fixes.d.ts +49 -0
  108. package/dist/docs/require-example-language/fixes.d.ts.map +1 -0
  109. package/dist/docs/require-example-language/fixes.js +182 -0
  110. package/dist/docs/require-example-language/index.d.ts +3 -0
  111. package/dist/docs/require-example-language/index.d.ts.map +1 -0
  112. package/dist/docs/require-example-language/index.js +2 -0
  113. package/dist/docs/require-example-language/reporting.d.ts +60 -0
  114. package/dist/docs/require-example-language/reporting.d.ts.map +1 -0
  115. package/dist/docs/require-example-language/reporting.js +145 -0
  116. package/dist/docs/require-example-language/rule.d.ts +7 -0
  117. package/dist/docs/require-example-language/rule.d.ts.map +1 -0
  118. package/dist/docs/require-example-language/rule.js +34 -0
  119. package/dist/docs/require-example-language/types.d.ts +22 -0
  120. package/dist/docs/require-example-language/types.d.ts.map +1 -0
  121. package/dist/docs/require-example-language/types.js +2 -0
  122. package/dist/docs/single-line-jsdoc/index.d.ts +2 -0
  123. package/dist/docs/single-line-jsdoc/index.d.ts.map +1 -0
  124. package/dist/docs/single-line-jsdoc/index.js +2 -0
  125. package/dist/docs/single-line-jsdoc/rule.d.ts +5 -0
  126. package/dist/docs/single-line-jsdoc/rule.d.ts.map +1 -0
  127. package/dist/docs/single-line-jsdoc/rule.js +196 -0
  128. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts +16 -0
  129. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -0
  130. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.js +95 -0
  131. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts +25 -0
  132. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -0
  133. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +140 -0
  134. package/dist/docs/test-helpers.d.ts +50 -0
  135. package/dist/docs/test-helpers.d.ts.map +1 -0
  136. package/dist/docs/test-helpers.js +107 -0
  137. package/dist/index.d.ts +6 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +6 -0
  140. package/dist/presets.d.ts +10 -0
  141. package/dist/presets.d.ts.map +1 -0
  142. package/dist/presets.js +50 -0
  143. package/dist/rules/index.d.ts +5 -0
  144. package/dist/rules/index.d.ts.map +1 -0
  145. package/dist/rules/index.js +6 -0
  146. package/dist/testing/aaa/analyzer.d.ts +36 -0
  147. package/dist/testing/aaa/analyzer.d.ts.map +1 -0
  148. package/dist/testing/aaa/analyzer.js +490 -0
  149. package/dist/testing/aaa/index.d.ts +3 -0
  150. package/dist/testing/aaa/index.d.ts.map +1 -0
  151. package/dist/testing/aaa/index.js +2 -0
  152. package/dist/testing/aaa/types.d.ts +31 -0
  153. package/dist/testing/aaa/types.d.ts.map +1 -0
  154. package/dist/testing/aaa/types.js +2 -0
  155. package/dist/testing/assert-actual-expected-names/index.d.ts +2 -0
  156. package/dist/testing/assert-actual-expected-names/index.d.ts.map +1 -0
  157. package/dist/testing/assert-actual-expected-names/index.js +2 -0
  158. package/dist/testing/assert-actual-expected-names/rule.d.ts +4 -0
  159. package/dist/testing/assert-actual-expected-names/rule.d.ts.map +1 -0
  160. package/dist/testing/assert-actual-expected-names/rule.js +54 -0
  161. package/dist/testing/enforce-aaa-phase-purity/index.d.ts +2 -0
  162. package/dist/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -0
  163. package/dist/testing/enforce-aaa-phase-purity/index.js +2 -0
  164. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts +4 -0
  165. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -0
  166. package/dist/testing/enforce-aaa-phase-purity/rule.js +110 -0
  167. package/dist/testing/enforce-aaa-structure/index.d.ts +2 -0
  168. package/dist/testing/enforce-aaa-structure/index.d.ts.map +1 -0
  169. package/dist/testing/enforce-aaa-structure/index.js +2 -0
  170. package/dist/testing/enforce-aaa-structure/rule.d.ts +4 -0
  171. package/dist/testing/enforce-aaa-structure/rule.d.ts.map +1 -0
  172. package/dist/testing/enforce-aaa-structure/rule.js +48 -0
  173. package/dist/testing/index.d.ts +9 -0
  174. package/dist/testing/index.d.ts.map +1 -0
  175. package/dist/testing/index.js +9 -0
  176. package/dist/testing/prefer-vi-mocked-import/fix.d.ts +16 -0
  177. package/dist/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -0
  178. package/dist/testing/prefer-vi-mocked-import/fix.js +224 -0
  179. package/dist/testing/prefer-vi-mocked-import/index.d.ts +2 -0
  180. package/dist/testing/prefer-vi-mocked-import/index.d.ts.map +1 -0
  181. package/dist/testing/prefer-vi-mocked-import/index.js +2 -0
  182. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts +16 -0
  183. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -0
  184. package/dist/testing/prefer-vi-mocked-import/match-bindings.js +52 -0
  185. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts +16 -0
  186. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -0
  187. package/dist/testing/prefer-vi-mocked-import/match-declarations.js +99 -0
  188. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts +66 -0
  189. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +1 -0
  190. package/dist/testing/prefer-vi-mocked-import/match-helpers.js +102 -0
  191. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts +17 -0
  192. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -0
  193. package/dist/testing/prefer-vi-mocked-import/match-imports.js +156 -0
  194. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts +42 -0
  195. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -0
  196. package/dist/testing/prefer-vi-mocked-import/match-rewrites.js +119 -0
  197. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts +13 -0
  198. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts.map +1 -0
  199. package/dist/testing/prefer-vi-mocked-import/match-walk.js +62 -0
  200. package/dist/testing/prefer-vi-mocked-import/match.d.ts +15 -0
  201. package/dist/testing/prefer-vi-mocked-import/match.d.ts.map +1 -0
  202. package/dist/testing/prefer-vi-mocked-import/match.js +193 -0
  203. package/dist/testing/prefer-vi-mocked-import/rule.d.ts +5 -0
  204. package/dist/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -0
  205. package/dist/testing/prefer-vi-mocked-import/rule.js +32 -0
  206. package/dist/testing/prefer-vi-mocked-import/types.d.ts +83 -0
  207. package/dist/testing/prefer-vi-mocked-import/types.d.ts.map +1 -0
  208. package/dist/testing/prefer-vi-mocked-import/types.js +2 -0
  209. package/dist/testing/require-aaa-sections/index.d.ts +2 -0
  210. package/dist/testing/require-aaa-sections/index.d.ts.map +1 -0
  211. package/dist/testing/require-aaa-sections/index.js +2 -0
  212. package/dist/testing/require-aaa-sections/rule.d.ts +4 -0
  213. package/dist/testing/require-aaa-sections/rule.d.ts.map +1 -0
  214. package/dist/testing/require-aaa-sections/rule.js +111 -0
  215. package/dist/testing/require-act-result-capture/index.d.ts +2 -0
  216. package/dist/testing/require-act-result-capture/index.d.ts.map +1 -0
  217. package/dist/testing/require-act-result-capture/index.js +2 -0
  218. package/dist/testing/require-act-result-capture/rule.d.ts +4 -0
  219. package/dist/testing/require-act-result-capture/rule.d.ts.map +1 -0
  220. package/dist/testing/require-act-result-capture/rule.js +34 -0
  221. package/dist/testing/require-test-companion/index.d.ts +3 -0
  222. package/dist/testing/require-test-companion/index.d.ts.map +1 -0
  223. package/dist/testing/require-test-companion/index.js +3 -0
  224. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts +16 -0
  225. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -0
  226. package/dist/testing/require-test-companion/require-test-companion-listeners.js +145 -0
  227. package/dist/testing/require-test-companion/require-test-companion-options.d.ts +54 -0
  228. package/dist/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -0
  229. package/dist/testing/require-test-companion/require-test-companion-options.js +112 -0
  230. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts +51 -0
  231. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +1 -0
  232. package/dist/testing/require-test-companion/require-test-companion-test-helpers.js +183 -0
  233. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts +28 -0
  234. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts.map +1 -0
  235. package/dist/testing/require-test-companion/require-test-companion-utilities.js +26 -0
  236. package/dist/testing/require-test-companion/rule.d.ts +5 -0
  237. package/dist/testing/require-test-companion/rule.d.ts.map +1 -0
  238. package/dist/testing/require-test-companion/rule.js +57 -0
  239. package/dist/testing/require-test-companion/types.d.ts +11 -0
  240. package/dist/testing/require-test-companion/types.d.ts.map +1 -0
  241. package/dist/testing/require-test-companion/types.js +2 -0
  242. package/dist/testing/single-act-statement/index.d.ts +2 -0
  243. package/dist/testing/single-act-statement/index.d.ts.map +1 -0
  244. package/dist/testing/single-act-statement/index.js +2 -0
  245. package/dist/testing/single-act-statement/rule.d.ts +4 -0
  246. package/dist/testing/single-act-statement/rule.d.ts.map +1 -0
  247. package/dist/testing/single-act-statement/rule.js +33 -0
  248. package/package.json +106 -0
@@ -0,0 +1,2 @@
1
+ export { assertActualExpectedNamesRule } from "./rule";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9hc3NlcnQtYWN0dWFsLWV4cGVjdGVkLW5hbWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGFzc2VydEFjdHVhbEV4cGVjdGVkTmFtZXNSdWxlIH0gZnJvbSBcIi4vcnVsZVwiO1xuIl19
@@ -0,0 +1,4 @@
1
+ import type { Rule } from "eslint";
2
+ declare const assertActualExpectedNamesRule: Rule.RuleModule;
3
+ export { assertActualExpectedNamesRule };
4
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/testing/assert-actual-expected-names/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAWnC,QAAA,MAAM,6BAA6B,EAAE,IAAI,CAAC,UA8DzC,CAAC;AAEF,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { createRuleDocumentation } from "../../custom-rule-documentation";
2
+ import { analyzeTestBlock, getAssertDeclaredIdentifiers, getAssertionIdentifiers, hasAssertion, usesPrefix, } from "../aaa";
3
+ const assertActualExpectedNamesRule = {
4
+ create(context) {
5
+ return {
6
+ CallExpression(node) {
7
+ const analysis = analyzeTestBlock(context, node);
8
+ if (analysis === void 0) {
9
+ return;
10
+ }
11
+ const declaredIdentifiers = getAssertDeclaredIdentifiers(analysis);
12
+ const reportedNames = new Set();
13
+ for (const statement of analysis.statements) {
14
+ if (statement.phase !== "Assert" || !hasAssertion(statement.node)) {
15
+ continue;
16
+ }
17
+ const { actual, expected } = getAssertionIdentifiers(statement.node);
18
+ if (actual !== void 0 &&
19
+ declaredIdentifiers.has(actual) &&
20
+ !usesPrefix(actual, "actual") &&
21
+ !reportedNames.has(`actual:${actual}`)) {
22
+ reportedNames.add(`actual:${actual}`);
23
+ context.report({
24
+ data: { name: actual, prefix: "actual" },
25
+ messageId: "missingPrefix",
26
+ node: declaredIdentifiers.get(actual),
27
+ });
28
+ }
29
+ if (expected !== void 0 &&
30
+ declaredIdentifiers.has(expected) &&
31
+ !usesPrefix(expected, "expected") &&
32
+ !reportedNames.has(`expected:${expected}`)) {
33
+ reportedNames.add(`expected:${expected}`);
34
+ context.report({
35
+ data: { name: expected, prefix: "expected" },
36
+ messageId: "missingPrefix",
37
+ node: declaredIdentifiers.get(expected),
38
+ });
39
+ }
40
+ }
41
+ },
42
+ };
43
+ },
44
+ meta: {
45
+ docs: createRuleDocumentation("assert-actual-expected-names", "Require Assert-phase comparison variables to use actual*/expected* prefixes."),
46
+ messages: {
47
+ missingPrefix: "Rename '{{name}}' to use the '{{prefix}}' prefix when comparing values inside // Assert.",
48
+ },
49
+ schema: [],
50
+ type: "suggestion",
51
+ },
52
+ };
53
+ export { assertActualExpectedNamesRule };
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Fzc2VydC1hY3R1YWwtZXhwZWN0ZWQtbmFtZXMvcnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLFVBQVUsR0FDWCxNQUFNLFFBQVEsQ0FBQztBQUVoQixNQUFNLDZCQUE2QixHQUFvQjtJQUNyRCxNQUFNLENBQUMsT0FBeUI7UUFDOUIsT0FBTztZQUNMLGNBQWMsQ0FBQyxJQUFJO2dCQUNqQixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELElBQUksUUFBUSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxNQUFNLG1CQUFtQixHQUFHLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRSxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO2dCQUV4QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxTQUFTLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDbEUsU0FBUztvQkFDWCxDQUFDO29CQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUVyRSxJQUNFLE1BQU0sS0FBSyxLQUFLLENBQUM7d0JBQ2pCLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7d0JBQy9CLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7d0JBQzdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLE1BQU0sRUFBRSxDQUFDLEVBQ3RDLENBQUM7d0JBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLE1BQU0sRUFBRSxDQUFDLENBQUM7d0JBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUM7NEJBQ2IsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFOzRCQUN4QyxTQUFTLEVBQUUsZUFBZTs0QkFDMUIsSUFBSSxFQUFFLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUU7eUJBQ3ZDLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUVELElBQ0UsUUFBUSxLQUFLLEtBQUssQ0FBQzt3QkFDbkIsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQzt3QkFDakMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQzt3QkFDakMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksUUFBUSxFQUFFLENBQUMsRUFDMUMsQ0FBQzt3QkFDRCxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDYixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUU7NEJBQzVDLFNBQVMsRUFBRSxlQUFlOzRCQUMxQixJQUFJLEVBQUUsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBRTt5QkFDekMsQ0FBQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7U0FDMEIsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLHVCQUF1QixDQUMzQiw4QkFBOEIsRUFDOUIsOEVBQThFLENBQy9FO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsYUFBYSxFQUNYLDBGQUEwRjtTQUM3RjtRQUNELE1BQU0sRUFBRSxFQUFFO1FBQ1YsSUFBSSxFQUFFLFlBQVk7S0FDbkI7Q0FDRixDQUFDO0FBRUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5cbmltcG9ydCB7IGNyZWF0ZVJ1bGVEb2N1bWVudGF0aW9uIH0gZnJvbSBcIi4uLy4uL2N1c3RvbS1ydWxlLWRvY3VtZW50YXRpb25cIjtcbmltcG9ydCB7XG4gIGFuYWx5emVUZXN0QmxvY2ssXG4gIGdldEFzc2VydERlY2xhcmVkSWRlbnRpZmllcnMsXG4gIGdldEFzc2VydGlvbklkZW50aWZpZXJzLFxuICBoYXNBc3NlcnRpb24sXG4gIHVzZXNQcmVmaXgsXG59IGZyb20gXCIuLi9hYWFcIjtcblxuY29uc3QgYXNzZXJ0QWN0dWFsRXhwZWN0ZWROYW1lc1J1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBSdWxlLlJ1bGVMaXN0ZW5lciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYW5hbHlzaXMgPSBhbmFseXplVGVzdEJsb2NrKGNvbnRleHQsIG5vZGUpO1xuICAgICAgICBpZiAoYW5hbHlzaXMgPT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY2xhcmVkSWRlbnRpZmllcnMgPSBnZXRBc3NlcnREZWNsYXJlZElkZW50aWZpZXJzKGFuYWx5c2lzKTtcbiAgICAgICAgY29uc3QgcmVwb3J0ZWROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGFuYWx5c2lzLnN0YXRlbWVudHMpIHtcbiAgICAgICAgICBpZiAoc3RhdGVtZW50LnBoYXNlICE9PSBcIkFzc2VydFwiIHx8ICFoYXNBc3NlcnRpb24oc3RhdGVtZW50Lm5vZGUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGFjdHVhbCwgZXhwZWN0ZWQgfSA9IGdldEFzc2VydGlvbklkZW50aWZpZXJzKHN0YXRlbWVudC5ub2RlKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGFjdHVhbCAhPT0gdm9pZCAwICYmXG4gICAgICAgICAgICBkZWNsYXJlZElkZW50aWZpZXJzLmhhcyhhY3R1YWwpICYmXG4gICAgICAgICAgICAhdXNlc1ByZWZpeChhY3R1YWwsIFwiYWN0dWFsXCIpICYmXG4gICAgICAgICAgICAhcmVwb3J0ZWROYW1lcy5oYXMoYGFjdHVhbDoke2FjdHVhbH1gKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmVwb3J0ZWROYW1lcy5hZGQoYGFjdHVhbDoke2FjdHVhbH1gKTtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgZGF0YTogeyBuYW1lOiBhY3R1YWwsIHByZWZpeDogXCJhY3R1YWxcIiB9LFxuICAgICAgICAgICAgICBtZXNzYWdlSWQ6IFwibWlzc2luZ1ByZWZpeFwiLFxuICAgICAgICAgICAgICBub2RlOiBkZWNsYXJlZElkZW50aWZpZXJzLmdldChhY3R1YWwpISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGV4cGVjdGVkICE9PSB2b2lkIDAgJiZcbiAgICAgICAgICAgIGRlY2xhcmVkSWRlbnRpZmllcnMuaGFzKGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIXVzZXNQcmVmaXgoZXhwZWN0ZWQsIFwiZXhwZWN0ZWRcIikgJiZcbiAgICAgICAgICAgICFyZXBvcnRlZE5hbWVzLmhhcyhgZXhwZWN0ZWQ6JHtleHBlY3RlZH1gKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmVwb3J0ZWROYW1lcy5hZGQoYGV4cGVjdGVkOiR7ZXhwZWN0ZWR9YCk7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgIGRhdGE6IHsgbmFtZTogZXhwZWN0ZWQsIHByZWZpeDogXCJleHBlY3RlZFwiIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2VJZDogXCJtaXNzaW5nUHJlZml4XCIsXG4gICAgICAgICAgICAgIG5vZGU6IGRlY2xhcmVkSWRlbnRpZmllcnMuZ2V0KGV4cGVjdGVkKSEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSBzYXRpc2ZpZXMgUnVsZS5SdWxlTGlzdGVuZXI7XG4gIH0sXG4gIG1ldGE6IHtcbiAgICBkb2NzOiBjcmVhdGVSdWxlRG9jdW1lbnRhdGlvbihcbiAgICAgIFwiYXNzZXJ0LWFjdHVhbC1leHBlY3RlZC1uYW1lc1wiLFxuICAgICAgXCJSZXF1aXJlIEFzc2VydC1waGFzZSBjb21wYXJpc29uIHZhcmlhYmxlcyB0byB1c2UgYWN0dWFsKi9leHBlY3RlZCogcHJlZml4ZXMuXCIsXG4gICAgKSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgbWlzc2luZ1ByZWZpeDpcbiAgICAgICAgXCJSZW5hbWUgJ3t7bmFtZX19JyB0byB1c2UgdGhlICd7e3ByZWZpeH19JyBwcmVmaXggd2hlbiBjb21wYXJpbmcgdmFsdWVzIGluc2lkZSAvLyBBc3NlcnQuXCIsXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICAgIHR5cGU6IFwic3VnZ2VzdGlvblwiLFxuICB9LFxufTtcblxuZXhwb3J0IHsgYXNzZXJ0QWN0dWFsRXhwZWN0ZWROYW1lc1J1bGUgfTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export { enforceAaaPhasePurityRule } from "./rule";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/enforce-aaa-phase-purity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { enforceAaaPhasePurityRule } from "./rule";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9lbmZvcmNlLWFhYS1waGFzZS1wdXJpdHkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZW5mb3JjZUFhYVBoYXNlUHVyaXR5UnVsZSB9IGZyb20gXCIuL3J1bGVcIjtcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { Rule } from "eslint";
2
+ declare const enforceAaaPhasePurityRule: Rule.RuleModule;
3
+ export { enforceAaaPhasePurityRule };
4
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/testing/enforce-aaa-phase-purity/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAcnC,QAAA,MAAM,yBAAyB,EAAE,IAAI,CAAC,UA6HrC,CAAC;AAEF,OAAO,EAAE,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { createRuleDocumentation } from "../../custom-rule-documentation";
2
+ import { analyzeTestBlock, hasAssertion, hasAsyncLogic, hasAwait, hasMutation, isMeaningfulActStatement, isSetupLikeStatement, isValidAssertStatement, } from "../aaa";
3
+ const enforceAaaPhasePurityRule = {
4
+ create(context) {
5
+ return {
6
+ CallExpression(node) {
7
+ const analysis = analyzeTestBlock(context, node);
8
+ if (analysis === void 0) {
9
+ return;
10
+ }
11
+ const hasAllSections = ["Arrange", "Act", "Assert"].every((phase) => analysis.sectionComments.some((sectionComment) => sectionComment.phases.includes(phase)));
12
+ if (!hasAllSections) {
13
+ return;
14
+ }
15
+ let hasMeaningfulAct = false;
16
+ for (const statement of analysis.statements) {
17
+ if (statement.phase === "Arrange") {
18
+ if (hasAssertion(statement.node)) {
19
+ context.report({
20
+ messageId: "assertionOutsideAssert",
21
+ node: statement.node,
22
+ });
23
+ }
24
+ if (hasAwait(statement.node)) {
25
+ context.report({
26
+ messageId: "awaitOutsideAct",
27
+ node: statement.node,
28
+ });
29
+ }
30
+ if (hasAsyncLogic(statement.node)) {
31
+ context.report({
32
+ messageId: "asyncInArrange",
33
+ node: statement.node,
34
+ });
35
+ }
36
+ if (isMeaningfulActStatement(statement.node)) {
37
+ context.report({
38
+ messageId: "actionInArrange",
39
+ node: statement.node,
40
+ });
41
+ }
42
+ continue;
43
+ }
44
+ if (statement.phase === "Act") {
45
+ hasMeaningfulAct ||= isMeaningfulActStatement(statement.node);
46
+ if (hasAssertion(statement.node)) {
47
+ context.report({
48
+ messageId: "assertionOutsideAssert",
49
+ node: statement.node,
50
+ });
51
+ }
52
+ if (isSetupLikeStatement(statement.node)) {
53
+ context.report({
54
+ messageId: "setupAfterAct",
55
+ node: statement.node,
56
+ });
57
+ }
58
+ continue;
59
+ }
60
+ /* v8 ignore start -- concrete Assert-phase behaviors are covered by rule tests; this guard's remaining branch artifact comes from source-mapped phase discrimination. */
61
+ if (statement.phase === "Assert") {
62
+ if (hasAwait(statement.node)) {
63
+ context.report({
64
+ messageId: "awaitOutsideAct",
65
+ node: statement.node,
66
+ });
67
+ }
68
+ if (hasMutation(statement.node)) {
69
+ context.report({
70
+ messageId: "mutationAfterAct",
71
+ node: statement.node,
72
+ });
73
+ continue;
74
+ }
75
+ if (!isValidAssertStatement(statement.node)) {
76
+ context.report({
77
+ messageId: "nonAssertionInAssert",
78
+ node: statement.node,
79
+ });
80
+ }
81
+ }
82
+ /* v8 ignore stop */
83
+ }
84
+ if (!hasMeaningfulAct) {
85
+ context.report({
86
+ messageId: "missingMeaningfulAct",
87
+ node: analysis.callExpression,
88
+ });
89
+ }
90
+ },
91
+ };
92
+ },
93
+ meta: {
94
+ docs: createRuleDocumentation("enforce-aaa-phase-purity", "Keep setup, action, and assertions inside their intended AAA phases."),
95
+ messages: {
96
+ actionInArrange: "Keep the function under test out of Arrange; reserve Arrange for setup only.",
97
+ assertionOutsideAssert: "Move assertions into the // Assert section so test logic does not leak earlier.",
98
+ asyncInArrange: "Do not trigger async behavior in Arrange.",
99
+ awaitOutsideAct: "Use await only inside the // Act section.",
100
+ missingMeaningfulAct: "The // Act section must contain a meaningful SUT interaction, not only utility or setup calls.",
101
+ mutationAfterAct: "Do not mutate test data after the // Act section has run.",
102
+ nonAssertionInAssert: "Keep the // Assert section focused on assertions and assertion-local values.",
103
+ setupAfterAct: "Do not continue arranging test data after the // Act section has started.",
104
+ },
105
+ schema: [],
106
+ type: "problem",
107
+ },
108
+ };
109
+ export { enforceAaaPhasePurityRule };
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2VuZm9yY2UtYWFhLXBoYXNlLXB1cml0eS9ydWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGFBQWEsRUFDYixRQUFRLEVBQ1IsV0FBVyxFQUNYLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIsc0JBQXNCLEdBQ3ZCLE1BQU0sUUFBUSxDQUFDO0FBRWhCLE1BQU0seUJBQXlCLEdBQW9CO0lBQ2pELE1BQU0sQ0FBQyxPQUF5QjtRQUM5QixPQUFPO1lBQ0wsY0FBYyxDQUFDLElBQUk7Z0JBQ2pCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTztnQkFDVCxDQUFDO2dCQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNsRSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQy9DLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWMsQ0FBQyxDQUMvQyxDQUNGLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNwQixPQUFPO2dCQUNULENBQUM7Z0JBRUQsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Z0JBRTdCLEtBQUssTUFBTSxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUM1QyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7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Q2pDLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYztxQkFDOUIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1NBQzBCLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksRUFBRTtRQUNKLElBQUksRUFBRSx1QkFBdUIsQ0FDM0IsMEJBQTBCLEVBQzFCLHNFQUFzRSxDQUN2RTtRQUNELFFBQVEsRUFBRTtZQUNSLGVBQWUsRUFDYiw4RUFBOEU7WUFDaEYsc0JBQXNCLEVBQ3BCLGlGQUFpRjtZQUNuRixjQUFjLEVBQUUsMkNBQTJDO1lBQzNELGVBQWUsRUFBRSwyQ0FBMkM7WUFDNUQsb0JBQW9CLEVBQ2xCLGdHQUFnRztZQUNsRyxnQkFBZ0IsRUFDZCwyREFBMkQ7WUFDN0Qsb0JBQW9CLEVBQ2xCLDhFQUE4RTtZQUNoRixhQUFhLEVBQ1gsMkVBQTJFO1NBQzlFO1FBQ0QsTUFBTSxFQUFFLEVBQUU7UUFDVixJQUFJLEVBQUUsU0FBUztLQUNoQjtDQUNGLENBQUM7QUFFRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHsgY3JlYXRlUnVsZURvY3VtZW50YXRpb24gfSBmcm9tIFwiLi4vLi4vY3VzdG9tLXJ1bGUtZG9jdW1lbnRhdGlvblwiO1xuaW1wb3J0IHtcbiAgYW5hbHl6ZVRlc3RCbG9jayxcbiAgaGFzQXNzZXJ0aW9uLFxuICBoYXNBc3luY0xvZ2ljLFxuICBoYXNBd2FpdCxcbiAgaGFzTXV0YXRpb24sXG4gIGlzTWVhbmluZ2Z1bEFjdFN0YXRlbWVudCxcbiAgaXNTZXR1cExpa2VTdGF0ZW1lbnQsXG4gIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQsXG59IGZyb20gXCIuLi9hYWFcIjtcblxuY29uc3QgZW5mb3JjZUFhYVBoYXNlUHVyaXR5UnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBhbmFseXNpcyA9IGFuYWx5emVUZXN0QmxvY2soY29udGV4dCwgbm9kZSk7XG4gICAgICAgIGlmIChhbmFseXNpcyA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzQWxsU2VjdGlvbnMgPSBbXCJBcnJhbmdlXCIsIFwiQWN0XCIsIFwiQXNzZXJ0XCJdLmV2ZXJ5KChwaGFzZSkgPT5cbiAgICAgICAgICBhbmFseXNpcy5zZWN0aW9uQ29tbWVudHMuc29tZSgoc2VjdGlvbkNvbW1lbnQpID0+XG4gICAgICAgICAgICBzZWN0aW9uQ29tbWVudC5waGFzZXMuaW5jbHVkZXMocGhhc2UgYXMgbmV2ZXIpLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaGFzQWxsU2VjdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzTWVhbmluZ2Z1bEFjdCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGFuYWx5c2lzLnN0YXRlbWVudHMpIHtcbiAgICAgICAgICBpZiAoc3RhdGVtZW50LnBoYXNlID09PSBcIkFycmFuZ2VcIikge1xuICAgICAgICAgICAgaWYgKGhhc0Fzc2VydGlvbihzdGF0ZW1lbnQubm9kZSkpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogXCJhc3NlcnRpb25PdXRzaWRlQXNzZXJ0XCIsXG4gICAgICAgICAgICAgICAgbm9kZTogc3RhdGVtZW50Lm5vZGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0F3YWl0KHN0YXRlbWVudC5ub2RlKSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBcImF3YWl0T3V0c2lkZUFjdFwiLFxuICAgICAgICAgICAgICAgIG5vZGU6IHN0YXRlbWVudC5ub2RlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNBc3luY0xvZ2ljKHN0YXRlbWVudC5ub2RlKSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBcImFzeW5jSW5BcnJhbmdlXCIsXG4gICAgICAgICAgICAgICAgbm9kZTogc3RhdGVtZW50Lm5vZGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTWVhbmluZ2Z1bEFjdFN0YXRlbWVudChzdGF0ZW1lbnQubm9kZSkpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogXCJhY3Rpb25JbkFycmFuZ2VcIixcbiAgICAgICAgICAgICAgICBub2RlOiBzdGF0ZW1lbnQubm9kZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RhdGVtZW50LnBoYXNlID09PSBcIkFjdFwiKSB7XG4gICAgICAgICAgICBoYXNNZWFuaW5nZnVsQWN0IHx8PSBpc01lYW5pbmdmdWxBY3RTdGF0ZW1lbnQoc3RhdGVtZW50Lm5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoaGFzQXNzZXJ0aW9uKHN0YXRlbWVudC5ub2RlKSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBcImFzc2VydGlvbk91dHNpZGVBc3NlcnRcIixcbiAgICAgICAgICAgICAgICBub2RlOiBzdGF0ZW1lbnQubm9kZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTZXR1cExpa2VTdGF0ZW1lbnQoc3RhdGVtZW50Lm5vZGUpKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IFwic2V0dXBBZnRlckFjdFwiLFxuICAgICAgICAgICAgICAgIG5vZGU6IHN0YXRlbWVudC5ub2RlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBjb25jcmV0ZSBBc3NlcnQtcGhhc2UgYmVoYXZpb3JzIGFyZSBjb3ZlcmVkIGJ5IHJ1bGUgdGVzdHM7IHRoaXMgZ3VhcmQncyByZW1haW5pbmcgYnJhbmNoIGFydGlmYWN0IGNvbWVzIGZyb20gc291cmNlLW1hcHBlZCBwaGFzZSBkaXNjcmltaW5hdGlvbi4gKi9cbiAgICAgICAgICBpZiAoc3RhdGVtZW50LnBoYXNlID09PSBcIkFzc2VydFwiKSB7XG4gICAgICAgICAgICBpZiAoaGFzQXdhaXQoc3RhdGVtZW50Lm5vZGUpKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IFwiYXdhaXRPdXRzaWRlQWN0XCIsXG4gICAgICAgICAgICAgICAgbm9kZTogc3RhdGVtZW50Lm5vZGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc011dGF0aW9uKHN0YXRlbWVudC5ub2RlKSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBcIm11dGF0aW9uQWZ0ZXJBY3RcIixcbiAgICAgICAgICAgICAgICBub2RlOiBzdGF0ZW1lbnQubm9kZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkQXNzZXJ0U3RhdGVtZW50KHN0YXRlbWVudC5ub2RlKSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBcIm5vbkFzc2VydGlvbkluQXNzZXJ0XCIsXG4gICAgICAgICAgICAgICAgbm9kZTogc3RhdGVtZW50Lm5vZGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNNZWFuaW5nZnVsQWN0KSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbWVzc2FnZUlkOiBcIm1pc3NpbmdNZWFuaW5nZnVsQWN0XCIsXG4gICAgICAgICAgICBub2RlOiBhbmFseXNpcy5jYWxsRXhwcmVzc2lvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9IHNhdGlzZmllcyBSdWxlLlJ1bGVMaXN0ZW5lcjtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IGNyZWF0ZVJ1bGVEb2N1bWVudGF0aW9uKFxuICAgICAgXCJlbmZvcmNlLWFhYS1waGFzZS1wdXJpdHlcIixcbiAgICAgIFwiS2VlcCBzZXR1cCwgYWN0aW9uLCBhbmQgYXNzZXJ0aW9ucyBpbnNpZGUgdGhlaXIgaW50ZW5kZWQgQUFBIHBoYXNlcy5cIixcbiAgICApLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBhY3Rpb25JbkFycmFuZ2U6XG4gICAgICAgIFwiS2VlcCB0aGUgZnVuY3Rpb24gdW5kZXIgdGVzdCBvdXQgb2YgQXJyYW5nZTsgcmVzZXJ2ZSBBcnJhbmdlIGZvciBzZXR1cCBvbmx5LlwiLFxuICAgICAgYXNzZXJ0aW9uT3V0c2lkZUFzc2VydDpcbiAgICAgICAgXCJNb3ZlIGFzc2VydGlvbnMgaW50byB0aGUgLy8gQXNzZXJ0IHNlY3Rpb24gc28gdGVzdCBsb2dpYyBkb2VzIG5vdCBsZWFrIGVhcmxpZXIuXCIsXG4gICAgICBhc3luY0luQXJyYW5nZTogXCJEbyBub3QgdHJpZ2dlciBhc3luYyBiZWhhdmlvciBpbiBBcnJhbmdlLlwiLFxuICAgICAgYXdhaXRPdXRzaWRlQWN0OiBcIlVzZSBhd2FpdCBvbmx5IGluc2lkZSB0aGUgLy8gQWN0IHNlY3Rpb24uXCIsXG4gICAgICBtaXNzaW5nTWVhbmluZ2Z1bEFjdDpcbiAgICAgICAgXCJUaGUgLy8gQWN0IHNlY3Rpb24gbXVzdCBjb250YWluIGEgbWVhbmluZ2Z1bCBTVVQgaW50ZXJhY3Rpb24sIG5vdCBvbmx5IHV0aWxpdHkgb3Igc2V0dXAgY2FsbHMuXCIsXG4gICAgICBtdXRhdGlvbkFmdGVyQWN0OlxuICAgICAgICBcIkRvIG5vdCBtdXRhdGUgdGVzdCBkYXRhIGFmdGVyIHRoZSAvLyBBY3Qgc2VjdGlvbiBoYXMgcnVuLlwiLFxuICAgICAgbm9uQXNzZXJ0aW9uSW5Bc3NlcnQ6XG4gICAgICAgIFwiS2VlcCB0aGUgLy8gQXNzZXJ0IHNlY3Rpb24gZm9jdXNlZCBvbiBhc3NlcnRpb25zIGFuZCBhc3NlcnRpb24tbG9jYWwgdmFsdWVzLlwiLFxuICAgICAgc2V0dXBBZnRlckFjdDpcbiAgICAgICAgXCJEbyBub3QgY29udGludWUgYXJyYW5naW5nIHRlc3QgZGF0YSBhZnRlciB0aGUgLy8gQWN0IHNlY3Rpb24gaGFzIHN0YXJ0ZWQuXCIsXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICAgIHR5cGU6IFwicHJvYmxlbVwiLFxuICB9LFxufTtcblxuZXhwb3J0IHsgZW5mb3JjZUFhYVBoYXNlUHVyaXR5UnVsZSB9O1xuIl19
@@ -0,0 +1,2 @@
1
+ export { enforceAaaStructureRule } from "./rule";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/enforce-aaa-structure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { enforceAaaStructureRule } from "./rule";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9lbmZvcmNlLWFhYS1zdHJ1Y3R1cmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZW5mb3JjZUFhYVN0cnVjdHVyZVJ1bGUgfSBmcm9tIFwiLi9ydWxlXCI7XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import type { Rule } from "eslint";
2
+ declare const enforceAaaStructureRule: Rule.RuleModule;
3
+ export { enforceAaaStructureRule };
4
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/testing/enforce-aaa-structure/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAKnC,QAAA,MAAM,uBAAuB,EAAE,IAAI,CAAC,UAoDnC,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { createRuleDocumentation } from "../../custom-rule-documentation";
2
+ import { aaaPhaseOrder, analyzeTestBlock, getFlattenedSections } from "../aaa";
3
+ const enforceAaaStructureRule = {
4
+ create(context) {
5
+ return {
6
+ CallExpression(node) {
7
+ const analysis = analyzeTestBlock(context, node);
8
+ if (analysis === void 0) {
9
+ return;
10
+ }
11
+ const flattenedSections = getFlattenedSections(analysis);
12
+ const seenPhases = new Set();
13
+ let lastPhaseOrder = -1;
14
+ for (const section of flattenedSections) {
15
+ if (seenPhases.has(section.phase)) {
16
+ context.report({
17
+ data: { section: section.phase },
18
+ messageId: "duplicateSection",
19
+ node: section.comment,
20
+ });
21
+ continue;
22
+ }
23
+ const currentPhaseOrder = aaaPhaseOrder[section.phase];
24
+ if (currentPhaseOrder < lastPhaseOrder) {
25
+ context.report({
26
+ data: { section: section.phase },
27
+ messageId: "invalidOrder",
28
+ node: section.comment,
29
+ });
30
+ }
31
+ lastPhaseOrder = Math.max(lastPhaseOrder, currentPhaseOrder);
32
+ seenPhases.add(section.phase);
33
+ }
34
+ },
35
+ };
36
+ },
37
+ meta: {
38
+ docs: createRuleDocumentation("enforce-aaa-structure", "Require AAA sections to appear once and in Arrange, Act, Assert order."),
39
+ messages: {
40
+ duplicateSection: "Use the // {{section}} section comment only once per test.",
41
+ invalidOrder: "Move the // {{section}} section comment so AAA phases stay in Arrange, Act, Assert order.",
42
+ },
43
+ schema: [],
44
+ type: "problem",
45
+ },
46
+ };
47
+ export { enforceAaaStructureRule };
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2VuZm9yY2UtYWFhLXN0cnVjdHVyZS9ydWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFL0UsTUFBTSx1QkFBdUIsR0FBb0I7SUFDL0MsTUFBTSxDQUFDLE9BQXlCO1FBQzlCLE9BQU87WUFDTCxjQUFjLENBQUMsSUFBSTtnQkFDakIsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLFFBQVEsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN4QixPQUFPO2dCQUNULENBQUM7Z0JBRUQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztnQkFDckMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRXhCLEtBQUssTUFBTSxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztvQkFDeEMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNsQyxPQUFPLENBQUMsTUFBTSxDQUFDOzRCQUNiLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFOzRCQUNoQyxTQUFTLEVBQUUsa0JBQWtCOzRCQUM3QixJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU87eUJBQ3RCLENBQUMsQ0FBQzt3QkFDSCxTQUFTO29CQUNYLENBQUM7b0JBRUQsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2RCxJQUFJLGlCQUFpQixHQUFHLGNBQWMsRUFBRSxDQUFDO3dCQUN2QyxPQUFPLENBQUMsTUFBTSxDQUFDOzRCQUNiLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFOzRCQUNoQyxTQUFTLEVBQUUsY0FBYzs0QkFDekIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPO3lCQUN0QixDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFFRCxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztvQkFDN0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7WUFDSCxDQUFDO1NBQzBCLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksRUFBRTtRQUNKLElBQUksRUFBRSx1QkFBdUIsQ0FDM0IsdUJBQXVCLEVBQ3ZCLHdFQUF3RSxDQUN6RTtRQUNELFFBQVEsRUFBRTtZQUNSLGdCQUFnQixFQUNkLDREQUE0RDtZQUM5RCxZQUFZLEVBQ1YsMkZBQTJGO1NBQzlGO1FBQ0QsTUFBTSxFQUFFLEVBQUU7UUFDVixJQUFJLEVBQUUsU0FBUztLQUNoQjtDQUNGLENBQUM7QUFFRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHsgY3JlYXRlUnVsZURvY3VtZW50YXRpb24gfSBmcm9tIFwiLi4vLi4vY3VzdG9tLXJ1bGUtZG9jdW1lbnRhdGlvblwiO1xuaW1wb3J0IHsgYWFhUGhhc2VPcmRlciwgYW5hbHl6ZVRlc3RCbG9jaywgZ2V0RmxhdHRlbmVkU2VjdGlvbnMgfSBmcm9tIFwiLi4vYWFhXCI7XG5cbmNvbnN0IGVuZm9yY2VBYWFTdHJ1Y3R1cmVSdWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIGNyZWF0ZShjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KTogUnVsZS5SdWxlTGlzdGVuZXIge1xuICAgIHJldHVybiB7XG4gICAgICBDYWxsRXhwcmVzc2lvbihub2RlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFuYWx5c2lzID0gYW5hbHl6ZVRlc3RCbG9jayhjb250ZXh0LCBub2RlKTtcbiAgICAgICAgaWYgKGFuYWx5c2lzID09PSB2b2lkIDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbGF0dGVuZWRTZWN0aW9ucyA9IGdldEZsYXR0ZW5lZFNlY3Rpb25zKGFuYWx5c2lzKTtcbiAgICAgICAgY29uc3Qgc2VlblBoYXNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBsZXQgbGFzdFBoYXNlT3JkZXIgPSAtMTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZmxhdHRlbmVkU2VjdGlvbnMpIHtcbiAgICAgICAgICBpZiAoc2VlblBoYXNlcy5oYXMoc2VjdGlvbi5waGFzZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgZGF0YTogeyBzZWN0aW9uOiBzZWN0aW9uLnBoYXNlIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2VJZDogXCJkdXBsaWNhdGVTZWN0aW9uXCIsXG4gICAgICAgICAgICAgIG5vZGU6IHNlY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY3VycmVudFBoYXNlT3JkZXIgPSBhYWFQaGFzZU9yZGVyW3NlY3Rpb24ucGhhc2VdO1xuICAgICAgICAgIGlmIChjdXJyZW50UGhhc2VPcmRlciA8IGxhc3RQaGFzZU9yZGVyKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgIGRhdGE6IHsgc2VjdGlvbjogc2VjdGlvbi5waGFzZSB9LFxuICAgICAgICAgICAgICBtZXNzYWdlSWQ6IFwiaW52YWxpZE9yZGVyXCIsXG4gICAgICAgICAgICAgIG5vZGU6IHNlY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxhc3RQaGFzZU9yZGVyID0gTWF0aC5tYXgobGFzdFBoYXNlT3JkZXIsIGN1cnJlbnRQaGFzZU9yZGVyKTtcbiAgICAgICAgICBzZWVuUGhhc2VzLmFkZChzZWN0aW9uLnBoYXNlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9IHNhdGlzZmllcyBSdWxlLlJ1bGVMaXN0ZW5lcjtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IGNyZWF0ZVJ1bGVEb2N1bWVudGF0aW9uKFxuICAgICAgXCJlbmZvcmNlLWFhYS1zdHJ1Y3R1cmVcIixcbiAgICAgIFwiUmVxdWlyZSBBQUEgc2VjdGlvbnMgdG8gYXBwZWFyIG9uY2UgYW5kIGluIEFycmFuZ2UsIEFjdCwgQXNzZXJ0IG9yZGVyLlwiLFxuICAgICksXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIGR1cGxpY2F0ZVNlY3Rpb246XG4gICAgICAgIFwiVXNlIHRoZSAvLyB7e3NlY3Rpb259fSBzZWN0aW9uIGNvbW1lbnQgb25seSBvbmNlIHBlciB0ZXN0LlwiLFxuICAgICAgaW52YWxpZE9yZGVyOlxuICAgICAgICBcIk1vdmUgdGhlIC8vIHt7c2VjdGlvbn19IHNlY3Rpb24gY29tbWVudCBzbyBBQUEgcGhhc2VzIHN0YXkgaW4gQXJyYW5nZSwgQWN0LCBBc3NlcnQgb3JkZXIuXCIsXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICAgIHR5cGU6IFwicHJvYmxlbVwiLFxuICB9LFxufTtcblxuZXhwb3J0IHsgZW5mb3JjZUFhYVN0cnVjdHVyZVJ1bGUgfTtcbiJdfQ==
@@ -0,0 +1,9 @@
1
+ export { assertActualExpectedNamesRule } from "./assert-actual-expected-names";
2
+ export { enforceAaaPhasePurityRule } from "./enforce-aaa-phase-purity";
3
+ export { enforceAaaStructureRule } from "./enforce-aaa-structure";
4
+ export { preferViMockedImportRule } from "./prefer-vi-mocked-import";
5
+ export { requireAaaSectionsRule } from "./require-aaa-sections";
6
+ export { requireActResultCaptureRule } from "./require-act-result-capture";
7
+ export { requireTestCompanionRule } from "./require-test-companion";
8
+ export { singleActStatementRule } from "./single-act-statement";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { assertActualExpectedNamesRule } from "./assert-actual-expected-names";
2
+ export { enforceAaaPhasePurityRule } from "./enforce-aaa-phase-purity";
3
+ export { enforceAaaStructureRule } from "./enforce-aaa-structure";
4
+ export { preferViMockedImportRule } from "./prefer-vi-mocked-import";
5
+ export { requireAaaSectionsRule } from "./require-aaa-sections";
6
+ export { requireActResultCaptureRule } from "./require-act-result-capture";
7
+ export { requireTestCompanionRule } from "./require-test-companion";
8
+ export { singleActStatementRule } from "./single-act-statement";
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGFzc2VydEFjdHVhbEV4cGVjdGVkTmFtZXNSdWxlIH0gZnJvbSBcIi4vYXNzZXJ0LWFjdHVhbC1leHBlY3RlZC1uYW1lc1wiO1xuZXhwb3J0IHsgZW5mb3JjZUFhYVBoYXNlUHVyaXR5UnVsZSB9IGZyb20gXCIuL2VuZm9yY2UtYWFhLXBoYXNlLXB1cml0eVwiO1xuZXhwb3J0IHsgZW5mb3JjZUFhYVN0cnVjdHVyZVJ1bGUgfSBmcm9tIFwiLi9lbmZvcmNlLWFhYS1zdHJ1Y3R1cmVcIjtcbmV4cG9ydCB7IHByZWZlclZpTW9ja2VkSW1wb3J0UnVsZSB9IGZyb20gXCIuL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0XCI7XG5leHBvcnQgeyByZXF1aXJlQWFhU2VjdGlvbnNSdWxlIH0gZnJvbSBcIi4vcmVxdWlyZS1hYWEtc2VjdGlvbnNcIjtcbmV4cG9ydCB7IHJlcXVpcmVBY3RSZXN1bHRDYXB0dXJlUnVsZSB9IGZyb20gXCIuL3JlcXVpcmUtYWN0LXJlc3VsdC1jYXB0dXJlXCI7XG5leHBvcnQgeyByZXF1aXJlVGVzdENvbXBhbmlvblJ1bGUgfSBmcm9tIFwiLi9yZXF1aXJlLXRlc3QtY29tcGFuaW9uXCI7XG5leHBvcnQgeyBzaW5nbGVBY3RTdGF0ZW1lbnRSdWxlIH0gZnJvbSBcIi4vc2luZ2xlLWFjdC1zdGF0ZW1lbnRcIjtcbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import type { Rule } from "eslint";
2
+ import type { RuleMatch } from "./types";
3
+ /**
4
+ * Builds all autofix operations for a single match.
5
+ * @param match Autofix context produced by the matcher.
6
+ * @param fixer ESLint fixer.
7
+ * @returns Combined fix list.
8
+ * @example
9
+ * ```typescript
10
+ * const fixes = buildFix({} as never, {} as never);
11
+ * void fixes;
12
+ * ```
13
+ */
14
+ declare function buildFix(match: RuleMatch, fixer: Rule.RuleFixer): Rule.Fix[];
15
+ export { buildFix };
16
+ //# sourceMappingURL=fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/fix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAqCzC;;;;;;;;;;GAUG;AACH,iBAAS,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAQrE;AAiPD,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Builds fixes that inline declaration initializers into factory properties.
3
+ * @param match Autofix context produced by the matcher.
4
+ * @param fixer ESLint fixer.
5
+ * @returns Binding-related fixes.
6
+ * @example
7
+ * ```typescript
8
+ * const fixes = buildBindingFixes({} as never, {} as never);
9
+ * void fixes;
10
+ * ```
11
+ */
12
+ function buildBindingFixes(match, fixer) {
13
+ return match.bindings.flatMap((binding) => {
14
+ const declaration = match.declarations.get(binding.localName);
15
+ if (declaration === void 0) {
16
+ return [];
17
+ }
18
+ const initializerText = match.sourceText.slice(declaration.initializerRange[0], declaration.initializerRange[1]);
19
+ return [
20
+ fixer.replaceTextRange(binding.propertyRange, `${binding.exportedName}: ${initializerText}`),
21
+ ];
22
+ });
23
+ }
24
+ /**
25
+ * Builds all autofix operations for a single match.
26
+ * @param match Autofix context produced by the matcher.
27
+ * @param fixer ESLint fixer.
28
+ * @returns Combined fix list.
29
+ * @example
30
+ * ```typescript
31
+ * const fixes = buildFix({} as never, {} as never);
32
+ * void fixes;
33
+ * ```
34
+ */
35
+ function buildFix(match, fixer) {
36
+ return [
37
+ ...buildBindingFixes(match, fixer),
38
+ ...buildMemberRewriteFixes(match, fixer),
39
+ ...buildMockSpecifierFixes(match, fixer),
40
+ ...buildImportFixes(match, fixer),
41
+ ...buildRemovalFixes(match, fixer),
42
+ ];
43
+ }
44
+ /**
45
+ * Builds fixes for adding or updating imports.
46
+ * @param match Autofix context produced by the matcher.
47
+ * @param fixer ESLint fixer.
48
+ * @returns A fix list that keeps import declarations consistent.
49
+ * @example
50
+ * ```typescript
51
+ * const fixes = buildImportFixes({} as never, {} as never);
52
+ * void fixes;
53
+ * ```
54
+ */
55
+ function buildImportFixes(match, fixer) {
56
+ const { names } = match.importPlan;
57
+ if (names.length === 0) {
58
+ return [];
59
+ }
60
+ const sortedNames = [...names].toSorted();
61
+ const updateFix = buildImportUpdateFix(match, sortedNames, fixer);
62
+ return updateFix === void 0
63
+ ? buildImportInsertFixes(match, sortedNames, fixer)
64
+ : [updateFix];
65
+ }
66
+ /**
67
+ * Builds import insertion fixes when no compatible import exists.
68
+ * @param match Autofix context produced by the matcher.
69
+ * @param sortedNames Sorted names that must be imported.
70
+ * @param fixer ESLint fixer.
71
+ * @returns Fixes that insert a new import declaration.
72
+ * @example
73
+ * ```typescript
74
+ * const fixes = buildImportInsertFixes({ importPlan: { moduleSpecifier: "./x", names: [] }, newline: "\n" } as never, [], {} as never);
75
+ * void fixes;
76
+ * ```
77
+ */
78
+ function buildImportInsertFixes(match, sortedNames, fixer) {
79
+ const statementText = buildImportStatement(match.importPlan.moduleSpecifier, void 0, sortedNames);
80
+ const { afterRange } = match.importPlan.insert ?? {};
81
+ return afterRange === void 0
82
+ ? [
83
+ fixer.insertTextBeforeRange([0, 0], `${statementText}${match.newline}${match.newline}`),
84
+ ]
85
+ : [
86
+ fixer.insertTextAfterRange(afterRange, `${match.newline}${statementText}`),
87
+ ];
88
+ }
89
+ /**
90
+ * Creates an import statement string from import parts.
91
+ * @param moduleSpecifier Module path used in the generated statement.
92
+ * @param defaultImportName Existing default-import local identifier, when present.
93
+ * @param names Named imports to include in braces.
94
+ * @returns Fully formatted import statement text.
95
+ * @example
96
+ * ```typescript
97
+ * const text = buildImportStatement("./x", void 0, ["a"]);
98
+ * void text;
99
+ * ```
100
+ */
101
+ function buildImportStatement(moduleSpecifier, defaultImportName, names) {
102
+ const moduleText = JSON.stringify(moduleSpecifier);
103
+ const namedText = `{ ${names.join(", ")} }`;
104
+ return defaultImportName === void 0
105
+ ? `import ${namedText} from ${moduleText};`
106
+ : `import ${defaultImportName}, ${namedText} from ${moduleText};`;
107
+ }
108
+ /**
109
+ * Builds an import update fix when an existing import is compatible.
110
+ * @param match Autofix context produced by the matcher.
111
+ * @param sortedNames Sorted names that must be imported.
112
+ * @param fixer ESLint fixer.
113
+ * @returns A single replacement fix when an import can be updated.
114
+ * @example
115
+ * ```typescript
116
+ * const fix = buildImportUpdateFix({ importPlan: { moduleSpecifier: "./x", names: [] } } as never, [], {} as never);
117
+ * void fix;
118
+ * ```
119
+ */
120
+ function buildImportUpdateFix(match, sortedNames, fixer) {
121
+ const { update } = match.importPlan;
122
+ if (update === void 0) {
123
+ return void 0;
124
+ }
125
+ const { moduleSpecifier } = match.importPlan;
126
+ const mergedNames = [
127
+ ...new Set([...sortedNames, ...update.existingNamedImports]),
128
+ ].toSorted();
129
+ const statementText = buildImportStatement(moduleSpecifier, update.defaultImportName, mergedNames);
130
+ return fixer.replaceTextRange(update.range, statementText);
131
+ }
132
+ /**
133
+ * Builds fixes for `mock*` member-expression object rewrites.
134
+ * @param match Autofix context produced by the matcher.
135
+ * @param fixer ESLint fixer.
136
+ * @returns Replacements for member-expression object identifiers.
137
+ * @example
138
+ * ```typescript
139
+ * const fixes = buildMemberRewriteFixes({} as never, {} as never);
140
+ * void fixes;
141
+ * ```
142
+ */
143
+ function buildMemberRewriteFixes(match, fixer) {
144
+ return match.memberRewrites.map((rewrite) => fixer.replaceTextRange(rewrite.localObjectRange, `vi.mocked(${rewrite.exportedName})`));
145
+ }
146
+ /**
147
+ * Builds a fix that converts literal mock specifiers to `import("...")`.
148
+ * @param match Autofix context produced by the matcher.
149
+ * @param fixer ESLint fixer.
150
+ * @returns Fixes that normalize the mock specifier argument.
151
+ * @example
152
+ * ```typescript
153
+ * const fixes = buildMockSpecifierFixes({} as never, {} as never);
154
+ * void fixes;
155
+ * ```
156
+ */
157
+ function buildMockSpecifierFixes(match, fixer) {
158
+ if (match.mockSpecifierIsImportExpression) {
159
+ return [];
160
+ }
161
+ const moduleText = JSON.stringify(match.moduleSpecifier);
162
+ return [
163
+ fixer.replaceTextRange(match.mockSpecifierRange, `import(${moduleText})`),
164
+ ];
165
+ }
166
+ /**
167
+ * Builds fixes that remove declarations after inlining.
168
+ * @param match Autofix context produced by the matcher.
169
+ * @param fixer ESLint fixer.
170
+ * @returns Fixes that remove redundant declaration statements.
171
+ * @example
172
+ * ```typescript
173
+ * const fixes = buildRemovalFixes({} as never, {} as never);
174
+ * void fixes;
175
+ * ```
176
+ */
177
+ function buildRemovalFixes(match, fixer) {
178
+ const uniqueRanges = getUniqueStatementRanges(match);
179
+ return uniqueRanges.map((statementRange) => {
180
+ const expandedRange = extendRangeToLineBreak(match.sourceText, statementRange);
181
+ return fixer.removeRange(expandedRange);
182
+ });
183
+ }
184
+ /**
185
+ * Extends a statement range to include the trailing line break.
186
+ * @param sourceText Full file content for newline lookup.
187
+ * @param statementRange Start/end offsets for the statement.
188
+ * @returns Statement range extended through the trailing line break.
189
+ * @example
190
+ * ```typescript
191
+ * const range = extendRangeToLineBreak("a\n", [0, 1]);
192
+ * void range;
193
+ * ```
194
+ */
195
+ function extendRangeToLineBreak(sourceText, statementRange) {
196
+ const [start, end] = statementRange;
197
+ const nextLineFeedIndex = sourceText.indexOf("\n", end);
198
+ return nextLineFeedIndex === -1
199
+ ? [start, sourceText.length]
200
+ : [start, nextLineFeedIndex + 1];
201
+ }
202
+ /**
203
+ * Returns sorted unique statement ranges for declarations to remove.
204
+ * @param match Autofix context produced by the matcher.
205
+ * @returns Distinct declaration statement ranges to remove.
206
+ * @example
207
+ * ```typescript
208
+ * const ranges = getUniqueStatementRanges({ bindings: [], declarations: new Map() } as never);
209
+ * void ranges;
210
+ * ```
211
+ */
212
+ function getUniqueStatementRanges(match) {
213
+ const rangeMap = new Map();
214
+ for (const binding of match.bindings) {
215
+ const declaration = match.declarations.get(binding.localName);
216
+ if (declaration !== void 0) {
217
+ const key = `${declaration.statementRange[0]}:${declaration.statementRange[1]}`;
218
+ rangeMap.set(key, declaration.statementRange);
219
+ }
220
+ }
221
+ return [...rangeMap.values()];
222
+ }
223
+ export { buildFix };
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvcHJlZmVyLXZpLW1vY2tlZC1pbXBvcnQvZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixLQUFnQixFQUNoQixLQUFxQjtJQUVyQixPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDeEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQUksV0FBVyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQzVDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFDL0IsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUNoQyxDQUFDO1FBQ0YsT0FBTztZQUNMLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsT0FBTyxDQUFDLGFBQWEsRUFDckIsR0FBRyxPQUFPLENBQUMsWUFBWSxLQUFLLGVBQWUsRUFBRSxDQUM5QztTQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxRQUFRLENBQUMsS0FBZ0IsRUFBRSxLQUFxQjtJQUN2RCxPQUFPO1FBQ0wsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ2xDLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztRQUN4QyxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDeEMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVB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LEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHR5cGUgeyBSdWxlTWF0Y2ggfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xudHlwZSBSYW5nZSA9IFtudW1iZXIsIG51bWJlcl07XG5cbi8qKlxuICogQnVpbGRzIGZpeGVzIHRoYXQgaW5saW5lIGRlY2xhcmF0aW9uIGluaXRpYWxpemVycyBpbnRvIGZhY3RvcnkgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtYXRjaCBBdXRvZml4IGNvbnRleHQgcHJvZHVjZWQgYnkgdGhlIG1hdGNoZXIuXG4gKiBAcGFyYW0gZml4ZXIgRVNMaW50IGZpeGVyLlxuICogQHJldHVybnMgQmluZGluZy1yZWxhdGVkIGZpeGVzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRCaW5kaW5nRml4ZXMoe30gYXMgbmV2ZXIsIHt9IGFzIG5ldmVyKTtcbiAqIHZvaWQgZml4ZXM7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYnVpbGRCaW5kaW5nRml4ZXMoXG4gIG1hdGNoOiBSdWxlTWF0Y2gsXG4gIGZpeGVyOiBSdWxlLlJ1bGVGaXhlcixcbik6IFJ1bGUuRml4W10ge1xuICByZXR1cm4gbWF0Y2guYmluZGluZ3MuZmxhdE1hcCgoYmluZGluZykgPT4ge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gbWF0Y2guZGVjbGFyYXRpb25zLmdldChiaW5kaW5nLmxvY2FsTmFtZSk7XG4gICAgaWYgKGRlY2xhcmF0aW9uID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgaW5pdGlhbGl6ZXJUZXh0ID0gbWF0Y2guc291cmNlVGV4dC5zbGljZShcbiAgICAgIGRlY2xhcmF0aW9uLmluaXRpYWxpemVyUmFuZ2VbMF0sXG4gICAgICBkZWNsYXJhdGlvbi5pbml0aWFsaXplclJhbmdlWzFdLFxuICAgICk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UoXG4gICAgICAgIGJpbmRpbmcucHJvcGVydHlSYW5nZSxcbiAgICAgICAgYCR7YmluZGluZy5leHBvcnRlZE5hbWV9OiAke2luaXRpYWxpemVyVGV4dH1gLFxuICAgICAgKSxcbiAgICBdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYWxsIGF1dG9maXggb3BlcmF0aW9ucyBmb3IgYSBzaW5nbGUgbWF0Y2guXG4gKiBAcGFyYW0gbWF0Y2ggQXV0b2ZpeCBjb250ZXh0IHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxuICogQHBhcmFtIGZpeGVyIEVTTGludCBmaXhlci5cbiAqIEByZXR1cm5zIENvbWJpbmVkIGZpeCBsaXN0LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRGaXgoe30gYXMgbmV2ZXIsIHt9IGFzIG5ldmVyKTtcbiAqIHZvaWQgZml4ZXM7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYnVpbGRGaXgobWF0Y2g6IFJ1bGVNYXRjaCwgZml4ZXI6IFJ1bGUuUnVsZUZpeGVyKTogUnVsZS5GaXhbXSB7XG4gIHJldHVybiBbXG4gICAgLi4uYnVpbGRCaW5kaW5nRml4ZXMobWF0Y2gsIGZpeGVyKSxcbiAgICAuLi5idWlsZE1lbWJlclJld3JpdGVGaXhlcyhtYXRjaCwgZml4ZXIpLFxuICAgIC4uLmJ1aWxkTW9ja1NwZWNpZmllckZpeGVzKG1hdGNoLCBmaXhlciksXG4gICAgLi4uYnVpbGRJbXBvcnRGaXhlcyhtYXRjaCwgZml4ZXIpLFxuICAgIC4uLmJ1aWxkUmVtb3ZhbEZpeGVzKG1hdGNoLCBmaXhlciksXG4gIF07XG59XG5cbi8qKlxuICogQnVpbGRzIGZpeGVzIGZvciBhZGRpbmcgb3IgdXBkYXRpbmcgaW1wb3J0cy5cbiAqIEBwYXJhbSBtYXRjaCBBdXRvZml4IGNvbnRleHQgcHJvZHVjZWQgYnkgdGhlIG1hdGNoZXIuXG4gKiBAcGFyYW0gZml4ZXIgRVNMaW50IGZpeGVyLlxuICogQHJldHVybnMgQSBmaXggbGlzdCB0aGF0IGtlZXBzIGltcG9ydCBkZWNsYXJhdGlvbnMgY29uc2lzdGVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaXhlcyA9IGJ1aWxkSW1wb3J0Rml4ZXMoe30gYXMgbmV2ZXIsIHt9IGFzIG5ldmVyKTtcbiAqIHZvaWQgZml4ZXM7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYnVpbGRJbXBvcnRGaXhlcyhtYXRjaDogUnVsZU1hdGNoLCBmaXhlcjogUnVsZS5SdWxlRml4ZXIpOiBSdWxlLkZpeFtdIHtcbiAgY29uc3QgeyBuYW1lcyB9ID0gbWF0Y2guaW1wb3J0UGxhbjtcbiAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHNvcnRlZE5hbWVzID0gWy4uLm5hbWVzXS50b1NvcnRlZCgpO1xuICBjb25zdCB1cGRhdGVGaXggPSBidWlsZEltcG9ydFVwZGF0ZUZpeChtYXRjaCwgc29ydGVkTmFtZXMsIGZpeGVyKTtcbiAgcmV0dXJuIHVwZGF0ZUZpeCA9PT0gdm9pZCAwXG4gICAgPyBidWlsZEltcG9ydEluc2VydEZpeGVzKG1hdGNoLCBzb3J0ZWROYW1lcywgZml4ZXIpXG4gICAgOiBbdXBkYXRlRml4XTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgaW1wb3J0IGluc2VydGlvbiBmaXhlcyB3aGVuIG5vIGNvbXBhdGlibGUgaW1wb3J0IGV4aXN0cy5cbiAqIEBwYXJhbSBtYXRjaCBBdXRvZml4IGNvbnRleHQgcHJvZHVjZWQgYnkgdGhlIG1hdGNoZXIuXG4gKiBAcGFyYW0gc29ydGVkTmFtZXMgU29ydGVkIG5hbWVzIHRoYXQgbXVzdCBiZSBpbXBvcnRlZC5cbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXG4gKiBAcmV0dXJucyBGaXhlcyB0aGF0IGluc2VydCBhIG5ldyBpbXBvcnQgZGVjbGFyYXRpb24uXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZml4ZXMgPSBidWlsZEltcG9ydEluc2VydEZpeGVzKHsgaW1wb3J0UGxhbjogeyBtb2R1bGVTcGVjaWZpZXI6IFwiLi94XCIsIG5hbWVzOiBbXSB9LCBuZXdsaW5lOiBcIlxcblwiIH0gYXMgbmV2ZXIsIFtdLCB7fSBhcyBuZXZlcik7XG4gKiB2b2lkIGZpeGVzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW1wb3J0SW5zZXJ0Rml4ZXMoXG4gIG1hdGNoOiBSdWxlTWF0Y2gsXG4gIHNvcnRlZE5hbWVzOiBzdHJpbmdbXSxcbiAgZml4ZXI6IFJ1bGUuUnVsZUZpeGVyLFxuKTogUnVsZS5GaXhbXSB7XG4gIGNvbnN0IHN0YXRlbWVudFRleHQgPSBidWlsZEltcG9ydFN0YXRlbWVudChcbiAgICBtYXRjaC5pbXBvcnRQbGFuLm1vZHVsZVNwZWNpZmllcixcbiAgICB2b2lkIDAsXG4gICAgc29ydGVkTmFtZXMsXG4gICk7XG4gIGNvbnN0IHsgYWZ0ZXJSYW5nZSB9ID0gbWF0Y2guaW1wb3J0UGxhbi5pbnNlcnQgPz8ge307XG5cbiAgcmV0dXJuIGFmdGVyUmFuZ2UgPT09IHZvaWQgMFxuICAgID8gW1xuICAgICAgICBmaXhlci5pbnNlcnRUZXh0QmVmb3JlUmFuZ2UoXG4gICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgIGAke3N0YXRlbWVudFRleHR9JHttYXRjaC5uZXdsaW5lfSR7bWF0Y2gubmV3bGluZX1gLFxuICAgICAgICApLFxuICAgICAgXVxuICAgIDogW1xuICAgICAgICBmaXhlci5pbnNlcnRUZXh0QWZ0ZXJSYW5nZShcbiAgICAgICAgICBhZnRlclJhbmdlLFxuICAgICAgICAgIGAke21hdGNoLm5ld2xpbmV9JHtzdGF0ZW1lbnRUZXh0fWAsXG4gICAgICAgICksXG4gICAgICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW1wb3J0IHN0YXRlbWVudCBzdHJpbmcgZnJvbSBpbXBvcnQgcGFydHMuXG4gKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyIE1vZHVsZSBwYXRoIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0gZGVmYXVsdEltcG9ydE5hbWUgRXhpc3RpbmcgZGVmYXVsdC1pbXBvcnQgbG9jYWwgaWRlbnRpZmllciwgd2hlbiBwcmVzZW50LlxuICogQHBhcmFtIG5hbWVzIE5hbWVkIGltcG9ydHMgdG8gaW5jbHVkZSBpbiBicmFjZXMuXG4gKiBAcmV0dXJucyBGdWxseSBmb3JtYXR0ZWQgaW1wb3J0IHN0YXRlbWVudCB0ZXh0LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHRleHQgPSBidWlsZEltcG9ydFN0YXRlbWVudChcIi4veFwiLCB2b2lkIDAsIFtcImFcIl0pO1xuICogdm9pZCB0ZXh0O1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW1wb3J0U3RhdGVtZW50KFxuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyxcbiAgZGVmYXVsdEltcG9ydE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kdWxlVGV4dCA9IEpTT04uc3RyaW5naWZ5KG1vZHVsZVNwZWNpZmllcik7XG4gIGNvbnN0IG5hbWVkVGV4dCA9IGB7ICR7bmFtZXMuam9pbihcIiwgXCIpfSB9YDtcbiAgcmV0dXJuIGRlZmF1bHRJbXBvcnROYW1lID09PSB2b2lkIDBcbiAgICA/IGBpbXBvcnQgJHtuYW1lZFRleHR9IGZyb20gJHttb2R1bGVUZXh0fTtgXG4gICAgOiBgaW1wb3J0ICR7ZGVmYXVsdEltcG9ydE5hbWV9LCAke25hbWVkVGV4dH0gZnJvbSAke21vZHVsZVRleHR9O2A7XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIGltcG9ydCB1cGRhdGUgZml4IHdoZW4gYW4gZXhpc3RpbmcgaW1wb3J0IGlzIGNvbXBhdGlibGUuXG4gKiBAcGFyYW0gbWF0Y2ggQXV0b2ZpeCBjb250ZXh0IHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxuICogQHBhcmFtIHNvcnRlZE5hbWVzIFNvcnRlZCBuYW1lcyB0aGF0IG11c3QgYmUgaW1wb3J0ZWQuXG4gKiBAcGFyYW0gZml4ZXIgRVNMaW50IGZpeGVyLlxuICogQHJldHVybnMgQSBzaW5nbGUgcmVwbGFjZW1lbnQgZml4IHdoZW4gYW4gaW1wb3J0IGNhbiBiZSB1cGRhdGVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpeCA9IGJ1aWxkSW1wb3J0VXBkYXRlRml4KHsgaW1wb3J0UGxhbjogeyBtb2R1bGVTcGVjaWZpZXI6IFwiLi94XCIsIG5hbWVzOiBbXSB9IH0gYXMgbmV2ZXIsIFtdLCB7fSBhcyBuZXZlcik7XG4gKiB2b2lkIGZpeDtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBidWlsZEltcG9ydFVwZGF0ZUZpeChcbiAgbWF0Y2g6IFJ1bGVNYXRjaCxcbiAgc29ydGVkTmFtZXM6IHN0cmluZ1tdLFxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXG4pOiBSdWxlLkZpeCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgdXBkYXRlIH0gPSBtYXRjaC5pbXBvcnRQbGFuO1xuICBpZiAodXBkYXRlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgeyBtb2R1bGVTcGVjaWZpZXIgfSA9IG1hdGNoLmltcG9ydFBsYW47XG4gIGNvbnN0IG1lcmdlZE5hbWVzID0gW1xuICAgIC4uLm5ldyBTZXQoWy4uLnNvcnRlZE5hbWVzLCAuLi51cGRhdGUuZXhpc3RpbmdOYW1lZEltcG9ydHNdKSxcbiAgXS50b1NvcnRlZCgpO1xuICBjb25zdCBzdGF0ZW1lbnRUZXh0ID0gYnVpbGRJbXBvcnRTdGF0ZW1lbnQoXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHVwZGF0ZS5kZWZhdWx0SW1wb3J0TmFtZSxcbiAgICBtZXJnZWROYW1lcyxcbiAgKTtcbiAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UodXBkYXRlLnJhbmdlLCBzdGF0ZW1lbnRUZXh0KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgZml4ZXMgZm9yIGBtb2NrKmAgbWVtYmVyLWV4cHJlc3Npb24gb2JqZWN0IHJld3JpdGVzLlxuICogQHBhcmFtIG1hdGNoIEF1dG9maXggY29udGV4dCBwcm9kdWNlZCBieSB0aGUgbWF0Y2hlci5cbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXG4gKiBAcmV0dXJucyBSZXBsYWNlbWVudHMgZm9yIG1lbWJlci1leHByZXNzaW9uIG9iamVjdCBpZGVudGlmaWVycy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaXhlcyA9IGJ1aWxkTWVtYmVyUmV3cml0ZUZpeGVzKHt9IGFzIG5ldmVyLCB7fSBhcyBuZXZlcik7XG4gKiB2b2lkIGZpeGVzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVyUmV3cml0ZUZpeGVzKFxuICBtYXRjaDogUnVsZU1hdGNoLFxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXG4pOiBSdWxlLkZpeFtdIHtcbiAgcmV0dXJuIG1hdGNoLm1lbWJlclJld3JpdGVzLm1hcCgocmV3cml0ZSkgPT5cbiAgICBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKFxuICAgICAgcmV3cml0ZS5sb2NhbE9iamVjdFJhbmdlLFxuICAgICAgYHZpLm1vY2tlZCgke3Jld3JpdGUuZXhwb3J0ZWROYW1lfSlgLFxuICAgICksXG4gICk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZml4IHRoYXQgY29udmVydHMgbGl0ZXJhbCBtb2NrIHNwZWNpZmllcnMgdG8gYGltcG9ydChcIi4uLlwiKWAuXG4gKiBAcGFyYW0gbWF0Y2ggQXV0b2ZpeCBjb250ZXh0IHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxuICogQHBhcmFtIGZpeGVyIEVTTGludCBmaXhlci5cbiAqIEByZXR1cm5zIEZpeGVzIHRoYXQgbm9ybWFsaXplIHRoZSBtb2NrIHNwZWNpZmllciBhcmd1bWVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaXhlcyA9IGJ1aWxkTW9ja1NwZWNpZmllckZpeGVzKHt9IGFzIG5ldmVyLCB7fSBhcyBuZXZlcik7XG4gKiB2b2lkIGZpeGVzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTW9ja1NwZWNpZmllckZpeGVzKFxuICBtYXRjaDogUnVsZU1hdGNoLFxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXG4pOiBSdWxlLkZpeFtdIHtcbiAgaWYgKG1hdGNoLm1vY2tTcGVjaWZpZXJJc0ltcG9ydEV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtb2R1bGVUZXh0ID0gSlNPTi5zdHJpbmdpZnkobWF0Y2gubW9kdWxlU3BlY2lmaWVyKTtcbiAgcmV0dXJuIFtcbiAgICBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKG1hdGNoLm1vY2tTcGVjaWZpZXJSYW5nZSwgYGltcG9ydCgke21vZHVsZVRleHR9KWApLFxuICBdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBmaXhlcyB0aGF0IHJlbW92ZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgaW5saW5pbmcuXG4gKiBAcGFyYW0gbWF0Y2ggQXV0b2ZpeCBjb250ZXh0IHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxuICogQHBhcmFtIGZpeGVyIEVTTGludCBmaXhlci5cbiAqIEByZXR1cm5zIEZpeGVzIHRoYXQgcmVtb3ZlIHJlZHVuZGFudCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRSZW1vdmFsRml4ZXMoe30gYXMgbmV2ZXIsIHt9IGFzIG5ldmVyKTtcbiAqIHZvaWQgZml4ZXM7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYnVpbGRSZW1vdmFsRml4ZXMoXG4gIG1hdGNoOiBSdWxlTWF0Y2gsXG4gIGZpeGVyOiBSdWxlLlJ1bGVGaXhlcixcbik6IFJ1bGUuRml4W10ge1xuICBjb25zdCB1bmlxdWVSYW5nZXMgPSBnZXRVbmlxdWVTdGF0ZW1lbnRSYW5nZXMobWF0Y2gpO1xuICByZXR1cm4gdW5pcXVlUmFuZ2VzLm1hcCgoc3RhdGVtZW50UmFuZ2UpID0+IHtcbiAgICBjb25zdCBleHBhbmRlZFJhbmdlID0gZXh0ZW5kUmFuZ2VUb0xpbmVCcmVhayhcbiAgICAgIG1hdGNoLnNvdXJjZVRleHQsXG4gICAgICBzdGF0ZW1lbnRSYW5nZSxcbiAgICApO1xuICAgIHJldHVybiBmaXhlci5yZW1vdmVSYW5nZShleHBhbmRlZFJhbmdlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBhIHN0YXRlbWVudCByYW5nZSB0byBpbmNsdWRlIHRoZSB0cmFpbGluZyBsaW5lIGJyZWFrLlxuICogQHBhcmFtIHNvdXJjZVRleHQgRnVsbCBmaWxlIGNvbnRlbnQgZm9yIG5ld2xpbmUgbG9va3VwLlxuICogQHBhcmFtIHN0YXRlbWVudFJhbmdlIFN0YXJ0L2VuZCBvZmZzZXRzIGZvciB0aGUgc3RhdGVtZW50LlxuICogQHJldHVybnMgU3RhdGVtZW50IHJhbmdlIGV4dGVuZGVkIHRocm91Z2ggdGhlIHRyYWlsaW5nIGxpbmUgYnJlYWsuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmFuZ2UgPSBleHRlbmRSYW5nZVRvTGluZUJyZWFrKFwiYVxcblwiLCBbMCwgMV0pO1xuICogdm9pZCByYW5nZTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBleHRlbmRSYW5nZVRvTGluZUJyZWFrKFxuICBzb3VyY2VUZXh0OiBzdHJpbmcsXG4gIHN0YXRlbWVudFJhbmdlOiBSYW5nZSxcbik6IFJhbmdlIHtcbiAgY29uc3QgW3N0YXJ0LCBlbmRdID0gc3RhdGVtZW50UmFuZ2U7XG4gIGNvbnN0IG5leHRMaW5lRmVlZEluZGV4ID0gc291cmNlVGV4dC5pbmRleE9mKFwiXFxuXCIsIGVuZCk7XG4gIHJldHVybiBuZXh0TGluZUZlZWRJbmRleCA9PT0gLTFcbiAgICA/IFtzdGFydCwgc291cmNlVGV4dC5sZW5ndGhdXG4gICAgOiBbc3RhcnQsIG5leHRMaW5lRmVlZEluZGV4ICsgMV07XG59XG5cbi8qKlxuICogUmV0dXJucyBzb3J0ZWQgdW5pcXVlIHN0YXRlbWVudCByYW5nZXMgZm9yIGRlY2xhcmF0aW9ucyB0byByZW1vdmUuXG4gKiBAcGFyYW0gbWF0Y2ggQXV0b2ZpeCBjb250ZXh0IHByb2R1Y2VkIGJ5IHRoZSBtYXRjaGVyLlxuICogQHJldHVybnMgRGlzdGluY3QgZGVjbGFyYXRpb24gc3RhdGVtZW50IHJhbmdlcyB0byByZW1vdmUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmFuZ2VzID0gZ2V0VW5pcXVlU3RhdGVtZW50UmFuZ2VzKHsgYmluZGluZ3M6IFtdLCBkZWNsYXJhdGlvbnM6IG5ldyBNYXAoKSB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgcmFuZ2VzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldFVuaXF1ZVN0YXRlbWVudFJhbmdlcyhtYXRjaDogUnVsZU1hdGNoKTogUmFuZ2VbXSB7XG4gIGNvbnN0IHJhbmdlTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJhbmdlPigpO1xuICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgbWF0Y2guYmluZGluZ3MpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IG1hdGNoLmRlY2xhcmF0aW9ucy5nZXQoYmluZGluZy5sb2NhbE5hbWUpO1xuICAgIGlmIChkZWNsYXJhdGlvbiAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtkZWNsYXJhdGlvbi5zdGF0ZW1lbnRSYW5nZVswXX06JHtkZWNsYXJhdGlvbi5zdGF0ZW1lbnRSYW5nZVsxXX1gO1xuICAgICAgcmFuZ2VNYXAuc2V0KGtleSwgZGVjbGFyYXRpb24uc3RhdGVtZW50UmFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ucmFuZ2VNYXAudmFsdWVzKCldO1xufVxuXG5leHBvcnQgeyBidWlsZEZpeCB9O1xuIl19
@@ -0,0 +1,2 @@
1
+ export { preferViMockedImportRule } from "./rule";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { preferViMockedImportRule } from "./rule";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9wcmVmZXItdmktbW9ja2VkLWltcG9ydC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBwcmVmZXJWaU1vY2tlZEltcG9ydFJ1bGUgfSBmcm9tIFwiLi9ydWxlXCI7XG4iXX0=