@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,16 @@
1
+ import type * as ESTree from "estree";
2
+ import type { Binding, Declaration } from "./types";
3
+ /**
4
+ * Collects bindings from a mock factory object.
5
+ * @param objectExpression Returned object expression.
6
+ * @param declarations Known declarations by local name.
7
+ * @returns Collected bindings.
8
+ * @example
9
+ * ```typescript
10
+ * const bindings = collectBindings({ properties: [], type: "ObjectExpression" } as never, new Map());
11
+ * void bindings;
12
+ * ```
13
+ */
14
+ declare function collectBindings(objectExpression: ESTree.ObjectExpression, declarations: Map<string, Declaration>): Binding[];
15
+ export { collectBindings };
16
+ //# sourceMappingURL=match-bindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-bindings.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/match-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIpD;;;;;;;;;;GAUG;AACH,iBAAS,eAAe,CACtB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EACzC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACrC,OAAO,EAAE,CAIX;AA8CD,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { hasRange } from "./match-helpers";
2
+ /**
3
+ * Collects bindings from a mock factory object.
4
+ * @param objectExpression Returned object expression.
5
+ * @param declarations Known declarations by local name.
6
+ * @returns Collected bindings.
7
+ * @example
8
+ * ```typescript
9
+ * const bindings = collectBindings({ properties: [], type: "ObjectExpression" } as never, new Map());
10
+ * void bindings;
11
+ * ```
12
+ */
13
+ function collectBindings(objectExpression, declarations) {
14
+ return objectExpression.properties
15
+ .map((propertyNode) => toBinding(propertyNode, declarations))
16
+ .filter((binding) => binding !== void 0);
17
+ }
18
+ /**
19
+ * Converts one object property into a binding when supported.
20
+ * @param propertyNode Object property candidate.
21
+ * @param declarations Known declarations.
22
+ * @returns Binding when property matches the rule shape.
23
+ * @example
24
+ * ```typescript
25
+ * const binding = toBinding({ type: "SpreadElement" } as never, new Map());
26
+ * void binding;
27
+ * ```
28
+ */
29
+ function toBinding(propertyNode, declarations) {
30
+ if (propertyNode.type !== "Property" ||
31
+ propertyNode.key.type !== "Identifier") {
32
+ return void 0;
33
+ }
34
+ if (!hasRange(propertyNode) ||
35
+ !hasRange(propertyNode.key) ||
36
+ propertyNode.value.type !== "Identifier") {
37
+ return void 0;
38
+ }
39
+ if (!hasRange(propertyNode.value) ||
40
+ !declarations.has(propertyNode.value.name)) {
41
+ return void 0;
42
+ }
43
+ return {
44
+ exportedName: propertyNode.key.name,
45
+ localName: propertyNode.value.name,
46
+ propertyKeyRange: propertyNode.key.range,
47
+ propertyRange: propertyNode.range,
48
+ propertyValueRange: propertyNode.value.range,
49
+ };
50
+ }
51
+ export { collectBindings };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9wcmVmZXItdmktbW9ja2VkLWltcG9ydC9tYXRjaC1iaW5kaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsZUFBZSxDQUN0QixnQkFBeUMsRUFDekMsWUFBc0M7SUFFdEMsT0FBTyxnQkFBZ0IsQ0FBQyxVQUFVO1NBQy9CLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztTQUM1RCxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQXNCLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsU0FBUyxDQUNoQixZQUFvRCxFQUNwRCxZQUFzQztJQUV0QyxJQUNFLFlBQVksQ0FBQyxJQUFJLEtBQUssVUFBVTtRQUNoQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQ3RDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUNFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUN2QixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1FBQzNCLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksRUFDeEMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUNELElBQ0UsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUM3QixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFDMUMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU87UUFDTCxZQUFZLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJO1FBQ25DLFNBQVMsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUk7UUFDbEMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLO1FBQ3hDLGFBQWEsRUFBRSxZQUFZLENBQUMsS0FBSztRQUNqQyxrQkFBa0IsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUs7S0FDN0MsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEVTVHJlZSBmcm9tIFwiZXN0cmVlXCI7XG5cbmltcG9ydCB0eXBlIHsgQmluZGluZywgRGVjbGFyYXRpb24gfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBoYXNSYW5nZSB9IGZyb20gXCIuL21hdGNoLWhlbHBlcnNcIjtcblxuLyoqXG4gKiBDb2xsZWN0cyBiaW5kaW5ncyBmcm9tIGEgbW9jayBmYWN0b3J5IG9iamVjdC5cbiAqIEBwYXJhbSBvYmplY3RFeHByZXNzaW9uIFJldHVybmVkIG9iamVjdCBleHByZXNzaW9uLlxuICogQHBhcmFtIGRlY2xhcmF0aW9ucyBLbm93biBkZWNsYXJhdGlvbnMgYnkgbG9jYWwgbmFtZS5cbiAqIEByZXR1cm5zIENvbGxlY3RlZCBiaW5kaW5ncy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBiaW5kaW5ncyA9IGNvbGxlY3RCaW5kaW5ncyh7IHByb3BlcnRpZXM6IFtdLCB0eXBlOiBcIk9iamVjdEV4cHJlc3Npb25cIiB9IGFzIG5ldmVyLCBuZXcgTWFwKCkpO1xuICogdm9pZCBiaW5kaW5ncztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjb2xsZWN0QmluZGluZ3MoXG4gIG9iamVjdEV4cHJlc3Npb246IEVTVHJlZS5PYmplY3RFeHByZXNzaW9uLFxuICBkZWNsYXJhdGlvbnM6IE1hcDxzdHJpbmcsIERlY2xhcmF0aW9uPixcbik6IEJpbmRpbmdbXSB7XG4gIHJldHVybiBvYmplY3RFeHByZXNzaW9uLnByb3BlcnRpZXNcbiAgICAubWFwKChwcm9wZXJ0eU5vZGUpID0+IHRvQmluZGluZyhwcm9wZXJ0eU5vZGUsIGRlY2xhcmF0aW9ucykpXG4gICAgLmZpbHRlcigoYmluZGluZyk6IGJpbmRpbmcgaXMgQmluZGluZyA9PiBiaW5kaW5nICE9PSB2b2lkIDApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBvYmplY3QgcHJvcGVydHkgaW50byBhIGJpbmRpbmcgd2hlbiBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gcHJvcGVydHlOb2RlIE9iamVjdCBwcm9wZXJ0eSBjYW5kaWRhdGUuXG4gKiBAcGFyYW0gZGVjbGFyYXRpb25zIEtub3duIGRlY2xhcmF0aW9ucy5cbiAqIEByZXR1cm5zIEJpbmRpbmcgd2hlbiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBydWxlIHNoYXBlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGJpbmRpbmcgPSB0b0JpbmRpbmcoeyB0eXBlOiBcIlNwcmVhZEVsZW1lbnRcIiB9IGFzIG5ldmVyLCBuZXcgTWFwKCkpO1xuICogdm9pZCBiaW5kaW5nO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHRvQmluZGluZyhcbiAgcHJvcGVydHlOb2RlOiBFU1RyZWUuUHJvcGVydHkgfCBFU1RyZWUuU3ByZWFkRWxlbWVudCxcbiAgZGVjbGFyYXRpb25zOiBNYXA8c3RyaW5nLCBEZWNsYXJhdGlvbj4sXG4pOiBCaW5kaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgIHByb3BlcnR5Tm9kZS50eXBlICE9PSBcIlByb3BlcnR5XCIgfHxcbiAgICBwcm9wZXJ0eU5vZGUua2V5LnR5cGUgIT09IFwiSWRlbnRpZmllclwiXG4gICkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKFxuICAgICFoYXNSYW5nZShwcm9wZXJ0eU5vZGUpIHx8XG4gICAgIWhhc1JhbmdlKHByb3BlcnR5Tm9kZS5rZXkpIHx8XG4gICAgcHJvcGVydHlOb2RlLnZhbHVlLnR5cGUgIT09IFwiSWRlbnRpZmllclwiXG4gICkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKFxuICAgICFoYXNSYW5nZShwcm9wZXJ0eU5vZGUudmFsdWUpIHx8XG4gICAgIWRlY2xhcmF0aW9ucy5oYXMocHJvcGVydHlOb2RlLnZhbHVlLm5hbWUpXG4gICkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydGVkTmFtZTogcHJvcGVydHlOb2RlLmtleS5uYW1lLFxuICAgIGxvY2FsTmFtZTogcHJvcGVydHlOb2RlLnZhbHVlLm5hbWUsXG4gICAgcHJvcGVydHlLZXlSYW5nZTogcHJvcGVydHlOb2RlLmtleS5yYW5nZSxcbiAgICBwcm9wZXJ0eVJhbmdlOiBwcm9wZXJ0eU5vZGUucmFuZ2UsXG4gICAgcHJvcGVydHlWYWx1ZVJhbmdlOiBwcm9wZXJ0eU5vZGUudmFsdWUucmFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCB7IGNvbGxlY3RCaW5kaW5ncyB9O1xuIl19
@@ -0,0 +1,16 @@
1
+ import type { Rule } from "eslint";
2
+ import type * as ESTree from "estree";
3
+ import type { Declaration } from "./types";
4
+ /**
5
+ * Collects top-level `const x = vi.fn(...)` declarations.
6
+ * @param program Program node.
7
+ * @returns Declarations by local name.
8
+ * @example
9
+ * ```typescript
10
+ * const declarations = collectDeclarations({ body: [], sourceType: "module", type: "Program" } as never);
11
+ * void declarations;
12
+ * ```
13
+ */
14
+ declare function collectDeclarations(program: ESTree.Program, sourceCode?: Rule.RuleContext["sourceCode"]): Map<string, Declaration>;
15
+ export { collectDeclarations };
16
+ //# sourceMappingURL=match-declarations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-declarations.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/match-declarations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C;;;;;;;;;GASG;AACH,iBAAS,mBAAmB,CAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,UAAU,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAC1C,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAU1B;AAwGD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { hasRange, isViFunctionCall } from "./match-helpers";
2
+ /**
3
+ * Collects top-level `const x = vi.fn(...)` declarations.
4
+ * @param program Program node.
5
+ * @returns Declarations by local name.
6
+ * @example
7
+ * ```typescript
8
+ * const declarations = collectDeclarations({ body: [], sourceType: "module", type: "Program" } as never);
9
+ * void declarations;
10
+ * ```
11
+ */
12
+ function collectDeclarations(program, sourceCode) {
13
+ const declarations = program.body
14
+ .map((statement) => toDeclaration(statement, sourceCode))
15
+ .filter((declaration) => declaration !== void 0);
16
+ return new Map(declarations.map((declaration) => [declaration.localName, declaration]));
17
+ }
18
+ /**
19
+ * Converts one top-level statement into a declaration when supported.
20
+ * @param statement Candidate statement.
21
+ * @returns Declaration when statement matches the rule shape.
22
+ * @example
23
+ * ```typescript
24
+ * const declaration = toDeclaration({ type: "EmptyStatement" } as never);
25
+ * void declaration;
26
+ * ```
27
+ */
28
+ function toDeclaration(statement, sourceCode) {
29
+ if (statement.type !== "VariableDeclaration" || statement.kind !== "const") {
30
+ return void 0;
31
+ }
32
+ if (!hasRange(statement) || statement.declarations.length !== 1) {
33
+ return void 0;
34
+ }
35
+ const [declarator] = statement.declarations;
36
+ if (declarator === void 0 ||
37
+ declarator.id.type !== "Identifier" ||
38
+ !hasRange(declarator.id) ||
39
+ declarator.init === null ||
40
+ declarator.init === void 0 ||
41
+ !hasRange(declarator.init) ||
42
+ !isViFunctionCall(declarator.init)) {
43
+ return void 0;
44
+ }
45
+ return {
46
+ declarationIdRange: declarator.id.range,
47
+ initializerRange: declarator.init.range,
48
+ localName: declarator.id.name,
49
+ statementRange: getRemovalRange(statement, sourceCode),
50
+ };
51
+ }
52
+ /**
53
+ * Returns the declaration removal range, including directly attached comments.
54
+ * @param statement Variable declaration statement.
55
+ * @param sourceCode Source code wrapper when available.
56
+ * @returns Statement range expanded to attached leading comments.
57
+ * @example
58
+ * ```typescript
59
+ * const range = getRemovalRange({ range: [5, 10], type: "VariableDeclaration" } as never);
60
+ * void range;
61
+ * ```
62
+ */
63
+ function getRemovalRange(statement, sourceCode) {
64
+ const statementStart = statement.range[0];
65
+ const commentsBefore = sourceCode?.getCommentsBefore(statement) ?? [];
66
+ if (commentsBefore.length === 0) {
67
+ return statement.range;
68
+ }
69
+ let removalStart = statementStart;
70
+ let nextStart = statementStart;
71
+ for (const comment of [...commentsBefore].reverse()) {
72
+ const commentRange = comment.range;
73
+ if (commentRange === void 0) {
74
+ break;
75
+ }
76
+ const gapText = sourceCode?.text.slice(commentRange[1], nextStart) ?? "";
77
+ if (!isAttachedLeadingGap(gapText)) {
78
+ break;
79
+ }
80
+ removalStart = commentRange[0];
81
+ nextStart = commentRange[0];
82
+ }
83
+ return [removalStart, statement.range[1]];
84
+ }
85
+ /**
86
+ * Returns true when whitespace between a comment and declaration keeps them attached.
87
+ * @param gapText Source text between adjacent nodes.
88
+ * @returns True when the gap contains no blank line.
89
+ * @example
90
+ * ```typescript
91
+ * const ok = isAttachedLeadingGap("\n");
92
+ * void ok;
93
+ * ```
94
+ */
95
+ function isAttachedLeadingGap(gapText) {
96
+ return (/^[\t \r\n]*$/u.test(gapText) && !/(\r?\n)[\t ]*(\r?\n)/u.test(gapText));
97
+ }
98
+ export { collectDeclarations };
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtZGVjbGFyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvcHJlZmVyLXZpLW1vY2tlZC1pbXBvcnQvbWF0Y2gtZGVjbGFyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU3RDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixPQUF1QixFQUN2QixVQUEyQztJQUUzQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSTtTQUM5QixHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDeEQsTUFBTSxDQUNMLENBQUMsV0FBVyxFQUE4QixFQUFFLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxDQUNwRSxDQUFDO0lBRUosT0FBTyxJQUFJLEdBQUcsQ0FDWixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FDeEUsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsU0FBeUMsRUFDekMsVUFBMkM7SUFFM0MsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLHFCQUFxQixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDM0UsT0FBTyxLQUFLLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUM1QyxJQUNFLFVBQVUsS0FBSyxLQUFLLENBQUM7UUFDckIsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssWUFBWTtRQUNuQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3hCLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSTtRQUN4QixVQUFVLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztRQUMxQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzFCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUNsQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsT0FBTztRQUNMLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsS0FBSztRQUN2QyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUs7UUFDdkMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSTtRQUM3QixjQUFjLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7S0FDdkQsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLFNBQW1FLEVBQ25FLFVBQTJDO0lBRTNDLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxjQUFjLEdBQUcsVUFBVSxFQUFFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV0RSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUM7SUFDbEMsSUFBSSxTQUFTLEdBQUcsY0FBYyxDQUFDO0lBRS9CLEtBQUssTUFBTSxPQUFPLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUVuQyxJQUFJLFlBQVksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNO1FBQ1IsQ0FBQztRQUVELFlBQVksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsT0FBTyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsb0JBQW9CLENBQUMsT0FBZTtJQUMzQyxPQUFPLENBQ0wsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDeEUsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlICogYXMgRVNUcmVlIGZyb20gXCJlc3RyZWVcIjtcblxuaW1wb3J0IHR5cGUgeyBEZWNsYXJhdGlvbiB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmltcG9ydCB7IGhhc1JhbmdlLCBpc1ZpRnVuY3Rpb25DYWxsIH0gZnJvbSBcIi4vbWF0Y2gtaGVscGVyc1wiO1xuXG4vKipcbiAqIENvbGxlY3RzIHRvcC1sZXZlbCBgY29uc3QgeCA9IHZpLmZuKC4uLilgIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSBwcm9ncmFtIFByb2dyYW0gbm9kZS5cbiAqIEByZXR1cm5zIERlY2xhcmF0aW9ucyBieSBsb2NhbCBuYW1lLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGNvbGxlY3REZWNsYXJhdGlvbnMoeyBib2R5OiBbXSwgc291cmNlVHlwZTogXCJtb2R1bGVcIiwgdHlwZTogXCJQcm9ncmFtXCIgfSBhcyBuZXZlcik7XG4gKiB2b2lkIGRlY2xhcmF0aW9ucztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjb2xsZWN0RGVjbGFyYXRpb25zKFxuICBwcm9ncmFtOiBFU1RyZWUuUHJvZ3JhbSxcbiAgc291cmNlQ29kZT86IFJ1bGUuUnVsZUNvbnRleHRbXCJzb3VyY2VDb2RlXCJdLFxuKTogTWFwPHN0cmluZywgRGVjbGFyYXRpb24+IHtcbiAgY29uc3QgZGVjbGFyYXRpb25zID0gcHJvZ3JhbS5ib2R5XG4gICAgLm1hcCgoc3RhdGVtZW50KSA9PiB0b0RlY2xhcmF0aW9uKHN0YXRlbWVudCwgc291cmNlQ29kZSkpXG4gICAgLmZpbHRlcihcbiAgICAgIChkZWNsYXJhdGlvbik6IGRlY2xhcmF0aW9uIGlzIERlY2xhcmF0aW9uID0+IGRlY2xhcmF0aW9uICE9PSB2b2lkIDAsXG4gICAgKTtcblxuICByZXR1cm4gbmV3IE1hcChcbiAgICBkZWNsYXJhdGlvbnMubWFwKChkZWNsYXJhdGlvbikgPT4gW2RlY2xhcmF0aW9uLmxvY2FsTmFtZSwgZGVjbGFyYXRpb25dKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgdG9wLWxldmVsIHN0YXRlbWVudCBpbnRvIGEgZGVjbGFyYXRpb24gd2hlbiBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gc3RhdGVtZW50IENhbmRpZGF0ZSBzdGF0ZW1lbnQuXG4gKiBAcmV0dXJucyBEZWNsYXJhdGlvbiB3aGVuIHN0YXRlbWVudCBtYXRjaGVzIHRoZSBydWxlIHNoYXBlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlY2xhcmF0aW9uID0gdG9EZWNsYXJhdGlvbih7IHR5cGU6IFwiRW1wdHlTdGF0ZW1lbnRcIiB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgZGVjbGFyYXRpb247XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdG9EZWNsYXJhdGlvbihcbiAgc3RhdGVtZW50OiBFU1RyZWUuUHJvZ3JhbVtcImJvZHlcIl1bbnVtYmVyXSxcbiAgc291cmNlQ29kZT86IFJ1bGUuUnVsZUNvbnRleHRbXCJzb3VyY2VDb2RlXCJdLFxuKTogRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoc3RhdGVtZW50LnR5cGUgIT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiIHx8IHN0YXRlbWVudC5raW5kICE9PSBcImNvbnN0XCIpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmICghaGFzUmFuZ2Uoc3RhdGVtZW50KSB8fCBzdGF0ZW1lbnQuZGVjbGFyYXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBjb25zdCBbZGVjbGFyYXRvcl0gPSBzdGF0ZW1lbnQuZGVjbGFyYXRpb25zO1xuICBpZiAoXG4gICAgZGVjbGFyYXRvciA9PT0gdm9pZCAwIHx8XG4gICAgZGVjbGFyYXRvci5pZC50eXBlICE9PSBcIklkZW50aWZpZXJcIiB8fFxuICAgICFoYXNSYW5nZShkZWNsYXJhdG9yLmlkKSB8fFxuICAgIGRlY2xhcmF0b3IuaW5pdCA9PT0gbnVsbCB8fFxuICAgIGRlY2xhcmF0b3IuaW5pdCA9PT0gdm9pZCAwIHx8XG4gICAgIWhhc1JhbmdlKGRlY2xhcmF0b3IuaW5pdCkgfHxcbiAgICAhaXNWaUZ1bmN0aW9uQ2FsbChkZWNsYXJhdG9yLmluaXQpXG4gICkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlY2xhcmF0aW9uSWRSYW5nZTogZGVjbGFyYXRvci5pZC5yYW5nZSxcbiAgICBpbml0aWFsaXplclJhbmdlOiBkZWNsYXJhdG9yLmluaXQucmFuZ2UsXG4gICAgbG9jYWxOYW1lOiBkZWNsYXJhdG9yLmlkLm5hbWUsXG4gICAgc3RhdGVtZW50UmFuZ2U6IGdldFJlbW92YWxSYW5nZShzdGF0ZW1lbnQsIHNvdXJjZUNvZGUpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlY2xhcmF0aW9uIHJlbW92YWwgcmFuZ2UsIGluY2x1ZGluZyBkaXJlY3RseSBhdHRhY2hlZCBjb21tZW50cy5cbiAqIEBwYXJhbSBzdGF0ZW1lbnQgVmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50LlxuICogQHBhcmFtIHNvdXJjZUNvZGUgU291cmNlIGNvZGUgd3JhcHBlciB3aGVuIGF2YWlsYWJsZS5cbiAqIEByZXR1cm5zIFN0YXRlbWVudCByYW5nZSBleHBhbmRlZCB0byBhdHRhY2hlZCBsZWFkaW5nIGNvbW1lbnRzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJhbmdlID0gZ2V0UmVtb3ZhbFJhbmdlKHsgcmFuZ2U6IFs1LCAxMF0sIHR5cGU6IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiIH0gYXMgbmV2ZXIpO1xuICogdm9pZCByYW5nZTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRSZW1vdmFsUmFuZ2UoXG4gIHN0YXRlbWVudDogRVNUcmVlLlZhcmlhYmxlRGVjbGFyYXRpb24gJiB7IHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdIH0sXG4gIHNvdXJjZUNvZGU/OiBSdWxlLlJ1bGVDb250ZXh0W1wic291cmNlQ29kZVwiXSxcbik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBzdGF0ZW1lbnRTdGFydCA9IHN0YXRlbWVudC5yYW5nZVswXTtcbiAgY29uc3QgY29tbWVudHNCZWZvcmUgPSBzb3VyY2VDb2RlPy5nZXRDb21tZW50c0JlZm9yZShzdGF0ZW1lbnQpID8/IFtdO1xuXG4gIGlmIChjb21tZW50c0JlZm9yZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RhdGVtZW50LnJhbmdlO1xuICB9XG5cbiAgbGV0IHJlbW92YWxTdGFydCA9IHN0YXRlbWVudFN0YXJ0O1xuICBsZXQgbmV4dFN0YXJ0ID0gc3RhdGVtZW50U3RhcnQ7XG5cbiAgZm9yIChjb25zdCBjb21tZW50IG9mIFsuLi5jb21tZW50c0JlZm9yZV0ucmV2ZXJzZSgpKSB7XG4gICAgY29uc3QgY29tbWVudFJhbmdlID0gY29tbWVudC5yYW5nZTtcblxuICAgIGlmIChjb21tZW50UmFuZ2UgPT09IHZvaWQgMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwVGV4dCA9IHNvdXJjZUNvZGU/LnRleHQuc2xpY2UoY29tbWVudFJhbmdlWzFdLCBuZXh0U3RhcnQpID8/IFwiXCI7XG4gICAgaWYgKCFpc0F0dGFjaGVkTGVhZGluZ0dhcChnYXBUZXh0KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmVtb3ZhbFN0YXJ0ID0gY29tbWVudFJhbmdlWzBdO1xuICAgIG5leHRTdGFydCA9IGNvbW1lbnRSYW5nZVswXTtcbiAgfVxuXG4gIHJldHVybiBbcmVtb3ZhbFN0YXJ0LCBzdGF0ZW1lbnQucmFuZ2VbMV1dO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHdoaXRlc3BhY2UgYmV0d2VlbiBhIGNvbW1lbnQgYW5kIGRlY2xhcmF0aW9uIGtlZXBzIHRoZW0gYXR0YWNoZWQuXG4gKiBAcGFyYW0gZ2FwVGV4dCBTb3VyY2UgdGV4dCBiZXR3ZWVuIGFkamFjZW50IG5vZGVzLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBnYXAgY29udGFpbnMgbm8gYmxhbmsgbGluZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBvayA9IGlzQXR0YWNoZWRMZWFkaW5nR2FwKFwiXFxuXCIpO1xuICogdm9pZCBvaztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc0F0dGFjaGVkTGVhZGluZ0dhcChnYXBUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAvXltcXHQgXFxyXFxuXSokL3UudGVzdChnYXBUZXh0KSAmJiAhLyhcXHI/XFxuKVtcXHQgXSooXFxyP1xcbikvdS50ZXN0KGdhcFRleHQpXG4gICk7XG59XG5cbmV4cG9ydCB7IGNvbGxlY3REZWNsYXJhdGlvbnMgfTtcbiJdfQ==
@@ -0,0 +1,66 @@
1
+ import type * as ESTree from "estree";
2
+ /** Type definition for rule data. */
3
+ type Range = [number, number];
4
+ /** Type definition for rule data. */
5
+ type RangeNode = ESTree.Node & {
6
+ /** Source range tuple for the node. */
7
+ range: Range;
8
+ };
9
+ /**
10
+ * Resolves the object literal returned from a mock factory.
11
+ * @param factoryExpression Factory expression from `vi.mock` or `vi.doMock`.
12
+ * @returns Returned object expression when present.
13
+ * @example
14
+ * ```typescript
15
+ * const result = getFactoryReturnObject({ type: "Identifier" } as never);
16
+ * void result;
17
+ * ```
18
+ */
19
+ declare function getFactoryReturnObject(factoryExpression: ESTree.Expression): ESTree.ObjectExpression | undefined;
20
+ /**
21
+ * Extracts a module specifier string from a mock call argument.
22
+ * @param moduleArgument First argument of `vi.mock` or `vi.doMock`.
23
+ * @returns String module specifier when available.
24
+ * @example
25
+ * ```typescript
26
+ * const specifier = getModuleSpecifier({ type: "Literal", value: "./x" } as never);
27
+ * void specifier;
28
+ * ```
29
+ */
30
+ declare function getModuleSpecifier(moduleArgument: ESTree.Expression): string | undefined;
31
+ /**
32
+ * Determines the newline sequence used in source text.
33
+ * @param sourceText Full source text.
34
+ * @returns Detected newline sequence.
35
+ * @example
36
+ * ```typescript
37
+ * const newline = getNewline("a\r\nb");
38
+ * void newline;
39
+ * ```
40
+ */
41
+ declare function getNewline(sourceText: string): "\n" | "\r\n";
42
+ /**
43
+ * Checks whether a node includes a numeric `range` tuple.
44
+ * @param node Node to inspect.
45
+ * @returns True when the node has a valid `range`.
46
+ * @example
47
+ * ```typescript
48
+ * const ok = hasRange({ range: [0, 1] } as never);
49
+ * void ok;
50
+ * ```
51
+ */
52
+ declare function hasRange(node: ESTree.Node): node is RangeNode;
53
+ /**
54
+ * Returns true when an expression is a `vi.fn(...)` call.
55
+ * @param expression Expression to inspect.
56
+ * @returns True when the expression is a `vi.fn` call.
57
+ * @example
58
+ * ```typescript
59
+ * const ok = isViFunctionCall(null);
60
+ * void ok;
61
+ * ```
62
+ */
63
+ declare function isViFunctionCall(expression: ESTree.Expression | null): boolean;
64
+ export type { Range };
65
+ export { getFactoryReturnObject, getModuleSpecifier, getNewline, hasRange, isViFunctionCall, };
66
+ //# sourceMappingURL=match-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-helpers.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/match-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAQtC,qCAAqC;AACrC,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9B,qCAAqC;AACrC,KAAK,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG;IAC7B,uCAAuC;IACvC,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,iBAAS,sBAAsB,CAC7B,iBAAiB,EAAE,MAAM,CAAC,UAAU,GACnC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAmBrC;AAED;;;;;;;;;GASG;AACH,iBAAS,kBAAkB,CACzB,cAAc,EAAE,MAAM,CAAC,UAAU,GAChC,MAAM,GAAG,SAAS,CAYpB;AAED;;;;;;;;;GASG;AACH,iBAAS,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAErD;AAED;;;;;;;;;GASG;AACH,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,SAAS,CAQtD;AAED;;;;;;;;;GASG;AACH,iBAAS,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,OAAO,CAevE;AAED,YAAY,EAAE,KAAK,EAAE,CAAC;AACtB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,gBAAgB,GACjB,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Resolves the object literal returned from a mock factory.
3
+ * @param factoryExpression Factory expression from `vi.mock` or `vi.doMock`.
4
+ * @returns Returned object expression when present.
5
+ * @example
6
+ * ```typescript
7
+ * const result = getFactoryReturnObject({ type: "Identifier" } as never);
8
+ * void result;
9
+ * ```
10
+ */
11
+ function getFactoryReturnObject(factoryExpression) {
12
+ if (factoryExpression.type !== "ArrowFunctionExpression") {
13
+ return void 0;
14
+ }
15
+ const { body } = factoryExpression;
16
+ if (body.type === "ObjectExpression") {
17
+ return body;
18
+ }
19
+ if (body.type !== "BlockStatement") {
20
+ return void 0;
21
+ }
22
+ const returnStatement = body.body.find((statement) => statement.type === "ReturnStatement");
23
+ const returnArgument = returnStatement?.argument;
24
+ return returnArgument?.type === "ObjectExpression" ? returnArgument : void 0;
25
+ }
26
+ /**
27
+ * Extracts a module specifier string from a mock call argument.
28
+ * @param moduleArgument First argument of `vi.mock` or `vi.doMock`.
29
+ * @returns String module specifier when available.
30
+ * @example
31
+ * ```typescript
32
+ * const specifier = getModuleSpecifier({ type: "Literal", value: "./x" } as never);
33
+ * void specifier;
34
+ * ```
35
+ */
36
+ function getModuleSpecifier(moduleArgument) {
37
+ if (moduleArgument.type === "ImportExpression") {
38
+ const { source } = moduleArgument;
39
+ return source.type === "Literal" && typeof source.value === "string"
40
+ ? source.value
41
+ : void 0;
42
+ }
43
+ return moduleArgument.type === "Literal" &&
44
+ typeof moduleArgument.value === "string"
45
+ ? moduleArgument.value
46
+ : void 0;
47
+ }
48
+ /**
49
+ * Determines the newline sequence used in source text.
50
+ * @param sourceText Full source text.
51
+ * @returns Detected newline sequence.
52
+ * @example
53
+ * ```typescript
54
+ * const newline = getNewline("a\r\nb");
55
+ * void newline;
56
+ * ```
57
+ */
58
+ function getNewline(sourceText) {
59
+ return sourceText.includes("\r\n") ? "\r\n" : "\n";
60
+ }
61
+ /**
62
+ * Checks whether a node includes a numeric `range` tuple.
63
+ * @param node Node to inspect.
64
+ * @returns True when the node has a valid `range`.
65
+ * @example
66
+ * ```typescript
67
+ * const ok = hasRange({ range: [0, 1] } as never);
68
+ * void ok;
69
+ * ```
70
+ */
71
+ function hasRange(node) {
72
+ const rangeValue = node.range;
73
+ return (Array.isArray(rangeValue) &&
74
+ rangeValue.length === 2 &&
75
+ typeof rangeValue[0] === "number" &&
76
+ typeof rangeValue[1] === "number");
77
+ }
78
+ /**
79
+ * Returns true when an expression is a `vi.fn(...)` call.
80
+ * @param expression Expression to inspect.
81
+ * @returns True when the expression is a `vi.fn` call.
82
+ * @example
83
+ * ```typescript
84
+ * const ok = isViFunctionCall(null);
85
+ * void ok;
86
+ * ```
87
+ */
88
+ function isViFunctionCall(expression) {
89
+ if (expression?.type !== "CallExpression") {
90
+ return false;
91
+ }
92
+ if (expression.callee.type !== "MemberExpression") {
93
+ return false;
94
+ }
95
+ const { object, property } = expression.callee;
96
+ return (object.type === "Identifier" &&
97
+ object.name === "vi" &&
98
+ property.type === "Identifier" &&
99
+ property.name === "fn");
100
+ }
101
+ export { getFactoryReturnObject, getModuleSpecifier, getNewline, hasRange, isViFunctionCall, };
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L21hdGNoLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsc0JBQXNCLENBQzdCLGlCQUFvQztJQUVwQyxJQUFJLGlCQUFpQixDQUFDLElBQUksS0FBSyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3pELE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztJQUNuQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztRQUNuQyxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDcEMsQ0FBQyxTQUFTLEVBQXVDLEVBQUUsQ0FDakQsU0FBUyxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FDdkMsQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLGVBQWUsRUFBRSxRQUFRLENBQUM7SUFDakQsT0FBTyxjQUFjLEVBQUUsSUFBSSxLQUFLLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixjQUFpQztJQUVqQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDbEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ2QsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sY0FBYyxDQUFDLElBQUksS0FBSyxTQUFTO1FBQ3RDLE9BQU8sY0FBYyxDQUFDLEtBQUssS0FBSyxRQUFRO1FBQ3hDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSztRQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxVQUFVLENBQUMsVUFBa0I7SUFDcEMsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxRQUFRLENBQUMsSUFBaUI7SUFDakMsTUFBTSxVQUFVLEdBQUksSUFBc0MsQ0FBQyxLQUFLLENBQUM7SUFDakUsT0FBTyxDQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3pCLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUN2QixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO1FBQ2pDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFVBQW9DO0lBQzVELElBQUksVUFBVSxFQUFFLElBQUksS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUNsRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDL0MsT0FBTyxDQUNMLE1BQU0sQ0FBQyxJQUFJLEtBQUssWUFBWTtRQUM1QixNQUFNLENBQUMsSUFBSSxLQUFLLElBQUk7UUFDcEIsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZO1FBQzlCLFFBQVEsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUN2QixDQUFDO0FBQ0osQ0FBQztBQUdELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixRQUFRLEVBQ1IsZ0JBQWdCLEdBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEVTVHJlZSBmcm9tIFwiZXN0cmVlXCI7XG5cbi8qKiBUeXBlIGRlZmluaXRpb24gZm9yIHJ1bGUgZGF0YS4gKi9cbmludGVyZmFjZSBPcHRpb25hbFJhbmdlRmllbGQge1xuICAvKiogUG90ZW50aWFsIHJhbmdlIHBheWxvYWQgZnJvbSB1bmtub3duIG5vZGUtbGlrZSB2YWx1ZXMuICovXG4gIHJhbmdlPzogdW5rbm93bjtcbn1cblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xudHlwZSBSYW5nZSA9IFtudW1iZXIsIG51bWJlcl07XG5cbi8qKiBUeXBlIGRlZmluaXRpb24gZm9yIHJ1bGUgZGF0YS4gKi9cbnR5cGUgUmFuZ2VOb2RlID0gRVNUcmVlLk5vZGUgJiB7XG4gIC8qKiBTb3VyY2UgcmFuZ2UgdHVwbGUgZm9yIHRoZSBub2RlLiAqL1xuICByYW5nZTogUmFuZ2U7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBvYmplY3QgbGl0ZXJhbCByZXR1cm5lZCBmcm9tIGEgbW9jayBmYWN0b3J5LlxuICogQHBhcmFtIGZhY3RvcnlFeHByZXNzaW9uIEZhY3RvcnkgZXhwcmVzc2lvbiBmcm9tIGB2aS5tb2NrYCBvciBgdmkuZG9Nb2NrYC5cbiAqIEByZXR1cm5zIFJldHVybmVkIG9iamVjdCBleHByZXNzaW9uIHdoZW4gcHJlc2VudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBnZXRGYWN0b3J5UmV0dXJuT2JqZWN0KHsgdHlwZTogXCJJZGVudGlmaWVyXCIgfSBhcyBuZXZlcik7XG4gKiB2b2lkIHJlc3VsdDtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRGYWN0b3J5UmV0dXJuT2JqZWN0KFxuICBmYWN0b3J5RXhwcmVzc2lvbjogRVNUcmVlLkV4cHJlc3Npb24sXG4pOiBFU1RyZWUuT2JqZWN0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChmYWN0b3J5RXhwcmVzc2lvbi50eXBlICE9PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgeyBib2R5IH0gPSBmYWN0b3J5RXhwcmVzc2lvbjtcbiAgaWYgKGJvZHkudHlwZSA9PT0gXCJPYmplY3RFeHByZXNzaW9uXCIpIHtcbiAgICByZXR1cm4gYm9keTtcbiAgfVxuICBpZiAoYm9keS50eXBlICE9PSBcIkJsb2NrU3RhdGVtZW50XCIpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgcmV0dXJuU3RhdGVtZW50ID0gYm9keS5ib2R5LmZpbmQoXG4gICAgKHN0YXRlbWVudCk6IHN0YXRlbWVudCBpcyBFU1RyZWUuUmV0dXJuU3RhdGVtZW50ID0+XG4gICAgICBzdGF0ZW1lbnQudHlwZSA9PT0gXCJSZXR1cm5TdGF0ZW1lbnRcIixcbiAgKTtcbiAgY29uc3QgcmV0dXJuQXJndW1lbnQgPSByZXR1cm5TdGF0ZW1lbnQ/LmFyZ3VtZW50O1xuICByZXR1cm4gcmV0dXJuQXJndW1lbnQ/LnR5cGUgPT09IFwiT2JqZWN0RXhwcmVzc2lvblwiID8gcmV0dXJuQXJndW1lbnQgOiB2b2lkIDA7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBtb2R1bGUgc3BlY2lmaWVyIHN0cmluZyBmcm9tIGEgbW9jayBjYWxsIGFyZ3VtZW50LlxuICogQHBhcmFtIG1vZHVsZUFyZ3VtZW50IEZpcnN0IGFyZ3VtZW50IG9mIGB2aS5tb2NrYCBvciBgdmkuZG9Nb2NrYC5cbiAqIEByZXR1cm5zIFN0cmluZyBtb2R1bGUgc3BlY2lmaWVyIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNwZWNpZmllciA9IGdldE1vZHVsZVNwZWNpZmllcih7IHR5cGU6IFwiTGl0ZXJhbFwiLCB2YWx1ZTogXCIuL3hcIiB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgc3BlY2lmaWVyO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldE1vZHVsZVNwZWNpZmllcihcbiAgbW9kdWxlQXJndW1lbnQ6IEVTVHJlZS5FeHByZXNzaW9uLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG1vZHVsZUFyZ3VtZW50LnR5cGUgPT09IFwiSW1wb3J0RXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgeyBzb3VyY2UgfSA9IG1vZHVsZUFyZ3VtZW50O1xuICAgIHJldHVybiBzb3VyY2UudHlwZSA9PT0gXCJMaXRlcmFsXCIgJiYgdHlwZW9mIHNvdXJjZS52YWx1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBzb3VyY2UudmFsdWVcbiAgICAgIDogdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIG1vZHVsZUFyZ3VtZW50LnR5cGUgPT09IFwiTGl0ZXJhbFwiICYmXG4gICAgdHlwZW9mIG1vZHVsZUFyZ3VtZW50LnZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgPyBtb2R1bGVBcmd1bWVudC52YWx1ZVxuICAgIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIG5ld2xpbmUgc2VxdWVuY2UgdXNlZCBpbiBzb3VyY2UgdGV4dC5cbiAqIEBwYXJhbSBzb3VyY2VUZXh0IEZ1bGwgc291cmNlIHRleHQuXG4gKiBAcmV0dXJucyBEZXRlY3RlZCBuZXdsaW5lIHNlcXVlbmNlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5ld2xpbmUgPSBnZXROZXdsaW5lKFwiYVxcclxcbmJcIik7XG4gKiB2b2lkIG5ld2xpbmU7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0TmV3bGluZShzb3VyY2VUZXh0OiBzdHJpbmcpOiBcIlxcblwiIHwgXCJcXHJcXG5cIiB7XG4gIHJldHVybiBzb3VyY2VUZXh0LmluY2x1ZGVzKFwiXFxyXFxuXCIpID8gXCJcXHJcXG5cIiA6IFwiXFxuXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGluY2x1ZGVzIGEgbnVtZXJpYyBgcmFuZ2VgIHR1cGxlLlxuICogQHBhcmFtIG5vZGUgTm9kZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBub2RlIGhhcyBhIHZhbGlkIGByYW5nZWAuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgb2sgPSBoYXNSYW5nZSh7IHJhbmdlOiBbMCwgMV0gfSBhcyBuZXZlcik7XG4gKiB2b2lkIG9rO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGhhc1JhbmdlKG5vZGU6IEVTVHJlZS5Ob2RlKTogbm9kZSBpcyBSYW5nZU5vZGUge1xuICBjb25zdCByYW5nZVZhbHVlID0gKG5vZGUgYXMgdW5rbm93biBhcyBPcHRpb25hbFJhbmdlRmllbGQpLnJhbmdlO1xuICByZXR1cm4gKFxuICAgIEFycmF5LmlzQXJyYXkocmFuZ2VWYWx1ZSkgJiZcbiAgICByYW5nZVZhbHVlLmxlbmd0aCA9PT0gMiAmJlxuICAgIHR5cGVvZiByYW5nZVZhbHVlWzBdID09PSBcIm51bWJlclwiICYmXG4gICAgdHlwZW9mIHJhbmdlVmFsdWVbMV0gPT09IFwibnVtYmVyXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiBhbiBleHByZXNzaW9uIGlzIGEgYHZpLmZuKC4uLilgIGNhbGwuXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBFeHByZXNzaW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgYSBgdmkuZm5gIGNhbGwuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgb2sgPSBpc1ZpRnVuY3Rpb25DYWxsKG51bGwpO1xuICogdm9pZCBvaztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc1ZpRnVuY3Rpb25DYWxsKGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgbnVsbCk6IGJvb2xlYW4ge1xuICBpZiAoZXhwcmVzc2lvbj8udHlwZSAhPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChleHByZXNzaW9uLmNhbGxlZS50eXBlICE9PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHsgb2JqZWN0LCBwcm9wZXJ0eSB9ID0gZXhwcmVzc2lvbi5jYWxsZWU7XG4gIHJldHVybiAoXG4gICAgb2JqZWN0LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgb2JqZWN0Lm5hbWUgPT09IFwidmlcIiAmJlxuICAgIHByb3BlcnR5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgcHJvcGVydHkubmFtZSA9PT0gXCJmblwiXG4gICk7XG59XG5cbmV4cG9ydCB0eXBlIHsgUmFuZ2UgfTtcbmV4cG9ydCB7XG4gIGdldEZhY3RvcnlSZXR1cm5PYmplY3QsXG4gIGdldE1vZHVsZVNwZWNpZmllcixcbiAgZ2V0TmV3bGluZSxcbiAgaGFzUmFuZ2UsXG4gIGlzVmlGdW5jdGlvbkNhbGwsXG59O1xuIl19
@@ -0,0 +1,17 @@
1
+ import type * as ESTree from "estree";
2
+ import type { ImportPlan } from "./types";
3
+ /**
4
+ * Resolves whether imports should be updated in place or inserted.
5
+ * @param program Program node to inspect.
6
+ * @param moduleSpecifier Target module path.
7
+ * @param names Import names that must exist.
8
+ * @returns Insert or update plan for the import section.
9
+ * @example
10
+ * ```typescript
11
+ * const plan = resolveImportPlan({ body: [], sourceType: "module", type: "Program" } as never, "./x", ["a"]);
12
+ * void plan;
13
+ * ```
14
+ */
15
+ declare function resolveImportPlan(program: ESTree.Program, moduleSpecifier: string, names: string[]): ImportPlan;
16
+ export { resolveImportPlan };
17
+ //# sourceMappingURL=match-imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-imports.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/match-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAwK1C;;;;;;;;;;;GAWG;AACH,iBAAS,iBAAiB,CACxB,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,EAAE,GACd,UAAU,CASZ;AAqBD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,156 @@
1
+ import { hasRange } from "./match-helpers";
2
+ /**
3
+ * Builds an import plan for insertion mode.
4
+ * @param moduleSpecifier Target module path.
5
+ * @param names Names to import.
6
+ * @param afterRange Range to insert after.
7
+ * @returns Insert plan payload.
8
+ * @example
9
+ * ```typescript
10
+ * const plan = createInsertPlan("./x", ["a"], [0, 1]);
11
+ * void plan;
12
+ * ```
13
+ */
14
+ function createInsertPlan(moduleSpecifier, names, afterRange) {
15
+ return afterRange === void 0
16
+ ? { insert: {}, moduleSpecifier, names }
17
+ : { insert: { afterRange }, moduleSpecifier, names };
18
+ }
19
+ /**
20
+ * Builds an import plan for update mode.
21
+ * @param statement Existing import declaration.
22
+ * @param moduleSpecifier Target module path.
23
+ * @param names Names to import.
24
+ * @returns Update plan payload.
25
+ * @example
26
+ * ```typescript
27
+ * const plan = createUpdatePlan({ specifiers: [], source: { type: "Literal", value: "./x" }, type: "ImportDeclaration", range: [0, 1] } as never, "./x", ["a"]);
28
+ * void plan;
29
+ * ```
30
+ */
31
+ function createUpdatePlan(statement, moduleSpecifier, names) {
32
+ if (hasNamespaceImport(statement)) {
33
+ return createInsertPlan(moduleSpecifier, names, statement.range);
34
+ }
35
+ const defaultImportName = getDefaultImportName(statement);
36
+ const baseUpdate = {
37
+ existingNamedImports: getNamedImports(statement),
38
+ range: statement.range,
39
+ };
40
+ const update = defaultImportName === void 0
41
+ ? baseUpdate
42
+ : { ...baseUpdate, defaultImportName };
43
+ return {
44
+ moduleSpecifier,
45
+ names,
46
+ update,
47
+ };
48
+ }
49
+ /**
50
+ * Returns the default import local name.
51
+ * @param statement Import declaration.
52
+ * @returns Default local name when present.
53
+ * @example
54
+ * ```typescript
55
+ * const localName = getDefaultImportName({ specifiers: [], type: "ImportDeclaration" } as never);
56
+ * void localName;
57
+ * ```
58
+ */
59
+ function getDefaultImportName(statement) {
60
+ const defaultSpecifier = statement.specifiers.find((specifier) => specifier.type === "ImportDefaultSpecifier");
61
+ return defaultSpecifier?.local.name;
62
+ }
63
+ /**
64
+ * Filters top-level import declarations that include a `range`.
65
+ * @param program Program node.
66
+ * @returns Import declarations with stable ranges.
67
+ * @example
68
+ * ```typescript
69
+ * const imports = getImportDeclarations({ body: [], sourceType: "module", type: "Program" } as never);
70
+ * void imports;
71
+ * ```
72
+ */
73
+ function getImportDeclarations(program) {
74
+ return program.body.filter((statement) => statement.type === "ImportDeclaration" && hasRange(statement));
75
+ }
76
+ /**
77
+ * Returns all named imports from a declaration.
78
+ * @param statement Import declaration.
79
+ * @returns Named import identifiers.
80
+ * @example
81
+ * ```typescript
82
+ * const named = getNamedImports({ specifiers: [], type: "ImportDeclaration" } as never);
83
+ * void named;
84
+ * ```
85
+ */
86
+ function getNamedImports(statement) {
87
+ return statement.specifiers.flatMap((specifier) => {
88
+ const importedName = toImportedName(specifier);
89
+ return importedName === void 0 ? [] : [importedName];
90
+ });
91
+ }
92
+ /**
93
+ * Checks whether an import includes a namespace specifier.
94
+ * @param statement Import declaration.
95
+ * @returns True when declaration includes `* as x` form.
96
+ * @example
97
+ * ```typescript
98
+ * const hasNamespace = hasNamespaceImport({ specifiers: [], type: "ImportDeclaration" } as never);
99
+ * void hasNamespace;
100
+ * ```
101
+ */
102
+ function hasNamespaceImport(statement) {
103
+ return statement.specifiers.some((specifier) => specifier.type === "ImportNamespaceSpecifier");
104
+ }
105
+ /**
106
+ * Checks whether an import declaration matches the mocked module.
107
+ * @param statement Import declaration candidate.
108
+ * @param moduleSpecifier Expected module path.
109
+ * @returns True when declaration targets the same module.
110
+ * @example
111
+ * ```typescript
112
+ * const matched = isMatchingImport({ source: { type: "Literal", value: "./x" }, type: "ImportDeclaration" } as never, "./x");
113
+ * void matched;
114
+ * ```
115
+ */
116
+ function isMatchingImport(statement, moduleSpecifier) {
117
+ const sourceValue = statement.source.value;
118
+ return typeof sourceValue === "string" && sourceValue === moduleSpecifier;
119
+ }
120
+ /**
121
+ * Resolves whether imports should be updated in place or inserted.
122
+ * @param program Program node to inspect.
123
+ * @param moduleSpecifier Target module path.
124
+ * @param names Import names that must exist.
125
+ * @returns Insert or update plan for the import section.
126
+ * @example
127
+ * ```typescript
128
+ * const plan = resolveImportPlan({ body: [], sourceType: "module", type: "Program" } as never, "./x", ["a"]);
129
+ * void plan;
130
+ * ```
131
+ */
132
+ function resolveImportPlan(program, moduleSpecifier, names) {
133
+ const imports = getImportDeclarations(program);
134
+ const existingImport = imports.find((statement) => isMatchingImport(statement, moduleSpecifier));
135
+ return existingImport === void 0
136
+ ? createInsertPlan(moduleSpecifier, names, imports.at(-1)?.range)
137
+ : createUpdatePlan(existingImport, moduleSpecifier, names);
138
+ }
139
+ /**
140
+ * Extracts imported identifier name from one specifier.
141
+ * @param specifier Import clause entry.
142
+ * @returns Imported identifier name.
143
+ * @example
144
+ * ```typescript
145
+ * const imported = toImportedName({ type: "ImportSpecifier", imported: { type: "Identifier", name: "x" } } as never);
146
+ * void imported;
147
+ * ```
148
+ */
149
+ function toImportedName(specifier) {
150
+ return specifier.type === "ImportSpecifier" &&
151
+ specifier.imported.type === "Identifier"
152
+ ? specifier.imported.name
153
+ : void 0;
154
+ }
155
+ export { resolveImportPlan };
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtaW1wb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L21hdGNoLWltcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZTNDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsZUFBdUIsRUFDdkIsS0FBZSxFQUNmLFVBQTZCO0lBRTdCLE9BQU8sVUFBVSxLQUFLLEtBQUssQ0FBQztRQUMxQixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUU7UUFDeEMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsZ0JBQWdCLENBQ3ZCLFNBQWtDLEVBQ2xDLGVBQXVCLEVBQ3ZCLEtBQWU7SUFFZixJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRztRQUNqQixvQkFBb0IsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQ2hELEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztLQUN2QixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQ1YsaUJBQWlCLEtBQUssS0FBSyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxVQUFVO1FBQ1osQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztJQUUzQyxPQUFPO1FBQ0wsZUFBZTtRQUNmLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixTQUFtQztJQUVuQyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUNoRCxDQUFDLFNBQVMsRUFBOEMsRUFBRSxDQUN4RCxTQUFTLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUM5QyxDQUFDO0lBQ0YsT0FBTyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixPQUF1QjtJQUV2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUN4QixDQUFDLFNBQVMsRUFBd0MsRUFBRSxDQUNsRCxTQUFTLENBQUMsSUFBSSxLQUFLLG1CQUFtQixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FDaEUsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxTQUFtQztJQUMxRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFDaEQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sWUFBWSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxTQUFtQztJQUM3RCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUM5QixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSywwQkFBMEIsQ0FDN0QsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsU0FBbUMsRUFDbkMsZUFBdUI7SUFFdkIsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0MsT0FBTyxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxLQUFLLGVBQWUsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixPQUF1QixFQUN2QixlQUF1QixFQUN2QixLQUFlO0lBRWYsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ2hELGdCQUFnQixDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FDN0MsQ0FBQztJQUVGLE9BQU8sY0FBYyxLQUFLLEtBQUssQ0FBQztRQUM5QixDQUFDLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGNBQWMsQ0FDckIsU0FBeUQ7SUFFekQsT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLGlCQUFpQjtRQUN6QyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZO1FBQ3hDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUk7UUFDekIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBFU1RyZWUgZnJvbSBcImVzdHJlZVwiO1xuXG5pbXBvcnQgdHlwZSB7IFJhbmdlIH0gZnJvbSBcIi4vbWF0Y2gtaGVscGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBJbXBvcnRQbGFuIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgaGFzUmFuZ2UgfSBmcm9tIFwiLi9tYXRjaC1oZWxwZXJzXCI7XG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGVjbGFyYXRpb24gPSB7fSBhcyBSYW5nZWRJbXBvcnREZWNsYXJhdGlvbjtcbiAqIHZvaWQgZGVjbGFyYXRpb247XG4gKiBgYGBcbiAqL1xuaW50ZXJmYWNlIFJhbmdlZEltcG9ydERlY2xhcmF0aW9uIGV4dGVuZHMgRVNUcmVlLkltcG9ydERlY2xhcmF0aW9uIHtcbiAgLyoqIEltcG9ydCBkZWNsYXJhdGlvbiBzb3VyY2UgcmFuZ2UuICovXG4gIHJhbmdlOiBSYW5nZTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gaW1wb3J0IHBsYW4gZm9yIGluc2VydGlvbiBtb2RlLlxuICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBUYXJnZXQgbW9kdWxlIHBhdGguXG4gKiBAcGFyYW0gbmFtZXMgTmFtZXMgdG8gaW1wb3J0LlxuICogQHBhcmFtIGFmdGVyUmFuZ2UgUmFuZ2UgdG8gaW5zZXJ0IGFmdGVyLlxuICogQHJldHVybnMgSW5zZXJ0IHBsYW4gcGF5bG9hZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwbGFuID0gY3JlYXRlSW5zZXJ0UGxhbihcIi4veFwiLCBbXCJhXCJdLCBbMCwgMV0pO1xuICogdm9pZCBwbGFuO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc2VydFBsYW4oXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuICBuYW1lczogc3RyaW5nW10sXG4gIGFmdGVyUmFuZ2U6IFJhbmdlIHwgdW5kZWZpbmVkLFxuKTogSW1wb3J0UGxhbiB7XG4gIHJldHVybiBhZnRlclJhbmdlID09PSB2b2lkIDBcbiAgICA/IHsgaW5zZXJ0OiB7fSwgbW9kdWxlU3BlY2lmaWVyLCBuYW1lcyB9XG4gICAgOiB7IGluc2VydDogeyBhZnRlclJhbmdlIH0sIG1vZHVsZVNwZWNpZmllciwgbmFtZXMgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gaW1wb3J0IHBsYW4gZm9yIHVwZGF0ZSBtb2RlLlxuICogQHBhcmFtIHN0YXRlbWVudCBFeGlzdGluZyBpbXBvcnQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyIFRhcmdldCBtb2R1bGUgcGF0aC5cbiAqIEBwYXJhbSBuYW1lcyBOYW1lcyB0byBpbXBvcnQuXG4gKiBAcmV0dXJucyBVcGRhdGUgcGxhbiBwYXlsb2FkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHBsYW4gPSBjcmVhdGVVcGRhdGVQbGFuKHsgc3BlY2lmaWVyczogW10sIHNvdXJjZTogeyB0eXBlOiBcIkxpdGVyYWxcIiwgdmFsdWU6IFwiLi94XCIgfSwgdHlwZTogXCJJbXBvcnREZWNsYXJhdGlvblwiLCByYW5nZTogWzAsIDFdIH0gYXMgbmV2ZXIsIFwiLi94XCIsIFtcImFcIl0pO1xuICogdm9pZCBwbGFuO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZVBsYW4oXG4gIHN0YXRlbWVudDogUmFuZ2VkSW1wb3J0RGVjbGFyYXRpb24sXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuICBuYW1lczogc3RyaW5nW10sXG4pOiBJbXBvcnRQbGFuIHtcbiAgaWYgKGhhc05hbWVzcGFjZUltcG9ydChzdGF0ZW1lbnQpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc2VydFBsYW4obW9kdWxlU3BlY2lmaWVyLCBuYW1lcywgc3RhdGVtZW50LnJhbmdlKTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRJbXBvcnROYW1lID0gZ2V0RGVmYXVsdEltcG9ydE5hbWUoc3RhdGVtZW50KTtcbiAgY29uc3QgYmFzZVVwZGF0ZSA9IHtcbiAgICBleGlzdGluZ05hbWVkSW1wb3J0czogZ2V0TmFtZWRJbXBvcnRzKHN0YXRlbWVudCksXG4gICAgcmFuZ2U6IHN0YXRlbWVudC5yYW5nZSxcbiAgfTtcbiAgY29uc3QgdXBkYXRlID1cbiAgICBkZWZhdWx0SW1wb3J0TmFtZSA9PT0gdm9pZCAwXG4gICAgICA/IGJhc2VVcGRhdGVcbiAgICAgIDogeyAuLi5iYXNlVXBkYXRlLCBkZWZhdWx0SW1wb3J0TmFtZSB9O1xuXG4gIHJldHVybiB7XG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIG5hbWVzLFxuICAgIHVwZGF0ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGltcG9ydCBsb2NhbCBuYW1lLlxuICogQHBhcmFtIHN0YXRlbWVudCBJbXBvcnQgZGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyBEZWZhdWx0IGxvY2FsIG5hbWUgd2hlbiBwcmVzZW50LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGxvY2FsTmFtZSA9IGdldERlZmF1bHRJbXBvcnROYW1lKHsgc3BlY2lmaWVyczogW10sIHR5cGU6IFwiSW1wb3J0RGVjbGFyYXRpb25cIiB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgbG9jYWxOYW1lO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRJbXBvcnROYW1lKFxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5JbXBvcnREZWNsYXJhdGlvbixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlZmF1bHRTcGVjaWZpZXIgPSBzdGF0ZW1lbnQuc3BlY2lmaWVycy5maW5kKFxuICAgIChzcGVjaWZpZXIpOiBzcGVjaWZpZXIgaXMgRVNUcmVlLkltcG9ydERlZmF1bHRTcGVjaWZpZXIgPT5cbiAgICAgIHNwZWNpZmllci50eXBlID09PSBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIixcbiAgKTtcbiAgcmV0dXJuIGRlZmF1bHRTcGVjaWZpZXI/LmxvY2FsLm5hbWU7XG59XG5cbi8qKlxuICogRmlsdGVycyB0b3AtbGV2ZWwgaW1wb3J0IGRlY2xhcmF0aW9ucyB0aGF0IGluY2x1ZGUgYSBgcmFuZ2VgLlxuICogQHBhcmFtIHByb2dyYW0gUHJvZ3JhbSBub2RlLlxuICogQHJldHVybnMgSW1wb3J0IGRlY2xhcmF0aW9ucyB3aXRoIHN0YWJsZSByYW5nZXMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaW1wb3J0cyA9IGdldEltcG9ydERlY2xhcmF0aW9ucyh7IGJvZHk6IFtdLCBzb3VyY2VUeXBlOiBcIm1vZHVsZVwiLCB0eXBlOiBcIlByb2dyYW1cIiB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgaW1wb3J0cztcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRJbXBvcnREZWNsYXJhdGlvbnMoXG4gIHByb2dyYW06IEVTVHJlZS5Qcm9ncmFtLFxuKTogUmFuZ2VkSW1wb3J0RGVjbGFyYXRpb25bXSB7XG4gIHJldHVybiBwcm9ncmFtLmJvZHkuZmlsdGVyKFxuICAgIChzdGF0ZW1lbnQpOiBzdGF0ZW1lbnQgaXMgUmFuZ2VkSW1wb3J0RGVjbGFyYXRpb24gPT5cbiAgICAgIHN0YXRlbWVudC50eXBlID09PSBcIkltcG9ydERlY2xhcmF0aW9uXCIgJiYgaGFzUmFuZ2Uoc3RhdGVtZW50KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBuYW1lZCBpbXBvcnRzIGZyb20gYSBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSBzdGF0ZW1lbnQgSW1wb3J0IGRlY2xhcmF0aW9uLlxuICogQHJldHVybnMgTmFtZWQgaW1wb3J0IGlkZW50aWZpZXJzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5hbWVkID0gZ2V0TmFtZWRJbXBvcnRzKHsgc3BlY2lmaWVyczogW10sIHR5cGU6IFwiSW1wb3J0RGVjbGFyYXRpb25cIiB9IGFzIG5ldmVyKTtcbiAqIHZvaWQgbmFtZWQ7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0TmFtZWRJbXBvcnRzKHN0YXRlbWVudDogRVNUcmVlLkltcG9ydERlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gc3RhdGVtZW50LnNwZWNpZmllcnMuZmxhdE1hcCgoc3BlY2lmaWVyKSA9PiB7XG4gICAgY29uc3QgaW1wb3J0ZWROYW1lID0gdG9JbXBvcnRlZE5hbWUoc3BlY2lmaWVyKTtcbiAgICByZXR1cm4gaW1wb3J0ZWROYW1lID09PSB2b2lkIDAgPyBbXSA6IFtpbXBvcnRlZE5hbWVdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBpbXBvcnQgaW5jbHVkZXMgYSBuYW1lc3BhY2Ugc3BlY2lmaWVyLlxuICogQHBhcmFtIHN0YXRlbWVudCBJbXBvcnQgZGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gZGVjbGFyYXRpb24gaW5jbHVkZXMgYCogYXMgeGAgZm9ybS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBoYXNOYW1lc3BhY2UgPSBoYXNOYW1lc3BhY2VJbXBvcnQoeyBzcGVjaWZpZXJzOiBbXSwgdHlwZTogXCJJbXBvcnREZWNsYXJhdGlvblwiIH0gYXMgbmV2ZXIpO1xuICogdm9pZCBoYXNOYW1lc3BhY2U7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gaGFzTmFtZXNwYWNlSW1wb3J0KHN0YXRlbWVudDogRVNUcmVlLkltcG9ydERlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBzdGF0ZW1lbnQuc3BlY2lmaWVycy5zb21lKFxuICAgIChzcGVjaWZpZXIpID0+IHNwZWNpZmllci50eXBlID09PSBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiLFxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGltcG9ydCBkZWNsYXJhdGlvbiBtYXRjaGVzIHRoZSBtb2NrZWQgbW9kdWxlLlxuICogQHBhcmFtIHN0YXRlbWVudCBJbXBvcnQgZGVjbGFyYXRpb24gY2FuZGlkYXRlLlxuICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBFeHBlY3RlZCBtb2R1bGUgcGF0aC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiBkZWNsYXJhdGlvbiB0YXJnZXRzIHRoZSBzYW1lIG1vZHVsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtYXRjaGVkID0gaXNNYXRjaGluZ0ltcG9ydCh7IHNvdXJjZTogeyB0eXBlOiBcIkxpdGVyYWxcIiwgdmFsdWU6IFwiLi94XCIgfSwgdHlwZTogXCJJbXBvcnREZWNsYXJhdGlvblwiIH0gYXMgbmV2ZXIsIFwiLi94XCIpO1xuICogdm9pZCBtYXRjaGVkO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGlzTWF0Y2hpbmdJbXBvcnQoXG4gIHN0YXRlbWVudDogRVNUcmVlLkltcG9ydERlY2xhcmF0aW9uLFxuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2VWYWx1ZSA9IHN0YXRlbWVudC5zb3VyY2UudmFsdWU7XG4gIHJldHVybiB0eXBlb2Ygc291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgc291cmNlVmFsdWUgPT09IG1vZHVsZVNwZWNpZmllcjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3aGV0aGVyIGltcG9ydHMgc2hvdWxkIGJlIHVwZGF0ZWQgaW4gcGxhY2Ugb3IgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gcHJvZ3JhbSBQcm9ncmFtIG5vZGUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSBtb2R1bGVTcGVjaWZpZXIgVGFyZ2V0IG1vZHVsZSBwYXRoLlxuICogQHBhcmFtIG5hbWVzIEltcG9ydCBuYW1lcyB0aGF0IG11c3QgZXhpc3QuXG4gKiBAcmV0dXJucyBJbnNlcnQgb3IgdXBkYXRlIHBsYW4gZm9yIHRoZSBpbXBvcnQgc2VjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwbGFuID0gcmVzb2x2ZUltcG9ydFBsYW4oeyBib2R5OiBbXSwgc291cmNlVHlwZTogXCJtb2R1bGVcIiwgdHlwZTogXCJQcm9ncmFtXCIgfSBhcyBuZXZlciwgXCIuL3hcIiwgW1wiYVwiXSk7XG4gKiB2b2lkIHBsYW47XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUltcG9ydFBsYW4oXG4gIHByb2dyYW06IEVTVHJlZS5Qcm9ncmFtLFxuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyxcbiAgbmFtZXM6IHN0cmluZ1tdLFxuKTogSW1wb3J0UGxhbiB7XG4gIGNvbnN0IGltcG9ydHMgPSBnZXRJbXBvcnREZWNsYXJhdGlvbnMocHJvZ3JhbSk7XG4gIGNvbnN0IGV4aXN0aW5nSW1wb3J0ID0gaW1wb3J0cy5maW5kKChzdGF0ZW1lbnQpID0+XG4gICAgaXNNYXRjaGluZ0ltcG9ydChzdGF0ZW1lbnQsIG1vZHVsZVNwZWNpZmllciksXG4gICk7XG5cbiAgcmV0dXJuIGV4aXN0aW5nSW1wb3J0ID09PSB2b2lkIDBcbiAgICA/IGNyZWF0ZUluc2VydFBsYW4obW9kdWxlU3BlY2lmaWVyLCBuYW1lcywgaW1wb3J0cy5hdCgtMSk/LnJhbmdlKVxuICAgIDogY3JlYXRlVXBkYXRlUGxhbihleGlzdGluZ0ltcG9ydCwgbW9kdWxlU3BlY2lmaWVyLCBuYW1lcyk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgaW1wb3J0ZWQgaWRlbnRpZmllciBuYW1lIGZyb20gb25lIHNwZWNpZmllci5cbiAqIEBwYXJhbSBzcGVjaWZpZXIgSW1wb3J0IGNsYXVzZSBlbnRyeS5cbiAqIEByZXR1cm5zIEltcG9ydGVkIGlkZW50aWZpZXIgbmFtZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBpbXBvcnRlZCA9IHRvSW1wb3J0ZWROYW1lKHsgdHlwZTogXCJJbXBvcnRTcGVjaWZpZXJcIiwgaW1wb3J0ZWQ6IHsgdHlwZTogXCJJZGVudGlmaWVyXCIsIG5hbWU6IFwieFwiIH0gfSBhcyBuZXZlcik7XG4gKiB2b2lkIGltcG9ydGVkO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHRvSW1wb3J0ZWROYW1lKFxuICBzcGVjaWZpZXI6IEVTVHJlZS5JbXBvcnREZWNsYXJhdGlvbltcInNwZWNpZmllcnNcIl1bbnVtYmVyXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzcGVjaWZpZXIudHlwZSA9PT0gXCJJbXBvcnRTcGVjaWZpZXJcIiAmJlxuICAgIHNwZWNpZmllci5pbXBvcnRlZC50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICAgID8gc3BlY2lmaWVyLmltcG9ydGVkLm5hbWVcbiAgICA6IHZvaWQgMDtcbn1cblxuZXhwb3J0IHsgcmVzb2x2ZUltcG9ydFBsYW4gfTtcbiJdfQ==
@@ -0,0 +1,42 @@
1
+ import type * as ESTree from "estree";
2
+ import type { Binding, Declaration, MemberRewrite } from "./types";
3
+ /**
4
+ * Returns false if a binding local is used outside allowed rewrite sites.
5
+ * @param program Program node containing mock usage.
6
+ * @param allowedIdentifierRanges Identifier ranges that are safe to rewrite.
7
+ * @param localNames Local names tracked by the matcher.
8
+ * @returns True when all local usages are safe.
9
+ * @example
10
+ * ```typescript
11
+ * const safe = areLocalsSafeToInline({ body: [], sourceType: "module", type: "Program" } as never, new Set(), new Set());
12
+ * void safe;
13
+ * ```
14
+ */
15
+ declare function areLocalsSafeToInline(program: ESTree.Program, allowedIdentifierRanges: Set<string>, localNames: Set<string>): boolean;
16
+ /**
17
+ * Builds a set of allowed identifier ranges for safe-inline validation.
18
+ * @param bindings Bindings list.
19
+ * @param declarations Declarations map.
20
+ * @param rewrites Member rewrites.
21
+ * @returns Allowed identifier range keys.
22
+ * @example
23
+ * ```typescript
24
+ * const ranges = buildAllowedRanges([], new Map(), []);
25
+ * void ranges;
26
+ * ```
27
+ */
28
+ declare function buildAllowedRanges(bindings: Binding[], declarations: Map<string, Declaration>, rewrites: MemberRewrite[]): Set<string>;
29
+ /**
30
+ * Collects member-expression object rewrites for `.mock*` calls.
31
+ * @param program Program node.
32
+ * @param localToExported Local to exported name map.
33
+ * @returns Collected member rewrites.
34
+ * @example
35
+ * ```typescript
36
+ * const rewrites = collectMemberRewrites({ body: [], sourceType: "module", type: "Program" } as never, new Map());
37
+ * void rewrites;
38
+ * ```
39
+ */
40
+ declare function collectMemberRewrites(program: ESTree.Program, localToExported: Map<string, string>): MemberRewrite[];
41
+ export { areLocalsSafeToInline, buildAllowedRanges, collectMemberRewrites };
42
+ //# sourceMappingURL=match-rewrites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-rewrites.d.ts","sourceRoot":"","sources":["../../../src/testing/prefer-vi-mocked-import/match-rewrites.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAyBnE;;;;;;;;;;;GAWG;AACH,iBAAS,qBAAqB,CAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,EACpC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,OAAO,CAkBT;AAED;;;;;;;;;;;GAWG;AACH,iBAAS,kBAAkB,CACzB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,QAAQ,EAAE,aAAa,EAAE,GACxB,GAAG,CAAC,MAAM,CAAC,CAkBb;AAED;;;;;;;;;;GAUG;AACH,iBAAS,qBAAqB,CAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,aAAa,EAAE,CAUjB;AAqCD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,CAAC"}