diff --git a/packages/workflow/src/NodeHelpers.ts b/packages/workflow/src/NodeHelpers.ts index 1ca01f8f6a..23350559d1 100644 --- a/packages/workflow/src/NodeHelpers.ts +++ b/packages/workflow/src/NodeHelpers.ts @@ -538,7 +538,7 @@ export function getParameterResolveOrder( */ export function getNodeParameters( nodePropertiesArray: INodeProperties[], - nodeValues: INodeParameters, + nodeValues: INodeParameters | null, returnDefaults: boolean, returnNoneDisplayed: boolean, node: INode | null, @@ -588,16 +588,17 @@ export function getNodeParameters( nodeValuesRoot = nodeValuesRoot || nodeValuesDisplayCheck; // Go through the parameters in order of their dependencies - const parameterItterationOrderIndex = getParameterResolveOrder( + const parameterIterationOrderIndex = getParameterResolveOrder( nodePropertiesArray, parameterDependencies, ); - for (const parameterIndex of parameterItterationOrderIndex) { + for (const parameterIndex of parameterIterationOrderIndex) { const nodeProperties = nodePropertiesArray[parameterIndex]; if ( - nodeValues[nodeProperties.name] === undefined && - (!returnDefaults || parentType === 'collection') + !nodeValues || + (nodeValues[nodeProperties.name] === undefined && + (!returnDefaults || parentType === 'collection')) ) { // The value is not defined so go to the next continue; diff --git a/packages/workflow/test/NodeHelpers.test.ts b/packages/workflow/test/NodeHelpers.test.ts index 0814bf40f0..a35dd9cd2e 100644 --- a/packages/workflow/test/NodeHelpers.test.ts +++ b/packages/workflow/test/NodeHelpers.test.ts @@ -2,12 +2,12 @@ import type { INodeParameters, INodeProperties } from '@/Interfaces'; import { getNodeParameters } from '@/NodeHelpers'; describe('NodeHelpers', () => { - describe('getParameterValue', () => { + describe('getNodeParameters', () => { const tests: Array<{ description: string; input: { nodePropertiesArray: INodeProperties[]; - nodeValues: INodeParameters; + nodeValues: INodeParameters | null; }; output: { noneDisplayedFalse: { @@ -3336,6 +3336,61 @@ describe('NodeHelpers', () => { }, }, }, + { + description: 'nodeValues is null (for example when resolving expression fails)', + input: { + nodePropertiesArray: [ + { + displayName: 'Custom Properties', + name: 'customPropertiesUi', + placeholder: 'Add Custom Property', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'customPropertiesValues', + displayName: 'Custom Property', + values: [ + { + displayName: 'Property Name or ID', + name: 'property', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDealCustomProperties', + }, + default: '', + description: + 'Name of the property. Choose from the list, or specify an ID using an expression.', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + required: true, + description: 'Value of the property', + }, + ], + }, + ], + }, + ], + nodeValues: null, + }, + output: { + noneDisplayedFalse: { + defaultsFalse: {}, + defaultsTrue: {}, + }, + noneDisplayedTrue: { + defaultsFalse: {}, + defaultsTrue: {}, + }, + }, + }, ]; for (const testData of tests) {