feat(Set Node): Overhaul (#6348)

Github issue / Community forum post (link here to close automatically):
https://github.com/n8n-io/n8n/pull/6348

---------

Co-authored-by: Giulio Andreini <g.andreini@gmail.com>
Co-authored-by: Marcus <marcus@n8n.io>
This commit is contained in:
Michael Kret
2023-09-19 13:16:35 +03:00
committed by GitHub
parent 050ba706d3
commit 3a474552b2
42 changed files with 2626 additions and 410 deletions

View File

@@ -36,6 +36,7 @@ import type {
INodePropertyOptions,
ResourceMapperValue,
ValidationResult,
GenericValue,
} from './Interfaces';
import { isResourceMapperValue, isValidResourceLocatorParameterValue } from './type-guards';
import { deepCopy } from './utils';
@@ -1081,7 +1082,7 @@ export const validateFieldType = (
options?: INodePropertyOptions[],
): ValidationResult => {
if (value === null || value === undefined) return { valid: true };
const defaultErrorMessage = `'${fieldName}' expects a ${type} but we got '${String(value)}'.`;
const defaultErrorMessage = `'${fieldName}' expects a ${type} but we got '${String(value)}'`;
switch (type.toLowerCase()) {
case 'number': {
try {
@@ -1169,12 +1170,16 @@ export const tryToParseBoolean = (value: unknown): value is boolean => {
return value.toLowerCase() === 'true';
}
const num = Number(value);
if (num === 0) {
return false;
} else if (num === 1) {
return true;
// If value is not a empty string, try to parse it to a number
if (!(typeof value === 'string' && value.trim() === '')) {
const num = Number(value);
if (num === 0) {
return false;
} else if (num === 1) {
return true;
}
}
throw new Error(`Could not parse '${String(value)}' to boolean.`);
};
@@ -1214,7 +1219,17 @@ export const tryToParseTime = (value: unknown): string => {
export const tryToParseArray = (value: unknown): unknown[] => {
try {
const parsed = JSON.parse(String(value));
if (typeof value === 'object' && Array.isArray(value)) {
return value;
}
let parsed;
try {
parsed = JSON.parse(String(value));
} catch (e) {
parsed = JSON.parse(String(value).replace(/'/g, '"'));
}
if (!Array.isArray(parsed)) {
throw new Error(`The value "${String(value)}" is not a valid array.`);
}
@@ -1306,6 +1321,30 @@ export const validateResourceMapperParameter = (
return issues;
};
export const validateParameter = (
nodeProperties: INodeProperties,
value: GenericValue,
type: FieldType,
): string | undefined => {
const nodeName = nodeProperties.name;
const options = type === 'options' ? nodeProperties.options : undefined;
if (!value?.toString().startsWith('=')) {
const validationResult = validateFieldType(
nodeName,
value,
type,
options as INodePropertyOptions[],
);
if (!validationResult.valid && validationResult.errorMessage) {
return validationResult.errorMessage;
}
}
return undefined;
};
/**
* Adds an issue if the parameter is not defined
*
@@ -1430,6 +1469,19 @@ export function getParameterIssues(
foundIssues.parameters = { ...foundIssues.parameters, ...issues };
}
}
} else if (nodeProperties.validateType) {
const value = getParameterValueByPath(nodeValues, nodeProperties.name, path);
const error = validateParameter(nodeProperties, value, nodeProperties.validateType);
if (error) {
if (foundIssues.parameters === undefined) {
foundIssues.parameters = {};
}
if (foundIssues.parameters[nodeProperties.name] === undefined) {
foundIssues.parameters[nodeProperties.name] = [];
}
foundIssues.parameters[nodeProperties.name].push(error);
}
}
// Check if there are any child parameters