@codeperfect/eslint-plugin 2.0.0 → 2.1.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 (118) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  3. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -1
  4. package/dist/domain/architecture/consistent-barrel-files/exports-only-rule.js +8 -3
  5. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -1
  6. package/dist/domain/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +8 -3
  7. package/dist/domain/architecture/consistent-barrel-files/rule.d.ts.map +1 -1
  8. package/dist/domain/architecture/consistent-barrel-files/rule.js +12 -4
  9. package/dist/domain/core/no-multiple-declarators/rule.d.ts.map +1 -1
  10. package/dist/domain/core/no-multiple-declarators/rule.js +6 -3
  11. package/dist/domain/core/prefer-interface-types/rule.d.ts.map +1 -1
  12. package/dist/domain/core/prefer-interface-types/rule.js +6 -3
  13. package/dist/domain/core/prefer-interface-types/test-helpers.d.ts.map +1 -1
  14. package/dist/domain/core/prefer-interface-types/test-helpers.js +1 -1
  15. package/dist/domain/custom-rule-documentation.d.ts +2 -0
  16. package/dist/domain/custom-rule-documentation.d.ts.map +1 -1
  17. package/dist/domain/custom-rule-documentation.js +2 -1
  18. package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -1
  19. package/dist/domain/docs/no-interface-member-docs/comment-utilities-test-helpers.js +1 -1
  20. package/dist/domain/docs/no-interface-member-docs/parameter-utilities.js +1 -1
  21. package/dist/domain/docs/no-interface-member-docs/rule.d.ts.map +1 -1
  22. package/dist/domain/docs/no-interface-member-docs/rule.js +6 -3
  23. package/dist/domain/docs/no-interface-member-docs/test-helpers.js +1 -1
  24. package/dist/domain/docs/require-example-language/create-fixer.js +1 -1
  25. package/dist/domain/docs/require-example-language/fixes.d.ts.map +1 -1
  26. package/dist/domain/docs/require-example-language/fixes.js +1 -1
  27. package/dist/domain/docs/require-example-language/reporting.js +1 -1
  28. package/dist/domain/docs/require-example-language/rule.d.ts.map +1 -1
  29. package/dist/domain/docs/require-example-language/rule.js +6 -3
  30. package/dist/domain/docs/single-line-jsdoc/rule.d.ts +1 -2
  31. package/dist/domain/docs/single-line-jsdoc/rule.d.ts.map +1 -1
  32. package/dist/domain/docs/single-line-jsdoc/rule.edge-cases.js +1 -1
  33. package/dist/domain/docs/single-line-jsdoc/rule.js +11 -6
  34. package/dist/domain/docs/single-line-jsdoc/rule.node-lookups.js +1 -1
  35. package/dist/domain/testing/aaa/analyzer.analysis.d.ts +14 -72
  36. package/dist/domain/testing/aaa/analyzer.analysis.d.ts.map +1 -1
  37. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts +144 -3
  38. package/dist/domain/testing/aaa/analyzer.analysis.helpers.d.ts.map +1 -1
  39. package/dist/domain/testing/aaa/analyzer.analysis.helpers.js +202 -3
  40. package/dist/domain/testing/aaa/analyzer.analysis.js +36 -201
  41. package/dist/domain/testing/aaa/analyzer.analysis.unsupported.d.ts +4 -0
  42. package/dist/domain/testing/aaa/analyzer.analysis.unsupported.d.ts.map +1 -0
  43. package/dist/domain/testing/aaa/analyzer.analysis.unsupported.js +4 -0
  44. package/dist/domain/testing/aaa/analyzer.assertions.d.ts +16 -91
  45. package/dist/domain/testing/aaa/analyzer.assertions.d.ts.map +1 -1
  46. package/dist/domain/testing/aaa/analyzer.assertions.destructured.d.ts +4 -0
  47. package/dist/domain/testing/aaa/analyzer.assertions.destructured.d.ts.map +1 -0
  48. package/dist/domain/testing/aaa/analyzer.assertions.destructured.js +4 -0
  49. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts +95 -0
  50. package/dist/domain/testing/aaa/analyzer.assertions.helpers.d.ts.map +1 -0
  51. package/dist/domain/testing/aaa/analyzer.assertions.helpers.js +185 -0
  52. package/dist/domain/testing/aaa/analyzer.assertions.js +32 -282
  53. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts +64 -0
  54. package/dist/domain/testing/aaa/analyzer.assertions.operands.d.ts.map +1 -0
  55. package/dist/domain/testing/aaa/analyzer.assertions.operands.js +105 -0
  56. package/dist/domain/testing/aaa/analyzer.classification.d.ts +14 -73
  57. package/dist/domain/testing/aaa/analyzer.classification.d.ts.map +1 -1
  58. package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts +77 -0
  59. package/dist/domain/testing/aaa/analyzer.classification.helpers.d.ts.map +1 -0
  60. package/dist/domain/testing/aaa/analyzer.classification.helpers.js +203 -0
  61. package/dist/domain/testing/aaa/analyzer.classification.js +30 -200
  62. package/dist/domain/testing/aaa/analyzer.classification.mutations.d.ts +4 -0
  63. package/dist/domain/testing/aaa/analyzer.classification.mutations.d.ts.map +1 -0
  64. package/dist/domain/testing/aaa/analyzer.classification.mutations.js +4 -0
  65. package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts +15 -0
  66. package/dist/domain/testing/aaa/analyzer.classification.traversal.d.ts.map +1 -0
  67. package/dist/domain/testing/aaa/analyzer.classification.traversal.js +34 -0
  68. package/dist/domain/testing/aaa/analyzer.d.ts +2 -2
  69. package/dist/domain/testing/aaa/analyzer.d.ts.map +1 -1
  70. package/dist/domain/testing/aaa/analyzer.super.d.ts +8 -9
  71. package/dist/domain/testing/aaa/analyzer.super.d.ts.map +1 -1
  72. package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts +27 -0
  73. package/dist/domain/testing/aaa/analyzer.super.helpers.d.ts.map +1 -0
  74. package/dist/domain/testing/aaa/analyzer.super.helpers.js +66 -0
  75. package/dist/domain/testing/aaa/analyzer.super.js +43 -60
  76. package/dist/domain/testing/assert-actual-expected-names/rule.d.ts.map +1 -1
  77. package/dist/domain/testing/assert-actual-expected-names/rule.js +6 -3
  78. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.d.ts +4 -0
  79. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.d.ts.map +1 -0
  80. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.combined.js +4 -0
  81. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.d.ts +4 -0
  82. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.d.ts.map +1 -0
  83. package/dist/domain/testing/enforce-aaa-phase-purity/phase-purity-reporting.behavior.companion.js +4 -0
  84. package/dist/domain/testing/enforce-aaa-phase-purity/rule-test-helpers.js +1 -1
  85. package/dist/domain/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -1
  86. package/dist/domain/testing/enforce-aaa-phase-purity/rule.js +6 -3
  87. package/dist/domain/testing/enforce-aaa-structure/rule.d.ts.map +1 -1
  88. package/dist/domain/testing/enforce-aaa-structure/rule.js +6 -3
  89. package/dist/domain/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -1
  90. package/dist/domain/testing/prefer-vi-mocked-import/rule.js +6 -3
  91. package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts +12 -1
  92. package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.d.ts.map +1 -1
  93. package/dist/domain/testing/prefer-vitest-incremental-casts/ast-helpers.js +26 -2
  94. package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.d.ts.map +1 -1
  95. package/dist/domain/testing/prefer-vitest-incremental-casts/match-input.js +13 -10
  96. package/dist/domain/testing/prefer-vitest-incremental-casts/match.d.ts.map +1 -1
  97. package/dist/domain/testing/prefer-vitest-incremental-casts/match.js +8 -2
  98. package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.d.ts.map +1 -1
  99. package/dist/domain/testing/prefer-vitest-incremental-casts/replacement-helpers.js +9 -5
  100. package/dist/domain/testing/prefer-vitest-incremental-casts/rule.d.ts.map +1 -1
  101. package/dist/domain/testing/prefer-vitest-incremental-casts/rule.js +28 -2
  102. package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.d.ts.map +1 -1
  103. package/dist/domain/testing/prefer-vitest-incremental-casts/type-helpers.js +1 -1
  104. package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts +9 -25
  105. package/dist/domain/testing/prefer-vitest-incremental-casts/types.d.ts.map +1 -1
  106. package/dist/domain/testing/prefer-vitest-incremental-casts/types.js +1 -1
  107. package/dist/domain/testing/require-aaa-sections/rule.d.ts.map +1 -1
  108. package/dist/domain/testing/require-aaa-sections/rule.js +9 -4
  109. package/dist/domain/testing/require-aaa-sections/rule.reporting.d.ts.map +1 -1
  110. package/dist/domain/testing/require-aaa-sections/rule.reporting.js +3 -4
  111. package/dist/domain/testing/require-act-result-capture/rule.d.ts.map +1 -1
  112. package/dist/domain/testing/require-act-result-capture/rule.js +6 -3
  113. package/dist/domain/testing/require-test-companion/rule.d.ts.map +1 -1
  114. package/dist/domain/testing/require-test-companion/rule.js +31 -6
  115. package/dist/domain/testing/single-act-statement/rule.d.ts.map +1 -1
  116. package/dist/domain/testing/single-act-statement/rule.js +6 -3
  117. package/dist/infrastructure/presets.js +1 -1
  118. package/package.json +37 -29
