@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,119 @@
1
+ import { hasRange } from "./match-helpers";
2
+ import { walkNode } from "./match-walk";
3
+ /**
4
+ * Adds declaration identifier range to the allowed set.
5
+ * @param allowedRanges Allowed range set.
6
+ * @param declaration Declaration to include.
7
+ * @example
8
+ * ```typescript
9
+ * const allowed = new Set<string>();
10
+ * addDeclarationIdRange(allowed, void 0);
11
+ * ```
12
+ */
13
+ function addDeclarationIdRange(allowedRanges, declaration) {
14
+ if (declaration !== void 0) {
15
+ const rangeKey = `${declaration.declarationIdRange[0]}:${declaration.declarationIdRange[1]}`;
16
+ allowedRanges.add(rangeKey);
17
+ }
18
+ }
19
+ /**
20
+ * Returns false if a binding local is used outside allowed rewrite sites.
21
+ * @param program Program node containing mock usage.
22
+ * @param allowedIdentifierRanges Identifier ranges that are safe to rewrite.
23
+ * @param localNames Local names tracked by the matcher.
24
+ * @returns True when all local usages are safe.
25
+ * @example
26
+ * ```typescript
27
+ * const safe = areLocalsSafeToInline({ body: [], sourceType: "module", type: "Program" } as never, new Set(), new Set());
28
+ * void safe;
29
+ * ```
30
+ */
31
+ function areLocalsSafeToInline(program, allowedIdentifierRanges, localNames) {
32
+ let isSafe = true;
33
+ walkNode(program, (currentNode) => {
34
+ if (!isSafe ||
35
+ currentNode.type !== "Identifier" ||
36
+ !hasRange(currentNode)) {
37
+ return;
38
+ }
39
+ const key = `${currentNode.range[0]}:${currentNode.range[1]}`;
40
+ if (localNames.has(currentNode.name) && !allowedIdentifierRanges.has(key)) {
41
+ isSafe = false;
42
+ }
43
+ });
44
+ return isSafe;
45
+ }
46
+ /**
47
+ * Builds a set of allowed identifier ranges for safe-inline validation.
48
+ * @param bindings Bindings list.
49
+ * @param declarations Declarations map.
50
+ * @param rewrites Member rewrites.
51
+ * @returns Allowed identifier range keys.
52
+ * @example
53
+ * ```typescript
54
+ * const ranges = buildAllowedRanges([], new Map(), []);
55
+ * void ranges;
56
+ * ```
57
+ */
58
+ function buildAllowedRanges(bindings, declarations, rewrites) {
59
+ const allowedRanges = new Set();
60
+ for (const binding of bindings) {
61
+ allowedRanges.add(`${binding.propertyKeyRange[0]}:${binding.propertyKeyRange[1]}`);
62
+ allowedRanges.add(`${binding.propertyValueRange[0]}:${binding.propertyValueRange[1]}`);
63
+ addDeclarationIdRange(allowedRanges, declarations.get(binding.localName));
64
+ }
65
+ for (const rewrite of rewrites) {
66
+ allowedRanges.add(`${rewrite.localObjectRange[0]}:${rewrite.localObjectRange[1]}`);
67
+ }
68
+ return allowedRanges;
69
+ }
70
+ /**
71
+ * Collects member-expression object rewrites for `.mock*` calls.
72
+ * @param program Program node.
73
+ * @param localToExported Local to exported name map.
74
+ * @returns Collected member rewrites.
75
+ * @example
76
+ * ```typescript
77
+ * const rewrites = collectMemberRewrites({ body: [], sourceType: "module", type: "Program" } as never, new Map());
78
+ * void rewrites;
79
+ * ```
80
+ */
81
+ function collectMemberRewrites(program, localToExported) {
82
+ const rewrites = [];
83
+ walkNode(program, (currentNode) => {
84
+ const rewrite = toMemberRewrite(currentNode, localToExported);
85
+ if (rewrite !== void 0) {
86
+ rewrites.push(rewrite);
87
+ }
88
+ });
89
+ return rewrites;
90
+ }
91
+ /**
92
+ * Converts a node into a member rewrite when supported.
93
+ * @param currentNode Candidate node.
94
+ * @param localToExported Local to exported name map.
95
+ * @returns Member rewrite when node is supported.
96
+ * @example
97
+ * ```typescript
98
+ * const rewrite = toMemberRewrite({ type: "Identifier", name: "x" } as never, new Map());
99
+ * void rewrite;
100
+ * ```
101
+ */
102
+ function toMemberRewrite(currentNode, localToExported) {
103
+ if (currentNode.type !== "MemberExpression") {
104
+ return void 0;
105
+ }
106
+ const { object, property } = currentNode;
107
+ if (object.type !== "Identifier" ||
108
+ !hasRange(object) ||
109
+ property.type !== "Identifier" ||
110
+ !property.name.startsWith("mock")) {
111
+ return void 0;
112
+ }
113
+ const exportedName = localToExported.get(object.name);
114
+ return exportedName === void 0
115
+ ? void 0
116
+ : { exportedName, localObjectRange: object.range };
117
+ }
118
+ export { areLocalsSafeToInline, buildAllowedRanges, collectMemberRewrites };
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtcmV3cml0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9wcmVmZXItdmktbW9ja2VkLWltcG9ydC9tYXRjaC1yZXdyaXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV4Qzs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixhQUEwQixFQUMxQixXQUFvQztJQUVwQyxJQUFJLFdBQVcsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sUUFBUSxHQUFHLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdGLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMscUJBQXFCLENBQzVCLE9BQXVCLEVBQ3ZCLHVCQUFvQyxFQUNwQyxVQUF1QjtJQUV2QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFO1FBQ2hDLElBQ0UsQ0FBQyxNQUFNO1lBQ1AsV0FBVyxDQUFDLElBQUksS0FBSyxZQUFZO1lBQ2pDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUN0QixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FB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QkFBcUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBFU1RyZWUgZnJvbSBcImVzdHJlZVwiO1xuXG5pbXBvcnQgdHlwZSB7IEJpbmRpbmcsIERlY2xhcmF0aW9uLCBNZW1iZXJSZXdyaXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgaGFzUmFuZ2UgfSBmcm9tIFwiLi9tYXRjaC1oZWxwZXJzXCI7XG5pbXBvcnQgeyB3YWxrTm9kZSB9IGZyb20gXCIuL21hdGNoLXdhbGtcIjtcblxuLyoqXG4gKiBBZGRzIGRlY2xhcmF0aW9uIGlkZW50aWZpZXIgcmFuZ2UgdG8gdGhlIGFsbG93ZWQgc2V0LlxuICogQHBhcmFtIGFsbG93ZWRSYW5nZXMgQWxsb3dlZCByYW5nZSBzZXQuXG4gKiBAcGFyYW0gZGVjbGFyYXRpb24gRGVjbGFyYXRpb24gdG8gaW5jbHVkZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gKiBhZGREZWNsYXJhdGlvbklkUmFuZ2UoYWxsb3dlZCwgdm9pZCAwKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBhZGREZWNsYXJhdGlvbklkUmFuZ2UoXG4gIGFsbG93ZWRSYW5nZXM6IFNldDxzdHJpbmc+LFxuICBkZWNsYXJhdGlvbjogRGVjbGFyYXRpb24gfCB1bmRlZmluZWQsXG4pOiB2b2lkIHtcbiAgaWYgKGRlY2xhcmF0aW9uICE9PSB2b2lkIDApIHtcbiAgICBjb25zdCByYW5nZUtleSA9IGAke2RlY2xhcmF0aW9uLmRlY2xhcmF0aW9uSWRSYW5nZVswXX06JHtkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbklkUmFuZ2VbMV19YDtcbiAgICBhbGxvd2VkUmFuZ2VzLmFkZChyYW5nZUtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGZhbHNlIGlmIGEgYmluZGluZyBsb2NhbCBpcyB1c2VkIG91dHNpZGUgYWxsb3dlZCByZXdyaXRlIHNpdGVzLlxuICogQHBhcmFtIHByb2dyYW0gUHJvZ3JhbSBub2RlIGNvbnRhaW5pbmcgbW9jayB1c2FnZS5cbiAqIEBwYXJhbSBhbGxvd2VkSWRlbnRpZmllclJhbmdlcyBJZGVudGlmaWVyIHJhbmdlcyB0aGF0IGFyZSBzYWZlIHRvIHJld3JpdGUuXG4gKiBAcGFyYW0gbG9jYWxOYW1lcyBMb2NhbCBuYW1lcyB0cmFja2VkIGJ5IHRoZSBtYXRjaGVyLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGFsbCBsb2NhbCB1c2FnZXMgYXJlIHNhZmUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc2FmZSA9IGFyZUxvY2Fsc1NhZmVUb0lubGluZSh7IGJvZHk6IFtdLCBzb3VyY2VUeXBlOiBcIm1vZHVsZVwiLCB0eXBlOiBcIlByb2dyYW1cIiB9IGFzIG5ldmVyLCBuZXcgU2V0KCksIG5ldyBTZXQoKSk7XG4gKiB2b2lkIHNhZmU7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYXJlTG9jYWxzU2FmZVRvSW5saW5lKFxuICBwcm9ncmFtOiBFU1RyZWUuUHJvZ3JhbSxcbiAgYWxsb3dlZElkZW50aWZpZXJSYW5nZXM6IFNldDxzdHJpbmc+LFxuICBsb2NhbE5hbWVzOiBTZXQ8c3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBsZXQgaXNTYWZlID0gdHJ1ZTtcbiAgd2Fsa05vZGUocHJvZ3JhbSwgKGN1cnJlbnROb2RlKSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWlzU2FmZSB8fFxuICAgICAgY3VycmVudE5vZGUudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIgfHxcbiAgICAgICFoYXNSYW5nZShjdXJyZW50Tm9kZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSBgJHtjdXJyZW50Tm9kZS5yYW5nZVswXX06JHtjdXJyZW50Tm9kZS5yYW5nZVsxXX1gO1xuICAgIGlmIChsb2NhbE5hbWVzLmhhcyhjdXJyZW50Tm9kZS5uYW1lKSAmJiAhYWxsb3dlZElkZW50aWZpZXJSYW5nZXMuaGFzKGtleSkpIHtcbiAgICAgIGlzU2FmZSA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlzU2FmZTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBzZXQgb2YgYWxsb3dlZCBpZGVudGlmaWVyIHJhbmdlcyBmb3Igc2FmZS1pbmxpbmUgdmFsaWRhdGlvbi5cbiAqIEBwYXJhbSBiaW5kaW5ncyBCaW5kaW5ncyBsaXN0LlxuICogQHBhcmFtIGRlY2xhcmF0aW9ucyBEZWNsYXJhdGlvbnMgbWFwLlxuICogQHBhcmFtIHJld3JpdGVzIE1lbWJlciByZXdyaXRlcy5cbiAqIEByZXR1cm5zIEFsbG93ZWQgaWRlbnRpZmllciByYW5nZSBrZXlzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJhbmdlcyA9IGJ1aWxkQWxsb3dlZFJhbmdlcyhbXSwgbmV3IE1hcCgpLCBbXSk7XG4gKiB2b2lkIHJhbmdlcztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBidWlsZEFsbG93ZWRSYW5nZXMoXG4gIGJpbmRpbmdzOiBCaW5kaW5nW10sXG4gIGRlY2xhcmF0aW9uczogTWFwPHN0cmluZywgRGVjbGFyYXRpb24+LFxuICByZXdyaXRlczogTWVtYmVyUmV3cml0ZVtdLFxuKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBhbGxvd2VkUmFuZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgYmluZGluZyBvZiBiaW5kaW5ncykge1xuICAgIGFsbG93ZWRSYW5nZXMuYWRkKFxuICAgICAgYCR7YmluZGluZy5wcm9wZXJ0eUtleVJhbmdlWzBdfToke2JpbmRpbmcucHJvcGVydHlLZXlSYW5nZVsxXX1gLFxuICAgICk7XG4gICAgYWxsb3dlZFJhbmdlcy5hZGQoXG4gICAgICBgJHtiaW5kaW5nLnByb3BlcnR5VmFsdWVSYW5nZVswXX06JHtiaW5kaW5nLnByb3BlcnR5VmFsdWVSYW5nZVsxXX1gLFxuICAgICk7XG4gICAgYWRkRGVjbGFyYXRpb25JZFJhbmdlKGFsbG93ZWRSYW5nZXMsIGRlY2xhcmF0aW9ucy5nZXQoYmluZGluZy5sb2NhbE5hbWUpKTtcbiAgfVxuICBmb3IgKGNvbnN0IHJld3JpdGUgb2YgcmV3cml0ZXMpIHtcbiAgICBhbGxvd2VkUmFuZ2VzLmFkZChcbiAgICAgIGAke3Jld3JpdGUubG9jYWxPYmplY3RSYW5nZVswXX06JHtyZXdyaXRlLmxvY2FsT2JqZWN0UmFuZ2VbMV19YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGFsbG93ZWRSYW5nZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgbWVtYmVyLWV4cHJlc3Npb24gb2JqZWN0IHJld3JpdGVzIGZvciBgLm1vY2sqYCBjYWxscy5cbiAqIEBwYXJhbSBwcm9ncmFtIFByb2dyYW0gbm9kZS5cbiAqIEBwYXJhbSBsb2NhbFRvRXhwb3J0ZWQgTG9jYWwgdG8gZXhwb3J0ZWQgbmFtZSBtYXAuXG4gKiBAcmV0dXJucyBDb2xsZWN0ZWQgbWVtYmVyIHJld3JpdGVzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJld3JpdGVzID0gY29sbGVjdE1lbWJlclJld3JpdGVzKHsgYm9keTogW10sIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsIHR5cGU6IFwiUHJvZ3JhbVwiIH0gYXMgbmV2ZXIsIG5ldyBNYXAoKSk7XG4gKiB2b2lkIHJld3JpdGVzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RNZW1iZXJSZXdyaXRlcyhcbiAgcHJvZ3JhbTogRVNUcmVlLlByb2dyYW0sXG4gIGxvY2FsVG9FeHBvcnRlZDogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IE1lbWJlclJld3JpdGVbXSB7XG4gIGNvbnN0IHJld3JpdGVzOiBNZW1iZXJSZXdyaXRlW10gPSBbXTtcbiAgd2Fsa05vZGUocHJvZ3JhbSwgKGN1cnJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgcmV3cml0ZSA9IHRvTWVtYmVyUmV3cml0ZShjdXJyZW50Tm9kZSwgbG9jYWxUb0V4cG9ydGVkKTtcbiAgICBpZiAocmV3cml0ZSAhPT0gdm9pZCAwKSB7XG4gICAgICByZXdyaXRlcy5wdXNoKHJld3JpdGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJld3JpdGVzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbm9kZSBpbnRvIGEgbWVtYmVyIHJld3JpdGUgd2hlbiBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gY3VycmVudE5vZGUgQ2FuZGlkYXRlIG5vZGUuXG4gKiBAcGFyYW0gbG9jYWxUb0V4cG9ydGVkIExvY2FsIHRvIGV4cG9ydGVkIG5hbWUgbWFwLlxuICogQHJldHVybnMgTWVtYmVyIHJld3JpdGUgd2hlbiBub2RlIGlzIHN1cHBvcnRlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXdyaXRlID0gdG9NZW1iZXJSZXdyaXRlKHsgdHlwZTogXCJJZGVudGlmaWVyXCIsIG5hbWU6IFwieFwiIH0gYXMgbmV2ZXIsIG5ldyBNYXAoKSk7XG4gKiB2b2lkIHJld3JpdGU7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdG9NZW1iZXJSZXdyaXRlKFxuICBjdXJyZW50Tm9kZTogRVNUcmVlLk5vZGUsXG4gIGxvY2FsVG9FeHBvcnRlZDogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IE1lbWJlclJld3JpdGUgfCB1bmRlZmluZWQge1xuICBpZiAoY3VycmVudE5vZGUudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgeyBvYmplY3QsIHByb3BlcnR5IH0gPSBjdXJyZW50Tm9kZTtcbiAgaWYgKFxuICAgIG9iamVjdC50eXBlICE9PSBcIklkZW50aWZpZXJcIiB8fFxuICAgICFoYXNSYW5nZShvYmplY3QpIHx8XG4gICAgcHJvcGVydHkudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIgfHxcbiAgICAhcHJvcGVydHkubmFtZS5zdGFydHNXaXRoKFwibW9ja1wiKVxuICApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgZXhwb3J0ZWROYW1lID0gbG9jYWxUb0V4cG9ydGVkLmdldChvYmplY3QubmFtZSk7XG4gIHJldHVybiBleHBvcnRlZE5hbWUgPT09IHZvaWQgMFxuICAgID8gdm9pZCAwXG4gICAgOiB7IGV4cG9ydGVkTmFtZSwgbG9jYWxPYmplY3RSYW5nZTogb2JqZWN0LnJhbmdlIH07XG59XG5cbmV4cG9ydCB7IGFyZUxvY2Fsc1NhZmVUb0lubGluZSwgYnVpbGRBbGxvd2VkUmFuZ2VzLCBjb2xsZWN0TWVtYmVyUmV3cml0ZXMgfTtcbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import type * as ESTree from "estree";
2
+ /**
3
+ * Visits a node and all nested child nodes.
4
+ * @param node Root node to visit.
5
+ * @param visitor Callback run for each visited node.
6
+ * @example
7
+ * ```typescript
8
+ * walkNode({ type: "Program", body: [], sourceType: "module" } as never, () => {});
9
+ * ```
10
+ */
11
+ declare function walkNode(node: ESTree.Node, visitor: (currentNode: ESTree.Node) => void): void;
12
+ export { walkNode };
13
+ //# sourceMappingURL=match-walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-walk.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/match-walk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAqDtC;;;;;;;;GAQG;AACH,iBAAS,QAAQ,CACf,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,GAC1C,IAAI,CAKN;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Returns child nodes for a given AST node.
3
+ * @param node Source node.
4
+ * @returns Flattened list of child nodes.
5
+ * @example
6
+ * ```typescript
7
+ * const childNodes = getChildNodes({ type: "Program", body: [], sourceType: "module" } as never);
8
+ * void childNodes;
9
+ * ```
10
+ */
11
+ function getChildNodes(node) {
12
+ const values = Object.entries(node)
13
+ .filter(([key]) => key !== "parent")
14
+ .map(([, value]) => value);
15
+ return values.flatMap((value) => toNodeList(value));
16
+ }
17
+ /**
18
+ * Checks whether a value is an ESTree node.
19
+ * @param value Arbitrary value from node property iteration.
20
+ * @returns True when the value has node-like shape.
21
+ * @example
22
+ * ```typescript
23
+ * const ok = isNode({ type: "Identifier", name: "x" });
24
+ * void ok;
25
+ * ```
26
+ */
27
+ function isNode(value) {
28
+ return typeof value === "object" && value !== null && "type" in value;
29
+ }
30
+ /**
31
+ * Converts an unknown value into a list of AST nodes.
32
+ * @param value Arbitrary value from the AST object graph.
33
+ * @returns Node list extracted from arrays or single values.
34
+ * @example
35
+ * ```typescript
36
+ * const list = toNodeList([{ type: "Identifier", name: "x" }] as never);
37
+ * void list;
38
+ * ```
39
+ */
40
+ function toNodeList(value) {
41
+ if (Array.isArray(value)) {
42
+ return value.filter((nodeValue) => isNode(nodeValue));
43
+ }
44
+ return isNode(value) ? [value] : [];
45
+ }
46
+ /**
47
+ * Visits a node and all nested child nodes.
48
+ * @param node Root node to visit.
49
+ * @param visitor Callback run for each visited node.
50
+ * @example
51
+ * ```typescript
52
+ * walkNode({ type: "Program", body: [], sourceType: "module" } as never, () => {});
53
+ * ```
54
+ */
55
+ function walkNode(node, visitor) {
56
+ visitor(node);
57
+ for (const childNode of getChildNodes(node)) {
58
+ walkNode(childNode, visitor);
59
+ }
60
+ }
61
+ export { walkNode };
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtd2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L21hdGNoLXdhbGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxhQUFhLENBQUMsSUFBaUI7SUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUEwQyxDQUFDO1NBQ3RFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUM7U0FDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLE1BQU0sQ0FBQyxLQUFjO0lBQzVCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQztBQUN4RSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBYztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQTRCLEVBQUUsQ0FDMUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUNsQixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxRQUFRLENBQ2YsSUFBaUIsRUFDakIsT0FBMkM7SUFFM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLFNBQVMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QyxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7QUFDSCxDQUFDO0FBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBFU1RyZWUgZnJvbSBcImVzdHJlZVwiO1xuXG4vKipcbiAqIFJldHVybnMgY2hpbGQgbm9kZXMgZm9yIGEgZ2l2ZW4gQVNUIG5vZGUuXG4gKiBAcGFyYW0gbm9kZSBTb3VyY2Ugbm9kZS5cbiAqIEByZXR1cm5zIEZsYXR0ZW5lZCBsaXN0IG9mIGNoaWxkIG5vZGVzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKHsgdHlwZTogXCJQcm9ncmFtXCIsIGJvZHk6IFtdLCBzb3VyY2VUeXBlOiBcIm1vZHVsZVwiIH0gYXMgbmV2ZXIpO1xuICogdm9pZCBjaGlsZE5vZGVzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldENoaWxkTm9kZXMobm9kZTogRVNUcmVlLk5vZGUpOiBFU1RyZWUuTm9kZVtdIHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmVudHJpZXMobm9kZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09IFwicGFyZW50XCIpXG4gICAgLm1hcCgoWywgdmFsdWVdKSA9PiB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZXMuZmxhdE1hcCgodmFsdWUpID0+IHRvTm9kZUxpc3QodmFsdWUpKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGFuIEVTVHJlZSBub2RlLlxuICogQHBhcmFtIHZhbHVlIEFyYml0cmFyeSB2YWx1ZSBmcm9tIG5vZGUgcHJvcGVydHkgaXRlcmF0aW9uLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBoYXMgbm9kZS1saWtlIHNoYXBlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG9rID0gaXNOb2RlKHsgdHlwZTogXCJJZGVudGlmaWVyXCIsIG5hbWU6IFwieFwiIH0pO1xuICogdm9pZCBvaztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc05vZGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFU1RyZWUuTm9kZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgXCJ0eXBlXCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gdW5rbm93biB2YWx1ZSBpbnRvIGEgbGlzdCBvZiBBU1Qgbm9kZXMuXG4gKiBAcGFyYW0gdmFsdWUgQXJiaXRyYXJ5IHZhbHVlIGZyb20gdGhlIEFTVCBvYmplY3QgZ3JhcGguXG4gKiBAcmV0dXJucyBOb2RlIGxpc3QgZXh0cmFjdGVkIGZyb20gYXJyYXlzIG9yIHNpbmdsZSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbGlzdCA9IHRvTm9kZUxpc3QoW3sgdHlwZTogXCJJZGVudGlmaWVyXCIsIG5hbWU6IFwieFwiIH1dIGFzIG5ldmVyKTtcbiAqIHZvaWQgbGlzdDtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiB0b05vZGVMaXN0KHZhbHVlOiB1bmtub3duKTogRVNUcmVlLk5vZGVbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5maWx0ZXIoKG5vZGVWYWx1ZSk6IG5vZGVWYWx1ZSBpcyBFU1RyZWUuTm9kZSA9PlxuICAgICAgaXNOb2RlKG5vZGVWYWx1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBpc05vZGUodmFsdWUpID8gW3ZhbHVlXSA6IFtdO1xufVxuXG4vKipcbiAqIFZpc2l0cyBhIG5vZGUgYW5kIGFsbCBuZXN0ZWQgY2hpbGQgbm9kZXMuXG4gKiBAcGFyYW0gbm9kZSBSb290IG5vZGUgdG8gdmlzaXQuXG4gKiBAcGFyYW0gdmlzaXRvciBDYWxsYmFjayBydW4gZm9yIGVhY2ggdmlzaXRlZCBub2RlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHdhbGtOb2RlKHsgdHlwZTogXCJQcm9ncmFtXCIsIGJvZHk6IFtdLCBzb3VyY2VUeXBlOiBcIm1vZHVsZVwiIH0gYXMgbmV2ZXIsICgpID0+IHt9KTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiB3YWxrTm9kZShcbiAgbm9kZTogRVNUcmVlLk5vZGUsXG4gIHZpc2l0b3I6IChjdXJyZW50Tm9kZTogRVNUcmVlLk5vZGUpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgdmlzaXRvcihub2RlKTtcbiAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgZ2V0Q2hpbGROb2Rlcyhub2RlKSkge1xuICAgIHdhbGtOb2RlKGNoaWxkTm9kZSwgdmlzaXRvcik7XG4gIH1cbn1cblxuZXhwb3J0IHsgd2Fsa05vZGUgfTtcbiJdfQ==
@@ -0,0 +1,15 @@
1
+ import type { Rule } from "eslint";
2
+ import type { RuleMatch } from "./types";
3
+ /**
4
+ * Collects the first applicable rule match from the file.
5
+ * @param context Rule context.
6
+ * @returns Collected match when pattern is found.
7
+ * @example
8
+ * ```typescript
9
+ * const match = collectMatch({ sourceCode: { ast: { body: [], sourceType: "module", type: "Program" }, text: "" } } as never);
10
+ * void match;
11
+ * ```
12
+ */
13
+ declare function collectMatch(context: Rule.RuleContext): RuleMatch | undefined;
14
+ export { collectMatch };
15
+ //# sourceMappingURL=match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAwFzC;;;;;;;;;GASG;AACH,iBAAS,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,GAAG,SAAS,GAAG,SAAS,CAItE;AA6KD,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,193 @@
1
+ import { collectBindings } from "./match-bindings";
2
+ import { collectDeclarations } from "./match-declarations";
3
+ import { getFactoryReturnObject, getModuleSpecifier, getNewline, hasRange, } from "./match-helpers";
4
+ import { resolveImportPlan } from "./match-imports";
5
+ import { areLocalsSafeToInline, buildAllowedRanges, collectMemberRewrites, } from "./match-rewrites";
6
+ /**
7
+ * Builds a full rule match from seed data.
8
+ * @param context Rule context.
9
+ * @param program Program node.
10
+ * @param seed Seed data.
11
+ * @returns Rule match when safe.
12
+ * @example
13
+ * ```typescript
14
+ * const match = buildMatch({ sourceCode: { text: "" } } as never, { body: [], sourceType: "module", type: "Program" } as never, { factoryObject: { properties: [], type: "ObjectExpression" }, mockStatement: { expression: { arguments: [], type: "CallExpression" }, type: "ExpressionStatement" }, moduleSpecifier: "./x", specifierExpression: { range: [0, 1], type: "Literal", value: "./x" } as never });
15
+ * void match;
16
+ * ```
17
+ */
18
+ function buildMatch(context, program, seed) {
19
+ const declarations = collectDeclarations(program, context.sourceCode);
20
+ const bindings = collectBindings(seed.factoryObject, declarations);
21
+ if (bindings.length === 0) {
22
+ return void 0;
23
+ }
24
+ const memberRewrites = collectMemberRewrites(program, toLocalMap(bindings));
25
+ const localNames = new Set(bindings.map((binding) => binding.localName));
26
+ const allowedRanges = buildAllowedRanges(bindings, declarations, memberRewrites);
27
+ if (!areLocalsSafeToInline(program, allowedRanges, localNames)) {
28
+ return void 0;
29
+ }
30
+ return {
31
+ bindings,
32
+ declarations,
33
+ importPlan: resolveImportPlan(program, seed.moduleSpecifier, getImportNames(bindings)),
34
+ memberRewrites,
35
+ mockSpecifierIsImportExpression: seed.specifierExpression.type === "ImportExpression",
36
+ mockSpecifierRange: seed.specifierExpression.range,
37
+ moduleSpecifier: seed.moduleSpecifier,
38
+ newline: getNewline(context.sourceCode.text),
39
+ node: seed.mockStatement,
40
+ sourceText: context.sourceCode.text,
41
+ };
42
+ }
43
+ /**
44
+ * Collects the first applicable rule match from the file.
45
+ * @param context Rule context.
46
+ * @returns Collected match when pattern is found.
47
+ * @example
48
+ * ```typescript
49
+ * const match = collectMatch({ sourceCode: { ast: { body: [], sourceType: "module", type: "Program" }, text: "" } } as never);
50
+ * void match;
51
+ * ```
52
+ */
53
+ function collectMatch(context) {
54
+ const program = context.sourceCode.ast;
55
+ const seed = collectSeed(program);
56
+ return seed === void 0 ? void 0 : buildMatch(context, program, seed);
57
+ }
58
+ /**
59
+ * Collects seed data needed to build a full match.
60
+ * @param program Program node.
61
+ * @returns Match seed.
62
+ * @example
63
+ * ```typescript
64
+ * const seed = collectSeed({ body: [], sourceType: "module", type: "Program" } as never);
65
+ * void seed;
66
+ * ```
67
+ */
68
+ function collectSeed(program) {
69
+ const mockStatement = findMockStatement(program);
70
+ if (mockStatement === void 0) {
71
+ return void 0;
72
+ }
73
+ const { expression } = mockStatement;
74
+ if (expression.type !== "CallExpression") {
75
+ return void 0;
76
+ }
77
+ const callArguments = getMockCallArguments(expression);
78
+ if (callArguments === void 0) {
79
+ return void 0;
80
+ }
81
+ return createSeed(mockStatement, callArguments[0], callArguments[1]);
82
+ }
83
+ /**
84
+ * Creates seed data from validated call arguments.
85
+ * @param mockStatement Matched `vi.mock` statement.
86
+ * @param specifierExpression First argument expression.
87
+ * @param factoryExpression Factory callback expression.
88
+ * @returns Match seed when arguments are supported.
89
+ * @example
90
+ * ```typescript
91
+ * const seed = createSeed({ expression: { arguments: [], type: "CallExpression" }, type: "ExpressionStatement" } as never, { type: "Literal", value: "./x" } as never, { body: { properties: [], type: "ObjectExpression" }, type: "ArrowFunctionExpression" } as never);
92
+ * void seed;
93
+ * ```
94
+ */
95
+ function createSeed(mockStatement, specifierExpression, factoryExpression) {
96
+ if (!hasRange(specifierExpression)) {
97
+ return void 0;
98
+ }
99
+ const moduleSpecifier = getModuleSpecifier(specifierExpression);
100
+ const factoryObject = getFactoryReturnObject(factoryExpression);
101
+ return moduleSpecifier === void 0 || factoryObject === void 0
102
+ ? void 0
103
+ : { factoryObject, mockStatement, moduleSpecifier, specifierExpression };
104
+ }
105
+ /**
106
+ * Returns the first top-level `vi.mock` or `vi.doMock` statement.
107
+ * @param program Program node.
108
+ * @returns Matching expression statement.
109
+ * @example
110
+ * ```typescript
111
+ * const statement = findMockStatement({ body: [], sourceType: "module", type: "Program" } as never);
112
+ * void statement;
113
+ * ```
114
+ */
115
+ function findMockStatement(program) {
116
+ return program.body.find((statement) => isMockExpressionStatement(statement));
117
+ }
118
+ /**
119
+ * Returns sorted unique import names from bindings.
120
+ * @param bindings Bindings list.
121
+ * @returns Sorted import names.
122
+ * @example
123
+ * ```typescript
124
+ * const names = getImportNames([]);
125
+ * void names;
126
+ * ```
127
+ */
128
+ function getImportNames(bindings) {
129
+ return [
130
+ ...new Set(bindings.map((binding) => binding.exportedName)),
131
+ ].toSorted();
132
+ }
133
+ /**
134
+ * Returns mock call arguments when both arguments are supported expressions.
135
+ * @param expression Call expression node.
136
+ * @returns First and second call arguments.
137
+ * @example
138
+ * ```typescript
139
+ * const args = getMockCallArguments({ arguments: [], type: "CallExpression" } as never);
140
+ * void args;
141
+ * ```
142
+ */
143
+ function getMockCallArguments(expression) {
144
+ const [firstArgument, secondArgument] = expression.arguments;
145
+ if (firstArgument === void 0 || secondArgument === void 0) {
146
+ return void 0;
147
+ }
148
+ if (firstArgument.type === "SpreadElement" ||
149
+ secondArgument.type === "SpreadElement") {
150
+ return void 0;
151
+ }
152
+ return [firstArgument, secondArgument];
153
+ }
154
+ /**
155
+ * Checks whether a statement is a supported mock expression statement.
156
+ * @param statement Candidate statement.
157
+ * @returns True when statement is a supported mock call.
158
+ * @example
159
+ * ```typescript
160
+ * const ok = isMockExpressionStatement({ type: "EmptyStatement" } as never);
161
+ * void ok;
162
+ * ```
163
+ */
164
+ function isMockExpressionStatement(statement) {
165
+ if (statement.type !== "ExpressionStatement") {
166
+ return false;
167
+ }
168
+ const { expression } = statement;
169
+ if (expression.type !== "CallExpression" ||
170
+ expression.callee.type !== "MemberExpression") {
171
+ return false;
172
+ }
173
+ const { object, property } = expression.callee;
174
+ return (object.type === "Identifier" &&
175
+ object.name === "vi" &&
176
+ property.type === "Identifier" &&
177
+ (property.name === "mock" || property.name === "doMock"));
178
+ }
179
+ /**
180
+ * Creates local-to-exported mapping from bindings.
181
+ * @param bindings Bindings list.
182
+ * @returns Mapping used for rewrite lookup.
183
+ * @example
184
+ * ```typescript
185
+ * const map = toLocalMap([]);
186
+ * void map;
187
+ * ```
188
+ */
189
+ function toLocalMap(bindings) {
190
+ return new Map(bindings.map((binding) => [binding.localName, binding.exportedName]));
191
+ }
192
+ export { collectMatch };
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9wcmVmZXItdmktbW9ja2VkLWltcG9ydC9tYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUN0QixNQUFNLGtCQUFrQixDQUFDO0FBb0IxQjs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsVUFBVSxDQUNqQixPQUF5QixFQUN6QixPQUF1QixFQUN2QixJQUFlO0lBRWYsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0RSxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNuRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcscUJBQXFCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE1B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QUNwQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFDN0MsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUMvQyxPQUFPLENBQ0wsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSTtRQUNwQixRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVk7UUFDOUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFDLFFBQStCO0lBQ2pELE9BQU8sSUFBSSxHQUFHLENBQ1osUUFBUSxDQUFDLEdBQUcsQ0FDVixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQVUsQ0FDaEUsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlICogYXMgRVNUcmVlIGZyb20gXCJlc3RyZWVcIjtcblxuaW1wb3J0IHR5cGUgeyBSdWxlTWF0Y2ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBjb2xsZWN0QmluZGluZ3MgfSBmcm9tIFwiLi9tYXRjaC1iaW5kaW5nc1wiO1xuaW1wb3J0IHsgY29sbGVjdERlY2xhcmF0aW9ucyB9IGZyb20gXCIuL21hdGNoLWRlY2xhcmF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RmFjdG9yeVJldHVybk9iamVjdCxcbiAgZ2V0TW9kdWxlU3BlY2lmaWVyLFxuICBnZXROZXdsaW5lLFxuICBoYXNSYW5nZSxcbn0gZnJvbSBcIi4vbWF0Y2gtaGVscGVyc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUltcG9ydFBsYW4gfSBmcm9tIFwiLi9tYXRjaC1pbXBvcnRzXCI7XG5pbXBvcnQge1xuICBhcmVMb2NhbHNTYWZlVG9JbmxpbmUsXG4gIGJ1aWxkQWxsb3dlZFJhbmdlcyxcbiAgY29sbGVjdE1lbWJlclJld3JpdGVzLFxufSBmcm9tIFwiLi9tYXRjaC1yZXdyaXRlc1wiO1xuXG4vKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgTWF0Y2hTZWVkIHtcbiAgLyoqIFJldHVybmVkIG9iamVjdCBleHByZXNzaW9uIGZyb20gdGhlIG1vY2sgZmFjdG9yeS4gKi9cbiAgZmFjdG9yeU9iamVjdDogRVNUcmVlLk9iamVjdEV4cHJlc3Npb247XG5cbiAgLyoqIEV4cHJlc3Npb24gc3RhdGVtZW50IGNvbnRhaW5pbmcgYHZpLm1vY2tgIG9yIGB2aS5kb01vY2tgLiAqL1xuICBtb2NrU3RhdGVtZW50OiBFU1RyZWUuRXhwcmVzc2lvblN0YXRlbWVudDtcblxuICAvKiogTW9kdWxlIHBhdGggc3RyaW5nIGV4dHJhY3RlZCBmcm9tIHRoZSBmaXJzdCBtb2NrIGFyZ3VtZW50LiAqL1xuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZztcblxuICAvKiogT3JpZ2luYWwgZmlyc3QgYXJndW1lbnQgbm9kZSwgaW5jbHVkaW5nIGByYW5nZWAsIGZvciBmaXhlciB1c2UuICovXG4gIHNwZWNpZmllckV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uICYge1xuICAgIC8qKiBTb3VyY2UgcmFuZ2UgZm9yIHRoZSBtb2NrIHNwZWNpZmllciBleHByZXNzaW9uLiAqL1xuICAgIHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGZ1bGwgcnVsZSBtYXRjaCBmcm9tIHNlZWQgZGF0YS5cbiAqIEBwYXJhbSBjb250ZXh0IFJ1bGUgY29udGV4dC5cbiAqIEBwYXJhbSBwcm9ncmFtIFByb2dyYW0gbm9kZS5cbiAqIEBwYXJhbSBzZWVkIFNlZWQgZGF0YS5cbiAqIEByZXR1cm5zIFJ1bGUgbWF0Y2ggd2hlbiBzYWZlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1hdGNoID0gYnVpbGRNYXRjaCh7IHNvdXJjZUNvZGU6IHsgdGV4dDogXCJcIiB9IH0gYXMgbmV2ZXIsIHsgYm9keTogW10sIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsIHR5cGU6IFwiUHJvZ3JhbVwiIH0gYXMgbmV2ZXIsIHsgZmFjdG9yeU9iamVjdDogeyBwcm9wZXJ0aWVzOiBbXSwgdHlwZTogXCJPYmplY3RFeHByZXNzaW9uXCIgfSwgbW9ja1N0YXRlbWVudDogeyBleHByZXNzaW9uOiB7IGFyZ3VtZW50czogW10sIHR5cGU6IFwiQ2FsbEV4cHJlc3Npb25cIiB9LCB0eXBlOiBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB9LCBtb2R1bGVTcGVjaWZpZXI6IFwiLi94XCIsIHNwZWNpZmllckV4cHJlc3Npb246IHsgcmFuZ2U6IFswLCAxXSwgdHlwZTogXCJMaXRlcmFsXCIsIHZhbHVlOiBcIi4veFwiIH0gYXMgbmV2ZXIgfSk7XG4gKiB2b2lkIG1hdGNoO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2goXG4gIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQsXG4gIHByb2dyYW06IEVTVHJlZS5Qcm9ncmFtLFxuICBzZWVkOiBNYXRjaFNlZWQsXG4pOiBSdWxlTWF0Y2ggfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNsYXJhdGlvbnMgPSBjb2xsZWN0RGVjbGFyYXRpb25zKHByb2dyYW0sIGNvbnRleHQuc291cmNlQ29kZSk7XG4gIGNvbnN0IGJpbmRpbmdzID0gY29sbGVjdEJpbmRpbmdzKHNlZWQuZmFjdG9yeU9iamVjdCwgZGVjbGFyYXRpb25zKTtcbiAgaWYgKGJpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBjb25zdCBtZW1iZXJSZXdyaXRlcyA9IGNvbGxlY3RNZW1iZXJSZXdyaXRlcyhwcm9ncmFtLCB0b0xvY2FsTWFwKGJpbmRpbmdzKSk7XG4gIGNvbnN0IGxvY2FsTmFtZXMgPSBuZXcgU2V0KGJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5sb2NhbE5hbWUpKTtcbiAgY29uc3QgYWxsb3dlZFJhbmdlcyA9IGJ1aWxkQWxsb3dlZFJhbmdlcyhcbiAgICBiaW5kaW5ncyxcbiAgICBkZWNsYXJhdGlvbnMsXG4gICAgbWVtYmVyUmV3cml0ZXMsXG4gICk7XG4gIGlmICghYXJlTG9jYWxzU2FmZVRvSW5saW5lKHByb2dyYW0sIGFsbG93ZWRSYW5nZXMsIGxvY2FsTmFtZXMpKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmluZGluZ3MsXG4gICAgZGVjbGFyYXRpb25zLFxuICAgIGltcG9ydFBsYW46IHJlc29sdmVJbXBvcnRQbGFuKFxuICAgICAgcHJvZ3JhbSxcbiAgICAgIHNlZWQubW9kdWxlU3BlY2lmaWVyLFxuICAgICAgZ2V0SW1wb3J0TmFtZXMoYmluZGluZ3MpLFxuICAgICksXG4gICAgbWVtYmVyUmV3cml0ZXMsXG4gICAgbW9ja1NwZWNpZmllcklzSW1wb3J0RXhwcmVzc2lvbjpcbiAgICAgIHNlZWQuc3BlY2lmaWVyRXhwcmVzc2lvbi50eXBlID09PSBcIkltcG9ydEV4cHJlc3Npb25cIixcbiAgICBtb2NrU3BlY2lmaWVyUmFuZ2U6IHNlZWQuc3BlY2lmaWVyRXhwcmVzc2lvbi5yYW5nZSxcbiAgICBtb2R1bGVTcGVjaWZpZXI6IHNlZWQubW9kdWxlU3BlY2lmaWVyLFxuICAgIG5ld2xpbmU6IGdldE5ld2xpbmUoY29udGV4dC5zb3VyY2VDb2RlLnRleHQpLFxuICAgIG5vZGU6IHNlZWQubW9ja1N0YXRlbWVudCBhcyB1bmtub3duIGFzIFJ1bGUuTm9kZSxcbiAgICBzb3VyY2VUZXh0OiBjb250ZXh0LnNvdXJjZUNvZGUudGV4dCxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgZmlyc3QgYXBwbGljYWJsZSBydWxlIG1hdGNoIGZyb20gdGhlIGZpbGUuXG4gKiBAcGFyYW0gY29udGV4dCBSdWxlIGNvbnRleHQuXG4gKiBAcmV0dXJucyBDb2xsZWN0ZWQgbWF0Y2ggd2hlbiBwYXR0ZXJuIGlzIGZvdW5kLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1hdGNoID0gY29sbGVjdE1hdGNoKHsgc291cmNlQ29kZTogeyBhc3Q6IHsgYm9keTogW10sIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsIHR5cGU6IFwiUHJvZ3JhbVwiIH0sIHRleHQ6IFwiXCIgfSB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgbWF0Y2g7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY29sbGVjdE1hdGNoKGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBSdWxlTWF0Y2ggfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9ncmFtID0gY29udGV4dC5zb3VyY2VDb2RlLmFzdCBhcyBFU1RyZWUuUHJvZ3JhbTtcbiAgY29uc3Qgc2VlZCA9IGNvbGxlY3RTZWVkKHByb2dyYW0pO1xuICByZXR1cm4gc2VlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnVpbGRNYXRjaChjb250ZXh0LCBwcm9ncmFtLCBzZWVkKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBzZWVkIGRhdGEgbmVlZGVkIHRvIGJ1aWxkIGEgZnVsbCBtYXRjaC5cbiAqIEBwYXJhbSBwcm9ncmFtIFByb2dyYW0gbm9kZS5cbiAqIEByZXR1cm5zIE1hdGNoIHNlZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc2VlZCA9IGNvbGxlY3RTZWVkKHsgYm9keTogW10sIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsIHR5cGU6IFwiUHJvZ3JhbVwiIH0gYXMgbmV2ZXIpO1xuICogdm9pZCBzZWVkO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTZWVkKHByb2dyYW06IEVTVHJlZS5Qcm9ncmFtKTogTWF0Y2hTZWVkIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbW9ja1N0YXRlbWVudCA9IGZpbmRNb2NrU3RhdGVtZW50KHByb2dyYW0pO1xuICBpZiAobW9ja1N0YXRlbWVudCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IHsgZXhwcmVzc2lvbiB9ID0gbW9ja1N0YXRlbWVudDtcbiAgaWYgKGV4cHJlc3Npb24udHlwZSAhPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IGNhbGxBcmd1bWVudHMgPSBnZXRNb2NrQ2FsbEFyZ3VtZW50cyhleHByZXNzaW9uKTtcbiAgaWYgKGNhbGxBcmd1bWVudHMgPT09IHZvaWQgMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlU2VlZChtb2NrU3RhdGVtZW50LCBjYWxsQXJndW1lbnRzWzBdLCBjYWxsQXJndW1lbnRzWzFdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHNlZWQgZGF0YSBmcm9tIHZhbGlkYXRlZCBjYWxsIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSBtb2NrU3RhdGVtZW50IE1hdGNoZWQgYHZpLm1vY2tgIHN0YXRlbWVudC5cbiAqIEBwYXJhbSBzcGVjaWZpZXJFeHByZXNzaW9uIEZpcnN0IGFyZ3VtZW50IGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gZmFjdG9yeUV4cHJlc3Npb24gRmFjdG9yeSBjYWxsYmFjayBleHByZXNzaW9uLlxuICogQHJldHVybnMgTWF0Y2ggc2VlZCB3aGVuIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNlZWQgPSBjcmVhdGVTZWVkKHsgZXhwcmVzc2lvbjogeyBhcmd1bWVudHM6IFtdLCB0eXBlOiBcIkNhbGxFeHByZXNzaW9uXCIgfSwgdHlwZTogXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfSBhcyBuZXZlciwgeyB0eXBlOiBcIkxpdGVyYWxcIiwgdmFsdWU6IFwiLi94XCIgfSBhcyBuZXZlciwgeyBib2R5OiB7IHByb3BlcnRpZXM6IFtdLCB0eXBlOiBcIk9iamVjdEV4cHJlc3Npb25cIiB9LCB0eXBlOiBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfSBhcyBuZXZlcik7XG4gKiB2b2lkIHNlZWQ7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2VlZChcbiAgbW9ja1N0YXRlbWVudDogRVNUcmVlLkV4cHJlc3Npb25TdGF0ZW1lbnQsXG4gIHNwZWNpZmllckV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uLFxuICBmYWN0b3J5RXhwcmVzc2lvbjogRVNUcmVlLkV4cHJlc3Npb24sXG4pOiBNYXRjaFNlZWQgfCB1bmRlZmluZWQge1xuICBpZiAoIWhhc1JhbmdlKHNwZWNpZmllckV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IGdldE1vZHVsZVNwZWNpZmllcihzcGVjaWZpZXJFeHByZXNzaW9uKTtcbiAgY29uc3QgZmFjdG9yeU9iamVjdCA9IGdldEZhY3RvcnlSZXR1cm5PYmplY3QoZmFjdG9yeUV4cHJlc3Npb24pO1xuICByZXR1cm4gbW9kdWxlU3BlY2lmaWVyID09PSB2b2lkIDAgfHwgZmFjdG9yeU9iamVjdCA9PT0gdm9pZCAwXG4gICAgPyB2b2lkIDBcbiAgICA6IHsgZmFjdG9yeU9iamVjdCwgbW9ja1N0YXRlbWVudCwgbW9kdWxlU3BlY2lmaWVyLCBzcGVjaWZpZXJFeHByZXNzaW9uIH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgdG9wLWxldmVsIGB2aS5tb2NrYCBvciBgdmkuZG9Nb2NrYCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0gcHJvZ3JhbSBQcm9ncmFtIG5vZGUuXG4gKiBAcmV0dXJucyBNYXRjaGluZyBleHByZXNzaW9uIHN0YXRlbWVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBmaW5kTW9ja1N0YXRlbWVudCh7IGJvZHk6IFtdLCBzb3VyY2VUeXBlOiBcIm1vZHVsZVwiLCB0eXBlOiBcIlByb2dyYW1cIiB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgc3RhdGVtZW50O1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGZpbmRNb2NrU3RhdGVtZW50KFxuICBwcm9ncmFtOiBFU1RyZWUuUHJvZ3JhbSxcbik6IEVTVHJlZS5FeHByZXNzaW9uU3RhdGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHByb2dyYW0uYm9keS5maW5kKFxuICAgIChzdGF0ZW1lbnQpOiBzdGF0ZW1lbnQgaXMgRVNUcmVlLkV4cHJlc3Npb25TdGF0ZW1lbnQgPT5cbiAgICAgIGlzTW9ja0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHNvcnRlZCB1bmlxdWUgaW1wb3J0IG5hbWVzIGZyb20gYmluZGluZ3MuXG4gKiBAcGFyYW0gYmluZGluZ3MgQmluZGluZ3MgbGlzdC5cbiAqIEByZXR1cm5zIFNvcnRlZCBpbXBvcnQgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmFtZXMgPSBnZXRJbXBvcnROYW1lcyhbXSk7XG4gKiB2b2lkIG5hbWVzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldEltcG9ydE5hbWVzKGJpbmRpbmdzOiBSdWxlTWF0Y2hbXCJiaW5kaW5nc1wiXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KGJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5leHBvcnRlZE5hbWUpKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgbW9jayBjYWxsIGFyZ3VtZW50cyB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQgZXhwcmVzc2lvbnMuXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBDYWxsIGV4cHJlc3Npb24gbm9kZS5cbiAqIEByZXR1cm5zIEZpcnN0IGFuZCBzZWNvbmQgY2FsbCBhcmd1bWVudHMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXJncyA9IGdldE1vY2tDYWxsQXJndW1lbnRzKHsgYXJndW1lbnRzOiBbXSwgdHlwZTogXCJDYWxsRXhwcmVzc2lvblwiIH0gYXMgbmV2ZXIpO1xuICogdm9pZCBhcmdzO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldE1vY2tDYWxsQXJndW1lbnRzKFxuICBleHByZXNzaW9uOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb24sXG4pOiBbRVNUcmVlLkV4cHJlc3Npb24sIEVTVHJlZS5FeHByZXNzaW9uXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IFtmaXJzdEFyZ3VtZW50LCBzZWNvbmRBcmd1bWVudF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcbiAgaWYgKGZpcnN0QXJndW1lbnQgPT09IHZvaWQgMCB8fCBzZWNvbmRBcmd1bWVudCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoXG4gICAgZmlyc3RBcmd1bWVudC50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIiB8fFxuICAgIHNlY29uZEFyZ3VtZW50LnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiXG4gICkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gW2ZpcnN0QXJndW1lbnQsIHNlY29uZEFyZ3VtZW50XTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHN0YXRlbWVudCBpcyBhIHN1cHBvcnRlZCBtb2NrIGV4cHJlc3Npb24gc3RhdGVtZW50LlxuICogQHBhcmFtIHN0YXRlbWVudCBDYW5kaWRhdGUgc3RhdGVtZW50LlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHN0YXRlbWVudCBpcyBhIHN1cHBvcnRlZCBtb2NrIGNhbGwuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgb2sgPSBpc01vY2tFeHByZXNzaW9uU3RhdGVtZW50KHsgdHlwZTogXCJFbXB0eVN0YXRlbWVudFwiIH0gYXMgbmV2ZXIpO1xuICogdm9pZCBvaztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc01vY2tFeHByZXNzaW9uU3RhdGVtZW50KFxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5Qcm9ncmFtW1wiYm9keVwiXVtudW1iZXJdLFxuKTogYm9vbGVhbiB7XG4gIGlmIChzdGF0ZW1lbnQudHlwZSAhPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IGV4cHJlc3Npb24gfSA9IHN0YXRlbWVudDtcbiAgaWYgKFxuICAgIGV4cHJlc3Npb24udHlwZSAhPT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8XG4gICAgZXhwcmVzc2lvbi5jYWxsZWUudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCJcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgeyBvYmplY3QsIHByb3BlcnR5IH0gPSBleHByZXNzaW9uLmNhbGxlZTtcbiAgcmV0dXJuIChcbiAgICBvYmplY3QudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICBvYmplY3QubmFtZSA9PT0gXCJ2aVwiICYmXG4gICAgcHJvcGVydHkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAocHJvcGVydHkubmFtZSA9PT0gXCJtb2NrXCIgfHwgcHJvcGVydHkubmFtZSA9PT0gXCJkb01vY2tcIilcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGxvY2FsLXRvLWV4cG9ydGVkIG1hcHBpbmcgZnJvbSBiaW5kaW5ncy5cbiAqIEBwYXJhbSBiaW5kaW5ncyBCaW5kaW5ncyBsaXN0LlxuICogQHJldHVybnMgTWFwcGluZyB1c2VkIGZvciByZXdyaXRlIGxvb2t1cC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtYXAgPSB0b0xvY2FsTWFwKFtdKTtcbiAqIHZvaWQgbWFwO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHRvTG9jYWxNYXAoYmluZGluZ3M6IFJ1bGVNYXRjaFtcImJpbmRpbmdzXCJdKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBuZXcgTWFwKFxuICAgIGJpbmRpbmdzLm1hcChcbiAgICAgIChiaW5kaW5nKSA9PiBbYmluZGluZy5sb2NhbE5hbWUsIGJpbmRpbmcuZXhwb3J0ZWROYW1lXSBhcyBjb25zdCxcbiAgICApLFxuICApO1xufVxuXG5leHBvcnQgeyBjb2xsZWN0TWF0Y2ggfTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import type { Rule } from "eslint";
2
+ /** Enforce inline `vi.fn()` mocks inside `vi.mock`/`vi.doMock` factories. */
3
+ declare const preferViMockedImportRule: Rule.RuleModule;
4
+ export { preferViMockedImportRule };
5
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAMnC,6EAA6E;AAC7E,QAAA,MAAM,wBAAwB,EAAE,IAAI,CAAC,UA+BpC,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { createRuleDocumentation } from "../../custom-rule-documentation";
2
+ import { buildFix } from "./fix";
3
+ import { collectMatch } from "./match";
4
+ /** Enforce inline `vi.fn()` mocks inside `vi.mock`/`vi.doMock` factories. */
5
+ const preferViMockedImportRule = {
6
+ create(context) {
7
+ return {
8
+ Program: () => {
9
+ const match = collectMatch(context);
10
+ if (match === void 0) {
11
+ return;
12
+ }
13
+ context.report({
14
+ fix: (fixer) => buildFix(match, fixer),
15
+ messageId: "preferViMockedImport",
16
+ node: match.node,
17
+ });
18
+ },
19
+ };
20
+ },
21
+ meta: {
22
+ docs: createRuleDocumentation("prefer-vi-mocked-import", "Prefer inlining vi.fn mocks in vi.mock/vi.doMock factories and using vi.mocked(...)."),
23
+ fixable: "code",
24
+ messages: {
25
+ preferViMockedImport: "Inline vi.fn mocks in the vi.mock/vi.doMock factory and use vi.mocked(...) for calls.",
26
+ },
27
+ schema: [],
28
+ type: "suggestion",
29
+ },
30
+ };
31
+ export { preferViMockedImportRule };
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L3J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXZDLDZFQUE2RTtBQUM3RSxNQUFNLHdCQUF3QixHQUFvQjtJQUNoRCxNQUFNLENBQUMsT0FBeUI7UUFDOUIsT0FBTztZQUNMLE9BQU8sRUFBRSxHQUFTLEVBQUU7Z0JBQ2xCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFcEMsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDckIsT0FBTztnQkFDVCxDQUFDO2dCQUVELE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQ2IsR0FBRyxFQUFFLENBQUMsS0FBcUIsRUFBYyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7b0JBQ2xFLFNBQVMsRUFBRSxzQkFBc0I7b0JBQ2pDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDakIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUMwQixDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsdUJBQXVCLENBQzNCLHlCQUF5QixFQUN6QixzRkFBc0YsQ0FDdkY7UUFDRCxPQUFPLEVBQUUsTUFBTTtRQUNmLFFBQVEsRUFBRTtZQUNSLG9CQUFvQixFQUNsQix1RkFBdUY7U0FDMUY7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxZQUFZO0tBQ25CO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuXG5pbXBvcnQgeyBjcmVhdGVSdWxlRG9jdW1lbnRhdGlvbiB9IGZyb20gXCIuLi8uLi9jdXN0b20tcnVsZS1kb2N1bWVudGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZEZpeCB9IGZyb20gXCIuL2ZpeFwiO1xuaW1wb3J0IHsgY29sbGVjdE1hdGNoIH0gZnJvbSBcIi4vbWF0Y2hcIjtcblxuLyoqIEVuZm9yY2UgaW5saW5lIGB2aS5mbigpYCBtb2NrcyBpbnNpZGUgYHZpLm1vY2tgL2B2aS5kb01vY2tgIGZhY3Rvcmllcy4gKi9cbmNvbnN0IHByZWZlclZpTW9ja2VkSW1wb3J0UnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgUHJvZ3JhbTogKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGNvbGxlY3RNYXRjaChjb250ZXh0KTtcblxuICAgICAgICBpZiAobWF0Y2ggPT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBmaXg6IChmaXhlcjogUnVsZS5SdWxlRml4ZXIpOiBSdWxlLkZpeFtdID0+IGJ1aWxkRml4KG1hdGNoLCBmaXhlciksXG4gICAgICAgICAgbWVzc2FnZUlkOiBcInByZWZlclZpTW9ja2VkSW1wb3J0XCIsXG4gICAgICAgICAgbm9kZTogbWF0Y2gubm9kZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0gc2F0aXNmaWVzIFJ1bGUuUnVsZUxpc3RlbmVyO1xuICB9LFxuICBtZXRhOiB7XG4gICAgZG9jczogY3JlYXRlUnVsZURvY3VtZW50YXRpb24oXG4gICAgICBcInByZWZlci12aS1tb2NrZWQtaW1wb3J0XCIsXG4gICAgICBcIlByZWZlciBpbmxpbmluZyB2aS5mbiBtb2NrcyBpbiB2aS5tb2NrL3ZpLmRvTW9jayBmYWN0b3JpZXMgYW5kIHVzaW5nIHZpLm1vY2tlZCguLi4pLlwiLFxuICAgICksXG4gICAgZml4YWJsZTogXCJjb2RlXCIsXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIHByZWZlclZpTW9ja2VkSW1wb3J0OlxuICAgICAgICBcIklubGluZSB2aS5mbiBtb2NrcyBpbiB0aGUgdmkubW9jay92aS5kb01vY2sgZmFjdG9yeSBhbmQgdXNlIHZpLm1vY2tlZCguLi4pIGZvciBjYWxscy5cIixcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogXCJzdWdnZXN0aW9uXCIsXG4gIH0sXG59O1xuXG5leHBvcnQgeyBwcmVmZXJWaU1vY2tlZEltcG9ydFJ1bGUgfTtcbiJdfQ==
@@ -0,0 +1,83 @@
1
+ import type { Rule } from "eslint";
2
+ import type { Range } from "./match-helpers";
3
+ /** Type definition for rule data. */
4
+ interface Binding {
5
+ /** Name of the mocked export (object property key). */
6
+ exportedName: string;
7
+ /** Local variable name referenced in the mock factory object. */
8
+ localName: string;
9
+ /** Range of the object property key identifier. */
10
+ propertyKeyRange: Range;
11
+ /** Full range of the object property to replace. */
12
+ propertyRange: Range;
13
+ /** Range of the identifier that references the local variable. */
14
+ propertyValueRange: Range;
15
+ }
16
+ /** Type definition for rule data. */
17
+ interface Declaration {
18
+ /** Range of the identifier being declared (e.g. `x` in `const x = ...`). */
19
+ declarationIdRange: Range;
20
+ /** Range of the initializer expression (the `vi.fn(...)` call). */
21
+ initializerRange: Range;
22
+ /** Local variable name. */
23
+ localName: string;
24
+ /** Range of the full statement to remove. */
25
+ statementRange: Range;
26
+ }
27
+ /** Type definition for rule data. */
28
+ interface ImportInsertPlan {
29
+ /** Range of the last import statement, when present. */
30
+ afterRange?: Range;
31
+ }
32
+ /** Type definition for rule data. */
33
+ interface ImportPlan {
34
+ /** Insert plan when no compatible import exists. */
35
+ insert?: ImportInsertPlan;
36
+ /** Module specifier to import from. */
37
+ moduleSpecifier: string;
38
+ /** Names that must be imported from the module. */
39
+ names: string[];
40
+ /** Update plan when an import can be updated in-place. */
41
+ update?: ImportUpdatePlan;
42
+ }
43
+ /** Type definition for rule data. */
44
+ interface ImportUpdatePlan {
45
+ /** Default import local name, when present. */
46
+ defaultImportName?: string;
47
+ /** Existing named imports from the module. */
48
+ existingNamedImports: string[];
49
+ /** Range of the import statement to replace. */
50
+ range: Range;
51
+ }
52
+ /** Type definition for rule data. */
53
+ interface MemberRewrite {
54
+ /** Exported name to use inside `vi.mocked(...)`. */
55
+ exportedName: string;
56
+ /** Range of the identifier used as the member-expression object. */
57
+ localObjectRange: Range;
58
+ }
59
+ /** Type definition for rule data. */
60
+ interface RuleMatch {
61
+ /** Bindings that can be inlined into the mock factory. */
62
+ bindings: Binding[];
63
+ /** Declarations by local name. */
64
+ declarations: Map<string, Declaration>;
65
+ /** Import insertion/update plan. */
66
+ importPlan: ImportPlan;
67
+ /** Member-expression rewrites for `.mock*` calls. */
68
+ memberRewrites: MemberRewrite[];
69
+ /** True when the first argument is already `import("...")`. */
70
+ mockSpecifierIsImportExpression: boolean;
71
+ /** Range of the first argument to `vi.mock`/`vi.doMock`. */
72
+ mockSpecifierRange: Range;
73
+ /** Module specifier being mocked. */
74
+ moduleSpecifier: string;
75
+ /** Preferred newline sequence used by the file. */
76
+ newline: "\n" | "\r\n";
77
+ /** Node to use for reporting. */
78
+ node: Rule.Node;
79
+ /** Full source text. */
80
+ sourceText: string;
81
+ }
82
+ export type { Binding, Declaration, ImportPlan, MemberRewrite, RuleMatch };
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qCAAqC;AACrC,UAAU,OAAO;IACf,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IAErB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAElB,mDAAmD;IACnD,gBAAgB,EAAE,KAAK,CAAC;IAExB,oDAAoD;IACpD,aAAa,EAAE,KAAK,CAAC;IAErB,kEAAkE;IAClE,kBAAkB,EAAE,KAAK,CAAC;CAC3B;AAED,qCAAqC;AACrC,UAAU,WAAW;IACnB,4EAA4E;IAC5E,kBAAkB,EAAE,KAAK,CAAC;IAE1B,mEAAmE;IACnE,gBAAgB,EAAE,KAAK,CAAC;IAExB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAElB,6CAA6C;IAC7C,cAAc,EAAE,KAAK,CAAC;CACvB;AAED,qCAAqC;AACrC,UAAU,gBAAgB;IACxB,wDAAwD;IACxD,UAAU,CAAC,EAAE,KAAK,CAAC;CACpB;AAED,qCAAqC;AACrC,UAAU,UAAU;IAClB,oDAAoD;IACpD,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAE1B,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IAExB,mDAAmD;IACnD,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,qCAAqC;AACrC,UAAU,gBAAgB;IACxB,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAE/B,gDAAgD;IAChD,KAAK,EAAE,KAAK,CAAC;CACd;AAED,qCAAqC;AACrC,UAAU,aAAa;IACrB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IAErB,oEAAoE;IACpE,gBAAgB,EAAE,KAAK,CAAC;CACzB;AAED,qCAAqC;AACrC,UAAU,SAAS;IACjB,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,EAAE,CAAC;IAEpB,kCAAkC;IAClC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEvC,oCAAoC;IACpC,UAAU,EAAE,UAAU,CAAC;IAEvB,qDAAqD;IACrD,cAAc,EAAE,aAAa,EAAE,CAAC;IAEhC,+DAA+D;IAC/D,+BAA+B,EAAE,OAAO,CAAC;IAEzC,4DAA4D;IAC5D,kBAAkB,EAAE,KAAK,CAAC;IAE1B,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IAExB,mDAAmD;IACnD,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IAEvB,iCAAiC;IACjC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAEhB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9wcmVmZXItdmktbW9ja2VkLWltcG9ydC90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuXG5pbXBvcnQgdHlwZSB7IFJhbmdlIH0gZnJvbSBcIi4vbWF0Y2gtaGVscGVyc1wiO1xuXG4vKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgQmluZGluZyB7XG4gIC8qKiBOYW1lIG9mIHRoZSBtb2NrZWQgZXhwb3J0IChvYmplY3QgcHJvcGVydHkga2V5KS4gKi9cbiAgZXhwb3J0ZWROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIExvY2FsIHZhcmlhYmxlIG5hbWUgcmVmZXJlbmNlZCBpbiB0aGUgbW9jayBmYWN0b3J5IG9iamVjdC4gKi9cbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFJhbmdlIG9mIHRoZSBvYmplY3QgcHJvcGVydHkga2V5IGlkZW50aWZpZXIuICovXG4gIHByb3BlcnR5S2V5UmFuZ2U6IFJhbmdlO1xuXG4gIC8qKiBGdWxsIHJhbmdlIG9mIHRoZSBvYmplY3QgcHJvcGVydHkgdG8gcmVwbGFjZS4gKi9cbiAgcHJvcGVydHlSYW5nZTogUmFuZ2U7XG5cbiAgLyoqIFJhbmdlIG9mIHRoZSBpZGVudGlmaWVyIHRoYXQgcmVmZXJlbmNlcyB0aGUgbG9jYWwgdmFyaWFibGUuICovXG4gIHByb3BlcnR5VmFsdWVSYW5nZTogUmFuZ2U7XG59XG5cbi8qKiBUeXBlIGRlZmluaXRpb24gZm9yIHJ1bGUgZGF0YS4gKi9cbmludGVyZmFjZSBEZWNsYXJhdGlvbiB7XG4gIC8qKiBSYW5nZSBvZiB0aGUgaWRlbnRpZmllciBiZWluZyBkZWNsYXJlZCAoZS5nLiBgeGAgaW4gYGNvbnN0IHggPSAuLi5gKS4gKi9cbiAgZGVjbGFyYXRpb25JZFJhbmdlOiBSYW5nZTtcblxuICAvKiogUmFuZ2Ugb2YgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gKHRoZSBgdmkuZm4oLi4uKWAgY2FsbCkuICovXG4gIGluaXRpYWxpemVyUmFuZ2U6IFJhbmdlO1xuXG4gIC8qKiBMb2NhbCB2YXJpYWJsZSBuYW1lLiAqL1xuICBsb2NhbE5hbWU6IHN0cmluZztcblxuICAvKiogUmFuZ2Ugb2YgdGhlIGZ1bGwgc3RhdGVtZW50IHRvIHJlbW92ZS4gKi9cbiAgc3RhdGVtZW50UmFuZ2U6IFJhbmdlO1xufVxuXG4vKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgSW1wb3J0SW5zZXJ0UGxhbiB7XG4gIC8qKiBSYW5nZSBvZiB0aGUgbGFzdCBpbXBvcnQgc3RhdGVtZW50LCB3aGVuIHByZXNlbnQuICovXG4gIGFmdGVyUmFuZ2U/OiBSYW5nZTtcbn1cblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIEltcG9ydFBsYW4ge1xuICAvKiogSW5zZXJ0IHBsYW4gd2hlbiBubyBjb21wYXRpYmxlIGltcG9ydCBleGlzdHMuICovXG4gIGluc2VydD86IEltcG9ydEluc2VydFBsYW47XG5cbiAgLyoqIE1vZHVsZSBzcGVjaWZpZXIgdG8gaW1wb3J0IGZyb20uICovXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nO1xuXG4gIC8qKiBOYW1lcyB0aGF0IG11c3QgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgbW9kdWxlLiAqL1xuICBuYW1lczogc3RyaW5nW107XG5cbiAgLyoqIFVwZGF0ZSBwbGFuIHdoZW4gYW4gaW1wb3J0IGNhbiBiZSB1cGRhdGVkIGluLXBsYWNlLiAqL1xuICB1cGRhdGU/OiBJbXBvcnRVcGRhdGVQbGFuO1xufVxuXG4vKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgSW1wb3J0VXBkYXRlUGxhbiB7XG4gIC8qKiBEZWZhdWx0IGltcG9ydCBsb2NhbCBuYW1lLCB3aGVuIHByZXNlbnQuICovXG4gIGRlZmF1bHRJbXBvcnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBFeGlzdGluZyBuYW1lZCBpbXBvcnRzIGZyb20gdGhlIG1vZHVsZS4gKi9cbiAgZXhpc3RpbmdOYW1lZEltcG9ydHM6IHN0cmluZ1tdO1xuXG4gIC8qKiBSYW5nZSBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudCB0byByZXBsYWNlLiAqL1xuICByYW5nZTogUmFuZ2U7XG59XG5cbi8qKiBUeXBlIGRlZmluaXRpb24gZm9yIHJ1bGUgZGF0YS4gKi9cbmludGVyZmFjZSBNZW1iZXJSZXdyaXRlIHtcbiAgLyoqIEV4cG9ydGVkIG5hbWUgdG8gdXNlIGluc2lkZSBgdmkubW9ja2VkKC4uLilgLiAqL1xuICBleHBvcnRlZE5hbWU6IHN0cmluZztcblxuICAvKiogUmFuZ2Ugb2YgdGhlIGlkZW50aWZpZXIgdXNlZCBhcyB0aGUgbWVtYmVyLWV4cHJlc3Npb24gb2JqZWN0LiAqL1xuICBsb2NhbE9iamVjdFJhbmdlOiBSYW5nZTtcbn1cblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIFJ1bGVNYXRjaCB7XG4gIC8qKiBCaW5kaW5ncyB0aGF0IGNhbiBiZSBpbmxpbmVkIGludG8gdGhlIG1vY2sgZmFjdG9yeS4gKi9cbiAgYmluZGluZ3M6IEJpbmRpbmdbXTtcblxuICAvKiogRGVjbGFyYXRpb25zIGJ5IGxvY2FsIG5hbWUuICovXG4gIGRlY2xhcmF0aW9uczogTWFwPHN0cmluZywgRGVjbGFyYXRpb24+O1xuXG4gIC8qKiBJbXBvcnQgaW5zZXJ0aW9uL3VwZGF0ZSBwbGFuLiAqL1xuICBpbXBvcnRQbGFuOiBJbXBvcnRQbGFuO1xuXG4gIC8qKiBNZW1iZXItZXhwcmVzc2lvbiByZXdyaXRlcyBmb3IgYC5tb2NrKmAgY2FsbHMuICovXG4gIG1lbWJlclJld3JpdGVzOiBNZW1iZXJSZXdyaXRlW107XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWxyZWFkeSBgaW1wb3J0KFwiLi4uXCIpYC4gKi9cbiAgbW9ja1NwZWNpZmllcklzSW1wb3J0RXhwcmVzc2lvbjogYm9vbGVhbjtcblxuICAvKiogUmFuZ2Ugb2YgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGB2aS5tb2NrYC9gdmkuZG9Nb2NrYC4gKi9cbiAgbW9ja1NwZWNpZmllclJhbmdlOiBSYW5nZTtcblxuICAvKiogTW9kdWxlIHNwZWNpZmllciBiZWluZyBtb2NrZWQuICovXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nO1xuXG4gIC8qKiBQcmVmZXJyZWQgbmV3bGluZSBzZXF1ZW5jZSB1c2VkIGJ5IHRoZSBmaWxlLiAqL1xuICBuZXdsaW5lOiBcIlxcblwiIHwgXCJcXHJcXG5cIjtcblxuICAvKiogTm9kZSB0byB1c2UgZm9yIHJlcG9ydGluZy4gKi9cbiAgbm9kZTogUnVsZS5Ob2RlO1xuXG4gIC8qKiBGdWxsIHNvdXJjZSB0ZXh0LiAqL1xuICBzb3VyY2VUZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIHsgQmluZGluZywgRGVjbGFyYXRpb24sIEltcG9ydFBsYW4sIE1lbWJlclJld3JpdGUsIFJ1bGVNYXRjaCB9O1xuIl19
@@ -0,0 +1,2 @@
1
+ export { requireAaaSectionsRule } from "./rule";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/require-aaa-sections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { requireAaaSectionsRule } from "./rule";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9yZXF1aXJlLWFhYS1zZWN0aW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyByZXF1aXJlQWFhU2VjdGlvbnNSdWxlIH0gZnJvbSBcIi4vcnVsZVwiO1xuIl19
@@ -0,0 +1,4 @@
1
+ import type { Rule } from "eslint";
2
+ declare const requireAaaSectionsRule: Rule.RuleModule;
3
+ export { requireAaaSectionsRule };
4
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/testing/require-aaa-sections/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAcnC,QAAA,MAAM,sBAAsB,EAAE,IAAI,CAAC,UA+BlC,CAAC;AAiJF,OAAO,EAAE,sBAAsB,EAAE,CAAC"}