@bernierllc/temporal-workflow-ui
Version:
Thin domain-specific wrapper around @bernierllc/generic-workflow-ui for Temporal workflows
98 lines (96 loc) • 3.07 kB
JavaScript
"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;
}