feat: add _cnd conditional operator support and n8n 2.0+ executeWorkflowTrigger fix

Added:
- Support for all 12 _cnd operators in displayOptions validation (eq, not, gte, lte, gt, lt, between, startsWith, endsWith, includes, regex, exists)
- Version-based visibility checking with @version in config
- 42 new unit tests for _cnd operators

Fixed:
- n8n 2.0+ breaking change: executeWorkflowTrigger now recognized as activatable trigger
- Removed outdated validation blocking Execute Workflow Trigger workflows

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Romuald Członkowski
2025-12-17 15:42:05 +01:00
parent 0f13e7aeee
commit 68bc5744dc
28 changed files with 738 additions and 154 deletions

View File

@@ -257,9 +257,10 @@ describe('node-type-utils', () => {
});
describe('isActivatableTrigger', () => {
it('executeWorkflowTrigger is NOT activatable', () => {
expect(isActivatableTrigger('n8n-nodes-base.executeWorkflowTrigger')).toBe(false);
expect(isActivatableTrigger('nodes-base.executeWorkflowTrigger')).toBe(false);
it('executeWorkflowTrigger IS activatable (n8n 2.0+ requires activation)', () => {
// Since n8n 2.0, executeWorkflowTrigger MUST be activated to work
expect(isActivatableTrigger('n8n-nodes-base.executeWorkflowTrigger')).toBe(true);
expect(isActivatableTrigger('nodes-base.executeWorkflowTrigger')).toBe(true);
});
it('webhook triggers ARE activatable', () => {
@@ -346,17 +347,18 @@ describe('node-type-utils', () => {
}
});
it('only executeWorkflowTrigger is non-activatable', () => {
it('all triggers are activatable (n8n 2.0+ behavior)', () => {
// Since n8n 2.0, all triggers including executeWorkflowTrigger are activatable
const triggers = [
{ type: 'n8n-nodes-base.webhook', activatable: true },
{ type: 'n8n-nodes-base.scheduleTrigger', activatable: true },
{ type: 'n8n-nodes-base.executeWorkflowTrigger', activatable: false },
{ type: 'n8n-nodes-base.emailTrigger', activatable: true }
'n8n-nodes-base.webhook',
'n8n-nodes-base.scheduleTrigger',
'n8n-nodes-base.executeWorkflowTrigger',
'n8n-nodes-base.emailTrigger'
];
for (const { type, activatable } of triggers) {
for (const type of triggers) {
expect(isTriggerNode(type)).toBe(true); // All are triggers
expect(isActivatableTrigger(type)).toBe(activatable); // But only some are activatable
expect(isActivatableTrigger(type)).toBe(true); // All are activatable in n8n 2.0+
}
});
});