@codeperfect/eslint-plugin 2.3.0 → 2.5.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 (151) hide show
  1. package/dist/application/index.d.ts +1 -1
  2. package/dist/application/index.d.ts.map +1 -1
  3. package/dist/application/index.js +2 -2
  4. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  5. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
  6. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +4 -2
  7. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
  8. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +2 -4
  9. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts.map +1 -1
  10. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.js +4 -134
  11. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts +14 -0
  12. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts.map +1 -0
  13. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.js +154 -0
  14. package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.d.ts.map +1 -1
  15. package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.js +10 -12
  16. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
  17. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +4 -11
  18. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts +14 -0
  19. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts.map +1 -0
  20. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.js +187 -0
  21. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts +26 -0
  22. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts.map +1 -0
  23. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.js +95 -0
  24. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts +32 -0
  25. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts.map +1 -0
  26. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.js +78 -0
  27. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts +18 -0
  28. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts.map +1 -0
  29. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.js +45 -0
  30. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts +34 -0
  31. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts.map +1 -0
  32. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.js +44 -0
  33. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts +59 -0
  34. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map +1 -0
  35. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js +133 -0
  36. package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.d.ts +28 -0
  37. package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.d.ts.map +1 -0
  38. package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.js +106 -0
  39. package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.d.ts +21 -21
  40. package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.d.ts.map +1 -1
  41. package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.js +24 -587
  42. package/dist/domain/architecture/no-unused-exports/rule.js +3 -3
  43. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts +58 -0
  44. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts.map +1 -0
  45. package/dist/domain/core/no-multiple-declarators/rule-utilities.js +204 -0
  46. package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
  47. package/dist/domain/core/no-multiple-declarators/rule.js +9 -211
  48. package/dist/domain/core/no-multiple-declarators/types.js +2 -2
  49. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts +57 -0
  50. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -0
  51. package/dist/domain/core/prefer-interface-types/rule-utilities.js +105 -0
  52. package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
  53. package/dist/domain/core/prefer-interface-types/rule.js +2 -104
  54. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts +25 -0
  55. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts.map +1 -0
  56. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.js +64 -0
  57. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts +2 -24
  58. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
  59. package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +3 -65
  60. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -2
  61. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +2 -2
  62. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  63. package/dist/domain/docs/no-interface-member-docs/rule.js +3 -2
  64. package/dist/domain/docs/require-example-language/examples-collect.d.ts +15 -0
  65. package/dist/domain/docs/require-example-language/examples-collect.d.ts.map +1 -0
  66. package/dist/domain/docs/require-example-language/examples-collect.js +113 -0
  67. package/dist/domain/docs/require-example-language/examples.d.ts +24 -13
  68. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  69. package/dist/domain/docs/require-example-language/examples.js +2 -111
  70. package/dist/domain/docs/require-example-language/fixes.js +4 -4
  71. package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
  72. package/dist/domain/docs/require-example-language/rule.js +9 -8
  73. package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
  74. package/dist/domain/docs/require-example-language/types.js +1 -1
  75. package/dist/domain/index.d.ts +1 -1
  76. package/dist/domain/index.d.ts.map +1 -1
  77. package/dist/domain/index.js +2 -2
  78. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
  79. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +8 -8
  80. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
  81. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +10 -9
  82. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -1
  83. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +2 -5
  84. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +14 -16
  85. package/dist/domain/testing/aaa/analyzer.classification.traversal.js +6 -4
  86. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  87. package/dist/domain/testing/aaa/analyzer.super.js +10 -8
  88. package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -1
  89. package/dist/domain/testing/assert-actual-expected-names/rule.js +21 -23
  90. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
  91. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +1 -1
  92. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts.map +1 -1
  93. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.js +2 -160
  94. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts +41 -0
  95. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts.map +1 -0
  96. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.js +161 -0
  97. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
  98. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +2 -2
  99. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts +81 -0
  100. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts.map +1 -0
  101. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.js +181 -0
  102. package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
  103. package/dist/domain/testing/enforce-aaa-structure/rule.js +28 -217
  104. package/dist/domain/testing/index.d.ts +1 -0
  105. package/dist/domain/testing/index.d.ts.map +1 -1
  106. package/dist/domain/testing/index.js +2 -1
  107. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts +2 -0
  108. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.d.ts.map +1 -0
  109. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/index.js +2 -0
  110. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts +29 -0
  111. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts.map +1 -0
  112. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.js +200 -0
  113. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts +12 -0
  114. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts.map +1 -0
  115. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.js +151 -0
  116. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts +16 -0
  117. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts.map +1 -0
  118. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.js +109 -0
  119. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts +5 -0
  120. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +1 -0
  121. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +35 -0
  122. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.d.ts.map +1 -1
  123. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.js +7 -4
  124. package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.d.ts.map +1 -1
  125. package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +7 -4
  126. package/dist/domain/testing/prefer-vi-mocked-import/fix.js +2 -2
  127. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts +18 -0
  128. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -0
  129. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +162 -0
  130. package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -1
  131. package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.js +5 -4
  132. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts +29 -0
  133. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts.map +1 -0
  134. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.js +100 -0
  135. package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts.map +1 -1
  136. package/dist/domain/testing/prefer-vi-mocked-import/match.js +5 -246
  137. package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
  138. package/dist/domain/testing/prefer-vi-mocked-import/rule.js +18 -20
  139. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  140. package/dist/domain/testing/require-act-result-capture/rule.js +47 -21
  141. package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
  142. package/dist/domain/testing/require-test-companion/rule.js +2 -4
  143. package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -1
  144. package/dist/domain/testing/single-act-statement/rule.js +20 -22
  145. package/dist/infrastructure/codeperfect-plugin.d.ts +2 -0
  146. package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
  147. package/dist/infrastructure/codeperfect-plugin.js +3 -2
  148. package/dist/infrastructure/presets.d.ts.map +1 -1
  149. package/dist/infrastructure/presets.js +3 -1
  150. package/package.json +58 -58
  151. package/dist/.tsbuildinfo +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,MAAM,sCAAsC,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  export { assertActualExpectedNamesRule } from "./assert-actual-expected-names/index.js";
2
2
  export { enforceAaaStructureRule } from "./enforce-aaa-structure/index.js";
3
+ export { noUnsafeVitestMockFactoryCastRule } from "./no-unsafe-vitest-mock-factory-cast/index.js";
3
4
  export { preferViMockedImportRule } from "./prefer-vi-mocked-import/index.js";
4
5
  export { requireActResultCaptureRule } from "./require-act-result-capture/index.js";
5
6
  export { requireTestCompanionRule } from "./require-test-companion/index.js";
