diff --git a/packages/editor-ui/src/components/ExpressionInput.vue b/packages/editor-ui/src/components/ExpressionInput.vue index d0c734e2c6..13c914ed17 100644 --- a/packages/editor-ui/src/components/ExpressionInput.vue +++ b/packages/editor-ui/src/components/ExpressionInput.vue @@ -265,7 +265,7 @@ export default mixins( } else if (value.charAt(0) === '^') { // Is variable - let displayValue = `{{${value.slice(1)}}}` as string | number | boolean | null; + let displayValue = `{{${value.slice(1)}}}` as string | number | boolean | null | undefined; if (this.resolvedValue) { displayValue = [null, undefined].includes(displayValue as null | undefined) ? '' : displayValue; displayValue = this.resolveParameterString((displayValue as string).toString()) as NodeParameterValue; diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 752cb46460..d19955eba0 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -841,7 +841,7 @@ export class ActiveCampaign implements INodeType { source: this.getNodeParameter('source', i) as string, email: this.getNodeParameter('email', i) as string, totalPrice: this.getNodeParameter('totalPrice', i) as number, - currency: this.getNodeParameter('currency', i).toString().toUpperCase() as string, + currency: this.getNodeParameter('currency', i)!.toString().toUpperCase() as string, externalCreatedDate: this.getNodeParameter('externalCreatedDate', i) as string, connectionid: this.getNodeParameter('connectionid', i) as number, customerid: this.getNodeParameter('customerid', i) as number, diff --git a/packages/nodes-base/nodes/If.node.ts b/packages/nodes-base/nodes/If.node.ts index 70bac4fb5f..447f985bac 100644 --- a/packages/nodes-base/nodes/If.node.ts +++ b/packages/nodes-base/nodes/If.node.ts @@ -234,27 +234,27 @@ export class If implements INodeType { const compareOperationFunctions: { [key: string]: (value1: NodeParameterValue, value2: NodeParameterValue) => boolean; } = { - contains: (value1: NodeParameterValue, value2: NodeParameterValue) => value1.toString().includes(value2.toString()), - notContains: (value1: NodeParameterValue, value2: NodeParameterValue) => !value1.toString().includes(value2.toString()), + contains: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || '').toString().includes((value2 || '').toString()), + notContains: (value1: NodeParameterValue, value2: NodeParameterValue) => !(value1 || '').toString().includes((value2 || '').toString()), equal: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 === value2, notEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 !== value2, - larger: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 > value2, - largerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 >= value2, - smaller: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 < value2, - smallerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 <= value2, + larger: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) > (value2 || 0), + largerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) >= (value2 || 0), + smaller: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) < (value2 || 0), + smallerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) <= (value2 || 0), regex: (value1: NodeParameterValue, value2: NodeParameterValue) => { - const regexMatch = value2.toString().match(new RegExp('^/(.*?)/([gimy]*)$')); + const regexMatch = (value2 || '').toString().match(new RegExp('^/(.*?)/([gimy]*)$')); let regex: RegExp; if (!regexMatch) { - regex = new RegExp(value2.toString()); + regex = new RegExp((value2 || '').toString()); } else if (regexMatch.length === 1) { regex = new RegExp(regexMatch[1]); } else { regex = new RegExp(regexMatch[1], regexMatch[2]); } - return !!value1.toString().match(regex); + return !!(value1 || '').toString().match(regex); }, }; diff --git a/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts b/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts index e3146bc8aa..26981c2038 100644 --- a/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts +++ b/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts @@ -2214,7 +2214,7 @@ export class Salesforce implements INodeType { const jsonParameters = this.getNodeParameter('jsonParameters', i) as boolean; let variables = {}; if (jsonParameters) { - variables = this.getNodeParameter('variablesJson', i); + variables = this.getNodeParameter('variablesJson', i) as object; } else { // Input variables are defined in UI const setInputVariable = this.getNodeParameter('variablesUi', i, {}) as IDataObject; diff --git a/packages/nodes-base/nodes/Switch.node.ts b/packages/nodes-base/nodes/Switch.node.ts index 2cf3ee598e..013c362dbc 100644 --- a/packages/nodes-base/nodes/Switch.node.ts +++ b/packages/nodes-base/nodes/Switch.node.ts @@ -468,27 +468,27 @@ export class Switch implements INodeType { const compareOperationFunctions: { [key: string]: (value1: NodeParameterValue, value2: NodeParameterValue) => boolean; } = { - contains: (value1: NodeParameterValue, value2: NodeParameterValue) => value1.toString().includes(value2.toString()), - notContains: (value1: NodeParameterValue, value2: NodeParameterValue) => !value1.toString().includes(value2.toString()), + contains: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || '').toString().includes((value2 || '').toString()), + notContains: (value1: NodeParameterValue, value2: NodeParameterValue) => !(value1 || '').toString().includes((value2 || '').toString()), equal: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 === value2, notEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 !== value2, - larger: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 > value2, - largerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 >= value2, - smaller: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 < value2, - smallerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => value1 <= value2, + larger: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) > (value2 || 0), + largerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) >= (value2 || 0), + smaller: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) < (value2 || 0), + smallerEqual: (value1: NodeParameterValue, value2: NodeParameterValue) => (value1 || 0) <= (value2 || 0), regex: (value1: NodeParameterValue, value2: NodeParameterValue) => { - const regexMatch = value2.toString().match(new RegExp('^/(.*?)/([gimy]*)$')); + const regexMatch = (value2 || '').toString().match(new RegExp('^/(.*?)/([gimy]*)$')); let regex: RegExp; if (!regexMatch) { - regex = new RegExp(value2.toString()); + regex = new RegExp((value2 || '').toString()); } else if (regexMatch.length === 1) { regex = new RegExp(regexMatch[1]); } else { regex = new RegExp(regexMatch[1], regexMatch[2]); } - return !!value1.toString().match(regex); + return !!(value1 || '').toString().match(regex); }, }; diff --git a/packages/workflow/src/Expression.ts b/packages/workflow/src/Expression.ts index 6026c3eee0..7ad9a84ee9 100644 --- a/packages/workflow/src/Expression.ts +++ b/packages/workflow/src/Expression.ts @@ -205,7 +205,7 @@ export class Expression { } return returnData as NodeParameterValue[] | INodeParameters[]; - } else if (parameterValue === null) { + } else if (parameterValue === null || parameterValue === undefined) { return parameterValue; } else { // Data is an object diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 7f1deea37b..bf0fc63e13 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -383,7 +383,7 @@ export interface INodeExecuteFunctions { // The values a node property can have -export type NodeParameterValue = string | number | boolean; +export type NodeParameterValue = string | number | boolean | undefined | null; export interface INodeParameters { // TODO: Later also has to be possible to add multiple ones with the name name. So array has to be possible diff --git a/packages/workflow/src/NodeHelpers.ts b/packages/workflow/src/NodeHelpers.ts index f91889463b..15d4d4d28c 100644 --- a/packages/workflow/src/NodeHelpers.ts +++ b/packages/workflow/src/NodeHelpers.ts @@ -642,7 +642,7 @@ export function getNodeParameters(nodePropertiesArray: INodeProperties[], nodeVa } // Itterate over all collections - for (const itemName of Object.keys(propertyValues)) { + for (const itemName of Object.keys(propertyValues || {})) { if (nodeProperties.typeOptions !== undefined && nodeProperties.typeOptions.multipleValues === true) { // Multiple can be set so will be an array diff --git a/packages/workflow/src/Workflow.ts b/packages/workflow/src/Workflow.ts index 6386786a80..47e2fca9c5 100644 --- a/packages/workflow/src/Workflow.ts +++ b/packages/workflow/src/Workflow.ts @@ -380,8 +380,8 @@ export class Workflow { const returnData: any = {}; // tslint:disable-line:no-any - for (const parameterName of Object.keys(parameterValue)) { - returnData[parameterName] = this.renameNodeInExpressions(parameterValue[parameterName], currentName, newName); + for (const parameterName of Object.keys(parameterValue || {})) { + returnData[parameterName] = this.renameNodeInExpressions(parameterValue![parameterName], currentName, newName); } return returnData;