mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
fix(core): Fix resolve RL values in expressions (#4173)
* update interface * update expression resolving * 🔥 remove ExtractValue functions * add flags * update resolving * update expr * fix for list mode * clean up * Fix up * update guard * fix bug with switching * update to handle expr referencing * fix legacy expression * fix when switching * update spacing Co-authored-by: Valya Bullions <valya@n8n.io>
This commit is contained in:
@@ -543,10 +543,6 @@ export interface IN8nRequestOperationPaginationOffset extends IN8nRequestOperati
|
||||
};
|
||||
}
|
||||
|
||||
export interface IGetNodeParameterOptions {
|
||||
extractValue?: boolean;
|
||||
}
|
||||
|
||||
export interface IExecuteFunctions {
|
||||
continueOnFail(): boolean;
|
||||
evaluateExpression(expression: string, itemIndex: number): NodeParameterValueType;
|
||||
@@ -568,7 +564,6 @@ export interface IExecuteFunctions {
|
||||
parameterName: string,
|
||||
itemIndex: number,
|
||||
fallbackValue?: any,
|
||||
options?: IGetNodeParameterOptions,
|
||||
): NodeParameterValueType | object;
|
||||
getWorkflowDataProxy(itemIndex: number): IWorkflowDataProxyData;
|
||||
getWorkflowStaticData(type: string): IDataObject;
|
||||
@@ -606,11 +601,7 @@ export interface IExecuteSingleFunctions {
|
||||
getItemIndex(): number;
|
||||
getMode(): WorkflowExecuteMode;
|
||||
getNode(): INode;
|
||||
getNodeParameter(
|
||||
parameterName: string,
|
||||
fallbackValue?: any,
|
||||
options?: IGetNodeParameterOptions,
|
||||
): NodeParameterValueType | object;
|
||||
getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValueType | object;
|
||||
getRestApiUrl(): string;
|
||||
getTimezone(): string;
|
||||
getExecuteData(): IExecuteData;
|
||||
@@ -656,11 +647,7 @@ export interface ICredentialTestFunctions {
|
||||
export interface ILoadOptionsFunctions {
|
||||
getCredentials(type: string): Promise<ICredentialDataDecryptedObject>;
|
||||
getNode(): INode;
|
||||
getNodeParameter(
|
||||
parameterName: string,
|
||||
fallbackValue?: any,
|
||||
options?: IGetNodeParameterOptions,
|
||||
): NodeParameterValueType | object;
|
||||
getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValueType | object;
|
||||
getCurrentNodeParameter(parameterName: string): NodeParameterValueType | object | undefined;
|
||||
getCurrentNodeParameters(): INodeParameters | undefined;
|
||||
getTimezone(): string;
|
||||
@@ -693,11 +680,7 @@ export interface IHookFunctions {
|
||||
getActivationMode(): WorkflowActivateMode;
|
||||
getNode(): INode;
|
||||
getNodeWebhookUrl: (name: string) => string | undefined;
|
||||
getNodeParameter(
|
||||
parameterName: string,
|
||||
fallbackValue?: any,
|
||||
options?: IGetNodeParameterOptions,
|
||||
): NodeParameterValueType | object;
|
||||
getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValueType | object;
|
||||
getTimezone(): string;
|
||||
getWebhookDescription(name: string): IWebhookDescription | undefined;
|
||||
getWebhookName(): string;
|
||||
@@ -723,11 +706,7 @@ export interface IPollFunctions {
|
||||
getMode(): WorkflowExecuteMode;
|
||||
getActivationMode(): WorkflowActivateMode;
|
||||
getNode(): INode;
|
||||
getNodeParameter(
|
||||
parameterName: string,
|
||||
fallbackValue?: any,
|
||||
options?: IGetNodeParameterOptions,
|
||||
): NodeParameterValueType | object;
|
||||
getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValueType | object;
|
||||
getRestApiUrl(): string;
|
||||
getTimezone(): string;
|
||||
getWorkflow(): IWorkflowMetadata;
|
||||
@@ -757,11 +736,7 @@ export interface ITriggerFunctions {
|
||||
getMode(): WorkflowExecuteMode;
|
||||
getActivationMode(): WorkflowActivateMode;
|
||||
getNode(): INode;
|
||||
getNodeParameter(
|
||||
parameterName: string,
|
||||
fallbackValue?: any,
|
||||
options?: IGetNodeParameterOptions,
|
||||
): NodeParameterValueType | object;
|
||||
getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValueType | object;
|
||||
getRestApiUrl(): string;
|
||||
getTimezone(): string;
|
||||
getWorkflow(): IWorkflowMetadata;
|
||||
@@ -786,11 +761,7 @@ export interface IWebhookFunctions {
|
||||
getHeaderData(): object;
|
||||
getMode(): WorkflowExecuteMode;
|
||||
getNode(): INode;
|
||||
getNodeParameter(
|
||||
parameterName: string,
|
||||
fallbackValue?: any,
|
||||
options?: IGetNodeParameterOptions,
|
||||
): NodeParameterValueType | object;
|
||||
getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValueType | object;
|
||||
getNodeWebhookUrl: (name: string) => string | undefined;
|
||||
getParamsData(): object;
|
||||
getQueryData(): object;
|
||||
@@ -905,10 +876,12 @@ export interface IResourceLocatorResult {
|
||||
}
|
||||
|
||||
export interface INodeParameterResourceLocator {
|
||||
__rl: true;
|
||||
mode: ResourceLocatorModes;
|
||||
value: NodeParameterValue;
|
||||
cachedResultName?: string;
|
||||
cachedResultUrl?: string;
|
||||
__regex?: string;
|
||||
}
|
||||
|
||||
export type NodeParameterValueType =
|
||||
|
||||
@@ -643,15 +643,8 @@ export class RoutingNode {
|
||||
if (nodeProperties.routing) {
|
||||
let parameterValue: string | undefined;
|
||||
if (basePath + nodeProperties.name && 'type' in nodeProperties) {
|
||||
// Extract value if it has extractValue defined or if it's a
|
||||
// resourceLocator component. Resource locators are likely to have extractors
|
||||
// and we can't know if the mode has one unless we dig all the way in.
|
||||
const shouldExtractValue =
|
||||
nodeProperties.extractValue !== undefined || nodeProperties.type === 'resourceLocator';
|
||||
parameterValue = executeSingleFunctions.getNodeParameter(
|
||||
basePath + nodeProperties.name,
|
||||
undefined,
|
||||
{ extractValue: shouldExtractValue },
|
||||
) as string;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,12 +23,19 @@ import {
|
||||
ITaskData,
|
||||
IWorkflowDataProxyAdditionalKeys,
|
||||
IWorkflowDataProxyData,
|
||||
INodeParameterResourceLocator,
|
||||
NodeHelpers,
|
||||
NodeParameterValueType,
|
||||
Workflow,
|
||||
WorkflowExecuteMode,
|
||||
} from '.';
|
||||
|
||||
export function isResourceLocatorValue(value: unknown): value is INodeParameterResourceLocator {
|
||||
return Boolean(
|
||||
typeof value === 'object' && value && 'mode' in value && 'value' in value && '__rl' in value,
|
||||
);
|
||||
}
|
||||
|
||||
export class WorkflowDataProxy {
|
||||
private workflow: Workflow;
|
||||
|
||||
@@ -194,6 +201,20 @@ export class WorkflowDataProxy {
|
||||
returnValue = node.parameters[name];
|
||||
}
|
||||
|
||||
if (isResourceLocatorValue(returnValue)) {
|
||||
if (returnValue.__regex && typeof returnValue.value === 'string') {
|
||||
const expr = new RegExp(returnValue.__regex);
|
||||
const extracted = expr.exec(returnValue.value);
|
||||
if (extracted && extracted.length >= 2) {
|
||||
returnValue = extracted[1];
|
||||
} else {
|
||||
return returnValue.value;
|
||||
}
|
||||
} else {
|
||||
returnValue = returnValue.value;
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof returnValue === 'string' && returnValue.charAt(0) === '=') {
|
||||
// The found value is an expression so resolve it
|
||||
return that.workflow.expression.getParameterValue(
|
||||
|
||||
Reference in New Issue
Block a user