@codeperfect/eslint-plugin 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +2 -0
  2. package/dist/application/custom-rules.d.ts +3 -0
  3. package/dist/application/custom-rules.d.ts.map +1 -1
  4. package/dist/application/custom-rules.js +6 -2
  5. package/dist/application/index.d.ts +1 -1
  6. package/dist/application/index.d.ts.map +1 -1
  7. package/dist/application/index.js +2 -2
  8. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  9. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +1 -11
  10. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -1
  11. package/dist/domain/architecture/consistent-barrel-files/consistent-barrel-files-options.js +6 -14
  12. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
  13. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +2 -4
  14. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.d.ts.map +1 -1
  15. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-rule.js +4 -134
  16. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts +14 -0
  17. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.d.ts.map +1 -0
  18. package/dist/domain/architecture/consistent-barrel-files/no-import-export-aliases-utilities.js +154 -0
  19. package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.d.ts.map +1 -1
  20. package/dist/domain/architecture/consistent-barrel-files/no-import-export-extensions-rule.js +10 -12
  21. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
  22. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +4 -11
  23. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -1
  24. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +2 -12
  25. package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
  26. package/dist/domain/architecture/consistent-barrel-files/rule.js +4 -3
  27. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts +14 -0
  28. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.d.ts.map +1 -0
  29. package/dist/domain/architecture/no-unused-exports/no-unused-exports-declaration-utilities.js +187 -0
  30. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts +26 -0
  31. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.d.ts.map +1 -0
  32. package/dist/domain/architecture/no-unused-exports/no-unused-exports-identifier-utilities.js +95 -0
  33. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts +32 -0
  34. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.d.ts.map +1 -0
  35. package/dist/domain/architecture/no-unused-exports/no-unused-exports-pattern-utilities.js +78 -0
  36. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts +18 -0
  37. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.d.ts.map +1 -0
  38. package/dist/domain/architecture/no-unused-exports/no-unused-exports-public-api-usage-utilities.js +45 -0
  39. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts +34 -0
  40. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.d.ts.map +1 -0
  41. package/dist/domain/architecture/no-unused-exports/no-unused-exports-record-utilities.js +44 -0
  42. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts +59 -0
  43. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.d.ts.map +1 -0
  44. package/dist/domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js +133 -0
  45. package/dist/domain/architecture/no-unused-exports/{no-unused-exports-utilities.d.ts → no-unused-exports-usage-utilities.d.ts} +2 -23
  46. package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.d.ts.map +1 -0
  47. package/dist/domain/architecture/no-unused-exports/no-unused-exports-usage-utilities.js +106 -0
  48. package/dist/domain/architecture/no-unused-exports/rule.js +4 -2
  49. package/dist/domain/core/index.d.ts +1 -0
  50. package/dist/domain/core/index.d.ts.map +1 -1
  51. package/dist/domain/core/index.js +2 -1
  52. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts +58 -0
  53. package/dist/domain/core/no-multiple-declarators/rule-utilities.d.ts.map +1 -0
  54. package/dist/domain/core/no-multiple-declarators/rule-utilities.js +204 -0
  55. package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
  56. package/dist/domain/core/no-multiple-declarators/rule.js +9 -211
  57. package/dist/domain/core/no-multiple-declarators/types.js +2 -2
  58. package/dist/domain/core/no-useless-delegation/index.d.ts +2 -0
  59. package/dist/domain/core/no-useless-delegation/index.d.ts.map +1 -0
  60. package/dist/domain/core/no-useless-delegation/index.js +2 -0
  61. package/dist/domain/core/no-useless-delegation/rule.d.ts +5 -0
  62. package/dist/domain/core/no-useless-delegation/rule.d.ts.map +1 -0
  63. package/dist/domain/core/no-useless-delegation/rule.js +200 -0
  64. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts +57 -0
  65. package/dist/domain/core/prefer-interface-types/rule-utilities.d.ts.map +1 -0
  66. package/dist/domain/core/prefer-interface-types/rule-utilities.js +105 -0
  67. package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
  68. package/dist/domain/core/prefer-interface-types/rule.js +2 -104
  69. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts +25 -0
  70. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.d.ts.map +1 -0
  71. package/dist/domain/docs/no-interface-member-docs/comment-removal-ranges.js +64 -0
  72. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts +2 -24
  73. package/dist/domain/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -1
  74. package/dist/domain/docs/no-interface-member-docs/comment-utilities.js +3 -65
  75. package/dist/domain/docs/no-interface-member-docs/parameter-tags.js +2 -2
  76. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +2 -2
  77. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  78. package/dist/domain/docs/no-interface-member-docs/rule.js +3 -2
  79. package/dist/domain/docs/require-example-language/examples-collect.d.ts +15 -0
  80. package/dist/domain/docs/require-example-language/examples-collect.d.ts.map +1 -0
  81. package/dist/domain/docs/require-example-language/examples-collect.js +113 -0
  82. package/dist/domain/docs/require-example-language/examples.d.ts +24 -13
  83. package/dist/domain/docs/require-example-language/examples.d.ts.map +1 -1
  84. package/dist/domain/docs/require-example-language/examples.js +2 -111
  85. package/dist/domain/docs/require-example-language/fixes.js +4 -4
  86. package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
  87. package/dist/domain/docs/require-example-language/rule.js +9 -8
  88. package/dist/domain/docs/require-example-language/types.d.ts.map +1 -1
  89. package/dist/domain/docs/require-example-language/types.js +1 -1
  90. package/dist/domain/index.d.ts +1 -1
  91. package/dist/domain/index.d.ts.map +1 -1
  92. package/dist/domain/index.js +2 -2
  93. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
  94. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +8 -8
  95. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -1
  96. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +10 -9
  97. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -1
  98. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +2 -5
  99. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +14 -16
  100. package/dist/domain/testing/aaa/analyzer.classification.traversal.js +6 -4
  101. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  102. package/dist/domain/testing/aaa/analyzer.super.js +10 -8
  103. package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -1
  104. package/dist/domain/testing/assert-actual-expected-names/rule.js +21 -23
  105. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.d.ts.map +1 -1
  106. package/dist/domain/testing/enforce-aaa-phase-purity/pattern-identifiers.js +1 -1
  107. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.d.ts.map +1 -1
  108. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.js +2 -160
  109. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts +41 -0
  110. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.d.ts.map +1 -0
  111. package/dist/domain/testing/enforce-aaa-phase-purity/statement-purity-reporters.js +161 -0
  112. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.d.ts.map +1 -1
  113. package/dist/domain/testing/enforce-aaa-structure/missing-section-fixes.js +2 -2
  114. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts +81 -0
  115. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.d.ts.map +1 -0
  116. package/dist/domain/testing/enforce-aaa-structure/rule-section-reporting.js +181 -0
  117. package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
  118. package/dist/domain/testing/enforce-aaa-structure/rule.js +28 -217
  119. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts +29 -0
  120. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.d.ts.map +1 -0
  121. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-detection.js +200 -0
  122. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts +12 -0
  123. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.d.ts.map +1 -0
  124. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-names.js +151 -0
  125. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts +16 -0
  126. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.d.ts.map +1 -0
  127. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule-reporting.js +109 -0
  128. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.d.ts.map +1 -1
  129. package/dist/domain/testing/no-unsafe-vitest-mock-factory-cast/rule.js +18 -450
  130. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.d.ts.map +1 -1
  131. package/dist/domain/testing/prefer-vi-mocked-import/fix-import-updates.js +7 -4
  132. package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.d.ts.map +1 -1
  133. package/dist/domain/testing/prefer-vi-mocked-import/fix-imports.js +7 -4
  134. package/dist/domain/testing/prefer-vi-mocked-import/fix.js +2 -2
  135. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts +18 -0
  136. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.d.ts.map +1 -0
  137. package/dist/domain/testing/prefer-vi-mocked-import/match-collisions.js +162 -0
  138. package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -1
  139. package/dist/domain/testing/prefer-vi-mocked-import/match-rewrites.js +5 -4
  140. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts +29 -0
  141. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.d.ts.map +1 -0
  142. package/dist/domain/testing/prefer-vi-mocked-import/match-seeds.js +100 -0
  143. package/dist/domain/testing/prefer-vi-mocked-import/match.d.ts.map +1 -1
  144. package/dist/domain/testing/prefer-vi-mocked-import/match.js +5 -246
  145. package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
  146. package/dist/domain/testing/prefer-vi-mocked-import/rule.js +18 -20
  147. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  148. package/dist/domain/testing/require-act-result-capture/rule.js +47 -21
  149. package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
  150. package/dist/domain/testing/require-test-companion/rule.js +2 -4
  151. package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -1
  152. package/dist/domain/testing/single-act-statement/rule.js +20 -22
  153. package/dist/index.d.ts +1 -1
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +2 -2
  156. package/dist/infrastructure/codeperfect-plugin.d.ts +2 -0
  157. package/dist/infrastructure/codeperfect-plugin.d.ts.map +1 -1
  158. package/dist/infrastructure/codeperfect-plugin.js +3 -2
  159. package/dist/infrastructure/presets.d.ts.map +1 -1
  160. package/dist/infrastructure/presets.js +3 -1
  161. package/package.json +60 -69
  162. package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.d.ts.map +0 -1
  163. package/dist/domain/architecture/no-unused-exports/no-unused-exports-utilities.js +0 -612
@@ -1,27 +1,22 @@
1
- import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
- /** Supported `vi` mock method names. */
3
- const supportedMockNames = new Set(["doMock", "mock"]);
4
- /** Default suffix for generated namespace imports. */
5
- const moduleTypeSuffix = "Module";
1
+ import { getMockFactoryMatch } from "./rule-detection.js";
2
+ import { buildFixes } from "./rule-reporting.js";
6
3
  /** Disallows casted `vi.mock` and `vi.doMock` factories. */
