@codeperfect/eslint-plugin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts +16 -0
  5. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -0
  6. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +131 -0
  7. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +48 -0
  8. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -0
  9. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.js +126 -0
  10. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +40 -0
  11. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +1 -0
  12. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +90 -0
  13. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts +11 -0
  14. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -0
  15. package/dist/architecture/consistent-barrel-files/exports-only-rule.js +218 -0
  16. package/dist/architecture/consistent-barrel-files/index.d.ts +5 -0
  17. package/dist/architecture/consistent-barrel-files/index.d.ts.map +1 -0
  18. package/dist/architecture/consistent-barrel-files/index.js +4 -0
  19. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts +11 -0
  20. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -0
  21. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +100 -0
  22. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +40 -0
  23. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +1 -0
  24. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +90 -0
  25. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts +65 -0
  26. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -0
  27. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +154 -0
  28. package/dist/architecture/consistent-barrel-files/rule.d.ts +11 -0
  29. package/dist/architecture/consistent-barrel-files/rule.d.ts.map +1 -0
  30. package/dist/architecture/consistent-barrel-files/rule.js +58 -0
  31. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts +141 -0
  32. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts.map +1 -0
  33. package/dist/architecture/consistent-barrel-files/test-helpers.js +229 -0
  34. package/dist/architecture/consistent-barrel-files/types.d.ts +25 -0
  35. package/dist/architecture/consistent-barrel-files/types.d.ts.map +1 -0
  36. package/dist/architecture/consistent-barrel-files/types.js +2 -0
  37. package/dist/architecture/index.d.ts +2 -0
  38. package/dist/architecture/index.d.ts.map +1 -0
  39. package/dist/architecture/index.js +2 -0
  40. package/dist/benchmark-rules.d.ts +83 -0
  41. package/dist/benchmark-rules.d.ts.map +1 -0
  42. package/dist/benchmark-rules.js +175 -0
  43. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  44. package/dist/codeperfect-plugin.d.ts +46 -0
  45. package/dist/codeperfect-plugin.d.ts.map +1 -0
  46. package/dist/codeperfect-plugin.js +29 -0
  47. package/dist/core/index.d.ts +3 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +3 -0
  50. package/dist/core/no-multiple-declarators/index.d.ts +2 -0
  51. package/dist/core/no-multiple-declarators/index.d.ts.map +1 -0
  52. package/dist/core/no-multiple-declarators/index.js +2 -0
  53. package/dist/core/no-multiple-declarators/rule.d.ts +4 -0
  54. package/dist/core/no-multiple-declarators/rule.d.ts.map +1 -0
  55. package/dist/core/no-multiple-declarators/rule.js +100 -0
  56. package/dist/core/prefer-interface-types/index.d.ts +2 -0
  57. package/dist/core/prefer-interface-types/index.d.ts.map +1 -0
  58. package/dist/core/prefer-interface-types/index.js +2 -0
  59. package/dist/core/prefer-interface-types/rule.d.ts +5 -0
  60. package/dist/core/prefer-interface-types/rule.d.ts.map +1 -0
  61. package/dist/core/prefer-interface-types/rule.js +145 -0
  62. package/dist/core/prefer-interface-types/test-helpers.d.ts +110 -0
  63. package/dist/core/prefer-interface-types/test-helpers.d.ts.map +1 -0
  64. package/dist/core/prefer-interface-types/test-helpers.js +116 -0
  65. package/dist/custom-rule-documentation.d.ts +36 -0
  66. package/dist/custom-rule-documentation.d.ts.map +1 -0
  67. package/dist/custom-rule-documentation.js +35 -0
  68. package/dist/custom-rules.d.ts +61 -0
  69. package/dist/custom-rules.d.ts.map +1 -0
  70. package/dist/custom-rules.js +70 -0
  71. package/dist/docs/index.d.ts +4 -0
  72. package/dist/docs/index.d.ts.map +1 -0
  73. package/dist/docs/index.js +4 -0
  74. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts +89 -0
  75. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -0
  76. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.js +129 -0
  77. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts +48 -0
  78. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -0
  79. package/dist/docs/no-interface-member-docs/comment-utilities.js +146 -0
  80. package/dist/docs/no-interface-member-docs/index.d.ts +2 -0
  81. package/dist/docs/no-interface-member-docs/index.d.ts.map +1 -0
  82. package/dist/docs/no-interface-member-docs/index.js +2 -0
  83. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts +13 -0
  84. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -0
  85. package/dist/docs/no-interface-member-docs/parameter-tags.js +101 -0
  86. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts +24 -0
  87. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -0
  88. package/dist/docs/no-interface-member-docs/parameter-utilities.js +125 -0
  89. package/dist/docs/no-interface-member-docs/rule.d.ts +5 -0
  90. package/dist/docs/no-interface-member-docs/rule.d.ts.map +1 -0
  91. package/dist/docs/no-interface-member-docs/rule.js +168 -0
  92. package/dist/docs/no-interface-member-docs/test-helpers.d.ts +103 -0
  93. package/dist/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
  94. package/dist/docs/no-interface-member-docs/test-helpers.js +157 -0
  95. package/dist/docs/no-interface-member-docs/types.d.ts +30 -0
  96. package/dist/docs/no-interface-member-docs/types.d.ts.map +1 -0
  97. package/dist/docs/no-interface-member-docs/types.js +2 -0
  98. package/dist/docs/require-example-language/empty-fence-fixes.d.ts +29 -0
  99. package/dist/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -0
  100. package/dist/docs/require-example-language/empty-fence-fixes.js +169 -0
  101. package/dist/docs/require-example-language/example-utilities.d.ts +70 -0
  102. package/dist/docs/require-example-language/example-utilities.d.ts.map +1 -0
  103. package/dist/docs/require-example-language/example-utilities.js +76 -0
  104. package/dist/docs/require-example-language/examples.d.ts +36 -0
  105. package/dist/docs/require-example-language/examples.d.ts.map +1 -0
  106. package/dist/docs/require-example-language/examples.js +181 -0
  107. package/dist/docs/require-example-language/fixes.d.ts +49 -0
  108. package/dist/docs/require-example-language/fixes.d.ts.map +1 -0
  109. package/dist/docs/require-example-language/fixes.js +182 -0
  110. package/dist/docs/require-example-language/index.d.ts +3 -0
  111. package/dist/docs/require-example-language/index.d.ts.map +1 -0
  112. package/dist/docs/require-example-language/index.js +2 -0
  113. package/dist/docs/require-example-language/reporting.d.ts +60 -0
  114. package/dist/docs/require-example-language/reporting.d.ts.map +1 -0
  115. package/dist/docs/require-example-language/reporting.js +145 -0
  116. package/dist/docs/require-example-language/rule.d.ts +7 -0
  117. package/dist/docs/require-example-language/rule.d.ts.map +1 -0
  118. package/dist/docs/require-example-language/rule.js +34 -0
  119. package/dist/docs/require-example-language/types.d.ts +22 -0
  120. package/dist/docs/require-example-language/types.d.ts.map +1 -0
  121. package/dist/docs/require-example-language/types.js +2 -0
  122. package/dist/docs/single-line-jsdoc/index.d.ts +2 -0
  123. package/dist/docs/single-line-jsdoc/index.d.ts.map +1 -0
  124. package/dist/docs/single-line-jsdoc/index.js +2 -0
  125. package/dist/docs/single-line-jsdoc/rule.d.ts +5 -0
  126. package/dist/docs/single-line-jsdoc/rule.d.ts.map +1 -0
  127. package/dist/docs/single-line-jsdoc/rule.js +196 -0
  128. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts +16 -0
  129. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -0
  130. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.js +95 -0
  131. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts +25 -0
  132. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -0
  133. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +140 -0
  134. package/dist/docs/test-helpers.d.ts +50 -0
  135. package/dist/docs/test-helpers.d.ts.map +1 -0
  136. package/dist/docs/test-helpers.js +107 -0
  137. package/dist/index.d.ts +6 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +6 -0
  140. package/dist/presets.d.ts +10 -0
  141. package/dist/presets.d.ts.map +1 -0
  142. package/dist/presets.js +50 -0
  143. package/dist/rules/index.d.ts +5 -0
  144. package/dist/rules/index.d.ts.map +1 -0
  145. package/dist/rules/index.js +6 -0
  146. package/dist/testing/aaa/analyzer.d.ts +36 -0
  147. package/dist/testing/aaa/analyzer.d.ts.map +1 -0
  148. package/dist/testing/aaa/analyzer.js +490 -0
  149. package/dist/testing/aaa/index.d.ts +3 -0
  150. package/dist/testing/aaa/index.d.ts.map +1 -0
  151. package/dist/testing/aaa/index.js +2 -0
  152. package/dist/testing/aaa/types.d.ts +31 -0
  153. package/dist/testing/aaa/types.d.ts.map +1 -0
  154. package/dist/testing/aaa/types.js +2 -0
  155. package/dist/testing/assert-actual-expected-names/index.d.ts +2 -0
  156. package/dist/testing/assert-actual-expected-names/index.d.ts.map +1 -0
  157. package/dist/testing/assert-actual-expected-names/index.js +2 -0
  158. package/dist/testing/assert-actual-expected-names/rule.d.ts +4 -0
  159. package/dist/testing/assert-actual-expected-names/rule.d.ts.map +1 -0
  160. package/dist/testing/assert-actual-expected-names/rule.js +54 -0
  161. package/dist/testing/enforce-aaa-phase-purity/index.d.ts +2 -0
  162. package/dist/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -0
  163. package/dist/testing/enforce-aaa-phase-purity/index.js +2 -0
  164. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts +4 -0
  165. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -0
  166. package/dist/testing/enforce-aaa-phase-purity/rule.js +110 -0
  167. package/dist/testing/enforce-aaa-structure/index.d.ts +2 -0
  168. package/dist/testing/enforce-aaa-structure/index.d.ts.map +1 -0
  169. package/dist/testing/enforce-aaa-structure/index.js +2 -0
  170. package/dist/testing/enforce-aaa-structure/rule.d.ts +4 -0
  171. package/dist/testing/enforce-aaa-structure/rule.d.ts.map +1 -0
  172. package/dist/testing/enforce-aaa-structure/rule.js +48 -0
  173. package/dist/testing/index.d.ts +9 -0
  174. package/dist/testing/index.d.ts.map +1 -0
  175. package/dist/testing/index.js +9 -0
  176. package/dist/testing/prefer-vi-mocked-import/fix.d.ts +16 -0
  177. package/dist/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -0
  178. package/dist/testing/prefer-vi-mocked-import/fix.js +224 -0
  179. package/dist/testing/prefer-vi-mocked-import/index.d.ts +2 -0
  180. package/dist/testing/prefer-vi-mocked-import/index.d.ts.map +1 -0
  181. package/dist/testing/prefer-vi-mocked-import/index.js +2 -0
  182. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts +16 -0
  183. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -0
  184. package/dist/testing/prefer-vi-mocked-import/match-bindings.js +52 -0
  185. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts +16 -0
  186. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -0
  187. package/dist/testing/prefer-vi-mocked-import/match-declarations.js +99 -0
  188. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts +66 -0
  189. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +1 -0
  190. package/dist/testing/prefer-vi-mocked-import/match-helpers.js +102 -0
  191. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts +17 -0
  192. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -0
  193. package/dist/testing/prefer-vi-mocked-import/match-imports.js +156 -0
  194. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts +42 -0
  195. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -0
  196. package/dist/testing/prefer-vi-mocked-import/match-rewrites.js +119 -0
  197. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts +13 -0
  198. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts.map +1 -0
  199. package/dist/testing/prefer-vi-mocked-import/match-walk.js +62 -0
  200. package/dist/testing/prefer-vi-mocked-import/match.d.ts +15 -0
  201. package/dist/testing/prefer-vi-mocked-import/match.d.ts.map +1 -0
  202. package/dist/testing/prefer-vi-mocked-import/match.js +193 -0
  203. package/dist/testing/prefer-vi-mocked-import/rule.d.ts +5 -0
  204. package/dist/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -0
  205. package/dist/testing/prefer-vi-mocked-import/rule.js +32 -0
  206. package/dist/testing/prefer-vi-mocked-import/types.d.ts +83 -0
  207. package/dist/testing/prefer-vi-mocked-import/types.d.ts.map +1 -0
  208. package/dist/testing/prefer-vi-mocked-import/types.js +2 -0
  209. package/dist/testing/require-aaa-sections/index.d.ts +2 -0
  210. package/dist/testing/require-aaa-sections/index.d.ts.map +1 -0
  211. package/dist/testing/require-aaa-sections/index.js +2 -0
  212. package/dist/testing/require-aaa-sections/rule.d.ts +4 -0
  213. package/dist/testing/require-aaa-sections/rule.d.ts.map +1 -0
  214. package/dist/testing/require-aaa-sections/rule.js +111 -0
  215. package/dist/testing/require-act-result-capture/index.d.ts +2 -0
  216. package/dist/testing/require-act-result-capture/index.d.ts.map +1 -0
  217. package/dist/testing/require-act-result-capture/index.js +2 -0
  218. package/dist/testing/require-act-result-capture/rule.d.ts +4 -0
  219. package/dist/testing/require-act-result-capture/rule.d.ts.map +1 -0
  220. package/dist/testing/require-act-result-capture/rule.js +34 -0
  221. package/dist/testing/require-test-companion/index.d.ts +3 -0
  222. package/dist/testing/require-test-companion/index.d.ts.map +1 -0
  223. package/dist/testing/require-test-companion/index.js +3 -0
  224. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts +16 -0
  225. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -0
  226. package/dist/testing/require-test-companion/require-test-companion-listeners.js +145 -0
  227. package/dist/testing/require-test-companion/require-test-companion-options.d.ts +54 -0
  228. package/dist/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -0
  229. package/dist/testing/require-test-companion/require-test-companion-options.js +112 -0
  230. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts +51 -0
  231. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +1 -0
  232. package/dist/testing/require-test-companion/require-test-companion-test-helpers.js +183 -0
  233. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts +28 -0
  234. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts.map +1 -0
  235. package/dist/testing/require-test-companion/require-test-companion-utilities.js +26 -0
  236. package/dist/testing/require-test-companion/rule.d.ts +5 -0
  237. package/dist/testing/require-test-companion/rule.d.ts.map +1 -0
  238. package/dist/testing/require-test-companion/rule.js +57 -0
  239. package/dist/testing/require-test-companion/types.d.ts +11 -0
  240. package/dist/testing/require-test-companion/types.d.ts.map +1 -0
  241. package/dist/testing/require-test-companion/types.js +2 -0
  242. package/dist/testing/single-act-statement/index.d.ts +2 -0
  243. package/dist/testing/single-act-statement/index.d.ts.map +1 -0
  244. package/dist/testing/single-act-statement/index.js +2 -0
  245. package/dist/testing/single-act-statement/rule.d.ts +4 -0
  246. package/dist/testing/single-act-statement/rule.d.ts.map +1 -0
  247. package/dist/testing/single-act-statement/rule.js +33 -0
  248. package/package.json +106 -0
