refactor: Use NodeConnectionType consistently across the code base (no-changelog) (#10595)

This commit is contained in:
Ricardo Espinoza 2024-08-29 09:55:53 -04:00 committed by GitHub
parent 1491cbd228
commit c4eb3746d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
521 changed files with 2259 additions and 1999 deletions

View file

@ -1,6 +1,5 @@
import { NodeConnectionType, NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import type { import type {
ConnectionTypes,
INodeInputConfiguration, INodeInputConfiguration,
INodeInputFilter, INodeInputFilter,
IExecuteFunctions, IExecuteFunctions,
@ -28,16 +27,16 @@ import { toolsAgentExecute } from './agents/ToolsAgent/execute';
function getInputs( function getInputs(
agent: 'toolsAgent' | 'conversationalAgent' | 'openAiFunctionsAgent' | 'reActAgent' | 'sqlAgent', agent: 'toolsAgent' | 'conversationalAgent' | 'openAiFunctionsAgent' | 'reActAgent' | 'sqlAgent',
hasOutputParser?: boolean, hasOutputParser?: boolean,
): Array<ConnectionTypes | INodeInputConfiguration> { ): Array<NodeConnectionType | INodeInputConfiguration> {
interface SpecialInput { interface SpecialInput {
type: ConnectionTypes; type: NodeConnectionType;
filter?: INodeInputFilter; filter?: INodeInputFilter;
required?: boolean; required?: boolean;
} }
const getInputData = ( const getInputData = (
inputs: SpecialInput[], inputs: SpecialInput[],
): Array<ConnectionTypes | INodeInputConfiguration> => { ): Array<NodeConnectionType | INodeInputConfiguration> => {
const displayNames: { [key: string]: string } = { const displayNames: { [key: string]: string } = {
[NodeConnectionType.AiLanguageModel]: 'Model', [NodeConnectionType.AiLanguageModel]: 'Model',
[NodeConnectionType.AiMemory]: 'Memory', [NodeConnectionType.AiMemory]: 'Memory',

View file

@ -75,7 +75,7 @@ export class ChatTrigger extends Node {
} }
]; ];
})() }}`, })() }}`,
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
// eslint-disable-next-line n8n-nodes-base/node-class-description-credentials-name-unsuffixed // eslint-disable-next-line n8n-nodes-base/node-class-description-credentials-name-unsuffixed

View file

@ -90,7 +90,7 @@ export const versionDescription: INodeTypeDescription = {
}, },
}, },
inputs: `={{(${configureNodeInputs})($parameter.resource, $parameter.operation, $parameter.hideTools)}}`, inputs: `={{(${configureNodeInputs})($parameter.resource, $parameter.operation, $parameter.hideTools)}}`,
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'openAiApi', name: 'openAiApi',

View file

