@rudderstack/workflow-engine
Version:
A generic workflow execution engine
149 lines • 6.17 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WorkflowUtils = void 0;
const lodash_1 = require("lodash");
const path_1 = __importDefault(require("path"));
const yaml_1 = __importDefault(require("yaml"));
const common_1 = require("../bindings/common");
const common_2 = require("../common");
const errors_1 = require("../errors");
const default_executor_1 = require("./default_executor");
const output_validator_1 = require("./output_validator");
class WorkflowUtils {
static populateWorkflowName(workflow, workflowPath) {
if (!workflow.name) {
const { name } = path_1.default.parse(workflowPath);
// eslint-disable-next-line no-param-reassign
workflow.name = name;
}
}
static async createWorkflowFromFilePath(yamlPath) {
const workflow = (await this.createFromFilePath(yamlPath)) ?? {};
this.populateWorkflowName(workflow, yamlPath);
return workflow;
}
static async createFromFilePath(yamlPath) {
const yamlString = await common_2.CommonUtils.readFile(yamlPath);
return this.createFromYaml(yamlString);
}
static createFromYaml(yamlString) {
return yaml_1.default.parse(yamlString);
}
static validateWorkflow(workflow) {
if (!workflow?.steps?.length) {
throw new errors_1.WorkflowCreationError('Workflow should contain at least one step', workflow.name);
}
}
static validate(workflow) {
const validator = new output_validator_1.WorkflowOutputsValidator(workflow);
validator.validateOutputs();
}
static async getModuleExports(modulePath) {
var _a;
let moduleExports;
try {
moduleExports = await (_a = modulePath, Promise.resolve().then(() => __importStar(require(_a))));
}
catch (error) {
if (error.code !== 'MODULE_NOT_FOUND') {
throw error;
}
}
return moduleExports;
}
static async getModuleExportsFromProvider(modulePath, provider) {
let moduleExports;
try {
moduleExports = await provider.provide(modulePath);
}
catch (error) {
// Ignore error
}
return moduleExports;
}
static async getModuleExportsFromBindingsPath(bindingPath) {
return ((await this.getModuleExports(bindingPath)) ??
(await this.getModuleExports(path_1.default.join(process.cwd(), bindingPath))));
}
static async getModuleExportsFromAllPaths(bindingPath, options) {
const binding = (await this.getModuleExports(path_1.default.join(options.rootPath, bindingPath))) ??
(options.bindingProvider
? await this.getModuleExportsFromProvider(bindingPath, options.bindingProvider)
: await this.getModuleExportsFromBindingsPath(bindingPath));
if (!binding) {
throw new errors_1.BindingNotFoundError(bindingPath);
}
return binding;
}
static async extractWorkflowOptionsBindings(options) {
if (!options.bindingsPaths?.length) {
return {};
}
const bindings = await Promise.all(options.bindingsPaths.map(async (bindingPath) => this.getModuleExportsFromAllPaths(bindingPath, options)));
return Object.assign({}, ...bindings);
}
static async extractBinding(binding, options) {
const parentBindings = options.parentBindings ?? {};
const { name, value, path: bidningPath, fromParent, exportAll } = binding;
if (fromParent) {
return { [name]: parentBindings[name] };
}
if (value) {
return { [name]: value };
}
const bindingSource = await this.getModuleExportsFromAllPaths(bidningPath ?? 'bindings', options);
if (!name) {
return bindingSource;
}
const names = (0, common_1.toArray)(name);
if (names.length === 1) {
return { [name]: exportAll ? bindingSource : bindingSource[name] };
}
return (0, lodash_1.pick)(bindingSource, names);
}
static async extractBindings(options, bindings = []) {
if (bindings.length === 0) {
return {};
}
const bindingsData = await Promise.all(bindings.map(async (binding) => this.extractBinding(binding, options)));
return Object.assign({}, ...bindingsData);
}
static async getExecutor(workflow, options) {
if (workflow?.executor) {
const executor = options.currentBindings[workflow.executor];
if (typeof executor?.execute !== 'function') {
throw new errors_1.WorkflowCreationError('Workflow executor not found', workflow.executor);
}
return executor;
}
return options.executor ?? default_executor_1.DefaultWorkflowExecutor.INSTANCE;
}
}
exports.WorkflowUtils = WorkflowUtils;
//# sourceMappingURL=utils.js.map