UNPKG

@tachybase/module-workflow

Version:

A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.

172 lines (171 loc) 6.47 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; 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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var TriggerInstruction_exports = {}; __export(TriggerInstruction_exports, { TriggerInstruction: () => TriggerInstruction }); module.exports = __toCommonJS(TriggerInstruction_exports); var import_lodash = __toESM(require("lodash")); var import_constants = require("../../constants"); var import_instructions = __toESM(require("../../instructions")); class TriggerInstruction extends import_instructions.default { async run(node, input, processor) { var _a; const { workflowKey, sourceArray = [], model } = node.config; const wfRepo = this.workflow.db.getRepository("workflows"); const wf = await wfRepo.findOne({ filter: { key: workflowKey, enabled: true } }); if (!wf) { return { status: import_constants.JOB_STATUS.FAILED, result: `Workflow with key "${workflowKey}" not found or disabled` }; } const dangerousNodeTypes = ["data-mapping", "script", "js-parse", "json-parse"]; const hasDangerousNodes = (_a = wf.nodes) == null ? void 0 : _a.some((node2) => dangerousNodeTypes.includes(node2.type)); if (hasDangerousNodes) { this.workflow.getLogger(wf.id).warn( `Triggering workflow ${workflowKey} contains potentially dangerous nodes: ${dangerousNodeTypes.join(", ")}` ); } try { let triggerData = input.result; if (sourceArray && sourceArray.length > 0) { let data = {}; switch (sourceArray.length) { case 0: { data = {}; break; } case 1: { const keyName = sourceArray[0]["keyName"]; const sourcePath = sourceArray[0]["sourcePath"]; const rawData = processor.getParsedValue(sourcePath, node.id); if (keyName) { data = { [keyName]: rawData }; } else { data = rawData; } break; } default: { data = sourceArray.reduce( (cookedData, { keyName, sourcePath }) => ({ ...cookedData, [keyName]: processor.getParsedValue(sourcePath, node.id) }), {} ); } } triggerData = data; } if (wf.sync) { const p = await this.workflow.trigger(wf, triggerData, processor.options); if (!p) { return { status: import_constants.JOB_STATUS.FAILED, result: "Failed to trigger sub-workflow" }; } const { lastSavedJob } = p; if ((lastSavedJob == null ? void 0 : lastSavedJob.status) === import_constants.JOB_STATUS.ERROR) { return { status: import_constants.JOB_STATUS.FAILED, result: `Sub-workflow execution failed: ${lastSavedJob.result}` }; } let result = lastSavedJob == null ? void 0 : lastSavedJob.result; if (typeof result === "object" && result && (model == null ? void 0 : model.length)) { if (Array.isArray(result)) { result = result.map((item) => this.mapModel(item, model)); } else { result = this.mapModel(result, model); } } return { status: import_constants.JOB_STATUS.RESOLVED, result }; } else { const pendingJob = await processor.saveJob({ status: import_constants.JOB_STATUS.PENDING, nodeId: node.id, nodeKey: node.key, upstreamId: (input == null ? void 0 : input.id) ?? null }); this.workflow.trigger(wf, triggerData, { ...processor.options, parentNode: node.id, parent: processor.execution }); return pendingJob; } } catch (error) { this.workflow.getLogger(wf.id).error(`Error triggering sub-workflow ${workflowKey}:`, error); return { status: import_constants.JOB_STATUS.FAILED, result: `Sub-workflow trigger error: ${error.message}` }; } } /** * 将数据按照 model 配置进行字段映射 */ mapModel(data, model) { if (typeof data !== "object" || data === null) { throw new Error("Invalid data: data should be a non-null object"); } const result = model.reduce((acc, { path, alias }) => { const key = alias ?? path.replace(/\./g, "_"); const value = import_lodash.default.get(data, path); acc[key] = value; return acc; }, {}); return result; } async resume(node, prevJob, processor) { const { model } = node.config; let result = prevJob.result; if (typeof result === "object" && result && (model == null ? void 0 : model.length)) { if (Array.isArray(result)) { result = result.map((item) => this.mapModel(item, model)); } else { result = this.mapModel(result, model); } } prevJob.set("result", result); prevJob.set("status", prevJob.status); return prevJob; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { TriggerInstruction });