Skip to content

Commit 25dfb41

Browse files
committed
define logger for cli
1 parent e71931d commit 25dfb41

5 files changed

Lines changed: 98 additions & 15 deletions

File tree

packages/flowtest-cli/bin/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const { serialize } = require('../../flowtest-electron/src/utils/flowparser/pars
88
const { Graph } = require('../graph/Graph');
99
const { cloneDeep } = require('lodash');
1010
const dotenv = require('dotenv');
11+
const { GraphLogger, LogLevel } = require('../graph/GraphLogger');
1112

1213
const getEnvVariables = (pathname) => {
1314
const content = readFile(pathname);
@@ -57,13 +58,15 @@ const argv = yargs(hideBin(process.argv))
5758
const flowData = serialize(JSON.parse(content));
5859
// output json output to a file
5960
//console.log(chalk.green(JSON.stringify(flowData)));
61+
const logger = new GraphLogger();
6062
const startTime = Date.now();
6163
const g = new Graph(
6264
cloneDeep(flowData.nodes),
6365
cloneDeep(flowData.edges),
6466
startTime,
6567
argv.timeout ? argv.timeout : 60000,
6668
argv.env ? getEnvVariables(argv.env) : {},
69+
logger,
6770
);
6871
console.log(chalk.yellow('Running Graph \n'));
6972
if (flowData.nodes.find((n) => n.type === 'complexNode')) {
@@ -80,7 +83,9 @@ const argv = yargs(hideBin(process.argv))
8083
} else {
8184
console.log(chalk.bold('Graph Run: ') + chalk.red(` ✕ `) + chalk.dim(result.status));
8285
}
86+
logger.add(LogLevel.INFO, `Total time: ${Date.now() - startTime} ms`);
8387
console.log(chalk.bold('Total Time: ') + chalk.dim(`${Date.now() - startTime} ms`));
88+
console.log(logger.get());
8489
process.exit(1);
8590
//console.log(chalk.green(JSON.stringify(result)));
8691
} catch (error) {

packages/flowtest-cli/graph/Graph.js

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ const path = require('path');
1010
const readFile = require('../../flowtest-electron/src/utils/filemanager/readfile');
1111
const { serialize } = require('../../flowtest-electron/src/utils/flowparser/parser');
1212
const Node = require('./compute/node');
13+
const { LogLevel } = require('./GraphLogger');
1314

1415
class nestedFlowNode extends Node {
15-
constructor(nodes, edges, startTime, timeout, initialEnvVars) {
16+
constructor(nodes, edges, startTime, timeout, initialEnvVars, logger) {
1617
super('flowNode');
1718
try {
18-
this.internalGraph = new Graph(nodes, edges, startTime, timeout, initialEnvVars);
19+
this.internalGraph = new Graph(nodes, edges, startTime, timeout, initialEnvVars, logger);
1920
} catch (error) {
2021
console.log(error);
2122
}
@@ -27,14 +28,15 @@ class nestedFlowNode extends Node {
2728
}
2829

2930
class Graph {
30-
constructor(nodes, edges, startTime, timeout, initialEnvVars) {
31+
constructor(nodes, edges, startTime, timeout, initialEnvVars, logger) {
3132
this.nodes = nodes;
3233
this.edges = edges;
3334
this.timeout = timeout;
3435
this.startTime = startTime;
3536
this.graphRunNodeOutput = {};
3637
this.auth = undefined;
3738
this.envVariables = initialEnvVars;
39+
this.logger = logger;
3840
}
3941

4042
#checkTimeout() {
@@ -83,6 +85,7 @@ class Graph {
8385
if (node.type === 'outputNode') {
8486
console.log('Output Node');
8587
console.log(chalk.green(` ✓ `) + chalk.dim(`${JSON.stringify(prevNodeOutputData)}`));
88+
this.logger.add(LogLevel.INFO, '', { type: 'outputNode', data: prevNodeOutputData });
8689
result = {
8790
status: 'Success',
8891
data: prevNodeOutputData,
@@ -121,6 +124,7 @@ class Graph {
121124
};
122125
console.log('Delay Node: ' + chalk.green(`....waiting for: ${delay} ms`));
123126
await wait(delay);
127+
this.logger.add(LogLevel.INFO, '', { type: 'delayNode', data: delay });
124128
result = {
125129
status: 'Success',
126130
};
@@ -137,7 +141,7 @@ class Graph {
137141

138142
if (node.type === 'requestNode') {
139143
console.log('Request Node');
140-
const rNode = new requestNode(node.data, prevNodeOutputData, this.envVariables, this.auth);
144+
const rNode = new requestNode(node.data, prevNodeOutputData, this.envVariables, this.auth, this.logger);
141145
result = await rNode.evaluate();
142146
// add post response variables if any
143147
if (result.postRespVars) {
@@ -159,6 +163,7 @@ class Graph {
159163
this.startTime,
160164
this.timeout,
161165
this.envVariables,
166+
this.logger,
162167
);
163168
result = await cNode.evaluate();
164169
this.envVariables = result.envVars;
@@ -175,6 +180,13 @@ class Graph {
175180
const newVariable = sNode.evaluate();
176181
if (newVariable != undefined) {
177182
console.log(chalk.green(` ✓ `) + chalk.dim(`Set variable: ${JSON.stringify(newVariable)}`));
183+
this.logger.add(LogLevel.INFO, '', {
184+
type: 'setVarNode',
185+
data: {
186+
name: Object.keys(newVariable)[0],
187+
value: newVariable[Object.keys(newVariable)[0]],
188+
},
189+
});
178190
this.envVariables = {
179191
...this.envVariables,
180192
...newVariable,
@@ -190,13 +202,15 @@ class Graph {
190202
}
191203
} catch (err) {
192204
console.log(chalk.red(`Flow failed at: ${JSON.stringify(node.data)} due to ${err}`));
205+
this.logger.add(LogLevel.ERROR, `Flow failed due to ${err}`, node);
193206
return {
194207
status: 'Failed',
195208
};
196209
}
197210

198211
if (result === undefined) {
199212
console.log(chalk.red(`Flow failed due to failure to evaluate result at node: ${node.data}`));
213+
this.logger.add(LogLevel.ERROR, 'Flow failed due to failure to evaluate result', node);
200214
return {
201215
status: 'Failed',
202216
};
@@ -222,10 +236,14 @@ class Graph {
222236
this.graphRunNodeOutput = {};
223237

224238
console.log(chalk.green('Start Flowtest'));
239+
this.logger.add(LogLevel.INFO, 'Start Flowtest');
240+
225241
const startNode = this.nodes.find((node) => node.type === 'startNode');
226242
if (startNode == undefined) {
227243
console.log(chalk.red(`✕ `) + chalk.red('No start node found'));
228244
console.log(chalk.red('End Flowtest'));
245+
this.logger.add(LogLevel.INFO, 'No start node found');
246+
this.logger.add(LogLevel.INFO, 'End Flowtest');
229247
return {
230248
status: 'Success',
231249
envVars: this.envVariables,
@@ -242,12 +260,14 @@ class Graph {
242260
} else {
243261
console.log(chalk.green('End Flowtest'));
244262
}
263+
this.logger.add(LogLevel.INFO, 'End Flowtest');
245264
return {
246265
status: result.status,
247266
envVars: this.envVariables,
248267
};
249268
} else {
250269
console.log(chalk.green('End Flowtest'));
270+
this.logger.add(LogLevel.INFO, 'End Flowtest');
251271
return {
252272
status: 'Success',
253273
envVars: this.envVariables,
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const LogLevel = Object.freeze({
2+
INFO: 0,
3+
WARN: 1,
4+
ERROR: 2,
5+
});
6+
7+
class GraphLogger {
8+
constructor() {
9+
this.logs = [];
10+
}
11+
12+
add(logLevel, message, node) {
13+
this.logs.push({
14+
logLevel,
15+
timestamp: new Date().toISOString(),
16+
message,
17+
node,
18+
});
19+
}
20+
21+
get() {
22+
return this.logs;
23+
}
24+
}
25+
26+
module.exports = {
27+
GraphLogger,
28+
LogLevel,
29+
};

packages/flowtest-cli/graph/compute/assertnode.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const AssertOperators = require('../constants/assertOperators');
22
const { computeNodeVariable } = require('./utils');
33
const Node = require('./node');
44
const chalk = require('chalk');
5+
const { LogLevel } = require('../GraphLogger');
56

67
class assertNode extends Node {
78
constructor(operator, variables, prevNodeOutputData, envVariables, logs) {
@@ -43,17 +44,26 @@ class assertNode extends Node {
4344
`Assert var1: ${JSON.stringify(var1)} of type: ${typeof var1}, var2: ${JSON.stringify(var2)} of type: ${typeof var2} with operator: ${operator}`,
4445
),
4546
);
46-
if (operator == AssertOperators.isEqualTo) {
47-
return var1 === var2;
48-
} else if (operator == AssertOperators.isNotEqualTo) {
49-
return var1 != var2;
50-
} else if (operator == AssertOperators.isGreaterThan) {
51-
return var1 > var2;
52-
} else if (operator == AssertOperators.isLessThan) {
53-
return var1 < var2;
54-
} else {
55-
throw 'Operator unrecognized';
47+
let result;
48+
switch (operator) {
49+
case AssertOperators.isEqualTo:
50+
result = var1 === var2;
51+
break;
52+
case AssertOperators.isNotEqualTo:
53+
result = var1 != var2;
54+
break;
55+
case AssertOperators.isGreaterThan:
56+
result = var1 > var2;
57+
break;
58+
case AssertOperators.isLessThan:
59+
result = var1 < var2;
60+
break;
61+
default:
62+
throw 'Unsupported operator';
5663
}
64+
this.logger.add(LogLevel.INFO, '', { type: 'assertNode', data: { var1, var2, operator, result } });
65+
66+
return result;
5767
}
5868
}
5969

packages/flowtest-cli/graph/compute/requestnode.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { computeNodeVariables, computeVariables } = require('./utils');
22
const Node = require('./node');
33
const axios = require('axios');
44
const chalk = require('chalk');
5+
const { LogLevel } = require('../GraphLogger');
56

67
const newAbortSignal = () => {
78
const abortController = new AbortController();
@@ -18,12 +19,13 @@ const convertBase64ToBlob = async (base64) => {
1819
};
1920

2021
class requestNode extends Node {
21-
constructor(nodeData, prevNodeOutputData, envVariables, auth) {
22+
constructor(nodeData, prevNodeOutputData, envVariables, auth, logger) {
2223
super('requestNode');
2324
this.nodeData = nodeData;
2425
this.prevNodeOutputData = prevNodeOutputData;
2526
this.envVariables = envVariables;
2627
this.auth = auth;
28+
this.logger = logger;
2729
}
2830

2931
async evaluate() {
@@ -48,19 +50,36 @@ class requestNode extends Node {
4850

4951
if (res.error) {
5052
console.log(chalk.red(` ✕ `) + chalk.dim(`Request failed: ${JSON.stringify(res.error)}`));
53+
this.logger.add(LogLevel.ERROR, 'HTTP request failed', {
54+
type: 'requestNode',
55+
data: { request: { type: options.method, url: options.url }, response: res.error, preReqVars: evalVariables },
56+
});
5157
return {
5258
status: 'Failed',
5359
};
5460
} else {
5561
console.log(chalk.green(` ✓ `) + chalk.dim(`Request successful: ${JSON.stringify(res)}`));
5662
if (this.nodeData.postRespVars) {
5763
const evalPostRespVars = computeNodeVariables(this.nodeData.postRespVars, res.data);
64+
this.logger.add(LogLevel.INFO, 'HTTP request success', {
65+
type: 'requestNode',
66+
data: {
67+
request: { type: options.method, url: options.url, data: options.data },
68+
response: res,
69+
preReqVars: evalVariables,
70+
postRespVars: evalPostRespVars,
71+
},
72+
});
5873
return {
5974
status: 'Success',
6075
data: res.data,
6176
postRespVars: evalPostRespVars,
6277
};
6378
}
79+
this.logger.add(LogLevel.INFO, 'HTTP request success', {
80+
type: 'requestNode',
81+
data: { request: { type: options.method, url: options.url }, response: res, preReqVars: evalVariables },
82+
});
6483
return {
6584
status: 'Success',
6685
data: res.data,

0 commit comments

Comments
 (0)