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:
Mutasem Aldmour
2022-09-22 19:04:26 +02:00
committed by GitHub
parent d01f7d4d93
commit 469c391fee
12 changed files with 85 additions and 361 deletions

View File

@@ -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 =

View File

@@ -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;
}

View File

@@ -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(