🔀 Merge branch 'master' into oauth-support

This commit is contained in:
Jan Oberhauser
2020-05-12 01:56:27 +02:00
159 changed files with 20155 additions and 2001 deletions

View File

@@ -21,7 +21,7 @@ Software: n8n
License: Apache 2.0
Licensor: Jan Oberhauser
Licensor: n8n GmbH
---------------------------------------------------------------------

View File

@@ -1,6 +1,6 @@
{
"name": "n8n-workflow",
"version": "0.28.0",
"version": "0.30.0",
"description": "Workflow base code of n8n",
"license": "SEE LICENSE IN LICENSE.md",
"homepage": "https://n8n.io",
@@ -31,7 +31,7 @@
"@types/node": "^10.10.1",
"jest": "^24.9.0",
"ts-jest": "^24.0.2",
"tslint": "^5.17.0",
"tslint": "^6.1.2",
"typescript": "~3.7.4"
},
"dependencies": {

View File

@@ -328,6 +328,7 @@ export interface INode {
type: string;
position: [number, number];
disabled?: boolean;
notesInFlow?: boolean;
retryOnFail?: boolean;
maxTries?: number;
waitBetweenTries?: number;
@@ -587,7 +588,7 @@ export interface IWorkflowMetadata {
active: boolean;
}
export type WebhookHttpMethod = 'GET' | 'POST';
export type WebhookHttpMethod = 'GET' | 'POST' | 'HEAD';
export interface IWebhookResponseData {
workflowData?: INodeExecutionData[][];
@@ -720,7 +721,7 @@ export interface IWorkflowExecuteAdditionalData {
timezone: string;
webhookBaseUrl: string;
webhookTestBaseUrl: string;
currentNodeParameters? : INodeParameters[];
currentNodeParameters? : INodeParameters;
}
export type WorkflowExecuteMode = 'cli' | 'error' | 'integrated' | 'internal' | 'manual' | 'retry' | 'trigger' | 'webhook';

View File

@@ -277,6 +277,7 @@ export function displayParameter(nodeValues: INodeParameters, parameter: INodePr
nodeValuesRoot = nodeValuesRoot || nodeValues;
let value;
const values: any[] = []; // tslint:disable-line:no-any
if (parameter.displayOptions.show) {
// All the defined rules have to match to display parameter
for (const propertyName of Object.keys(parameter.displayOptions.show)) {
@@ -288,7 +289,14 @@ export function displayParameter(nodeValues: INodeParameters, parameter: INodePr
value = get(nodeValues, propertyName);
}
if (value === undefined || !parameter.displayOptions.show[propertyName].includes(value as string)) {
values.length = 0;
if (!Array.isArray(value)) {
values.push(value);
} else {
values.push.apply(values, value);
}
if (values.length === 0 || !parameter.displayOptions.show[propertyName].some(v => values.includes(v))) {
return false;
}
}
@@ -304,7 +312,15 @@ export function displayParameter(nodeValues: INodeParameters, parameter: INodePr
// Get the value from current level
value = get(nodeValues, propertyName);
}
if (value !== undefined && parameter.displayOptions.hide[propertyName].includes(value as string)) {
values.length = 0;
if (!Array.isArray(value)) {
values.push(value);
} else {
values.push.apply(values, value);
}
if (values.length !== 0 && parameter.displayOptions.hide[propertyName].some(v => values.includes(v))) {
return false;
}
}
@@ -728,12 +744,6 @@ export function getNodeWebhooks(workflow: Workflow, node: INode, additionalData:
return [];
}
if (workflow.id === undefined) {
// Workflow has no id which means it is not saved and so webhooks
// will not be enabled
return [];
}
const nodeType = workflow.nodeTypes.getByName(node.type) as INodeType;
if (nodeType.description.webhooks === undefined) {
@@ -741,12 +751,14 @@ export function getNodeWebhooks(workflow: Workflow, node: INode, additionalData:
return [];
}
const workflowId = workflow.id || '__UNSAVED__';
const returnData: IWebhookData[] = [];
for (const webhookDescription of nodeType.description.webhooks) {
let nodeWebhookPath = workflow.getSimpleParameterValue(node, webhookDescription['path'], 'GET');
if (nodeWebhookPath === undefined) {
// TODO: Use a proper logger
console.error(`No webhook path could be found for node "${node.name}" in workflow "${workflow.id}".`);
console.error(`No webhook path could be found for node "${node.name}" in workflow "${workflowId}".`);
continue;
}
@@ -756,13 +768,13 @@ export function getNodeWebhooks(workflow: Workflow, node: INode, additionalData:
nodeWebhookPath = nodeWebhookPath.slice(1);
}
const path = getNodeWebhookPath(workflow.id, node, nodeWebhookPath);
const path = getNodeWebhookPath(workflowId, node, nodeWebhookPath);
const httpMethod = workflow.getSimpleParameterValue(node, webhookDescription['httpMethod'], 'GET');
if (httpMethod === undefined) {
// TODO: Use a proper logger
console.error(`The webhook "${path}" for node "${node.name}" in workflow "${workflow.id}" could not be added because the httpMethod is not defined.`);
console.error(`The webhook "${path}" for node "${node.name}" in workflow "${workflowId}" could not be added because the httpMethod is not defined.`);
continue;
}
@@ -771,7 +783,7 @@ export function getNodeWebhooks(workflow: Workflow, node: INode, additionalData:
node: node.name,
path,
webhookDescription,
workflowId: workflow.id,
workflowId,
workflowExecuteAdditionalData: additionalData,
});
}

View File

@@ -734,7 +734,37 @@ export class Workflow {
return this.getParameterValue(parameterValue, runData, runIndex, itemIndex, node.name, connectionInputData) as boolean | number | string | undefined;
}
/**
* Resolves value of complex parameter. But does not work for workflow-data.
*
* @param {INode} node
* @param {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[])} parameterValue
* @param {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | undefined)} [defaultValue]
* @returns {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | undefined)}
* @memberof Workflow
*/
getComplexParameterValue(node: INode, parameterValue: NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[], defaultValue: NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | undefined = undefined): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | undefined {
if (parameterValue === undefined) {
// Value is not set so return the default
return defaultValue;
}
// Get the value of the node (can be an expression)
const runIndex = 0;
const itemIndex = 0;
const connectionInputData: INodeExecutionData[] = [];
const runData: IRunExecutionData = {
resultData: {
runData: {},
}
};
// Resolve the "outer" main values
const returnData = this.getParameterValue(parameterValue, runData, runIndex, itemIndex, node.name, connectionInputData);
// Resolve the "inner" values
return this.getParameterValue(returnData, runData, runIndex, itemIndex, node.name, connectionInputData);
}
/**
* Returns from which of the given nodes the workflow should get started from