@mablhq/mabl-cli 2.30.0 → 2.31.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/featureSet.js +5 -1
- package/api/mablApiClient.js +18 -0
- package/commands/tests/tests_cmds/import_cmds/import_playwright.js +2 -3
- package/commands/tests/tests_cmds/import_cmds/import_selenium.js +1 -1
- package/execution/index.js +2 -2
- package/mablscript/actions/ConditionAction.js +59 -26
- package/mablscript/steps/AssertStep.js +29 -6
- package/mablscript/steps/IfConditionStep.js +6 -7
- package/mablscript/types/ConditionDescriptor.js +54 -1
- package/mablscript/types/ExtractDescriptor.js +1 -0
- package/package.json +1 -1
|
@@ -7,72 +7,105 @@ const ConditionDescriptor_1 = require("../types/ConditionDescriptor");
|
|
|
7
7
|
class ConditionAction extends MablAction_1.MablAction {
|
|
8
8
|
constructor(name, args) {
|
|
9
9
|
super(name, name, args);
|
|
10
|
-
this.
|
|
11
|
-
this.conditionValueAttribute = '';
|
|
12
|
-
this.setConditionAttributes();
|
|
10
|
+
this.hasOptionsAtInstantiation = false;
|
|
13
11
|
this.conditionDescriptor = this.getConditionDescriptor();
|
|
14
12
|
}
|
|
15
|
-
setConditionAttributes() {
|
|
16
|
-
const conditionActionArgs = this.getActionArgs();
|
|
17
|
-
if (conditionActionArgs) {
|
|
18
|
-
[this.conditionAttribute, this.conditionValueAttribute, this.options] =
|
|
19
|
-
this.getActionArgs();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
13
|
getConditionDescriptor() {
|
|
23
14
|
switch (this.name) {
|
|
24
15
|
case 'evaluate_condition':
|
|
25
16
|
return this.getEvaluateCondition();
|
|
26
17
|
case 'evaluate_presence':
|
|
27
18
|
return this.getEvaluatePresence();
|
|
19
|
+
case 'evaluate_ai_prompt':
|
|
20
|
+
return this.getEvaluateAIPrompt();
|
|
28
21
|
default:
|
|
29
22
|
throw new Error(`Unexpected condition name: ${this.name}`);
|
|
30
23
|
}
|
|
31
24
|
}
|
|
32
25
|
getEvaluateCondition() {
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
const conditionActionArgs = this.getActionArgs();
|
|
27
|
+
let conditionAttribute;
|
|
28
|
+
let conditionValueAttribute;
|
|
29
|
+
let options;
|
|
30
|
+
if (conditionActionArgs) {
|
|
31
|
+
[conditionAttribute, conditionValueAttribute, options] =
|
|
32
|
+
this.getActionArgs();
|
|
33
|
+
}
|
|
34
|
+
if (conditionValueAttribute === undefined) {
|
|
35
35
|
throw new Error('Invalid equality condition. Missing value to compare.');
|
|
36
36
|
}
|
|
37
|
+
if (conditionAttribute === undefined) {
|
|
38
|
+
throw new Error('Invalid equality condition. Missing comparison type.');
|
|
39
|
+
}
|
|
40
|
+
if (options) {
|
|
41
|
+
this.hasOptionsAtInstantiation = true;
|
|
42
|
+
}
|
|
37
43
|
return {
|
|
38
44
|
conditionType: ConditionDescriptor_1.ConditionType.Comparison,
|
|
39
|
-
comparisonType: ConditionDescriptor_1.ComparisonType.fromString(
|
|
40
|
-
comparatorValue: (0, MablAction_1.parseArgument)(
|
|
41
|
-
caseInsensitive:
|
|
45
|
+
comparisonType: ConditionDescriptor_1.ComparisonType.fromString(conditionAttribute),
|
|
46
|
+
comparatorValue: (0, MablAction_1.parseArgument)(conditionValueAttribute),
|
|
47
|
+
caseInsensitive: options === null || options === void 0 ? void 0 : options.caseInsensitive,
|
|
42
48
|
};
|
|
43
49
|
}
|
|
44
50
|
getEvaluatePresence() {
|
|
45
|
-
|
|
51
|
+
const conditionActionArgs = this.getActionArgs();
|
|
52
|
+
let conditionAttribute;
|
|
53
|
+
if (conditionActionArgs) {
|
|
54
|
+
[conditionAttribute] = this.getActionArgs();
|
|
55
|
+
}
|
|
56
|
+
if (!conditionAttribute) {
|
|
46
57
|
throw new Error('Invalid evaluate presence condition. Missing evaluation_type.');
|
|
47
58
|
}
|
|
48
59
|
return {
|
|
49
60
|
conditionType: ConditionDescriptor_1.ConditionType.Presence,
|
|
50
|
-
presenceType: ConditionDescriptor_1.PresenceEvaluationType.fromString(
|
|
61
|
+
presenceType: ConditionDescriptor_1.PresenceEvaluationType.fromString(conditionAttribute),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
getEvaluateAIPrompt() {
|
|
65
|
+
const conditionActionArgs = this.getActionArgs();
|
|
66
|
+
let userPrompt;
|
|
67
|
+
let metaPrompt;
|
|
68
|
+
if (conditionActionArgs) {
|
|
69
|
+
[userPrompt, metaPrompt] = this.getActionArgs();
|
|
70
|
+
}
|
|
71
|
+
if (userPrompt === undefined) {
|
|
72
|
+
throw new Error('Invalid ai prompt condition. Missing user prompt');
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
conditionType: ConditionDescriptor_1.ConditionType.AIPrompt,
|
|
76
|
+
userPrompt,
|
|
77
|
+
metaPrompt,
|
|
51
78
|
};
|
|
52
79
|
}
|
|
53
80
|
generateEvaluateConditionMablscript() {
|
|
81
|
+
var _a;
|
|
82
|
+
const comparatorValue = (0, ConditionDescriptor_1.getOptionalComparatorValue)(this.conditionDescriptor);
|
|
54
83
|
let value = '';
|
|
55
|
-
if (
|
|
56
|
-
if (!(0, MablAction_1.argumentIsMablVariable)(
|
|
57
|
-
value = `, "${(0, domUtil_1.escapeMablscriptString)(
|
|
84
|
+
if (comparatorValue !== undefined) {
|
|
85
|
+
if (!(0, MablAction_1.argumentIsMablVariable)(comparatorValue)) {
|
|
86
|
+
value = `, "${(0, domUtil_1.escapeMablscriptString)(comparatorValue)}"`;
|
|
58
87
|
}
|
|
59
88
|
else {
|
|
60
|
-
value = `, ${this.subVariable(
|
|
89
|
+
value = `, ${this.subVariable(comparatorValue)}`;
|
|
61
90
|
}
|
|
62
91
|
}
|
|
63
|
-
const conditionOptionsString = this.
|
|
64
|
-
? `, ${(0, MablAction_1.convertObjectToMablscriptArgs)(this.
|
|
92
|
+
const conditionOptionsString = this.hasOptionsAtInstantiation
|
|
93
|
+
? `, ${(0, MablAction_1.convertObjectToMablscriptArgs)((_a = (0, ConditionDescriptor_1.getOptionalConditionOptions)(this.conditionDescriptor)) !== null && _a !== void 0 ? _a : {})}`
|
|
65
94
|
: '';
|
|
66
|
-
return `${this.name}("${this.
|
|
95
|
+
return `${this.name}("${(0, ConditionDescriptor_1.getAssertionConditionFieldFromDescriptor)(this.conditionDescriptor)}"${value}${conditionOptionsString})`;
|
|
67
96
|
}
|
|
68
97
|
toMablscript() {
|
|
69
98
|
return `${this.generateEvaluateConditionMablscript()}`;
|
|
70
99
|
}
|
|
71
100
|
getInputVariables() {
|
|
72
101
|
var _a;
|
|
73
|
-
return MablAction_1.MablAction.findUniqueVariableReferencesInValue((_a = this.
|
|
102
|
+
return MablAction_1.MablAction.findUniqueVariableReferencesInValue((_a = (0, ConditionDescriptor_1.getOptionalComparatorValue)(this.conditionDescriptor)) !== null && _a !== void 0 ? _a : '');
|
|
74
103
|
}
|
|
75
104
|
}
|
|
76
105
|
exports.ConditionAction = ConditionAction;
|
|
77
|
-
ConditionAction.mablScriptStepNames = [
|
|
106
|
+
ConditionAction.mablScriptStepNames = [
|
|
107
|
+
'evaluate_condition',
|
|
108
|
+
'evaluate_presence',
|
|
109
|
+
'evaluate_ai_prompt',
|
|
110
|
+
];
|
|
78
111
|
ConditionAction.yamlMablScriptNames = ['ConditionAction'];
|
|
@@ -52,9 +52,14 @@ class AssertStep extends MablStep_1.MablStep {
|
|
|
52
52
|
else {
|
|
53
53
|
this.conditionAction = actions[1];
|
|
54
54
|
}
|
|
55
|
-
this.
|
|
56
|
-
.
|
|
57
|
-
|
|
55
|
+
this.userPrompt = (0, ConditionDescriptor_1.isAIPromptCondition)(this.conditionAction.conditionDescriptor)
|
|
56
|
+
? this.conditionAction.conditionDescriptor.userPrompt
|
|
57
|
+
: undefined;
|
|
58
|
+
this.metaPrompt = (0, ConditionDescriptor_1.isAIPromptCondition)(this.conditionAction.conditionDescriptor)
|
|
59
|
+
? this.conditionAction.conditionDescriptor.metaPrompt
|
|
60
|
+
: undefined;
|
|
61
|
+
this.assertionType = (0, ConditionDescriptor_1.getAssertionConditionFieldFromDescriptor)(this.conditionAction.conditionDescriptor);
|
|
62
|
+
this.assertionValue = (0, ConditionDescriptor_1.getOptionalComparatorValue)(this.conditionAction.conditionDescriptor);
|
|
58
63
|
this.isWaitUntilStep = this.determineIfWaitUntilStep();
|
|
59
64
|
this.assertArguments =
|
|
60
65
|
args[0] && typeof args[0] === 'object'
|
|
@@ -135,6 +140,12 @@ class AssertStep extends MablStep_1.MablStep {
|
|
|
135
140
|
if (this.assertionValue !== undefined) {
|
|
136
141
|
formatted.assertionValue = this.assertionValue;
|
|
137
142
|
}
|
|
143
|
+
if (this.userPrompt !== undefined) {
|
|
144
|
+
formatted.userPrompt = this.userPrompt;
|
|
145
|
+
}
|
|
146
|
+
if (this.metaPrompt !== undefined) {
|
|
147
|
+
formatted.metaPrompt = this.metaPrompt;
|
|
148
|
+
}
|
|
138
149
|
const targetDescriptor = this.primaryAction.toDescriptor();
|
|
139
150
|
if ((0, GetVariableDescriptor_1.isGetVariableDescriptor)(targetDescriptor)) {
|
|
140
151
|
formatted.target = (0, GetVariableDescriptor_1.convertGetVariableDescriptorToYaml)(targetDescriptor);
|
|
@@ -142,8 +153,8 @@ class AssertStep extends MablStep_1.MablStep {
|
|
|
142
153
|
else {
|
|
143
154
|
formatted.target = targetDescriptor;
|
|
144
155
|
}
|
|
145
|
-
if (this.conditionAction.
|
|
146
|
-
formatted.conditionOptions = this.conditionAction.
|
|
156
|
+
if (this.conditionAction.hasOptionsAtInstantiation) {
|
|
157
|
+
formatted.conditionOptions = (0, ConditionDescriptor_1.getOptionalConditionOptions)(this.conditionAction.conditionDescriptor);
|
|
147
158
|
}
|
|
148
159
|
if (!!((_a = this.assertArguments) === null || _a === void 0 ? void 0 : _a.observationScope) ||
|
|
149
160
|
!!((_b = this.assertArguments) === null || _b === void 0 ? void 0 : _b.onFailure)) {
|
|
@@ -191,7 +202,13 @@ class AssertStep extends MablStep_1.MablStep {
|
|
|
191
202
|
throw new Error(`Error parsing [${stepName}] with incompatible step arguments`);
|
|
192
203
|
}
|
|
193
204
|
actions.push(primaryAction);
|
|
194
|
-
if (assertionType === '
|
|
205
|
+
if (assertionType === 'ai_prompt') {
|
|
206
|
+
actions.push(new ConditionAction_1.ConditionAction('evaluate_ai_prompt', [
|
|
207
|
+
stepArgs.userPrompt,
|
|
208
|
+
stepArgs.metaPrompt,
|
|
209
|
+
]));
|
|
210
|
+
}
|
|
211
|
+
else if (assertionType === 'present' || assertionType === 'not_present') {
|
|
195
212
|
actions.push(new ConditionAction_1.ConditionAction('evaluate_presence', [assertionType]));
|
|
196
213
|
}
|
|
197
214
|
else if (stepName === 'WaitUntil') {
|
|
@@ -241,6 +258,12 @@ class AssertStep extends MablStep_1.MablStep {
|
|
|
241
258
|
this.assertionType === 'not_present') {
|
|
242
259
|
return `${this.primaryAction.generateFindMablscript()}.evaluate_presence("${this.assertionType}")${assertAction}`;
|
|
243
260
|
}
|
|
261
|
+
if (this.assertionType === 'ai_prompt') {
|
|
262
|
+
if (this.metaPrompt === undefined) {
|
|
263
|
+
return `${this.primaryAction.generateFindMablscript()}.evaluate_ai_prompt("${this.userPrompt}")${assertAction}`;
|
|
264
|
+
}
|
|
265
|
+
return `${this.primaryAction.generateFindMablscript()}.evaluate_ai_prompt("${this.userPrompt}", "${this.metaPrompt}")${assertAction}`;
|
|
266
|
+
}
|
|
244
267
|
return `${this.primaryAction.toMablscript()}.${this.conditionAction.toMablscript()}${assertAction}`;
|
|
245
268
|
}
|
|
246
269
|
getInputVariables() {
|
|
@@ -61,13 +61,12 @@ class IfConditionStep extends MablStep_1.MablStep {
|
|
|
61
61
|
};
|
|
62
62
|
if (this.conditionAction) {
|
|
63
63
|
details.condition =
|
|
64
|
-
ConditionDescriptor_1.AssertionConditionFieldToStepName[this.conditionAction.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
64
|
+
ConditionDescriptor_1.AssertionConditionFieldToStepName[(0, ConditionDescriptor_1.getAssertionConditionFieldFromDescriptor)(this.conditionAction.conditionDescriptor)];
|
|
65
|
+
details.conditionValue = (0, ConditionDescriptor_1.getOptionalComparatorValue)(this.conditionAction.conditionDescriptor);
|
|
66
|
+
const optionalConditionOptions = (0, ConditionDescriptor_1.getOptionalConditionOptions)(this.conditionAction.conditionDescriptor);
|
|
67
|
+
details.conditionOptions = this.conditionAction.hasOptionsAtInstantiation
|
|
68
|
+
? optionalConditionOptions
|
|
69
|
+
: undefined;
|
|
71
70
|
}
|
|
72
71
|
if (this.primaryAction instanceof GetVariableValue_1.GetVariableValue) {
|
|
73
72
|
details.variableName = this.substituteMablscriptVariable(this.primaryAction.variable);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AssertionConditionFieldToStepName = exports.AssertionConditionFieldToCondition = exports.AssertionStepNameToField = exports.PresenceEvaluationType = exports.isAbsenceExpected = exports.isPresenceCondition = exports.ComparisonType = exports.ConditionType = void 0;
|
|
3
|
+
exports.AssertionConditionFieldToStepName = exports.AssertionConditionFieldToCondition = exports.AssertionStepNameToField = exports.getAssertionConditionFieldFromDescriptor = exports.PresenceEvaluationType = exports.isAbsenceExpected = exports.isAIPromptCondition = exports.isPresenceCondition = exports.getOptionalConditionOptions = exports.getOptionalComparatorValue = exports.getOptionalComparisonType = exports.ComparisonType = exports.ConditionType = void 0;
|
|
4
4
|
var ConditionType;
|
|
5
5
|
(function (ConditionType) {
|
|
6
|
+
ConditionType["AIPrompt"] = "ai_prompt";
|
|
6
7
|
ConditionType["Comparison"] = "comparison";
|
|
7
8
|
ConditionType["Presence"] = "presence";
|
|
8
9
|
ConditionType["Truthy"] = "truthy";
|
|
@@ -32,10 +33,45 @@ var ComparisonType;
|
|
|
32
33
|
}
|
|
33
34
|
ComparisonType.fromString = fromString;
|
|
34
35
|
})(ComparisonType || (exports.ComparisonType = ComparisonType = {}));
|
|
36
|
+
function getOptionalComparisonType(descriptor) {
|
|
37
|
+
if (descriptor === undefined) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (descriptor.conditionType === ConditionType.Comparison) {
|
|
41
|
+
return descriptor.comparisonType;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
exports.getOptionalComparisonType = getOptionalComparisonType;
|
|
46
|
+
function getOptionalComparatorValue(descriptor) {
|
|
47
|
+
if (descriptor === undefined) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (descriptor.conditionType === ConditionType.Comparison) {
|
|
51
|
+
return descriptor.comparatorValue.toString();
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
exports.getOptionalComparatorValue = getOptionalComparatorValue;
|
|
56
|
+
function getOptionalConditionOptions(descriptor) {
|
|
57
|
+
if (descriptor === undefined ||
|
|
58
|
+
descriptor.conditionType !== ConditionType.Comparison) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
if (descriptor.caseInsensitive !== undefined) {
|
|
62
|
+
return { caseInsensitive: descriptor.caseInsensitive };
|
|
63
|
+
}
|
|
64
|
+
return {};
|
|
65
|
+
}
|
|
66
|
+
exports.getOptionalConditionOptions = getOptionalConditionOptions;
|
|
35
67
|
function isPresenceCondition(value) {
|
|
36
68
|
return value.conditionType === ConditionType.Presence;
|
|
37
69
|
}
|
|
38
70
|
exports.isPresenceCondition = isPresenceCondition;
|
|
71
|
+
function isAIPromptCondition(value) {
|
|
72
|
+
return value.conditionType === ConditionType.AIPrompt;
|
|
73
|
+
}
|
|
74
|
+
exports.isAIPromptCondition = isAIPromptCondition;
|
|
39
75
|
function isAbsenceExpected(value) {
|
|
40
76
|
return (isPresenceCondition(value) &&
|
|
41
77
|
value.presenceType === PresenceEvaluationType.NOT_PRESENT);
|
|
@@ -56,6 +92,22 @@ var PresenceEvaluationType;
|
|
|
56
92
|
}
|
|
57
93
|
PresenceEvaluationType.fromString = fromString;
|
|
58
94
|
})(PresenceEvaluationType || (exports.PresenceEvaluationType = PresenceEvaluationType = {}));
|
|
95
|
+
function getAssertionConditionFieldFromDescriptor(conditionDescriptor) {
|
|
96
|
+
if (conditionDescriptor === undefined) {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
if (conditionDescriptor.conditionType === ConditionType.Comparison) {
|
|
100
|
+
return conditionDescriptor.comparisonType;
|
|
101
|
+
}
|
|
102
|
+
if (conditionDescriptor.conditionType === ConditionType.Presence) {
|
|
103
|
+
return conditionDescriptor.presenceType;
|
|
104
|
+
}
|
|
105
|
+
if (conditionDescriptor.conditionType === ConditionType.AIPrompt) {
|
|
106
|
+
return 'ai_prompt';
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
exports.getAssertionConditionFieldFromDescriptor = getAssertionConditionFieldFromDescriptor;
|
|
59
111
|
exports.AssertionStepNameToField = {
|
|
60
112
|
AssertEquals: 'equals',
|
|
61
113
|
AssertPresent: 'present',
|
|
@@ -71,6 +123,7 @@ exports.AssertionStepNameToField = {
|
|
|
71
123
|
AssertLessThan: 'less_than',
|
|
72
124
|
AssertGreaterThanOrEquals: 'greater_than_or_equals',
|
|
73
125
|
AssertLessThanOrEquals: 'less_than_or_equals',
|
|
126
|
+
AssertAIPrompt: 'ai_prompt',
|
|
74
127
|
};
|
|
75
128
|
exports.AssertionConditionFieldToCondition = Object.fromEntries(Object.entries(exports.AssertionStepNameToField).map(([stepType, field]) => [
|
|
76
129
|
field,
|
|
@@ -7,6 +7,7 @@ var ExtractType;
|
|
|
7
7
|
ExtractType["EXTRACT_CSS_PROPERTIES"] = "extract_css_properties";
|
|
8
8
|
ExtractType["EXTRACT_EMAIL_ATTRIBUTE"] = "extract_email_attribute";
|
|
9
9
|
ExtractType["EXTRACT_INNER_TEXT"] = "extract_inner_text";
|
|
10
|
+
ExtractType["EXTRACT_PROMPT"] = "extract_prompt";
|
|
10
11
|
})(ExtractType || (exports.ExtractType = ExtractType = {}));
|
|
11
12
|
(function (ExtractType) {
|
|
12
13
|
function fromString(value) {
|