@@ -0,0 +1,185 @@
1
+ import { getAssertOperands, getExpectOperands, getIdentifierName, hasEvaluatedAssertionActual, isAssertionCall, } from "./analyzer.assertions.operands.js";
2
+ import { visitNode } from "./analyzer.super.js";
3
+ /**
4
+ * Collects Assert declarations.
5
+ * @param analysis Input analysis value.
6
+ * @returns Return value output.
7
+ * @example
8
+ * ```typescript
9
+ * getAssertDeclaredIdentifiers(analysis);
10
+ * ```
11
+ */
12
+ function getAssertDeclaredIdentifiers(analysis) {
13
+ const declaredIdentifiers = new Map();
14
+ for (const statement of analysis.statements) {
15
+ if (statement.phases.includes("Assert") &&
16
+ statement.node.type === "VariableDeclaration") {
17
+ for (const declaration of statement.node.declarations) {
18
+ if (declaration.id.type === "Identifier") {
19
+ declaredIdentifiers.set(declaration.id.name, declaration.id);
20
+ }
21
+ }
22
+ }
23
+ }
24
+ return declaredIdentifiers;
25
+ }
26
+ /**
27
+ * Gets the outer assertion call expression for one statement when present.
28
+ * @param statement Statement to inspect.
29
+ * @returns Assertion call expression when the statement is expression-based.
30
+ * @example
31
+ * ```typescript
32
+ * const expression = getAssertionExpression(statement);
33
+ * void expression;
34
+ * ```
35
+ */
36
+ function getAssertionExpression(statement) {
37
+ if (statement.type !== "ExpressionStatement") {
38
+ return void 0;
39
+ }
40
+ const expression = unwrapExpression(statement.expression);
41
+ return expression?.type === "CallExpression" ? expression : void 0;
42
+ }
43
+ /**
44
+ * Extracts assertion identifiers.
45
+ * @param statement Input statement value.
46
+ * @returns Return value output.
47
+ * @example
48
+ * ```typescript
49
+ * getAssertionIdentifiers(statement);
50
+ * ```
51
+ */
52
+ function getAssertionIdentifiers(statement) {
53
+ if (statement.type !== "ExpressionStatement") {
54
+ return { actual: void 0, expected: void 0 };
55
+ }
56
+ const expression = unwrapExpression(statement.expression);
57
+ if (expression?.type !== "CallExpression") {
58
+ return { actual: void 0, expected: void 0 };
59
+ }
60
+ const expectOperands = getExpectOperands(expression);
61
+ if (expectOperands !== void 0) {
62
+ return {
63
+ actual: getIdentifierName(expectOperands.actual),
64
+ expected: getIdentifierName(expectOperands.expected),
65
+ };
66
+ }
67
+ const assertOperands = getAssertOperands(expression);
68
+ return {
69
+ actual: getIdentifierName(assertOperands?.actual),
70
+ expected: getIdentifierName(assertOperands?.expected),
71
+ };
72
+ }
73
+ /**
74
+ * Gets a statement expression.
75
+ * @param statement Input statement value.
76
+ * @returns Return value output.
77
+ * @example
78
+ * ```typescript
79
+ * getStatementExpression(statement);
80
+ * ```
81
+ */
82
+ function getStatementExpression(statement) {
83
+ if (statement.type === "ExpressionStatement") {
84
+ return statement.expression;
85
+ }
86
+ if (statement.type === "VariableDeclaration" &&
87
+ statement.declarations.length === 1) {
88
+ const [declaration] = statement.declarations;
89
+ return declaration?.init;
90
+ }
91
+ return void 0;
92
+ }
93
+ /**
94
+ * Checks for assertions.
95
+ * @param statement Input statement value.
96
+ * @returns Return value output.
97
+ * @example
98
+ * ```typescript
99
+ * hasAssertion(statement);
100
+ * ```
101
+ */
102
+ function hasAssertion(statement) {
103
+ let foundAssertion = false;
104
+ visitNode(statement, (node) => {
105
+ if (node.type === "CallExpression" && isAssertionCall(node)) {
106
+ foundAssertion = true;
107
+ }
108
+ });
109
+ return foundAssertion;
110
+ }
111
+ /**
112
+ * Checks for action expressions.
113
+ * @param expression Input expression value.
114
+ * @returns Return value output.
115
+ * @example
116
+ * ```typescript
117
+ * isActionExpression(expression);
118
+ * ```
119
+ */
120
+ function isActionExpression(expression) {
121
+ const unwrappedExpression = unwrapExpression(expression);
122
+ return (unwrappedExpression?.type === "AwaitExpression" ||
123
+ unwrappedExpression?.type === "CallExpression" ||
124
+ unwrappedExpression?.type === "NewExpression");
125
+ }
126
+ /**
127
+ * Checks Assert statement validity.
128
+ * @param statement Input statement value.
129
+ * @returns Return value output.
130
+ * @example
131
+ * ```typescript
132
+ * isValidAssertStatement(statement);
133
+ * ```
134
+ */
135
+ function isValidAssertStatement(statement) {
136
+ if (hasAssertion(statement)) {
137
+ const assertionExpression = getAssertionExpression(statement);
138
+ return (assertionExpression === void 0 ||
139
+ !hasEvaluatedAssertionActual(assertionExpression, isActionExpression));
140
+ }
141
+ if (statement.type !== "VariableDeclaration") {
142
+ return false;
143
+ }
144
+ return statement.declarations.every((declaration) => {
145
+ if (declaration.init === null) {
146
+ return true;
147
+ }
148
+ return !isActionExpression(unwrapExpression(declaration.init));
149
+ });
150
+ }
151
+ /**
152
+ * Unwraps nested expressions.
153
+ * @param expression Input expression value.
154
+ * @returns Return value output.
155
+ * @example
156
+ * ```typescript
157
+ * unwrapExpression(expression);
158
+ * ```
159
+ */
160
+ function unwrapExpression(expression) {
161
+ if (expression?.type === "ChainExpression") {
162
+ return unwrapExpression(expression.expression);
163
+ }
164
+ if (expression?.type === "AwaitExpression") {
165
+ return expression.argument;
166
+ }
167
+ return expression;
168
+ }
169
+ /**
170
+ * Checks AAA naming prefixes.
171
+ * @param name Input name value.
172
+ * @param prefix Input prefix value.
173
+ * @returns Return value output.
174
+ * @example
175
+ * ```typescript
176
+ * usesPrefix("actualResult", "actual");
177
+ * ```
178
+ */
179
+ function usesPrefix(name, prefix) {
180
+ return name === prefix || name.startsWith(prefix);
181
+ }
182
+ /** Companion marker for test isolation. */
183
+ const analyzerAssertionsHelpersCompanion = true;
184
+ export { analyzerAssertionsHelpersCompanion, getAssertDeclaredIdentifiers, getAssertionIdentifiers, getStatementExpression, hasAssertion, isActionExpression, isValidAssertStatement, unwrapExpression, usesPrefix, };
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYXNzZXJ0aW9ucy5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvbWFpbi90ZXN0aW5nL2FhYS9hbmFseXplci5hc3NlcnRpb25zLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLDJCQUEyQixFQUMzQixlQUFlLEdBQ2hCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBVTdDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FDbkMsUUFBMkI7SUFFM0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztJQUM5RSxLQUFLLE1BQU0sU0FBUyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QyxJQUNFLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxxQkFBcUIsRUFDN0MsQ0FBQztZQUNELEtBQUssTUFBTSxXQUFXLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDekMsbUJBQW1CLENBQUMsR0FBRyxDQUNyQixXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFDbkIsV0FBVyxDQUFDLEVBQW9DLENBQ2pELENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sbUJBQW1CLENBQUM7QUFDN0IsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsc0JBQXNCLENBQzdCLFNBQTJCO0lBRTNCLElBQUksU0FBUyxD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QUFVLENBQUMsSUFBWSxFQUFFLE1BQTZCO0lBQzdELE9BQU8sSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCwyQ0FBMkM7QUFDM0MsTUFBTSxrQ0FBa0MsR0FBRyxJQUFhLENBQUM7QUFFekQsT0FBTyxFQUNMLGtDQUFrQyxFQUNsQyw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsVUFBVSxHQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEVTVHJlZSBmcm9tIFwiZXN0cmVlXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IExvY2F0ZWROb2RlLCBUZXN0QmxvY2tBbmFseXNpcyB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIGdldEFzc2VydE9wZXJhbmRzLFxyXG4gIGdldEV4cGVjdE9wZXJhbmRzLFxyXG4gIGdldElkZW50aWZpZXJOYW1lLFxyXG4gIGhhc0V2YWx1YXRlZEFzc2VydGlvbkFjdHVhbCxcclxuICBpc0Fzc2VydGlvbkNhbGwsXHJcbn0gZnJvbSBcIi4vYW5hbHl6ZXIuYXNzZXJ0aW9ucy5vcGVyYW5kc1wiO1xyXG5pbXBvcnQgeyB2aXNpdE5vZGUgfSBmcm9tIFwiLi9hbmFseXplci5zdXBlclwiO1xyXG5cclxuLyoqIElkZW50aWZpZXIgbmFtZXMgZXh0cmFjdGVkIGZyb20gYW4gYXNzZXJ0aW9uIHN0YXRlbWVudC4gKi9cclxuaW50ZXJmYWNlIEFzc2VydGlvbklkZW50aWZpZXJzIHtcclxuICAvKiogSWRlbnRpZmllciB1c2VkIGFzIHRoZSBhY3R1YWwgdmFsdWUuICovXHJcbiAgYWN0dWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLyoqIElkZW50aWZpZXIgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgdmFsdWUuICovXHJcbiAgZXhwZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbGxlY3RzIEFzc2VydCBkZWNsYXJhdGlvbnMuXHJcbiAqIEBwYXJhbSBhbmFseXNpcyBJbnB1dCBhbmFseXNpcyB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBnZXRBc3NlcnREZWNsYXJlZElkZW50aWZpZXJzKGFuYWx5c2lzKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBc3NlcnREZWNsYXJlZElkZW50aWZpZXJzKFxyXG4gIGFuYWx5c2lzOiBUZXN0QmxvY2tBbmFseXNpcyxcclxuKTogTWFwPHN0cmluZywgTG9jYXRlZE5vZGU8RVNUcmVlLklkZW50aWZpZXI+PiB7XHJcbiAgY29uc3QgZGVjbGFyZWRJZGVudGlmaWVycyA9IG5ldyBNYXA8c3RyaW5nLCBMb2NhdGVkTm9kZTxFU1RyZWUuSWRlbnRpZmllcj4+KCk7XHJcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgYW5hbHlzaXMuc3RhdGVtZW50cykge1xyXG4gICAgaWYgKFxyXG4gICAgICBzdGF0ZW1lbnQucGhhc2VzLmluY2x1ZGVzKFwiQXNzZXJ0XCIpICYmXHJcbiAgICAgIHN0YXRlbWVudC5ub2RlLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiXHJcbiAgICApIHtcclxuICAgICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBzdGF0ZW1lbnQubm9kZS5kZWNsYXJhdGlvbnMpIHtcclxuICAgICAgICBpZiAoZGVjbGFyYXRpb24uaWQudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcclxuICAgICAgICAgIGRlY2xhcmVkSWRlbnRpZmllcnMuc2V0KFxyXG4gICAgICAgICAgICBkZWNsYXJhdGlvbi5pZC5uYW1lLFxyXG4gICAgICAgICAgICBkZWNsYXJhdGlvbi5pZCBhcyBMb2NhdGVkTm9kZTxFU1RyZWUuSWRlbnRpZmllcj4sXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gZGVjbGFyZWRJZGVudGlmaWVycztcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG91dGVyIGFzc2VydGlvbiBjYWxsIGV4cHJlc3Npb24gZm9yIG9uZSBzdGF0ZW1lbnQgd2hlbiBwcmVzZW50LlxyXG4gKiBAcGFyYW0gc3RhdGVtZW50IFN0YXRlbWVudCB0byBpbnNwZWN0LlxyXG4gKiBAcmV0dXJucyBBc3NlcnRpb24gY2FsbCBleHByZXNzaW9uIHdoZW4gdGhlIHN0YXRlbWVudCBpcyBleHByZXNzaW9uLWJhc2VkLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGV4cHJlc3Npb24gPSBnZXRBc3NlcnRpb25FeHByZXNzaW9uKHN0YXRlbWVudCk7XHJcbiAqIHZvaWQgZXhwcmVzc2lvbjtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBc3NlcnRpb25FeHByZXNzaW9uKFxyXG4gIHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCxcclxuKTogRVNUcmVlLkNhbGxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoc3RhdGVtZW50LnR5cGUgIT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XHJcbiAgICByZXR1cm4gdm9pZCAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZXhwcmVzc2lvbiA9IHVud3JhcEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pO1xyXG5cclxuICByZXR1cm4gZXhwcmVzc2lvbj8udHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiID8gZXhwcmVzc2lvbiA6IHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEV4dHJhY3RzIGFzc2VydGlvbiBpZGVudGlmaWVycy5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0QXNzZXJ0aW9uSWRlbnRpZmllcnMoc3RhdGVtZW50KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBc3NlcnRpb25JZGVudGlmaWVycyhcclxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQsXHJcbik6IEFzc2VydGlvbklkZW50aWZpZXJzIHtcclxuICBpZiAoc3RhdGVtZW50LnR5cGUgIT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XHJcbiAgICByZXR1cm4geyBhY3R1YWw6IHZvaWQgMCwgZXhwZWN0ZWQ6IHZvaWQgMCB9O1xyXG4gIH1cclxuICBjb25zdCBleHByZXNzaW9uID0gdW53cmFwRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbik7XHJcbiAgaWYgKGV4cHJlc3Npb24/LnR5cGUgIT09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xyXG4gICAgcmV0dXJuIHsgYWN0dWFsOiB2b2lkIDAsIGV4cGVjdGVkOiB2b2lkIDAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGV4cGVjdE9wZXJhbmRzID0gZ2V0RXhwZWN0T3BlcmFuZHMoZXhwcmVzc2lvbik7XHJcbiAgaWYgKGV4cGVjdE9wZXJhbmRzICE9PSB2b2lkIDApIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjdHVhbDogZ2V0SWRlbnRpZmllck5hbWUoZXhwZWN0T3BlcmFuZHMuYWN0dWFsKSxcclxuICAgICAgZXhwZWN0ZWQ6IGdldElkZW50aWZpZXJOYW1lKGV4cGVjdE9wZXJhbmRzLmV4cGVjdGVkKSxcclxuICAgIH07XHJcbiAgfVxyXG4gIGNvbnN0IGFzc2VydE9wZXJhbmRzID0gZ2V0QXNzZXJ0T3BlcmFuZHMoZXhwcmVzc2lvbik7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFjdHVhbDogZ2V0SWRlbnRpZmllck5hbWUoYXNzZXJ0T3BlcmFuZHM/LmFjdHVhbCksXHJcbiAgICBleHBlY3RlZDogZ2V0SWRlbnRpZmllck5hbWUoYXNzZXJ0T3BlcmFuZHM/LmV4cGVjdGVkKSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyBhIHN0YXRlbWVudCBleHByZXNzaW9uLlxyXG4gKiBAcGFyYW0gc3RhdGVtZW50IElucHV0IHN0YXRlbWVudCB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBnZXRTdGF0ZW1lbnRFeHByZXNzaW9uKHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U3RhdGVtZW50RXhwcmVzc2lvbihcclxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQsXHJcbik6IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoc3RhdGVtZW50LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XHJcbiAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb247XHJcbiAgfVxyXG4gIGlmIChcclxuICAgIHN0YXRlbWVudC50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiAmJlxyXG4gICAgc3RhdGVtZW50LmRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDFcclxuICApIHtcclxuICAgIGNvbnN0IFtkZWNsYXJhdGlvbl0gPSBzdGF0ZW1lbnQuZGVjbGFyYXRpb25zO1xyXG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uPy5pbml0IGFzIEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuICByZXR1cm4gdm9pZCAwO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGZvciBhc3NlcnRpb25zLlxyXG4gKiBAcGFyYW0gc3RhdGVtZW50IElucHV0IHN0YXRlbWVudCB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBoYXNBc3NlcnRpb24oc3RhdGVtZW50KTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBoYXNBc3NlcnRpb24oc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50KTogYm9vbGVhbiB7XHJcbiAgbGV0IGZvdW5kQXNzZXJ0aW9uID0gZmFsc2U7XHJcbiAgdmlzaXROb2RlKHN0YXRlbWVudCwgKG5vZGUpID0+IHtcclxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBpc0Fzc2VydGlvbkNhbGwobm9kZSkpIHtcclxuICAgICAgZm91bmRBc3NlcnRpb24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBmb3VuZEFzc2VydGlvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYWN0aW9uIGV4cHJlc3Npb25zLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGlzQWN0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FjdGlvbkV4cHJlc3Npb24oXHJcbiAgZXhwcmVzc2lvbjogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQsXHJcbik6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gIHJldHVybiAoXHJcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkF3YWl0RXhwcmVzc2lvblwiIHx8XHJcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHxcclxuICAgIHVud3JhcHBlZEV4cHJlc3Npb24/LnR5cGUgPT09IFwiTmV3RXhwcmVzc2lvblwiXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBBc3NlcnQgc3RhdGVtZW50IHZhbGlkaXR5LlxyXG4gKiBAcGFyYW0gc3RhdGVtZW50IElucHV0IHN0YXRlbWVudCB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpc1ZhbGlkQXNzZXJ0U3RhdGVtZW50KHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gaXNWYWxpZEFzc2VydFN0YXRlbWVudChzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQpOiBib29sZWFuIHtcclxuICBpZiAoaGFzQXNzZXJ0aW9uKHN0YXRlbWVudCkpIHtcclxuICAgIGNvbnN0IGFzc2VydGlvbkV4cHJlc3Npb24gPSBnZXRBc3NlcnRpb25FeHByZXNzaW9uKHN0YXRlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgYXNzZXJ0aW9uRXhwcmVzc2lvbiA9PT0gdm9pZCAwIHx8XHJcbiAgICAgICFoYXNFdmFsdWF0ZWRBc3NlcnRpb25BY3R1YWwoYXNzZXJ0aW9uRXhwcmVzc2lvbiwgaXNBY3Rpb25FeHByZXNzaW9uKVxyXG4gICAgKTtcclxuICB9XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIikge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHN0YXRlbWVudC5kZWNsYXJhdGlvbnMuZXZlcnkoKGRlY2xhcmF0aW9uKSA9PiB7XHJcbiAgICBpZiAoZGVjbGFyYXRpb24uaW5pdCA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiAhaXNBY3Rpb25FeHByZXNzaW9uKHVud3JhcEV4cHJlc3Npb24oZGVjbGFyYXRpb24uaW5pdCkpO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogVW53cmFwcyBuZXN0ZWQgZXhwcmVzc2lvbnMuXHJcbiAqIEBwYXJhbSBleHByZXNzaW9uIElucHV0IGV4cHJlc3Npb24gdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogdW53cmFwRXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiB1bndyYXBFeHByZXNzaW9uKFxyXG4gIGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxyXG4pOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQ2hhaW5FeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiB1bndyYXBFeHByZXNzaW9uKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XHJcbiAgfVxyXG4gIGlmIChleHByZXNzaW9uPy50eXBlID09PSBcIkF3YWl0RXhwcmVzc2lvblwiKSB7XHJcbiAgICByZXR1cm4gZXhwcmVzc2lvbi5hcmd1bWVudDtcclxuICB9XHJcbiAgcmV0dXJuIGV4cHJlc3Npb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgQUFBIG5hbWluZyBwcmVmaXhlcy5cclxuICogQHBhcmFtIG5hbWUgSW5wdXQgbmFtZSB2YWx1ZS5cclxuICogQHBhcmFtIHByZWZpeCBJbnB1dCBwcmVmaXggdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogdXNlc1ByZWZpeChcImFjdHVhbFJlc3VsdFwiLCBcImFjdHVhbFwiKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiB1c2VzUHJlZml4KG5hbWU6IHN0cmluZywgcHJlZml4OiBcImFjdHVhbFwiIHwgXCJleHBlY3RlZFwiKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIG5hbWUgPT09IHByZWZpeCB8fCBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KTtcclxufVxyXG5cclxuLyoqIENvbXBhbmlvbiBtYXJrZXIgZm9yIHRlc3QgaXNvbGF0aW9uLiAqL1xyXG5jb25zdCBhbmFseXplckFzc2VydGlvbnNIZWxwZXJzQ29tcGFuaW9uID0gdHJ1ZSBhcyBjb25zdDtcclxuXHJcbmV4cG9ydCB7XHJcbiAgYW5hbHl6ZXJBc3NlcnRpb25zSGVscGVyc0NvbXBhbmlvbixcclxuICBnZXRBc3NlcnREZWNsYXJlZElkZW50aWZpZXJzLFxyXG4gIGdldEFzc2VydGlvbklkZW50aWZpZXJzLFxyXG4gIGdldFN0YXRlbWVudEV4cHJlc3Npb24sXHJcbiAgaGFzQXNzZXJ0aW9uLFxyXG4gIGlzQWN0aW9uRXhwcmVzc2lvbixcclxuICBpc1ZhbGlkQXNzZXJ0U3RhdGVtZW50LFxyXG4gIHVud3JhcEV4cHJlc3Npb24sXHJcbiAgdXNlc1ByZWZpeCxcclxufTtcclxuZXhwb3J0IHR5cGUgeyBBc3NlcnRpb25JZGVudGlmaWVycyB9O1xyXG4iXX0=
@@ -1,283 +1,33 @@
1
- /* eslint max-lines: ["error", 380] -- Mandatory multiline JSDoc for internal helpers pushes this split file over the default limit. */
2
- import { visitNode } from "./analyzer.super.js";
3
- /**
4
- * Collects Assert declarations.
5
- * @param analysis Input analysis value.
6
- * @returns Return value output.
7
- * @example
8
- * ```typescript
9
- * getAssertDeclaredIdentifiers(analysis);
10
- * ```
11
- */
12
- function getAssertDeclaredIdentifiers(analysis) {
13
- const declaredIdentifiers = new Map();
14
- for (const statement of analysis.statements) {
15
- if (statement.phases.includes("Assert") &&
16
- statement.node.type === "VariableDeclaration") {
17
- for (const declaration of statement.node.declarations) {
18
- if (declaration.id.type === "Identifier") {
19
- declaredIdentifiers.set(declaration.id.name, declaration.id);
20
- }
21
- }
22
- }
23
- }
24
- return declaredIdentifiers;
25
- }
26
- /**
27
- * Gets the outer assertion call expression for one statement when present.
28
- * @param statement Statement to inspect.
29
- * @returns Assertion call expression when the statement is expression-based.
30
- * @example
31
- * ```typescript
32
- * const expression = getAssertionExpression(statement);
33
- * void expression;
34
- * ```
35
- */
36
- function getAssertionExpression(statement) {
37
- if (statement.type !== "ExpressionStatement") {
38
- return void 0;
39
- }
40
- const expression = unwrapExpression(statement.expression);
41
- return expression?.type === "CallExpression" ? expression : void 0;
42
- }
43
- /**
44
- * Extracts assertion identifiers.
45
- * @param statement Input statement value.
46
- * @returns Return value output.
47
- * @example
48
- * ```typescript
49
- * getAssertionIdentifiers(statement);
50
- * ```
51
- */
52
- function getAssertionIdentifiers(statement) {
53
- if (statement.type !== "ExpressionStatement") {
54
- return { actual: void 0, expected: void 0 };
55
- }
56
- const expression = unwrapExpression(statement.expression);
57
- if (expression?.type !== "CallExpression") {
58
- return { actual: void 0, expected: void 0 };
59
- }
60
- const expectOperands = getExpectOperands(expression);
61
- if (expectOperands !== void 0) {
62
- return {
63
- actual: getIdentifierName(expectOperands.actual),
64
- expected: getIdentifierName(expectOperands.expected),
65
- };
66
- }
67
- const assertOperands = getAssertOperands(expression);
68
- return {
69
- actual: getIdentifierName(assertOperands?.actual),
70
- expected: getIdentifierName(assertOperands?.expected),
71
- };
72
- }
73
- /**
74
- * Gets assert operands.
75
- * @param expression Input expression value.
76
- * @returns Return value output.
77
- * @example
78
- * ```typescript
79
- * getAssertOperands(expression);
80
- * ```
81
- */
82
- function getAssertOperands(expression) {
83
- if (expression.callee.type === "MemberExpression" &&
84
- expression.callee.object.type === "Identifier" &&
85
- expression.callee.object.name === "assert") {
86
- const [actual, expected] = expression.arguments;
87
- if (actual?.type !== "SpreadElement" &&
88
- expected?.type !== "SpreadElement") {
89
- return { actual, expected };
90
- }
91
- }
92
- return void 0;
93
- }
94
- /**
95
- * Gets expect operands.
96
- * @param expression Input expression value.
97
- * @returns Return value output.
98
- * @example
99
- * ```typescript
100
- * getExpectOperands(expression);
101
- * ```
102
- */
103
- function getExpectOperands(expression) {
104
- if (expression.callee.type === "Identifier" &&
105
- expression.callee.name === "expect") {
106
- const [actual] = expression.arguments;
107
- return actual?.type === "SpreadElement"
108
- ? { actual: void 0, expected: void 0 }
109
- : { actual, expected: void 0 };
110
- }
111
- if (expression.callee.type === "MemberExpression" &&
112
- expression.callee.object.type === "CallExpression") {
113
- const nestedOperands = getExpectOperands(expression.callee.object);
114
- if (nestedOperands === void 0) {
115
- return void 0;
116
- }
117
- const [expected] = expression.arguments;
118
- return expected?.type === "SpreadElement"
119
- ? nestedOperands
120
- : { actual: nestedOperands.actual, expected };
121
- }
122
- return void 0;
123
- }
124
- /**
125
- * Gets an identifier name.
126
- * @param expression Input expression value.
127
- * @returns Return value output.
128
- * @example
129
- * ```typescript
130
- * getIdentifierName(expression);
131
- * ```
132
- */
133
- function getIdentifierName(expression) {
134
- return expression?.type === "Identifier" ? expression.name : void 0;
135
- }
136
- /**
137
- * Gets a statement expression.
138
- * @param statement Input statement value.
139
- * @returns Return value output.
140
- * @example
141
- * ```typescript
142
- * getStatementExpression(statement);
143
- * ```
144
- */
145
- function getStatementExpression(statement) {
146
- if (statement.type === "ExpressionStatement") {
147
- return statement.expression;
148
- }
149
- if (statement.type === "VariableDeclaration" &&
150
- statement.declarations.length === 1) {
151
- const [declaration] = statement.declarations;
152
- return declaration?.init;
153
- }
154
- return void 0;
155
- }
156
- /**
157
- * Checks for assertions.
158
- * @param statement Input statement value.
159
- * @returns Return value output.
160
- * @example
161
- * ```typescript
162
- * hasAssertion(statement);
163
- * ```
164
- */
165
- function hasAssertion(statement) {
166
- let foundAssertion = false;
167
- visitNode(statement, (node) => {
168
- if (node.type === "CallExpression" && isAssertionCall(node)) {
169
- foundAssertion = true;
170
- }
171
- });
172
- return foundAssertion;
173
- }
174
- /**
175
- * Checks whether an assertion evaluates the actual operand inline.
176
- * @param expression Assertion call expression to inspect.
177
- * @returns True when the assertion actual operand performs action-like work.
178
- * @example
179
- * ```typescript
180
- * const actual = hasEvaluatedAssertionActual(expression);
181
- * void actual;
182
- * ```
183
- */
184
- function hasEvaluatedAssertionActual(expression) {
185
- const operands = getExpectOperands(expression) ?? getAssertOperands(expression);
186
- return operands !== void 0 && isActionExpression(operands.actual);
187
- }
188
- /**
189
- * Checks for action expressions.
190
- * @param expression Input expression value.
191
- * @returns Return value output.
192
- * @example
193
- * ```typescript
194
- * isActionExpression(expression);
195
- * ```
196
- */
197
- function isActionExpression(expression) {
198
- const unwrappedExpression = unwrapExpression(expression);
199
- return (unwrappedExpression?.type === "AwaitExpression" ||
200
- unwrappedExpression?.type === "CallExpression" ||
201
- unwrappedExpression?.type === "NewExpression");
202
- }
203
- /**
204
- * Checks for assertion calls.
205
- * @param node Input node value.
206
- * @returns Return value output.
207
- * @example
208
- * ```typescript
209
- * isAssertionCall(node);
210
- * ```
211
- */
212
- function isAssertionCall(node) {
213
- if (node.callee.type === "Identifier") {
214
- return node.callee.name === "expect" || node.callee.name === "assert";
215
- }
216
- if (node.callee.type !== "MemberExpression") {
217
- return false;
218
- }
219
- if (node.callee.object.type === "Identifier" &&
220
- node.callee.object.name === "assert") {
221
- return true;
222
- }
223
- return (node.callee.object.type === "CallExpression" &&
224
- isAssertionCall(node.callee.object));
225
- }
226
- /**
227
- * Checks Assert statement validity.
228
- * @param statement Input statement value.
229
- * @returns Return value output.
230
- * @example
231
- * ```typescript
232
- * isValidAssertStatement(statement);
233
- * ```
234
- */
235
- function isValidAssertStatement(statement) {
236
- if (hasAssertion(statement)) {
237
- const assertionExpression = getAssertionExpression(statement);
238
- return (assertionExpression === void 0 ||
239
- !hasEvaluatedAssertionActual(assertionExpression));
240
- }
241
- if (statement.type !== "VariableDeclaration") {
242
- return false;
243
- }
244
- return statement.declarations.every((declaration) => {
245
- if (declaration.init === null) {
246
- return true;
247
- }
248
- return !isActionExpression(unwrapExpression(declaration.init));
249
- });
250
- }
251
- /**
252
- * Unwraps nested expressions.
253
- * @param expression Input expression value.
254
- * @returns Return value output.
255
- * @example
256
- * ```typescript
257
- * unwrapExpression(expression);
258
- * ```
259
- */
260
- function unwrapExpression(expression) {
261
- if (expression?.type === "ChainExpression") {
262
- return unwrapExpression(expression.expression);
263
- }
264
- if (expression?.type === "AwaitExpression") {
265
- return expression.argument;
266
- }
267
- return expression;
268
- }
269
- /**
270
- * Checks AAA naming prefixes.
271
- * @param name Input name value.
272
- * @param prefix Input prefix value.
273
- * @returns Return value output.
274
- * @example
275
- * ```typescript
276
- * usesPrefix("actualResult", "actual");
277
- * ```
278
- */
279
- function usesPrefix(name, prefix) {
280
- return name === prefix || name.startsWith(prefix);
281
- }
1
+ import { getAssertDeclaredIdentifiers as getAssertDeclaredIdentifiersImplementation, getAssertionIdentifiers as getAssertionIdentifiersImplementation, getStatementExpression as getStatementExpressionImplementation, hasAssertion as hasAssertionImplementation, isActionExpression as isActionExpressionImplementation, isValidAssertStatement as isValidAssertStatementImplementation, unwrapExpression as unwrapExpressionImplementation, usesPrefix as usesPrefixImplementation, } from "./analyzer.assertions.helpers.js";
2
+ /**
3
+ * Creates a local forwarding function for an imported analyzer helper.
4
+ * @template TParameters Forwarded parameter tuple.
5
+ * @template TResult Forwarded return type.
6
+ * @param implementation Imported helper implementation.
7
+ * @returns Local function that forwards all arguments to the implementation.
8
+ * @example
9
+ * ```typescript
10
+ * const localHelper = forward(implementation);
11
+ * ```
12
+ */
13
+ function forward(implementation) {
14
+ return (...parameters) => implementation(...parameters);
15
+ }
16
+ /** Collects all declared identifiers from an assert statement. */
17
+ const getAssertDeclaredIdentifiers = forward(getAssertDeclaredIdentifiersImplementation);
18
+ /** Resolves the identifier names used in an assertion call. */
19
+ const getAssertionIdentifiers = forward(getAssertionIdentifiersImplementation);
20
+ /** Extracts the expression from an expression statement node. */
21
+ const getStatementExpression = forward(getStatementExpressionImplementation);
22
+ /** Checks whether a statement contains an assertion call. */
23
+ const hasAssertion = forward(hasAssertionImplementation);
24
+ /** Checks whether an expression is an Act-phase action expression. */
25
+ const isActionExpression = forward(isActionExpressionImplementation);
26
+ /** Checks whether a statement is a valid Assert-phase assertion. */
27
+ const isValidAssertStatement = forward(isValidAssertStatementImplementation);
28
+ /** Unwraps a nested or chained expression to its root call. */
29
+ const unwrapExpression = forward(unwrapExpressionImplementation);
30
+ /** Checks whether an assertion call uses a known assertion prefix. */
31
+ const usesPrefix = forward(usesPrefixImplementation);
282
32
  export { getAssertDeclaredIdentifiers, getAssertionIdentifiers, getStatementExpression, hasAssertion, isActionExpression, isValidAssertStatement, unwrapExpression, usesPrefix, };
