UNPKG

@bernierllc/temporal-workflow-ui

Version:

Thin domain-specific wrapper around @bernierllc/generic-workflow-ui for Temporal workflows

98 lines (96 loc) 3.07 kB
"use strict"; /* Copyright (c) 2025 Bernier LLC This file is licensed to the client under a limited-use license. The client may use and modify this code *only within the scope of the project it was delivered for*. Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.validateTransition = validateTransition; /** * Validate a Temporal workflow transition * * @param transition - Temporal workflow transition * @returns Array of validation errors */ function validateTransition(transition) { const errors = []; // Validate from/to are not empty if (!transition.from || transition.from.trim() === '') { errors.push({ transitionId: transition.id, field: 'from', message: 'Transition must have a source stage (from)', severity: 'error', }); } if (!transition.to || transition.to.trim() === '') { errors.push({ transitionId: transition.id, field: 'to', message: 'Transition must have a target stage (to)', severity: 'error', }); } // Validate from and to are different if (transition.from === transition.to) { errors.push({ transitionId: transition.id, message: 'Transition cannot connect a stage to itself', severity: 'error', }); } // Validate timeout if present if (transition.metadata?.timeout !== undefined) { if (transition.metadata.timeout < 0) { errors.push({ transitionId: transition.id, field: 'metadata.timeout', message: 'Transition timeout must be >= 0', severity: 'error', }); } } // Validate condition syntax if present (basic check) if (transition.condition) { if (transition.condition.trim() === '') { errors.push({ transitionId: transition.id, field: 'condition', message: 'Transition condition cannot be empty', severity: 'error', }); } // Basic syntax validation - check for balanced parentheses if (!hasBalancedParentheses(transition.condition)) { errors.push({ transitionId: transition.id, field: 'condition', message: 'Transition condition has unbalanced parentheses', severity: 'error', }); } } return errors; } /** * Check if a string has balanced parentheses * * @param str - String to check * @returns True if balanced */ function hasBalancedParentheses(str) { let count = 0; for (const char of str) { if (char === '(') { count++; } else if (char === ')') { count--; } if (count < 0) { return false; } } return count === 0; }