@@ -0,0 +1,490 @@
1
+ const aaaPhaseOrder = {
2
+ Act: 1,
3
+ Arrange: 0,
4
+ Assert: 2,
5
+ };
6
+ const arrayMutationMethods = new Set([
7
+ "copyWithin",
8
+ "fill",
9
+ "pop",
10
+ "push",
11
+ "reverse",
12
+ "shift",
13
+ "sort",
14
+ "splice",
15
+ "unshift",
16
+ ]);
17
+ const phaseNames = ["Arrange", "Act", "Assert"];
18
+ const setupLikeNames = /^(arrange|build|create|fixture|given|make|mock|seed|setup|spy|stub)/u;
19
+ const utilityMethodNames = new Set([
20
+ "advanceTimersByTime",
21
+ "clearAllMocks",
22
+ "debug",
23
+ "fn",
24
+ "info",
25
+ "log",
26
+ "mockImplementation",
27
+ "mockRejectedValue",
28
+ "mockResolvedValue",
29
+ "mockReturnValue",
30
+ "resetAllMocks",
31
+ "useFakeTimers",
32
+ "warn",
33
+ ]);
34
+ const voidLikeMethodNames = new Set([
35
+ "clear",
36
+ "debug",
37
+ "dispatch",
38
+ "emit",
39
+ "info",
40
+ "log",
41
+ "print",
42
+ "publish",
43
+ "reset",
44
+ "set",
45
+ "trigger",
46
+ "warn",
47
+ ]);
48
+ function getSectionPhases(commentValue) {
49
+ const trimmedComment = commentValue.trim();
50
+ if (trimmedComment.length === 0) {
51
+ return [];
52
+ }
53
+ const parts = trimmedComment.split(/\s*&\s*/u);
54
+ return parts.every(isAaaPhase) ? parts : [];
55
+ }
56
+ function analyzeTestBlock(context, node) {
57
+ const testCall = getSupportedTestCall(node);
58
+ if (testCall === void 0) {
59
+ return void 0;
60
+ }
61
+ const { callback, callExpression } = testCall;
62
+ const { sourceCode } = context;
63
+ const sectionComments = sourceCode
64
+ .getAllComments()
65
+ .filter((comment) => isLocatedComment(comment) &&
66
+ comment.type === "Line" &&
67
+ isRangeWithin(comment.range, callback.body.range) &&
68
+ getSectionPhases(comment.value).length > 0)
69
+ .map((comment) => ({
70
+ comment: comment,
71
+ phases: getSectionPhases(comment.value),
72
+ }));
73
+ const flattenedSections = sectionComments.flatMap((sectionComment) => sectionComment.phases.map((phase) => ({
74
+ line: sectionComment.comment.loc.start.line,
75
+ phase,
76
+ })));
77
+ return {
78
+ body: callback.body,
79
+ bodyLineCount: callback.body.loc.end.line - callback.body.loc.start.line - 1,
80
+ callExpression,
81
+ newline: getNewline(sourceCode.text),
82
+ sectionComments,
83
+ sourceText: sourceCode.text,
84
+ statements: callback.body.body.map((statement) => ({
85
+ node: statement,
86
+ phase: getStatementPhase(statement, flattenedSections),
87
+ })),
88
+ };
89
+ }
90
+ function countActStatements(analysis) {
91
+ return analysis.statements.filter((statement) => statement.phase === "Act" &&
92
+ (statement.node.type === "ExpressionStatement" ||
93
+ statement.node.type === "VariableDeclaration")).length;
94
+ }
95
+ function getAssertionIdentifiers(statement) {
96
+ if (statement.type !== "ExpressionStatement") {
97
+ return { actual: void 0, expected: void 0 };
98
+ }
99
+ const expression = unwrapExpression(statement.expression);
100
+ if (expression?.type !== "CallExpression") {
101
+ return { actual: void 0, expected: void 0 };
102
+ }
103
+ const expectOperands = getExpectOperands(expression);
104
+ if (expectOperands !== void 0) {
105
+ return {
106
+ actual: getIdentifierName(expectOperands.actual),
107
+ expected: getIdentifierName(expectOperands.expected),
108
+ };
109
+ }
110
+ const assertOperands = getAssertOperands(expression);
111
+ return {
112
+ actual: getIdentifierName(assertOperands?.actual),
113
+ expected: getIdentifierName(assertOperands?.expected),
114
+ };
115
+ }
116
+ function getAssertDeclaredIdentifiers(analysis) {
117
+ const declaredIdentifiers = new Map();
118
+ for (const statement of analysis.statements) {
119
+ if (statement.phase !== "Assert" ||
120
+ statement.node.type !== "VariableDeclaration") {
121
+ continue;
122
+ }
123
+ for (const declaration of statement.node.declarations) {
124
+ if (declaration.id.type === "Identifier") {
125
+ declaredIdentifiers.set(declaration.id.name, declaration.id);
126
+ }
127
+ }
128
+ }
129
+ return declaredIdentifiers;
130
+ }
131
+ function getFlattenedSections(analysis) {
132
+ return analysis.sectionComments.flatMap((sectionComment) => sectionComment.phases.map((phase) => ({
133
+ comment: sectionComment.comment,
134
+ phase,
135
+ })));
136
+ }
137
+ function getPhaseBoundaryComments(analysis) {
138
+ return analysis.sectionComments.filter((sectionComment) => sectionComment.phases.some((phase) => phase === "Act" || phase === "Assert"));
139
+ }
140
+ function hasAssertion(statement) {
141
+ let foundAssertion = false;
142
+ visitNode(statement, (node) => {
143
+ if (node.type === "CallExpression" && isAssertionCall(node)) {
144
+ foundAssertion = true;
145
+ }
146
+ });
147
+ return foundAssertion;
148
+ }
149
+ function hasAsyncLogic(statement) {
150
+ let foundAsyncLogic = false;
151
+ visitNode(statement, (node) => {
152
+ if (node.type === "AwaitExpression") {
153
+ foundAsyncLogic = true;
154
+ return;
155
+ }
156
+ if (node.type === "CallExpression" &&
157
+ node.callee.type === "MemberExpression" &&
158
+ node.callee.property.type === "Identifier" &&
159
+ ["catch", "finally", "then"].includes(node.callee.property.name)) {
160
+ foundAsyncLogic = true;
161
+ return;
162
+ }
163
+ if (node.type === "NewExpression" &&
164
+ getExpressionName(node.callee) === "Promise") {
165
+ foundAsyncLogic = true;
166
+ }
167
+ });
168
+ return foundAsyncLogic;
169
+ }
170
+ function hasAwait(statement) {
171
+ let foundAwait = false;
172
+ visitNode(statement, (node) => {
173
+ if (node.type === "AwaitExpression") {
174
+ foundAwait = true;
175
+ }
176
+ });
177
+ return foundAwait;
178
+ }
179
+ function hasBlankLineBeforeComment(sourceText, comment) {
180
+ if (!isLocatedComment(comment)) {
181
+ return true;
182
+ }
183
+ const lines = sourceText.split(/\r\n|\n/u);
184
+ const previousLine = lines[comment.loc.start.line - 2];
185
+ return previousLine === void 0 || previousLine.trim().length === 0;
186
+ }
187
+ function hasCapturableActResult(statement) {
188
+ if (statement.type !== "ExpressionStatement") {
189
+ return false;
190
+ }
191
+ const expression = unwrapExpression(statement.expression);
192
+ if (!isActionExpression(expression) || isUtilityLikeExpression(expression)) {
193
+ return false;
194
+ }
195
+ const calleeName = getInvokedName(expression);
196
+ return (calleeName === void 0 ||
197
+ (!voidLikeMethodNames.has(calleeName) &&
198
+ !/^(clear|debug|dispatch|emit|info|log|print|publish|reset|set|trigger|warn)/u.test(calleeName)));
199
+ }
200
+ function hasMutation(statement) {
201
+ let foundMutation = false;
202
+ visitNode(statement, (node) => {
203
+ if (node.type === "AssignmentExpression" ||
204
+ node.type === "UpdateExpression" ||
205
+ node.type === "UnaryExpression") {
206
+ if (node.type !== "UnaryExpression" || node.operator === "delete") {
207
+ foundMutation = true;
208
+ }
209
+ return;
210
+ }
211
+ if (node.type === "CallExpression" &&
212
+ node.callee.type === "MemberExpression" &&
213
+ node.callee.property.type === "Identifier" &&
214
+ arrayMutationMethods.has(node.callee.property.name)) {
215
+ foundMutation = true;
216
+ }
217
+ });
218
+ return foundMutation;
219
+ }
220
+ function isMeaningfulActStatement(statement) {
221
+ const expression = getStatementExpression(statement);
222
+ if (expression === void 0) {
223
+ return false;
224
+ }
225
+ return (isActionExpression(expression) &&
226
+ !isUtilityLikeExpression(expression) &&
227
+ !hasAssertion(statement));
228
+ }
229
+ function isSetupLikeStatement(statement) {
230
+ if (statement.type === "VariableDeclaration") {
231
+ return statement.declarations.every((declaration) => {
232
+ if (declaration.init === null) {
233
+ return true;
234
+ }
235
+ const init = unwrapExpression(declaration.init);
236
+ return !isActionExpression(init) || isUtilityLikeExpression(init);
237
+ });
238
+ }
239
+ const expression = getStatementExpression(statement);
240
+ return expression !== void 0 && isUtilityLikeExpression(expression);
241
+ }
242
+ function isValidAssertStatement(statement) {
243
+ if (hasAssertion(statement)) {
244
+ return true;
245
+ }
246
+ if (statement.type !== "VariableDeclaration") {
247
+ return false;
248
+ }
249
+ return statement.declarations.every((declaration) => {
250
+ /* v8 ignore start -- the parser used in this repo emits undefined rather than null for uninitialized declarators. */
251
+ if (declaration.init === null) {
252
+ return true;
253
+ }
254
+ /* v8 ignore stop */
255
+ const init = unwrapExpression(declaration.init);
256
+ return !isActionExpression(init);
257
+ });
258
+ }
259
+ function usesPrefix(name, prefix) {
260
+ return name === prefix || name.startsWith(prefix);
261
+ }
262
+ /* v8 ignore start -- valid analyzer callers always request an existing statement line. */
263
+ function getLineStartRange(sourceText, line) {
264
+ let currentLine = 1;
265
+ for (let index = 0; index < sourceText.length; index += 1) {
266
+ if (currentLine === line) {
267
+ return [index, index];
268
+ }
269
+ if (sourceText[index] === "\n") {
270
+ currentLine += 1;
271
+ }
272
+ }
273
+ return [sourceText.length, sourceText.length];
274
+ }
275
+ /* v8 ignore stop */
276
+ /* v8 ignore start -- the indentation regex always matches, but the fallback keeps the helper total-safe. */
277
+ function getIndentationAtOffset(sourceText, offset) {
278
+ const lineStart = sourceText.lastIndexOf("\n", Math.max(0, offset - 1)) + 1;
279
+ const linePrefix = sourceText.slice(lineStart, offset);
280
+ const indentation = /^\s*/u.exec(linePrefix);
281
+ return indentation?.[0] ?? "";
282
+ }
283
+ /* v8 ignore stop */
284
+ function getAssertOperands(expression) {
285
+ if (expression.callee.type === "MemberExpression" &&
286
+ expression.callee.object.type === "Identifier" &&
287
+ expression.callee.object.name === "assert") {
288
+ const [actual, expected] = expression.arguments;
289
+ if (actual?.type !== "SpreadElement" &&
290
+ expected?.type !== "SpreadElement") {
291
+ return { actual, expected };
292
+ }
293
+ }
294
+ return void 0;
295
+ }
296
+ function getExpectOperands(expression) {
297
+ if (expression.callee.type === "Identifier" &&
298
+ expression.callee.name === "expect") {
299
+ const [actual] = expression.arguments;
300
+ return actual?.type === "SpreadElement"
301
+ ? { actual: void 0, expected: void 0 }
302
+ : { actual, expected: void 0 };
303
+ }
304
+ if (expression.callee.type === "MemberExpression" &&
305
+ expression.callee.object.type === "CallExpression") {
306
+ const nestedOperands = getExpectOperands(expression.callee.object);
307
+ if (nestedOperands === void 0) {
308
+ return void 0;
309
+ }
310
+ const [expected] = expression.arguments;
311
+ return expected?.type === "SpreadElement"
312
+ ? nestedOperands
313
+ : { actual: nestedOperands.actual, expected };
314
+ }
315
+ return void 0;
316
+ }
317
+ /* v8 ignore start -- the fallback branches are retained for helper totality but are not reachable from current analyzer entry points. */
318
+ function getExpressionName(expression) {
319
+ if (expression.type === "Super") {
320
+ return void 0;
321
+ }
322
+ if (expression.type === "Identifier") {
323
+ return expression.name;
324
+ }
325
+ if (expression.type === "MemberExpression" &&
326
+ expression.property.type === "Identifier") {
327
+ return expression.property.name;
328
+ }
329
+ return void 0;
330
+ }
331
+ /* v8 ignore stop */
332
+ function getIdentifierName(expression) {
333
+ return expression?.type === "Identifier" ? expression.name : void 0;
334
+ }
335
+ /* v8 ignore start -- callers only ask for invoked names after action-expression checks that narrow to call/new expressions. */
336
+ function getInvokedName(expression) {
337
+ const unwrappedExpression = unwrapExpression(expression);
338
+ if (unwrappedExpression?.type === "CallExpression" ||
339
+ unwrappedExpression?.type === "NewExpression") {
340
+ return getExpressionName(unwrappedExpression.callee);
341
+ }
342
+ return void 0;
343
+ }
344
+ /* v8 ignore stop */
345
+ function getNewline(text) {
346
+ return text.includes("\r\n") ? "\r\n" : "\n";
347
+ }
348
+ function getStatementExpression(statement) {
349
+ if (statement.type === "ExpressionStatement") {
350
+ return statement.expression;
351
+ }
352
+ if (statement.type === "VariableDeclaration" &&
353
+ statement.declarations.length === 1) {
354
+ /* v8 ignore start -- valid ESTree variable declarations always carry the matched declarator. */
355
+ return statement.declarations[0]?.init ?? void 0;
356
+ /* v8 ignore stop */
357
+ }
358
+ return void 0;
359
+ }
360
+ function getStatementPhase(statement, flattenedSections) {
361
+ const statementLine = statement.loc?.start.line;
362
+ if (statementLine === void 0) {
363
+ return void 0;
364
+ }
365
+ let currentPhase;
366
+ for (const section of flattenedSections) {
367
+ if (section.line > statementLine) {
368
+ break;
369
+ }
370
+ currentPhase = section.phase;
371
+ }
372
+ return currentPhase;
373
+ }
374
+ function getSupportedTestCall(node) {
375
+ const rootName = getTestRootName(node.callee);
376
+ if (rootName !== "it" && rootName !== "test") {
377
+ return void 0;
378
+ }
379
+ const callbackArgument = node.arguments.at(-1);
380
+ if (callbackArgument === void 0 ||
381
+ callbackArgument.type === "SpreadElement" ||
382
+ (callbackArgument.type !== "ArrowFunctionExpression" &&
383
+ callbackArgument.type !== "FunctionExpression") ||
384
+ callbackArgument.body.type !== "BlockStatement") {
385
+ return void 0;
386
+ }
387
+ return {
388
+ callback: callbackArgument,
389
+ callExpression: node,
390
+ };
391
+ }
392
+ function getTestRootName(callee) {
393
+ if (callee.type === "Identifier") {
394
+ return callee.name;
395
+ }
396
+ if (callee.type === "MemberExpression" && callee.object.type !== "Super") {
397
+ return getTestRootName(callee.object);
398
+ }
399
+ return void 0;
400
+ }
401
+ function isActionExpression(expression) {
402
+ const unwrappedExpression = unwrapExpression(expression);
403
+ return (unwrappedExpression?.type === "AwaitExpression" ||
404
+ unwrappedExpression?.type === "CallExpression" ||
405
+ unwrappedExpression?.type === "NewExpression");
406
+ }
407
+ function isAaaPhase(value) {
408
+ return phaseNames.includes(value);
409
+ }
410
+ function isAssertionCall(node) {
411
+ if (node.callee.type === "Identifier") {
412
+ return node.callee.name === "expect" || node.callee.name === "assert";
413
+ }
414
+ if (node.callee.type !== "MemberExpression") {
415
+ return false;
416
+ }
417
+ if (node.callee.object.type === "Identifier" &&
418
+ node.callee.object.name === "assert") {
419
+ return true;
420
+ }
421
+ if (node.callee.object.type === "CallExpression") {
422
+ return isAssertionCall(node.callee.object);
423
+ }
424
+ return false;
425
+ }
426
+ function isRangeWithin(range, container) {
427
+ return range[0] >= container[0] && range[1] <= container[1];
428
+ }
429
+ function isUtilityLikeExpression(expression) {
430
+ const unwrappedExpression = unwrapExpression(expression);
431
+ if (unwrappedExpression?.type !== "CallExpression" &&
432
+ unwrappedExpression?.type !== "NewExpression") {
433
+ return false;
434
+ }
435
+ const calleeName = getExpressionName(unwrappedExpression.callee);
436
+ if (calleeName === void 0) {
437
+ return false;
438
+ }
439
+ if (utilityMethodNames.has(calleeName) || setupLikeNames.test(calleeName)) {
440
+ return true;
441
+ }
442
+ return (unwrappedExpression.callee.type === "MemberExpression" &&
443
+ unwrappedExpression.callee.object.type === "Identifier" &&
444
+ ["console", "vi"].includes(unwrappedExpression.callee.object.name));
445
+ }
446
+ function unwrapExpression(expression) {
447
+ if (expression?.type === "ChainExpression") {
448
+ return unwrapExpression(expression.expression);
449
+ }
450
+ if (expression?.type === "AwaitExpression") {
451
+ return expression.argument;
452
+ }
453
+ return expression;
454
+ }
455
+ function visitNode(node, callback, seenNodes = new WeakSet()) {
456
+ if (seenNodes.has(node)) {
457
+ return;
458
+ }
459
+ seenNodes.add(node);
460
+ callback(node);
461
+ for (const [key, value] of Object.entries(node)) {
462
+ if (key === "parent") {
463
+ continue;
464
+ }
465
+ if (Array.isArray(value)) {
466
+ for (const item of value) {
467
+ if (isNode(item)) {
468
+ visitNode(item, callback, seenNodes);
469
+ }
470
+ }
471
+ continue;
472
+ }
473
+ if (isNode(value)) {
474
+ visitNode(value, callback, seenNodes);
475
+ }
476
+ }
477
+ }
478
+ function isNode(value) {
479
+ return (typeof value === "object" &&
480
+ value !== null &&
481
+ "type" in value &&
482
+ typeof value.type === "string");
483
+ }
484
+ function isLocatedComment(comment) {
485
+ return (comment.loc !== null &&
486
+ comment.loc !== undefined &&
487
+ comment.range !== undefined);
488
+ }
489
+ export { aaaPhaseOrder, analyzeTestBlock, countActStatements, getAssertDeclaredIdentifiers, getAssertionIdentifiers, getFlattenedSections, getIndentationAtOffset, getLineStartRange, getPhaseBoundaryComments, getSectionPhases, hasAssertion, hasAsyncLogic, hasAwait, hasBlankLineBeforeComment, hasCapturableActResult, hasMutation, isMeaningfulActStatement, isSetupLikeStatement, isValidAssertStatement, usesPrefix, };
490
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9hYWEvYW5hbHl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsTUFBTSxhQUFhLEdBQUc7SUFDcEIsR0FBRyxFQUFFLENBQUM7SUFDTixPQUFPLEVBQUUsQ0FBQztJQUNWLE1BQU0sRUFBRSxDQUFDO0NBQ2tDLENBQUM7QUFFOUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuQyxZQUFZO0lBQ1osTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7Q0FDVixDQUFDLENBQUM7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUk3QyxDQUFDO0FBQ0YsTUFBTSxjQUFjLEdBQ2xCLHNFQUFzRSxDQUFDO0FBQ3pFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDakMscUJBQXFCO0lBQ3JCLGVBQWU7SUFDZixPQUFPO0lBQ1AsSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixlQUFlO0lBQ2YsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUNILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbEMsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsS0FBSztJQUNMLFNBQVM7SUFDVCxNQUFNO0NBQ1AsQ0FBQyxDQUFDO0FBRUgsU0FBUyxnQkFBZ0IsQ0FBQyxZQUFvQjtJQUM1QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7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QUFVLEdBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlICogYXMgRVNUcmVlIGZyb20gXCJlc3RyZWVcIjtcblxuaW1wb3J0IHR5cGUge1xuICBBYWFQaGFzZSxcbiAgTG9jYXRlZENvbW1lbnQsXG4gIExvY2F0ZWROb2RlLFxuICBTb3VyY2VDb21tZW50LFxuICBUZXN0QmxvY2tBbmFseXNpcyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgYWFhUGhhc2VPcmRlciA9IHtcbiAgQWN0OiAxLFxuICBBcnJhbmdlOiAwLFxuICBBc3NlcnQ6IDIsXG59IGFzIGNvbnN0IHNhdGlzZmllcyBSZWNvcmQ8QWFhUGhhc2UsIG51bWJlcj47XG5cbmNvbnN0IGFycmF5TXV0YXRpb25NZXRob2RzID0gbmV3IFNldChbXG4gIFwiY29weVdpdGhpblwiLFxuICBcImZpbGxcIixcbiAgXCJwb3BcIixcbiAgXCJwdXNoXCIsXG4gIFwicmV2ZXJzZVwiLFxuICBcInNoaWZ0XCIsXG4gIFwic29ydFwiLFxuICBcInNwbGljZVwiLFxuICBcInVuc2hpZnRcIixcbl0pO1xuY29uc3QgcGhhc2VOYW1lcyA9IFtcIkFycmFuZ2VcIiwgXCJBY3RcIiwgXCJBc3NlcnRcIl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IFtcbiAgQWFhUGhhc2UsXG4gIEFhYVBoYXNlLFxuICBBYWFQaGFzZSxcbl07XG5jb25zdCBzZXR1cExpa2VOYW1lcyA9XG4gIC9eKGFycmFuZ2V8YnVpbGR8Y3JlYXRlfGZpeHR1cmV8Z2l2ZW58bWFrZXxtb2NrfHNlZWR8c2V0dXB8c3B5fHN0dWIpL3U7XG5jb25zdCB1dGlsaXR5TWV0aG9kTmFtZXMgPSBuZXcgU2V0KFtcbiAgXCJhZHZhbmNlVGltZXJzQnlUaW1lXCIsXG4gIFwiY2xlYXJBbGxNb2Nrc1wiLFxuICBcImRlYnVnXCIsXG4gIFwiZm5cIixcbiAgXCJpbmZvXCIsXG4gIFwibG9nXCIsXG4gIFwibW9ja0ltcGxlbWVudGF0aW9uXCIsXG4gIFwibW9ja1JlamVjdGVkVmFsdWVcIixcbiAgXCJtb2NrUmVzb2x2ZWRWYWx1ZVwiLFxuICBcIm1vY2tSZXR1cm5WYWx1ZVwiLFxuICBcInJlc2V0QWxsTW9ja3NcIixcbiAgXCJ1c2VGYWtlVGltZXJzXCIsXG4gIFwid2FyblwiLFxuXSk7XG5jb25zdCB2b2lkTGlrZU1ldGhvZE5hbWVzID0gbmV3IFNldChbXG4gIFwiY2xlYXJcIixcbiAgXCJkZWJ1Z1wiLFxuICBcImRpc3BhdGNoXCIsXG4gIFwiZW1pdFwiLFxuICBcImluZm9cIixcbiAgXCJsb2dcIixcbiAgXCJwcmludFwiLFxuICBcInB1Ymxpc2hcIixcbiAgXCJyZXNldFwiLFxuICBcInNldFwiLFxuICBcInRyaWdnZXJcIixcbiAgXCJ3YXJuXCIsXG5dKTtcblxuZnVuY3Rpb24gZ2V0U2VjdGlvblBoYXNlcyhjb21tZW50VmFsdWU6IHN0cmluZyk6IEFhYVBoYXNlW10ge1xuICBjb25zdCB0cmltbWVkQ29tbWVudCA9IGNvbW1lbnRWYWx1ZS50cmltKCk7XG4gIGlmICh0cmltbWVkQ29tbWVudC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IHRyaW1tZWRDb21tZW50LnNwbGl0KC9cXHMqJlxccyovdSk7XG4gIHJldHVybiBwYXJ0cy5ldmVyeShpc0FhYVBoYXNlKSA/IHBhcnRzIDogW107XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVUZXN0QmxvY2soXG4gIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQsXG4gIG5vZGU6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbixcbik6IFRlc3RCbG9ja0FuYWx5c2lzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGVzdENhbGwgPSBnZXRTdXBwb3J0ZWRUZXN0Q2FsbChub2RlKTtcbiAgaWYgKHRlc3RDYWxsID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgY29uc3QgeyBjYWxsYmFjaywgY2FsbEV4cHJlc3Npb24gfSA9IHRlc3RDYWxsO1xuICBjb25zdCB7IHNvdXJjZUNvZGUgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHNlY3Rpb25Db21tZW50czogVGVzdEJsb2NrQW5hbHlzaXNbXCJzZWN0aW9uQ29tbWVudHNcIl0gPSBzb3VyY2VDb2RlXG4gICAgLmdldEFsbENvbW1lbnRzKClcbiAgICAuZmlsdGVyKFxuICAgICAgKGNvbW1lbnQpID0+XG4gICAgICAgIGlzTG9jYXRlZENvbW1lbnQoY29tbWVudCkgJiZcbiAgICAgICAgY29tbWVudC50eXBlID09PSBcIkxpbmVcIiAmJlxuICAgICAgICBpc1JhbmdlV2l0aGluKGNvbW1lbnQucmFuZ2UsIGNhbGxiYWNrLmJvZHkucmFuZ2UpICYmXG4gICAgICAgIGdldFNlY3Rpb25QaGFzZXMoY29tbWVudC52YWx1ZSkubGVuZ3RoID4gMCxcbiAgICApXG4gICAgLm1hcCgoY29tbWVudCkgPT4gKHtcbiAgICAgIGNvbW1lbnQ6IGNvbW1lbnQgYXMgTG9jYXRlZENvbW1lbnQsXG4gICAgICBwaGFzZXM6IGdldFNlY3Rpb25QaGFzZXMoY29tbWVudC52YWx1ZSksXG4gICAgfSkpO1xuICBjb25zdCBmbGF0dGVuZWRTZWN0aW9ucyA9IHNlY3Rpb25Db21tZW50cy5mbGF0TWFwKChzZWN0aW9uQ29tbWVudCkgPT5cbiAgICBzZWN0aW9uQ29tbWVudC5waGFzZXMubWFwKChwaGFzZSkgPT4gKHtcbiAgICAgIGxpbmU6IHNlY3Rpb25Db21tZW50LmNvbW1lbnQubG9jLnN0YXJ0LmxpbmUsXG4gICAgICBwaGFzZSxcbiAgICB9KSksXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBib2R5OiBjYWxsYmFjay5ib2R5LFxuICAgIGJvZHlMaW5lQ291bnQ6XG4gICAgICBjYWxsYmFjay5ib2R5LmxvYy5lbmQubGluZSAtIGNhbGxiYWNrLmJvZHkubG9jLnN0YXJ0LmxpbmUgLSAxLFxuICAgIGNhbGxFeHByZXNzaW9uLFxuICAgIG5ld2xpbmU6IGdldE5ld2xpbmUoc291cmNlQ29kZS50ZXh0KSxcbiAgICBzZWN0aW9uQ29tbWVudHMsXG4gICAgc291cmNlVGV4dDogc291cmNlQ29kZS50ZXh0LFxuICAgIHN0YXRlbWVudHM6IGNhbGxiYWNrLmJvZHkuYm9keS5tYXAoKHN0YXRlbWVudCkgPT4gKHtcbiAgICAgIG5vZGU6IHN0YXRlbWVudCBhcyBMb2NhdGVkTm9kZTxFU1RyZWUuU3RhdGVtZW50PixcbiAgICAgIHBoYXNlOiBnZXRTdGF0ZW1lbnRQaGFzZShzdGF0ZW1lbnQsIGZsYXR0ZW5lZFNlY3Rpb25zKSxcbiAgICB9KSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvdW50QWN0U3RhdGVtZW50cyhhbmFseXNpczogVGVzdEJsb2NrQW5hbHlzaXMpOiBudW1iZXIge1xuICByZXR1cm4gYW5hbHlzaXMuc3RhdGVtZW50cy5maWx0ZXIoXG4gICAgKHN0YXRlbWVudCkgPT5cbiAgICAgIHN0YXRlbWVudC5waGFzZSA9PT0gXCJBY3RcIiAmJlxuICAgICAgKHN0YXRlbWVudC5ub2RlLnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8XG4gICAgICAgIHN0YXRlbWVudC5ub2RlLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSxcbiAgKS5sZW5ndGg7XG59XG5cbmludGVyZmFjZSBBc3NlcnRpb25JZGVudGlmaWVycyB7XG4gIGFjdHVhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBleHBlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRBc3NlcnRpb25JZGVudGlmaWVycyhcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxuKTogQXNzZXJ0aW9uSWRlbnRpZmllcnMge1xuICBpZiAoc3RhdGVtZW50LnR5cGUgIT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XG4gICAgcmV0dXJuIHsgYWN0dWFsOiB2b2lkIDAsIGV4cGVjdGVkOiB2b2lkIDAgfTtcbiAgfVxuXG4gIGNvbnN0IGV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKTtcbiAgaWYgKGV4cHJlc3Npb24/LnR5cGUgIT09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgIHJldHVybiB7IGFjdHVhbDogdm9pZCAwLCBleHBlY3RlZDogdm9pZCAwIH07XG4gIH1cblxuICBjb25zdCBleHBlY3RPcGVyYW5kcyA9IGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24pO1xuICBpZiAoZXhwZWN0T3BlcmFuZHMgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3R1YWw6IGdldElkZW50aWZpZXJOYW1lKGV4cGVjdE9wZXJhbmRzLmFjdHVhbCksXG4gICAgICBleHBlY3RlZDogZ2V0SWRlbnRpZmllck5hbWUoZXhwZWN0T3BlcmFuZHMuZXhwZWN0ZWQpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBhc3NlcnRPcGVyYW5kcyA9IGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xuICByZXR1cm4ge1xuICAgIGFjdHVhbDogZ2V0SWRlbnRpZmllck5hbWUoYXNzZXJ0T3BlcmFuZHM/LmFjdHVhbCksXG4gICAgZXhwZWN0ZWQ6IGdldElkZW50aWZpZXJOYW1lKGFzc2VydE9wZXJhbmRzPy5leHBlY3RlZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEFzc2VydERlY2xhcmVkSWRlbnRpZmllcnMoXG4gIGFuYWx5c2lzOiBUZXN0QmxvY2tBbmFseXNpcyxcbik6IE1hcDxzdHJpbmcsIExvY2F0ZWROb2RlPEVTVHJlZS5JZGVudGlmaWVyPj4ge1xuICBjb25zdCBkZWNsYXJlZElkZW50aWZpZXJzID0gbmV3IE1hcDxzdHJpbmcsIExvY2F0ZWROb2RlPEVTVHJlZS5JZGVudGlmaWVyPj4oKTtcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBhbmFseXNpcy5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKFxuICAgICAgc3RhdGVtZW50LnBoYXNlICE9PSBcIkFzc2VydFwiIHx8XG4gICAgICBzdGF0ZW1lbnQubm9kZS50eXBlICE9PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIlxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBzdGF0ZW1lbnQubm9kZS5kZWNsYXJhdGlvbnMpIHtcbiAgICAgIGlmIChkZWNsYXJhdGlvbi5pZC50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICBkZWNsYXJlZElkZW50aWZpZXJzLnNldChcbiAgICAgICAgICBkZWNsYXJhdGlvbi5pZC5uYW1lLFxuICAgICAgICAgIGRlY2xhcmF0aW9uLmlkIGFzIExvY2F0ZWROb2RlPEVTVHJlZS5JZGVudGlmaWVyPixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVjbGFyZWRJZGVudGlmaWVycztcbn1cblxuZnVuY3Rpb24gZ2V0RmxhdHRlbmVkU2VjdGlvbnMoXG4gIGFuYWx5c2lzOiBQaWNrPFRlc3RCbG9ja0FuYWx5c2lzLCBcInNlY3Rpb25Db21tZW50c1wiPixcbik6IEFycmF5PHsgY29tbWVudDogU291cmNlQ29tbWVudDsgcGhhc2U6IEFhYVBoYXNlIH0+IHtcbiAgcmV0dXJuIGFuYWx5c2lzLnNlY3Rpb25Db21tZW50cy5mbGF0TWFwKChzZWN0aW9uQ29tbWVudCkgPT5cbiAgICBzZWN0aW9uQ29tbWVudC5waGFzZXMubWFwKChwaGFzZSkgPT4gKHtcbiAgICAgIGNvbW1lbnQ6IHNlY3Rpb25Db21tZW50LmNvbW1lbnQsXG4gICAgICBwaGFzZSxcbiAgICB9KSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFBoYXNlQm91bmRhcnlDb21tZW50cyhcbiAgYW5hbHlzaXM6IFBpY2s8VGVzdEJsb2NrQW5hbHlzaXMsIFwic2VjdGlvbkNvbW1lbnRzXCI+LFxuKSB7XG4gIHJldHVybiBhbmFseXNpcy5zZWN0aW9uQ29tbWVudHMuZmlsdGVyKChzZWN0aW9uQ29tbWVudCkgPT5cbiAgICBzZWN0aW9uQ29tbWVudC5waGFzZXMuc29tZShcbiAgICAgIChwaGFzZSkgPT4gcGhhc2UgPT09IFwiQWN0XCIgfHwgcGhhc2UgPT09IFwiQXNzZXJ0XCIsXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzQXNzZXJ0aW9uKHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICBsZXQgZm91bmRBc3NlcnRpb24gPSBmYWxzZTtcblxuICB2aXNpdE5vZGUoc3RhdGVtZW50LCAobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBpc0Fzc2VydGlvbkNhbGwobm9kZSkpIHtcbiAgICAgIGZvdW5kQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmb3VuZEFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gaGFzQXN5bmNMb2dpYyhzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgbGV0IGZvdW5kQXN5bmNMb2dpYyA9IGZhbHNlO1xuXG4gIHZpc2l0Tm9kZShzdGF0ZW1lbnQsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJBd2FpdEV4cHJlc3Npb25cIikge1xuICAgICAgZm91bmRBc3luY0xvZ2ljID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBub2RlLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJlxuICAgICAgbm9kZS5jYWxsZWUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiZcbiAgICAgIG5vZGUuY2FsbGVlLnByb3BlcnR5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICBbXCJjYXRjaFwiLCBcImZpbmFsbHlcIiwgXCJ0aGVuXCJdLmluY2x1ZGVzKG5vZGUuY2FsbGVlLnByb3BlcnR5Lm5hbWUpXG4gICAgKSB7XG4gICAgICBmb3VuZEFzeW5jTG9naWMgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG5vZGUudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgJiZcbiAgICAgIGdldEV4cHJlc3Npb25OYW1lKG5vZGUuY2FsbGVlKSA9PT0gXCJQcm9taXNlXCJcbiAgICApIHtcbiAgICAgIGZvdW5kQXN5bmNMb2dpYyA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZm91bmRBc3luY0xvZ2ljO1xufVxuXG5mdW5jdGlvbiBoYXNBd2FpdChzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgbGV0IGZvdW5kQXdhaXQgPSBmYWxzZTtcblxuICB2aXNpdE5vZGUoc3RhdGVtZW50LCAobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09IFwiQXdhaXRFeHByZXNzaW9uXCIpIHtcbiAgICAgIGZvdW5kQXdhaXQgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZvdW5kQXdhaXQ7XG59XG5cbmZ1bmN0aW9uIGhhc0JsYW5rTGluZUJlZm9yZUNvbW1lbnQoXG4gIHNvdXJjZVRleHQ6IHN0cmluZyxcbiAgY29tbWVudDogU291cmNlQ29tbWVudCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWlzTG9jYXRlZENvbW1lbnQoY29tbWVudCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzID0gc291cmNlVGV4dC5zcGxpdCgvXFxyXFxufFxcbi91KTtcbiAgY29uc3QgcHJldmlvdXNMaW5lID0gbGluZXNbY29tbWVudC5sb2Muc3RhcnQubGluZSAtIDJdO1xuICByZXR1cm4gcHJldmlvdXNMaW5lID09PSB2b2lkIDAgfHwgcHJldmlvdXNMaW5lLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG5cbmZ1bmN0aW9uIGhhc0NhcHR1cmFibGVBY3RSZXN1bHQoc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50KTogYm9vbGVhbiB7XG4gIGlmIChzdGF0ZW1lbnQudHlwZSAhPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBleHByZXNzaW9uID0gdW53cmFwRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbik7XG4gIGlmICghaXNBY3Rpb25FeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8IGlzVXRpbGl0eUxpa2VFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY2FsbGVlTmFtZSA9IGdldEludm9rZWROYW1lKGV4cHJlc3Npb24pO1xuICByZXR1cm4gKFxuICAgIGNhbGxlZU5hbWUgPT09IHZvaWQgMCB8fFxuICAgICghdm9pZExpa2VNZXRob2ROYW1lcy5oYXMoY2FsbGVlTmFtZSkgJiZcbiAgICAgICEvXihjbGVhcnxkZWJ1Z3xkaXNwYXRjaHxlbWl0fGluZm98bG9nfHByaW50fHB1Ymxpc2h8cmVzZXR8c2V0fHRyaWdnZXJ8d2FybikvdS50ZXN0KFxuICAgICAgICBjYWxsZWVOYW1lLFxuICAgICAgKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzTXV0YXRpb24oc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50KTogYm9vbGVhbiB7XG4gIGxldCBmb3VuZE11dGF0aW9uID0gZmFsc2U7XG5cbiAgdmlzaXROb2RlKHN0YXRlbWVudCwgKG5vZGUpID0+IHtcbiAgICBpZiAoXG4gICAgICBub2RlLnR5cGUgPT09IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiB8fFxuICAgICAgbm9kZS50eXBlID09PSBcIlVwZGF0ZUV4cHJlc3Npb25cIiB8fFxuICAgICAgbm9kZS50eXBlID09PSBcIlVuYXJ5RXhwcmVzc2lvblwiXG4gICAgKSB7XG4gICAgICBpZiAobm9kZS50eXBlICE9PSBcIlVuYXJ5RXhwcmVzc2lvblwiIHx8IG5vZGUub3BlcmF0b3IgPT09IFwiZGVsZXRlXCIpIHtcbiAgICAgICAgZm91bmRNdXRhdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgbm9kZS50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgJiZcbiAgICAgIG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXG4gICAgICBub2RlLmNhbGxlZS5wcm9wZXJ0eS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgYXJyYXlNdXRhdGlvbk1ldGhvZHMuaGFzKG5vZGUuY2FsbGVlLnByb3BlcnR5Lm5hbWUpXG4gICAgKSB7XG4gICAgICBmb3VuZE11dGF0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmb3VuZE11dGF0aW9uO1xufVxuXG5mdW5jdGlvbiBpc01lYW5pbmdmdWxBY3RTdGF0ZW1lbnQoc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4cHJlc3Npb24gPSBnZXRTdGF0ZW1lbnRFeHByZXNzaW9uKHN0YXRlbWVudCk7XG4gIGlmIChleHByZXNzaW9uID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGlzQWN0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKSAmJlxuICAgICFpc1V0aWxpdHlMaWtlRXhwcmVzc2lvbihleHByZXNzaW9uKSAmJlxuICAgICFoYXNBc3NlcnRpb24oc3RhdGVtZW50KVxuICApO1xufVxuXG5mdW5jdGlvbiBpc1NldHVwTGlrZVN0YXRlbWVudChzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgaWYgKHN0YXRlbWVudC50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIikge1xuICAgIHJldHVybiBzdGF0ZW1lbnQuZGVjbGFyYXRpb25zLmV2ZXJ5KChkZWNsYXJhdGlvbikgPT4ge1xuICAgICAgaWYgKGRlY2xhcmF0aW9uLmluaXQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluaXQgPSB1bndyYXBFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXQpO1xuICAgICAgcmV0dXJuICFpc0FjdGlvbkV4cHJlc3Npb24oaW5pdCkgfHwgaXNVdGlsaXR5TGlrZUV4cHJlc3Npb24oaW5pdCk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBleHByZXNzaW9uID0gZ2V0U3RhdGVtZW50RXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xuICByZXR1cm4gZXhwcmVzc2lvbiAhPT0gdm9pZCAwICYmIGlzVXRpbGl0eUxpa2VFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkQXNzZXJ0U3RhdGVtZW50KHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICBpZiAoaGFzQXNzZXJ0aW9uKHN0YXRlbWVudCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzdGF0ZW1lbnQudHlwZSAhPT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50LmRlY2xhcmF0aW9ucy5ldmVyeSgoZGVjbGFyYXRpb24pID0+IHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdGhlIHBhcnNlciB1c2VkIGluIHRoaXMgcmVwbyBlbWl0cyB1bmRlZmluZWQgcmF0aGVyIHRoYW4gbnVsbCBmb3IgdW5pbml0aWFsaXplZCBkZWNsYXJhdG9ycy4gKi9cbiAgICBpZiAoZGVjbGFyYXRpb24uaW5pdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgICBjb25zdCBpbml0ID0gdW53cmFwRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0KTtcbiAgICByZXR1cm4gIWlzQWN0aW9uRXhwcmVzc2lvbihpbml0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZXNQcmVmaXgobmFtZTogc3RyaW5nLCBwcmVmaXg6IFwiYWN0dWFsXCIgfCBcImV4cGVjdGVkXCIpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5hbWUgPT09IHByZWZpeCB8fCBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIHZhbGlkIGFuYWx5emVyIGNhbGxlcnMgYWx3YXlzIHJlcXVlc3QgYW4gZXhpc3Rpbmcgc3RhdGVtZW50IGxpbmUuICovXG5mdW5jdGlvbiBnZXRMaW5lU3RhcnRSYW5nZShzb3VyY2VUZXh0OiBzdHJpbmcsIGxpbmU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBsZXQgY3VycmVudExpbmUgPSAxO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2VUZXh0Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGlmIChjdXJyZW50TGluZSA9PT0gbGluZSkge1xuICAgICAgcmV0dXJuIFtpbmRleCwgaW5kZXhdO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VUZXh0W2luZGV4XSA9PT0gXCJcXG5cIikge1xuICAgICAgY3VycmVudExpbmUgKz0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtzb3VyY2VUZXh0Lmxlbmd0aCwgc291cmNlVGV4dC5sZW5ndGhdO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIHRoZSBpbmRlbnRhdGlvbiByZWdleCBhbHdheXMgbWF0Y2hlcywgYnV0IHRoZSBmYWxsYmFjayBrZWVwcyB0aGUgaGVscGVyIHRvdGFsLXNhZmUuICovXG5mdW5jdGlvbiBnZXRJbmRlbnRhdGlvbkF0T2Zmc2V0KHNvdXJjZVRleHQ6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lU3RhcnQgPSBzb3VyY2VUZXh0Lmxhc3RJbmRleE9mKFwiXFxuXCIsIE1hdGgubWF4KDAsIG9mZnNldCAtIDEpKSArIDE7XG4gIGNvbnN0IGxpbmVQcmVmaXggPSBzb3VyY2VUZXh0LnNsaWNlKGxpbmVTdGFydCwgb2Zmc2V0KTtcbiAgY29uc3QgaW5kZW50YXRpb24gPSAvXlxccyovdS5leGVjKGxpbmVQcmVmaXgpO1xuICByZXR1cm4gaW5kZW50YXRpb24/LlswXSA/PyBcIlwiO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuZnVuY3Rpb24gZ2V0QXNzZXJ0T3BlcmFuZHMoZXhwcmVzc2lvbjogRVNUcmVlLkNhbGxFeHByZXNzaW9uKTpcbiAgfCB7XG4gICAgICBhY3R1YWw6IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICAgICAgZXhwZWN0ZWQ6IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgZXhwcmVzc2lvbi5jYWxsZWUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiZcbiAgICBleHByZXNzaW9uLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICBleHByZXNzaW9uLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gXCJhc3NlcnRcIlxuICApIHtcbiAgICBjb25zdCBbYWN0dWFsLCBleHBlY3RlZF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICBpZiAoXG4gICAgICBhY3R1YWw/LnR5cGUgIT09IFwiU3ByZWFkRWxlbWVudFwiICYmXG4gICAgICBleHBlY3RlZD8udHlwZSAhPT0gXCJTcHJlYWRFbGVtZW50XCJcbiAgICApIHtcbiAgICAgIHJldHVybiB7IGFjdHVhbCwgZXhwZWN0ZWQgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdm9pZCAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBlY3RPcGVyYW5kcyhleHByZXNzaW9uOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb24pOlxuICB8IHtcbiAgICAgIGFjdHVhbDogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgICBleHBlY3RlZDogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgfVxuICB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICBleHByZXNzaW9uLmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgIGV4cHJlc3Npb24uY2FsbGVlLm5hbWUgPT09IFwiZXhwZWN0XCJcbiAgKSB7XG4gICAgY29uc3QgW2FjdHVhbF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICByZXR1cm4gYWN0dWFsPy50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIlxuICAgICAgPyB7IGFjdHVhbDogdm9pZCAwLCBleHBlY3RlZDogdm9pZCAwIH1cbiAgICAgIDogeyBhY3R1YWwsIGV4cGVjdGVkOiB2b2lkIDAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBleHByZXNzaW9uLmNhbGxlZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiAmJlxuICAgIGV4cHJlc3Npb24uY2FsbGVlLm9iamVjdC50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCJcbiAgKSB7XG4gICAgY29uc3QgbmVzdGVkT3BlcmFuZHMgPSBnZXRFeHBlY3RPcGVyYW5kcyhleHByZXNzaW9uLmNhbGxlZS5vYmplY3QpO1xuICAgIGlmIChuZXN0ZWRPcGVyYW5kcyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIGNvbnN0IFtleHBlY3RlZF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICByZXR1cm4gZXhwZWN0ZWQ/LnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiXG4gICAgICA/IG5lc3RlZE9wZXJhbmRzXG4gICAgICA6IHsgYWN0dWFsOiBuZXN0ZWRPcGVyYW5kcy5hY3R1YWwsIGV4cGVjdGVkIH07XG4gIH1cblxuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gdGhlIGZhbGxiYWNrIGJyYW5jaGVzIGFyZSByZXRhaW5lZCBmb3IgaGVscGVyIHRvdGFsaXR5IGJ1dCBhcmUgbm90IHJlYWNoYWJsZSBmcm9tIGN1cnJlbnQgYW5hbHl6ZXIgZW50cnkgcG9pbnRzLiAqL1xuZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbk5hbWUoXG4gIGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgRVNUcmVlLlByaXZhdGVJZGVudGlmaWVyIHwgRVNUcmVlLlN1cGVyLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4cHJlc3Npb24udHlwZSA9PT0gXCJTdXBlclwiKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24ubmFtZTtcbiAgfVxuXG4gIGlmIChcbiAgICBleHByZXNzaW9uLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXG4gICAgZXhwcmVzc2lvbi5wcm9wZXJ0eS50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICApIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbi5wcm9wZXJ0eS5uYW1lO1xuICB9XG5cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmZ1bmN0aW9uIGdldElkZW50aWZpZXJOYW1lKFxuICBleHByZXNzaW9uOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBleHByZXNzaW9uPy50eXBlID09PSBcIklkZW50aWZpZXJcIiA/IGV4cHJlc3Npb24ubmFtZSA6IHZvaWQgMDtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIGNhbGxlcnMgb25seSBhc2sgZm9yIGludm9rZWQgbmFtZXMgYWZ0ZXIgYWN0aW9uLWV4cHJlc3Npb24gY2hlY2tzIHRoYXQgbmFycm93IHRvIGNhbGwvbmV3IGV4cHJlc3Npb25zLiAqL1xuZnVuY3Rpb24gZ2V0SW52b2tlZE5hbWUoXG4gIGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdW53cmFwcGVkRXhwcmVzc2lvbiA9IHVud3JhcEV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gIGlmIChcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHxcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIk5ld0V4cHJlc3Npb25cIlxuICApIHtcbiAgICByZXR1cm4gZ2V0RXhwcmVzc2lvbk5hbWUodW53cmFwcGVkRXhwcmVzc2lvbi5jYWxsZWUpO1xuICB9XG4gIHJldHVybiB2b2lkIDA7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG5mdW5jdGlvbiBnZXROZXdsaW5lKHRleHQ6IHN0cmluZyk6IFwiXFxuXCIgfCBcIlxcclxcblwiIHtcbiAgcmV0dXJuIHRleHQuaW5jbHVkZXMoXCJcXHJcXG5cIikgPyBcIlxcclxcblwiIDogXCJcXG5cIjtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVtZW50RXhwcmVzc2lvbihcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxuKTogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XG4gICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uO1xuICB9XG5cbiAgaWYgKFxuICAgIHN0YXRlbWVudC50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiAmJlxuICAgIHN0YXRlbWVudC5kZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxXG4gICkge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSB2YWxpZCBFU1RyZWUgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFsd2F5cyBjYXJyeSB0aGUgbWF0Y2hlZCBkZWNsYXJhdG9yLiAqL1xuICAgIHJldHVybiBzdGF0ZW1lbnQuZGVjbGFyYXRpb25zWzBdPy5pbml0ID8/IHZvaWQgMDtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgcmV0dXJuIHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVtZW50UGhhc2UoXG4gIHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCxcbiAgZmxhdHRlbmVkU2VjdGlvbnM6IEFycmF5PHsgbGluZTogbnVtYmVyOyBwaGFzZTogQWFhUGhhc2UgfT4sXG4pOiBBYWFQaGFzZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0YXRlbWVudExpbmUgPSBzdGF0ZW1lbnQubG9jPy5zdGFydC5saW5lO1xuICBpZiAoc3RhdGVtZW50TGluZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGxldCBjdXJyZW50UGhhc2U6IEFhYVBoYXNlIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZmxhdHRlbmVkU2VjdGlvbnMpIHtcbiAgICBpZiAoc2VjdGlvbi5saW5lID4gc3RhdGVtZW50TGluZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY3VycmVudFBoYXNlID0gc2VjdGlvbi5waGFzZTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50UGhhc2U7XG59XG5cbmZ1bmN0aW9uIGdldFN1cHBvcnRlZFRlc3RDYWxsKG5vZGU6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbik6XG4gIHwge1xuICAgICAgY2FsbGJhY2s6IExvY2F0ZWROb2RlPFxuICAgICAgICBFU1RyZWUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gfCBFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uXG4gICAgICA+ICYge1xuICAgICAgICBib2R5OiBMb2NhdGVkTm9kZTxFU1RyZWUuQmxvY2tTdGF0ZW1lbnQ+O1xuICAgICAgfTtcbiAgICAgIGNhbGxFeHByZXNzaW9uOiBMb2NhdGVkTm9kZTxFU1RyZWUuQ2FsbEV4cHJlc3Npb24+O1xuICAgIH1cbiAgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290TmFtZSA9IGdldFRlc3RSb290TmFtZShub2RlLmNhbGxlZSk7XG4gIGlmIChyb290TmFtZSAhPT0gXCJpdFwiICYmIHJvb3ROYW1lICE9PSBcInRlc3RcIikge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBjb25zdCBjYWxsYmFja0FyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHMuYXQoLTEpO1xuICBpZiAoXG4gICAgY2FsbGJhY2tBcmd1bWVudCA9PT0gdm9pZCAwIHx8XG4gICAgY2FsbGJhY2tBcmd1bWVudC50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIiB8fFxuICAgIChjYWxsYmFja0FyZ3VtZW50LnR5cGUgIT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJlxuICAgICAgY2FsbGJhY2tBcmd1bWVudC50eXBlICE9PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKSB8fFxuICAgIGNhbGxiYWNrQXJndW1lbnQuYm9keS50eXBlICE9PSBcIkJsb2NrU3RhdGVtZW50XCJcbiAgKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2FsbGJhY2s6IGNhbGxiYWNrQXJndW1lbnQgYXMgTG9jYXRlZE5vZGU8XG4gICAgICBFU1RyZWUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gfCBFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uXG4gICAgPiAmIHsgYm9keTogTG9jYXRlZE5vZGU8RVNUcmVlLkJsb2NrU3RhdGVtZW50PiB9LFxuICAgIGNhbGxFeHByZXNzaW9uOiBub2RlIGFzIExvY2F0ZWROb2RlPEVTVHJlZS5DYWxsRXhwcmVzc2lvbj4sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFRlc3RSb290TmFtZShcbiAgY2FsbGVlOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb25bXCJjYWxsZWVcIl0sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIGNhbGxlZS5uYW1lO1xuICB9XG5cbiAgaWYgKGNhbGxlZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiAmJiBjYWxsZWUub2JqZWN0LnR5cGUgIT09IFwiU3VwZXJcIikge1xuICAgIHJldHVybiBnZXRUZXN0Um9vdE5hbWUoY2FsbGVlLm9iamVjdCBhcyBFU1RyZWUuRXhwcmVzc2lvbik7XG4gIH1cblxuICByZXR1cm4gdm9pZCAwO1xufVxuXG5mdW5jdGlvbiBpc0FjdGlvbkV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICByZXR1cm4gKFxuICAgIHVud3JhcHBlZEV4cHJlc3Npb24/LnR5cGUgPT09IFwiQXdhaXRFeHByZXNzaW9uXCIgfHxcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHxcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIk5ld0V4cHJlc3Npb25cIlxuICApO1xufVxuXG5mdW5jdGlvbiBpc0FhYVBoYXNlKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBBYWFQaGFzZSB7XG4gIHJldHVybiBwaGFzZU5hbWVzLmluY2x1ZGVzKHZhbHVlIGFzIEFhYVBoYXNlKTtcbn1cblxuZnVuY3Rpb24gaXNBc3NlcnRpb25DYWxsKG5vZGU6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS5jYWxsZWUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICByZXR1cm4gbm9kZS5jYWxsZWUubmFtZSA9PT0gXCJleHBlY3RcIiB8fCBub2RlLmNhbGxlZS5uYW1lID09PSBcImFzc2VydFwiO1xuICB9XG5cbiAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgIT09IFwiTWVtYmVyRXhwcmVzc2lvblwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgIG5vZGUuY2FsbGVlLm9iamVjdC50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgIG5vZGUuY2FsbGVlLm9iamVjdC5uYW1lID09PSBcImFzc2VydFwiXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKG5vZGUuY2FsbGVlLm9iamVjdC50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICByZXR1cm4gaXNBc3NlcnRpb25DYWxsKG5vZGUuY2FsbGVlLm9iamVjdCk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzUmFuZ2VXaXRoaW4oXG4gIHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdLFxuICBjb250YWluZXI6IFtudW1iZXIsIG51bWJlcl0sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHJhbmdlWzBdID49IGNvbnRhaW5lclswXSAmJiByYW5nZVsxXSA8PSBjb250YWluZXJbMV07XG59XG5cbmZ1bmN0aW9uIGlzVXRpbGl0eUxpa2VFeHByZXNzaW9uKFxuICBleHByZXNzaW9uOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBjb25zdCB1bndyYXBwZWRFeHByZXNzaW9uID0gdW53cmFwRXhwcmVzc2lvbihleHByZXNzaW9uKTtcbiAgaWYgKFxuICAgIHVud3JhcHBlZEV4cHJlc3Npb24/LnR5cGUgIT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJlxuICAgIHVud3JhcHBlZEV4cHJlc3Npb24/LnR5cGUgIT09IFwiTmV3RXhwcmVzc2lvblwiXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNhbGxlZU5hbWUgPSBnZXRFeHByZXNzaW9uTmFtZSh1bndyYXBwZWRFeHByZXNzaW9uLmNhbGxlZSk7XG4gIGlmIChjYWxsZWVOYW1lID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodXRpbGl0eU1ldGhvZE5hbWVzLmhhcyhjYWxsZWVOYW1lKSB8fCBzZXR1cExpa2VOYW1lcy50ZXN0KGNhbGxlZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHVud3JhcHBlZEV4cHJlc3Npb24uY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXG4gICAgdW53cmFwcGVkRXhwcmVzc2lvbi5jYWxsZWUub2JqZWN0LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgW1wiY29uc29sZVwiLCBcInZpXCJdLmluY2x1ZGVzKHVud3JhcHBlZEV4cHJlc3Npb24uY2FsbGVlLm9iamVjdC5uYW1lKVxuICApO1xufVxuXG5mdW5jdGlvbiB1bndyYXBFeHByZXNzaW9uKFxuICBleHByZXNzaW9uOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCxcbik6IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQ2hhaW5FeHByZXNzaW9uXCIpIHtcbiAgICByZXR1cm4gdW53cmFwRXhwcmVzc2lvbihleHByZXNzaW9uLmV4cHJlc3Npb24pO1xuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQXdhaXRFeHByZXNzaW9uXCIpIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbi5hcmd1bWVudDtcbiAgfVxuXG4gIHJldHVybiBleHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiB2aXNpdE5vZGUoXG4gIG5vZGU6IEVTVHJlZS5Ob2RlLFxuICBjYWxsYmFjazogKG5vZGU6IEVTVHJlZS5Ob2RlKSA9PiB2b2lkLFxuICBzZWVuTm9kZXMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCksXG4pOiB2b2lkIHtcbiAgaWYgKHNlZW5Ob2Rlcy5oYXMobm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzZWVuTm9kZXMuYWRkKG5vZGUpO1xuICBjYWxsYmFjayhub2RlKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGlmIChrZXkgPT09IFwicGFyZW50XCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc05vZGUoaXRlbSkpIHtcbiAgICAgICAgICB2aXNpdE5vZGUoaXRlbSwgY2FsbGJhY2ssIHNlZW5Ob2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc05vZGUodmFsdWUpKSB7XG4gICAgICB2aXNpdE5vZGUodmFsdWUsIGNhbGxiYWNrLCBzZWVuTm9kZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vZGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFU1RyZWUuTm9kZSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcInR5cGVcIiBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlID09PSBcInN0cmluZ1wiXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYXRlZENvbW1lbnQoY29tbWVudDogU291cmNlQ29tbWVudCk6IGNvbW1lbnQgaXMgTG9jYXRlZENvbW1lbnQge1xuICByZXR1cm4gKFxuICAgIGNvbW1lbnQubG9jICE9PSBudWxsICYmXG4gICAgY29tbWVudC5sb2MgIT09IHVuZGVmaW5lZCAmJlxuICAgIGNvbW1lbnQucmFuZ2UgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQge1xuICBhYWFQaGFzZU9yZGVyLFxuICBhbmFseXplVGVzdEJsb2NrLFxuICBjb3VudEFjdFN0YXRlbWVudHMsXG4gIGdldEFzc2VydERlY2xhcmVkSWRlbnRpZmllcnMsXG4gIGdldEFzc2VydGlvbklkZW50aWZpZXJzLFxuICBnZXRGbGF0dGVuZWRTZWN0aW9ucyxcbiAgZ2V0SW5kZW50YXRpb25BdE9mZnNldCxcbiAgZ2V0TGluZVN0YXJ0UmFuZ2UsXG4gIGdldFBoYXNlQm91bmRhcnlDb21tZW50cyxcbiAgZ2V0U2VjdGlvblBoYXNlcyxcbiAgaGFzQXNzZXJ0aW9uLFxuICBoYXNBc3luY0xvZ2ljLFxuICBoYXNBd2FpdCxcbiAgaGFzQmxhbmtMaW5lQmVmb3JlQ29tbWVudCxcbiAgaGFzQ2FwdHVyYWJsZUFjdFJlc3VsdCxcbiAgaGFzTXV0YXRpb24sXG4gIGlzTWVhbmluZ2Z1bEFjdFN0YXRlbWVudCxcbiAgaXNTZXR1cExpa2VTdGF0ZW1lbnQsXG4gIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQsXG4gIHVzZXNQcmVmaXgsXG59O1xuIl19
@@ -0,0 +1,3 @@
1
+ export { aaaPhaseOrder, analyzeTestBlock, countActStatements, getAssertDeclaredIdentifiers, getAssertionIdentifiers, getFlattenedSections, getIndentationAtOffset, getLineStartRange, getPhaseBoundaryComments, getSectionPhases, hasAssertion, hasAsyncLogic, hasAwait, hasBlankLineBeforeComment, hasCapturableActResult, hasMutation, isMeaningfulActStatement, isSetupLikeStatement, isValidAssertStatement, usesPrefix, } from "./analyzer";
2
+ export type { AaaPhase, LocatedComment, LocatedNode, SectionComment, SourceComment, StatementPhase, TestBlockAnalysis, } from "./types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/aaa/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,yBAAyB,EACzB,sBAAsB,EACtB,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { aaaPhaseOrder, analyzeTestBlock, countActStatements, getAssertDeclaredIdentifiers, getAssertionIdentifiers, getFlattenedSections, getIndentationAtOffset, getLineStartRange, getPhaseBoundaryComments, getSectionPhases, hasAssertion, hasAsyncLogic, hasAwait, hasBlankLineBeforeComment, hasCapturableActResult, hasMutation, isMeaningfulActStatement, isSetupLikeStatement, isValidAssertStatement, usesPrefix, } from "./analyzer";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9hYWEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUNiLFFBQVEsRUFDUix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUN0QixVQUFVLEdBQ1gsTUFBTSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBhYWFQaGFzZU9yZGVyLFxuICBhbmFseXplVGVzdEJsb2NrLFxuICBjb3VudEFjdFN0YXRlbWVudHMsXG4gIGdldEFzc2VydERlY2xhcmVkSWRlbnRpZmllcnMsXG4gIGdldEFzc2VydGlvbklkZW50aWZpZXJzLFxuICBnZXRGbGF0dGVuZWRTZWN0aW9ucyxcbiAgZ2V0SW5kZW50YXRpb25BdE9mZnNldCxcbiAgZ2V0TGluZVN0YXJ0UmFuZ2UsXG4gIGdldFBoYXNlQm91bmRhcnlDb21tZW50cyxcbiAgZ2V0U2VjdGlvblBoYXNlcyxcbiAgaGFzQXNzZXJ0aW9uLFxuICBoYXNBc3luY0xvZ2ljLFxuICBoYXNBd2FpdCxcbiAgaGFzQmxhbmtMaW5lQmVmb3JlQ29tbWVudCxcbiAgaGFzQ2FwdHVyYWJsZUFjdFJlc3VsdCxcbiAgaGFzTXV0YXRpb24sXG4gIGlzTWVhbmluZ2Z1bEFjdFN0YXRlbWVudCxcbiAgaXNTZXR1cExpa2VTdGF0ZW1lbnQsXG4gIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQsXG4gIHVzZXNQcmVmaXgsXG59IGZyb20gXCIuL2FuYWx5emVyXCI7XG5leHBvcnQgdHlwZSB7XG4gIEFhYVBoYXNlLFxuICBMb2NhdGVkQ29tbWVudCxcbiAgTG9jYXRlZE5vZGUsXG4gIFNlY3Rpb25Db21tZW50LFxuICBTb3VyY2VDb21tZW50LFxuICBTdGF0ZW1lbnRQaGFzZSxcbiAgVGVzdEJsb2NrQW5hbHlzaXMsXG59IGZyb20gXCIuL3R5cGVzXCI7XG4iXX0=
@@ -0,0 +1,31 @@
1
+ import type { Rule } from "eslint";
2
+ import type * as ESTree from "estree";
3
+ type AaaPhase = "Arrange" | "Act" | "Assert";
4
+ type SourceComment = ReturnType<Rule.RuleContext["sourceCode"]["getAllComments"]>[number];
5
+ type LocatedComment = SourceComment & {
6
+ loc: NonNullable<SourceComment["loc"]>;
7
+ range: [number, number];
8
+ };
9
+ type LocatedNode<TNode extends ESTree.Node = ESTree.Node> = TNode & {
10
+ loc: NonNullable<ESTree.Node["loc"]>;
11
+ range: [number, number];
12
+ };
13
+ interface SectionComment {
14
+ comment: LocatedComment;
15
+ phases: AaaPhase[];
16
+ }
17
+ interface StatementPhase {
18
+ node: LocatedNode<ESTree.Statement>;
19
+ phase: AaaPhase | undefined;
20
+ }
21
+ interface TestBlockAnalysis {
22
+ body: LocatedNode<ESTree.BlockStatement>;
23
+ bodyLineCount: number;
24
+ callExpression: LocatedNode<ESTree.CallExpression>;
25
+ newline: "\n" | "\r\n";
26
+ sectionComments: SectionComment[];
27
+ sourceText: string;
28
+ statements: StatementPhase[];
29
+ }
30
+ export type { AaaPhase, LocatedComment, LocatedNode, SectionComment, SourceComment, StatementPhase, TestBlockAnalysis, };
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/testing/aaa/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,KAAK,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE7C,KAAK,aAAa,GAAG,UAAU,CAC7B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,gBAAgB,CAAC,CACjD,CAAC,MAAM,CAAC,CAAC;AAEV,KAAK,cAAc,GAAG,aAAa,GAAG;IACpC,GAAG,EAAE,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzB,CAAC;AAEF,KAAK,WAAW,CAAC,KAAK,SAAS,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,GAAG;IAClE,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzB,CAAC;AAEF,UAAU,cAAc;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7B;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IACvB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,YAAY,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9hYWEvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlICogYXMgRVNUcmVlIGZyb20gXCJlc3RyZWVcIjtcblxudHlwZSBBYWFQaGFzZSA9IFwiQXJyYW5nZVwiIHwgXCJBY3RcIiB8IFwiQXNzZXJ0XCI7XG5cbnR5cGUgU291cmNlQ29tbWVudCA9IFJldHVyblR5cGU8XG4gIFJ1bGUuUnVsZUNvbnRleHRbXCJzb3VyY2VDb2RlXCJdW1wiZ2V0QWxsQ29tbWVudHNcIl1cbj5bbnVtYmVyXTtcblxudHlwZSBMb2NhdGVkQ29tbWVudCA9IFNvdXJjZUNvbW1lbnQgJiB7XG4gIGxvYzogTm9uTnVsbGFibGU8U291cmNlQ29tbWVudFtcImxvY1wiXT47XG4gIHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xufTtcblxudHlwZSBMb2NhdGVkTm9kZTxUTm9kZSBleHRlbmRzIEVTVHJlZS5Ob2RlID0gRVNUcmVlLk5vZGU+ID0gVE5vZGUgJiB7XG4gIGxvYzogTm9uTnVsbGFibGU8RVNUcmVlLk5vZGVbXCJsb2NcIl0+O1xuICByYW5nZTogW251bWJlciwgbnVtYmVyXTtcbn07XG5cbmludGVyZmFjZSBTZWN0aW9uQ29tbWVudCB7XG4gIGNvbW1lbnQ6IExvY2F0ZWRDb21tZW50O1xuICBwaGFzZXM6IEFhYVBoYXNlW107XG59XG5cbmludGVyZmFjZSBTdGF0ZW1lbnRQaGFzZSB7XG4gIG5vZGU6IExvY2F0ZWROb2RlPEVTVHJlZS5TdGF0ZW1lbnQ+O1xuICBwaGFzZTogQWFhUGhhc2UgfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBUZXN0QmxvY2tBbmFseXNpcyB7XG4gIGJvZHk6IExvY2F0ZWROb2RlPEVTVHJlZS5CbG9ja1N0YXRlbWVudD47XG4gIGJvZHlMaW5lQ291bnQ6IG51bWJlcjtcbiAgY2FsbEV4cHJlc3Npb246IExvY2F0ZWROb2RlPEVTVHJlZS5DYWxsRXhwcmVzc2lvbj47XG4gIG5ld2xpbmU6IFwiXFxuXCIgfCBcIlxcclxcblwiO1xuICBzZWN0aW9uQ29tbWVudHM6IFNlY3Rpb25Db21tZW50W107XG4gIHNvdXJjZVRleHQ6IHN0cmluZztcbiAgc3RhdGVtZW50czogU3RhdGVtZW50UGhhc2VbXTtcbn1cblxuZXhwb3J0IHR5cGUge1xuICBBYWFQaGFzZSxcbiAgTG9jYXRlZENvbW1lbnQsXG4gIExvY2F0ZWROb2RlLFxuICBTZWN0aW9uQ29tbWVudCxcbiAgU291cmNlQ29tbWVudCxcbiAgU3RhdGVtZW50UGhhc2UsXG4gIFRlc3RCbG9ja0FuYWx5c2lzLFxufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export { assertActualExpectedNamesRule } from "./rule";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/assert-actual-expected-names/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,QAAQ,CAAC"}