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