283
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9hYWEvYW5hbHl6ZXIuYXNzZXJ0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1SUFBdUk7QUFNdkksT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBa0I3Qzs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsNEJBQTRCLENBQ25DLFFBQTJCO0lBRTNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQTBDLENBQUM7SUFDOUUsS0FBSyxNQUFNLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUMsSUFDRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbkMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQzdDLENBQUM7WUFDRCxLQUFLLE1BQU0sV0FBVyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RELElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQ3pDLG1CQUFtQixDQUFDLEdBQUcsQ0FDckIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQ25CLFdBQVcsQ0FBQyxFQUFvQyxDQUNqRCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLHNCQUFzQixDQUM3QixTQUEyQjtJQUUzQixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FB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QUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZ0JBQWdCLENBQ3ZCLFVBQXlDO0lBRXpDLElBQUksVUFBVSxFQUFFLElBQUksS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNDLE9BQU8sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxJQUFJLFVBQVUsRUFBRSxJQUFJLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztRQUMzQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsTUFBNkI7SUFDN0QsT0FBTyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsVUFBVSxHQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbWF4LWxpbmVzOiBbXCJlcnJvclwiLCAzODBdIC0tIE1hbmRhdG9yeSBtdWx0aWxpbmUgSlNEb2MgZm9yIGludGVybmFsIGhlbHBlcnMgcHVzaGVzIHRoaXMgc3BsaXQgZmlsZSBvdmVyIHRoZSBkZWZhdWx0IGxpbWl0LiAqL1xyXG5cclxuaW1wb3J0IHR5cGUgKiBhcyBFU1RyZWUgZnJvbSBcImVzdHJlZVwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBMb2NhdGVkTm9kZSwgVGVzdEJsb2NrQW5hbHlzaXMgfSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuaW1wb3J0IHsgdmlzaXROb2RlIH0gZnJvbSBcIi4vYW5hbHl6ZXIuc3VwZXJcIjtcclxuXHJcbi8qKiBJZGVudGlmaWVyIG5hbWVzIGV4dHJhY3RlZCBmcm9tIGFuIGFzc2VydGlvbiBzdGF0ZW1lbnQuICovXHJcbmludGVyZmFjZSBBc3NlcnRpb25JZGVudGlmaWVycyB7XHJcbiAgLyoqIElkZW50aWZpZXIgdXNlZCBhcyB0aGUgYWN0dWFsIHZhbHVlLiAqL1xyXG4gIGFjdHVhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8qKiBJZGVudGlmaWVyIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHZhbHVlLiAqL1xyXG4gIGV4cGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKiBSYXcgYXNzZXJ0aW9uIG9wZXJhbmRzIGV4dHJhY3RlZCBmcm9tIGEgY2FsbCBleHByZXNzaW9uLiAqL1xyXG5pbnRlcmZhY2UgQXNzZXJ0aW9uT3BlcmFuZHMge1xyXG4gIC8qKiBFeHByZXNzaW9uIHVzZWQgYXMgdGhlIGFjdHVhbCBvcGVyYW5kLiAqL1xyXG4gIGFjdHVhbDogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XHJcbiAgLyoqIEV4cHJlc3Npb24gdXNlZCBhcyB0aGUgZXhwZWN0ZWQgb3BlcmFuZC4gKi9cclxuICBleHBlY3RlZDogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb2xsZWN0cyBBc3NlcnQgZGVjbGFyYXRpb25zLlxyXG4gKiBAcGFyYW0gYW5hbHlzaXMgSW5wdXQgYW5hbHlzaXMgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyhhbmFseXNpcyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyhcclxuICBhbmFseXNpczogVGVzdEJsb2NrQW5hbHlzaXMsXHJcbik6IE1hcDxzdHJpbmcsIExvY2F0ZWROb2RlPEVTVHJlZS5JZGVudGlmaWVyPj4ge1xyXG4gIGNvbnN0IGRlY2xhcmVkSWRlbnRpZmllcnMgPSBuZXcgTWFwPHN0cmluZywgTG9jYXRlZE5vZGU8RVNUcmVlLklkZW50aWZpZXI+PigpO1xyXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGFuYWx5c2lzLnN0YXRlbWVudHMpIHtcclxuICAgIGlmIChcclxuICAgICAgc3RhdGVtZW50LnBoYXNlcy5pbmNsdWRlcyhcIkFzc2VydFwiKSAmJlxyXG4gICAgICBzdGF0ZW1lbnQubm9kZS50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIlxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3RhdGVtZW50Lm5vZGUuZGVjbGFyYXRpb25zKSB7XHJcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlkLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XHJcbiAgICAgICAgICBkZWNsYXJlZElkZW50aWZpZXJzLnNldChcclxuICAgICAgICAgICAgZGVjbGFyYXRpb24uaWQubmFtZSxcclxuICAgICAgICAgICAgZGVjbGFyYXRpb24uaWQgYXMgTG9jYXRlZE5vZGU8RVNUcmVlLklkZW50aWZpZXI+LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRlY2xhcmVkSWRlbnRpZmllcnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBvdXRlciBhc3NlcnRpb24gY2FsbCBleHByZXNzaW9uIGZvciBvbmUgc3RhdGVtZW50IHdoZW4gcHJlc2VudC5cclxuICogQHBhcmFtIHN0YXRlbWVudCBTdGF0ZW1lbnQgdG8gaW5zcGVjdC5cclxuICogQHJldHVybnMgQXNzZXJ0aW9uIGNhbGwgZXhwcmVzc2lvbiB3aGVuIHRoZSBzdGF0ZW1lbnQgaXMgZXhwcmVzc2lvbi1iYXNlZC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBleHByZXNzaW9uID0gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG4gKiB2b2lkIGV4cHJlc3Npb247XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihcclxuICBzdGF0ZW1lbnQ6IEVTVHJlZS5TdGF0ZW1lbnQsXHJcbik6IEVTVHJlZS5DYWxsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHZvaWQgMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKTtcclxuXHJcbiAgcmV0dXJuIGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiA/IGV4cHJlc3Npb24gOiB2b2lkIDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBhc3NlcnRpb24gaWRlbnRpZmllcnMuXHJcbiAqIEBwYXJhbSBzdGF0ZW1lbnQgSW5wdXQgc3RhdGVtZW50IHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldEFzc2VydGlvbklkZW50aWZpZXJzKHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzZXJ0aW9uSWRlbnRpZmllcnMoXHJcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxyXG4pOiBBc3NlcnRpb25JZGVudGlmaWVycyB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlICE9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHsgYWN0dWFsOiB2b2lkIDAsIGV4cGVjdGVkOiB2b2lkIDAgfTtcclxuICB9XHJcbiAgY29uc3QgZXhwcmVzc2lvbiA9IHVud3JhcEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pO1xyXG4gIGlmIChleHByZXNzaW9uPy50eXBlICE9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiB7IGFjdHVhbDogdm9pZCAwLCBleHBlY3RlZDogdm9pZCAwIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBleHBlY3RPcGVyYW5kcyA9IGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gIGlmIChleHBlY3RPcGVyYW5kcyAhPT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3R1YWw6IGdldElkZW50aWZpZXJOYW1lKGV4cGVjdE9wZXJhbmRzLmFjdHVhbCksXHJcbiAgICAgIGV4cGVjdGVkOiBnZXRJZGVudGlmaWVyTmFtZShleHBlY3RPcGVyYW5kcy5leHBlY3RlZCksXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCBhc3NlcnRPcGVyYW5kcyA9IGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gIHJldHVybiB7XHJcbiAgICBhY3R1YWw6IGdldElkZW50aWZpZXJOYW1lKGFzc2VydE9wZXJhbmRzPy5hY3R1YWwpLFxyXG4gICAgZXhwZWN0ZWQ6IGdldElkZW50aWZpZXJOYW1lKGFzc2VydE9wZXJhbmRzPy5leHBlY3RlZCksXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgYXNzZXJ0IG9wZXJhbmRzLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldEFzc2VydE9wZXJhbmRzKFxyXG4gIGV4cHJlc3Npb246IEVTVHJlZS5DYWxsRXhwcmVzc2lvbixcclxuKTogQXNzZXJ0aW9uT3BlcmFuZHMgfCB1bmRlZmluZWQge1xyXG4gIGlmIChcclxuICAgIGV4cHJlc3Npb24uY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXHJcbiAgICBleHByZXNzaW9uLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcclxuICAgIGV4cHJlc3Npb24uY2FsbGVlLm9iamVjdC5uYW1lID09PSBcImFzc2VydFwiXHJcbiAgKSB7XHJcbiAgICBjb25zdCBbYWN0dWFsLCBleHBlY3RlZF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcclxuICAgIGlmIChcclxuICAgICAgYWN0dWFsPy50eXBlICE9PSBcIlNwcmVhZEVsZW1lbnRcIiAmJlxyXG4gICAgICBleHBlY3RlZD8udHlwZSAhPT0gXCJTcHJlYWRFbGVtZW50XCJcclxuICAgICkge1xyXG4gICAgICByZXR1cm4geyBhY3R1YWwsIGV4cGVjdGVkIH07XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB2b2lkIDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIGV4cGVjdCBvcGVyYW5kcy5cclxuICogQHBhcmFtIGV4cHJlc3Npb24gSW5wdXQgZXhwcmVzc2lvbiB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBnZXRFeHBlY3RPcGVyYW5kcyhleHByZXNzaW9uKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRFeHBlY3RPcGVyYW5kcyhcclxuICBleHByZXNzaW9uOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb24sXHJcbik6IEFzc2VydGlvbk9wZXJhbmRzIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoXHJcbiAgICBleHByZXNzaW9uLmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxyXG4gICAgZXhwcmVzc2lvbi5jYWxsZWUubmFtZSA9PT0gXCJleHBlY3RcIlxyXG4gICkge1xyXG4gICAgY29uc3QgW2FjdHVhbF0gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcclxuICAgIHJldHVybiBhY3R1YWw/LnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiXHJcbiAgICAgID8geyBhY3R1YWw6IHZvaWQgMCwgZXhwZWN0ZWQ6IHZvaWQgMCB9XHJcbiAgICAgIDogeyBhY3R1YWwsIGV4cGVjdGVkOiB2b2lkIDAgfTtcclxuICB9XHJcblxyXG4gIGlmIChcclxuICAgIGV4cHJlc3Npb24uY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXHJcbiAgICBleHByZXNzaW9uLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiXHJcbiAgKSB7XHJcbiAgICBjb25zdCBuZXN0ZWRPcGVyYW5kcyA9IGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24uY2FsbGVlLm9iamVjdCk7XHJcbiAgICBpZiAobmVzdGVkT3BlcmFuZHMgPT09IHZvaWQgMCkge1xyXG4gICAgICByZXR1cm4gdm9pZCAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgW2V4cGVjdGVkXSA9IGV4cHJlc3Npb24uYXJndW1lbnRzO1xyXG4gICAgcmV0dXJuIGV4cGVjdGVkPy50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIlxyXG4gICAgICA/IG5lc3RlZE9wZXJhbmRzXHJcbiAgICAgIDogeyBhY3R1YWw6IG5lc3RlZE9wZXJhbmRzLmFjdHVhbCwgZXhwZWN0ZWQgfTtcclxuICB9XHJcbiAgcmV0dXJuIHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgYW4gaWRlbnRpZmllciBuYW1lLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGdldElkZW50aWZpZXJOYW1lKGV4cHJlc3Npb24pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldElkZW50aWZpZXJOYW1lKFxyXG4gIGV4cHJlc3Npb246IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkLFxyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIHJldHVybiBleHByZXNzaW9uPy50eXBlID09PSBcIklkZW50aWZpZXJcIiA/IGV4cHJlc3Npb24ubmFtZSA6IHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgYSBzdGF0ZW1lbnQgZXhwcmVzc2lvbi5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZ2V0U3RhdGVtZW50RXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldFN0YXRlbWVudEV4cHJlc3Npb24oXHJcbiAgc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50LFxyXG4pOiBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKHN0YXRlbWVudC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xyXG4gICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uO1xyXG4gIH1cclxuICBpZiAoXHJcbiAgICBzdGF0ZW1lbnQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIgJiZcclxuICAgIHN0YXRlbWVudC5kZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxXHJcbiAgKSB7XHJcbiAgICBjb25zdCBbZGVjbGFyYXRpb25dID0gc3RhdGVtZW50LmRlY2xhcmF0aW9ucztcclxuICAgIHJldHVybiBkZWNsYXJhdGlvbj8uaW5pdCBhcyBFU1RyZWUuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcmV0dXJuIHZvaWQgMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYXNzZXJ0aW9ucy5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaGFzQXNzZXJ0aW9uKHN0YXRlbWVudCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gaGFzQXNzZXJ0aW9uKHN0YXRlbWVudDogRVNUcmVlLlN0YXRlbWVudCk6IGJvb2xlYW4ge1xyXG4gIGxldCBmb3VuZEFzc2VydGlvbiA9IGZhbHNlO1xyXG4gIHZpc2l0Tm9kZShzdGF0ZW1lbnQsIChub2RlKSA9PiB7XHJcbiAgICBpZiAobm9kZS50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgJiYgaXNBc3NlcnRpb25DYWxsKG5vZGUpKSB7XHJcbiAgICAgIGZvdW5kQXNzZXJ0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gZm91bmRBc3NlcnRpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3Mgd2hldGhlciBhbiBhc3NlcnRpb24gZXZhbHVhdGVzIHRoZSBhY3R1YWwgb3BlcmFuZCBpbmxpbmUuXHJcbiAqIEBwYXJhbSBleHByZXNzaW9uIEFzc2VydGlvbiBjYWxsIGV4cHJlc3Npb24gdG8gaW5zcGVjdC5cclxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gYWN0dWFsIG9wZXJhbmQgcGVyZm9ybXMgYWN0aW9uLWxpa2Ugd29yay5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBhY3R1YWwgPSBoYXNFdmFsdWF0ZWRBc3NlcnRpb25BY3R1YWwoZXhwcmVzc2lvbik7XHJcbiAqIHZvaWQgYWN0dWFsO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGhhc0V2YWx1YXRlZEFzc2VydGlvbkFjdHVhbChcclxuICBleHByZXNzaW9uOiBFU1RyZWUuQ2FsbEV4cHJlc3Npb24sXHJcbik6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IG9wZXJhbmRzID1cclxuICAgIGdldEV4cGVjdE9wZXJhbmRzKGV4cHJlc3Npb24pID8/IGdldEFzc2VydE9wZXJhbmRzKGV4cHJlc3Npb24pO1xyXG5cclxuICByZXR1cm4gb3BlcmFuZHMgIT09IHZvaWQgMCAmJiBpc0FjdGlvbkV4cHJlc3Npb24ob3BlcmFuZHMuYWN0dWFsKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYWN0aW9uIGV4cHJlc3Npb25zLlxyXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBJbnB1dCBleHByZXNzaW9uIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGlzQWN0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FjdGlvbkV4cHJlc3Npb24oXHJcbiAgZXhwcmVzc2lvbjogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQsXHJcbik6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gIHJldHVybiAoXHJcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkF3YWl0RXhwcmVzc2lvblwiIHx8XHJcbiAgICB1bndyYXBwZWRFeHByZXNzaW9uPy50eXBlID09PSBcIkNhbGxFeHByZXNzaW9uXCIgfHxcclxuICAgIHVud3JhcHBlZEV4cHJlc3Npb24/LnR5cGUgPT09IFwiTmV3RXhwcmVzc2lvblwiXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgYXNzZXJ0aW9uIGNhbGxzLlxyXG4gKiBAcGFyYW0gbm9kZSBJbnB1dCBub2RlIHZhbHVlLlxyXG4gKiBAcmV0dXJucyBSZXR1cm4gdmFsdWUgb3V0cHV0LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGlzQXNzZXJ0aW9uQ2FsbChub2RlKTtcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Fzc2VydGlvbkNhbGwobm9kZTogRVNUcmVlLkNhbGxFeHByZXNzaW9uKTogYm9vbGVhbiB7XHJcbiAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XHJcbiAgICByZXR1cm4gbm9kZS5jYWxsZWUubmFtZSA9PT0gXCJleHBlY3RcIiB8fCBub2RlLmNhbGxlZS5uYW1lID09PSBcImFzc2VydFwiO1xyXG4gIH1cclxuICBpZiAobm9kZS5jYWxsZWUudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgaWYgKFxyXG4gICAgbm9kZS5jYWxsZWUub2JqZWN0LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXHJcbiAgICBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gXCJhc3NlcnRcIlxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHJldHVybiAoXHJcbiAgICBub2RlLmNhbGxlZS5vYmplY3QudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiICYmXHJcbiAgICBpc0Fzc2VydGlvbkNhbGwobm9kZS5jYWxsZWUub2JqZWN0KVxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgQXNzZXJ0IHN0YXRlbWVudCB2YWxpZGl0eS5cclxuICogQHBhcmFtIHN0YXRlbWVudCBJbnB1dCBzdGF0ZW1lbnQgdmFsdWUuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaXNWYWxpZEFzc2VydFN0YXRlbWVudChzdGF0ZW1lbnQpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQoc3RhdGVtZW50OiBFU1RyZWUuU3RhdGVtZW50KTogYm9vbGVhbiB7XHJcbiAgaWYgKGhhc0Fzc2VydGlvbihzdGF0ZW1lbnQpKSB7XHJcbiAgICBjb25zdCBhc3NlcnRpb25FeHByZXNzaW9uID0gZ2V0QXNzZXJ0aW9uRXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIGFzc2VydGlvbkV4cHJlc3Npb24gPT09IHZvaWQgMCB8fFxyXG4gICAgICAhaGFzRXZhbHVhdGVkQXNzZXJ0aW9uQWN0dWFsKGFzc2VydGlvbkV4cHJlc3Npb24pXHJcbiAgICApO1xyXG4gIH1cclxuICBpZiAoc3RhdGVtZW50LnR5cGUgIT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gc3RhdGVtZW50LmRlY2xhcmF0aW9ucy5ldmVyeSgoZGVjbGFyYXRpb24pID0+IHtcclxuICAgIGlmIChkZWNsYXJhdGlvbi5pbml0ID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICFpc0FjdGlvbkV4cHJlc3Npb24odW53cmFwRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0KSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVbndyYXBzIG5lc3RlZCBleHByZXNzaW9ucy5cclxuICogQHBhcmFtIGV4cHJlc3Npb24gSW5wdXQgZXhwcmVzc2lvbiB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiB1bndyYXBFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIHVud3JhcEV4cHJlc3Npb24oXHJcbiAgZXhwcmVzc2lvbjogRVNUcmVlLkV4cHJlc3Npb24gfCB1bmRlZmluZWQsXHJcbik6IEVTVHJlZS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoZXhwcmVzc2lvbj8udHlwZSA9PT0gXCJDaGFpbkV4cHJlc3Npb25cIikge1xyXG4gICAgcmV0dXJuIHVud3JhcEV4cHJlc3Npb24oZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcclxuICB9XHJcbiAgaWYgKGV4cHJlc3Npb24/LnR5cGUgPT09IFwiQXdhaXRFeHByZXNzaW9uXCIpIHtcclxuICAgIHJldHVybiBleHByZXNzaW9uLmFyZ3VtZW50O1xyXG4gIH1cclxuICByZXR1cm4gZXhwcmVzc2lvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBBQUEgbmFtaW5nIHByZWZpeGVzLlxyXG4gKiBAcGFyYW0gbmFtZSBJbnB1dCBuYW1lIHZhbHVlLlxyXG4gKiBAcGFyYW0gcHJlZml4IElucHV0IHByZWZpeCB2YWx1ZS5cclxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiB1c2VzUHJlZml4KFwiYWN0dWFsUmVzdWx0XCIsIFwiYWN0dWFsXCIpO1xyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIHVzZXNQcmVmaXgobmFtZTogc3RyaW5nLCBwcmVmaXg6IFwiYWN0dWFsXCIgfCBcImV4cGVjdGVkXCIpOiBib29sZWFuIHtcclxuICByZXR1cm4gbmFtZSA9PT0gcHJlZml4IHx8IG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpO1xyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGdldEFzc2VydERlY2xhcmVkSWRlbnRpZmllcnMsXHJcbiAgZ2V0QXNzZXJ0aW9uSWRlbnRpZmllcnMsXHJcbiAgZ2V0U3RhdGVtZW50RXhwcmVzc2lvbixcclxuICBoYXNBc3NlcnRpb24sXHJcbiAgaXNBY3Rpb25FeHByZXNzaW9uLFxyXG4gIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQsXHJcbiAgdW53cmFwRXhwcmVzc2lvbixcclxuICB1c2VzUHJlZml4LFxyXG59O1xyXG5leHBvcnQgdHlwZSB7IEFzc2VydGlvbklkZW50aWZpZXJzIH07XHJcbiJdfQ==
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZXIuYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb21haW4vdGVzdGluZy9hYWEvYW5hbHl6ZXIuYXNzZXJ0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsNEJBQTRCLElBQUksMENBQTBDLEVBQzFFLHVCQUF1QixJQUFJLHFDQUFxQyxFQUNoRSxzQkFBc0IsSUFBSSxvQ0FBb0MsRUFDOUQsWUFBWSxJQUFJLDBCQUEwQixFQUMxQyxrQkFBa0IsSUFBSSxnQ0FBZ0MsRUFDdEQsc0JBQXNCLElBQUksb0NBQW9DLEVBQzlELGdCQUFnQixJQUFJLDhCQUE4QixFQUNsRCxVQUFVLElBQUksd0JBQXdCLEdBQ3ZDLE1BQU0sK0JBQStCLENBQUM7QUFFdkM7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsT0FBTyxDQUNkLGNBQXVEO0lBRXZELE9BQU8sQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELGtFQUFrRTtBQUNsRSxNQUFNLDRCQUE0QixHQUFHLE9BQU8sQ0FDMUMsMENBQTBDLENBQzNDLENBQUM7QUFFRiwrREFBK0Q7QUFDL0QsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQztBQUUvRSxpRUFBaUU7QUFDakUsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUU3RSw2REFBNkQ7QUFDN0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFekQsc0VBQXNFO0FBQ3RFLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFFckUsb0VBQW9FO0FBQ3BFLE1BQU0sc0JBQXNCLEdBQUcsT0FBTyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7QUFFN0UsK0RBQStEO0FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7QUFFakUsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRXJELE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsVUFBVSxHQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIGdldEFzc2VydERlY2xhcmVkSWRlbnRpZmllcnMgYXMgZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVyc0ltcGxlbWVudGF0aW9uLFxyXG4gIGdldEFzc2VydGlvbklkZW50aWZpZXJzIGFzIGdldEFzc2VydGlvbklkZW50aWZpZXJzSW1wbGVtZW50YXRpb24sXHJcbiAgZ2V0U3RhdGVtZW50RXhwcmVzc2lvbiBhcyBnZXRTdGF0ZW1lbnRFeHByZXNzaW9uSW1wbGVtZW50YXRpb24sXHJcbiAgaGFzQXNzZXJ0aW9uIGFzIGhhc0Fzc2VydGlvbkltcGxlbWVudGF0aW9uLFxyXG4gIGlzQWN0aW9uRXhwcmVzc2lvbiBhcyBpc0FjdGlvbkV4cHJlc3Npb25JbXBsZW1lbnRhdGlvbixcclxuICBpc1ZhbGlkQXNzZXJ0U3RhdGVtZW50IGFzIGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnRJbXBsZW1lbnRhdGlvbixcclxuICB1bndyYXBFeHByZXNzaW9uIGFzIHVud3JhcEV4cHJlc3Npb25JbXBsZW1lbnRhdGlvbixcclxuICB1c2VzUHJlZml4IGFzIHVzZXNQcmVmaXhJbXBsZW1lbnRhdGlvbixcclxufSBmcm9tIFwiLi9hbmFseXplci5hc3NlcnRpb25zLmhlbHBlcnNcIjtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbG9jYWwgZm9yd2FyZGluZyBmdW5jdGlvbiBmb3IgYW4gaW1wb3J0ZWQgYW5hbHl6ZXIgaGVscGVyLlxyXG4gKiBAdGVtcGxhdGUgVFBhcmFtZXRlcnMgRm9yd2FyZGVkIHBhcmFtZXRlciB0dXBsZS5cclxuICogQHRlbXBsYXRlIFRSZXN1bHQgRm9yd2FyZGVkIHJldHVybiB0eXBlLlxyXG4gKiBAcGFyYW0gaW1wbGVtZW50YXRpb24gSW1wb3J0ZWQgaGVscGVyIGltcGxlbWVudGF0aW9uLlxyXG4gKiBAcmV0dXJucyBMb2NhbCBmdW5jdGlvbiB0aGF0IGZvcndhcmRzIGFsbCBhcmd1bWVudHMgdG8gdGhlIGltcGxlbWVudGF0aW9uLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGxvY2FsSGVscGVyID0gZm9yd2FyZChpbXBsZW1lbnRhdGlvbik7XHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gZm9yd2FyZDxUUGFyYW1ldGVycyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXHJcbiAgaW1wbGVtZW50YXRpb246ICguLi5wYXJhbWV0ZXJzOiBUUGFyYW1ldGVycykgPT4gVFJlc3VsdCxcclxuKTogKC4uLnBhcmFtZXRlcnM6IFRQYXJhbWV0ZXJzKSA9PiBUUmVzdWx0IHtcclxuICByZXR1cm4gKC4uLnBhcmFtZXRlcnMpID0+IGltcGxlbWVudGF0aW9uKC4uLnBhcmFtZXRlcnMpO1xyXG59XHJcblxyXG4vKiogQ29sbGVjdHMgYWxsIGRlY2xhcmVkIGlkZW50aWZpZXJzIGZyb20gYW4gYXNzZXJ0IHN0YXRlbWVudC4gKi9cclxuY29uc3QgZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyA9IGZvcndhcmQoXHJcbiAgZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVyc0ltcGxlbWVudGF0aW9uLFxyXG4pO1xyXG5cclxuLyoqIFJlc29sdmVzIHRoZSBpZGVudGlmaWVyIG5hbWVzIHVzZWQgaW4gYW4gYXNzZXJ0aW9uIGNhbGwuICovXHJcbmNvbnN0IGdldEFzc2VydGlvbklkZW50aWZpZXJzID0gZm9yd2FyZChnZXRBc3NlcnRpb25JZGVudGlmaWVyc0ltcGxlbWVudGF0aW9uKTtcclxuXHJcbi8qKiBFeHRyYWN0cyB0aGUgZXhwcmVzc2lvbiBmcm9tIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IG5vZGUuICovXHJcbmNvbnN0IGdldFN0YXRlbWVudEV4cHJlc3Npb24gPSBmb3J3YXJkKGdldFN0YXRlbWVudEV4cHJlc3Npb25JbXBsZW1lbnRhdGlvbik7XHJcblxyXG4vKiogQ2hlY2tzIHdoZXRoZXIgYSBzdGF0ZW1lbnQgY29udGFpbnMgYW4gYXNzZXJ0aW9uIGNhbGwuICovXHJcbmNvbnN0IGhhc0Fzc2VydGlvbiA9IGZvcndhcmQoaGFzQXNzZXJ0aW9uSW1wbGVtZW50YXRpb24pO1xyXG5cclxuLyoqIENoZWNrcyB3aGV0aGVyIGFuIGV4cHJlc3Npb24gaXMgYW4gQWN0LXBoYXNlIGFjdGlvbiBleHByZXNzaW9uLiAqL1xyXG5jb25zdCBpc0FjdGlvbkV4cHJlc3Npb24gPSBmb3J3YXJkKGlzQWN0aW9uRXhwcmVzc2lvbkltcGxlbWVudGF0aW9uKTtcclxuXHJcbi8qKiBDaGVja3Mgd2hldGhlciBhIHN0YXRlbWVudCBpcyBhIHZhbGlkIEFzc2VydC1waGFzZSBhc3NlcnRpb24uICovXHJcbmNvbnN0IGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnQgPSBmb3J3YXJkKGlzVmFsaWRBc3NlcnRTdGF0ZW1lbnRJbXBsZW1lbnRhdGlvbik7XHJcblxyXG4vKiogVW53cmFwcyBhIG5lc3RlZCBvciBjaGFpbmVkIGV4cHJlc3Npb24gdG8gaXRzIHJvb3QgY2FsbC4gKi9cclxuY29uc3QgdW53cmFwRXhwcmVzc2lvbiA9IGZvcndhcmQodW53cmFwRXhwcmVzc2lvbkltcGxlbWVudGF0aW9uKTtcclxuXHJcbi8qKiBDaGVja3Mgd2hldGhlciBhbiBhc3NlcnRpb24gY2FsbCB1c2VzIGEga25vd24gYXNzZXJ0aW9uIHByZWZpeC4gKi9cclxuY29uc3QgdXNlc1ByZWZpeCA9IGZvcndhcmQodXNlc1ByZWZpeEltcGxlbWVudGF0aW9uKTtcclxuXHJcbmV4cG9ydCB7XHJcbiAgZ2V0QXNzZXJ0RGVjbGFyZWRJZGVudGlmaWVycyxcclxuICBnZXRBc3NlcnRpb25JZGVudGlmaWVycyxcclxuICBnZXRTdGF0ZW1lbnRFeHByZXNzaW9uLFxyXG4gIGhhc0Fzc2VydGlvbixcclxuICBpc0FjdGlvbkV4cHJlc3Npb24sXHJcbiAgaXNWYWxpZEFzc2VydFN0YXRlbWVudCxcclxuICB1bndyYXBFeHByZXNzaW9uLFxyXG4gIHVzZXNQcmVmaXgsXHJcbn07XHJcbiJdfQ==
@@ -0,0 +1,64 @@
1
+ import type * as ESTree from "estree";
2
+ /** Raw assertion operands extracted from a call expression. */
3
+ interface AssertionOperands {
4
+ /** Expression used as the actual operand. */
5
+ actual: ESTree.Expression | undefined;
6
+ /** Expression used as the expected operand. */
7
+ expected: ESTree.Expression | undefined;
8
+ }
9
+ /**
10
+ * Gets assert operands.
11
+ * @param expression Input expression value.
12
+ * @returns Return value output.
13
+ * @example
14
+ * ```typescript
15
+ * getAssertOperands(expression);
16
+ * ```
17
+ */
18
+ declare function getAssertOperands(expression: ESTree.CallExpression): AssertionOperands | undefined;
19
+ /**
20
+ * Gets expect operands.
21
+ * @param expression Input expression value.
22
+ * @returns Return value output.
23
+ * @example
24
+ * ```typescript
25
+ * getExpectOperands(expression);
26
+ * ```
27
+ */
28
+ declare function getExpectOperands(expression: ESTree.CallExpression): AssertionOperands | undefined;
29
+ /**
30
+ * Gets an identifier name.
31
+ * @param expression Input expression value.
32
+ * @returns Return value output.
33
+ * @example
34
+ * ```typescript
35
+ * getIdentifierName(expression);
36
+ * ```
37
+ */
38
+ declare function getIdentifierName(expression: ESTree.Expression | undefined): string | undefined;
39
+ /**
40
+ * Checks whether an assertion evaluates the actual operand inline.
41
+ * @param expression Assertion call expression to inspect.
42
+ * @param isActionExpression Predicate that identifies action-like expressions.
43
+ * @returns True when the assertion actual operand performs action-like work.
44
+ * @example
45
+ * ```typescript
46
+ * const actual = hasEvaluatedAssertionActual(expression, () => true);
47
+ * void actual;
48
+ * ```
49
+ */
50
+ declare function hasEvaluatedAssertionActual(expression: ESTree.CallExpression, isActionExpression: (expression: ESTree.Expression | undefined) => boolean): boolean;
51
+ /**
52
+ * Checks for assertion calls.
53
+ * @param node Input node value.
54
+ * @returns Return value output.
55
+ * @example
56
+ * ```typescript
57
+ * isAssertionCall(node);
58
+ * ```
59
+ */
60
+ declare function isAssertionCall(node: ESTree.CallExpression): boolean;
61
+ /** Companion marker for test isolation. */
62
+ declare const analyzerAssertionsOperandsCompanion: true;
63
+ export { analyzerAssertionsOperandsCompanion, getAssertOperands, getExpectOperands, getIdentifierName, hasEvaluatedAssertionActual, isAssertionCall, };
64
+ //# sourceMappingURL=analyzer.assertions.operands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.assertions.operands.d.ts","sourceRoot":"","sources":["../../../../src/domain/testing/aaa/analyzer.assertions.operands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEtC,+DAA+D;AAC/D,UAAU,iBAAiB;IACzB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IACtC,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,CACxB,UAAU,EAAE,MAAM,CAAC,cAAc,GAChC,iBAAiB,GAAG,SAAS,CAe/B;AAED;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,CACxB,UAAU,EAAE,MAAM,CAAC,cAAc,GAChC,iBAAiB,GAAG,SAAS,CA4B/B;AAED;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,CACxB,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GACxC,MAAM,GAAG,SAAS,CAEpB;AAED;;;;;;;;;;GAUG;AACH,iBAAS,2BAA2B,CAClC,UAAU,EAAE,MAAM,CAAC,cAAc,EACjC,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,KAAK,OAAO,GACzE,OAAO,CAKT;AAED;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAoB7D;AAED,2CAA2C;AAC3C,QAAA,MAAM,mCAAmC,EAAG,IAAa,CAAC;AAE1D,OAAO,EACL,mCAAmC,EACnC,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,GAChB,CAAC"}