@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.
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts +16 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +131 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +48 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.js +126 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +40 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +90 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts +11 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule.js +218 -0
- package/dist/architecture/consistent-barrel-files/index.d.ts +5 -0
- package/dist/architecture/consistent-barrel-files/index.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/index.js +4 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts +11 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +100 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +40 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +90 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts +65 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +154 -0
- package/dist/architecture/consistent-barrel-files/rule.d.ts +11 -0
- package/dist/architecture/consistent-barrel-files/rule.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/rule.js +58 -0
- package/dist/architecture/consistent-barrel-files/test-helpers.d.ts +141 -0
- package/dist/architecture/consistent-barrel-files/test-helpers.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/test-helpers.js +229 -0
- package/dist/architecture/consistent-barrel-files/types.d.ts +25 -0
- package/dist/architecture/consistent-barrel-files/types.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/types.js +2 -0
- package/dist/architecture/index.d.ts +2 -0
- package/dist/architecture/index.d.ts.map +1 -0
- package/dist/architecture/index.js +2 -0
- package/dist/benchmark-rules.d.ts +83 -0
- package/dist/benchmark-rules.d.ts.map +1 -0
- package/dist/benchmark-rules.js +175 -0
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/codeperfect-plugin.d.ts +46 -0
- package/dist/codeperfect-plugin.d.ts.map +1 -0
- package/dist/codeperfect-plugin.js +29 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/no-multiple-declarators/index.d.ts +2 -0
- package/dist/core/no-multiple-declarators/index.d.ts.map +1 -0
- package/dist/core/no-multiple-declarators/index.js +2 -0
- package/dist/core/no-multiple-declarators/rule.d.ts +4 -0
- package/dist/core/no-multiple-declarators/rule.d.ts.map +1 -0
- package/dist/core/no-multiple-declarators/rule.js +100 -0
- package/dist/core/prefer-interface-types/index.d.ts +2 -0
- package/dist/core/prefer-interface-types/index.d.ts.map +1 -0
- package/dist/core/prefer-interface-types/index.js +2 -0
- package/dist/core/prefer-interface-types/rule.d.ts +5 -0
- package/dist/core/prefer-interface-types/rule.d.ts.map +1 -0
- package/dist/core/prefer-interface-types/rule.js +145 -0
- package/dist/core/prefer-interface-types/test-helpers.d.ts +110 -0
- package/dist/core/prefer-interface-types/test-helpers.d.ts.map +1 -0
- package/dist/core/prefer-interface-types/test-helpers.js +116 -0
- package/dist/custom-rule-documentation.d.ts +36 -0
- package/dist/custom-rule-documentation.d.ts.map +1 -0
- package/dist/custom-rule-documentation.js +35 -0
- package/dist/custom-rules.d.ts +61 -0
- package/dist/custom-rules.d.ts.map +1 -0
- package/dist/custom-rules.js +70 -0
- package/dist/docs/index.d.ts +4 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +4 -0
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts +89 -0
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.js +129 -0
- package/dist/docs/no-interface-member-docs/comment-utilities.d.ts +48 -0
- package/dist/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/comment-utilities.js +146 -0
- package/dist/docs/no-interface-member-docs/index.d.ts +2 -0
- package/dist/docs/no-interface-member-docs/index.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/index.js +2 -0
- package/dist/docs/no-interface-member-docs/parameter-tags.d.ts +13 -0
- package/dist/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/parameter-tags.js +101 -0
- package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts +24 -0
- package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/parameter-utilities.js +125 -0
- package/dist/docs/no-interface-member-docs/rule.d.ts +5 -0
- package/dist/docs/no-interface-member-docs/rule.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/rule.js +168 -0
- package/dist/docs/no-interface-member-docs/test-helpers.d.ts +103 -0
- package/dist/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/test-helpers.js +157 -0
- package/dist/docs/no-interface-member-docs/types.d.ts +30 -0
- package/dist/docs/no-interface-member-docs/types.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/types.js +2 -0
- package/dist/docs/require-example-language/empty-fence-fixes.d.ts +29 -0
- package/dist/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -0
- package/dist/docs/require-example-language/empty-fence-fixes.js +169 -0
- package/dist/docs/require-example-language/example-utilities.d.ts +70 -0
- package/dist/docs/require-example-language/example-utilities.d.ts.map +1 -0
- package/dist/docs/require-example-language/example-utilities.js +76 -0
- package/dist/docs/require-example-language/examples.d.ts +36 -0
- package/dist/docs/require-example-language/examples.d.ts.map +1 -0
- package/dist/docs/require-example-language/examples.js +181 -0
- package/dist/docs/require-example-language/fixes.d.ts +49 -0
- package/dist/docs/require-example-language/fixes.d.ts.map +1 -0
- package/dist/docs/require-example-language/fixes.js +182 -0
- package/dist/docs/require-example-language/index.d.ts +3 -0
- package/dist/docs/require-example-language/index.d.ts.map +1 -0
- package/dist/docs/require-example-language/index.js +2 -0
- package/dist/docs/require-example-language/reporting.d.ts +60 -0
- package/dist/docs/require-example-language/reporting.d.ts.map +1 -0
- package/dist/docs/require-example-language/reporting.js +145 -0
- package/dist/docs/require-example-language/rule.d.ts +7 -0
- package/dist/docs/require-example-language/rule.d.ts.map +1 -0
- package/dist/docs/require-example-language/rule.js +34 -0
- package/dist/docs/require-example-language/types.d.ts +22 -0
- package/dist/docs/require-example-language/types.d.ts.map +1 -0
- package/dist/docs/require-example-language/types.js +2 -0
- package/dist/docs/single-line-jsdoc/index.d.ts +2 -0
- package/dist/docs/single-line-jsdoc/index.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/index.js +2 -0
- package/dist/docs/single-line-jsdoc/rule.d.ts +5 -0
- package/dist/docs/single-line-jsdoc/rule.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/rule.js +196 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts +16 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.js +95 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts +25 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +140 -0
- package/dist/docs/test-helpers.d.ts +50 -0
- package/dist/docs/test-helpers.d.ts.map +1 -0
- package/dist/docs/test-helpers.js +107 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/presets.d.ts +10 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +50 -0
- package/dist/rules/index.d.ts +5 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +6 -0
- package/dist/testing/aaa/analyzer.d.ts +36 -0
- package/dist/testing/aaa/analyzer.d.ts.map +1 -0
- package/dist/testing/aaa/analyzer.js +490 -0
- package/dist/testing/aaa/index.d.ts +3 -0
- package/dist/testing/aaa/index.d.ts.map +1 -0
- package/dist/testing/aaa/index.js +2 -0
- package/dist/testing/aaa/types.d.ts +31 -0
- package/dist/testing/aaa/types.d.ts.map +1 -0
- package/dist/testing/aaa/types.js +2 -0
- package/dist/testing/assert-actual-expected-names/index.d.ts +2 -0
- package/dist/testing/assert-actual-expected-names/index.d.ts.map +1 -0
- package/dist/testing/assert-actual-expected-names/index.js +2 -0
- package/dist/testing/assert-actual-expected-names/rule.d.ts +4 -0
- package/dist/testing/assert-actual-expected-names/rule.d.ts.map +1 -0
- package/dist/testing/assert-actual-expected-names/rule.js +54 -0
- package/dist/testing/enforce-aaa-phase-purity/index.d.ts +2 -0
- package/dist/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-phase-purity/index.js +2 -0
- package/dist/testing/enforce-aaa-phase-purity/rule.d.ts +4 -0
- package/dist/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-phase-purity/rule.js +110 -0
- package/dist/testing/enforce-aaa-structure/index.d.ts +2 -0
- package/dist/testing/enforce-aaa-structure/index.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-structure/index.js +2 -0
- package/dist/testing/enforce-aaa-structure/rule.d.ts +4 -0
- package/dist/testing/enforce-aaa-structure/rule.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-structure/rule.js +48 -0
- package/dist/testing/index.d.ts +9 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +9 -0
- package/dist/testing/prefer-vi-mocked-import/fix.d.ts +16 -0
- package/dist/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/fix.js +224 -0
- package/dist/testing/prefer-vi-mocked-import/index.d.ts +2 -0
- package/dist/testing/prefer-vi-mocked-import/index.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/index.js +2 -0
- package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts +16 -0
- package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-bindings.js +52 -0
- package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts +16 -0
- package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-declarations.js +99 -0
- package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts +66 -0
- package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-helpers.js +102 -0
- package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts +17 -0
- package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-imports.js +156 -0
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts +42 -0
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.js +119 -0
- package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts +13 -0
- package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-walk.js +62 -0
- package/dist/testing/prefer-vi-mocked-import/match.d.ts +15 -0
- package/dist/testing/prefer-vi-mocked-import/match.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match.js +193 -0
- package/dist/testing/prefer-vi-mocked-import/rule.d.ts +5 -0
- package/dist/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/rule.js +32 -0
- package/dist/testing/prefer-vi-mocked-import/types.d.ts +83 -0
- package/dist/testing/prefer-vi-mocked-import/types.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/types.js +2 -0
- package/dist/testing/require-aaa-sections/index.d.ts +2 -0
- package/dist/testing/require-aaa-sections/index.d.ts.map +1 -0
- package/dist/testing/require-aaa-sections/index.js +2 -0
- package/dist/testing/require-aaa-sections/rule.d.ts +4 -0
- package/dist/testing/require-aaa-sections/rule.d.ts.map +1 -0
- package/dist/testing/require-aaa-sections/rule.js +111 -0
- package/dist/testing/require-act-result-capture/index.d.ts +2 -0
- package/dist/testing/require-act-result-capture/index.d.ts.map +1 -0
- package/dist/testing/require-act-result-capture/index.js +2 -0
- package/dist/testing/require-act-result-capture/rule.d.ts +4 -0
- package/dist/testing/require-act-result-capture/rule.d.ts.map +1 -0
- package/dist/testing/require-act-result-capture/rule.js +34 -0
- package/dist/testing/require-test-companion/index.d.ts +3 -0
- package/dist/testing/require-test-companion/index.d.ts.map +1 -0
- package/dist/testing/require-test-companion/index.js +3 -0
- package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts +16 -0
- package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-listeners.js +145 -0
- package/dist/testing/require-test-companion/require-test-companion-options.d.ts +54 -0
- package/dist/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-options.js +112 -0
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts +51 -0
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.js +183 -0
- package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts +28 -0
- package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-utilities.js +26 -0
- package/dist/testing/require-test-companion/rule.d.ts +5 -0
- package/dist/testing/require-test-companion/rule.d.ts.map +1 -0
- package/dist/testing/require-test-companion/rule.js +57 -0
- package/dist/testing/require-test-companion/types.d.ts +11 -0
- package/dist/testing/require-test-companion/types.d.ts.map +1 -0
- package/dist/testing/require-test-companion/types.js +2 -0
- package/dist/testing/single-act-statement/index.d.ts +2 -0
- package/dist/testing/single-act-statement/index.d.ts.map +1 -0
- package/dist/testing/single-act-statement/index.js +2 -0
- package/dist/testing/single-act-statement/rule.d.ts +4 -0
- package/dist/testing/single-act-statement/rule.d.ts.map +1 -0
- package/dist/testing/single-act-statement/rule.js +33 -0
- 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"}
|