feat(core): Improve paired item and add additional variables (#3765)

*  Remove duplicate and old string

*  Add telemetry

*  Futher improvements

*  Change error message and display only name of last parameter

* 👕 Fix lint issue

*  Remove not needed comments

*  Rename properties, add new ones and improve error messages

*  Add support for $execution, $prevNode and make it possible to use proxies as object

*  Some small improvements

* 🐛 Fix error message

*  Improve some error messages

*  Change resumeUrl variable and display in editor

*  Fix and extend tests

*  Multiple pairedItem improvements

*  Display "More Info" link with error messages if user can fix issue

*  Display different errors in Function Nodes
This commit is contained in:
Jan Oberhauser
2022-09-29 23:02:25 +02:00
committed by GitHub
parent 737cbf9694
commit 5526057efc
15 changed files with 684 additions and 301 deletions

View File

@@ -1487,11 +1487,20 @@ export async function requestWithAuthentication(
*/
export function getAdditionalKeys(
additionalData: IWorkflowExecuteAdditionalData,
mode: WorkflowExecuteMode,
): IWorkflowDataProxyAdditionalKeys {
const executionId = additionalData.executionId || PLACEHOLDER_EMPTY_EXECUTION_ID;
const resumeUrl = `${additionalData.webhookWaitingBaseUrl}/${executionId}`;
return {
$execution: {
id: executionId,
mode: mode === 'manual' ? 'test' : 'production',
resumeUrl,
},
// deprecated
$executionId: executionId,
$resumeWebhookUrl: `${additionalData.webhookWaitingBaseUrl}/${executionId}`,
$resumeWebhookUrl: resumeUrl,
};
}
@@ -1601,7 +1610,7 @@ export async function getCredentials(
// TODO: solve using credentials via expression
// if (name.charAt(0) === '=') {
// // If the credential name is an expression resolve it
// const additionalKeys = getAdditionalKeys(additionalData);
// const additionalKeys = getAdditionalKeys(additionalData, mode);
// name = workflow.expression.getParameterValue(
// name,
// runExecutionData || null,
@@ -1638,30 +1647,29 @@ export function getNode(node: INode): INode {
* Clean up parameter data to make sure that only valid data gets returned
* INFO: Currently only converts Luxon Dates as we know for sure it will not be breaking
*/
function cleanupParameterData(inputData: NodeParameterValueType): NodeParameterValueType {
if (inputData === null || inputData === undefined) {
return inputData;
function cleanupParameterData(inputData: NodeParameterValueType): void {
if (typeof inputData !== 'object' || inputData === null) {
return;
}
if (Array.isArray(inputData)) {
inputData.forEach((value) => cleanupParameterData(value));
return inputData;
}
if (inputData.constructor.name === 'DateTime') {
// Is a special luxon date so convert to string
return inputData.toString();
return;
}
if (typeof inputData === 'object') {
Object.keys(inputData).forEach((key) => {
inputData[key as keyof typeof inputData] = cleanupParameterData(
inputData[key as keyof typeof inputData],
);
if (typeof inputData[key as keyof typeof inputData] === 'object') {
if (inputData[key as keyof typeof inputData]?.constructor.name === 'DateTime') {
// Is a special luxon date so convert to string
inputData[key as keyof typeof inputData] =
inputData[key as keyof typeof inputData]?.toString();
} else {
cleanupParameterData(inputData[key as keyof typeof inputData]);
}
}
});
}
return inputData;
}
/**
@@ -1710,7 +1718,7 @@ export function getNodeParameter(
executeData,
);
returnData = cleanupParameterData(returnData);
cleanupParameterData(returnData);
} catch (e) {
if (e.context) e.context.parameter = parameterName;
e.cause = value;
@@ -1883,7 +1891,7 @@ export function getExecutePollFunctions(
itemIndex,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
undefined,
fallbackValue,
options,
@@ -2032,7 +2040,7 @@ export function getExecuteTriggerFunctions(
itemIndex,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
undefined,
fallbackValue,
options,
@@ -2160,7 +2168,7 @@ export function getExecuteFunctions(
connectionInputData,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
executeData,
);
},
@@ -2237,7 +2245,7 @@ export function getExecuteFunctions(
itemIndex,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
executeData,
fallbackValue,
options,
@@ -2272,7 +2280,7 @@ export function getExecuteFunctions(
{},
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
executeData,
);
return dataProxy.getDataProxy();
@@ -2421,7 +2429,7 @@ export function getExecuteSingleFunctions(
connectionInputData,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
executeData,
);
},
@@ -2501,7 +2509,7 @@ export function getExecuteSingleFunctions(
itemIndex,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
executeData,
fallbackValue,
options,
@@ -2521,7 +2529,7 @@ export function getExecuteSingleFunctions(
{},
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
executeData,
);
return dataProxy.getDataProxy();
@@ -2658,6 +2666,7 @@ export function getLoadOptionsFunctions(
const runExecutionData: IRunExecutionData | null = null;
const itemIndex = 0;
const runIndex = 0;
const mode = 'internal' as WorkflowExecuteMode;
const connectionInputData: INodeExecutionData[] = [];
return getNodeParameter(
@@ -2668,9 +2677,9 @@ export function getLoadOptionsFunctions(
node,
parameterName,
itemIndex,
'internal' as WorkflowExecuteMode,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
undefined,
fallbackValue,
options,
@@ -2792,7 +2801,7 @@ export function getExecuteHookFunctions(
itemIndex,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
undefined,
fallbackValue,
options,
@@ -2806,7 +2815,7 @@ export function getExecuteHookFunctions(
additionalData,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
isTest,
);
},
@@ -2945,7 +2954,7 @@ export function getExecuteWebhookFunctions(
itemIndex,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
undefined,
fallbackValue,
options,
@@ -2983,7 +2992,7 @@ export function getExecuteWebhookFunctions(
additionalData,
mode,
additionalData.timezone,
getAdditionalKeys(additionalData),
getAdditionalKeys(additionalData, mode),
);
},
getTimezone: (): string => {