6
7
  export { singleActStatementRule } from "./single-act-statement/index.js";
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhc3NlcnRBY3R1YWxFeHBlY3RlZE5hbWVzUnVsZSB9IGZyb20gXCIuL2Fzc2VydC1hY3R1YWwtZXhwZWN0ZWQtbmFtZXNcIjtcbmV4cG9ydCB7IGVuZm9yY2VBYWFTdHJ1Y3R1cmVSdWxlIH0gZnJvbSBcIi4vZW5mb3JjZS1hYWEtc3RydWN0dXJlXCI7XG5leHBvcnQgeyBwcmVmZXJWaU1vY2tlZEltcG9ydFJ1bGUgfSBmcm9tIFwiLi9wcmVmZXItdmktbW9ja2VkLWltcG9ydFwiO1xuZXhwb3J0IHsgcmVxdWlyZUFjdFJlc3VsdENhcHR1cmVSdWxlIH0gZnJvbSBcIi4vcmVxdWlyZS1hY3QtcmVzdWx0LWNhcHR1cmVcIjtcbmV4cG9ydCB7IHJlcXVpcmVUZXN0Q29tcGFuaW9uUnVsZSB9IGZyb20gXCIuL3JlcXVpcmUtdGVzdC1jb21wYW5pb25cIjtcbmV4cG9ydCB7IHNpbmdsZUFjdFN0YXRlbWVudFJ1bGUgfSBmcm9tIFwiLi9zaW5nbGUtYWN0LXN0YXRlbWVudFwiO1xuIl19
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3RpbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhc3NlcnRBY3R1YWxFeHBlY3RlZE5hbWVzUnVsZSB9IGZyb20gXCIuL2Fzc2VydC1hY3R1YWwtZXhwZWN0ZWQtbmFtZXNcIjtcbmV4cG9ydCB7IGVuZm9yY2VBYWFTdHJ1Y3R1cmVSdWxlIH0gZnJvbSBcIi4vZW5mb3JjZS1hYWEtc3RydWN0dXJlXCI7XG5leHBvcnQgeyBub1Vuc2FmZVZpdGVzdE1vY2tGYWN0b3J5Q2FzdFJ1bGUgfSBmcm9tIFwiLi9uby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0XCI7XG5leHBvcnQgeyBwcmVmZXJWaU1vY2tlZEltcG9ydFJ1bGUgfSBmcm9tIFwiLi9wcmVmZXItdmktbW9ja2VkLWltcG9ydFwiO1xuZXhwb3J0IHsgcmVxdWlyZUFjdFJlc3VsdENhcHR1cmVSdWxlIH0gZnJvbSBcIi4vcmVxdWlyZS1hY3QtcmVzdWx0LWNhcHR1cmVcIjtcbmV4cG9ydCB7IHJlcXVpcmVUZXN0Q29tcGFuaW9uUnVsZSB9IGZyb20gXCIuL3JlcXVpcmUtdGVzdC1jb21wYW5pb25cIjtcbmV4cG9ydCB7IHNpbmdsZUFjdFN0YXRlbWVudFJ1bGUgfSBmcm9tIFwiLi9zaW5nbGUtYWN0LXN0YXRlbWVudFwiO1xuIl19
@@ -0,0 +1,2 @@
1
+ export { noUnsafeVitestMockFactoryCastRule } from "./rule.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/no-unsafe-vitest-mock-factory-cast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { noUnsafeVitestMockFactoryCastRule } from "./rule.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3Rpbmcvbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBub1Vuc2FmZVZpdGVzdE1vY2tGYWN0b3J5Q2FzdFJ1bGUgfSBmcm9tIFwiLi9ydWxlXCI7XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import { type TSESTree } from "@typescript-eslint/utils";
2
+ /** Unsafe mock-factory match details. */
3
+ interface MockFactoryMatch {
4
+ /** Whether the match can be safely autofixed. */
5
+ canAutofix: boolean;
6
+ /** Cast-free partial mock expression. */
7
+ mockExpression: TSESTree.Expression;
8
+ /** Second argument to the Vitest mock call. */
9
+ mockFactoryNode: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression;
10
+ /** First argument to the Vitest mock call. */
11
+ mockSpecifierNode: TSESTree.Expression;
12
+ /** Mocked module specifier. */
13
+ moduleSpecifier: string;
14
+ /** Report node. */
15
+ node: TSESTree.Node;
16
+ }
17
+ /**
18
+ * Collects the most appropriate mock-factory match from a `CallExpression`.
19
+ * @param node Call expression to inspect.
20
+ * @returns Unsafe mock factory details when the factory uses a cast.
21
+ * @example
22
+ * ```ts
23
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
24
+ * ```
25
+ */
26
+ declare function getMockFactoryMatch(node: TSESTree.CallExpression): MockFactoryMatch | undefined;
27
+ export type { MockFactoryMatch };
28
+ export { getMockFactoryMatch };
29
+ //# sourceMappingURL=rule-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-detection.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzE,yCAAyC;AACzC,UAAU,gBAAgB;IACxB,iDAAiD;IACjD,UAAU,EAAE,OAAO,CAAC;IAEpB,yCAAyC;IACzC,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC;IAEpC,+CAA+C;IAC/C,eAAe,EACb,QAAQ,CAAC,uBAAuB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IAEjE,8CAA8C;IAC9C,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC;IAEvC,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IAExB,mBAAmB;IACnB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;CACrB;AAiHD;;;;;;;;GAQG;AACH,iBAAS,mBAAmB,CAC1B,IAAI,EAAE,QAAQ,CAAC,cAAc,GAC5B,gBAAgB,GAAG,SAAS,CA6C9B;AAoGD,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,200 @@
1
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ /** Supported `vi` mock method names. */
3
+ const supportedMockNames = new Set(["doMock", "mock"]);
4
+ /**
5
+ * Returns the casted expression only when the factory is safe to autofix.
6
+ * @param node Factory expression to inspect.
7
+ * @returns Cast-free expression when the factory can be safely replaced.
8
+ * @example
9
+ * ```ts
10
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
11
+ * ```
12
+ */
13
+ function getAutofixableMockExpression(node) {
14
+ if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {
15
+ if (node.async || node.params.length > 0) {
16
+ return void 0;
17
+ }
18
+ if (node.body.type === AST_NODE_TYPES.BlockStatement) {
19
+ return getAutofixableReturnedCastedExpression(node.body.body);
20
+ }
21
+ return getCastedExpression(node.body);
22
+ }
23
+ if (node.async || node.generator || node.params.length > 0) {
24
+ return void 0;
25
+ }
26
+ return getAutofixableReturnedCastedExpression(node.body.body);
27
+ }
28
+ /**
29
+ * Finds a casted return value from a single-return factory body.
30
+ * @param statements Function body statements.
31
+ * @returns Returned expression when the factory has exactly one return statement.
32
+ * @example
33
+ * ```ts
34
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
35
+ * ```
36
+ */
37
+ function getAutofixableReturnedCastedExpression(statements) {
38
+ if (statements.length !== 1) {
39
+ return void 0;
40
+ }
41
+ const [statement] = statements;
42
+ if (statement.argument === null) {
43
+ return void 0;
44
+ }
45
+ return getCastedExpression(statement.argument);
46
+ }
47
+ /**
48
+ * Returns the inner expression if the input is a cast expression.
49
+ * @param expression Expression to inspect.
50
+ * @returns Inner expression when the input contains a cast.
51
+ * @example
52
+ * ```ts
53
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
54
+ * ```
55
+ */
56
+ function getCastedExpression(expression) {
57
+ if (expression.type === AST_NODE_TYPES.TSAsExpression) {
58
+ return stripCastExpressions(expression.expression);
59
+ }
60
+ if (expression.type === AST_NODE_TYPES.TSTypeAssertion) {
61
+ const innerExpression = expression.expression;
62
+ return stripCastExpressions(innerExpression);
63
+ }
64
+ return void 0;
65
+ }
66
+ /**
67
+ * Returns the partial mock expression after removing a cast wrapper.
68
+ * @param node Factory expression to inspect.
69
+ * @returns Cast-free expression when the factory is unsafe.
70
+ * @example
71
+ * ```ts
72
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
73
+ * ```
74
+ */
75
+ function getCastedMockExpression(node) {
76
+ if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {
77
+ if (node.body.type === AST_NODE_TYPES.BlockStatement) {
78
+ return getReturnedCastedExpression(node.body.body);
79
+ }
80
+ return getCastedExpression(node.body);
81
+ }
82
+ return getReturnedCastedExpression(node.body.body);
83
+ }
84
+ /**
85
+ * Collects the most appropriate mock-factory match from a `CallExpression`.
86
+ * @param node Call expression to inspect.
87
+ * @returns Unsafe mock factory details when the factory uses a cast.
88
+ * @example
89
+ * ```ts
90
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
91
+ * ```
92
+ */
93
+ function getMockFactoryMatch(node) {
94
+ if (!isVitestMockCall(node) || node.arguments.length < 2) {
95
+ return void 0;
96
+ }
97
+ const [mockSpecifierNode, mockFactoryNode] = node.arguments;
98
+ if (mockSpecifierNode.type === AST_NODE_TYPES.SpreadElement ||
99
+ mockFactoryNode.type === AST_NODE_TYPES.SpreadElement) {
100
+ return void 0;
101
+ }
102
+ if (mockFactoryNode.type !== AST_NODE_TYPES.ArrowFunctionExpression &&
103
+ mockFactoryNode.type !== AST_NODE_TYPES.FunctionExpression) {
104
+ return void 0;
105
+ }
106
+ const moduleSpecifier = getModuleSpecifier(mockSpecifierNode);
107
+ if (moduleSpecifier === void 0) {
108
+ return void 0;
109
+ }
110
+ const mockExpression = getCastedMockExpression(mockFactoryNode);
111
+ if (mockExpression === void 0) {
112
+ return void 0;
113
+ }
114
+ const autofixableExpression = getAutofixableMockExpression(mockFactoryNode);
115
+ return {
116
+ canAutofix: autofixableExpression !== void 0,
117
+ mockExpression: autofixableExpression ?? mockExpression,
118
+ mockFactoryNode,
119
+ mockSpecifierNode,
120
+ moduleSpecifier,
121
+ node,
122
+ };
123
+ }
124
+ /**
125
+ * Extracts a string module specifier from the first mock argument.
126
+ * @param node First mock argument.
127
+ * @returns Module specifier when statically known.
128
+ * @example
129
+ * ```ts
130
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
131
+ * ```
132
+ */
133
+ function getModuleSpecifier(node) {
134
+ if (node.type === AST_NODE_TYPES.Literal && typeof node.value === "string") {
135
+ return node.value;
136
+ }
137
+ if (node.type === AST_NODE_TYPES.ImportExpression &&
138
+ node.source.type === AST_NODE_TYPES.Literal &&
139
+ typeof node.source.value === "string") {
140
+ return node.source.value;
141
+ }
142
+ return void 0;
143
+ }
144
+ /**
145
+ * Finds the casted return value inside a function body.
146
+ * @param statements Function body statements.
147
+ * @returns Returned expression when it is casted.
148
+ * @example
149
+ * ```ts
150
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
151
+ * ```
152
+ */
153
+ function getReturnedCastedExpression(statements) {
154
+ for (const statement of statements) {
155
+ if (statement.type !== AST_NODE_TYPES.ReturnStatement) {
156
+ continue;
157
+ }
158
+ return statement.argument === null
159
+ ? void 0
160
+ : getCastedExpression(statement.argument);
161
+ }
162
+ return void 0;
163
+ }
164
+ /**
165
+ * Checks whether a call targets `vi.mock` or `vi.doMock`.
166
+ * @param node Call expression to inspect.
167
+ * @returns True when the callee is a supported Vitest mock method.
168
+ * @example
169
+ * ```ts
170
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
171
+ * ```
172
+ */
173
+ function isVitestMockCall(node) {
174
+ if (node.callee.type !== AST_NODE_TYPES.MemberExpression ||
175
+ node.callee.object.type !== AST_NODE_TYPES.Identifier ||
176
+ node.callee.object.name !== "vi" ||
177
+ node.callee.property.type !== AST_NODE_TYPES.Identifier) {
178
+ return false;
179
+ }
180
+ return supportedMockNames.has(node.callee.property.name);
181
+ }
182
+ /**
183
+ * Removes nested cast wrappers from an expression.
184
+ * @param expression Expression to normalize.
185
+ * @returns Expression without any surrounding casts.
186
+ * @example
187
+ * ```ts
188
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
189
+ * ```
190
+ */
191
+ function stripCastExpressions(expression) {
192
+ let currentExpression = expression;
193
+ while (currentExpression.type === AST_NODE_TYPES.TSAsExpression ||
194
+ currentExpression.type === AST_NODE_TYPES.TSTypeAssertion) {
195
+ currentExpression = currentExpression.expression;
196
+ }
197
+ return currentExpression;
198
+ }
199
+ export { getMockFactoryMatch };
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1kZXRlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3Rpbmcvbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC9ydWxlLWRldGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBd0J6RSx3Q0FBd0M7QUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBUXZEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FDbkMsSUFBb0U7SUFFcEUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3pELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEtBQUssQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNyRCxPQUFPLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFD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LE9BQU8sS0FBSyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxJQUE2QjtJQUNyRCxJQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0I7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxVQUFVO1FBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsVUFBVSxFQUN2RCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsVUFBK0I7SUFFL0IsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUM7SUFFbkMsT0FDRSxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLGNBQWM7UUFDeEQsaUJBQWlCLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxlQUFlLEVBQ3pELENBQUM7UUFDRCxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7SUFDbkQsQ0FBQztJQUVELE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FBQztBQUdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVNUX05PREVfVFlQRVMsIHR5cGUgVFNFU1RyZWUgfSBmcm9tIFwiQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzXCI7XG5cbi8qKiBVbnNhZmUgbW9jay1mYWN0b3J5IG1hdGNoIGRldGFpbHMuICovXG5pbnRlcmZhY2UgTW9ja0ZhY3RvcnlNYXRjaCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBtYXRjaCBjYW4gYmUgc2FmZWx5IGF1dG9maXhlZC4gKi9cbiAgY2FuQXV0b2ZpeDogYm9vbGVhbjtcblxuICAvKiogQ2FzdC1mcmVlIHBhcnRpYWwgbW9jayBleHByZXNzaW9uLiAqL1xuICBtb2NrRXhwcmVzc2lvbjogVFNFU1RyZWUuRXhwcmVzc2lvbjtcblxuICAvKiogU2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBWaXRlc3QgbW9jayBjYWxsLiAqL1xuICBtb2NrRmFjdG9yeU5vZGU6XG4gICAgVFNFU1RyZWUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gfCBUU0VTVHJlZS5GdW5jdGlvbkV4cHJlc3Npb247XG5cbiAgLyoqIEZpcnN0IGFyZ3VtZW50IHRvIHRoZSBWaXRlc3QgbW9jayBjYWxsLiAqL1xuICBtb2NrU3BlY2lmaWVyTm9kZTogVFNFU1RyZWUuRXhwcmVzc2lvbjtcblxuICAvKiogTW9ja2VkIG1vZHVsZSBzcGVjaWZpZXIuICovXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nO1xuXG4gIC8qKiBSZXBvcnQgbm9kZS4gKi9cbiAgbm9kZTogVFNFU1RyZWUuTm9kZTtcbn1cblxuLyoqIFN1cHBvcnRlZCBgdmlgIG1vY2sgbWV0aG9kIG5hbWVzLiAqL1xuY29uc3Qgc3VwcG9ydGVkTW9ja05hbWVzID0gbmV3IFNldChbXCJkb01vY2tcIiwgXCJtb2NrXCJdKTtcblxuLyoqIENhbGxFeHByZXNzaW9uIGFyZ3VtZW50IHRoYXQgaXMgbm90IGEgc3ByZWFkIGVsZW1lbnQuICovXG50eXBlIE5vblNwcmVhZENhbGxFeHByZXNzaW9uQXJndW1lbnQgPSBFeGNsdWRlPFxuICBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbkFyZ3VtZW50LFxuICBUU0VTVHJlZS5TcHJlYWRFbGVtZW50XG4+O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhc3RlZCBleHByZXNzaW9uIG9ubHkgd2hlbiB0aGUgZmFjdG9yeSBpcyBzYWZlIHRvIGF1dG9maXguXG4gKiBAcGFyYW0gbm9kZSBGYWN0b3J5IGV4cHJlc3Npb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIENhc3QtZnJlZSBleHByZXNzaW9uIHdoZW4gdGhlIGZhY3RvcnkgY2FuIGJlIHNhZmVseSByZXBsYWNlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldEF1dG9maXhhYmxlTW9ja0V4cHJlc3Npb24oXG4gIG5vZGU6IFRTRVNUcmVlLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uLFxuKTogVFNFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgaWYgKG5vZGUuYXN5bmMgfHwgbm9kZS5wYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ib2R5LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkJsb2NrU3RhdGVtZW50KSB7XG4gICAgICByZXR1cm4gZ2V0QXV0b2ZpeGFibGVSZXR1cm5lZENhc3RlZEV4cHJlc3Npb24obm9kZS5ib2R5LmJvZHkpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRDYXN0ZWRFeHByZXNzaW9uKG5vZGUuYm9keSk7XG4gIH1cblxuICBpZiAobm9kZS5hc3luYyB8fCBub2RlLmdlbmVyYXRvciB8fCBub2RlLnBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBnZXRBdXRvZml4YWJsZVJldHVybmVkQ2FzdGVkRXhwcmVzc2lvbihub2RlLmJvZHkuYm9keSk7XG59XG5cbi8qKlxuICogRmluZHMgYSBjYXN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBzaW5nbGUtcmV0dXJuIGZhY3RvcnkgYm9keS5cbiAqIEBwYXJhbSBzdGF0ZW1lbnRzIEZ1bmN0aW9uIGJvZHkgc3RhdGVtZW50cy5cbiAqIEByZXR1cm5zIFJldHVybmVkIGV4cHJlc3Npb24gd2hlbiB0aGUgZmFjdG9yeSBoYXMgZXhhY3RseSBvbmUgcmV0dXJuIHN0YXRlbWVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldEF1dG9maXhhYmxlUmV0dXJuZWRDYXN0ZWRFeHByZXNzaW9uKFxuICBzdGF0ZW1lbnRzOiBUU0VTVHJlZS5TdGF0ZW1lbnRbXSxcbik6IFRTRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBpZiAoc3RhdGVtZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgW3N0YXRlbWVudF0gPSBzdGF0ZW1lbnRzIGFzIFtUU0VTVHJlZS5SZXR1cm5TdGF0ZW1lbnRdO1xuICBpZiAoc3RhdGVtZW50LmFyZ3VtZW50ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBnZXRDYXN0ZWRFeHByZXNzaW9uKHN0YXRlbWVudC5hcmd1bWVudCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5uZXIgZXhwcmVzc2lvbiBpZiB0aGUgaW5wdXQgaXMgYSBjYXN0IGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBFeHByZXNzaW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBJbm5lciBleHByZXNzaW9uIHdoZW4gdGhlIGlucHV0IGNvbnRhaW5zIGEgY2FzdC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldENhc3RlZEV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IFRTRVNUcmVlLkV4cHJlc3Npb24sXG4pOiBUU0VTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4cHJlc3Npb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuVFNBc0V4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gc3RyaXBDYXN0RXhwcmVzc2lvbnMoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlRTVHlwZUFzc2VydGlvbikge1xuICAgIGNvbnN0IGlubmVyRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZXhwcmVzc2lvbjtcbiAgICByZXR1cm4gc3RyaXBDYXN0RXhwcmVzc2lvbnMoaW5uZXJFeHByZXNzaW9uKTtcbiAgfVxuXG4gIHJldHVybiB2b2lkIDA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFydGlhbCBtb2NrIGV4cHJlc3Npb24gYWZ0ZXIgcmVtb3ZpbmcgYSBjYXN0IHdyYXBwZXIuXG4gKiBAcGFyYW0gbm9kZSBGYWN0b3J5IGV4cHJlc3Npb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIENhc3QtZnJlZSBleHByZXNzaW9uIHdoZW4gdGhlIGZhY3RvcnkgaXMgdW5zYWZlLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FzdGVkTW9ja0V4cHJlc3Npb24oXG4gIG5vZGU6IFRTRVNUcmVlLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uLFxuKTogVFNFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgaWYgKG5vZGUuYm9keS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5CbG9ja1N0YXRlbWVudCkge1xuICAgICAgcmV0dXJuIGdldFJldHVybmVkQ2FzdGVkRXhwcmVzc2lvbihub2RlLmJvZHkuYm9keSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldENhc3RlZEV4cHJlc3Npb24obm9kZS5ib2R5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRSZXR1cm5lZENhc3RlZEV4cHJlc3Npb24obm9kZS5ib2R5LmJvZHkpO1xufVxuXG4vKipcbiAqIENvbGxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1vY2stZmFjdG9yeSBtYXRjaCBmcm9tIGEgYENhbGxFeHByZXNzaW9uYC5cbiAqIEBwYXJhbSBub2RlIENhbGwgZXhwcmVzc2lvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgVW5zYWZlIG1vY2sgZmFjdG9yeSBkZXRhaWxzIHdoZW4gdGhlIGZhY3RvcnkgdXNlcyBhIGNhc3QuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRNb2NrRmFjdG9yeU1hdGNoKFxuICBub2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbixcbik6IE1vY2tGYWN0b3J5TWF0Y2ggfCB1bmRlZmluZWQge1xuICBpZiAoIWlzVml0ZXN0TW9ja0NhbGwobm9kZSkgfHwgbm9kZS5hcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBjb25zdCBbbW9ja1NwZWNpZmllck5vZGUsIG1vY2tGYWN0b3J5Tm9kZV0gPSBub2RlLmFyZ3VtZW50cyBhcyBbXG4gICAgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb25Bcmd1bWVudCxcbiAgICBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbkFyZ3VtZW50LFxuICAgIC4uLlRTRVNUcmVlLkNhbGxFeHByZXNzaW9uQXJndW1lbnRbXSxcbiAgXTtcblxuICBpZiAoXG4gICAgbW9ja1NwZWNpZmllck5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuU3ByZWFkRWxlbWVudCB8fFxuICAgIG1vY2tGYWN0b3J5Tm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5TcHJlYWRFbGVtZW50XG4gICkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBpZiAoXG4gICAgbW9ja0ZhY3RvcnlOb2RlLnR5cGUgIT09IEFTVF9OT0RFX1RZUEVTLkFycm93RnVuY3Rpb25FeHByZXNzaW9uICYmXG4gICAgbW9ja0ZhY3RvcnlOb2RlLnR5cGUgIT09IEFTVF9OT0RFX1RZUEVTLkZ1bmN0aW9uRXhwcmVzc2lvblxuICApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gZ2V0TW9kdWxlU3BlY2lmaWVyKG1vY2tTcGVjaWZpZXJOb2RlKTtcbiAgaWYgKG1vZHVsZVNwZWNpZmllciA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IG1vY2tFeHByZXNzaW9uID0gZ2V0Q2FzdGVkTW9ja0V4cHJlc3Npb24obW9ja0ZhY3RvcnlOb2RlKTtcbiAgaWYgKG1vY2tFeHByZXNzaW9uID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgYXV0b2ZpeGFibGVFeHByZXNzaW9uID0gZ2V0QXV0b2ZpeGFibGVNb2NrRXhwcmVzc2lvbihtb2NrRmFjdG9yeU5vZGUpO1xuXG4gIHJldHVybiB7XG4gICAgY2FuQXV0b2ZpeDogYXV0b2ZpeGFibGVFeHByZXNzaW9uICE9PSB2b2lkIDAsXG4gICAgbW9ja0V4cHJlc3Npb246IGF1dG9maXhhYmxlRXhwcmVzc2lvbiA/PyBtb2NrRXhwcmVzc2lvbixcbiAgICBtb2NrRmFjdG9yeU5vZGUsXG4gICAgbW9ja1NwZWNpZmllck5vZGUsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIG5vZGUsXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpbmcgbW9kdWxlIHNwZWNpZmllciBmcm9tIHRoZSBmaXJzdCBtb2NrIGFyZ3VtZW50LlxuICogQHBhcmFtIG5vZGUgRmlyc3QgbW9jayBhcmd1bWVudC5cbiAqIEByZXR1cm5zIE1vZHVsZSBzcGVjaWZpZXIgd2hlbiBzdGF0aWNhbGx5IGtub3duLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0TW9kdWxlU3BlY2lmaWVyKFxuICBub2RlOiBOb25TcHJlYWRDYWxsRXhwcmVzc2lvbkFyZ3VtZW50LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuTGl0ZXJhbCAmJiB0eXBlb2Ygbm9kZS52YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBub2RlLnZhbHVlO1xuICB9XG5cbiAgaWYgKFxuICAgIG5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSW1wb3J0RXhwcmVzc2lvbiAmJlxuICAgIG5vZGUuc291cmNlLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkxpdGVyYWwgJiZcbiAgICB0eXBlb2Ygbm9kZS5zb3VyY2UudmFsdWUgPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgcmV0dXJuIG5vZGUuc291cmNlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZvaWQgMDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgY2FzdGVkIHJldHVybiB2YWx1ZSBpbnNpZGUgYSBmdW5jdGlvbiBib2R5LlxuICogQHBhcmFtIHN0YXRlbWVudHMgRnVuY3Rpb24gYm9keSBzdGF0ZW1lbnRzLlxuICogQHJldHVybnMgUmV0dXJuZWQgZXhwcmVzc2lvbiB3aGVuIGl0IGlzIGNhc3RlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldFJldHVybmVkQ2FzdGVkRXhwcmVzc2lvbihcbiAgc3RhdGVtZW50czogVFNFU1RyZWUuU3RhdGVtZW50W10sXG4pOiBUU0VTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgIGlmIChzdGF0ZW1lbnQudHlwZSAhPT0gQVNUX05PREVfVFlQRVMuUmV0dXJuU3RhdGVtZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50LmFyZ3VtZW50ID09PSBudWxsXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiBnZXRDYXN0ZWRFeHByZXNzaW9uKHN0YXRlbWVudC5hcmd1bWVudCk7XG4gIH1cblxuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgY2FsbCB0YXJnZXRzIGB2aS5tb2NrYCBvciBgdmkuZG9Nb2NrYC5cbiAqIEBwYXJhbSBub2RlIENhbGwgZXhwcmVzc2lvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBjYWxsZWUgaXMgYSBzdXBwb3J0ZWQgVml0ZXN0IG1vY2sgbWV0aG9kLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gaXNWaXRlc3RNb2NrQ2FsbChub2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgbm9kZS5jYWxsZWUudHlwZSAhPT0gQVNUX05PREVfVFlQRVMuTWVtYmVyRXhwcmVzc2lvbiB8fFxuICAgIG5vZGUuY2FsbGVlLm9iamVjdC50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5JZGVudGlmaWVyIHx8XG4gICAgbm9kZS5jYWxsZWUub2JqZWN0Lm5hbWUgIT09IFwidmlcIiB8fFxuICAgIG5vZGUuY2FsbGVlLnByb3BlcnR5LnR5cGUgIT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXJcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHN1cHBvcnRlZE1vY2tOYW1lcy5oYXMobm9kZS5jYWxsZWUucHJvcGVydHkubmFtZSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBuZXN0ZWQgY2FzdCB3cmFwcGVycyBmcm9tIGFuIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBFeHByZXNzaW9uIHRvIG5vcm1hbGl6ZS5cbiAqIEByZXR1cm5zIEV4cHJlc3Npb24gd2l0aG91dCBhbnkgc3Vycm91bmRpbmcgY2FzdHMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBzdHJpcENhc3RFeHByZXNzaW9ucyhcbiAgZXhwcmVzc2lvbjogVFNFU1RyZWUuRXhwcmVzc2lvbixcbik6IFRTRVNUcmVlLkV4cHJlc3Npb24ge1xuICBsZXQgY3VycmVudEV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuXG4gIHdoaWxlIChcbiAgICBjdXJyZW50RXhwcmVzc2lvbi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU0FzRXhwcmVzc2lvbiB8fFxuICAgIGN1cnJlbnRFeHByZXNzaW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlRTVHlwZUFzc2VydGlvblxuICApIHtcbiAgICBjdXJyZW50RXhwcmVzc2lvbiA9IGN1cnJlbnRFeHByZXNzaW9uLmV4cHJlc3Npb247XG4gIH1cblxuICByZXR1cm4gY3VycmVudEV4cHJlc3Npb247XG59XG5cbmV4cG9ydCB0eXBlIHsgTW9ja0ZhY3RvcnlNYXRjaCB9O1xuZXhwb3J0IHsgZ2V0TW9ja0ZhY3RvcnlNYXRjaCB9O1xuIl19
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Collects top-level binding names to avoid collisions with inserted imports.
3
+ * @param statements Program statements.
4
+ * @returns All top-level names in the file.
5
+ * @example
6
+ * ```ts
7
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
8
+ * ```
9
+ */
10
+ declare function collectTopLevelNames(statements: readonly unknown[]): Set<string>;
11
+ export { collectTopLevelNames };
12
+ //# sourceMappingURL=rule-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-names.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.ts"],"names":[],"mappings":"AAoHA;;;;;;;;GAQG;AACH,iBAAS,oBAAoB,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAkCzE;AAqCD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ /** Node types that introduce top-level names. */
3
+ const namedDeclarationTypes = new Set([
4
+ AST_NODE_TYPES.ClassDeclaration,
5
+ AST_NODE_TYPES.FunctionDeclaration,
6
+ AST_NODE_TYPES.TSEnumDeclaration,
7
+ AST_NODE_TYPES.TSInterfaceDeclaration,
8
+ AST_NODE_TYPES.TSModuleDeclaration,
9
+ AST_NODE_TYPES.TSTypeAliasDeclaration,
10
+ AST_NODE_TYPES.VariableDeclaration,
11
+ ]);
12
+ /** Type-like declaration node types handled by the name collector. */
13
+ const typeLikeDeclarationTypes = new Set([
14
+ AST_NODE_TYPES.TSEnumDeclaration,
15
+ AST_NODE_TYPES.TSInterfaceDeclaration,
16
+ AST_NODE_TYPES.TSTypeAliasDeclaration,
17
+ ]);
18
+ /**
19
+ * Collects declaration identifiers from top-level declarations.
20
+ * @param declaration Declaration node.
21
+ * @param names Output name set.
22
+ * @example
23
+ * ```ts
24
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
25
+ * ```
26
+ */
27
+ function collectDeclarationNames(declaration, names) {
28
+ if (declaration.type === AST_NODE_TYPES.FunctionDeclaration ||
29
+ declaration.type === AST_NODE_TYPES.ClassDeclaration) {
30
+ if (declaration.id !== null) {
31
+ names.add(declaration.id.name);
32
+ }
33
+ return;
34
+ }
35
+ if (declaration.type === AST_NODE_TYPES.VariableDeclaration) {
36
+ for (const variableDeclaration of declaration.declarations) {
37
+ collectPatternNames(variableDeclaration.id, names);
38
+ }
39
+ return;
40
+ }
41
+ if (isTypeLikeDeclaration(declaration)) {
42
+ names.add(declaration.id.name);
43
+ return;
44
+ }
45
+ if (declaration.id.type === AST_NODE_TYPES.Identifier) {
46
+ names.add(declaration.id.name);
47
+ }
48
+ }
49
+ /**
50
+ * Collects identifiers from a binding pattern.
51
+ * @param pattern Binding pattern.
52
+ * @param names Output name set.
53
+ * @example
54
+ * ```ts
55
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
56
+ * ```
57
+ */
58
+ function collectPatternNames(pattern, names) {
59
+ if (pattern.type === AST_NODE_TYPES.Identifier) {
60
+ names.add(pattern.name);
61
+ return;
62
+ }
63
+ if (pattern.type === AST_NODE_TYPES.AssignmentPattern) {
64
+ collectPatternNames(pattern.left, names);
65
+ return;
66
+ }
67
+ if (pattern.type === AST_NODE_TYPES.RestElement) {
68
+ collectPatternNames(pattern.argument, names);
69
+ return;
70
+ }
71
+ if (pattern.type === AST_NODE_TYPES.ArrayPattern) {
72
+ for (const element of pattern.elements) {
73
+ if (element !== null) {
74
+ collectPatternNames(element, names);
75
+ }
76
+ }
77
+ }
78
+ if (pattern.type === AST_NODE_TYPES.ObjectPattern) {
79
+ for (const property of pattern.properties) {
80
+ if (property.type === AST_NODE_TYPES.Property) {
81
+ collectPatternNames(property.value, names);
82
+ }
83
+ if (property.type === AST_NODE_TYPES.RestElement) {
84
+ collectPatternNames(property.argument, names);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Collects top-level binding names to avoid collisions with inserted imports.
91
+ * @param statements Program statements.
92
+ * @returns All top-level names in the file.
93
+ * @example
94
+ * ```ts
95
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
96
+ * ```
97
+ */
98
+ function collectTopLevelNames(statements) {
99
+ const names = new Set();
100
+ for (const statement of statements) {
101
+ if (statement.type === AST_NODE_TYPES.ImportDeclaration) {
102
+ for (const specifier of statement.specifiers) {
103
+ names.add(specifier.local.name);
104
+ }
105
+ continue;
106
+ }
107
+ if (statement.type === AST_NODE_TYPES.ExportNamedDeclaration) {
108
+ if (statement.declaration !== null &&
109
+ isNamedDeclaration(statement.declaration)) {
110
+ collectDeclarationNames(statement.declaration, names);
111
+ }
112
+ continue;
113
+ }
114
+ if (statement.type === AST_NODE_TYPES.ExportDefaultDeclaration) {
115
+ if (isNamedDeclaration(statement.declaration)) {
116
+ collectDeclarationNames(statement.declaration, names);
117
+ }
118
+ continue;
119
+ }
120
+ if (isNamedDeclaration(statement)) {
121
+ collectDeclarationNames(statement, names);
122
+ }
123
+ }
124
+ return names;
125
+ }
126
+ /**
127
+ * Checks whether a node is a declaration that introduces top-level names.
128
+ * @param node Node to inspect.
129
+ * @returns True when the node is a supported declaration.
130
+ * @example
131
+ * ```ts
132
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
133
+ * ```
134
+ */
135
+ function isNamedDeclaration(node) {
136
+ return namedDeclarationTypes.has(node.type);
137
+ }
138
+ /**
139
+ * Checks whether a declaration introduces a type-like top-level name.
140
+ * @param declaration Declaration to inspect.
141
+ * @returns True when the declaration is a type alias, interface, or enum.
142
+ * @example
143
+ * ```ts
144
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
145
+ * ```
146
+ */
147
+ function isTypeLikeDeclaration(declaration) {
148
+ return typeLikeDeclarationTypes.has(declaration.type);
149
+ }
150
+ export { collectTopLevelNames };
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1uYW1lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9uby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0L3J1bGUtbmFtZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQVl6RSxpREFBaUQ7QUFDakQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNwQyxjQUFjLENBQUMsZ0JBQWdCO0lBQy9CLGNBQWMsQ0FBQyxtQkFBbUI7SUFDbEMsY0FBYyxDQUFDLGlCQUFpQjtJQUNoQyxjQUFjLENBQUMsc0JBQXNCO0lBQ3JDLGNBQWMsQ0FBQyxtQkFBbUI7SUFDbEMsY0FBYyxDQUFDLHNCQUFzQjtJQUNyQyxjQUFjLENBQUMsbUJBQW1CO0NBQ25DLENBQUMsQ0FBQztBQUVILHNFQUFzRTtBQUN0RSxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3ZDLGNBQWMsQ0FBQyxpQkFBaUI7SUFDaEMsY0FBYyxDQUFDLHNCQUFzQjtJQUNyQyxjQUFjLENBQUMsc0JBQXNCO0NBQ3RDLENBQUMsQ0FBQztBQUVIOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsV0FBNkIsRUFDN0IsS0FBa0I7SUFFbEIsSUFDRSxXQUFXLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUI7UUFDdkQsV0FBVyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsZ0JBQWdCLEVBQ3BELENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksV0FBVyxDQUFDLElBQUksS0FB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WCxDQUFDO1FBRUQsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzdELElBQ0UsU0FBUyxDQUFDLFdBQVcsS0FBSyxJQUFJO2dCQUM5QixrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQ3pDLENBQUM7Z0JBQ0QsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDL0QsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixJQUU2QjtJQUU3QixPQUFPLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsV0FBNkI7SUFLN0IsT0FBTyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVF9OT0RFX1RZUEVTLCB0eXBlIFRTRVNUcmVlIH0gZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC91dGlsc1wiO1xuXG4vKiogU3VwcG9ydGVkIGRlY2xhcmF0aW9uIHNoYXBlcyB0aGF0IGNhbiBpbnRyb2R1Y2UgdG9wLWxldmVsIG5hbWVzLiAqL1xudHlwZSBOYW1lZERlY2xhcmF0aW9uID1cbiAgfCBUU0VTVHJlZS5DbGFzc0RlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuRnVuY3Rpb25EZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTRW51bURlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuVFNJbnRlcmZhY2VEZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTTW9kdWxlRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuVmFyaWFibGVEZWNsYXJhdGlvbjtcblxuLyoqIE5vZGUgdHlwZXMgdGhhdCBpbnRyb2R1Y2UgdG9wLWxldmVsIG5hbWVzLiAqL1xuY29uc3QgbmFtZWREZWNsYXJhdGlvblR5cGVzID0gbmV3IFNldChbXG4gIEFTVF9OT0RFX1RZUEVTLkNsYXNzRGVjbGFyYXRpb24sXG4gIEFTVF9OT0RFX1RZUEVTLkZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEFTVF9OT0RFX1RZUEVTLlRTRW51bURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU01vZHVsZURlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBBU1RfTk9ERV9UWVBFUy5WYXJpYWJsZURlY2xhcmF0aW9uLFxuXSk7XG5cbi8qKiBUeXBlLWxpa2UgZGVjbGFyYXRpb24gbm9kZSB0eXBlcyBoYW5kbGVkIGJ5IHRoZSBuYW1lIGNvbGxlY3Rvci4gKi9cbmNvbnN0IHR5cGVMaWtlRGVjbGFyYXRpb25UeXBlcyA9IG5ldyBTZXQoW1xuICBBU1RfTk9ERV9UWVBFUy5UU0VudW1EZWNsYXJhdGlvbixcbiAgQVNUX05PREVfVFlQRVMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgQVNUX05PREVfVFlQRVMuVFNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbl0pO1xuXG4vKipcbiAqIENvbGxlY3RzIGRlY2xhcmF0aW9uIGlkZW50aWZpZXJzIGZyb20gdG9wLWxldmVsIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSBkZWNsYXJhdGlvbiBEZWNsYXJhdGlvbiBub2RlLlxuICogQHBhcmFtIG5hbWVzIE91dHB1dCBuYW1lIHNldC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3REZWNsYXJhdGlvbk5hbWVzKFxuICBkZWNsYXJhdGlvbjogTmFtZWREZWNsYXJhdGlvbixcbiAgbmFtZXM6IFNldDxzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGlmIChcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8XG4gICAgZGVjbGFyYXRpb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuQ2xhc3NEZWNsYXJhdGlvblxuICApIHtcbiAgICBpZiAoZGVjbGFyYXRpb24uaWQgIT09IG51bGwpIHtcbiAgICAgIG5hbWVzLmFkZChkZWNsYXJhdGlvbi5pZC5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zKSB7XG4gICAgICBjb2xsZWN0UGF0dGVybk5hbWVzKHZhcmlhYmxlRGVjbGFyYXRpb24uaWQsIG5hbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzVHlwZUxpa2VEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRlY2xhcmF0aW9uLmlkLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBpZGVudGlmaWVycyBmcm9tIGEgYmluZGluZyBwYXR0ZXJuLlxuICogQHBhcmFtIHBhdHRlcm4gQmluZGluZyBwYXR0ZXJuLlxuICogQHBhcmFtIG5hbWVzIE91dHB1dCBuYW1lIHNldC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybjogVFNFU1RyZWUuTm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gIGlmIChwYXR0ZXJuLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICBuYW1lcy5hZGQocGF0dGVybi5uYW1lKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5Bc3NpZ25tZW50UGF0dGVybikge1xuICAgIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybi5sZWZ0LCBuYW1lcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhdHRlcm4udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUmVzdEVsZW1lbnQpIHtcbiAgICBjb2xsZWN0UGF0dGVybk5hbWVzKHBhdHRlcm4uYXJndW1lbnQsIG5hbWVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5BcnJheVBhdHRlcm4pIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGF0dGVybi5lbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhlbGVtZW50LCBuYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhdHRlcm4udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuT2JqZWN0UGF0dGVybikge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcGF0dGVybi5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAocHJvcGVydHkudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUHJvcGVydHkpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhwcm9wZXJ0eS52YWx1ZSwgbmFtZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHkudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUmVzdEVsZW1lbnQpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhwcm9wZXJ0eS5hcmd1bWVudCwgbmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIHRvcC1sZXZlbCBiaW5kaW5nIG5hbWVzIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBpbnNlcnRlZCBpbXBvcnRzLlxuICogQHBhcmFtIHN0YXRlbWVudHMgUHJvZ3JhbSBzdGF0ZW1lbnRzLlxuICogQHJldHVybnMgQWxsIHRvcC1sZXZlbCBuYW1lcyBpbiB0aGUgZmlsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUb3BMZXZlbE5hbWVzKHN0YXRlbWVudHM6IHJlYWRvbmx5IHVua25vd25bXSk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzIGFzIFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnRbXSkge1xuICAgIGlmIChzdGF0ZW1lbnQudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSW1wb3J0RGVjbGFyYXRpb24pIHtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHN0YXRlbWVudC5zcGVjaWZpZXJzKSB7XG4gICAgICAgIG5hbWVzLmFkZChzcGVjaWZpZXIubG9jYWwubmFtZSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhdGVtZW50LmRlY2xhcmF0aW9uICE9PSBudWxsICYmXG4gICAgICAgIGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQuZGVjbGFyYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgY29sbGVjdERlY2xhcmF0aW9uTmFtZXMoc3RhdGVtZW50LmRlY2xhcmF0aW9uLCBuYW1lcyk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbikge1xuICAgICAgaWYgKGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQuZGVjbGFyYXRpb24pKSB7XG4gICAgICAgIGNvbGxlY3REZWNsYXJhdGlvbk5hbWVzKHN0YXRlbWVudC5kZWNsYXJhdGlvbiwgbmFtZXMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICBjb2xsZWN0RGVjbGFyYXRpb25OYW1lcyhzdGF0ZW1lbnQsIG5hbWVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCBpbnRyb2R1Y2VzIHRvcC1sZXZlbCBuYW1lcy5cbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgbm9kZSBpcyBhIHN1cHBvcnRlZCBkZWNsYXJhdGlvbi5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGlzTmFtZWREZWNsYXJhdGlvbihcbiAgbm9kZTpcbiAgICB8IFRTRVNUcmVlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbltcImRlY2xhcmF0aW9uXCJdXG4gICAgfCBUU0VTVHJlZS5Qcm9ncmFtU3RhdGVtZW50LFxuKTogbm9kZSBpcyBOYW1lZERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIG5hbWVkRGVjbGFyYXRpb25UeXBlcy5oYXMobm9kZS50eXBlKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGRlY2xhcmF0aW9uIGludHJvZHVjZXMgYSB0eXBlLWxpa2UgdG9wLWxldmVsIG5hbWUuXG4gKiBAcGFyYW0gZGVjbGFyYXRpb24gRGVjbGFyYXRpb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgZGVjbGFyYXRpb24gaXMgYSB0eXBlIGFsaWFzLCBpbnRlcmZhY2UsIG9yIGVudW0uXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc1R5cGVMaWtlRGVjbGFyYXRpb24oXG4gIGRlY2xhcmF0aW9uOiBOYW1lZERlY2xhcmF0aW9uLFxuKTogZGVjbGFyYXRpb24gaXNcbiAgfCBUU0VTVHJlZS5UU0VudW1EZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHR5cGVMaWtlRGVjbGFyYXRpb25UeXBlcy5oYXMoZGVjbGFyYXRpb24udHlwZSk7XG59XG5cbmV4cG9ydCB7IGNvbGxlY3RUb3BMZXZlbE5hbWVzIH07XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import type { Rule } from "eslint";
2
+ import type { MockFactoryMatch } from "./rule-detection.js";
3
+ /**
4
+ * Builds all fixes for one unsafe mock factory.
5
+ * @param context Rule context.
6
+ * @param fixer ESLint fixer.
7
+ * @param match Unsafe mock factory details.
8
+ * @returns All fixer operations.
9
+ * @example
10
+ * ```ts
11
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
12
+ * ```
13
+ */
14
+ declare function buildFixes(context: Rule.RuleContext, fixer: Rule.RuleFixer, match: MockFactoryMatch): Rule.Fix[];
15
+ export { buildFixes };
16
+ //# sourceMappingURL=rule-reporting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-reporting.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAmBzD;;;;;;;;;;GAUG;AACH,iBAAS,UAAU,CACjB,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,KAAK,EAAE,IAAI,CAAC,SAAS,EACrB,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAAC,GAAG,EAAE,CAuBZ;AA0GD,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ import { collectTopLevelNames } from "./rule-names.js";
3
+ /** Default suffix for generated namespace imports. */
4
+ const moduleTypeSuffix = "Module";
5
+ /**
6
+ * Builds all fixes for one unsafe mock factory.
7
+ * @param context Rule context.
8
+ * @param fixer ESLint fixer.
9
+ * @param match Unsafe mock factory details.
10
+ * @returns All fixer operations.
11
+ * @example
12
+ * ```ts
13
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
14
+ * ```
15
+ */
16
+ function buildFixes(context, fixer, match) {
17
+ const sourceCode = context.sourceCode;
18
+ const moduleTypeImport = resolveModuleTypeImport(sourceCode, match.moduleSpecifier);
19
+ const factoryText = `createMockProxy<typeof ${moduleTypeImport.namespaceName}>(${sourceCode.getText(match.mockExpression)})`;
20
+ const fixes = [
21
+ fixer.replaceTextRange(match.mockFactoryNode.range, factoryText),
22
+ ];
23
+ if (!moduleTypeImport.isExisting) {
24
+ const importText = `import type * as ${moduleTypeImport.namespaceName} from ${JSON.stringify(match.moduleSpecifier)};`;
25
+ const insertionRange = getImportInsertionRange(sourceCode);
26
+ fixes.push(insertionRange === void 0
27
+ ? fixer.insertTextBeforeRange([0, 0], `${importText}\n\n`)
28
+ : fixer.insertTextAfterRange(insertionRange, `\n${importText}`));
29
+ }
30
+ return fixes;
31
+ }
32
+ /**
33
+ * Creates a namespace import name from a module specifier.
34
+ * @param moduleSpecifier Module path.
35
+ * @returns PascalCase namespace name.
36
+ * @example
37
+ * ```ts
38
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
39
+ * ```
40
+ */
41
+ function createNamespaceName(moduleSpecifier) {
42
+ const baseName = moduleSpecifier
43
+ .split("/")
44
+ .findLast((segment) => segment.length > 0 && segment !== ".")
45
+ ?.replace(/\.[^./\\]+$/, "") ?? "Module";
46
+ const pascalName = baseName
47
+ .replaceAll(/[^\dA-Za-z]+/g, " ")
48
+ .split(" ")
49
+ .filter((segment) => segment.length > 0)
50
+ .map((segment) => segment.slice(0, 1).toUpperCase() + segment.slice(1))
51
+ .join("");
52
+ return pascalName.endsWith(moduleTypeSuffix)
53
+ ? pascalName
54
+ : `${pascalName}${moduleTypeSuffix}`;
55
+ }
56
+ /**
57
+ * Returns the range after the final import declaration.
58
+ * @param sourceCode Source code to inspect.
59
+ * @returns Range of the last import statement when present.
60
+ * @example
61
+ * ```ts
62
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
63
+ * ```
64
+ */
65
+ function getImportInsertionRange(sourceCode) {
66
+ let lastImportRange;
67
+ for (const statement of sourceCode.ast.body) {
68
+ if (statement.type === AST_NODE_TYPES.ImportDeclaration &&
69
+ statement.range !== void 0) {
70
+ lastImportRange = statement.range;
71
+ }
72
+ }
73
+ return lastImportRange;
74
+ }
75
+ /**
76
+ * Resolves the namespace import to use for `typeof Namespace`.
77
+ * @param sourceCode Source code for import inspection.
78
+ * @param moduleSpecifier Module path being mocked.
79
+ * @returns Existing or generated namespace import details.
80
+ * @example
81
+ * ```ts
82
+ * // Internal helper for no-unsafe-vitest-mock-factory-cast.
83
+ * ```
84
+ */
85
+ function resolveModuleTypeImport(sourceCode, moduleSpecifier) {
86
+ const statements = sourceCode.ast.body;
87
+ const preferredName = createNamespaceName(moduleSpecifier);
88
+ for (const statement of statements) {
89
+ if (statement.type !== AST_NODE_TYPES.ImportDeclaration ||
90
+ statement.source.value !== moduleSpecifier) {
91
+ continue;
92
+ }
93
+ for (const specifier of statement.specifiers) {
94
+ if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {
95
+ return { isExisting: true, namespaceName: specifier.local.name };
96
+ }
97
+ }
98
+ }
99
+ const usedNames = collectTopLevelNames(statements);
100
+ let namespaceName = preferredName;
101
+ let suffix = 1;
102
+ while (usedNames.has(namespaceName)) {
103
+ namespaceName = `${preferredName}${suffix.toFixed(0)}`;
104
+ suffix += 1;
105
+ }
106
+ return { isExisting: false, namespaceName };
107
+ }
108
+ export { buildFixes };
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1yZXBvcnRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tYWluL3Rlc3Rpbmcvbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC9ydWxlLXJlcG9ydGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBSXpFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWNwRCxzREFBc0Q7QUFDdEQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsVUFBVSxDQUNqQixPQUF5QixFQUN6QixLQUFxQixFQUNyQixLQUF1QjtJQUV2QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQXVCLENBQzlDLFVBQVUsRUFDVixLQUFLLENBQUMsZUFBZSxDQUN0QixDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLGdCQUFnQixDQUFDLGFBQWEsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUF1QixDQUFDLEdBQUcsQ0FBQztJQUN0SSxNQUFNLEtBQUssR0FBZTtRQUN4QixLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO0tBQ2pFLENBQUM7SUFFRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLGdCQUFnQixDQUFDLGFBQWEsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO1FBQ3ZILE1BQU0sY0FBYyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNELEtBQUssQ0FBQyxJ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b0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxJQUFJLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDbEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDcEMsYUFBYSxHQUFHLEdBQUcsYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzlDLENBQUM7QUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5cbmltcG9ydCB7IEFTVF9OT0RFX1RZUEVTLCB0eXBlIFRTRVNUcmVlIH0gZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC91dGlsc1wiO1xuXG5pbXBvcnQgdHlwZSB7IE1vY2tGYWN0b3J5TWF0Y2ggfSBmcm9tIFwiLi9ydWxlLWRldGVjdGlvblwiO1xuXG5pbXBvcnQgeyBjb2xsZWN0VG9wTGV2ZWxOYW1lcyB9IGZyb20gXCIuL3J1bGUtbmFtZXNcIjtcblxuLyoqIE5hbWVzcGFjZSBpbXBvcnQgZGV0YWlscyBmb3IgdGhlIG1vY2tlZCBtb2R1bGUuICovXG5pbnRlcmZhY2UgTW9kdWxlVHlwZUltcG9ydCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBuYW1lc3BhY2UgaW1wb3J0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBmaWxlLiAqL1xuICBpc0V4aXN0aW5nOiBib29sZWFuO1xuXG4gIC8qKiBOYW1lc3BhY2UgaWRlbnRpZmllciB1c2VkIGluIGB0eXBlb2YgTmFtZXNwYWNlYC4gKi9cbiAgbmFtZXNwYWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogTWluaW1hbCBzb3VyY2UtY29kZSBzdXJmYWNlIHVzZWQgYnkgdGhlIHJ1bGUuICovXG50eXBlIFNvdXJjZUNvZGVMaWtlID0gUGljazxSdWxlLlJ1bGVDb250ZXh0W1wic291cmNlQ29kZVwiXSwgXCJhc3RcIiB8IFwiZ2V0VGV4dFwiPjtcblxuLyoqIERlZmF1bHQgc3VmZml4IGZvciBnZW5lcmF0ZWQgbmFtZXNwYWNlIGltcG9ydHMuICovXG5jb25zdCBtb2R1bGVUeXBlU3VmZml4ID0gXCJNb2R1bGVcIjtcblxuLyoqXG4gKiBCdWlsZHMgYWxsIGZpeGVzIGZvciBvbmUgdW5zYWZlIG1vY2sgZmFjdG9yeS5cbiAqIEBwYXJhbSBjb250ZXh0IFJ1bGUgY29udGV4dC5cbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXG4gKiBAcGFyYW0gbWF0Y2ggVW5zYWZlIG1vY2sgZmFjdG9yeSBkZXRhaWxzLlxuICogQHJldHVybnMgQWxsIGZpeGVyIG9wZXJhdGlvbnMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBidWlsZEZpeGVzKFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0LFxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXG4gIG1hdGNoOiBNb2NrRmFjdG9yeU1hdGNoLFxuKTogUnVsZS5GaXhbXSB7XG4gIGNvbnN0IHNvdXJjZUNvZGUgPSBjb250ZXh0LnNvdXJjZUNvZGU7XG4gIGNvbnN0IG1vZHVsZVR5cGVJbXBvcnQgPSByZXNvbHZlTW9kdWxlVHlwZUltcG9ydChcbiAgICBzb3VyY2VDb2RlLFxuICAgIG1hdGNoLm1vZHVsZVNwZWNpZmllcixcbiAgKTtcbiAgY29uc3QgZmFjdG9yeVRleHQgPSBgY3JlYXRlTW9ja1Byb3h5PHR5cGVvZiAke21vZHVsZVR5cGVJbXBvcnQubmFtZXNwYWNlTmFtZX0+KCR7c291cmNlQ29kZS5nZXRUZXh0KG1hdGNoLm1vY2tFeHByZXNzaW9uIGFzIG5ldmVyKX0pYDtcbiAgY29uc3QgZml4ZXM6IFJ1bGUuRml4W10gPSBbXG4gICAgZml4ZXIucmVwbGFjZVRleHRSYW5nZShtYXRjaC5tb2NrRmFjdG9yeU5vZGUucmFuZ2UsIGZhY3RvcnlUZXh0KSxcbiAgXTtcblxuICBpZiAoIW1vZHVsZVR5cGVJbXBvcnQuaXNFeGlzdGluZykge1xuICAgIGNvbnN0IGltcG9ydFRleHQgPSBgaW1wb3J0IHR5cGUgKiBhcyAke21vZHVsZVR5cGVJbXBvcnQubmFtZXNwYWNlTmFtZX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KG1hdGNoLm1vZHVsZVNwZWNpZmllcil9O2A7XG4gICAgY29uc3QgaW5zZXJ0aW9uUmFuZ2UgPSBnZXRJbXBvcnRJbnNlcnRpb25SYW5nZShzb3VyY2VDb2RlKTtcblxuICAgIGZpeGVzLnB1c2goXG4gICAgICBpbnNlcnRpb25SYW5nZSA9PT0gdm9pZCAwXG4gICAgICAgID8gZml4ZXIuaW5zZXJ0VGV4dEJlZm9yZVJhbmdlKFswLCAwXSwgYCR7aW1wb3J0VGV4dH1cXG5cXG5gKVxuICAgICAgICA6IGZpeGVyLmluc2VydFRleHRBZnRlclJhbmdlKGluc2VydGlvblJhbmdlLCBgXFxuJHtpbXBvcnRUZXh0fWApLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZml4ZXM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5hbWVzcGFjZSBpbXBvcnQgbmFtZSBmcm9tIGEgbW9kdWxlIHNwZWNpZmllci5cbiAqIEBwYXJhbSBtb2R1bGVTcGVjaWZpZXIgTW9kdWxlIHBhdGguXG4gKiBAcmV0dXJucyBQYXNjYWxDYXNlIG5hbWVzcGFjZSBuYW1lLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTmFtZXNwYWNlTmFtZShtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2VOYW1lID1cbiAgICBtb2R1bGVTcGVjaWZpZXJcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5maW5kTGFzdCgoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwICYmIHNlZ21lbnQgIT09IFwiLlwiKVxuICAgICAgPy5yZXBsYWNlKC9cXC5bXi4vXFxcXF0rJC8sIFwiXCIpID8/IFwiTW9kdWxlXCI7XG5cbiAgY29uc3QgcGFzY2FsTmFtZSA9IGJhc2VOYW1lXG4gICAgLnJlcGxhY2VBbGwoL1teXFxkQS1aYS16XSsvZywgXCIgXCIpXG4gICAgLnNwbGl0KFwiIFwiKVxuICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQubGVuZ3RoID4gMClcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzZWdtZW50LnNsaWNlKDEpKVxuICAgIC5qb2luKFwiXCIpO1xuXG4gIHJldHVybiBwYXNjYWxOYW1lLmVuZHNXaXRoKG1vZHVsZVR5cGVTdWZmaXgpXG4gICAgPyBwYXNjYWxOYW1lXG4gICAgOiBgJHtwYXNjYWxOYW1lfSR7bW9kdWxlVHlwZVN1ZmZpeH1gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJhbmdlIGFmdGVyIHRoZSBmaW5hbCBpbXBvcnQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gc291cmNlQ29kZSBTb3VyY2UgY29kZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgUmFuZ2Ugb2YgdGhlIGxhc3QgaW1wb3J0IHN0YXRlbWVudCB3aGVuIHByZXNlbnQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRJbXBvcnRJbnNlcnRpb25SYW5nZShcbiAgc291cmNlQ29kZTogU291cmNlQ29kZUxpa2UsXG4pOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGxhc3RJbXBvcnRSYW5nZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2VDb2RlLmFzdC5ib2R5IGFzIHVua25vd24gYXMge1xuICAgIC8qKiBTdGF0ZW1lbnQgcmFuZ2Ugd2hlbiBwcm92aWRlZCBieSBwYXJzZXIgb3B0aW9ucy4gKi9cbiAgICByYW5nZT86IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAvKiogVG9wLWxldmVsIHN0YXRlbWVudCBub2RlIHR5cGUuICovXG4gICAgdHlwZTogVFNFU1RyZWUuUHJvZ3JhbVN0YXRlbWVudFtcInR5cGVcIl07XG4gIH1bXSkge1xuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5JbXBvcnREZWNsYXJhdGlvbiAmJlxuICAgICAgc3RhdGVtZW50LnJhbmdlICE9PSB2b2lkIDBcbiAgICApIHtcbiAgICAgIGxhc3RJbXBvcnRSYW5nZSA9IHN0YXRlbWVudC5yYW5nZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGFzdEltcG9ydFJhbmdlO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBuYW1lc3BhY2UgaW1wb3J0IHRvIHVzZSBmb3IgYHR5cGVvZiBOYW1lc3BhY2VgLlxuICogQHBhcmFtIHNvdXJjZUNvZGUgU291cmNlIGNvZGUgZm9yIGltcG9ydCBpbnNwZWN0aW9uLlxuICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciBNb2R1bGUgcGF0aCBiZWluZyBtb2NrZWQuXG4gKiBAcmV0dXJucyBFeGlzdGluZyBvciBnZW5lcmF0ZWQgbmFtZXNwYWNlIGltcG9ydCBkZXRhaWxzLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZHVsZVR5cGVJbXBvcnQoXG4gIHNvdXJjZUNvZGU6IFNvdXJjZUNvZGVMaWtlLFxuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyxcbik6IE1vZHVsZVR5cGVJbXBvcnQge1xuICBjb25zdCBzdGF0ZW1lbnRzID0gc291cmNlQ29kZS5hc3QuYm9keTtcbiAgY29uc3QgcHJlZmVycmVkTmFtZSA9IGNyZWF0ZU5hbWVzcGFjZU5hbWUobW9kdWxlU3BlY2lmaWVyKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzIGFzIFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnRbXSkge1xuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudC50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5JbXBvcnREZWNsYXJhdGlvbiB8fFxuICAgICAgc3RhdGVtZW50LnNvdXJjZS52YWx1ZSAhPT0gbW9kdWxlU3BlY2lmaWVyXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNwZWNpZmllciBvZiBzdGF0ZW1lbnQuc3BlY2lmaWVycykge1xuICAgICAgaWYgKHNwZWNpZmllci50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNFeGlzdGluZzogdHJ1ZSwgbmFtZXNwYWNlTmFtZTogc3BlY2lmaWVyLmxvY2FsLm5hbWUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB1c2VkTmFtZXMgPSBjb2xsZWN0VG9wTGV2ZWxOYW1lcyhzdGF0ZW1lbnRzKTtcbiAgbGV0IG5hbWVzcGFjZU5hbWUgPSBwcmVmZXJyZWROYW1lO1xuICBsZXQgc3VmZml4ID0gMTtcblxuICB3aGlsZSAodXNlZE5hbWVzLmhhcyhuYW1lc3BhY2VOYW1lKSkge1xuICAgIG5hbWVzcGFjZU5hbWUgPSBgJHtwcmVmZXJyZWROYW1lfSR7c3VmZml4LnRvRml4ZWQoMCl9YDtcbiAgICBzdWZmaXggKz0gMTtcbiAgfVxuXG4gIHJldHVybiB7IGlzRXhpc3Rpbmc6IGZhbHNlLCBuYW1lc3BhY2VOYW1lIH07XG59XG5cbmV4cG9ydCB7IGJ1aWxkRml4ZXMgfTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import type { Rule } from "eslint";
2
+ /** Disallows casted `vi.mock` and `vi.doMock` factories. */
3
+ declare const noUnsafeVitestMockFactoryCastRule: Rule.RuleModule;
4
+ export { noUnsafeVitestMockFactoryCastRule };
5
+ //# sourceMappingURL=rule.d.ts.map