mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
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:
@@ -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 => {
|
||||
|
||||
Reference in New Issue
Block a user