7
4
  const noUnsafeVitestMockFactoryCastRule = {
8
- create(context) {
9
- return {
10
- CallExpression(node) {
11
- const match = getMockFactoryMatch(node);
12
- if (match === void 0) {
13
- return;
14
- }
15
- context.report({
16
- fix: match.canAutofix
17
- ? (fixer) => buildFixes(context, fixer, match)
18
- : void 0,
19
- messageId: "noUnsafeVitestMockFactoryCast",
20
- node: match.node,
21
- });
22
- },
23
- };
24
- },
5
+ create: (context) => ({
6
+ CallExpression(node) {
7
+ const match = getMockFactoryMatch(node);
8
+ if (match === void 0) {
9
+ return;
10
+ }
11
+ context.report({
12
+ fix: match.canAutofix
13
+ ? (fixer) => buildFixes(context, fixer, match)
14
+ : void 0,
15
+ messageId: "noUnsafeVitestMockFactoryCast",
16
+ node: match.node,
17
+ });
18
+ },
19
+ }),
25
20
  meta: {
26
21
  docs: {
27
22
  description: "Disallow casted vi.mock and vi.doMock factories and prefer createMockProxy(...) for partial module mocks.",
@@ -36,432 +31,5 @@ const noUnsafeVitestMockFactoryCastRule = {
36
31
  type: "problem",
37
32
  },
38
33
  };
39
- /**
40
- * Builds all fixes for one unsafe mock factory.
41
- * @param context Rule context.
42
- * @param fixer ESLint fixer.
43
- * @param match Unsafe mock factory details.
44
- * @returns All fixer operations.
45
- * @example
46
- * ```ts
47
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
48
- * ```
49
- */
50
- function buildFixes(context, fixer, match) {
51
- const sourceCode = context.sourceCode;
52
- const moduleTypeImport = resolveModuleTypeImport(sourceCode, match.moduleSpecifier);
53
- const factoryText = `createMockProxy<typeof ${moduleTypeImport.namespaceName}>(${sourceCode.getText(match.mockExpression)})`;
54
- const fixes = [
55
- fixer.replaceTextRange(match.mockFactoryNode.range, factoryText),
56
- ];
57
- if (!moduleTypeImport.isExisting) {
58
- const importText = `import type * as ${moduleTypeImport.namespaceName} from ${JSON.stringify(match.moduleSpecifier)};`;
59
- const insertionRange = getImportInsertionRange(sourceCode);
60
- fixes.push(insertionRange === void 0
61
- ? fixer.insertTextBeforeRange([0, 0], `${importText}\n\n`)
62
- : fixer.insertTextAfterRange(insertionRange, `\n${importText}`));
63
- }
64
- return fixes;
65
- }
66
- /**
67
- * Collects declaration identifiers from top-level declarations.
68
- * @param declaration Declaration node.
69
- * @param names Output name set.
70
- * @example
71
- * ```ts
72
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
73
- * ```
74
- */
75
- function collectDeclarationNames(declaration, names) {
76
- if (declaration.type === AST_NODE_TYPES.FunctionDeclaration ||
77
- declaration.type === AST_NODE_TYPES.ClassDeclaration) {
78
- if (declaration.id !== null) {
79
- names.add(declaration.id.name);
80
- }
81
- return;
82
- }
83
- if (declaration.type === AST_NODE_TYPES.VariableDeclaration) {
84
- for (const variableDeclaration of declaration.declarations) {
85
- collectPatternNames(variableDeclaration.id, names);
86
- }
87
- return;
88
- }
89
- if (declaration.type === AST_NODE_TYPES.TSTypeAliasDeclaration ||
90
- declaration.type === AST_NODE_TYPES.TSInterfaceDeclaration ||
91
- declaration.type === AST_NODE_TYPES.TSEnumDeclaration) {
92
- names.add(declaration.id.name);
93
- return;
94
- }
95
- if (declaration.id.type === AST_NODE_TYPES.Identifier) {
96
- names.add(declaration.id.name);
97
- }
98
- }
99
- /**
100
- * Collects identifiers from a binding pattern.
101
- * @param pattern Binding pattern.
102
- * @param names Output name set.
103
- * @example
104
- * ```ts
105
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
106
- * ```
107
- */
108
- function collectPatternNames(pattern, names) {
109
- if (pattern.type === AST_NODE_TYPES.Identifier) {
110
- names.add(pattern.name);
111
- return;
112
- }
113
- if (pattern.type === AST_NODE_TYPES.AssignmentPattern) {
114
- collectPatternNames(pattern.left, names);
115
- return;
116
- }
117
- if (pattern.type === AST_NODE_TYPES.RestElement) {
118
- collectPatternNames(pattern.argument, names);
119
- return;
120
- }
121
- if (pattern.type === AST_NODE_TYPES.ArrayPattern) {
122
- for (const element of pattern.elements) {
123
- if (element !== null) {
124
- collectPatternNames(element, names);
125
- }
126
- }
127
- }
128
- if (pattern.type === AST_NODE_TYPES.ObjectPattern) {
129
- for (const property of pattern.properties) {
130
- if (property.type === AST_NODE_TYPES.Property) {
131
- collectPatternNames(property.value, names);
132
- }
133
- if (property.type === AST_NODE_TYPES.RestElement) {
134
- collectPatternNames(property.argument, names);
135
- }
136
- }
137
- }
138
- }
139
- /**
140
- * Collects top-level binding names to avoid collisions with inserted imports.
141
- * @param statements Program statements.
142
- * @returns All top-level names in the file.
143
- * @example
144
- * ```ts
145
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
146
- * ```
147
- */
148
- function collectTopLevelNames(statements) {
149
- const names = new Set();
150
- for (const statement of statements) {
151
- if (statement.type === AST_NODE_TYPES.ImportDeclaration) {
152
- for (const specifier of statement.specifiers) {
153
- names.add(specifier.local.name);
154
- }
155
- continue;
156
- }
157
- if (statement.type === AST_NODE_TYPES.ExportNamedDeclaration) {
158
- if (statement.declaration !== null &&
159
- isNamedDeclaration(statement.declaration)) {
160
- collectDeclarationNames(statement.declaration, names);
161
- }
162
- continue;
163
- }
164
- if (statement.type === AST_NODE_TYPES.ExportDefaultDeclaration) {
165
- if (isNamedDeclaration(statement.declaration)) {
166
- collectDeclarationNames(statement.declaration, names);
167
- }
168
- continue;
169
- }
170
- if (isNamedDeclaration(statement)) {
171
- collectDeclarationNames(statement, names);
172
- }
173
- }
174
- return names;
175
- }
176
- /**
177
- * Creates a namespace import name from a module specifier.
178
- * @param moduleSpecifier Module path.
179
- * @returns PascalCase namespace name.
180
- * @example
181
- * ```ts
182
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
183
- * ```
184
- */
185
- function createNamespaceName(moduleSpecifier) {
186
- const baseName = moduleSpecifier
187
- .split("/")
188
- .findLast((segment) => segment.length > 0 && segment !== ".")
189
- ?.replace(/\.[^./\\]+$/, "") ?? "Module";
190
- const pascalName = baseName
191
- .replaceAll(/[^\dA-Za-z]+/g, " ")
192
- .split(" ")
193
- .filter((segment) => segment.length > 0)
194
- .map((segment) => segment.slice(0, 1).toUpperCase() + segment.slice(1))
195
- .join("");
196
- return pascalName.endsWith(moduleTypeSuffix)
197
- ? pascalName
198
- : `${pascalName}${moduleTypeSuffix}`;
199
- }
200
- /**
201
- * Returns the casted expression only when the factory is safe to autofix.
202
- * @param node Factory expression to inspect.
203
- * @returns Cast-free expression when the factory can be safely replaced.
204
- * @example
205
- * ```ts
206
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
207
- * ```
208
- */
209
- function getAutofixableMockExpression(node) {
210
- if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {
211
- if (node.async || node.params.length > 0) {
212
- return void 0;
213
- }
214
- if (node.body.type === AST_NODE_TYPES.BlockStatement) {
215
- return getAutofixableReturnedCastedExpression(node.body.body);
216
- }
217
- return getCastedExpression(node.body);
218
- }
219
- if (node.async || node.generator || node.params.length > 0) {
220
- return void 0;
221
- }
222
- return getAutofixableReturnedCastedExpression(node.body.body);
223
- }
224
- /**
225
- * Finds a casted return value from a single-return factory body.
226
- * @param statements Function body statements.
227
- * @returns Returned expression when the factory has exactly one return statement.
228
- * @example
229
- * ```ts
230
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
231
- * ```
232
- */
233
- function getAutofixableReturnedCastedExpression(statements) {
234
- if (statements.length !== 1) {
235
- return void 0;
236
- }
237
- const [statement] = statements;
238
- if (statement.argument === null) {
239
- return void 0;
240
- }
241
- return getCastedExpression(statement.argument);
242
- }
243
- /**
244
- * Returns the inner expression if the input is a cast expression.
245
- * @param expression Expression to inspect.
246
- * @returns Inner expression when the input contains a cast.
247
- * @example
248
- * ```ts
249
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
250
- * ```
251
- */
252
- function getCastedExpression(expression) {
253
- if (expression.type === AST_NODE_TYPES.TSAsExpression) {
254
- return stripCastExpressions(expression.expression);
255
- }
256
- if (expression.type === AST_NODE_TYPES.TSTypeAssertion) {
257
- const innerExpression = expression.expression;
258
- return stripCastExpressions(innerExpression);
259
- }
260
- return void 0;
261
- }
262
- /**
263
- * Returns the partial mock expression after removing a cast wrapper.
264
- * @param node Factory expression to inspect.
265
- * @returns Cast-free expression when the factory is unsafe.
266
- * @example
267
- * ```ts
268
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
269
- * ```
270
- */
271
- function getCastedMockExpression(node) {
272
- if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {
273
- if (node.body.type === AST_NODE_TYPES.BlockStatement) {
274
- return getReturnedCastedExpression(node.body.body);
275
- }
276
- return getCastedExpression(node.body);
277
- }
278
- return getReturnedCastedExpression(node.body.body);
279
- }
280
- /**
281
- * Returns the range after the final import declaration.
282
- * @param sourceCode Source code to inspect.
283
- * @returns Range of the last import statement when present.
284
- * @example
285
- * ```ts
286
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
287
- * ```
288
- */
289
- function getImportInsertionRange(sourceCode) {
290
- let lastImportRange;
291
- for (const statement of sourceCode.ast.body) {
292
- if (statement.type === AST_NODE_TYPES.ImportDeclaration &&
293
- statement.range !== void 0) {
294
- lastImportRange = statement.range;
295
- }
296
- }
297
- return lastImportRange;
298
- }
299
- /**
300
- * Collects the most appropriate mock-factory match from a `CallExpression`.
301
- * @param node Call expression to inspect.
302
- * @returns Unsafe mock factory details when the factory uses a cast.
303
- * @example
304
- * ```ts
305
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
306
- * ```
307
- */
308
- function getMockFactoryMatch(node) {
309
- if (!isVitestMockCall(node) || node.arguments.length < 2) {
310
- return void 0;
311
- }
312
- const [mockSpecifierNode, mockFactoryNode] = node.arguments;
313
- if (mockSpecifierNode.type === AST_NODE_TYPES.SpreadElement ||
314
- mockFactoryNode.type === AST_NODE_TYPES.SpreadElement) {
315
- return void 0;
316
- }
317
- if (mockFactoryNode.type !== AST_NODE_TYPES.ArrowFunctionExpression &&
318
- mockFactoryNode.type !== AST_NODE_TYPES.FunctionExpression) {
319
- return void 0;
320
- }
321
- const moduleSpecifier = getModuleSpecifier(mockSpecifierNode);
322
- if (moduleSpecifier === void 0) {
323
- return void 0;
324
- }
325
- const mockExpression = getCastedMockExpression(mockFactoryNode);
326
- if (mockExpression === void 0) {
327
- return void 0;
328
- }
329
- const autofixableExpression = getAutofixableMockExpression(mockFactoryNode);
330
- return {
331
- canAutofix: autofixableExpression !== void 0,
332
- mockExpression: autofixableExpression ?? mockExpression,
333
- mockFactoryNode,
334
- mockSpecifierNode,
335
- moduleSpecifier,
336
- node,
337
- };
338
- }
339
- /**
340
- * Extracts a string module specifier from the first mock argument.
341
- * @param node First mock argument.
342
- * @returns Module specifier when statically known.
343
- * @example
344
- * ```ts
345
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
346
- * ```
347
- */
348
- function getModuleSpecifier(node) {
349
- if (node.type === AST_NODE_TYPES.Literal && typeof node.value === "string") {
350
- return node.value;
351
- }
352
- if (node.type === AST_NODE_TYPES.ImportExpression &&
353
- node.source.type === AST_NODE_TYPES.Literal &&
354
- typeof node.source.value === "string") {
355
- return node.source.value;
356
- }
357
- return void 0;
358
- }
359
- /**
360
- * Finds the casted return value inside a function body.
361
- * @param statements Function body statements.
362
- * @returns Returned expression when it is casted.
363
- * @example
364
- * ```ts
365
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
366
- * ```
367
- */
368
- function getReturnedCastedExpression(statements) {
369
- for (const statement of statements) {
370
- if (statement.type !== AST_NODE_TYPES.ReturnStatement) {
371
- continue;
372
- }
373
- return statement.argument === null
374
- ? void 0
375
- : getCastedExpression(statement.argument);
376
- }
377
- return void 0;
378
- }
379
- /**
380
- * Checks whether a node is a declaration that introduces top-level names.
381
- * @param node Node to inspect.
382
- * @returns True when the node is a supported declaration.
383
- * @example
384
- * ```ts
385
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
386
- * ```
387
- */
388
- function isNamedDeclaration(node) {
389
- return (node.type === AST_NODE_TYPES.FunctionDeclaration ||
390
- node.type === AST_NODE_TYPES.ClassDeclaration ||
391
- node.type === AST_NODE_TYPES.VariableDeclaration ||
392
- node.type === AST_NODE_TYPES.TSTypeAliasDeclaration ||
393
- node.type === AST_NODE_TYPES.TSInterfaceDeclaration ||
394
- node.type === AST_NODE_TYPES.TSEnumDeclaration ||
395
- node.type === AST_NODE_TYPES.TSModuleDeclaration);
396
- }
397
- /**
398
- * Checks whether a call targets `vi.mock` or `vi.doMock`.
399
- * @param node Call expression to inspect.
400
- * @returns True when the callee is a supported Vitest mock method.
401
- * @example
402
- * ```ts
403
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
404
- * ```
405
- */
406
- function isVitestMockCall(node) {
407
- if (node.callee.type !== AST_NODE_TYPES.MemberExpression ||
408
- node.callee.object.type !== AST_NODE_TYPES.Identifier ||
409
- node.callee.object.name !== "vi" ||
410
- node.callee.property.type !== AST_NODE_TYPES.Identifier) {
411
- return false;
412
- }
413
- return supportedMockNames.has(node.callee.property.name);
414
- }
415
- /**
416
- * Resolves the namespace import to use for `typeof Namespace`.
417
- * @param sourceCode Source code for import inspection.
418
- * @param moduleSpecifier Module path being mocked.
419
- * @returns Existing or generated namespace import details.
420
- * @example
421
- * ```ts
422
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
423
- * ```
424
- */
425
- function resolveModuleTypeImport(sourceCode, moduleSpecifier) {
426
- const statements = sourceCode.ast.body;
427
- const preferredName = createNamespaceName(moduleSpecifier);
428
- for (const statement of statements) {
429
- if (statement.type !== AST_NODE_TYPES.ImportDeclaration ||
430
- statement.source.value !== moduleSpecifier) {
431
- continue;
432
- }
433
- for (const specifier of statement.specifiers) {
434
- if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {
435
- return { isExisting: true, namespaceName: specifier.local.name };
436
- }
437
- }
438
- }
439
- const usedNames = collectTopLevelNames(statements);
440
- let namespaceName = preferredName;
441
- let suffix = 1;
442
- while (usedNames.has(namespaceName)) {
443
- namespaceName = `${preferredName}${suffix.toFixed(0)}`;
444
- suffix += 1;
445
- }
446
- return { isExisting: false, namespaceName };
447
- }
448
- /**
449
- * Removes nested cast wrappers from an expression.
450
- * @param expression Expression to normalize.
451
- * @returns Expression without any surrounding casts.
452
- * @example
453
- * ```ts
454
- * // Internal helper for no-unsafe-vitest-mock-factory-cast.
455
- * ```
456
- */
457
- function stripCastExpressions(expression) {
458
- if (expression.type === AST_NODE_TYPES.TSAsExpression) {
459
- return stripCastExpressions(expression.expression);
460
- }
461
- if (expression.type === AST_NODE_TYPES.TSTypeAssertion) {
462
- return stripCastExpressions(expression.expression);
463
- }
464
- return expression;
465
- }
466
34
  export { noUnsafeVitestMockFactoryCastRule };
467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9uby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0L3J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQStDekUsd0NBQXdDO0FBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUV2RCxzREFBc0Q7QUFDdEQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7QUFFbEMsNERBQTREO0FBQzVELE1BQU0saUNBQWlDLEdBQW9CO0lBQ3pELE1BQU0sQ0FBQyxPQUF5QjtRQUM5QixPQUFPO1lBQ0wsY0FBYyxDQUFDLElBQUk7Z0JBQ2pCLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQStCLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDckIsT0FBTztnQkFDVCxDQUFDO2dCQUVELE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQ2IsR0FBRyxFQUFFLEtBQUssQ0FBQyxVQUFVO3dCQUNuQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQzt3QkFDMUQsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDVixTQUFTLEVBQUUsK0JBQStCO29CQUMxQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7aUJBQ2pCLENBQUMsQ0FBQztZQUNMLENBQUM7U0FDMEIsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULDJHQUEyRztZQUM3RyxXQUFXLEVBQUUsSUFBSTtZQUNqQixHQUFHLEVBQUUscUdB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QUFDLElBQUksS0FBSyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkQsT0FBTyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHsgQVNUX05PREVfVFlQRVMsIHR5cGUgVFNFU1RyZWUgfSBmcm9tIFwiQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzXCI7XG5cbi8qKiBVbnNhZmUgbW9jay1mYWN0b3J5IG1hdGNoIGRldGFpbHMuICovXG5pbnRlcmZhY2UgTW9ja0ZhY3RvcnlNYXRjaCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBtYXRjaCBjYW4gYmUgc2FmZWx5IGF1dG9maXhlZC4gKi9cbiAgY2FuQXV0b2ZpeDogYm9vbGVhbjtcblxuICAvKiogQ2FzdC1mcmVlIHBhcnRpYWwgbW9jayBleHByZXNzaW9uLiAqL1xuICBtb2NrRXhwcmVzc2lvbjogVFNFU1RyZWUuRXhwcmVzc2lvbjtcblxuICAvKiogU2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBWaXRlc3QgbW9jayBjYWxsLiAqL1xuICBtb2NrRmFjdG9yeU5vZGU6XG4gICAgfCBUU0VTVHJlZS5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblxuICAgIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uO1xuXG4gIC8qKiBGaXJzdCBhcmd1bWVudCB0byB0aGUgVml0ZXN0IG1vY2sgY2FsbC4gKi9cbiAgbW9ja1NwZWNpZmllck5vZGU6IFRTRVNUcmVlLkV4cHJlc3Npb247XG5cbiAgLyoqIE1vY2tlZCBtb2R1bGUgc3BlY2lmaWVyLiAqL1xuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZztcblxuICAvKiogUmVwb3J0IG5vZGUuICovXG4gIG5vZGU6IFRTRVNUcmVlLk5vZGU7XG59XG5cbi8qKiBOYW1lc3BhY2UgaW1wb3J0IGRldGFpbHMgZm9yIHRoZSBtb2NrZWQgbW9kdWxlLiAqL1xuaW50ZXJmYWNlIE1vZHVsZVR5cGVJbXBvcnQge1xuICAvKiogV2hldGhlciB0aGUgbmFtZXNwYWNlIGltcG9ydCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZmlsZS4gKi9cbiAgaXNFeGlzdGluZzogYm9vbGVhbjtcblxuICAvKiogTmFtZXNwYWNlIGlkZW50aWZpZXIgdXNlZCBpbiBgdHlwZW9mIE5hbWVzcGFjZWAuICovXG4gIG5hbWVzcGFjZU5hbWU6IHN0cmluZztcbn1cblxuLyoqIFN1cHBvcnRlZCBkZWNsYXJhdGlvbiBzaGFwZXMgdGhhdCBjYW4gaW50cm9kdWNlIHRvcC1sZXZlbCBuYW1lcy4gKi9cbnR5cGUgTmFtZWREZWNsYXJhdGlvbiA9XG4gIHwgVFNFU1RyZWUuQ2xhc3NEZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLkZ1bmN0aW9uRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU0VudW1EZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cbiAgfCBUU0VTVHJlZS5UU01vZHVsZURlY2xhcmF0aW9uXG4gIHwgVFNFU1RyZWUuVFNUeXBlQWxpYXNEZWNsYXJhdGlvblxuICB8IFRTRVNUcmVlLlZhcmlhYmxlRGVjbGFyYXRpb247XG5cbi8qKiBNaW5pbWFsIHNvdXJjZS1jb2RlIHN1cmZhY2UgdXNlZCBieSB0aGUgcnVsZS4gKi9cbnR5cGUgU291cmNlQ29kZUxpa2UgPSBQaWNrPFJ1bGUuUnVsZUNvbnRleHRbXCJzb3VyY2VDb2RlXCJdLCBcImFzdFwiIHwgXCJnZXRUZXh0XCI+O1xuXG4vKiogU3VwcG9ydGVkIGB2aWAgbW9jayBtZXRob2QgbmFtZXMuICovXG5jb25zdCBzdXBwb3J0ZWRNb2NrTmFtZXMgPSBuZXcgU2V0KFtcImRvTW9ja1wiLCBcIm1vY2tcIl0pO1xuXG4vKiogRGVmYXVsdCBzdWZmaXggZm9yIGdlbmVyYXRlZCBuYW1lc3BhY2UgaW1wb3J0cy4gKi9cbmNvbnN0IG1vZHVsZVR5cGVTdWZmaXggPSBcIk1vZHVsZVwiO1xuXG4vKiogRGlzYWxsb3dzIGNhc3RlZCBgdmkubW9ja2AgYW5kIGB2aS5kb01vY2tgIGZhY3Rvcmllcy4gKi9cbmNvbnN0IG5vVW5zYWZlVml0ZXN0TW9ja0ZhY3RvcnlDYXN0UnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGdldE1vY2tGYWN0b3J5TWF0Y2gobm9kZSBhcyBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik7XG4gICAgICAgIGlmIChtYXRjaCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIGZpeDogbWF0Y2guY2FuQXV0b2ZpeFxuICAgICAgICAgICAgPyAoZml4ZXIpOiBSdWxlLkZpeFtdID0+IGJ1aWxkRml4ZXMoY29udGV4dCwgZml4ZXIsIG1hdGNoKVxuICAgICAgICAgICAgOiB2b2lkIDAsXG4gICAgICAgICAgbWVzc2FnZUlkOiBcIm5vVW5zYWZlVml0ZXN0TW9ja0ZhY3RvcnlDYXN0XCIsXG4gICAgICAgICAgbm9kZTogbWF0Y2gubm9kZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0gc2F0aXNmaWVzIFJ1bGUuUnVsZUxpc3RlbmVyO1xuICB9LFxuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRGlzYWxsb3cgY2FzdGVkIHZpLm1vY2sgYW5kIHZpLmRvTW9jayBmYWN0b3JpZXMgYW5kIHByZWZlciBjcmVhdGVNb2NrUHJveHkoLi4uKSBmb3IgcGFydGlhbCBtb2R1bGUgbW9ja3MuXCIsXG4gICAgICByZWNvbW1lbmRlZDogdHJ1ZSxcbiAgICAgIHVybDogXCJodHRwczovL2dpdGh1Yi5jb20vcGFybG90aS9lc2xpbnQtcGx1Z2luL2Jsb2IvbWFpbi9kb2NzL3J1bGVzL25vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QubWRcIixcbiAgICB9LFxuICAgIGZpeGFibGU6IFwiY29kZVwiLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBub1Vuc2FmZVZpdGVzdE1vY2tGYWN0b3J5Q2FzdDpcbiAgICAgICAgXCJBdm9pZCBjYXN0aW5nIHZpLm1vY2svdmkuZG9Nb2NrIGZhY3RvcnkgcmVzdWx0czsgdXNlIGNyZWF0ZU1vY2tQcm94eSguLi4pIHdpdGggYSB0eXBlLW9ubHkgbW9kdWxlIGltcG9ydCBpbnN0ZWFkLlwiLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgICB0eXBlOiBcInByb2JsZW1cIixcbiAgfSxcbn07XG5cbi8qKiBDYWxsRXhwcmVzc2lvbiBhcmd1bWVudCB0aGF0IGlzIG5vdCBhIHNwcmVhZCBlbGVtZW50LiAqL1xudHlwZSBOb25TcHJlYWRDYWxsRXhwcmVzc2lvbkFyZ3VtZW50ID0gRXhjbHVkZTxcbiAgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb25Bcmd1bWVudCxcbiAgVFNFU1RyZWUuU3ByZWFkRWxlbWVudFxuPjtcblxuLyoqXG4gKiBCdWlsZHMgYWxsIGZpeGVzIGZvciBvbmUgdW5zYWZlIG1vY2sgZmFjdG9yeS5cbiAqIEBwYXJhbSBjb250ZXh0IFJ1bGUgY29udGV4dC5cbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXG4gKiBAcGFyYW0gbWF0Y2ggVW5zYWZlIG1vY2sgZmFjdG9yeSBkZXRhaWxzLlxuICogQHJldHVybnMgQWxsIGZpeGVyIG9wZXJhdGlvbnMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBidWlsZEZpeGVzKFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0LFxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXG4gIG1hdGNoOiBNb2NrRmFjdG9yeU1hdGNoLFxuKTogUnVsZS5GaXhbXSB7XG4gIGNvbnN0IHNvdXJjZUNvZGUgPSBjb250ZXh0LnNvdXJjZUNvZGU7XG4gIGNvbnN0IG1vZHVsZVR5cGVJbXBvcnQgPSByZXNvbHZlTW9kdWxlVHlwZUltcG9ydChcbiAgICBzb3VyY2VDb2RlLFxuICAgIG1hdGNoLm1vZHVsZVNwZWNpZmllcixcbiAgKTtcbiAgY29uc3QgZmFjdG9yeVRleHQgPSBgY3JlYXRlTW9ja1Byb3h5PHR5cGVvZiAke21vZHVsZVR5cGVJbXBvcnQubmFtZXNwYWNlTmFtZX0+KCR7c291cmNlQ29kZS5nZXRUZXh0KG1hdGNoLm1vY2tFeHByZXNzaW9uIGFzIG5ldmVyKX0pYDtcbiAgY29uc3QgZml4ZXM6IFJ1bGUuRml4W10gPSBbXG4gICAgZml4ZXIucmVwbGFjZVRleHRSYW5nZShtYXRjaC5tb2NrRmFjdG9yeU5vZGUucmFuZ2UsIGZhY3RvcnlUZXh0KSxcbiAgXTtcblxuICBpZiAoIW1vZHVsZVR5cGVJbXBvcnQuaXNFeGlzdGluZykge1xuICAgIGNvbnN0IGltcG9ydFRleHQgPSBgaW1wb3J0IHR5cGUgKiBhcyAke21vZHVsZVR5cGVJbXBvcnQubmFtZXNwYWNlTmFtZX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KG1hdGNoLm1vZHVsZVNwZWNpZmllcil9O2A7XG4gICAgY29uc3QgaW5zZXJ0aW9uUmFuZ2UgPSBnZXRJbXBvcnRJbnNlcnRpb25SYW5nZShzb3VyY2VDb2RlKTtcblxuICAgIGZpeGVzLnB1c2goXG4gICAgICBpbnNlcnRpb25SYW5nZSA9PT0gdm9pZCAwXG4gICAgICAgID8gZml4ZXIuaW5zZXJ0VGV4dEJlZm9yZVJhbmdlKFswLCAwXSwgYCR7aW1wb3J0VGV4dH1cXG5cXG5gKVxuICAgICAgICA6IGZpeGVyLmluc2VydFRleHRBZnRlclJhbmdlKGluc2VydGlvblJhbmdlLCBgXFxuJHtpbXBvcnRUZXh0fWApLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZml4ZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgZGVjbGFyYXRpb24gaWRlbnRpZmllcnMgZnJvbSB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIGRlY2xhcmF0aW9uIERlY2xhcmF0aW9uIG5vZGUuXG4gKiBAcGFyYW0gbmFtZXMgT3V0cHV0IG5hbWUgc2V0LlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY29sbGVjdERlY2xhcmF0aW9uTmFtZXMoXG4gIGRlY2xhcmF0aW9uOiBOYW1lZERlY2xhcmF0aW9uLFxuICBuYW1lczogU2V0PHN0cmluZz4sXG4pOiB2b2lkIHtcbiAgaWYgKFxuICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHxcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5DbGFzc0RlY2xhcmF0aW9uXG4gICkge1xuICAgIGlmIChkZWNsYXJhdGlvbi5pZCAhPT0gbnVsbCkge1xuICAgICAgbmFtZXMuYWRkKGRlY2xhcmF0aW9uLmlkLm5hbWUpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuVmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgIGZvciAoY29uc3QgdmFyaWFibGVEZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgIGNvbGxlY3RQYXR0ZXJuTmFtZXModmFyaWFibGVEZWNsYXJhdGlvbi5pZCwgbmFtZXMpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoXG4gICAgZGVjbGFyYXRpb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuVFNUeXBlQWxpYXNEZWNsYXJhdGlvbiB8fFxuICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlRTSW50ZXJmYWNlRGVjbGFyYXRpb24gfHxcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU0VudW1EZWNsYXJhdGlvblxuICApIHtcbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRlY2xhcmF0aW9uLmlkLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBpZGVudGlmaWVycyBmcm9tIGEgYmluZGluZyBwYXR0ZXJuLlxuICogQHBhcmFtIHBhdHRlcm4gQmluZGluZyBwYXR0ZXJuLlxuICogQHBhcmFtIG5hbWVzIE91dHB1dCBuYW1lIHNldC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybjogVFNFU1RyZWUuTm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gIGlmIChwYXR0ZXJuLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICBuYW1lcy5hZGQocGF0dGVybi5uYW1lKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5Bc3NpZ25tZW50UGF0dGVybikge1xuICAgIGNvbGxlY3RQYXR0ZXJuTmFtZXMocGF0dGVybi5sZWZ0LCBuYW1lcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhdHRlcm4udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUmVzdEVsZW1lbnQpIHtcbiAgICBjb2xsZWN0UGF0dGVybk5hbWVzKHBhdHRlcm4uYXJndW1lbnQsIG5hbWVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0dGVybi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5BcnJheVBhdHRlcm4pIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGF0dGVybi5lbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhlbGVtZW50LCBuYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhdHRlcm4udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuT2JqZWN0UGF0dGVybikge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcGF0dGVybi5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAocHJvcGVydHkudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUHJvcGVydHkpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhwcm9wZXJ0eS52YWx1ZSwgbmFtZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHkudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuUmVzdEVsZW1lbnQpIHtcbiAgICAgICAgY29sbGVjdFBhdHRlcm5OYW1lcyhwcm9wZXJ0eS5hcmd1bWVudCwgbmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIHRvcC1sZXZlbCBiaW5kaW5nIG5hbWVzIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBpbnNlcnRlZCBpbXBvcnRzLlxuICogQHBhcmFtIHN0YXRlbWVudHMgUHJvZ3JhbSBzdGF0ZW1lbnRzLlxuICogQHJldHVybnMgQWxsIHRvcC1sZXZlbCBuYW1lcyBpbiB0aGUgZmlsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUb3BMZXZlbE5hbWVzKHN0YXRlbWVudHM6IHJlYWRvbmx5IHVua25vd25bXSk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzIGFzIFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnRbXSkge1xuICAgIGlmIChzdGF0ZW1lbnQudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSW1wb3J0RGVjbGFyYXRpb24pIHtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHN0YXRlbWVudC5zcGVjaWZpZXJzKSB7XG4gICAgICAgIG5hbWVzLmFkZChzcGVjaWZpZXIubG9jYWwubmFtZSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhdGVtZW50LmRlY2xhcmF0aW9uICE9PSBudWxsICYmXG4gICAgICAgIGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQuZGVjbGFyYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgY29sbGVjdERlY2xhcmF0aW9uTmFtZXMoc3RhdGVtZW50LmRlY2xhcmF0aW9uLCBuYW1lcyk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbikge1xuICAgICAgaWYgKGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQuZGVjbGFyYXRpb24pKSB7XG4gICAgICAgIGNvbGxlY3REZWNsYXJhdGlvbk5hbWVzKHN0YXRlbWVudC5kZWNsYXJhdGlvbiwgbmFtZXMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFtZWREZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICBjb2xsZWN0RGVjbGFyYXRpb25OYW1lcyhzdGF0ZW1lbnQsIG5hbWVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5hbWVzcGFjZSBpbXBvcnQgbmFtZSBmcm9tIGEgbW9kdWxlIHNwZWNpZmllci5cbiAqIEBwYXJhbSBtb2R1bGVTcGVjaWZpZXIgTW9kdWxlIHBhdGguXG4gKiBAcmV0dXJucyBQYXNjYWxDYXNlIG5hbWVzcGFjZSBuYW1lLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTmFtZXNwYWNlTmFtZShtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2VOYW1lID1cbiAgICBtb2R1bGVTcGVjaWZpZXJcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5maW5kTGFzdCgoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwICYmIHNlZ21lbnQgIT09IFwiLlwiKVxuICAgICAgPy5yZXBsYWNlKC9cXC5bXi4vXFxcXF0rJC8sIFwiXCIpID8/IFwiTW9kdWxlXCI7XG5cbiAgY29uc3QgcGFzY2FsTmFtZSA9IGJhc2VOYW1lXG4gICAgLnJlcGxhY2VBbGwoL1teXFxkQS1aYS16XSsvZywgXCIgXCIpXG4gICAgLnNwbGl0KFwiIFwiKVxuICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQubGVuZ3RoID4gMClcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzZWdtZW50LnNsaWNlKDEpKVxuICAgIC5qb2luKFwiXCIpO1xuXG4gIHJldHVybiBwYXNjYWxOYW1lLmVuZHNXaXRoKG1vZHVsZVR5cGVTdWZmaXgpXG4gICAgPyBwYXNjYWxOYW1lXG4gICAgOiBgJHtwYXNjYWxOYW1lfSR7bW9kdWxlVHlwZVN1ZmZpeH1gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhc3RlZCBleHByZXNzaW9uIG9ubHkgd2hlbiB0aGUgZmFjdG9yeSBpcyBzYWZlIHRvIGF1dG9maXguXG4gKiBAcGFyYW0gbm9kZSBGYWN0b3J5IGV4cHJlc3Npb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIENhc3QtZnJlZSBleHByZXNzaW9uIHdoZW4gdGhlIGZhY3RvcnkgY2FuIGJlIHNhZmVseSByZXBsYWNlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldEF1dG9maXhhYmxlTW9ja0V4cHJlc3Npb24oXG4gIG5vZGU6IFRTRVNUcmVlLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uLFxuKTogVFNFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgaWYgKG5vZGUuYXN5bmMgfHwgbm9kZS5wYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ib2R5LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkJsb2NrU3RhdGVtZW50KSB7XG4gICAgICByZXR1cm4gZ2V0QXV0b2ZpeGFibGVSZXR1cm5lZENhc3RlZEV4cHJlc3Npb24obm9kZS5ib2R5LmJvZHkpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRDYXN0ZWRFeHByZXNzaW9uKG5vZGUuYm9keSk7XG4gIH1cblxuICBpZiAobm9kZS5hc3luYyB8fCBub2RlLmdlbmVyYXRvciB8fCBub2RlLnBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBnZXRBdXRvZml4YWJsZVJldHVybmVkQ2FzdGVkRXhwcmVzc2lvbihub2RlLmJvZHkuYm9keSk7XG59XG5cbi8qKlxuICogRmluZHMgYSBjYXN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBzaW5nbGUtcmV0dXJuIGZhY3RvcnkgYm9keS5cbiAqIEBwYXJhbSBzdGF0ZW1lbnRzIEZ1bmN0aW9uIGJvZHkgc3RhdGVtZW50cy5cbiAqIEByZXR1cm5zIFJldHVybmVkIGV4cHJlc3Npb24gd2hlbiB0aGUgZmFjdG9yeSBoYXMgZXhhY3RseSBvbmUgcmV0dXJuIHN0YXRlbWVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldEF1dG9maXhhYmxlUmV0dXJuZWRDYXN0ZWRFeHByZXNzaW9uKFxuICBzdGF0ZW1lbnRzOiBUU0VTVHJlZS5TdGF0ZW1lbnRbXSxcbik6IFRTRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBpZiAoc3RhdGVtZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgW3N0YXRlbWVudF0gPSBzdGF0ZW1lbnRzIGFzIFtUU0VTVHJlZS5SZXR1cm5TdGF0ZW1lbnRdO1xuICBpZiAoc3RhdGVtZW50LmFyZ3VtZW50ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBnZXRDYXN0ZWRFeHByZXNzaW9uKHN0YXRlbWVudC5hcmd1bWVudCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5uZXIgZXhwcmVzc2lvbiBpZiB0aGUgaW5wdXQgaXMgYSBjYXN0IGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBFeHByZXNzaW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBJbm5lciBleHByZXNzaW9uIHdoZW4gdGhlIGlucHV0IGNvbnRhaW5zIGEgY2FzdC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldENhc3RlZEV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IFRTRVNUcmVlLkV4cHJlc3Npb24sXG4pOiBUU0VTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4cHJlc3Npb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuVFNBc0V4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gc3RyaXBDYXN0RXhwcmVzc2lvbnMoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlRTVHlwZUFzc2VydGlvbikge1xuICAgIGNvbnN0IGlubmVyRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZXhwcmVzc2lvbjtcbiAgICByZXR1cm4gc3RyaXBDYXN0RXhwcmVzc2lvbnMoaW5uZXJFeHByZXNzaW9uKTtcbiAgfVxuXG4gIHJldHVybiB2b2lkIDA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFydGlhbCBtb2NrIGV4cHJlc3Npb24gYWZ0ZXIgcmVtb3ZpbmcgYSBjYXN0IHdyYXBwZXIuXG4gKiBAcGFyYW0gbm9kZSBGYWN0b3J5IGV4cHJlc3Npb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIENhc3QtZnJlZSBleHByZXNzaW9uIHdoZW4gdGhlIGZhY3RvcnkgaXMgdW5zYWZlLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FzdGVkTW9ja0V4cHJlc3Npb24oXG4gIG5vZGU6IFRTRVNUcmVlLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uLFxuKTogVFNFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgaWYgKG5vZGUuYm9keS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5CbG9ja1N0YXRlbWVudCkge1xuICAgICAgcmV0dXJuIGdldFJldHVybmVkQ2FzdGVkRXhwcmVzc2lvbihub2RlLmJvZHkuYm9keSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldENhc3RlZEV4cHJlc3Npb24obm9kZS5ib2R5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRSZXR1cm5lZENhc3RlZEV4cHJlc3Npb24obm9kZS5ib2R5LmJvZHkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJhbmdlIGFmdGVyIHRoZSBmaW5hbCBpbXBvcnQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gc291cmNlQ29kZSBTb3VyY2UgY29kZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgUmFuZ2Ugb2YgdGhlIGxhc3QgaW1wb3J0IHN0YXRlbWVudCB3aGVuIHByZXNlbnQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRJbXBvcnRJbnNlcnRpb25SYW5nZShcbiAgc291cmNlQ29kZTogU291cmNlQ29kZUxpa2UsXG4pOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGxhc3RJbXBvcnRSYW5nZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2VDb2RlLmFzdC5ib2R5IGFzIHVua25vd24gYXMge1xuICAgIC8qKiBTdGF0ZW1lbnQgcmFuZ2Ugd2hlbiBwcm92aWRlZCBieSBwYXJzZXIgb3B0aW9ucy4gKi9cbiAgICByYW5nZT86IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAvKiogVG9wLWxldmVsIHN0YXRlbWVudCBub2RlIHR5cGUuICovXG4gICAgdHlwZTogVFNFU1RyZWUuUHJvZ3JhbVN0YXRlbWVudFtcInR5cGVcIl07XG4gIH1bXSkge1xuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5JbXBvcnREZWNsYXJhdGlvbiAmJlxuICAgICAgc3RhdGVtZW50LnJhbmdlICE9PSB2b2lkIDBcbiAgICApIHtcbiAgICAgIGxhc3RJbXBvcnRSYW5nZSA9IHN0YXRlbWVudC5yYW5nZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGFzdEltcG9ydFJhbmdlO1xufVxuXG4vKipcbiAqIENvbGxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1vY2stZmFjdG9yeSBtYXRjaCBmcm9tIGEgYENhbGxFeHByZXNzaW9uYC5cbiAqIEBwYXJhbSBub2RlIENhbGwgZXhwcmVzc2lvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgVW5zYWZlIG1vY2sgZmFjdG9yeSBkZXRhaWxzIHdoZW4gdGhlIGZhY3RvcnkgdXNlcyBhIGNhc3QuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRNb2NrRmFjdG9yeU1hdGNoKFxuICBub2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbixcbik6IE1vY2tGYWN0b3J5TWF0Y2ggfCB1bmRlZmluZWQge1xuICBpZiAoIWlzVml0ZXN0TW9ja0NhbGwobm9kZSkgfHwgbm9kZS5hcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBjb25zdCBbbW9ja1NwZWNpZmllck5vZGUsIG1vY2tGYWN0b3J5Tm9kZV0gPSBub2RlLmFyZ3VtZW50cyBhcyBbXG4gICAgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb25Bcmd1bWVudCxcbiAgICBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbkFyZ3VtZW50LFxuICAgIC4uLlRTRVNUcmVlLkNhbGxFeHByZXNzaW9uQXJndW1lbnRbXSxcbiAgXTtcblxuICBpZiAoXG4gICAgbW9ja1NwZWNpZmllck5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuU3ByZWFkRWxlbWVudCB8fFxuICAgIG1vY2tGYWN0b3J5Tm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5TcHJlYWRFbGVtZW50XG4gICkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBpZiAoXG4gICAgbW9ja0ZhY3RvcnlOb2RlLnR5cGUgIT09IEFTVF9OT0RFX1RZUEVTLkFycm93RnVuY3Rpb25FeHByZXNzaW9uICYmXG4gICAgbW9ja0ZhY3RvcnlOb2RlLnR5cGUgIT09IEFTVF9OT0RFX1RZUEVTLkZ1bmN0aW9uRXhwcmVzc2lvblxuICApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gZ2V0TW9kdWxlU3BlY2lmaWVyKG1vY2tTcGVjaWZpZXJOb2RlKTtcbiAgaWYgKG1vZHVsZVNwZWNpZmllciA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IG1vY2tFeHByZXNzaW9uID0gZ2V0Q2FzdGVkTW9ja0V4cHJlc3Npb24obW9ja0ZhY3RvcnlOb2RlKTtcbiAgaWYgKG1vY2tFeHByZXNzaW9uID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgYXV0b2ZpeGFibGVFeHByZXNzaW9uID0gZ2V0QXV0b2ZpeGFibGVNb2NrRXhwcmVzc2lvbihtb2NrRmFjdG9yeU5vZGUpO1xuXG4gIHJldHVybiB7XG4gICAgY2FuQXV0b2ZpeDogYXV0b2ZpeGFibGVFeHByZXNzaW9uICE9PSB2b2lkIDAsXG4gICAgbW9ja0V4cHJlc3Npb246IGF1dG9maXhhYmxlRXhwcmVzc2lvbiA/PyBtb2NrRXhwcmVzc2lvbixcbiAgICBtb2NrRmFjdG9yeU5vZGUsXG4gICAgbW9ja1NwZWNpZmllck5vZGUsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIG5vZGUsXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpbmcgbW9kdWxlIHNwZWNpZmllciBmcm9tIHRoZSBmaXJzdCBtb2NrIGFyZ3VtZW50LlxuICogQHBhcmFtIG5vZGUgRmlyc3QgbW9jayBhcmd1bWVudC5cbiAqIEByZXR1cm5zIE1vZHVsZSBzcGVjaWZpZXIgd2hlbiBzdGF0aWNhbGx5IGtub3duLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0TW9kdWxlU3BlY2lmaWVyKFxuICBub2RlOiBOb25TcHJlYWRDYWxsRXhwcmVzc2lvbkFyZ3VtZW50LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuTGl0ZXJhbCAmJiB0eXBlb2Ygbm9kZS52YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBub2RlLnZhbHVlO1xuICB9XG5cbiAgaWYgKFxuICAgIG5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSW1wb3J0RXhwcmVzc2lvbiAmJlxuICAgIG5vZGUuc291cmNlLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkxpdGVyYWwgJiZcbiAgICB0eXBlb2Ygbm9kZS5zb3VyY2UudmFsdWUgPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgcmV0dXJuIG5vZGUuc291cmNlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZvaWQgMDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgY2FzdGVkIHJldHVybiB2YWx1ZSBpbnNpZGUgYSBmdW5jdGlvbiBib2R5LlxuICogQHBhcmFtIHN0YXRlbWVudHMgRnVuY3Rpb24gYm9keSBzdGF0ZW1lbnRzLlxuICogQHJldHVybnMgUmV0dXJuZWQgZXhwcmVzc2lvbiB3aGVuIGl0IGlzIGNhc3RlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdldFJldHVybmVkQ2FzdGVkRXhwcmVzc2lvbihcbiAgc3RhdGVtZW50czogVFNFU1RyZWUuU3RhdGVtZW50W10sXG4pOiBUU0VTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgIGlmIChzdGF0ZW1lbnQudHlwZSAhPT0gQVNUX05PREVfVFlQRVMuUmV0dXJuU3RhdGVtZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50LmFyZ3VtZW50ID09PSBudWxsXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiBnZXRDYXN0ZWRFeHByZXNzaW9uKHN0YXRlbWVudC5hcmd1bWVudCk7XG4gIH1cblxuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgaW50cm9kdWNlcyB0b3AtbGV2ZWwgbmFtZXMuXG4gKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIG5vZGUgaXMgYSBzdXBwb3J0ZWQgZGVjbGFyYXRpb24uXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc05hbWVkRGVjbGFyYXRpb24oXG4gIG5vZGU6XG4gICAgfCBUU0VTVHJlZS5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb25bXCJkZWNsYXJhdGlvblwiXVxuICAgIHwgVFNFU1RyZWUuUHJvZ3JhbVN0YXRlbWVudCxcbik6IG5vZGUgaXMgTmFtZWREZWNsYXJhdGlvbiB7XG4gIHJldHVybiAoXG4gICAgbm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8XG4gICAgbm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5DbGFzc0RlY2xhcmF0aW9uIHx8XG4gICAgbm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5WYXJpYWJsZURlY2xhcmF0aW9uIHx8XG4gICAgbm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uIHx8XG4gICAgbm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU0ludGVyZmFjZURlY2xhcmF0aW9uIHx8XG4gICAgbm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU0VudW1EZWNsYXJhdGlvbiB8fFxuICAgIG5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuVFNNb2R1bGVEZWNsYXJhdGlvblxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgY2FsbCB0YXJnZXRzIGB2aS5tb2NrYCBvciBgdmkuZG9Nb2NrYC5cbiAqIEBwYXJhbSBub2RlIENhbGwgZXhwcmVzc2lvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBjYWxsZWUgaXMgYSBzdXBwb3J0ZWQgVml0ZXN0IG1vY2sgbWV0aG9kLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5vLXVuc2FmZS12aXRlc3QtbW9jay1mYWN0b3J5LWNhc3QuXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gaXNWaXRlc3RNb2NrQ2FsbChub2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgbm9kZS5jYWxsZWUudHlwZSAhPT0gQVNUX05PREVfVFlQRVMuTWVtYmVyRXhwcmVzc2lvbiB8fFxuICAgIG5vZGUuY2FsbGVlLm9iamVjdC50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5JZGVudGlmaWVyIHx8XG4gICAgbm9kZS5jYWxsZWUub2JqZWN0Lm5hbWUgIT09IFwidmlcIiB8fFxuICAgIG5vZGUuY2FsbGVlLnByb3BlcnR5LnR5cGUgIT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXJcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHN1cHBvcnRlZE1vY2tOYW1lcy5oYXMobm9kZS5jYWxsZWUucHJvcGVydHkubmFtZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG5hbWVzcGFjZSBpbXBvcnQgdG8gdXNlIGZvciBgdHlwZW9mIE5hbWVzcGFjZWAuXG4gKiBAcGFyYW0gc291cmNlQ29kZSBTb3VyY2UgY29kZSBmb3IgaW1wb3J0IGluc3BlY3Rpb24uXG4gKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyIE1vZHVsZSBwYXRoIGJlaW5nIG1vY2tlZC5cbiAqIEByZXR1cm5zIEV4aXN0aW5nIG9yIGdlbmVyYXRlZCBuYW1lc3BhY2UgaW1wb3J0IGRldGFpbHMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEludGVybmFsIGhlbHBlciBmb3Igbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5cbiAqIGBgYFxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kdWxlVHlwZUltcG9ydChcbiAgc291cmNlQ29kZTogU291cmNlQ29kZUxpa2UsXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuKTogTW9kdWxlVHlwZUltcG9ydCB7XG4gIGNvbnN0IHN0YXRlbWVudHMgPSBzb3VyY2VDb2RlLmFzdC5ib2R5O1xuICBjb25zdCBwcmVmZXJyZWROYW1lID0gY3JlYXRlTmFtZXNwYWNlTmFtZShtb2R1bGVTcGVjaWZpZXIpO1xuXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHN0YXRlbWVudHMgYXMgVFNFU1RyZWUuUHJvZ3JhbVN0YXRlbWVudFtdKSB7XG4gICAgaWYgKFxuICAgICAgc3RhdGVtZW50LnR5cGUgIT09IEFTVF9OT0RFX1RZUEVTLkltcG9ydERlY2xhcmF0aW9uIHx8XG4gICAgICBzdGF0ZW1lbnQuc291cmNlLnZhbHVlICE9PSBtb2R1bGVTcGVjaWZpZXJcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHN0YXRlbWVudC5zcGVjaWZpZXJzKSB7XG4gICAgICBpZiAoc3BlY2lmaWVyLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcikge1xuICAgICAgICByZXR1cm4geyBpc0V4aXN0aW5nOiB0cnVlLCBuYW1lc3BhY2VOYW1lOiBzcGVjaWZpZXIubG9jYWwubmFtZSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVzZWROYW1lcyA9IGNvbGxlY3RUb3BMZXZlbE5hbWVzKHN0YXRlbWVudHMpO1xuICBsZXQgbmFtZXNwYWNlTmFtZSA9IHByZWZlcnJlZE5hbWU7XG4gIGxldCBzdWZmaXggPSAxO1xuXG4gIHdoaWxlICh1c2VkTmFtZXMuaGFzKG5hbWVzcGFjZU5hbWUpKSB7XG4gICAgbmFtZXNwYWNlTmFtZSA9IGAke3ByZWZlcnJlZE5hbWV9JHtzdWZmaXgudG9GaXhlZCgwKX1gO1xuICAgIHN1ZmZpeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHsgaXNFeGlzdGluZzogZmFsc2UsIG5hbWVzcGFjZU5hbWUgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIG5lc3RlZCBjYXN0IHdyYXBwZXJzIGZyb20gYW4gZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBleHByZXNzaW9uIEV4cHJlc3Npb24gdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMgRXhwcmVzc2lvbiB3aXRob3V0IGFueSBzdXJyb3VuZGluZyBjYXN0cy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gSW50ZXJuYWwgaGVscGVyIGZvciBuby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0LlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHN0cmlwQ2FzdEV4cHJlc3Npb25zKFxuICBleHByZXNzaW9uOiBUU0VTVHJlZS5FeHByZXNzaW9uLFxuKTogVFNFU1RyZWUuRXhwcmVzc2lvbiB7XG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlRTQXNFeHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIHN0cmlwQ2FzdEV4cHJlc3Npb25zKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU1R5cGVBc3NlcnRpb24pIHtcbiAgICByZXR1cm4gc3RyaXBDYXN0RXhwcmVzc2lvbnMoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgfVxuXG4gIHJldHVybiBleHByZXNzaW9uO1xufVxuXG5leHBvcnQgeyBub1Vuc2FmZVZpdGVzdE1vY2tGYWN0b3J5Q2FzdFJ1bGUgfTtcbiJdfQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9uby11bnNhZmUtdml0ZXN0LW1vY2stZmFjdG9yeS1jYXN0L3J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLDREQUE0RDtBQUM1RCxNQUFNLGlDQUFpQyxHQUFvQjtJQUN6RCxNQUFNLEVBQUUsQ0FBQyxPQUF5QixFQUFxQixFQUFFLENBQ3ZELENBQUM7UUFDQyxjQUFjLENBQUMsSUFBSTtZQUNqQixNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxJQUErQixDQUFDLENBQUM7WUFDbkUsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsT0FBTztZQUNULENBQUM7WUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUNiLEdBQUcsRUFBRSxLQUFLLENBQUMsVUFBVTtvQkFDbkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7b0JBQzFELENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ1YsU0FBUyxFQUFFLCtCQUErQjtnQkFDMUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUE2QjtJQUNoQyxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixXQUFXLEVBQ1QsMkdBQTJHO1lBQzdHLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEdBQUcsRUFBRSxxR0FBcUc7U0FDM0c7UUFDRCxPQUFPLEVBQUUsTUFBTTtRQUNmLFFBQVEsRUFBRTtZQUNSLDZCQUE2QixFQUMzQixtSEFBbUg7U0FDdEg7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxTQUFTO0tBQ2hCO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUU0VTVHJlZSB9IGZyb20gXCJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcblxuaW1wb3J0IHsgZ2V0TW9ja0ZhY3RvcnlNYXRjaCB9IGZyb20gXCIuL3J1bGUtZGV0ZWN0aW9uXCI7XG5pbXBvcnQgeyBidWlsZEZpeGVzIH0gZnJvbSBcIi4vcnVsZS1yZXBvcnRpbmdcIjtcblxuLyoqIERpc2FsbG93cyBjYXN0ZWQgYHZpLm1vY2tgIGFuZCBgdmkuZG9Nb2NrYCBmYWN0b3JpZXMuICovXG5jb25zdCBub1Vuc2FmZVZpdGVzdE1vY2tGYWN0b3J5Q2FzdFJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlOiAoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyID0+XG4gICAgKHtcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBnZXRNb2NrRmFjdG9yeU1hdGNoKG5vZGUgYXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24pO1xuICAgICAgICBpZiAobWF0Y2ggPT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBmaXg6IG1hdGNoLmNhbkF1dG9maXhcbiAgICAgICAgICAgID8gKGZpeGVyKTogUnVsZS5GaXhbXSA9PiBidWlsZEZpeGVzKGNvbnRleHQsIGZpeGVyLCBtYXRjaClcbiAgICAgICAgICAgIDogdm9pZCAwLFxuICAgICAgICAgIG1lc3NhZ2VJZDogXCJub1Vuc2FmZVZpdGVzdE1vY2tGYWN0b3J5Q2FzdFwiLFxuICAgICAgICAgIG5vZGU6IG1hdGNoLm5vZGUsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KSBzYXRpc2ZpZXMgUnVsZS5SdWxlTGlzdGVuZXIsXG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEaXNhbGxvdyBjYXN0ZWQgdmkubW9jayBhbmQgdmkuZG9Nb2NrIGZhY3RvcmllcyBhbmQgcHJlZmVyIGNyZWF0ZU1vY2tQcm94eSguLi4pIGZvciBwYXJ0aWFsIG1vZHVsZSBtb2Nrcy5cIixcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgICAgdXJsOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9wYXJsb3RpL2VzbGludC1wbHVnaW4vYmxvYi9tYWluL2RvY3MvcnVsZXMvbm8tdW5zYWZlLXZpdGVzdC1tb2NrLWZhY3RvcnktY2FzdC5tZFwiLFxuICAgIH0sXG4gICAgZml4YWJsZTogXCJjb2RlXCIsXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIG5vVW5zYWZlVml0ZXN0TW9ja0ZhY3RvcnlDYXN0OlxuICAgICAgICBcIkF2b2lkIGNhc3RpbmcgdmkubW9jay92aS5kb01vY2sgZmFjdG9yeSByZXN1bHRzOyB1c2UgY3JlYXRlTW9ja1Byb3h5KC4uLikgd2l0aCBhIHR5cGUtb25seSBtb2R1bGUgaW1wb3J0IGluc3RlYWQuXCIsXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICAgIHR5cGU6IFwicHJvYmxlbVwiLFxuICB9LFxufTtcblxuZXhwb3J0IHsgbm9VbnNhZmVWaXRlc3RNb2NrRmFjdG9yeUNhc3RSdWxlIH07XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"fix-import-updates.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vi-mocked-import/fix-import-updates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,8DAA8D;AAC9D,UAAU,sBAAsB;IAC9B,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE;QACP,0CAA0C;QAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,8CAA8C;QAC9C,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,+BAA+B;QAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC;CACH;AAED;;;;;;;;;;GAUG;AACH,iBAAS,wBAAwB,CAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAClD,KAAK,EAAE,IAAI,CAAC,SAAS,GACpB,IAAI,CAAC,GAAG,EAAE,CAMZ;AAoCD,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
1
+ {"version":3,"file":"fix-import-updates.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vi-mocked-import/fix-import-updates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,8DAA8D;AAC9D,UAAU,sBAAsB;IAC9B,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE;QACP,0CAA0C;QAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,8CAA8C;QAC9C,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,+BAA+B;QAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC;CACH;AAED;;;;;;;;;;GAUG;AACH,iBAAS,wBAAwB,CAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAClD,KAAK,EAAE,IAAI,CAAC,SAAS,GACpB,IAAI,CAAC,GAAG,EAAE,CASZ;AAoCD,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -11,10 +11,13 @@ import { buildImportStatement } from "./fix-import-statements.js";
11
11
  * ```
12
12
  */
13
13
  function buildCombinedUpdateFixes(combinedPlans, fixer) {
14
- return [...combinedPlans.values()].flatMap((plan) => {
14
+ return combinedPlans
15
+ .values()
16
+ .flatMap((plan) => {
15
17
  const updateFix = toCombinedUpdateFix(plan, fixer);
16
18
  return updateFix === void 0 ? [] : [updateFix];
17
- });
19
+ })
20
+ .toArray();
18
21
  }
19
22
  /**
20
23
  * Builds a replacement fix for one combined update plan.
@@ -35,9 +38,9 @@ function toCombinedUpdateFix(plan, fixer) {
35
38
  const { defaultImportName, existingNamedImports, range } = update;
36
39
  const mergedNames = [
37
40
  ...new Set([...names, ...existingNamedImports]),
38
- ].toSorted();
41
+ ].toSorted((left, right) => (left === right ? 0 : left < right ? -1 : 1));
39
42
  const statementText = buildImportStatement(moduleSpecifier, defaultImportName, mergedNames);
40
43
  return fixer.replaceTextRange(range, statementText);
41
44
  }
42
45
  export { buildCombinedUpdateFixes };
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4LWltcG9ydC11cGRhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L2ZpeC1pbXBvcnQtdXBkYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQW1CL0Q7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsd0JBQXdCLENBQy9CLGFBQWtELEVBQ2xELEtBQXFCO0lBRXJCLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2xELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVuRCxPQUFPLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixJQUE0QixFQUM1QixLQUFxQjtJQUVyQixNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFaEQsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2xFLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLG9CQUFvQixDQUFDLENBQUM7S0FDaEQsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNiLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUN4QyxlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLFdBQVcsQ0FDWixDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcclxuXHJcbmltcG9ydCB7IGJ1aWxkSW1wb3J0U3RhdGVtZW50IH0gZnJvbSBcIi4vZml4LWltcG9ydC1zdGF0ZW1lbnRzXCI7XHJcblxyXG4vKiogQ29tYmluZWQgaW1wb3J0IHdvcmsgZm9yIG9uZSBtb2R1bGUgYWNyb3NzIGFsbCBtYXRjaGVzLiAqL1xyXG5pbnRlcmZhY2UgQ29tYmluZWRJbXBvcnRQbGFuTGlrZSB7XHJcbiAgLyoqIE1vZHVsZSBpbXBvcnRlZCBieSB0aGlzIHBsYW4uICovXHJcbiAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmc7XHJcbiAgLyoqIE5hbWVkIGltcG9ydHMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kdWxlLiAqL1xyXG4gIG5hbWVzOiBTZXQ8c3RyaW5nPjtcclxuICAvKiogRXhpc3RpbmcgaW1wb3J0IHJlcGxhY2VtZW50IHBsYW4gd2hlbiBwcmVzZW50LiAqL1xyXG4gIHVwZGF0ZT86IHtcclxuICAgIC8qKiBFeGlzdGluZyBkZWZhdWx0IGltcG9ydCBsb2NhbCBuYW1lLiAqL1xyXG4gICAgZGVmYXVsdEltcG9ydE5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKiogRXhpc3RpbmcgbmFtZWQgaW1wb3J0cyBhbHJlYWR5IHByZXNlbnQuICovXHJcbiAgICBleGlzdGluZ05hbWVkSW1wb3J0czogc3RyaW5nW107XHJcbiAgICAvKiogSW1wb3J0IHJhbmdlIHRvIHJlcGxhY2UuICovXHJcbiAgICByYW5nZTogW251bWJlciwgbnVtYmVyXTtcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHJlcGxhY2VtZW50IGZpeGVzIGZvciBleGlzdGluZyBjb21wYXRpYmxlIGltcG9ydHMuXHJcbiAqIEBwYXJhbSBjb21iaW5lZFBsYW5zIENvbWJpbmVkIHBsYW5zIGtleWVkIGJ5IG1vZHVsZSBzcGVjaWZpZXIuXHJcbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXHJcbiAqIEByZXR1cm5zIFJlcGxhY2VtZW50IGZpeGVzIGZvciBleGlzdGluZyBpbXBvcnRzLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRDb21iaW5lZFVwZGF0ZUZpeGVzKG5ldyBNYXAoKSwge30gYXMgbmV2ZXIpO1xyXG4gKiB2b2lkIGZpeGVzO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkQ29tYmluZWRVcGRhdGVGaXhlcyhcclxuICBjb21iaW5lZFBsYW5zOiBNYXA8c3RyaW5nLCBDb21iaW5lZEltcG9ydFBsYW5MaWtlPixcclxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXHJcbik6IFJ1bGUuRml4W10ge1xyXG4gIHJldHVybiBbLi4uY29tYmluZWRQbGFucy52YWx1ZXMoKV0uZmxhdE1hcCgocGxhbikgPT4ge1xyXG4gICAgY29uc3QgdXBkYXRlRml4ID0gdG9Db21iaW5lZFVwZGF0ZUZpeChwbGFuLCBmaXhlcik7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZUZpeCA9PT0gdm9pZCAwID8gW10gOiBbdXBkYXRlRml4XTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIHJlcGxhY2VtZW50IGZpeCBmb3Igb25lIGNvbWJpbmVkIHVwZGF0ZSBwbGFuLlxyXG4gKiBAcGFyYW0gcGxhbiBDb21iaW5lZCBpbXBvcnQgcGxhbiBmb3Igb25lIG1vZHVsZS5cclxuICogQHBhcmFtIGZpeGVyIEVTTGludCBmaXhlci5cclxuICogQHJldHVybnMgUmVwbGFjZW1lbnQgZml4IHdoZW4gdGhlIG1vZHVsZSBhbHJlYWR5IGhhcyBhIGNvbXBhdGlibGUgaW1wb3J0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeCA9IHRvQ29tYmluZWRVcGRhdGVGaXgoeyBtb2R1bGVTcGVjaWZpZXI6IFwiLi94XCIsIG5hbWVzOiBuZXcgU2V0KCkgfSBhcyBuZXZlciwge30gYXMgbmV2ZXIpO1xyXG4gKiB2b2lkIGZpeDtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiB0b0NvbWJpbmVkVXBkYXRlRml4KFxyXG4gIHBsYW46IENvbWJpbmVkSW1wb3J0UGxhbkxpa2UsXHJcbiAgZml4ZXI6IFJ1bGUuUnVsZUZpeGVyLFxyXG4pOiBSdWxlLkZpeCB8IHVuZGVmaW5lZCB7XHJcbiAgY29uc3QgeyBtb2R1bGVTcGVjaWZpZXIsIG5hbWVzLCB1cGRhdGUgfSA9IHBsYW47XHJcblxyXG4gIGlmICh1cGRhdGUgPT09IHZvaWQgMCkge1xyXG4gICAgcmV0dXJuIHZvaWQgMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHsgZGVmYXVsdEltcG9ydE5hbWUsIGV4aXN0aW5nTmFtZWRJbXBvcnRzLCByYW5nZSB9ID0gdXBkYXRlO1xyXG4gIGNvbnN0IG1lcmdlZE5hbWVzID0gW1xyXG4gICAgLi4ubmV3IFNldChbLi4ubmFtZXMsIC4uLmV4aXN0aW5nTmFtZWRJbXBvcnRzXSksXHJcbiAgXS50b1NvcnRlZCgpO1xyXG4gIGNvbnN0IHN0YXRlbWVudFRleHQgPSBidWlsZEltcG9ydFN0YXRlbWVudChcclxuICAgIG1vZHVsZVNwZWNpZmllcixcclxuICAgIGRlZmF1bHRJbXBvcnROYW1lLFxyXG4gICAgbWVyZ2VkTmFtZXMsXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UocmFuZ2UsIHN0YXRlbWVudFRleHQpO1xyXG59XHJcblxyXG5leHBvcnQgeyBidWlsZENvbWJpbmVkVXBkYXRlRml4ZXMgfTtcclxuIl19
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4LWltcG9ydC11cGRhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi90ZXN0aW5nL3ByZWZlci12aS1tb2NrZWQtaW1wb3J0L2ZpeC1pbXBvcnQtdXBkYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQW1CL0Q7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsd0JBQXdCLENBQy9CLGFBQWtELEVBQ2xELEtBQXFCO0lBRXJCLE9BQU8sYUFBYTtTQUNqQixNQUFNLEVBQUU7U0FDUixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNoQixNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkQsT0FBTyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUM7U0FDRCxPQUFPLEVBQUUsQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsSUFBNEIsRUFDNUIsS0FBcUI7SUFFckIsTUFBTSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRWhELElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNsRSxNQUFNLFdBQVcsR0FBRztRQUNsQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO0tBQ2hELENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUN4QyxlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLFdBQVcsQ0FDWixDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcclxuXHJcbmltcG9ydCB7IGJ1aWxkSW1wb3J0U3RhdGVtZW50IH0gZnJvbSBcIi4vZml4LWltcG9ydC1zdGF0ZW1lbnRzXCI7XHJcblxyXG4vKiogQ29tYmluZWQgaW1wb3J0IHdvcmsgZm9yIG9uZSBtb2R1bGUgYWNyb3NzIGFsbCBtYXRjaGVzLiAqL1xyXG5pbnRlcmZhY2UgQ29tYmluZWRJbXBvcnRQbGFuTGlrZSB7XHJcbiAgLyoqIE1vZHVsZSBpbXBvcnRlZCBieSB0aGlzIHBsYW4uICovXHJcbiAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmc7XHJcbiAgLyoqIE5hbWVkIGltcG9ydHMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kdWxlLiAqL1xyXG4gIG5hbWVzOiBTZXQ8c3RyaW5nPjtcclxuICAvKiogRXhpc3RpbmcgaW1wb3J0IHJlcGxhY2VtZW50IHBsYW4gd2hlbiBwcmVzZW50LiAqL1xyXG4gIHVwZGF0ZT86IHtcclxuICAgIC8qKiBFeGlzdGluZyBkZWZhdWx0IGltcG9ydCBsb2NhbCBuYW1lLiAqL1xyXG4gICAgZGVmYXVsdEltcG9ydE5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKiogRXhpc3RpbmcgbmFtZWQgaW1wb3J0cyBhbHJlYWR5IHByZXNlbnQuICovXHJcbiAgICBleGlzdGluZ05hbWVkSW1wb3J0czogc3RyaW5nW107XHJcbiAgICAvKiogSW1wb3J0IHJhbmdlIHRvIHJlcGxhY2UuICovXHJcbiAgICByYW5nZTogW251bWJlciwgbnVtYmVyXTtcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHJlcGxhY2VtZW50IGZpeGVzIGZvciBleGlzdGluZyBjb21wYXRpYmxlIGltcG9ydHMuXHJcbiAqIEBwYXJhbSBjb21iaW5lZFBsYW5zIENvbWJpbmVkIHBsYW5zIGtleWVkIGJ5IG1vZHVsZSBzcGVjaWZpZXIuXHJcbiAqIEBwYXJhbSBmaXhlciBFU0xpbnQgZml4ZXIuXHJcbiAqIEByZXR1cm5zIFJlcGxhY2VtZW50IGZpeGVzIGZvciBleGlzdGluZyBpbXBvcnRzLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGZpeGVzID0gYnVpbGRDb21iaW5lZFVwZGF0ZUZpeGVzKG5ldyBNYXAoKSwge30gYXMgbmV2ZXIpO1xyXG4gKiB2b2lkIGZpeGVzO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkQ29tYmluZWRVcGRhdGVGaXhlcyhcclxuICBjb21iaW5lZFBsYW5zOiBNYXA8c3RyaW5nLCBDb21iaW5lZEltcG9ydFBsYW5MaWtlPixcclxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXHJcbik6IFJ1bGUuRml4W10ge1xyXG4gIHJldHVybiBjb21iaW5lZFBsYW5zXHJcbiAgICAudmFsdWVzKClcclxuICAgIC5mbGF0TWFwKChwbGFuKSA9PiB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZUZpeCA9IHRvQ29tYmluZWRVcGRhdGVGaXgocGxhbiwgZml4ZXIpO1xyXG5cclxuICAgICAgcmV0dXJuIHVwZGF0ZUZpeCA9PT0gdm9pZCAwID8gW10gOiBbdXBkYXRlRml4XTtcclxuICAgIH0pXHJcbiAgICAudG9BcnJheSgpO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgcmVwbGFjZW1lbnQgZml4IGZvciBvbmUgY29tYmluZWQgdXBkYXRlIHBsYW4uXHJcbiAqIEBwYXJhbSBwbGFuIENvbWJpbmVkIGltcG9ydCBwbGFuIGZvciBvbmUgbW9kdWxlLlxyXG4gKiBAcGFyYW0gZml4ZXIgRVNMaW50IGZpeGVyLlxyXG4gKiBAcmV0dXJucyBSZXBsYWNlbWVudCBmaXggd2hlbiB0aGUgbW9kdWxlIGFscmVhZHkgaGFzIGEgY29tcGF0aWJsZSBpbXBvcnQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgZml4ID0gdG9Db21iaW5lZFVwZGF0ZUZpeCh7IG1vZHVsZVNwZWNpZmllcjogXCIuL3hcIiwgbmFtZXM6IG5ldyBTZXQoKSB9IGFzIG5ldmVyLCB7fSBhcyBuZXZlcik7XHJcbiAqIHZvaWQgZml4O1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIHRvQ29tYmluZWRVcGRhdGVGaXgoXHJcbiAgcGxhbjogQ29tYmluZWRJbXBvcnRQbGFuTGlrZSxcclxuICBmaXhlcjogUnVsZS5SdWxlRml4ZXIsXHJcbik6IFJ1bGUuRml4IHwgdW5kZWZpbmVkIHtcclxuICBjb25zdCB7IG1vZHVsZVNwZWNpZmllciwgbmFtZXMsIHVwZGF0ZSB9ID0gcGxhbjtcclxuXHJcbiAgaWYgKHVwZGF0ZSA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gdm9pZCAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgeyBkZWZhdWx0SW1wb3J0TmFtZSwgZXhpc3RpbmdOYW1lZEltcG9ydHMsIHJhbmdlIH0gPSB1cGRhdGU7XHJcbiAgY29uc3QgbWVyZ2VkTmFtZXMgPSBbXHJcbiAgICAuLi5uZXcgU2V0KFsuLi5uYW1lcywgLi4uZXhpc3RpbmdOYW1lZEltcG9ydHNdKSxcclxuICBdLnRvU29ydGVkKChsZWZ0LCByaWdodCkgPT4gKGxlZnQgPT09IHJpZ2h0ID8gMCA6IGxlZnQgPCByaWdodCA/IC0xIDogMSkpO1xyXG4gIGNvbnN0IHN0YXRlbWVudFRleHQgPSBidWlsZEltcG9ydFN0YXRlbWVudChcclxuICAgIG1vZHVsZVNwZWNpZmllcixcclxuICAgIGRlZmF1bHRJbXBvcnROYW1lLFxyXG4gICAgbWVyZ2VkTmFtZXMsXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UocmFuZ2UsIHN0YXRlbWVudFRleHQpO1xyXG59XHJcblxyXG5leHBvcnQgeyBidWlsZENvbWJpbmVkVXBkYXRlRml4ZXMgfTtcclxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"fix-imports.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vi-mocked-import/fix-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAsDzC;;;;;;;;;;GAUG;AACH,iBAAS,wBAAwB,CAC/B,OAAO,EAAE,SAAS,EAAE,EACpB,KAAK,EAAE,IAAI,CAAC,SAAS,GACpB,IAAI,CAAC,GAAG,EAAE,CASZ;AAsND,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
1
+ {"version":3,"file":"fix-imports.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/prefer-vi-mocked-import/fix-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAwDzC;;;;;;;;;;GAUG;AACH,iBAAS,wBAAwB,CAC/B,OAAO,EAAE,SAAS,EAAE,EACpB,KAAK,EAAE,IAAI,CAAC,SAAS,GACpB,IAAI,CAAC,GAAG,EAAE,CASZ;AAyND,OAAO,EAAE,wBAAwB,EAAE,CAAC"}