@tachybase/module-workflow
Version:
A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.
101 lines (100 loc) • 3.41 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var LoopInstruction_exports = {};
__export(LoopInstruction_exports, {
default: () => LoopInstruction_default
});
module.exports = __toCommonJS(LoopInstruction_exports);
var import__ = require("../..");
function getTargetLength(target) {
let length = 0;
if (typeof target === "number") {
if (target < 0) {
throw new Error("Loop target in number type must be greater than 0");
}
length = Math.floor(target);
} else {
const targets = (Array.isArray(target) ? target : [target]).filter((t) => t != null);
length = targets.length;
}
return length;
}
class LoopInstruction_default extends import__.Instruction {
async run(node, prevJob, processor) {
const [branch] = processor.getBranches(node);
const target = processor.getParsedValue(node.config.target, node.id);
const length = getTargetLength(target);
if (!branch || !length) {
return {
status: import__.JOB_STATUS.RESOLVED,
result: 0
};
}
const job = await processor.saveJob({
status: import__.JOB_STATUS.PENDING,
// save loop index
result: 0,
nodeId: node.id,
nodeKey: node.key,
upstreamId: (prevJob == null ? void 0 : prevJob.id) ?? null
});
await processor.run(branch, job);
return null;
}
async resume(node, branchJob, processor) {
const job = processor.findBranchParentJob(branchJob, node);
const loop = processor.nodesMap.get(job.nodeId);
const [branch] = processor.getBranches(node);
const { result, status } = job;
if (status !== import__.JOB_STATUS.PENDING) {
return processor.exit();
}
const nextIndex = result + 1;
const target = processor.getParsedValue(loop.config.target, node.id);
if (branchJob.status > import__.JOB_STATUS.PENDING) {
job.set({ result: nextIndex });
const length = getTargetLength(target);
if (nextIndex < length) {
await processor.saveJob(job);
await processor.run(branch, job);
return null;
}
}
job.set({
status: branchJob.status
});
return job;
}
getScope(node, index, processor) {
const target = processor.getParsedValue(node.config.target, node.id);
const targets = (Array.isArray(target) ? target : [target]).filter((t) => t != null);
const length = getTargetLength(target);
const item = typeof target === "number" ? index : targets[index];
const result = {
item,
index,
length
};
this.workflow.noticeManager.notify("workflow:regular", {
msg: "progress",
current: index,
total: length
});
return result;
}
}