refactor: Apply more eslint-plugin-n8n-nodes-base rules (#3624)

* ⬆️ Upgrade `eslint-plugin-n8n-nodes-base`

* 📦 Update `package-lock.json`

* 🔧 Adjust renamed filesystem rules

* ✏️ Alphabetize ruleset

*  Categorize overrides

*  Set renamings in lint exceptions

*  Run baseline `lintfix`

*  Update linting scripts

* 👕 Apply `node-param-description-missing-from-dynamic-multi-options`

* 👕 Apply `cred-class-field-name-missing-oauth2` (#3627)

* Rule working as intended

* Removed comments

* Move cred rule to different rule set

* 👕 Apply `node-param-array-type-assertion`

* 👕 Apply `node-dirname-against-convention`

* Apply `cred-class-field-display-name-oauth2` (#3628)

* Apply `node-execute-block-wrong-error-thrown`

* Apply `node-class-description-display-name-unsuffixed-trigger-node`

* Apply `node-class-description-name-unsuffixed-trigger-node`

* Apply `cred-class-name-missing-oauth2-suffix` (#3636)

* Rule working as intended, add exception to existing nodes

* 👕 Apply `cred-class-field-name-uppercase-first-char` (#3638)

* ⬆️ Upgrade to plugin version 1.2.28

* 📦 Update `package-lock.json`

* 👕 Update lintings with 1.2.8 change

* 👕 Apply `cred-class-field-name-unsuffixed`

* 👕 Apply `cred-class-name-unsuffixed`

* 👕 Apply `node-class-description-credentials-name-unsuffixed`

* ✏️ Alphabetize rules

*  Remove `nodelinter` package

* 📦 Update `package-lock.json`

*  Consolidate `lint` and `lintfix` scripts

Co-authored-by: agobrech <45268029+agobrech@users.noreply.github.com>
Co-authored-by: agobrech <ael.gobrecht@gmail.com>
This commit is contained in:
Iván Ovejero 2022-07-04 11:12:08 +02:00 committed by GitHub
parent 6b9289349f
commit 59f2e8e7d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
74 changed files with 7530 additions and 24481 deletions

View file

@ -371,21 +371,38 @@ module.exports = {
}, },
}, },
{ {
files: [ files: ['./packages/nodes-base/credentials/*.credentials.ts'],
'./packages/nodes-base/nodes/**/*.ts',
'./packages/nodes-base/credentials/*.credentials.ts',
],
plugins: ['eslint-plugin-n8n-nodes-base'], plugins: ['eslint-plugin-n8n-nodes-base'],
rules: { rules: {
'n8n-nodes-base/filesystem-wrong-cred-filename': 'error', 'n8n-nodes-base/cred-class-field-display-name-missing-oauth2': 'error',
'n8n-nodes-base/filesystem-wrong-node-filename': 'error', 'n8n-nodes-base/cred-class-field-name-missing-oauth2': 'error',
'n8n-nodes-base/cred-class-field-name-unsuffixed': 'error',
'n8n-nodes-base/cred-class-field-name-uppercase-first-char': 'error',
'n8n-nodes-base/cred-class-name-missing-oauth2-suffix': 'error',
'n8n-nodes-base/cred-class-name-unsuffixed': 'error',
'n8n-nodes-base/cred-filename-against-convention': 'error',
},
},
{
files: ['./packages/nodes-base/nodes/**/*.ts'],
plugins: ['eslint-plugin-n8n-nodes-base'],
rules: {
'n8n-nodes-base/node-class-description-credentials-name-unsuffixed': '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-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-name-unsuffixed-trigger-node': 'error',
'n8n-nodes-base/node-class-description-outputs-wrong': 'error', 'n8n-nodes-base/node-class-description-outputs-wrong': '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-filename-against-convention': 'error',
'n8n-nodes-base/node-param-array-type-assertion': 'error',
'n8n-nodes-base/node-param-collection-type-unsorted-items': 'error', 'n8n-nodes-base/node-param-collection-type-unsorted-items': 'error',
'n8n-nodes-base/node-param-color-type-unused': 'error',
'n8n-nodes-base/node-param-default-missing': 'error', 'n8n-nodes-base/node-param-default-missing': 'error',
'n8n-nodes-base/node-param-default-wrong-for-boolean': 'error', 'n8n-nodes-base/node-param-default-wrong-for-boolean': 'error',
'n8n-nodes-base/node-param-default-wrong-for-collection': 'error', 'n8n-nodes-base/node-param-default-wrong-for-collection': 'error',
@ -410,6 +427,7 @@ module.exports = {
'n8n-nodes-base/node-param-description-missing-for-ignore-ssl-issues': 'error', 'n8n-nodes-base/node-param-description-missing-for-ignore-ssl-issues': 'error',
'n8n-nodes-base/node-param-description-missing-for-return-all': 'error', 'n8n-nodes-base/node-param-description-missing-for-return-all': 'error',
'n8n-nodes-base/node-param-description-missing-for-simplify': 'error', 'n8n-nodes-base/node-param-description-missing-for-simplify': 'error',
'n8n-nodes-base/node-param-description-missing-from-dynamic-multi-options': 'error',
'n8n-nodes-base/node-param-description-missing-from-dynamic-options': 'error', 'n8n-nodes-base/node-param-description-missing-from-dynamic-options': 'error',
'n8n-nodes-base/node-param-description-missing-from-limit': 'error', 'n8n-nodes-base/node-param-description-missing-from-limit': 'error',
'n8n-nodes-base/node-param-description-unencoded-angle-brackets': 'error', 'n8n-nodes-base/node-param-description-unencoded-angle-brackets': 'error',
@ -448,7 +466,6 @@ module.exports = {
'n8n-nodes-base/node-param-resource-with-plural-option': 'error', 'n8n-nodes-base/node-param-resource-with-plural-option': 'error',
'n8n-nodes-base/node-param-resource-without-no-data-expression': 'error', 'n8n-nodes-base/node-param-resource-without-no-data-expression': 'error',
'n8n-nodes-base/node-param-type-options-missing-from-limit': 'error', 'n8n-nodes-base/node-param-type-options-missing-from-limit': 'error',
'n8n-nodes-base/node-class-description-inputs-wrong-regular-node': 'error',
}, },
}, },
], ],

31762
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -12,8 +12,11 @@ const scopes = [
'crm.schemas.deals.read', 'crm.schemas.deals.read',
]; ];
// eslint-disable-next-line n8n-nodes-base/cred-class-name-missing-oauth2-suffix
export class HubspotDeveloperApi implements ICredentialType { export class HubspotDeveloperApi implements ICredentialType {
// eslint-disable-next-line n8n-nodes-base/cred-class-field-name-missing-oauth2
name = 'hubspotDeveloperApi'; name = 'hubspotDeveloperApi';
// eslint-disable-next-line n8n-nodes-base/cred-class-field-display-name-missing-oauth2
displayName = 'HubSpot Developer API'; displayName = 'HubSpot Developer API';
documentationUrl = 'hubspot'; documentationUrl = 'hubspot';
extends = [ extends = [

View file

@ -50,6 +50,7 @@ export class ActiveCampaignTrigger implements INodeType {
displayName: 'Event Names or IDs', displayName: 'Event Names or IDs',
name: 'events', name: 'events',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getEvents', loadOptionsMethod: 'getEvents',
}, },

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -3,7 +3,7 @@ import {
} from 'n8n-workflow'; } from 'n8n-workflow';
export const createEmployeeSharedDescription = (sync = false): INodeProperties[] => { export const createEmployeeSharedDescription = (sync = false): INodeProperties[] => {
let elements = [ let elements: INodeProperties[] = [
{ {
displayName: 'Address', displayName: 'Address',
name: 'address', name: 'address',
@ -290,7 +290,7 @@ export const createEmployeeSharedDescription = (sync = false): INodeProperties[]
placeholder: '123-45-6789', placeholder: '123-45-6789',
description: 'A standard United States Social Security number, with dashes', description: 'A standard United States Social Security number, with dashes',
}, },
] as INodeProperties[]; ];
if (sync === true) { if (sync === true) {
elements = elements.map(element => { elements = elements.map(element => {

View file

@ -3,7 +3,7 @@ import {
} from 'n8n-workflow'; } from 'n8n-workflow';
export const updateEmployeeSharedDescription = (sync = false): INodeProperties[] => { export const updateEmployeeSharedDescription = (sync = false): INodeProperties[] => {
let elements = [ let elements: INodeProperties[] = [
{ {
displayName: 'Address', displayName: 'Address',
name: 'addasasress', name: 'addasasress',
@ -316,7 +316,7 @@ export const updateEmployeeSharedDescription = (sync = false): INodeProperties[]
placeholder: '123-45-6789', placeholder: '123-45-6789',
description: 'A standard United States Social Security number, with dashes', description: 'A standard United States Social Security number, with dashes',
}, },
] as INodeProperties[]; ];
if (sync === true) { if (sync === true) {
elements = elements.map(element => { elements = elements.map(element => {

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';

View file

@ -94,6 +94,7 @@ export const linkFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',
@ -226,6 +227,7 @@ export const linkFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',

View file

@ -243,6 +243,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs', displayName: 'Assignee Names or IDs',
name: 'assignees', name: 'assignees',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getAssignees', loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: [ loadOptionsDependsOn: [
@ -731,6 +732,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs', displayName: 'Assignee Names or IDs',
name: 'assignees', name: 'assignees',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getAssignees', loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: [ loadOptionsDependsOn: [
@ -903,6 +905,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Status Names or IDs', displayName: 'Status Names or IDs',
name: 'statuses', name: 'statuses',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getStatuses', loadOptionsMethod: 'getStatuses',
loadOptionsDependsOn: [ loadOptionsDependsOn: [

View file

@ -468,6 +468,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'team', 'team',
@ -860,6 +861,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'spaceId', 'spaceId',

View file

@ -237,6 +237,7 @@ export const timeEntryTagFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tagNames', name: 'tagNames',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTimeEntryTags', loadOptionsMethod: 'getTimeEntryTags',
loadOptionsDependsOn: [ loadOptionsDependsOn: [

View file

@ -283,6 +283,7 @@ export const projectFields: INodeProperties[] = [
displayName: 'Client Names or IDs', displayName: 'Client Names or IDs',
name: 'clients', name: 'clients',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'workspaceId', 'workspaceId',

View file

@ -111,6 +111,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs', displayName: 'Assignee Names or IDs',
name: 'assigneeIds', name: 'assigneeIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'loadUsersForWorkspace', loadOptionsMethod: 'loadUsersForWorkspace',
@ -319,6 +320,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs', displayName: 'Assignee Names or IDs',
name: 'assigneeIds', name: 'assigneeIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'loadUsersForWorkspace', loadOptionsMethod: 'loadUsersForWorkspace',

View file

@ -158,6 +158,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tagIds', name: 'tagIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'workspaceId', 'workspaceId',
@ -369,6 +370,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tagIds', name: 'tagIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'workspaceId', 'workspaceId',

View file

@ -93,6 +93,7 @@ export const userFields: INodeProperties[] = [
displayName: 'Email', displayName: 'Email',
name: 'email', name: 'email',
type: 'string', type: 'string',
placeholder: 'name@email.com',
default: '', default: '',
description: 'If provided, you\'ll get a filtered list of users that contain the provided string in their email address', description: 'If provided, you\'ll get a filtered list of users that contain the provided string in their email address',
}, },

View file

@ -481,8 +481,8 @@ export class DateTime implements INodeType {
const dataPropertyName = this.getNodeParameter('dataPropertyName', i) as string; const dataPropertyName = this.getNodeParameter('dataPropertyName', i) as string;
const newDate = fromFormat const newDate = fromFormat
? parseDateByFormat(dateValue, fromFormat) ? parseDateByFormat.call(this, dateValue, fromFormat)
: parseDateByDefault(dateValue); : parseDateByDefault.call(this, dateValue);
operation === 'add' operation === 'add'
? newDate.add(duration, timeUnit).utc().format() ? newDate.add(duration, timeUnit).utc().format()
@ -536,24 +536,24 @@ export class DateTime implements INodeType {
} }
} }
function parseDateByFormat(value: string, fromFormat: string) { function parseDateByFormat(this: IExecuteFunctions, value: string, fromFormat: string) {
const date = moment(value, fromFormat, true); const date = moment(value, fromFormat, true);
if (moment(date).isValid()) return date; if (moment(date).isValid()) return date;
throw new Error('Date input cannot be parsed. Please recheck the value and the "From Format" field.'); throw new NodeOperationError(this.getNode(), 'Date input cannot be parsed. Please recheck the value and the "From Format" field.');
} }
function parseDateByDefault(value: string) { function parseDateByDefault(this: IExecuteFunctions, value: string) {
const isoValue = getIsoValue(value); const isoValue = getIsoValue.call(this, value);
if (moment(isoValue).isValid()) return moment(isoValue); if (moment(isoValue).isValid()) return moment(isoValue);
throw new Error('Unrecognized date input. Please specify a format in the "From Format" field.'); throw new NodeOperationError(this.getNode(), 'Unrecognized date input. Please specify a format in the "From Format" field.');
} }
function getIsoValue(value: string) { function getIsoValue(this: IExecuteFunctions, value: string) {
try { try {
return new Date(value).toISOString(); // may throw due to unpredictable input return new Date(value).toISOString(); // may throw due to unpredictable input
} catch (error) { } catch (error) {
throw new Error('Unrecognized date input. Please specify a format in the "From Format" field.'); throw new NodeOperationError(this.getNode(), 'Unrecognized date input. Please specify a format in the "From Format" field.');
} }
} }

View file

@ -4,6 +4,8 @@ import {
INodeExecutionData, INodeExecutionData,
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
NodeApiError,
NodeOperationError,
} from 'n8n-workflow'; } from 'n8n-workflow';
@ -122,7 +124,7 @@ export class Discord implements INodeType {
const webhookUri = this.getNodeParameter('webhookUri', 0, '') as string; const webhookUri = this.getNodeParameter('webhookUri', 0, '') as string;
if (!webhookUri) throw Error('Webhook uri is required.'); if (!webhookUri) throw new NodeOperationError(this.getNode(), 'Webhook uri is required.');
const items = this.getInputData(); const items = this.getInputData();
const length = items.length as number; const length = items.length as number;
@ -134,17 +136,17 @@ export class Discord implements INodeType {
const options = this.getNodeParameter('options', i) as IDataObject; const options = this.getNodeParameter('options', i) as IDataObject;
if (!body.content && !options.embeds) { if (!body.content && !options.embeds) {
throw new Error('Either content or embeds must be set.'); throw new NodeOperationError(this.getNode(), 'Either content or embeds must be set.');
} }
if (options.embeds) { if (options.embeds) {
try { try {
//@ts-expect-error //@ts-expect-error
body.embeds = JSON.parse(options.embeds); body.embeds = JSON.parse(options.embeds);
if (!Array.isArray(body.embeds)) { if (!Array.isArray(body.embeds)) {
throw new Error('Embeds must be an array of embeds.'); throw new NodeOperationError(this.getNode(), 'Embeds must be an array of embeds.');
} }
} catch (e) { } catch (e) {
throw new Error('Embeds must be valid JSON.'); throw new NodeOperationError(this.getNode(), 'Embeds must be valid JSON.');
} }
} }
if (options.username) { if (options.username) {
@ -156,7 +158,7 @@ export class Discord implements INodeType {
//@ts-expect-error //@ts-expect-error
body.components = JSON.parse(options.components); body.components = JSON.parse(options.components);
} catch (e) { } catch (e) {
throw new Error('Components must be valid JSON.'); throw new NodeOperationError(this.getNode(), 'Components must be valid JSON.');
} }
} }
@ -259,8 +261,9 @@ export class Discord implements INodeType {
} while (--maxTries); } while (--maxTries);
if (maxTries <= 0) { if (maxTries <= 0) {
throw new Error( throw new NodeApiError(
'Could not send Webhook message. Max amount of rate-limit retries reached.', this.getNode(),
{ error: 'Could not send Webhook message. Max amount of rate-limit retries reached.' },
); );
} }

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -507,6 +507,7 @@ export const caseFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',

View file

@ -24,6 +24,7 @@ import {
export class FigmaTrigger implements INodeType { export class FigmaTrigger implements INodeType {
description: INodeTypeDescription = { description: INodeTypeDescription = {
// eslint-disable-next-line n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node
displayName: 'Figma Trigger (Beta)', displayName: 'Figma Trigger (Beta)',
name: 'figmaTrigger', name: 'figmaTrigger',
icon: 'file:figma.svg', icon: 'file:figma.svg',

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import {IExecuteFunctions} from 'n8n-core'; import {IExecuteFunctions} from 'n8n-core';
import { import {
ILoadOptionsFunctions, ILoadOptionsFunctions,

View file

@ -179,6 +179,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',
}, },
@ -640,6 +641,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',
}, },

View file

@ -120,6 +120,7 @@ export class GetResponseTrigger implements INodeType {
displayName: 'List Names or IDs', displayName: 'List Names or IDs',
name: 'listIds', name: 'listIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getLists', loadOptionsMethod: 'getLists',
}, },

View file

@ -207,6 +207,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Author Names or IDs', displayName: 'Author Names or IDs',
name: 'authors', name: 'authors',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getAuthors', loadOptionsMethod: 'getAuthors',
}, },
@ -306,6 +307,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',
}, },
@ -773,6 +775,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Author Names or IDs', displayName: 'Author Names or IDs',
name: 'authors', name: 'authors',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getAuthors', loadOptionsMethod: 'getAuthors',
}, },
@ -899,6 +902,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',
}, },

View file

@ -344,6 +344,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Group Names or IDs', displayName: 'Group Names or IDs',
name: 'group', name: 'group',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getGroups', loadOptionsMethod: 'getGroups',
}, },
@ -1409,6 +1410,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Group Names or IDs', displayName: 'Group Names or IDs',
name: 'group', name: 'group',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getGroups', loadOptionsMethod: 'getGroups',
}, },

View file

@ -438,6 +438,7 @@ export const channelFields: INodeProperties[] = [
{ {
displayName: 'Profile Color', displayName: 'Profile Color',
name: 'profileColor', name: 'profileColor',
// eslint-disable-next-line n8n-nodes-base/node-param-color-type-unused
type: 'string', type: 'string',
default: '', default: '',
description: 'A prominent color that complements the channel\'s content', description: 'A prominent color that complements the channel\'s content',

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { IExecuteFunctions } from 'n8n-core'; import { IExecuteFunctions } from 'n8n-core';
import { import {
IDataObject, IDataObject,

View file

@ -115,6 +115,7 @@ export const dealFields: INodeProperties[] = [
displayName: 'Associated Company Names or IDs', displayName: 'Associated Company Names or IDs',
name: 'associatedCompany', name: 'associatedCompany',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getCompanies', loadOptionsMethod: 'getCompanies',
}, },
@ -124,6 +125,7 @@ export const dealFields: INodeProperties[] = [
displayName: 'Associated Vid Names or IDs', displayName: 'Associated Vid Names or IDs',
name: 'associatedVids', name: 'associatedVids',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getContacts', loadOptionsMethod: 'getContacts',
}, },

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -91,7 +91,7 @@ export class Interval implements INodeType {
// Reference: https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_args // Reference: https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_args
if (intervalValue > 2147483647) { if (intervalValue > 2147483647) {
throw new Error('The interval value is too large.'); throw new NodeOperationError(this.getNode(), 'The interval value is too large.');
} }
const intervalObj = setInterval(executeTrigger, intervalValue); const intervalObj = setInterval(executeTrigger, intervalValue);

View file

@ -168,6 +168,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Component Names or IDs', displayName: 'Component Names or IDs',
name: 'componentIds', name: 'componentIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getProjectComponents', loadOptionsMethod: 'getProjectComponents',
loadOptionsDependsOn: [ loadOptionsDependsOn: [
@ -218,6 +219,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Label Names or IDs', displayName: 'Label Names or IDs',
name: 'labels', name: 'labels',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getLabels', loadOptionsMethod: 'getLabels',
}, },
@ -384,6 +386,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Label Names or IDs', displayName: 'Label Names or IDs',
name: 'labels', name: 'labels',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getLabels', loadOptionsMethod: 'getLabels',
}, },

View file

@ -62,6 +62,7 @@ export const contactTagFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tagIds', name: 'tagIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',
}, },

View file

@ -7,7 +7,8 @@ import {
ILoadOptionsFunctions, ILoadOptionsFunctions,
INodeExecutionData, INodeExecutionData,
INodeType, INodeType,
INodeTypeDescription INodeTypeDescription,
NodeOperationError
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
@ -120,7 +121,7 @@ export class Kitemaker implements INodeType {
async getStatuses(this: ILoadOptionsFunctions) { async getStatuses(this: ILoadOptionsFunctions) {
const spaceId = this.getNodeParameter('spaceId', 0) as string; const spaceId = this.getNodeParameter('spaceId', 0) as string;
if (!spaceId.length) { if (!spaceId.length) {
throw new Error('Please choose a space to set for the work item to create.'); throw new NodeOperationError(this.getNode(), 'Please choose a space to set for the work item to create.');
} }
const responseData = await kitemakerRequest.call(this, { query: getStatuses }); const responseData = await kitemakerRequest.call(this, { query: getStatuses });
@ -246,7 +247,7 @@ export class Kitemaker implements INodeType {
}; };
if (!input.statusId.length) { if (!input.statusId.length) {
throw new Error('Please enter a status to set for the work item to create.'); throw new NodeOperationError(this.getNode(), 'Please enter a status to set for the work item to create.');
} }
const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject;
@ -305,7 +306,7 @@ export class Kitemaker implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; const updateFields = this.getNodeParameter('updateFields', i) as IDataObject;
if (!Object.keys(updateFields).length) { if (!Object.keys(updateFields).length) {
throw new Error('Please enter at least one field to update for the work item.'); throw new NodeOperationError(this.getNode(), 'Please enter at least one field to update for the work item.');
} }
Object.assign(input, updateFields); Object.assign(input, updateFields);

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
INodeProperties, INodeProperties,
INodeTypeDescription, INodeTypeDescription,

View file

@ -432,6 +432,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getTags', loadOptionsMethod: 'getTags',
}, },
@ -922,6 +923,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
displayOptions: { displayOptions: {
show: { show: {
'/jsonParameters': [ '/jsonParameters': [

View file

@ -86,6 +86,7 @@ export class MauticTrigger implements INodeType {
displayName: 'Event Names or IDs', displayName: 'Event Names or IDs',
name: 'events', name: 'events',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
required: true, required: true,
typeOptions: { typeOptions: {
loadOptionsMethod: 'getEvents', loadOptionsMethod: 'getEvents',

View file

@ -175,6 +175,7 @@ export const accountFields: INodeProperties[] = [
displayName: 'Return Field Names or IDs', displayName: 'Return Field Names or IDs',
name: 'returnFields', name: 'returnFields',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getAccountFields', loadOptionsMethod: 'getAccountFields',
}, },
@ -184,6 +185,7 @@ export const accountFields: INodeProperties[] = [
displayName: 'Expand Field Names or IDs', displayName: 'Expand Field Names or IDs',
name: 'expandFields', name: 'expandFields',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getExpandableAccountFields', loadOptionsMethod: 'getExpandableAccountFields',
}, },

View file

@ -174,6 +174,7 @@ export const draftFields: INodeProperties[] = [
displayName: 'Category Names or IDs', displayName: 'Category Names or IDs',
name: 'categories', name: 'categories',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getCategories', loadOptionsMethod: 'getCategories',
}, },

View file

@ -103,6 +103,7 @@ export const draftMessageSharedFields: INodeProperties[] = [
displayName: 'Category Names or IDs', displayName: 'Category Names or IDs',
name: 'categories', name: 'categories',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getCategories', loadOptionsMethod: 'getCategories',
}, },

View file

@ -493,6 +493,7 @@ export const messageFields: INodeProperties[] = [
displayName: 'Category Names or IDs', displayName: 'Category Names or IDs',
name: 'categories', name: 'categories',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getCategories', loadOptionsMethod: 'getCategories',
}, },

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -6,7 +6,7 @@ import {
blocks, blocks,
} from './Blocks'; } from './Blocks';
export const blockOperations = [ export const blockOperations: INodeProperties[] = [
{ {
displayName: 'Operation', displayName: 'Operation',
name: 'operation', name: 'operation',
@ -34,7 +34,7 @@ export const blockOperations = [
], ],
default: 'append', default: 'append',
}, },
] as INodeProperties[]; ];
export const blockFields = [ export const blockFields = [

View file

@ -2,7 +2,7 @@ import {
INodeProperties, INodeProperties,
} from 'n8n-workflow'; } from 'n8n-workflow';
export const databaseOperations = [ export const databaseOperations: INodeProperties[] = [
{ {
displayName: 'Operation', displayName: 'Operation',
name: 'operation', name: 'operation',
@ -66,9 +66,9 @@ export const databaseOperations = [
], ],
default: 'get', default: 'get',
}, },
] as INodeProperties[]; ];
export const databaseFields = [ export const databaseFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* database:get */ /* database:get */
@ -301,4 +301,4 @@ export const databaseFields = [
}, },
], ],
}, },
] as INodeProperties[]; ];

View file

@ -16,7 +16,7 @@ import {
filters, filters,
} from './Filters'; } from './Filters';
export const databasePageOperations = [ export const databasePageOperations: INodeProperties[] = [
{ {
displayName: 'Operation', displayName: 'Operation',
name: 'operation', name: 'operation',
@ -90,7 +90,7 @@ export const databasePageOperations = [
], ],
default: 'create', default: 'create',
}, },
] as INodeProperties[]; ];
export const databasePageFields = [ export const databasePageFields = [
@ -682,6 +682,7 @@ export const databasePageFields = [
displayName: 'Option Names or IDs', displayName: 'Option Names or IDs',
name: 'multiSelectValue', name: 'multiSelectValue',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getDatabaseOptionsFromPage', loadOptionsMethod: 'getDatabaseOptionsFromPage',
}, },

View file

@ -20,6 +20,7 @@ import moment from 'moment';
export class NotionTrigger implements INodeType { export class NotionTrigger implements INodeType {
description: INodeTypeDescription = { description: INodeTypeDescription = {
// eslint-disable-next-line n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node
displayName: 'Notion Trigger (Beta)', displayName: 'Notion Trigger (Beta)',
name: 'notionTrigger', name: 'notionTrigger',
icon: 'file:notion.svg', icon: 'file:notion.svg',

View file

@ -6,7 +6,7 @@ import {
blocks, blocks,
} from './Blocks'; } from './Blocks';
export const pageOperations = [ export const pageOperations: INodeProperties[] = [
{ {
displayName: 'Operation', displayName: 'Operation',
name: 'operation', name: 'operation',
@ -75,7 +75,7 @@ export const pageOperations = [
], ],
default: 'create', default: 'create',
}, },
] as INodeProperties[]; ];
export const pageFields = [ export const pageFields = [

View file

@ -2,7 +2,7 @@ import {
INodeProperties, INodeProperties,
} from 'n8n-workflow'; } from 'n8n-workflow';
export const userOperations = [ export const userOperations: INodeProperties[] = [
{ {
displayName: 'Operation', displayName: 'Operation',
name: 'operation', name: 'operation',
@ -29,9 +29,9 @@ export const userOperations = [
], ],
default: 'get', default: 'get',
}, },
] as INodeProperties[]; ];
export const userFields = [ export const userFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* user:get */ /* user:get */
@ -97,4 +97,4 @@ export const userFields = [
default: 50, default: 50,
description: 'Max number of results to return', description: 'Max number of results to return',
}, },
] as INodeProperties[]; ];

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
databaseFields, databaseFields,
databaseOperations, databaseOperations,

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
databaseFields, databaseFields,
databaseOperations, databaseOperations,

View file

@ -283,6 +283,7 @@ export const contactDescription: INodeProperties[] = [
displayName: 'Fields to Include', displayName: 'Fields to Include',
name: 'fieldsList', name: 'fieldsList',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'getModelFields', loadOptionsMethod: 'getModelFields',

View file

@ -202,6 +202,7 @@ export const customResourceDescription: INodeProperties[] = [
displayName: 'Fields to Include', displayName: 'Fields to Include',
name: 'fieldsList', name: 'fieldsList',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'getModelFields', loadOptionsMethod: 'getModelFields',

View file

@ -183,6 +183,7 @@ export const noteDescription: INodeProperties[] = [
displayName: 'Fields to Include', displayName: 'Fields to Include',
name: 'fieldsList', name: 'fieldsList',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'getModelFields', loadOptionsMethod: 'getModelFields',

View file

@ -238,6 +238,7 @@ export const opportunityDescription: INodeProperties[] = [
displayName: 'Fields to Include', displayName: 'Fields to Include',
name: 'fieldsList', name: 'fieldsList',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
default: [], default: [],
typeOptions: { typeOptions: {
loadOptionsMethod: 'getModelFields', loadOptionsMethod: 'getModelFields',

View file

@ -139,6 +139,7 @@ const vehicleLicensePlateField = {
const vehicleColorField = { const vehicleColorField = {
displayName: 'Color', displayName: 'Color',
name: 'color', name: 'color',
// eslint-disable-next-line n8n-nodes-base/node-param-color-type-unused
type: 'string', type: 'string',
default: '', default: '',
description: 'The vehicle\'s color', description: 'The vehicle\'s color',

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
createDeferredPromise, createDeferredPromise,
IDataObject, IDataObject,
@ -10,6 +10,7 @@ import {
ITriggerFunctions, ITriggerFunctions,
ITriggerResponse, ITriggerResponse,
LoggerProxy as Logger, LoggerProxy as Logger,
NodeOperationError,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
@ -156,7 +157,7 @@ export class RabbitMQTrigger implements INodeType {
let parallelMessages = (options.parallelMessages !== undefined && options.parallelMessages !== -1) ? parseInt(options.parallelMessages as string, 10) : -1; let parallelMessages = (options.parallelMessages !== undefined && options.parallelMessages !== -1) ? parseInt(options.parallelMessages as string, 10) : -1;
if (parallelMessages === 0 || parallelMessages < -1) { if (parallelMessages === 0 || parallelMessages < -1) {
throw new Error('Parallel message processing limit must be greater than zero (or -1 for no limit)'); throw new NodeOperationError(this.getNode(), 'Parallel message processing limit must be greater than zero (or -1 for no limit)');
} }
if (this.getMode() === 'manual') { if (this.getMode() === 'manual') {

View file

@ -8,6 +8,7 @@ import {
INodeExecutionData, INodeExecutionData,
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
NodeOperationError,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
@ -384,7 +385,7 @@ export class Ssh implements INodeType {
const item = items[i]; const item = items[i];
if (item.binary === undefined) { if (item.binary === undefined) {
throw new Error('No binary data exists on item!'); throw new NodeOperationError(this.getNode(), 'No binary data exists on item!');
} }
const propertyNameUpload = this.getNodeParameter('binaryPropertyName', i) as string; const propertyNameUpload = this.getNodeParameter('binaryPropertyName', i) as string;
@ -392,7 +393,7 @@ export class Ssh implements INodeType {
const binaryData = item.binary[propertyNameUpload] as IBinaryData; const binaryData = item.binary[propertyNameUpload] as IBinaryData;
if (item.binary[propertyNameUpload] === undefined) { if (item.binary[propertyNameUpload] === undefined) {
throw new Error(`No binary data property "${propertyNameUpload}" does not exists on item!`); throw new NodeOperationError(this.getNode(), `No binary data property "${propertyNameUpload}" does not exists on item!`);
} }
const dataBuffer = await this.helpers.getBinaryDataBuffer(i, propertyNameUpload); const dataBuffer = await this.helpers.getBinaryDataBuffer(i, propertyNameUpload);

View file

@ -9,6 +9,7 @@ import {
INodePropertyOptions, INodePropertyOptions,
INodeType, INodeType,
INodeTypeDescription, INodeTypeDescription,
NodeOperationError,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import {
@ -267,7 +268,7 @@ export class Stripe implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; const updateFields = this.getNodeParameter('updateFields', i) as IDataObject;
if (isEmpty(updateFields)) { if (isEmpty(updateFields)) {
throw new Error(`Please enter at least one field to update for the ${resource}.`); throw new NodeOperationError(this.getNode(), `Please enter at least one field to update for the ${resource}.`);
} }
Object.assign(body, adjustChargeFields(updateFields)); Object.assign(body, adjustChargeFields(updateFields));
@ -386,7 +387,7 @@ export class Stripe implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; const updateFields = this.getNodeParameter('updateFields', i) as IDataObject;
if (isEmpty(updateFields)) { if (isEmpty(updateFields)) {
throw new Error(`Please enter at least one field to update for the ${resource}.`); throw new NodeOperationError(this.getNode(), `Please enter at least one field to update for the ${resource}.`);
} }
Object.assign(body, adjustCustomerFields(updateFields)); Object.assign(body, adjustCustomerFields(updateFields));
@ -470,7 +471,7 @@ export class Stripe implements INodeType {
const body = {} as IDataObject; const body = {} as IDataObject;
if (type !== 'cardToken') { if (type !== 'cardToken') {
throw new Error('Only card token creation implemented.'); throw new NodeOperationError(this.getNode(), 'Only card token creation implemented.');
} }
body.card = { body.card = {

View file

@ -254,6 +254,7 @@ export class SurveyMonkeyTrigger implements INodeType {
displayName: 'Survey Names or IDs', displayName: 'Survey Names or IDs',
name: 'surveyIds', name: 'surveyIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
displayOptions: { displayOptions: {
show: { show: {
objectType: [ objectType: [
@ -295,6 +296,7 @@ export class SurveyMonkeyTrigger implements INodeType {
displayName: 'Collector Names or IDs', displayName: 'Collector Names or IDs',
name: 'collectorIds', name: 'collectorIds',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
displayOptions: { displayOptions: {
show: { show: {
objectType: [ objectType: [

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
INodeTypeDescription, INodeTypeDescription,
} from 'n8n-workflow'; } from 'n8n-workflow';

View file

@ -149,6 +149,7 @@ export const epicFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',
@ -416,6 +417,7 @@ export const epicFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',

View file

@ -195,6 +195,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',
@ -471,6 +472,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',
@ -648,6 +650,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',

View file

@ -168,6 +168,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',
@ -413,6 +414,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',
@ -587,6 +589,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',

View file

@ -198,6 +198,7 @@ export const userStoryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',
@ -430,6 +431,7 @@ export const userStoryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',
@ -598,6 +600,7 @@ export const userStoryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs', displayName: 'Tag Names or IDs',
name: 'tags', name: 'tags',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsDependsOn: [ loadOptionsDependsOn: [
'projectId', 'projectId',

View file

@ -322,6 +322,7 @@ export const observableFields: INodeProperties[] = [
displayName: 'Analyzer Names or IDs', displayName: 'Analyzer Names or IDs',
name: 'analyzers', name: 'analyzers',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
required: true, required: true,
default: [], default: [],
typeOptions: { typeOptions: {

View file

@ -561,6 +561,7 @@ export class Todoist implements INodeType {
displayName: 'Label Names or IDs', displayName: 'Label Names or IDs',
name: 'labels', name: 'labels',
type: 'multiOptions', type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions">expression</a>',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getLabels', loadOptionsMethod: 'getLabels',
}, },

View file

@ -199,7 +199,7 @@ export const commentFields: INodeProperties[] = [
description: 'Name of the property that holds the binary data. Multiple can be defined separated by comma.', description: 'Name of the property that holds the binary data. Multiple can be defined separated by comma.',
}, },
{ {
displayName: 'Direct Mentions Name or ID', displayName: 'Direct Mention Names or IDs',
name: 'direct_mentions', name: 'direct_mentions',
type: 'multiOptions', type: 'multiOptions',
typeOptions: { typeOptions: {

View file

@ -274,7 +274,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData; const binaryData = item[binaryProperty] as IBinaryData;
if (binaryData === undefined) { if (binaryData === undefined) {
throw new Error(`No binary data property "${binaryProperty}" does not exists on item!`); throw new NodeOperationError(this.getNode(), `No binary data property "${binaryProperty}" does not exists on item!`);
} }
const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty);
@ -378,7 +378,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData; const binaryData = item[binaryProperty] as IBinaryData;
if (binaryData === undefined) { if (binaryData === undefined) {
throw new Error(`No binary data property "${binaryProperty}" does not exists on item!`); throw new NodeOperationError(this.getNode(), `No binary data property "${binaryProperty}" does not exists on item!`);
} }
const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty);
@ -549,7 +549,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData; const binaryData = item[binaryProperty] as IBinaryData;
if (binaryData === undefined) { if (binaryData === undefined) {
throw new Error(`No binary data property "${binaryProperty}" does not exists on item!`); throw new NodeOperationError(this.getNode(), `No binary data property "${binaryProperty}" does not exists on item!`);
} }
const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty);
@ -623,7 +623,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData; const binaryData = item[binaryProperty] as IBinaryData;
if (binaryData === undefined) { if (binaryData === undefined) {
throw new Error(`No binary data property "${binaryProperty}" does not exists on item!`); throw new NodeOperationError(this.getNode(), `No binary data property "${binaryProperty}" does not exists on item!`);
} }
const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty);
@ -726,7 +726,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData; const binaryData = item[binaryProperty] as IBinaryData;
if (binaryData === undefined) { if (binaryData === undefined) {
throw new Error(`No binary data property "${binaryProperty}" does not exists on item!`); throw new NodeOperationError(this.getNode(), `No binary data property "${binaryProperty}" does not exists on item!`);
} }
const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty);

View file

@ -1,4 +1,4 @@
/* eslint-disable n8n-nodes-base/filesystem-wrong-node-filename */ /* eslint-disable n8n-nodes-base/node-filename-against-convention */
import { import {
IExecuteFunctions, IExecuteFunctions,
} from 'n8n-core'; } from 'n8n-core';

View file

@ -19,10 +19,8 @@
"build": "tsc && gulp build:icons && gulp build:translations", "build": "tsc && gulp build:icons && gulp build:translations",
"build:translations": "gulp build:translations", "build:translations": "gulp build:translations",
"format": "cd ../.. && node_modules/prettier/bin-prettier.js packages/nodes-base/**/**.ts --write", "format": "cd ../.. && node_modules/prettier/bin-prettier.js packages/nodes-base/**/**.ts --write",
"lint": "tslint -p tsconfig.json -c tslint.json", "lint": "tslint -p tsconfig.json -c tslint.json; cd ../../ && node_modules/eslint/bin/eslint.js packages/nodes-base/nodes packages/nodes-base/credentials",
"lintfix": "tslint --fix -p tsconfig.json -c tslint.json", "lintfix": "tslint --fix -p tsconfig.json -c tslint.json; cd ../.. && node_modules/eslint/bin/eslint.js packages/nodes-base/nodes packages/nodes-base/credentials --fix",
"lintfix:plugin": "cd ../.. && node_modules/eslint/bin/eslint.js packages/nodes-base/nodes --fix",
"nodelinter": "nodelinter",
"watch": "tsc --watch", "watch": "tsc --watch",
"test": "jest" "test": "jest"
}, },
@ -715,11 +713,10 @@
"@types/tmp": "^0.2.0", "@types/tmp": "^0.2.0",
"@types/uuid": "^8.3.2", "@types/uuid": "^8.3.2",
"@types/xml2js": "^0.4.3", "@types/xml2js": "^0.4.3",
"eslint-plugin-n8n-nodes-base": "^1.0.38", "eslint-plugin-n8n-nodes-base": "^1.2.8",
"gulp": "^4.0.0", "gulp": "^4.0.0",
"jest": "^27.4.7", "jest": "^27.4.7",
"n8n-workflow": "~0.106.0", "n8n-workflow": "~0.106.0",
"nodelinter": "^0.1.9",
"ts-jest": "^27.1.3", "ts-jest": "^27.1.3",
"tslint": "^6.1.2", "tslint": "^6.1.2",
"typescript": "~4.6.0" "typescript": "~4.6.0"