@ -1,5 +1,5 @@
import { NodeOperationError, NodeConnectionType } from 'n8n-workflow'; import { NodeOperationError, NodeConnectionType } from 'n8n-workflow';
import type { ConnectionTypes, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow'; import type { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import type { Tool } from '@langchain/core/tools'; import type { Tool } from '@langchain/core/tools';
import type { BaseMessage } from '@langchain/core/messages'; import type { BaseMessage } from '@langchain/core/messages';
@ -31,7 +31,7 @@ export async function callMethodAsync<T>(
this: T, this: T,
parameters: { parameters: {
executeFunctions: IExecuteFunctions; executeFunctions: IExecuteFunctions;
connectionType: ConnectionTypes; connectionType: NodeConnectionType;
currentNodeRunIndex: number; currentNodeRunIndex: number;
method: (...args: any[]) => Promise<unknown>; method: (...args: any[]) => Promise<unknown>;
arguments: unknown[]; arguments: unknown[];
@ -78,7 +78,7 @@ export function callMethodSync<T>(
this: T, this: T,
parameters: { parameters: {
executeFunctions: IExecuteFunctions; executeFunctions: IExecuteFunctions;
connectionType: ConnectionTypes; connectionType: NodeConnectionType;
currentNodeRunIndex: number; currentNodeRunIndex: number;
method: (...args: any[]) => T; method: (...args: any[]) => T;
arguments: unknown[]; arguments: unknown[];
@ -123,7 +123,7 @@ export function logWrapper(
) { ) {
return new Proxy(originalInstance, { return new Proxy(originalInstance, {
get: (target, prop) => { get: (target, prop) => {
let connectionType: ConnectionTypes | undefined; let connectionType: NodeConnectionType | undefined;
// ========== BaseChatMemory ========== // ========== BaseChatMemory ==========
if (isBaseChatMemory(originalInstance)) { if (isBaseChatMemory(originalInstance)) {
if (prop === 'loadMemoryVariables' && 'loadMemoryVariables' in target) { if (prop === 'loadMemoryVariables' && 'loadMemoryVariables' in target) {

View file

@ -7,7 +7,7 @@ import type {
INode, INode,
INodeProperties, INodeProperties,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { deepCopy } from 'n8n-workflow'; import { NodeConnectionType, deepCopy } from 'n8n-workflow';
import { Workflow } from 'n8n-workflow'; import { Workflow } from 'n8n-workflow';
import { CredentialsHelper } from '@/credentials-helper'; import { CredentialsHelper } from '@/credentials-helper';
import { NodeTypes } from '@/node-types'; import { NodeTypes } from '@/node-types';
@ -34,8 +34,8 @@ describe('CredentialsHelper', () => {
name: 'Set', name: 'Set',
color: '#0000FF', color: '#0000FF',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [ properties: [
{ {
displayName: 'Value1', displayName: 'Value1',

View file

@ -1,6 +1,11 @@
import { readFileSync } from 'fs'; import { readFileSync } from 'fs';
import { agent as testAgent } from 'supertest'; import { agent as testAgent } from 'supertest';
import type { INodeType, INodeTypeDescription, IWebhookFunctions } from 'n8n-workflow'; import {
NodeConnectionType,
type INodeType,
type INodeTypeDescription,
type IWebhookFunctions,
} from 'n8n-workflow';
import { AbstractServer } from '@/abstract-server'; import { AbstractServer } from '@/abstract-server';
import { ExternalHooks } from '@/external-hooks'; import { ExternalHooks } from '@/external-hooks';
@ -182,7 +187,7 @@ describe('Webhook API', () => {
description: '', description: '',
defaults: {}, defaults: {},
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
webhooks: [ webhooks: [
{ {
name: 'default', name: 'default',

View file

@ -38,7 +38,6 @@ import { extension, lookup } from 'mime-types';
import type { import type {
BinaryHelperFunctions, BinaryHelperFunctions,
CloseFunction, CloseFunction,
ConnectionTypes,
ContextType, ContextType,
EventNamesAiNodesType, EventNamesAiNodesType,
FieldType, FieldType,
@ -105,6 +104,7 @@ import type {
SchedulingFunctions, SchedulingFunctions,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
NodeConnectionType,
ExpressionError, ExpressionError,
LoggerProxy as Logger, LoggerProxy as Logger,
NodeApiError, NodeApiError,
@ -2623,13 +2623,13 @@ const addExecutionDataFunctions = async (
nodeName: string, nodeName: string,
data: INodeExecutionData[][] | ExecutionBaseError, data: INodeExecutionData[][] | ExecutionBaseError,
runExecutionData: IRunExecutionData, runExecutionData: IRunExecutionData,
connectionType: ConnectionTypes, connectionType: NodeConnectionType,
additionalData: IWorkflowExecuteAdditionalData, additionalData: IWorkflowExecuteAdditionalData,
sourceNodeName: string, sourceNodeName: string,
sourceNodeRunIndex: number, sourceNodeRunIndex: number,
currentNodeRunIndex: number, currentNodeRunIndex: number,
): Promise<void> => { ): Promise<void> => {
if (connectionType === 'main') { if (connectionType === NodeConnectionType.Main) {
throw new ApplicationError('Setting type is not supported for main connection', { throw new ApplicationError('Setting type is not supported for main connection', {
extra: { type }, extra: { type },
}); });
@ -2732,7 +2732,7 @@ async function getInputConnectionData(
executeData: IExecuteData | undefined, executeData: IExecuteData | undefined,
mode: WorkflowExecuteMode, mode: WorkflowExecuteMode,
closeFunctions: CloseFunction[], closeFunctions: CloseFunction[],
inputName: ConnectionTypes, inputName: NodeConnectionType,
itemIndex: number, itemIndex: number,
): Promise<unknown> { ): Promise<unknown> {
const node = this.getNode(); const node = this.getNode();
@ -3676,7 +3676,7 @@ export function getExecuteFunctions(
}, },
async getInputConnectionData( async getInputConnectionData(
inputName: ConnectionTypes, inputName: NodeConnectionType,
itemIndex: number, itemIndex: number,
): Promise<unknown> { ): Promise<unknown> {
return await getInputConnectionData.call( return await getInputConnectionData.call(
@ -3817,7 +3817,7 @@ export function getExecuteFunctions(
}, },
addInputData( addInputData(
connectionType: ConnectionTypes, connectionType: NodeConnectionType,
data: INodeExecutionData[][] | ExecutionBaseError, data: INodeExecutionData[][] | ExecutionBaseError,
): { index: number } { ): { index: number } {
const nodeName = this.getNode().name; const nodeName = this.getNode().name;
@ -3847,7 +3847,7 @@ export function getExecuteFunctions(
return { index: currentNodeRunIndex }; return { index: currentNodeRunIndex };
}, },
addOutputData( addOutputData(
connectionType: ConnectionTypes, connectionType: NodeConnectionType,
currentNodeRunIndex: number, currentNodeRunIndex: number,
data: INodeExecutionData[][] | ExecutionBaseError, data: INodeExecutionData[][] | ExecutionBaseError,
): void { ): void {
@ -4238,7 +4238,7 @@ export function getExecuteWebhookFunctions(
return additionalData.httpRequest.headers; return additionalData.httpRequest.headers;
}, },
async getInputConnectionData( async getInputConnectionData(
inputName: ConnectionTypes, inputName: NodeConnectionType,
itemIndex: number, itemIndex: number,
): Promise<unknown> { ): Promise<unknown> {
// To be able to use expressions like "$json.sessionId" set the // To be able to use expressions like "$json.sessionId" set the

View file

@ -623,7 +623,11 @@ export class WorkflowExecute {
// Check if any of the parent nodes does not have any inputs. That // Check if any of the parent nodes does not have any inputs. That
// would mean that it has to get added to the list of nodes to process. // would mean that it has to get added to the list of nodes to process.
const parentNodes = workflow.getParentNodes(inputData.node, 'main', -1); const parentNodes = workflow.getParentNodes(
inputData.node,
NodeConnectionType.Main,
-1,
);
let nodeToAdd: string | undefined = inputData.node; let nodeToAdd: string | undefined = inputData.node;
parentNodes.push(inputData.node); parentNodes.push(inputData.node);
parentNodes.reverse(); parentNodes.reverse();
@ -988,7 +992,11 @@ export class WorkflowExecute {
connectionIndex++ connectionIndex++
) { ) {
if ( if (
workflow.getHighestNode(executionNode.name, 'main', connectionIndex).length === 0 workflow.getHighestNode(
executionNode.name,
NodeConnectionType.Main,
connectionIndex,
).length === 0
) { ) {
// If there is no valid incoming node (if all are disabled) // If there is no valid incoming node (if all are disabled)
// then ignore that it has inputs and simply execute it as it is without // then ignore that it has inputs and simply execute it as it is without

View file

@ -45,8 +45,8 @@ export const predefinedNodesTypes: INodeTypeData = {
name: 'Version Test', name: 'Version Test',
color: '#0000FF', color: '#0000FF',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [ properties: [
{ {
displayName: 'Display V1', displayName: 'Display V1',

View file

@ -11,7 +11,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
INodeIssues, INodeIssues,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeHelpers, Workflow } from 'n8n-workflow'; import { NodeConnectionType, NodeHelpers, Workflow } from 'n8n-workflow';
import { uuid } from '@jsplumb/util'; import { uuid } from '@jsplumb/util';
import { mock } from 'vitest-mock-extended'; import { mock } from 'vitest-mock-extended';
@ -52,8 +52,8 @@ export const mockNodeTypeDescription = ({
name, name,
version = 1, version = 1,
credentials = [], credentials = [],
inputs = ['main'], inputs = [NodeConnectionType.Main],
outputs = ['main'], outputs = [NodeConnectionType.Main],
}: { }: {
name: INodeTypeDescription['name']; name: INodeTypeDescription['name'];
version?: INodeTypeDescription['version']; version?: INodeTypeDescription['version'];

View file

@ -11,6 +11,7 @@ import { createExpressionTelemetryPayload } from '@/utils/telemetryUtils';
import { useTelemetry } from '@/composables/useTelemetry'; import { useTelemetry } from '@/composables/useTelemetry';
import type { Segment } from '@/types/expressions'; import type { Segment } from '@/types/expressions';
import type { INodeProperties } from 'n8n-workflow'; import type { INodeProperties } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { outputTheme } from './ExpressionEditorModal/theme'; import { outputTheme } from './ExpressionEditorModal/theme';
import ExpressionOutput from './InlineExpressionEditor/ExpressionOutput.vue'; import ExpressionOutput from './InlineExpressionEditor/ExpressionOutput.vue';
import RunDataSchema from './RunDataSchema.vue'; import RunDataSchema from './RunDataSchema.vue';
@ -152,7 +153,7 @@ async function onDrop(expression: string, event: MouseEvent) {
:nodes="parentNodes" :nodes="parentNodes"
mapping-enabled mapping-enabled
pane-type="input" pane-type="input"
connection-type="main" :connection-type="NodeConnectionType.Main"
/> />
</div> </div>

View file

@ -11,7 +11,6 @@ import { useNodeTypesStore } from '@/stores/nodeTypes.store';
import { useUIStore } from '@/stores/ui.store'; import { useUIStore } from '@/stores/ui.store';
import { useWorkflowsStore } from '@/stores/workflows.store'; import { useWorkflowsStore } from '@/stores/workflows.store';
import type { import type {
ConnectionTypes,
IConnectedNode, IConnectedNode,
INodeInputConfiguration, INodeInputConfiguration,
INodeOutputConfiguration, INodeOutputConfiguration,
@ -121,10 +120,10 @@ export default defineComponent({
} else { } else {
// If we can not figure out the node type we set no outputs // If we can not figure out the node type we set no outputs
if (!Array.isArray(inputs)) { if (!Array.isArray(inputs)) {
inputs = [] as ConnectionTypes[]; inputs = [] as NodeConnectionType[];
} }
if (!Array.isArray(outputs)) { if (!Array.isArray(outputs)) {
outputs = [] as ConnectionTypes[]; outputs = [] as NodeConnectionType[];
} }
} }
@ -184,7 +183,7 @@ export default defineComponent({
}, },
rootNodesParents() { rootNodesParents() {
const workflow = this.workflow; const workflow = this.workflow;
const parentNodes = [...workflow.getParentNodes(this.rootNode, 'main')] const parentNodes = [...workflow.getParentNodes(this.rootNode, NodeConnectionType.Main)]
.reverse() .reverse()
.map((parent): IConnectedNode => ({ name: parent, depth: 1, indicies: [] })); .map((parent): IConnectedNode => ({ name: parent, depth: 1, indicies: [] }));
@ -274,8 +273,8 @@ export default defineComponent({
}, },
methods: { methods: {
filterOutConnectionType( filterOutConnectionType(
item: ConnectionTypes | INodeOutputConfiguration | INodeInputConfiguration, item: NodeConnectionType | INodeOutputConfiguration | INodeInputConfiguration,
type: ConnectionTypes, type: NodeConnectionType,
) { ) {
if (!item) return false; if (!item) return false;

View file

@ -4,7 +4,7 @@ import { useNodeTypesStore } from '@/stores/nodeTypes.store';
import { useWorkflowsStore } from '@/stores/workflows.store'; import { useWorkflowsStore } from '@/stores/workflows.store';
import { computed, onMounted, onBeforeUnmount } from 'vue'; import { computed, onMounted, onBeforeUnmount } from 'vue';
import NodeIcon from '@/components/NodeIcon.vue'; import NodeIcon from '@/components/NodeIcon.vue';
import type { INodeTypeDescription } from 'n8n-workflow'; import { NodeConnectionType, type INodeTypeDescription } from 'n8n-workflow';
interface Props { interface Props {
rootNode: INodeUi; rootNode: INodeUi;
@ -71,8 +71,12 @@ const connectedNodes = computed<
[FloatingNodePosition.top]: getINodesFromNames( [FloatingNodePosition.top]: getINodesFromNames(
workflow.getChildNodes(rootName, 'ALL_NON_MAIN'), workflow.getChildNodes(rootName, 'ALL_NON_MAIN'),
), ),
[FloatingNodePosition.right]: getINodesFromNames(workflow.getChildNodes(rootName, 'main', 1)), [FloatingNodePosition.right]: getINodesFromNames(
[FloatingNodePosition.left]: getINodesFromNames(workflow.getParentNodes(rootName, 'main', 1)), workflow.getChildNodes(rootName, NodeConnectionType.Main, 1),
),
[FloatingNodePosition.left]: getINodesFromNames(
workflow.getParentNodes(rootName, NodeConnectionType.Main, 1),
),
}; };
}); });

View file

@ -7,7 +7,11 @@ import { NodeHelpers } from 'n8n-workflow';
import { useNodeHelpers } from '@/composables/useNodeHelpers'; import { useNodeHelpers } from '@/composables/useNodeHelpers';
import NodeIcon from '@/components/NodeIcon.vue'; import NodeIcon from '@/components/NodeIcon.vue';
import TitledList from '@/components/TitledList.vue'; import TitledList from '@/components/TitledList.vue';
import type { ConnectionTypes, INodeInputConfiguration, INodeTypeDescription } from 'n8n-workflow'; import type {
NodeConnectionType,
INodeInputConfiguration,
INodeTypeDescription,
} from 'n8n-workflow';
import { useDebounce } from '@/composables/useDebounce'; import { useDebounce } from '@/composables/useDebounce';
import { OnClickOutside } from '@vueuse/components'; import { OnClickOutside } from '@vueuse/components';
@ -22,7 +26,7 @@ const nodeHelpers = useNodeHelpers();
const { debounce } = useDebounce(); const { debounce } = useDebounce();
const emit = defineEmits<{ const emit = defineEmits<{
switchSelectedNode: [nodeName: string]; switchSelectedNode: [nodeName: string];
openConnectionNodeCreator: [nodeName: string, connectionType: ConnectionTypes]; openConnectionNodeCreator: [nodeName: string, connectionType: NodeConnectionType];
}>(); }>();
interface NodeConfig { interface NodeConfig {
@ -33,7 +37,7 @@ interface NodeConfig {
const possibleConnections = ref<INodeInputConfiguration[]>([]); const possibleConnections = ref<INodeInputConfiguration[]>([]);
const expandedGroups = ref<ConnectionTypes[]>([]); const expandedGroups = ref<NodeConnectionType[]>([]);
const shouldShowNodeInputIssues = ref(false); const shouldShowNodeInputIssues = ref(false);
const nodeType = computed(() => const nodeType = computed(() =>
@ -54,7 +58,7 @@ const nodeInputIssues = computed(() => {
return issues?.input ?? {}; return issues?.input ?? {};
}); });
const connectedNodes = computed<Record<ConnectionTypes, NodeConfig[]>>(() => { const connectedNodes = computed<Record<NodeConnectionType, NodeConfig[]>>(() => {
return possibleConnections.value.reduce( return possibleConnections.value.reduce(
(acc, connection) => { (acc, connection) => {
const nodes = getINodesFromNames( const nodes = getINodesFromNames(
@ -62,24 +66,24 @@ const connectedNodes = computed<Record<ConnectionTypes, NodeConfig[]>>(() => {
); );
return { ...acc, [connection.type]: nodes }; return { ...acc, [connection.type]: nodes };
}, },
{} as Record<ConnectionTypes, NodeConfig[]>, {} as Record<NodeConnectionType, NodeConfig[]>,
); );
}); });
function getConnectionConfig(connectionType: ConnectionTypes) { function getConnectionConfig(connectionType: NodeConnectionType) {
return possibleConnections.value.find((c) => c.type === connectionType); return possibleConnections.value.find((c) => c.type === connectionType);
} }
function isMultiConnection(connectionType: ConnectionTypes) { function isMultiConnection(connectionType: NodeConnectionType) {
const connectionConfig = getConnectionConfig(connectionType); const connectionConfig = getConnectionConfig(connectionType);
return connectionConfig?.maxConnections !== 1; return connectionConfig?.maxConnections !== 1;
} }
function shouldShowConnectionTooltip(connectionType: ConnectionTypes) { function shouldShowConnectionTooltip(connectionType: NodeConnectionType) {
return isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType); return isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType);
} }
function expandConnectionGroup(connectionType: ConnectionTypes, isExpanded: boolean) { function expandConnectionGroup(connectionType: NodeConnectionType, isExpanded: boolean) {
// If the connection is a single connection, we don't need to expand the group // If the connection is a single connection, we don't need to expand the group
if (!isMultiConnection(connectionType)) { if (!isMultiConnection(connectionType)) {
return; return;
@ -109,14 +113,14 @@ function getINodesFromNames(names: string[]): NodeConfig[] {
.filter((n): n is NodeConfig => n !== null); .filter((n): n is NodeConfig => n !== null);
} }
function hasInputIssues(connectionType: ConnectionTypes) { function hasInputIssues(connectionType: NodeConnectionType) {
return ( return (
shouldShowNodeInputIssues.value && (nodeInputIssues.value[connectionType] ?? []).length > 0 shouldShowNodeInputIssues.value && (nodeInputIssues.value[connectionType] ?? []).length > 0
); );
} }
function isNodeInputConfiguration( function isNodeInputConfiguration(
connectionConfig: ConnectionTypes | INodeInputConfiguration, connectionConfig: NodeConnectionType | INodeInputConfiguration,
): connectionConfig is INodeInputConfiguration { ): connectionConfig is INodeInputConfiguration {
if (typeof connectionConfig === 'string') return false; if (typeof connectionConfig === 'string') return false;
@ -137,7 +141,7 @@ function getPossibleSubInputConnections(): INodeInputConfiguration[] {
return nonMainInputs; return nonMainInputs;
} }
function onNodeClick(nodeName: string, connectionType: ConnectionTypes) { function onNodeClick(nodeName: string, connectionType: NodeConnectionType) {
if (isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType)) { if (isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType)) {
expandConnectionGroup(connectionType, true); expandConnectionGroup(connectionType, true);
return; return;
@ -146,7 +150,7 @@ function onNodeClick(nodeName: string, connectionType: ConnectionTypes) {
emit('switchSelectedNode', nodeName); emit('switchSelectedNode', nodeName);
} }
function onPlusClick(connectionType: ConnectionTypes) { function onPlusClick(connectionType: NodeConnectionType) {
const connectionNodes = connectedNodes.value[connectionType]; const connectionNodes = connectedNodes.value[connectionType];
if ( if (
isMultiConnection(connectionType) && isMultiConnection(connectionType) &&

View file

@ -10,7 +10,6 @@ import {
WAIT_TIME_UNLIMITED, WAIT_TIME_UNLIMITED,
} from '@/constants'; } from '@/constants';
import type { import type {
ConnectionTypes,
ExecutionSummary, ExecutionSummary,
INodeOutputConfiguration, INodeOutputConfiguration,
ITaskData, ITaskData,
@ -244,7 +243,7 @@ const nodeWrapperStyles = computed<StyleValue>(() => {
const mainInputs = inputTypes.filter((output) => output === NodeConnectionType.Main); const mainInputs = inputTypes.filter((output) => output === NodeConnectionType.Main);
styles['--node-main-input-count'] = mainInputs.length; styles['--node-main-input-count'] = mainInputs.length;
let outputs = [] as Array<ConnectionTypes | INodeOutputConfiguration>; let outputs = [] as Array<NodeConnectionType | INodeOutputConfiguration>;
if (props.workflow.nodes[node.value.name]) { if (props.workflow.nodes[node.value.name]) {
outputs = NodeHelpers.getNodeOutputs(props.workflow, node.value, nodeType.value); outputs = NodeHelpers.getNodeOutputs(props.workflow, node.value, nodeType.value);
} }

View file

@ -1,4 +1,4 @@
import type { INodeProperties, INodeTypeDescription } from 'n8n-workflow'; import { NodeConnectionType, type INodeProperties, type INodeTypeDescription } from 'n8n-workflow';
import { useActionsGenerator } from '../composables/useActionsGeneration'; import { useActionsGenerator } from '../composables/useActionsGeneration';
describe('useActionsGenerator', () => { describe('useActionsGenerator', () => {
@ -14,8 +14,8 @@ describe('useActionsGenerator', () => {
defaults: { defaults: {
name: 'Test', name: 'Test',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [], properties: [],
}; };

View file

@ -7,7 +7,6 @@ import type {
INodeParameters, INodeParameters,
INodeProperties, INodeProperties,
NodeParameterValue, NodeParameterValue,
ConnectionTypes,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
NodeHelpers, NodeHelpers,
@ -319,7 +318,7 @@ export default defineComponent({
onSwitchSelectedNode(node: string) { onSwitchSelectedNode(node: string) {
this.$emit('switchSelectedNode', node); this.$emit('switchSelectedNode', node);
}, },
onOpenConnectionNodeCreator(node: string, connectionType: ConnectionTypes) { onOpenConnectionNodeCreator(node: string, connectionType: NodeConnectionType) {
this.$emit('openConnectionNodeCreator', node, connectionType); this.$emit('openConnectionNodeCreator', node, connectionType);
}, },
populateHiddenIssuesSet() { populateHiddenIssuesSet() {

View file

@ -5,7 +5,6 @@ import { mapStores } from 'pinia';
import { useStorage } from '@/composables/useStorage'; import { useStorage } from '@/composables/useStorage';
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import type { import type {
ConnectionTypes,
IBinaryData, IBinaryData,
IBinaryKeyData, IBinaryKeyData,
IDataObject, IDataObject,
@ -181,7 +180,7 @@ export default defineComponent({
}, },
data() { data() {
return { return {
connectionType: NodeConnectionType.Main as ConnectionTypes, connectionType: NodeConnectionType.Main as NodeConnectionType,
binaryDataPreviewActive: false, binaryDataPreviewActive: false,
dataSize: 0, dataSize: 0,
showData: false, showData: false,
@ -929,7 +928,7 @@ export default defineComponent({
getRawInputData( getRawInputData(
runIndex: number, runIndex: number,
outputIndex: number, outputIndex: number,
connectionType: ConnectionTypes = NodeConnectionType.Main, connectionType: NodeConnectionType = NodeConnectionType.Main,
): INodeExecutionData[] { ): INodeExecutionData[] {
let inputData: INodeExecutionData[] = []; let inputData: INodeExecutionData[] = [];
@ -974,7 +973,7 @@ export default defineComponent({
getDataCount( getDataCount(
runIndex: number, runIndex: number,
outputIndex: number, outputIndex: number,
connectionType: ConnectionTypes = NodeConnectionType.Main, connectionType: NodeConnectionType = NodeConnectionType.Main,
) { ) {
if (!this.node) { if (!this.node) {
return 0; return 0;
@ -993,7 +992,7 @@ export default defineComponent({
this.outputIndex = 0; this.outputIndex = 0;
this.refreshDataSize(); this.refreshDataSize();
this.closeBinaryDataDisplay(); this.closeBinaryDataDisplay();
let outputTypes: ConnectionTypes[] = []; let outputTypes: NodeConnectionType[] = [];
if (this.nodeType !== null && this.node !== null) { if (this.nodeType !== null && this.node !== null) {
const outputs = this.getResolvedNodeOutputs(); const outputs = this.getResolvedNodeOutputs();
outputTypes = NodeHelpers.getConnectionTypes(outputs); outputTypes = NodeHelpers.getConnectionTypes(outputs);

View file

@ -9,7 +9,6 @@ import { useNDVStore } from '@/stores/ndv.store';
import { telemetry } from '@/plugins/telemetry'; import { telemetry } from '@/plugins/telemetry';
import { import {
NodeConnectionType, NodeConnectionType,
type ConnectionTypes,
type IConnectedNode, type IConnectedNode,
type IDataObject, type IDataObject,
type INodeTypeDescription, type INodeTypeDescription,
@ -33,7 +32,7 @@ type Props = {
outputIndex?: number; outputIndex?: number;
totalRuns?: number; totalRuns?: number;
paneType: 'input' | 'output'; paneType: 'input' | 'output';
connectionType?: ConnectionTypes; connectionType?: NodeConnectionType;
search?: string; search?: string;
}; };

View file

@ -6,7 +6,7 @@ import { createPinia, setActivePinia } from 'pinia';
import { useSourceControlStore } from '@/stores/sourceControl.store'; import { useSourceControlStore } from '@/stores/sourceControl.store';
import { useUIStore } from '@/stores/ui.store'; import { useUIStore } from '@/stores/ui.store';
import { useWorkflowsStore } from '@/stores/workflows.store'; import { useWorkflowsStore } from '@/stores/workflows.store';
import { NodeHelpers } from 'n8n-workflow'; import { NodeConnectionType, NodeHelpers } from 'n8n-workflow';
const nodeFactory = (data: Partial<INodeUi> = {}): INodeUi => ({ const nodeFactory = (data: Partial<INodeUi> = {}): INodeUi => ({
id: faker.string.uuid(), id: faker.string.uuid(),
@ -95,7 +95,10 @@ describe('useContextMenu', () => {
const { open, isOpen, actions, targetNodeIds } = useContextMenu(); const { open, isOpen, actions, targetNodeIds } = useContextMenu();
const basicChain = nodeFactory({ type: BASIC_CHAIN_NODE_TYPE }); const basicChain = nodeFactory({ type: BASIC_CHAIN_NODE_TYPE });
vi.spyOn(workflowsStore, 'getNodeById').mockReturnValue(basicChain); vi.spyOn(workflowsStore, 'getNodeById').mockReturnValue(basicChain);
vi.spyOn(NodeHelpers, 'getConnectionTypes').mockReturnValue(['main', 'ai_languageModel']); vi.spyOn(NodeHelpers, 'getConnectionTypes').mockReturnValue([
NodeConnectionType.Main,
NodeConnectionType.AiLanguageModel,
]);
open(mockEvent, { source: 'node-right-click', nodeId: basicChain.id }); open(mockEvent, { source: 'node-right-click', nodeId: basicChain.id });
expect(isOpen.value).toBe(true); expect(isOpen.value).toBe(true);

View file

@ -1,7 +1,12 @@
import { createPinia, setActivePinia } from 'pinia'; import { createPinia, setActivePinia } from 'pinia';
import { mock, mockClear } from 'vitest-mock-extended'; import { mock, mockClear } from 'vitest-mock-extended';
import type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui'; import type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';
import type { INode, INodeTypeDescription, Workflow } from 'n8n-workflow'; import {
NodeConnectionType,
type INode,
type INodeTypeDescription,
type Workflow,
} from 'n8n-workflow';
import { useNodeBase } from '@/composables/useNodeBase'; import { useNodeBase } from '@/composables/useNodeBase';
import { useWorkflowsStore } from '@/stores/workflows.store'; import { useWorkflowsStore } from '@/stores/workflows.store';
@ -16,8 +21,8 @@ describe('useNodeBase', () => {
const jsPlumbInstance = mock<BrowserJsPlumbInstance>(); const jsPlumbInstance = mock<BrowserJsPlumbInstance>();
const nodeTypeDescription = mock<INodeTypeDescription>({ const nodeTypeDescription = mock<INodeTypeDescription>({
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
}); });
const workflowObject = mock<Workflow>(); const workflowObject = mock<Workflow>();
const node = mock<INode>(); const node = mock<INode>();

View file

@ -68,7 +68,6 @@ import * as NodeViewUtils from '@/utils/nodeViewUtils';
import { isValidNodeConnectionType } from '@/utils/typeGuards'; import { isValidNodeConnectionType } from '@/utils/typeGuards';
import type { Connection } from '@vue-flow/core'; import type { Connection } from '@vue-flow/core';
import type { import type {
ConnectionTypes,
IConnection, IConnection,
IConnections, IConnections,
INode, INode,
@ -905,7 +904,7 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
} }
} }
let outputs: Array<ConnectionTypes | INodeOutputConfiguration> = []; let outputs: Array<NodeConnectionType | INodeOutputConfiguration> = [];
try { try {
// It fails when the outputs are an expression. As those nodes have // It fails when the outputs are an expression. As those nodes have
// normally no outputs by default and the only reason we need the // normally no outputs by default and the only reason we need the
@ -1154,7 +1153,7 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
return false; return false;
} }
let inputs: Array<ConnectionTypes | INodeInputConfiguration> = []; let inputs: Array<NodeConnectionType | INodeInputConfiguration> = [];
if (targetNodeType) { if (targetNodeType) {
inputs = inputs =
NodeHelpers.getNodeInputs(editableWorkflowObject.value, workflowNode, targetNodeType) || NodeHelpers.getNodeInputs(editableWorkflowObject.value, workflowNode, targetNodeType) ||

View file

@ -10,7 +10,6 @@ import {
import { NodeHelpers, NodeConnectionType } from 'n8n-workflow'; import { NodeHelpers, NodeConnectionType } from 'n8n-workflow';
import type { import type {
ConnectionTypes,
INodeInputConfiguration, INodeInputConfiguration,
INodeTypeDescription, INodeTypeDescription,
INodeOutputConfiguration, INodeOutputConfiguration,
@ -57,8 +56,8 @@ export function useNodeBase({
const nodeId = computed<string>(() => data.value?.id ?? ''); const nodeId = computed<string>(() => data.value?.id ?? '');
const inputs = ref<Array<ConnectionTypes | INodeInputConfiguration>>([]); const inputs = ref<Array<NodeConnectionType | INodeInputConfiguration>>([]);
const outputs = ref<Array<ConnectionTypes | INodeOutputConfiguration>>([]); const outputs = ref<Array<NodeConnectionType | INodeOutputConfiguration>>([]);
const createAddInputEndpointSpec = ( const createAddInputEndpointSpec = (
connectionName: NodeConnectionType, connectionName: NodeConnectionType,
@ -139,7 +138,7 @@ export function useNodeBase({
inputConfiguration = value; inputConfiguration = value;
} }
const inputName: ConnectionTypes = inputConfiguration.type; const inputName: NodeConnectionType = inputConfiguration.type;
const rootCategoryInputName = const rootCategoryInputName =
inputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other'; inputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';
@ -366,7 +365,7 @@ export function useNodeBase({
outputs.value.forEach((_value, i) => { outputs.value.forEach((_value, i) => {
const outputConfiguration = outputConfigurations[i]; const outputConfiguration = outputConfigurations[i];
const outputName: ConnectionTypes = outputConfiguration.type; const outputName: NodeConnectionType = outputConfiguration.type;
const rootCategoryOutputName = const rootCategoryOutputName =
outputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other'; outputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';
@ -536,12 +535,12 @@ export function useNodeBase({
addOutputEndpoints(node, nodeTypeData); addOutputEndpoints(node, nodeTypeData);
} }
function getEndpointColor(connectionType: ConnectionTypes) { function getEndpointColor(connectionType: NodeConnectionType) {
return `--node-type-${connectionType}-color`; return `--node-type-${connectionType}-color`;
} }
function getInputConnectionStyle( function getInputConnectionStyle(
connectionType: ConnectionTypes, connectionType: NodeConnectionType,
nodeTypeData: INodeTypeDescription, nodeTypeData: INodeTypeDescription,
): EndpointOptions { ): EndpointOptions {
if (connectionType === NodeConnectionType.Main) { if (connectionType === NodeConnectionType.Main) {
@ -559,7 +558,7 @@ export function useNodeBase({
} }
const createSupplementalConnectionType = ( const createSupplementalConnectionType = (
connectionName: ConnectionTypes, connectionName: NodeConnectionType,
): EndpointOptions => ({ ): EndpointOptions => ({
endpoint: createAddInputEndpointSpec( endpoint: createAddInputEndpointSpec(
connectionName as NodeConnectionType, connectionName as NodeConnectionType,
@ -571,12 +570,12 @@ export function useNodeBase({
} }
function getOutputConnectionStyle( function getOutputConnectionStyle(
connectionType: ConnectionTypes, connectionType: NodeConnectionType,
outputConfiguration: INodeOutputConfiguration, outputConfiguration: INodeOutputConfiguration,
nodeTypeData: INodeTypeDescription, nodeTypeData: INodeTypeDescription,
): EndpointOptions { ): EndpointOptions {
const createSupplementalConnectionType = ( const createSupplementalConnectionType = (
connectionName: ConnectionTypes, connectionName: NodeConnectionType,
): EndpointOptions => ({ ): EndpointOptions => ({
endpoint: createDiamondOutputEndpointSpec(), endpoint: createDiamondOutputEndpointSpec(),
paintStyle: NodeViewUtils.getOutputEndpointStyle( paintStyle: NodeViewUtils.getOutputEndpointStyle(

View file

@ -12,7 +12,7 @@ import {
WEBHOOK_NODE_TYPE, WEBHOOK_NODE_TYPE,
} from '@/constants'; } from '@/constants';
import { NodeHelpers, NodeConnectionType, ExpressionEvaluatorProxy } from 'n8n-workflow'; import { NodeHelpers, ExpressionEvaluatorProxy, NodeConnectionType } from 'n8n-workflow';
import type { import type {
INodeProperties, INodeProperties,
INodeCredentialDescription, INodeCredentialDescription,
@ -20,7 +20,6 @@ import type {
INodeIssues, INodeIssues,
ICredentialType, ICredentialType,
INodeIssueObjectProperty, INodeIssueObjectProperty,
ConnectionTypes,
INodeInputConfiguration, INodeInputConfiguration,
Workflow, Workflow,
INodeExecutionData, INodeExecutionData,
@ -342,7 +341,7 @@ export function useNodeHelpers() {
const foundIssues: INodeIssueObjectProperty = {}; const foundIssues: INodeIssueObjectProperty = {};
const workflowNode = workflow.getNode(node.name); const workflowNode = workflow.getNode(node.name);
let inputs: Array<ConnectionTypes | INodeInputConfiguration> = []; let inputs: Array<NodeConnectionType | INodeInputConfiguration> = [];
if (nodeType && workflowNode) { if (nodeType && workflowNode) {
inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType); inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);
} }
@ -571,7 +570,7 @@ export function useNodeHelpers() {
runIndex = 0, runIndex = 0,
outputIndex = 0, outputIndex = 0,
paneType: NodePanelType = 'output', paneType: NodePanelType = 'output',
connectionType: ConnectionTypes = NodeConnectionType.Main, connectionType: NodeConnectionType = NodeConnectionType.Main,
): INodeExecutionData[] { ): INodeExecutionData[] {
//TODO: check if this needs to be fixed in different place //TODO: check if this needs to be fixed in different place
if ( if (
@ -617,7 +616,7 @@ export function useNodeHelpers() {
function getInputData( function getInputData(
connectionsData: ITaskDataConnections, connectionsData: ITaskDataConnections,
outputIndex: number, outputIndex: number,
connectionType: ConnectionTypes = NodeConnectionType.Main, connectionType: NodeConnectionType = NodeConnectionType.Main,
): INodeExecutionData[] { ): INodeExecutionData[] {
return connectionsData?.[connectionType]?.[outputIndex] ?? []; return connectionsData?.[connectionType]?.[outputIndex] ?? [];
} }
@ -627,7 +626,7 @@ export function useNodeHelpers() {
node: string | null, node: string | null,
runIndex: number, runIndex: number,
outputIndex: number, outputIndex: number,
connectionType: ConnectionTypes = NodeConnectionType.Main, connectionType: NodeConnectionType = NodeConnectionType.Main,
): IBinaryKeyData[] { ): IBinaryKeyData[] {
if (node === null) { if (node === null) {
return []; return [];

View file

@ -4,7 +4,6 @@ import type { DynamicNodeParameters, NodeTypesByTypeNameAndVersion } from '@/Int
import { addHeaders, addNodeTranslation } from '@/plugins/i18n'; import { addHeaders, addNodeTranslation } from '@/plugins/i18n';
import { omit } from '@/utils/typesUtils'; import { omit } from '@/utils/typesUtils';
import type { import type {
ConnectionTypes,
INode, INode,
INodeInputConfiguration, INodeInputConfiguration,
INodeOutputConfiguration, INodeOutputConfiguration,
@ -138,7 +137,7 @@ export const useNodeTypesStore = defineStore(STORES.NODE_TYPES, () => {
(acc, node) => { (acc, node) => {
const outputTypes = node.outputs; const outputTypes = node.outputs;
if (Array.isArray(outputTypes)) { if (Array.isArray(outputTypes)) {
outputTypes.forEach((value: ConnectionTypes | INodeOutputConfiguration) => { outputTypes.forEach((value: NodeConnectionType | INodeOutputConfiguration) => {
const outputType = typeof value === 'string' ? value : value.type; const outputType = typeof value === 'string' ? value : value.type;
if (!acc[outputType]) { if (!acc[outputType]) {
acc[outputType] = []; acc[outputType] = [];
@ -148,7 +147,7 @@ export const useNodeTypesStore = defineStore(STORES.NODE_TYPES, () => {
} else { } else {
// If outputs is not an array, it must be a string expression // If outputs is not an array, it must be a string expression
// in which case we'll try to match all possible non-main output types that are supported // in which case we'll try to match all possible non-main output types that are supported
const connectorTypes: ConnectionTypes[] = [ const connectorTypes: NodeConnectionType[] = [
NodeConnectionType.AiVectorStore, NodeConnectionType.AiVectorStore,
NodeConnectionType.AiChain, NodeConnectionType.AiChain,
NodeConnectionType.AiDocument, NodeConnectionType.AiDocument,
@ -159,7 +158,7 @@ export const useNodeTypesStore = defineStore(STORES.NODE_TYPES, () => {
NodeConnectionType.AiTextSplitter, NodeConnectionType.AiTextSplitter,
NodeConnectionType.AiTool, NodeConnectionType.AiTool,
]; ];
connectorTypes.forEach((outputType: ConnectionTypes) => { connectorTypes.forEach((outputType: NodeConnectionType) => {
if (outputTypes.includes(outputType)) { if (outputTypes.includes(outputType)) {
acc[outputType] = acc[outputType] || []; acc[outputType] = acc[outputType] || [];
acc[outputType].push(node.name); acc[outputType].push(node.name);
@ -181,7 +180,7 @@ export const useNodeTypesStore = defineStore(STORES.NODE_TYPES, () => {
const inputTypes = node.inputs; const inputTypes = node.inputs;
if (Array.isArray(inputTypes)) { if (Array.isArray(inputTypes)) {
inputTypes.forEach( inputTypes.forEach(
(value: ConnectionTypes | INodeOutputConfiguration | INodeInputConfiguration) => { (value: NodeConnectionType | INodeOutputConfiguration | INodeInputConfiguration) => {
const outputType = typeof value === 'string' ? value : value.type; const outputType = typeof value === 'string' ? value : value.type;
if (!acc[outputType]) { if (!acc[outputType]) {
acc[outputType] = []; acc[outputType] = [];

View file

@ -55,7 +55,7 @@ import type {
IWorkflowSettings, IWorkflowSettings,
INodeType, INodeType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { deepCopy, NodeHelpers, Workflow } from 'n8n-workflow'; import { deepCopy, NodeConnectionType, NodeHelpers, Workflow } from 'n8n-workflow';
import { findLast } from 'lodash-es'; import { findLast } from 'lodash-es';
import { useRootStore } from '@/stores/root.store'; import { useRootStore } from '@/stores/root.store';
@ -1502,7 +1502,7 @@ export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, () => {
function checkIfNodeHasChatParent(nodeName: string): boolean { function checkIfNodeHasChatParent(nodeName: string): boolean {
const workflow = getCurrentWorkflow(); const workflow = getCurrentWorkflow();
const parents = workflow.getParentNodes(nodeName, 'main'); const parents = workflow.getParentNodes(nodeName, NodeConnectionType.Main);
const matchedChatNode = parents.find((parent) => { const matchedChatNode = parents.find((parent) => {
const parentNodeType = getNodeByName(parent)?.type; const parentNodeType = getNodeByName(parent)?.type;

View file

@ -5,7 +5,6 @@ import type { ArrayAnchorSpec, ConnectorSpec, OverlaySpec, PaintStyle } from '@j
import type { Connection, Endpoint, SelectOptions } from '@jsplumb/core'; import type { Connection, Endpoint, SelectOptions } from '@jsplumb/core';
import { N8nConnector } from '@/plugins/connectors/N8nCustomConnector'; import { N8nConnector } from '@/plugins/connectors/N8nCustomConnector';
import type { import type {
ConnectionTypes,
IConnection, IConnection,
INodeExecutionData, INodeExecutionData,
INodeTypeDescription, INodeTypeDescription,
@ -118,7 +117,7 @@ export function isCanvasAugmentedType<T>(overlay: T): overlay is T & { canvas: H
return typeof overlay === 'object' && overlay !== null && 'canvas' in overlay && !!overlay.canvas; return typeof overlay === 'object' && overlay !== null && 'canvas' in overlay && !!overlay.canvas;
} }
export const getConnectorColor = (type: ConnectionTypes, category?: string): string => { export const getConnectorColor = (type: NodeConnectionType, category?: string): string => {
if (category === 'error') { if (category === 'error') {
return '--color-node-error-output-text-color'; return '--color-node-error-output-text-color';
} }
@ -132,7 +131,7 @@ export const getConnectorColor = (type: ConnectionTypes, category?: string): str
export const getConnectorPaintStylePull = (connection: Connection): PaintStyle => { export const getConnectorPaintStylePull = (connection: Connection): PaintStyle => {
const connectorColor = getConnectorColor( const connectorColor = getConnectorColor(
connection.parameters.type as ConnectionTypes, connection.parameters.type as NodeConnectionType,
connection.parameters.category, connection.parameters.category,
); );
const additionalStyles: PaintStyle = {}; const additionalStyles: PaintStyle = {};
@ -148,7 +147,7 @@ export const getConnectorPaintStylePull = (connection: Connection): PaintStyle =
export const getConnectorPaintStyleDefault = (connection: Connection): PaintStyle => { export const getConnectorPaintStyleDefault = (connection: Connection): PaintStyle => {
const connectorColor = getConnectorColor( const connectorColor = getConnectorColor(
connection.parameters.type as ConnectionTypes, connection.parameters.type as NodeConnectionType,
connection.parameters.category, connection.parameters.category,
); );
return { return {
@ -161,7 +160,10 @@ export const getConnectorPaintStyleData = (
connection: Connection, connection: Connection,
category?: string, category?: string,
): PaintStyle => { ): PaintStyle => {
const connectorColor = getConnectorColor(connection.parameters.type as ConnectionTypes, category); const connectorColor = getConnectorColor(
connection.parameters.type as NodeConnectionType,
category,
);
return { return {
...CONNECTOR_PAINT_STYLE_DATA, ...CONNECTOR_PAINT_STYLE_DATA,
...(connectorColor ? { stroke: `var(${connectorColor})` } : {}), ...(connectorColor ? { stroke: `var(${connectorColor})` } : {}),
@ -194,7 +196,7 @@ export const CONNECTOR_ARROW_OVERLAYS: OverlaySpec[] = [
]; ];
export const getAnchorPosition = ( export const getAnchorPosition = (
connectionType: ConnectionTypes, connectionType: NodeConnectionType,
type: 'input' | 'output', type: 'input' | 'output',
amount: number, amount: number,
spacerIndexes: number[] = [], spacerIndexes: number[] = [],
@ -256,7 +258,7 @@ export const getEndpointScope = (
export const getInputEndpointStyle = ( export const getInputEndpointStyle = (
nodeTypeData: INodeTypeDescription, nodeTypeData: INodeTypeDescription,
color: string, color: string,
connectionType: ConnectionTypes = NodeConnectionType.Main, connectionType: NodeConnectionType = NodeConnectionType.Main,
): EndpointStyle => { ): EndpointStyle => {
let width = 8; let width = 8;
let height = nodeTypeData && nodeTypeData.outputs.length > 2 ? 18 : 20; let height = nodeTypeData && nodeTypeData.outputs.length > 2 ? 18 : 20;
@ -664,7 +666,7 @@ export const showConnectionActions = (connection: Connection) => {
export const getOutputSummary = ( export const getOutputSummary = (
data: ITaskData[], data: ITaskData[],
nodeConnections: NodeInputConnections, nodeConnections: NodeInputConnections,
connectionType: ConnectionTypes, connectionType: NodeConnectionType,
) => { ) => {
const outputMap: { const outputMap: {
[sourceOutputIndex: string]: { [sourceOutputIndex: string]: {

View file

@ -74,7 +74,6 @@ import type {
ITelemetryTrackProperties, ITelemetryTrackProperties,
IWorkflowBase, IWorkflowBase,
Workflow, Workflow,
ConnectionTypes,
INodeOutputConfiguration, INodeOutputConfiguration,
IRun, IRun,
} from 'n8n-workflow'; } from 'n8n-workflow';
@ -2289,7 +2288,7 @@ export default defineComponent({
} }
} }
let outputs: Array<ConnectionTypes | INodeOutputConfiguration> = []; let outputs: Array<NodeConnectionType | INodeOutputConfiguration> = [];
try { try {
// It fails when the outputs are an expression. As those nodes have // It fails when the outputs are an expression. As those nodes have
// normally no outputs by default and the only reason we need the // normally no outputs by default and the only reason we need the
@ -2424,7 +2423,7 @@ export default defineComponent({
sourceNodeOutputIndex: number, sourceNodeOutputIndex: number,
targetNodeName: string, targetNodeName: string,
targetNodeOuputIndex: number, targetNodeOuputIndex: number,
type: ConnectionTypes, type: NodeConnectionType,
): IConnection | undefined { ): IConnection | undefined {
const nodeConnections = const nodeConnections =
this.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName)[type]; this.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName)[type];
@ -2531,7 +2530,7 @@ export default defineComponent({
lastSelectedEndpoint.scope as NodeConnectionType, lastSelectedEndpoint.scope as NodeConnectionType,
) )
) { ) {
const connectionType = lastSelectedEndpoint.scope as ConnectionTypes; const connectionType = lastSelectedEndpoint.scope as NodeConnectionType;
const newNodeElement = this.instance.getManagedElement(newNodeData.id); const newNodeElement = this.instance.getManagedElement(newNodeData.id);
const newNodeConnections = this.instance.getEndpoints(newNodeElement); const newNodeConnections = this.instance.getEndpoints(newNodeElement);
const viableConnection = newNodeConnections.find((conn) => { const viableConnection = newNodeConnections.find((conn) => {
@ -2712,7 +2711,7 @@ export default defineComponent({
if (targetNodeType?.inputs?.length) { if (targetNodeType?.inputs?.length) {
const workflow = this.workflowHelpers.getCurrentWorkflow(); const workflow = this.workflowHelpers.getCurrentWorkflow();
const workflowNode = workflow.getNode(targetNode.name); const workflowNode = workflow.getNode(targetNode.name);
let inputs: Array<ConnectionTypes | INodeInputConfiguration> = []; let inputs: Array<NodeConnectionType | INodeInputConfiguration> = [];
if (targetNodeType && workflowNode) { if (targetNodeType && workflowNode) {
inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, targetNodeType); inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, targetNodeType);
} }
@ -3106,7 +3105,7 @@ export default defineComponent({
NodeViewUtils.hideConnectionActions(connection); NodeViewUtils.hideConnectionActions(connection);
NodeViewUtils.resetConnection(connection); NodeViewUtils.resetConnection(connection);
const scope = connection.scope as ConnectionTypes; const scope = connection.scope as NodeConnectionType;
const scopedEndpoints = Array.from( const scopedEndpoints = Array.from(
document.querySelectorAll(`[data-jtk-scope-${scope}=true]`), document.querySelectorAll(`[data-jtk-scope-${scope}=true]`),
); );
@ -3609,8 +3608,8 @@ export default defineComponent({
const workflow = this.workflowHelpers.getCurrentWorkflow(); const workflow = this.workflowHelpers.getCurrentWorkflow();
const workflowNode = workflow.getNode(node.name); const workflowNode = workflow.getNode(node.name);
let inputs: Array<ConnectionTypes | INodeInputConfiguration> = []; let inputs: Array<NodeConnectionType | INodeInputConfiguration> = [];
let outputs: Array<ConnectionTypes | INodeOutputConfiguration> = []; let outputs: Array<NodeConnectionType | INodeOutputConfiguration> = [];
if (nodeType && workflowNode) { if (nodeType && workflowNode) {
inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType); inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);
outputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, nodeType); outputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, nodeType);

View file

@ -66,13 +66,13 @@ module.exports = {
'n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node': 'error', 'n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node': 'error',
'n8n-nodes-base/node-class-description-empty-string': 'error', 'n8n-nodes-base/node-class-description-empty-string': 'error',
'n8n-nodes-base/node-class-description-icon-not-svg': 'error', 'n8n-nodes-base/node-class-description-icon-not-svg': 'error',
'n8n-nodes-base/node-class-description-inputs-wrong-regular-node': 'error', 'n8n-nodes-base/node-class-description-inputs-wrong-regular-node': 'off',
'n8n-nodes-base/node-class-description-inputs-wrong-trigger-node': 'error', 'n8n-nodes-base/node-class-description-inputs-wrong-trigger-node': 'error',
'n8n-nodes-base/node-class-description-missing-subtitle': 'error', 'n8n-nodes-base/node-class-description-missing-subtitle': 'error',
'n8n-nodes-base/node-class-description-non-core-color-present': 'error', 'n8n-nodes-base/node-class-description-non-core-color-present': 'error',
'n8n-nodes-base/node-class-description-name-miscased': 'error', 'n8n-nodes-base/node-class-description-name-miscased': 'error',
'n8n-nodes-base/node-class-description-name-unsuffixed-trigger-node': 'error', 'n8n-nodes-base/node-class-description-name-unsuffixed-trigger-node': 'error',
'n8n-nodes-base/node-class-description-outputs-wrong': 'error', 'n8n-nodes-base/node-class-description-outputs-wrong': 'off',
'n8n-nodes-base/node-dirname-against-convention': 'error', 'n8n-nodes-base/node-dirname-against-convention': 'error',
'n8n-nodes-base/node-execute-block-double-assertion-for-items': 'error', 'n8n-nodes-base/node-execute-block-double-assertion-for-items': 'error',
'n8n-nodes-base/node-execute-block-wrong-error-thrown': 'error', 'n8n-nodes-base/node-execute-block-wrong-error-thrown': 'error',

View file

@ -5,7 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { import {
actionNetworkApiRequest, actionNetworkApiRequest,
@ -56,8 +56,8 @@ export class ActionNetwork implements INodeType {
defaults: { defaults: {
name: 'Action Network', name: 'Action Network',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'actionNetworkApi', name: 'actionNetworkApi',

View file

@ -8,7 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IHttpRequestMethods, IHttpRequestMethods,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import type { IProduct } from './GenericFunctions'; import type { IProduct } from './GenericFunctions';
import { activeCampaignApiRequest, activeCampaignApiRequestAllItems } from './GenericFunctions'; import { activeCampaignApiRequest, activeCampaignApiRequestAllItems } from './GenericFunctions';
@ -89,8 +89,8 @@ export class ActiveCampaign implements INodeType {
defaults: { defaults: {
name: 'ActiveCampaign', name: 'ActiveCampaign',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'activeCampaignApi', name: 'activeCampaignApi',

View file

@ -8,6 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { activeCampaignApiRequest, activeCampaignApiRequestAllItems } from './GenericFunctions'; import { activeCampaignApiRequest, activeCampaignApiRequestAllItems } from './GenericFunctions';
@ -23,7 +24,7 @@ export class ActiveCampaignTrigger implements INodeType {
name: 'ActiveCampaign Trigger', name: 'ActiveCampaign Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'activeCampaignApi', name: 'activeCampaignApi',

View file

@ -6,6 +6,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { acuitySchedulingApiRequest } from './GenericFunctions'; import { acuitySchedulingApiRequest } from './GenericFunctions';
@ -22,7 +23,7 @@ export class AcuitySchedulingTrigger implements INodeType {
name: 'Acuity Scheduling Trigger', name: 'Acuity Scheduling Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'acuitySchedulingApi', name: 'acuitySchedulingApi',

View file

@ -1,9 +1,10 @@
import type { import {
IDataObject, NodeConnectionType,
IExecuteSingleFunctions, type IDataObject,
IHttpRequestOptions, type IExecuteSingleFunctions,
INodeType, type IHttpRequestOptions,
INodeTypeDescription, type INodeType,
type INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { collectionFields } from './CollectionDescription'; import { collectionFields } from './CollectionDescription';
import type { FieldsUiValues } from './types'; import type { FieldsUiValues } from './types';
@ -20,8 +21,8 @@ export class Adalo implements INodeType {
defaults: { defaults: {
name: 'Adalo', name: 'Adalo',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'adaloApi', name: 'adaloApi',

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { affinityApiRequest, affinityApiRequestAllItems } from './GenericFunctions'; import { affinityApiRequest, affinityApiRequestAllItems } from './GenericFunctions';
@ -34,8 +35,8 @@ export class Affinity implements INodeType {
defaults: { defaults: {
name: 'Affinity', name: 'Affinity',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'affinityApi', name: 'affinityApi',

View file

@ -6,7 +6,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { affinityApiRequest, eventsExist, mapResource } from './GenericFunctions'; import { affinityApiRequest, eventsExist, mapResource } from './GenericFunctions';
@ -22,7 +22,7 @@ export class AffinityTrigger implements INodeType {
name: 'Affinity Trigger', name: 'Affinity Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'affinityApi', name: 'affinityApi',

View file

@ -5,7 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { jsonParse, NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, jsonParse, NodeOperationError } from 'n8n-workflow';
import { contactFields, contactOperations } from './ContactDescription'; import { contactFields, contactOperations } from './ContactDescription';
@ -41,8 +41,8 @@ export class AgileCrm implements INodeType {
defaults: { defaults: {
name: 'Agile CRM', name: 'Agile CRM',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'agileCrmApi', name: 'agileCrmApi',

View file

@ -1,6 +1,7 @@
/* eslint-disable n8n-nodes-base/node-dirname-against-convention */ /* eslint-disable n8n-nodes-base/node-dirname-against-convention */
import { import {
NodeOperationError, NodeOperationError,
NodeConnectionType,
type IExecuteFunctions, type IExecuteFunctions,
type INodeExecutionData, type INodeExecutionData,
type INodeType, type INodeType,
@ -26,8 +27,8 @@ export class AiTransform implements INodeType {
defaults: { defaults: {
name: 'AI Transform', name: 'AI Transform',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
parameterPane: 'wide', parameterPane: 'wide',
properties: [ properties: [
{ {

View file

@ -5,7 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import type { IRecord } from './v1/GenericFunctions'; import type { IRecord } from './v1/GenericFunctions';
@ -54,7 +54,7 @@ export class AirtableTrigger implements INodeType {
], ],
polling: true, polling: true,
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [ properties: [
{ {
displayName: 'Authentication', displayName: 'Authentication',

View file

@ -8,7 +8,7 @@ import type {
INodeTypeBaseDescription, INodeTypeBaseDescription,
IHttpRequestMethods, IHttpRequestMethods,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { oldVersionNotice } from '../../../utils/descriptions'; import { oldVersionNotice } from '../../../utils/descriptions';
import { generatePairedItemData } from '../../../utils/utilities'; import { generatePairedItemData } from '../../../utils/utilities';
@ -25,8 +25,8 @@ const versionDescription: INodeTypeDescription = {
defaults: { defaults: {
name: 'Airtable', name: 'Airtable',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'airtableApi', name: 'airtableApi',

View file

@ -1,5 +1,5 @@
/* eslint-disable n8n-nodes-base/node-filename-against-convention */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import type { INodeTypeDescription } from 'n8n-workflow'; import { NodeConnectionType, type INodeTypeDescription } from 'n8n-workflow';
import * as record from './record/Record.resource'; import * as record from './record/Record.resource';
import * as base from './base/Base.resource'; import * as base from './base/Base.resource';
@ -15,8 +15,8 @@ export const versionDescription: INodeTypeDescription = {
defaults: { defaults: {
name: 'Airtable', name: 'Airtable',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'airtableTokenApi', name: 'airtableTokenApi',

View file

@ -12,7 +12,7 @@ import type {
ICredentialsDecrypted, ICredentialsDecrypted,
ICredentialDataDecryptedObject, ICredentialDataDecryptedObject,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
async function checkIfCredentialsValid( async function checkIfCredentialsValid(
credentials: IDataObject, credentials: IDataObject,
@ -65,8 +65,8 @@ export class Amqp implements INodeType {
defaults: { defaults: {
name: 'AMQP Sender', name: 'AMQP Sender',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'amqp', name: 'amqp',

View file

@ -10,7 +10,7 @@ import type {
IDeferredPromise, IDeferredPromise,
IRun, IRun,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { deepCopy, jsonParse, NodeOperationError } from 'n8n-workflow'; import { deepCopy, jsonParse, NodeConnectionType, NodeOperationError } from 'n8n-workflow';
export class AmqpTrigger implements INodeType { export class AmqpTrigger implements INodeType {
description: INodeTypeDescription = { description: INodeTypeDescription = {
@ -24,7 +24,7 @@ export class AmqpTrigger implements INodeType {
name: 'AMQP Trigger', name: 'AMQP Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'amqp', name: 'amqp',

View file

@ -7,7 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { import {
apiTemplateIoApiRequest, apiTemplateIoApiRequest,
@ -28,8 +28,8 @@ export class ApiTemplateIo implements INodeType {
defaults: { defaults: {
name: 'APITemplate.io', name: 'APITemplate.io',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'apiTemplateIoApi', name: 'apiTemplateIoApi',

View file

@ -8,7 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
JsonObject, JsonObject,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeApiError, NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeApiError, NodeOperationError } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
@ -33,8 +33,8 @@ export class Asana implements INodeType {
defaults: { defaults: {
name: 'Asana', name: 'Asana',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'asanaApi', name: 'asanaApi',

View file

@ -8,7 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { asanaApiRequest, getWorkspaces } from './GenericFunctions'; import { asanaApiRequest, getWorkspaces } from './GenericFunctions';
@ -28,7 +28,7 @@ export class AsanaTrigger implements INodeType {
name: 'Asana Trigger', name: 'Asana Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'asanaApi', name: 'asanaApi',

View file

@ -1,12 +1,13 @@
import type { import {
IExecuteFunctions, type IExecuteFunctions,
IDataObject, type IDataObject,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodeExecutionData, type INodeExecutionData,
INodePropertyOptions, type INodePropertyOptions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
NodeExecutionWithMetadata, type NodeExecutionWithMetadata,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { automizyApiRequest, automizyApiRequestAllItems } from './GenericFunctions'; import { automizyApiRequest, automizyApiRequestAllItems } from './GenericFunctions';
@ -28,8 +29,8 @@ export class Automizy implements INodeType {
defaults: { defaults: {
name: 'Automizy', name: 'Automizy',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
hidden: true, hidden: true,
credentials: [ credentials: [
{ {

View file

@ -1,12 +1,13 @@
import type { import {
IExecuteFunctions, type IExecuteFunctions,
IDataObject, type IDataObject,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodeExecutionData, type INodeExecutionData,
INodePropertyOptions, type INodePropertyOptions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
IHttpRequestMethods, type IHttpRequestMethods,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { autopilotApiRequest, autopilotApiRequestAllItems } from './GenericFunctions'; import { autopilotApiRequest, autopilotApiRequestAllItems } from './GenericFunctions';
@ -31,8 +32,8 @@ export class Autopilot implements INodeType {
defaults: { defaults: {
name: 'Autopilot', name: 'Autopilot',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'autopilotApi', name: 'autopilotApi',

View file

@ -6,6 +6,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { snakeCase } from 'change-case'; import { snakeCase } from 'change-case';
import { autopilotApiRequest } from './GenericFunctions'; import { autopilotApiRequest } from './GenericFunctions';
@ -23,7 +24,7 @@ export class AutopilotTrigger implements INodeType {
name: 'Autopilot Trigger', name: 'Autopilot Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'autopilotApi', name: 'autopilotApi',

View file

@ -8,7 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
JsonObject, JsonObject,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeApiError } from 'n8n-workflow'; import { NodeConnectionType, NodeApiError } from 'n8n-workflow';
import { awsApiRequestREST } from './GenericFunctions'; import { awsApiRequestREST } from './GenericFunctions';
@ -24,8 +24,8 @@ export class AwsLambda implements INodeType {
defaults: { defaults: {
name: 'AWS Lambda', name: 'AWS Lambda',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -1,12 +1,13 @@
import type { import {
IExecuteFunctions, type IExecuteFunctions,
IDataObject, type IDataObject,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodeExecutionData, type INodeExecutionData,
INodeListSearchItems, type INodeListSearchItems,
INodeListSearchResult, type INodeListSearchResult,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { awsApiRequestSOAP } from './GenericFunctions'; import { awsApiRequestSOAP } from './GenericFunctions';
@ -23,8 +24,8 @@ export class AwsSns implements INodeType {
defaults: { defaults: {
name: 'AWS SNS', name: 'AWS SNS',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -8,7 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { jsonParse, NodeOperationError } from 'n8n-workflow'; import { jsonParse, NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import get from 'lodash/get'; import get from 'lodash/get';
import { awsApiRequestSOAP } from './GenericFunctions'; import { awsApiRequestSOAP } from './GenericFunctions';
@ -26,7 +26,7 @@ export class AwsSnsTrigger implements INodeType {
name: 'AWS SNS Trigger', name: 'AWS SNS Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { certificateFields, certificateOperations } from './CertificateDescription'; import { certificateFields, certificateOperations } from './CertificateDescription';
@ -22,8 +23,8 @@ export class AwsCertificateManager implements INodeType {
defaults: { defaults: {
name: 'AWS Certificate Manager', name: 'AWS Certificate Manager',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { awsApiRequestREST } from './GenericFunctions'; import { awsApiRequestREST } from './GenericFunctions';
@ -20,8 +21,8 @@ export class AwsComprehend implements INodeType {
defaults: { defaults: {
name: 'AWS Comprehend', name: 'AWS Comprehend',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -1,12 +1,13 @@
/* eslint-disable n8n-nodes-base/node-filename-against-convention */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import type { import {
IExecuteFunctions, type IExecuteFunctions,
IDataObject, type IDataObject,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodeExecutionData, type INodeExecutionData,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
NodeParameterValue, type NodeParameterValue,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { awsApiRequest, awsApiRequestAllItems } from './GenericFunctions'; import { awsApiRequest, awsApiRequestAllItems } from './GenericFunctions';
@ -42,8 +43,8 @@ export class AwsDynamoDB implements INodeType {
defaults: { defaults: {
name: 'AWS DynamoDB', name: 'AWS DynamoDB',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -8,6 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
JsonObject, JsonObject,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { awsApiRequestSOAP, awsApiRequestSOAPAllItems } from './GenericFunctions'; import { awsApiRequestSOAP, awsApiRequestSOAPAllItems } from './GenericFunctions';
@ -30,8 +31,8 @@ export class AwsElb implements INodeType {
defaults: { defaults: {
name: 'AWS ELB', name: 'AWS ELB',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { awsApiRequestREST, keysTPascalCase } from './GenericFunctions'; import { awsApiRequestREST, keysTPascalCase } from './GenericFunctions';
@ -20,8 +21,8 @@ export class AwsRekognition implements INodeType {
defaults: { defaults: {
name: 'AWS Rekognition', name: 'AWS Rekognition',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -12,7 +12,7 @@ import type {
INodeTypeBaseDescription, INodeTypeBaseDescription,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { bucketFields, bucketOperations } from './BucketDescription'; import { bucketFields, bucketOperations } from './BucketDescription';
@ -42,8 +42,8 @@ export class AwsS3V1 implements INodeType {
defaults: { defaults: {
name: 'AWS S3', name: 'AWS S3',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -13,7 +13,7 @@ import type {
INodeTypeBaseDescription, INodeTypeBaseDescription,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { bucketFields, bucketOperations } from './BucketDescription'; import { bucketFields, bucketOperations } from './BucketDescription';
@ -42,8 +42,8 @@ export class AwsS3V2 implements INodeType {
defaults: { defaults: {
name: 'AWS S3', name: 'AWS S3',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -8,7 +8,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { awsApiRequestSOAP, awsApiRequestSOAPAllItems } from './GenericFunctions'; import { awsApiRequestSOAP, awsApiRequestSOAPAllItems } from './GenericFunctions';
@ -30,8 +30,8 @@ export class AwsSes implements INodeType {
defaults: { defaults: {
name: 'AWS SES', name: 'AWS SES',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -10,7 +10,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
JsonObject, JsonObject,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeApiError } from 'n8n-workflow'; import { NodeApiError, NodeConnectionType } from 'n8n-workflow';
import { pascalCase } from 'change-case'; import { pascalCase } from 'change-case';
import { awsApiRequestSOAP } from '../GenericFunctions'; import { awsApiRequestSOAP } from '../GenericFunctions';
@ -27,8 +27,8 @@ export class AwsSqs implements INodeType {
defaults: { defaults: {
name: 'AWS SQS', name: 'AWS SQS',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -1,13 +1,14 @@
import type { import {
ICredentialDataDecryptedObject, NodeConnectionType,
ICredentialsDecrypted, type ICredentialDataDecryptedObject,
ICredentialTestFunctions, type ICredentialsDecrypted,
IDataObject, type ICredentialTestFunctions,
IExecuteFunctions, type IDataObject,
INodeCredentialTestResult, type IExecuteFunctions,
INodeExecutionData, type INodeCredentialTestResult,
INodeType, type INodeExecutionData,
INodeTypeDescription, type INodeType,
type INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import type { IExpenseDocument } from './GenericFunctions'; import type { IExpenseDocument } from './GenericFunctions';
@ -25,8 +26,8 @@ export class AwsTextract implements INodeType {
defaults: { defaults: {
name: 'AWS Textract', name: 'AWS Textract',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { awsApiRequestREST, awsApiRequestRESTAllItems } from './GenericFunctions'; import { awsApiRequestREST, awsApiRequestRESTAllItems } from './GenericFunctions';
@ -20,8 +21,8 @@ export class AwsTranscribe implements INodeType {
defaults: { defaults: {
name: 'AWS Transcribe', name: 'AWS Transcribe',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'aws', name: 'aws',

View file

@ -1,5 +1,5 @@
/* eslint-disable n8n-nodes-base/node-filename-against-convention */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import type { INodeTypeDescription } from 'n8n-workflow'; import { NodeConnectionType, type INodeTypeDescription } from 'n8n-workflow';
import * as file from './file'; import * as file from './file';
import * as employee from './employee'; import * as employee from './employee';
@ -22,9 +22,9 @@ export const versionDescription: INodeTypeDescription = {
group: ['transform'], group: ['transform'],
// eslint-disable-next-line n8n-nodes-base/node-class-description-icon-not-svg // eslint-disable-next-line n8n-nodes-base/node-class-description-icon-not-svg
icon: 'file:bambooHr.png', icon: 'file:bambooHr.png',
inputs: ['main'], inputs: [NodeConnectionType.Main],
name: 'bambooHr', name: 'bambooHr',
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [ properties: [
{ {
displayName: 'Resource', displayName: 'Resource',

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { bannerbearApiRequest, keysToSnakeCase } from './GenericFunctions'; import { bannerbearApiRequest, keysToSnakeCase } from './GenericFunctions';
@ -27,8 +28,8 @@ export class Bannerbear implements INodeType {
defaults: { defaults: {
name: 'Bannerbear', name: 'Bannerbear',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'bannerbearApi', name: 'bannerbearApi',

View file

@ -1,10 +1,11 @@
import type { import {
IExecuteFunctions, type IExecuteFunctions,
IDataObject, type IDataObject,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodeExecutionData, type INodeExecutionData,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
@ -38,8 +39,8 @@ export class Baserow implements INodeType {
defaults: { defaults: {
name: 'Baserow', name: 'Baserow',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'baserowApi', name: 'baserowApi',

View file

@ -1,12 +1,13 @@
import type { import {
IExecuteFunctions, type IExecuteFunctions,
IDataObject, type IDataObject,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodeExecutionData, type INodeExecutionData,
INodeParameters, type INodeParameters,
INodePropertyOptions, type INodePropertyOptions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
@ -32,8 +33,8 @@ export class Beeminder implements INodeType {
}, },
// eslint-disable-next-line n8n-nodes-base/node-class-description-icon-not-svg // eslint-disable-next-line n8n-nodes-base/node-class-description-icon-not-svg
icon: 'file:beeminder.png', icon: 'file:beeminder.png',
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'beeminderApi', name: 'beeminderApi',

View file

@ -1,16 +1,17 @@
import type { import {
IHookFunctions, type IHookFunctions,
IWebhookFunctions, type IWebhookFunctions,
ICredentialsDecrypted, type ICredentialsDecrypted,
ICredentialTestFunctions, type ICredentialTestFunctions,
IDataObject, type IDataObject,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodeCredentialTestResult, type INodeCredentialTestResult,
INodePropertyOptions, type INodePropertyOptions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
IWebhookResponseData, type IWebhookResponseData,
IRequestOptions, type IRequestOptions,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { bitbucketApiRequest, bitbucketApiRequestAllItems } from './GenericFunctions'; import { bitbucketApiRequest, bitbucketApiRequestAllItems } from './GenericFunctions';
@ -27,7 +28,7 @@ export class BitbucketTrigger implements INodeType {
name: 'Bitbucket Trigger', name: 'Bitbucket Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'bitbucketApi', name: 'bitbucketApi',

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { linkFields, linkOperations } from './LinkDescription'; import { linkFields, linkOperations } from './LinkDescription';
@ -24,8 +25,8 @@ export class Bitly implements INodeType {
defaults: { defaults: {
name: 'Bitly', name: 'Bitly',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'bitlyApi', name: 'bitlyApi',

View file

@ -6,7 +6,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import isEmpty from 'lodash/isEmpty'; import isEmpty from 'lodash/isEmpty';
import partialRight from 'lodash/partialRight'; import partialRight from 'lodash/partialRight';
@ -46,8 +46,8 @@ export class Bitwarden implements INodeType {
defaults: { defaults: {
name: 'Bitwarden', name: 'Bitwarden',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'bitwardenApi', name: 'bitwardenApi',

View file

@ -5,7 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import { noCase } from 'change-case'; import { noCase } from 'change-case';
@ -28,8 +28,8 @@ export class Box implements INodeType {
defaults: { defaults: {
name: 'Box', name: 'Box',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'boxOAuth2Api', name: 'boxOAuth2Api',

View file

@ -1,9 +1,10 @@
import type { import {
IHookFunctions, type IHookFunctions,
IWebhookFunctions, type IWebhookFunctions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
IWebhookResponseData, type IWebhookResponseData,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { boxApiRequest, boxApiRequestAllItems } from './GenericFunctions'; import { boxApiRequest, boxApiRequestAllItems } from './GenericFunctions';
@ -21,7 +22,7 @@ export class BoxTrigger implements INodeType {
name: 'Box Trigger', name: 'Box Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'boxOAuth2Api', name: 'boxOAuth2Api',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { brandfetchApiRequest } from './GenericFunctions'; import { brandfetchApiRequest } from './GenericFunctions';
@ -22,8 +23,8 @@ export class Brandfetch implements INodeType {
defaults: { defaults: {
name: 'Brandfetch', name: 'Brandfetch',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'brandfetchApi', name: 'brandfetchApi',

View file

@ -1,5 +1,6 @@
/* eslint-disable n8n-nodes-base/node-filename-against-convention */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import type { INodeType, INodeTypeDescription } from 'n8n-workflow'; import type { INodeType, INodeTypeDescription } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { attributeFields, attributeOperations } from './AttributeDescription'; import { attributeFields, attributeOperations } from './AttributeDescription';
import { contactFields, contactOperations } from './ContactDescription'; import { contactFields, contactOperations } from './ContactDescription';
import { emailFields, emailOperations } from './EmailDescription'; import { emailFields, emailOperations } from './EmailDescription';
@ -18,8 +19,8 @@ export class Brevo implements INodeType {
defaults: { defaults: {
name: 'Brevo', name: 'Brevo',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'sendInBlueApi', name: 'sendInBlueApi',

View file

@ -1,10 +1,11 @@
/* eslint-disable n8n-nodes-base/node-filename-against-convention */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import type { import {
IHookFunctions, NodeConnectionType,
INodeType, type IHookFunctions,
INodeTypeDescription, type INodeType,
IWebhookFunctions, type INodeTypeDescription,
IWebhookResponseData, type IWebhookFunctions,
type IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { BrevoWebhookApi } from './GenericFunctions'; import { BrevoWebhookApi } from './GenericFunctions';
@ -29,7 +30,7 @@ export class BrevoTrigger implements INodeType {
inputs: [], inputs: [],
// keep sendinblue name for backward compatibility // keep sendinblue name for backward compatibility
name: 'sendInBlueTrigger', name: 'sendInBlueTrigger',
outputs: ['main'], outputs: [NodeConnectionType.Main],
version: 1, version: 1,
webhooks: [ webhooks: [
{ {

View file

@ -5,7 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import { bubbleApiRequest, bubbleApiRequestAllItems, validateJSON } from './GenericFunctions'; import { bubbleApiRequest, bubbleApiRequestAllItems, validateJSON } from './GenericFunctions';
@ -23,8 +23,8 @@ export class Bubble implements INodeType {
defaults: { defaults: {
name: 'Bubble', name: 'Bubble',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'bubbleApi', name: 'bubbleApi',

View file

@ -1,12 +1,13 @@
import type { import {
IDataObject, type IDataObject,
IHookFunctions, type IHookFunctions,
IWebhookFunctions, type IWebhookFunctions,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
INodePropertyOptions, type INodePropertyOptions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
IWebhookResponseData, type IWebhookResponseData,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { calApiRequest, sortOptionParameters } from './GenericFunctions'; import { calApiRequest, sortOptionParameters } from './GenericFunctions';
@ -24,7 +25,7 @@ export class CalTrigger implements INodeType {
name: 'Cal.com Trigger', name: 'Cal.com Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'calApi', name: 'calApi',

View file

@ -6,6 +6,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { calendlyApiRequest, getAuthenticationType } from './GenericFunctions'; import { calendlyApiRequest, getAuthenticationType } from './GenericFunctions';
@ -21,7 +22,7 @@ export class CalendlyTrigger implements INodeType {
name: 'Calendly Trigger', name: 'Calendly Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'calendlyApi', name: 'calendlyApi',

View file

@ -9,7 +9,7 @@ import type {
IRequestOptions, IRequestOptions,
IHttpRequestMethods, IHttpRequestMethods,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeApiError, NodeOperationError } from 'n8n-workflow'; import { NodeApiError, NodeConnectionType, NodeOperationError } from 'n8n-workflow';
interface CustomProperty { interface CustomProperty {
name: string; name: string;
@ -37,8 +37,8 @@ export class Chargebee implements INodeType {
defaults: { defaults: {
name: 'Chargebee', name: 'Chargebee',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'chargebeeApi', name: 'chargebeeApi',

View file

@ -1,9 +1,10 @@
import type { import {
IDataObject, type IDataObject,
IWebhookFunctions, type IWebhookFunctions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
IWebhookResponseData, type IWebhookResponseData,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
export class ChargebeeTrigger implements INodeType { export class ChargebeeTrigger implements INodeType {
@ -19,7 +20,7 @@ export class ChargebeeTrigger implements INodeType {
name: 'Chargebee Trigger', name: 'Chargebee Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
webhooks: [ webhooks: [
{ {
name: 'default', name: 'default',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { pipelineFields, pipelineOperations } from './PipelineDescription'; import { pipelineFields, pipelineOperations } from './PipelineDescription';
@ -23,8 +24,8 @@ export class CircleCi implements INodeType {
defaults: { defaults: {
name: 'CircleCI', name: 'CircleCI',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'circleCiApi', name: 'circleCiApi',

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import { getAttachments, webexApiRequest, webexApiRequestAllItems } from './GenericFunctions'; import { getAttachments, webexApiRequest, webexApiRequestAllItems } from './GenericFunctions';
@ -39,8 +40,8 @@ export class CiscoWebex implements INodeType {
required: true, required: true,
}, },
], ],
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [ properties: [
{ {
displayName: 'Resource', displayName: 'Resource',

View file

@ -7,6 +7,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { import {
getAutomaticSecret, getAutomaticSecret,
@ -30,7 +31,7 @@ export class CiscoWebexTrigger implements INodeType {
name: 'Webex by Cisco Trigger', name: 'Webex by Cisco Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'ciscoWebexOAuth2Api', name: 'ciscoWebexOAuth2Api',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { clearbitApiRequest } from './GenericFunctions'; import { clearbitApiRequest } from './GenericFunctions';
@ -24,8 +25,8 @@ export class Clearbit implements INodeType {
defaults: { defaults: {
name: 'Clearbit', name: 'Clearbit',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'clearbitApi', name: 'clearbitApi',

View file

@ -7,7 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import { clickupApiRequest, clickupApiRequestAllItems, validateJSON } from './GenericFunctions'; import { clickupApiRequest, clickupApiRequestAllItems, validateJSON } from './GenericFunctions';
@ -61,8 +61,8 @@ export class ClickUp implements INodeType {
defaults: { defaults: {
name: 'ClickUp', name: 'ClickUp',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'clickUpApi', name: 'clickUpApi',

View file

@ -9,6 +9,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { clickupApiRequest } from './GenericFunctions'; import { clickupApiRequest } from './GenericFunctions';
@ -24,7 +25,7 @@ export class ClickUpTrigger implements INodeType {
name: 'ClickUp Trigger', name: 'ClickUp Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'clickUpApi', name: 'clickUpApi',

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import { clockifyApiRequest, clockifyApiRequestAllItems } from './GenericFunctions'; import { clockifyApiRequest, clockifyApiRequestAllItems } from './GenericFunctions';
@ -43,8 +44,8 @@ export class Clockify implements INodeType {
defaults: { defaults: {
name: 'Clockify', name: 'Clockify',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'clockifyApi', name: 'clockifyApi',

View file

@ -9,6 +9,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { clockifyApiRequest } from './GenericFunctions'; import { clockifyApiRequest } from './GenericFunctions';
@ -28,7 +29,7 @@ export class ClockifyTrigger implements INodeType {
name: 'Clockify Trigger', name: 'Clockify Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'clockifyApi', name: 'clockifyApi',

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { cloudflareApiRequest, cloudflareApiRequestAllItems } from './GenericFunctions'; import { cloudflareApiRequest, cloudflareApiRequestAllItems } from './GenericFunctions';
@ -24,8 +25,8 @@ export class Cloudflare implements INodeType {
defaults: { defaults: {
name: 'Cloudflare', name: 'Cloudflare',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'cloudflareApi', name: 'cloudflareApi',

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { collectionFields, collectionOperations } from './CollectionDescription'; import { collectionFields, collectionOperations } from './CollectionDescription';
import { import {
createCollectionEntry, createCollectionEntry,
@ -31,8 +32,8 @@ export class Cockpit implements INodeType {
defaults: { defaults: {
name: 'Cockpit', name: 'Cockpit',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'cockpitApi', name: 'cockpitApi',

View file

@ -8,7 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
JsonObject, JsonObject,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeApiError } from 'n8n-workflow'; import { NodeConnectionType, NodeApiError } from 'n8n-workflow';
import { codaApiRequest, codaApiRequestAllItems } from './GenericFunctions'; import { codaApiRequest, codaApiRequestAllItems } from './GenericFunctions';
import { tableFields, tableOperations } from './TableDescription'; import { tableFields, tableOperations } from './TableDescription';
import { formulaFields, formulaOperations } from './FormulaDescription'; import { formulaFields, formulaOperations } from './FormulaDescription';
@ -27,8 +27,8 @@ export class Coda implements INodeType {
defaults: { defaults: {
name: 'Coda', name: 'Coda',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'codaApi', name: 'codaApi',

View file

@ -1,10 +1,11 @@
import type { import {
CodeExecutionMode, NodeConnectionType,
CodeNodeEditorLanguage, type CodeExecutionMode,
IExecuteFunctions, type CodeNodeEditorLanguage,
INodeExecutionData, type IExecuteFunctions,
INodeType, type INodeExecutionData,
INodeTypeDescription, type INodeType,
type INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import set from 'lodash/set'; import set from 'lodash/set';
import { javascriptCodeDescription } from './descriptions/JavascriptCodeDescription'; import { javascriptCodeDescription } from './descriptions/JavascriptCodeDescription';
@ -28,8 +29,8 @@ export class Code implements INodeType {
defaults: { defaults: {
name: 'Code', name: 'Code',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
parameterPane: 'wide', parameterPane: 'wide',
properties: [ properties: [
{ {

View file

@ -7,6 +7,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import { coinFields, coinOperations } from './CoinDescription'; import { coinFields, coinOperations } from './CoinDescription';
@ -27,8 +28,8 @@ export class CoinGecko implements INodeType {
defaults: { defaults: {
name: 'CoinGecko', name: 'CoinGecko',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [ properties: [
{ {
displayName: 'Resource', displayName: 'Resource',

View file

@ -1,9 +1,10 @@
import type { import {
IExecuteFunctions, type IExecuteFunctions,
IDataObject, type IDataObject,
INodeExecutionData, type INodeExecutionData,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
checkInput, checkInput,
@ -22,11 +23,16 @@ export class CompareDatasets implements INodeType {
description: 'Compare two inputs for changes', description: 'Compare two inputs for changes',
defaults: { name: 'Compare Datasets' }, defaults: { name: 'Compare Datasets' },
// eslint-disable-next-line n8n-nodes-base/node-class-description-inputs-wrong-regular-node // eslint-disable-next-line n8n-nodes-base/node-class-description-inputs-wrong-regular-node
inputs: ['main', 'main'], inputs: [NodeConnectionType.Main, NodeConnectionType.Main],
inputNames: ['Input A', 'Input B'], inputNames: ['Input A', 'Input B'],
requiredInputs: 1, requiredInputs: 1,
// eslint-disable-next-line n8n-nodes-base/node-class-description-outputs-wrong // eslint-disable-next-line n8n-nodes-base/node-class-description-outputs-wrong
outputs: ['main', 'main', 'main', 'main'], outputs: [
NodeConnectionType.Main,
NodeConnectionType.Main,
NodeConnectionType.Main,
NodeConnectionType.Main,
],
outputNames: ['In A only', 'Same', 'Different', 'In B only'], outputNames: ['In A only', 'Same', 'Different', 'In B only'],
properties: [ properties: [
{ {

View file

@ -1,10 +1,11 @@
import { promisify } from 'util'; import { promisify } from 'util';
import type { import {
IBinaryKeyData, NodeConnectionType,
IExecuteFunctions, type IBinaryKeyData,
INodeExecutionData, type IExecuteFunctions,
INodeType, type INodeExecutionData,
INodeTypeDescription, type INodeType,
type INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import * as fflate from 'fflate'; import * as fflate from 'fflate';
@ -57,8 +58,8 @@ export class Compression implements INodeType {
name: 'Compression', name: 'Compression',
color: '#408000', color: '#408000',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
properties: [ properties: [
{ {
displayName: 'Operation', displayName: 'Operation',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { contentfulApiRequestAllItems, contentfulApiRequest } from './GenericFunctions'; import { contentfulApiRequestAllItems, contentfulApiRequest } from './GenericFunctions';
@ -27,8 +28,8 @@ export class Contentful implements INodeType {
defaults: { defaults: {
name: 'Contentful', name: 'Contentful',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'contentfulApi', name: 'contentfulApi',

View file

@ -1,11 +1,12 @@
import type { import {
IExecuteFunctions, type IExecuteFunctions,
ILoadOptionsFunctions, type ILoadOptionsFunctions,
IDataObject, type IDataObject,
INodeExecutionData, type INodeExecutionData,
INodePropertyOptions, type INodePropertyOptions,
INodeType, type INodeType,
INodeTypeDescription, type INodeTypeDescription,
NodeConnectionType,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { convertKitApiRequest } from './GenericFunctions'; import { convertKitApiRequest } from './GenericFunctions';
@ -32,8 +33,8 @@ export class ConvertKit implements INodeType {
defaults: { defaults: {
name: 'ConvertKit', name: 'ConvertKit',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'convertKitApi', name: 'convertKitApi',

View file

@ -8,6 +8,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { snakeCase } from 'change-case'; import { snakeCase } from 'change-case';
import { convertKitApiRequest } from './GenericFunctions'; import { convertKitApiRequest } from './GenericFunctions';
@ -25,7 +26,7 @@ export class ConvertKitTrigger implements INodeType {
name: 'ConvertKit Trigger', name: 'ConvertKit Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'convertKitApi', name: 'convertKitApi',

View file

@ -5,6 +5,7 @@ import type {
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { import {
adjustCompanyFields, adjustCompanyFields,
@ -46,8 +47,8 @@ export class Copper implements INodeType {
defaults: { defaults: {
name: 'Copper', name: 'Copper',
}, },
inputs: ['main'], inputs: [NodeConnectionType.Main],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'copperApi', name: 'copperApi',

View file

@ -6,6 +6,7 @@ import type {
INodeTypeDescription, INodeTypeDescription,
IWebhookResponseData, IWebhookResponseData,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { NodeConnectionType } from 'n8n-workflow';
import { copperApiRequest, getAutomaticSecret } from './GenericFunctions'; import { copperApiRequest, getAutomaticSecret } from './GenericFunctions';
@ -21,7 +22,7 @@ export class CopperTrigger implements INodeType {
name: 'Copper Trigger', name: 'Copper Trigger',
}, },
inputs: [], inputs: [],
outputs: ['main'], outputs: [NodeConnectionType.Main],
credentials: [ credentials: [
{ {
name: 'copperApi', name: 'copperApi',

Some files were not shown because too many files have changed in this diff Show more