testdriverai 4.1.37 → 4.1.38
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/agent.js +3 -0
- package/eslint.config.js +1 -0
- package/lib/parser.js +14 -0
- package/package.json +5 -2
- package/test/test_parser.js +48 -0
package/agent.js
CHANGED
|
@@ -887,6 +887,9 @@ let run = async (file, overwrite = false, shouldExit = true) => {
|
|
|
887
887
|
await exit(true);
|
|
888
888
|
}
|
|
889
889
|
|
|
890
|
+
// Inject environment variables into any ${VAR} strings
|
|
891
|
+
yml = parser.interpolate(yml, process.env);
|
|
892
|
+
|
|
890
893
|
let ymlObj = null;
|
|
891
894
|
try {
|
|
892
895
|
ymlObj = await yaml.load(yml);
|
package/eslint.config.js
CHANGED
package/lib/parser.js
CHANGED
|
@@ -76,10 +76,24 @@ const parseYAML = async function (inputYaml) {
|
|
|
76
76
|
return doc;
|
|
77
77
|
};
|
|
78
78
|
|
|
79
|
+
// Replace ${VAR} with the value from the vars object
|
|
80
|
+
// Will skip variables that are not in the vars object
|
|
81
|
+
// Will skip escaped variables like \${VAR}
|
|
82
|
+
function interpolate (yaml, vars) {
|
|
83
|
+
let newyaml = yaml;
|
|
84
|
+
Object.keys(vars).forEach((key) => {
|
|
85
|
+
newyaml = newyaml.replace(new RegExp(`(?<!\\\\)\\$\\{${key}\\}`, "g"), vars[key]);
|
|
86
|
+
});
|
|
87
|
+
// Replace \$ with $
|
|
88
|
+
newyaml = newyaml.replace(/\\(\${[^}]+})/g, "$1");
|
|
89
|
+
return newyaml;
|
|
90
|
+
}
|
|
91
|
+
|
|
79
92
|
module.exports = {
|
|
80
93
|
findCodeBlocks,
|
|
81
94
|
findGenerativePrompts,
|
|
82
95
|
getYAMLFromCodeBlock,
|
|
96
|
+
interpolate,
|
|
83
97
|
getCommands: async function (codeBlock) {
|
|
84
98
|
const yml = getYAMLFromCodeBlock(codeBlock);
|
|
85
99
|
let yamlArray = await parseYAML(yml);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testdriverai",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.38",
|
|
4
4
|
"description": "Next generation autonomous AI agent for end-to-end testing of web & desktop",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"start": "node index.js",
|
|
11
11
|
"dev": "DEV=true node index.js",
|
|
12
12
|
"debug": "DEV=true VERBOSE=true node index.js",
|
|
13
|
-
"bundle": "node build.mjs"
|
|
13
|
+
"bundle": "node build.mjs",
|
|
14
|
+
"test": "mocha test/*"
|
|
14
15
|
},
|
|
15
16
|
"author": "",
|
|
16
17
|
"license": "ISC",
|
|
@@ -56,6 +57,8 @@
|
|
|
56
57
|
"globals": "^15.9.0",
|
|
57
58
|
"node-addon-api": "^8.0.0",
|
|
58
59
|
"node-gyp": "^10.1.0",
|
|
60
|
+
"mocha": "^10.8.2",
|
|
61
|
+
"chai": "^5.1.2",
|
|
59
62
|
"prettier": "3.3.3"
|
|
60
63
|
},
|
|
61
64
|
"optionalDependencies": {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const chai = require('chai');
|
|
2
|
+
const expect = chai.expect;
|
|
3
|
+
const { interpolate } = require('../lib/parser');
|
|
4
|
+
|
|
5
|
+
describe('interpolate', function() {
|
|
6
|
+
it('should replace variables in the string with values from the dictionary', function() {
|
|
7
|
+
const template = 'Hello, ${name}!';
|
|
8
|
+
const vars = { name: 'World' };
|
|
9
|
+
const result = interpolate(template, vars);
|
|
10
|
+
expect(result).to.equal('Hello, World!');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should replace multiple variables in the string', function() {
|
|
14
|
+
const template = 'Hi, ${firstName} ${lastName}!';
|
|
15
|
+
const vars = { firstName: 'Marcy', lastName: 'the Dog' };
|
|
16
|
+
const result = interpolate(template, vars);
|
|
17
|
+
expect(result).to.equal('Hi, Marcy the Dog!');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should leave variables unchanged if they are not in the dictionary', function() {
|
|
21
|
+
const template = 'Hi, ${name} ${surname}!';
|
|
22
|
+
const vars = { name: 'John' };
|
|
23
|
+
const result = interpolate(template, vars);
|
|
24
|
+
expect(result).to.equal('Hi, John ${surname}!');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should return the original string if no variables are present', function() {
|
|
28
|
+
const template = 'Hello, World!';
|
|
29
|
+
const vars = { name: 'John' };
|
|
30
|
+
const result = interpolate(template, vars);
|
|
31
|
+
expect(result).to.equal('Hello, World!');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should handle an empty dictionary gracefully', function() {
|
|
35
|
+
const template = 'Hi, ${name}!';
|
|
36
|
+
const vars = {};
|
|
37
|
+
const result = interpolate(template, vars);
|
|
38
|
+
expect(result).to.equal('Hi, ${name}!');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should not replace escaped variables', function() {
|
|
42
|
+
const template = 'Hello, \\${name}!';
|
|
43
|
+
const vars = { name: 'World' };
|
|
44
|
+
const result = interpolate(template, vars);
|
|
45
|
+
expect(result).to.equal('Hello, ${name}!');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|