aws-sf-choice
Version:
parse aws step function choice
326 lines (325 loc) • 16.9 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Choice = void 0;
const lodash_1 = __importDefault(require("lodash"));
const uuid_1 = require("uuid");
const jsonpath_1 = __importDefault(require("jsonpath"));
const events_1 = require("events");
const eventEmitter = new events_1.EventEmitter.EventEmitter();
class Choice {
constructor(condition, data) {
this.typeId = {};
this.posId = {};
this.IdinId = {};
this.IdLength = {};
this.IdResult = {};
this.nexts = [];
this.sampleData = {};
this.condition = {};
this.status = true;
this.typeId = {};
this.posId = {};
this.IdinId = {};
this.IdLength = {};
this.IdResult = {};
this.condition = condition;
this.sampleData = data;
this.IdLength["orig"] = this.condition.Choices.length;
this.status = true;
}
start() {
return new Promise((resolve, rejet) => {
eventEmitter.on("scream", (d) => {
this.status = false;
d = d.filter((item) => {
return item !== undefined;
});
if (d.length == 0) {
this.nexts = [];
resolve(this.condition.Default);
}
else {
this.nexts = [];
resolve(d[0]);
}
});
this.condition.Choices.map((item) => {
if (this.status) {
if (lodash_1.default.has(item, "Or")) {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "Or";
this.posId[item.Id] = "root";
this.IdLength[item.Id] = item.Or.length;
this.checkFunction(item.Or, "Or", item.Id);
}
else if (lodash_1.default.has(item, "And")) {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "And";
this.posId[item.Id] = "root";
this.IdLength[item.Id] = item.And.length;
this.checkFunction(item.And, "And", item.Id);
}
else if (lodash_1.default.has(item, "Not")) {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "Not";
this.posId[item.Id] = "root";
this.checkFunction(item.Not, "Not", item.Id);
}
else {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "Simple";
this.posId[item.Id] = "root";
this.IdResult[item.Id] = this.simpleHandler(this.sampleData, item);
this.resultTracker(item.Id);
}
}
else
return this.status;
});
});
}
checkFunction(arr, type, upperId) {
if (type == "And" || type == "Or") {
arr.map((item) => {
if (lodash_1.default.has(item, "Or")) {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "Or";
this.IdinId[item.Id] = upperId;
this.IdLength[item.Id] = item.Or.length;
this.checkFunction(item.Or, "Or", item.Id);
}
else if (lodash_1.default.has(item, "And")) {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "And";
this.IdinId[item.Id] = upperId;
this.IdLength[item.Id] = arr.length;
this.checkFunction(item.And, "And", item.Id);
}
else if (lodash_1.default.has(item, "Not")) {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "Not";
this.IdinId[item.Id] = upperId;
this.checkFunction(item.Not, "Not", item.Id);
}
else {
item.Id = (0, uuid_1.v4)();
this.typeId[item.Id] = "Simple";
this.IdinId[item.Id] = upperId;
this.IdResult[item.Id] = this.simpleHandler(this.sampleData, item);
this.resultTracker(item.Id);
}
});
}
else if (type == "Not") {
if (lodash_1.default.has(arr, "Or")) {
arr.Id = (0, uuid_1.v4)();
this.typeId[arr.Id] = "Or";
this.IdinId[arr.Id] = upperId;
this.IdLength[arr.Id] = arr.Or.length;
this.checkFunction(arr.Or, "Or", arr.Id);
}
else if (lodash_1.default.has(arr, "And")) {
arr.Id = (0, uuid_1.v4)();
this.typeId[arr.Id] = "And";
this.IdinId[arr.Id] = upperId;
this.IdLength[arr.Id] = arr.And.length;
this.checkFunction(arr.And, "And", arr.Id);
}
else if (lodash_1.default.has(arr, "Not")) {
arr.Id = (0, uuid_1.v4)();
this.typeId[arr.Id] = "Not";
this.IdinId[arr.Id] = upperId;
this.checkFunction(arr.Not, "Not", arr.Id);
}
else {
arr.Id = (0, uuid_1.v4)();
this.typeId[arr.Id] = "Simple";
this.IdinId[arr.Id] = upperId;
this.IdResult[arr.Id] = this.simpleHandler(this.sampleData, arr);
this.resultTracker(arr.Id);
}
}
}
emptyData() {
eventEmitter.on("scream", (d) => {
this.typeId = {};
this.posId = {};
this.IdinId = {};
this.IdLength = {};
this.IdResult = {};
this.sampleData = {};
this.condition = {};
});
}
getObjKey(obj, value) {
let t = [];
Object.keys(obj).forEach(item => {
if (obj[item] == value)
t.push(item);
});
return t;
}
resultTracker(Id) {
// check for condition for root state
if (Object.keys(this.posId).includes(Id)) {
if (this.IdResult[Id]) {
let next = lodash_1.default.find(this.condition.Choices, function (o) {
return o.Id == Id;
}).Next;
this.nexts.push(next);
eventEmitter.emit("scream", this.nexts);
}
else {
this.nexts.push(undefined);
if (this.nexts.length == this.IdLength["orig"]) {
eventEmitter.emit("scream", this.nexts);
}
}
}
else {
// check for condition if upper condition is Not
var upperId = this.IdinId[Id];
if (this.typeId[upperId] == "Not") {
this.IdResult[upperId] = !this.IdResult[Id];
this.resultTracker(upperId);
}
// check for condition if upper condition is And
if (this.typeId[upperId] == "And") {
var and_result = this.getObjKey(this.IdinId, upperId);
if (and_result.length == this.IdLength[upperId]) {
and_result = and_result.map((item) => this.IdResult[item]);
this.IdResult[upperId] = and_result.includes(false);
this.resultTracker(upperId);
}
}
// check for condition if upper condition is Or
if (this.typeId[upperId] == "Or") {
var or_result = this.getObjKey(this.IdinId, upperId);
if (or_result.length == this.IdLength[upperId]) {
or_result = or_result.map((item) => this.IdResult[item]);
this.IdResult[upperId] = or_result.includes(true);
this.resultTracker(upperId);
}
}
}
}
simpleHandler(data, condition) {
if (lodash_1.default.has(condition, "IsTimestamp")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]).getTime() > 0 && new Date(jsonpath_1.default.query(data, condition.Variable)[0]).getTime() != NaN;
}
else if (lodash_1.default.has(condition, "IsPresent")) {
return jsonpath_1.default.query(data, condition.Variable)[0] !== undefined;
}
else if (lodash_1.default.has(condition, "IsNumeric")) {
return jsonpath_1.default.query(typeof data, condition.Variable)[0] == "number";
}
else if (lodash_1.default.has(condition, "IsBoolean")) {
return jsonpath_1.default.query(typeof data, condition.Variable)[0] == "boolean";
}
else if (lodash_1.default.has(condition, "IsString")) {
return jsonpath_1.default.query(typeof data, condition.Variable)[0] == "string";
}
else if (lodash_1.default.has(condition, "IsNull")) {
return jsonpath_1.default.query(data, condition.Variable)[0] !== null;
}
else if (lodash_1.default.has(condition, "NumericEquals")) {
return jsonpath_1.default.query(data, condition.Variable)[0] == condition.NumericEquals;
}
else if (lodash_1.default.has(condition, "StringEquals")) {
return jsonpath_1.default.query(data, condition.Variable)[0] == condition.StringEquals;
}
else if (lodash_1.default.has(condition, "TimestampEquals")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) == new Date(condition.TimestampEquals);
}
else if (lodash_1.default.has(condition, "NumericGreaterThan")) {
return jsonpath_1.default.query(data, condition.Variable)[0] > condition.NumericGreaterThan;
}
else if (lodash_1.default.has(condition, "StringGreaterThan")) {
return jsonpath_1.default.query(data, condition.Variable)[0].includes(condition.StringGreaterThan) &&
jsonpath_1.default.query(data, condition.Variable)[0] != condition.StringGreaterThan;
}
else if (lodash_1.default.has(condition, "TimestampGreaterThan")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) > condition.TimestampGreaterThan;
}
else if (lodash_1.default.has(condition, "NumericGreaterThanEquals")) {
return jsonpath_1.default.query(data, condition.Variable)[0] >= condition.NumericGreaterThanEquals;
}
else if (lodash_1.default.has(condition, "StringGreaterThanEquals")) {
return jsonpath_1.default.query(data, condition.Variable)[0].includes(condition.StringGreaterThanEquals);
}
else if (lodash_1.default.has(condition, "TimestampGreaterThanEquals")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) >= new Date(condition.TimestampGreaterThanEquals);
}
else if (lodash_1.default.has(condition, "NumericLessThan")) {
return jsonpath_1.default.query(data, condition.Variable)[0] < condition.NumericLessThan;
}
else if (lodash_1.default.has(condition, "StringLessThan")) {
return condition.StringLessThan.includes(jsonpath_1.default.query(data, condition.Variable)[0]) &&
condition.StringLessThan != jsonpath_1.default.query(data, condition.Variable)[0];
}
else if (lodash_1.default.has(condition, "TimestampLessThan")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) < new Date(condition.TimestampLessThan);
}
else if (lodash_1.default.has(condition, "NumericLessThanEquals")) {
return jsonpath_1.default.query(data, condition.Variable)[0] <= condition.NumericLessThanEquals;
}
else if (lodash_1.default.has(condition, "StringLessThanEquals")) {
return condition.StringLessThanEquals.includes(jsonpath_1.default.query(data, condition.Variable)[0]);
}
else if (lodash_1.default.has(condition, "TimestampLessThanEquals")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) <= new Date(condition.TimestampLessThanEquals);
}
else if (lodash_1.default.has(condition, "NumericEqualsPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0] == jsonpath_1.default.query(data, condition.NumericEqualsPath)[0];
}
else if (lodash_1.default.has(condition, "StringEqualsPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0] == jsonpath_1.default.query(data, condition.StringEqualsPath)[0];
}
else if (lodash_1.default.has(condition, "TimestampEqualsPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0] == jsonpath_1.default.query(data, condition.TimestampEqualsPath)[0];
}
else if (lodash_1.default.has(condition, "NumericGreaterThanPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0] > jsonpath_1.default.query(data, condition.NumericGreaterThanPath)[0];
}
else if (lodash_1.default.has(condition, "StringGreaterThanPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0].includes(jsonpath_1.default.query(data, condition.StringGreaterThanPath)[0]) &&
jsonpath_1.default.query(data, condition.Variable)[0] != jsonpath_1.default.query(data, condition.StringGreaterThanPath)[0];
}
else if (lodash_1.default.has(condition, "TimestampGreaterThanPath")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) > new Date(jsonpath_1.default.query(data, condition.TimestampGreaterThanPath)[0]);
}
else if (lodash_1.default.has(condition, "NumericGreaterThanEqualsPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0] >= jsonpath_1.default.query(data, condition.NumericGreaterThanEqualsPath)[0];
}
else if (lodash_1.default.has(condition, "StringGreaterThanEqualsPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0].includes(jsonpath_1.default.query(data, condition.StringGreaterThanEqualsPath)[0]);
}
else if (lodash_1.default.has(condition, "TimestampGreaterThanEqualsPath")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) >= new Date(jsonpath_1.default.query(data, condition.TimestampGreaterThanEqualsPath)[0]);
}
else if (lodash_1.default.has(condition, "NumericLessThanPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0] < jsonpath_1.default.query(data, condition.NumericLessThanPath)[0];
}
else if (lodash_1.default.has(condition, "StringLessThanPath")) {
return jsonpath_1.default.query(data, condition.StringLessThanPath)[0].includes(jsonpath_1.default.query(data, condition.Variable)[0]) &&
jsonpath_1.default.query(data, condition.StringLessThanPath)[0] != jsonpath_1.default.query(data, condition.Variable)[0];
}
else if (lodash_1.default.has(condition, "TimestampLessThanPath")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) < new Date(jsonpath_1.default.query(data, condition.TimestampLessThanPath)[0]);
}
else if (lodash_1.default.has(condition, "NumericLessThanEqualsPath")) {
return jsonpath_1.default.query(data, condition.Variable)[0] <= jsonpath_1.default.query(data, condition.NumericLessThanEqualsPath)[0];
}
else if (lodash_1.default.has(condition, "StringLessThanEqualsPath")) {
return jsonpath_1.default.query(data, condition.StringLessThanEqualsPath)[0].includes(jsonpath_1.default.query(data, condition.Variable)[0]);
}
else if (lodash_1.default.has(condition, "TimestampLessThanEqualsPath")) {
return new Date(jsonpath_1.default.query(data, condition.Variable)[0]) <= new Date(data, jsonpath_1.default.query(data, condition.TimestampLessThanEqualsPath)[0]);
}
}
;
}
exports.Choice = Choice;