fix: recognize all trigger node types including executeWorkflowTrigger (#351) (#352)

This fix addresses issue #351 where Execute Workflow Trigger and other
trigger nodes were incorrectly treated as regular nodes, causing
"disconnected node" errors during partial workflow updates.

## Changes

**1. Created Shared Trigger Detection Utilities**
- src/utils/node-type-utils.ts:
  - isTriggerNode(): Recognizes ALL trigger types using flexible pattern matching
  - isActivatableTrigger(): Returns false for executeWorkflowTrigger (not activatable)
  - getTriggerTypeDescription(): Human-readable trigger descriptions

**2. Updated Workflow Validation**
- src/services/n8n-validation.ts:
  - Replaced hardcoded webhookTypes Set with isTriggerNode() function
  - Added validation preventing activation of workflows with only executeWorkflowTrigger
  - Now recognizes 200+ trigger types across n8n packages

**3. Updated Workflow Validator**
- src/services/workflow-validator.ts:
  - Replaced inline trigger detection with shared isTriggerNode() function
  - Ensures consistency across all validation code paths

**4. Comprehensive Tests**
- tests/unit/utils/node-type-utils.test.ts:
  - Added 30+ tests for trigger detection functions
  - Validates all trigger types are recognized correctly
  - Confirms executeWorkflowTrigger is trigger but not activatable

## Impact

Before:
- Execute Workflow Trigger flagged as disconnected node
- Schedule/email/polling triggers also rejected
- Users forced to keep unnecessary webhook triggers

After:
- ALL trigger types recognized (executeWorkflowTrigger, scheduleTrigger, etc.)
- No disconnected node errors for triggers
- Clear error when activating workflow with only executeWorkflowTrigger
- Future-proof (new triggers automatically supported)

## Testing

- Build:  Passes
- Typecheck:  Passes
- Unit tests:  All pass
- Validation test:  Trigger detection working correctly

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
This commit is contained in:
Romuald Członkowski
2025-10-23 09:42:46 +02:00
committed by GitHub
parent c76ffd9fb1
commit eac4e67101
7 changed files with 366 additions and 124 deletions

View File

@@ -9,6 +9,8 @@
* notes being incorrectly flagged as disconnected nodes.
*/
import { isTriggerNode as isTriggerNodeImpl } from './node-type-utils';
/**
* Check if a node type is a sticky note (documentation-only node)
*
@@ -38,29 +40,27 @@ export function isStickyNote(nodeType: string): boolean {
/**
* Check if a node type is a trigger node
*
* This function delegates to the comprehensive trigger detection implementation
* in node-type-utils.ts which supports 200+ trigger types using flexible
* pattern matching instead of a hardcoded list.
*
* Trigger nodes:
* - Start workflow execution
* - Only need outgoing connections (no incoming connections required)
* - Include webhooks, manual triggers, schedule triggers, etc.
* - Include webhooks, manual triggers, schedule triggers, email triggers, etc.
* - Are the entry points for workflow execution
*
* Examples:
* - Webhooks: Listen for HTTP requests
* - Manual triggers: Started manually by user
* - Schedule/Cron triggers: Run on a schedule
* - Execute Workflow Trigger: Invoked by other workflows
*
* @param nodeType - The node type to check
* @returns true if the node is a trigger, false otherwise
*/
export function isTriggerNode(nodeType: string): boolean {
const triggerTypes = [
'n8n-nodes-base.webhook',
'n8n-nodes-base.webhookTrigger',
'n8n-nodes-base.manualTrigger',
'n8n-nodes-base.cronTrigger',
'n8n-nodes-base.scheduleTrigger'
];
return triggerTypes.includes(nodeType);
return isTriggerNodeImpl(nodeType);
}
/**