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: [
'./packages/nodes-base/nodes/**/*.ts',
'./packages/nodes-base/credentials/*.credentials.ts',
],
files: ['./packages/nodes-base/credentials/*.credentials.ts'],
plugins: ['eslint-plugin-n8n-nodes-base'],
rules: {
'n8n-nodes-base/filesystem-wrong-cred-filename': 'error',
'n8n-nodes-base/filesystem-wrong-node-filename': 'error',
'n8n-nodes-base/cred-class-field-display-name-missing-oauth2': '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-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-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-dirname-against-convention': '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-color-type-unused': '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-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-return-all': '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-limit': '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-without-no-data-expression': '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',
];
// eslint-disable-next-line n8n-nodes-base/cred-class-name-missing-oauth2-suffix
export class HubspotDeveloperApi implements ICredentialType {
// eslint-disable-next-line n8n-nodes-base/cred-class-field-name-missing-oauth2
name = 'hubspotDeveloperApi';
// eslint-disable-next-line n8n-nodes-base/cred-class-field-display-name-missing-oauth2
displayName = 'HubSpot Developer API';
documentationUrl = 'hubspot';
extends = [

View file

@ -50,6 +50,7 @@ export class ActiveCampaignTrigger implements INodeType {
displayName: 'Event Names or IDs',
name: 'events',
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: {
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 {
IExecuteFunctions,
} from 'n8n-core';

View file

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

View file

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

View file

@ -94,6 +94,7 @@ export const linkFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: [],
typeOptions: {
loadOptionsMethod: 'getTags',
@ -226,6 +227,7 @@ export const linkFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: [],
typeOptions: {
loadOptionsMethod: 'getTags',

View file

@ -243,6 +243,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs',
name: 'assignees',
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: {
loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: [
@ -731,6 +732,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs',
name: 'assignees',
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: {
loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: [
@ -903,6 +905,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Status Names or IDs',
name: 'statuses',
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: {
loadOptionsMethod: 'getStatuses',
loadOptionsDependsOn: [

View file

@ -468,6 +468,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'team',
@ -860,6 +861,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'spaceId',

View file

@ -237,6 +237,7 @@ export const timeEntryTagFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tagNames',
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: {
loadOptionsMethod: 'getTimeEntryTags',
loadOptionsDependsOn: [

View file

@ -283,6 +283,7 @@ export const projectFields: INodeProperties[] = [
displayName: 'Client Names or IDs',
name: 'clients',
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: {
loadOptionsDependsOn: [
'workspaceId',

View file

@ -111,6 +111,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs',
name: 'assigneeIds',
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: [],
typeOptions: {
loadOptionsMethod: 'loadUsersForWorkspace',
@ -319,6 +320,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Assignee Names or IDs',
name: 'assigneeIds',
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: [],
typeOptions: {
loadOptionsMethod: 'loadUsersForWorkspace',

View file

@ -158,6 +158,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tagIds',
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: {
loadOptionsDependsOn: [
'workspaceId',
@ -369,6 +370,7 @@ export const timeEntryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tagIds',
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: {
loadOptionsDependsOn: [
'workspaceId',

View file

@ -93,6 +93,7 @@ export const userFields: INodeProperties[] = [
displayName: 'Email',
name: 'email',
type: 'string',
placeholder: 'name@email.com',
default: '',
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 newDate = fromFormat
? parseDateByFormat(dateValue, fromFormat)
: parseDateByDefault(dateValue);
? parseDateByFormat.call(this, dateValue, fromFormat)
: parseDateByDefault.call(this, dateValue);
operation === 'add'
? 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);
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) {
const isoValue = getIsoValue(value);
function parseDateByDefault(this: IExecuteFunctions, value: string) {
const isoValue = getIsoValue.call(this, value);
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 {
return new Date(value).toISOString(); // may throw due to unpredictable input
} 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,
INodeType,
INodeTypeDescription,
NodeApiError,
NodeOperationError,
} from 'n8n-workflow';
@ -122,7 +124,7 @@ export class Discord implements INodeType {
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 length = items.length as number;
@ -134,17 +136,17 @@ export class Discord implements INodeType {
const options = this.getNodeParameter('options', i) as IDataObject;
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) {
try {
//@ts-expect-error
body.embeds = JSON.parse(options.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) {
throw new Error('Embeds must be valid JSON.');
throw new NodeOperationError(this.getNode(), 'Embeds must be valid JSON.');
}
}
if (options.username) {
@ -156,7 +158,7 @@ export class Discord implements INodeType {
//@ts-expect-error
body.components = JSON.parse(options.components);
} 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);
if (maxTries <= 0) {
throw new Error(
'Could not send Webhook message. Max amount of rate-limit retries reached.',
throw new NodeApiError(
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 {
IExecuteFunctions,
} from 'n8n-core';

View file

@ -507,6 +507,7 @@ export const caseFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: [],
typeOptions: {
loadOptionsMethod: 'getTags',

View file

@ -24,6 +24,7 @@ import {
export class FigmaTrigger implements INodeType {
description: INodeTypeDescription = {
// eslint-disable-next-line n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node
displayName: 'Figma Trigger (Beta)',
name: 'figmaTrigger',
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 {
ILoadOptionsFunctions,

View file

@ -179,6 +179,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsMethod: 'getTags',
},
@ -640,6 +641,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsMethod: 'getTags',
},

View file

@ -120,6 +120,7 @@ export class GetResponseTrigger implements INodeType {
displayName: 'List Names or IDs',
name: 'listIds',
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: {
loadOptionsMethod: 'getLists',
},

View file

@ -207,6 +207,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Author Names or IDs',
name: 'authors',
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: {
loadOptionsMethod: 'getAuthors',
},
@ -306,6 +307,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsMethod: 'getTags',
},
@ -773,6 +775,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Author Names or IDs',
name: 'authors',
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: {
loadOptionsMethod: 'getAuthors',
},
@ -899,6 +902,7 @@ export const postFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsMethod: 'getTags',
},

View file

@ -344,6 +344,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Group Names or IDs',
name: 'group',
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: {
loadOptionsMethod: 'getGroups',
},
@ -1409,6 +1410,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Group Names or IDs',
name: 'group',
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: {
loadOptionsMethod: 'getGroups',
},

View file

@ -438,6 +438,7 @@ export const channelFields: INodeProperties[] = [
{
displayName: 'Profile Color',
name: 'profileColor',
// eslint-disable-next-line n8n-nodes-base/node-param-color-type-unused
type: 'string',
default: '',
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 {
IDataObject,

View file

@ -115,6 +115,7 @@ export const dealFields: INodeProperties[] = [
displayName: 'Associated Company Names or IDs',
name: 'associatedCompany',
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: {
loadOptionsMethod: 'getCompanies',
},
@ -124,6 +125,7 @@ export const dealFields: INodeProperties[] = [
displayName: 'Associated Vid Names or IDs',
name: 'associatedVids',
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: {
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 {
IExecuteFunctions,
} 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
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);

View file

@ -168,6 +168,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Component Names or IDs',
name: 'componentIds',
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: {
loadOptionsMethod: 'getProjectComponents',
loadOptionsDependsOn: [
@ -218,6 +219,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Label Names or IDs',
name: 'labels',
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: {
loadOptionsMethod: 'getLabels',
},
@ -384,6 +386,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Label Names or IDs',
name: 'labels',
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: {
loadOptionsMethod: 'getLabels',
},

View file

@ -62,6 +62,7 @@ export const contactTagFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tagIds',
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: {
loadOptionsMethod: 'getTags',
},

View file

@ -7,7 +7,8 @@ import {
ILoadOptionsFunctions,
INodeExecutionData,
INodeType,
INodeTypeDescription
INodeTypeDescription,
NodeOperationError
} from 'n8n-workflow';
import {
@ -120,7 +121,7 @@ export class Kitemaker implements INodeType {
async getStatuses(this: ILoadOptionsFunctions) {
const spaceId = this.getNodeParameter('spaceId', 0) as string;
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 });
@ -246,7 +247,7 @@ export class Kitemaker implements INodeType {
};
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;
@ -305,7 +306,7 @@ export class Kitemaker implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i) as IDataObject;
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);

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 {
INodeProperties,
INodeTypeDescription,

View file

@ -432,6 +432,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsMethod: 'getTags',
},
@ -922,6 +923,7 @@ export const contactFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
show: {
'/jsonParameters': [

View file

@ -86,6 +86,7 @@ export class MauticTrigger implements INodeType {
displayName: 'Event Names or IDs',
name: 'events',
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,
typeOptions: {
loadOptionsMethod: 'getEvents',

View file

@ -175,6 +175,7 @@ export const accountFields: INodeProperties[] = [
displayName: 'Return Field Names or IDs',
name: 'returnFields',
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: {
loadOptionsMethod: 'getAccountFields',
},
@ -184,6 +185,7 @@ export const accountFields: INodeProperties[] = [
displayName: 'Expand Field Names or IDs',
name: 'expandFields',
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: {
loadOptionsMethod: 'getExpandableAccountFields',
},

View file

@ -174,6 +174,7 @@ export const draftFields: INodeProperties[] = [
displayName: 'Category Names or IDs',
name: 'categories',
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: {
loadOptionsMethod: 'getCategories',
},

View file

@ -103,6 +103,7 @@ export const draftMessageSharedFields: INodeProperties[] = [
displayName: 'Category Names or IDs',
name: 'categories',
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: {
loadOptionsMethod: 'getCategories',
},

View file

@ -493,6 +493,7 @@ export const messageFields: INodeProperties[] = [
displayName: 'Category Names or IDs',
name: 'categories',
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: {
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 {
INodeTypeDescription,
} 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 {
IExecuteFunctions,
} from 'n8n-core';

View file

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

View file

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

View file

@ -16,7 +16,7 @@ import {
filters,
} from './Filters';
export const databasePageOperations = [
export const databasePageOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
@ -90,7 +90,7 @@ export const databasePageOperations = [
],
default: 'create',
},
] as INodeProperties[];
];
export const databasePageFields = [
@ -682,6 +682,7 @@ export const databasePageFields = [
displayName: 'Option Names or IDs',
name: 'multiSelectValue',
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: {
loadOptionsMethod: 'getDatabaseOptionsFromPage',
},

View file

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

View file

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

View file

@ -2,7 +2,7 @@ import {
INodeProperties,
} from 'n8n-workflow';
export const userOperations = [
export const userOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
@ -29,9 +29,9 @@ export const userOperations = [
],
default: 'get',
},
] as INodeProperties[];
];
export const userFields = [
export const userFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* user:get */
@ -97,4 +97,4 @@ export const userFields = [
default: 50,
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 {
databaseFields,
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 {
databaseFields,
databaseOperations,

View file

@ -283,6 +283,7 @@ export const contactDescription: INodeProperties[] = [
displayName: 'Fields to Include',
name: 'fieldsList',
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: [],
typeOptions: {
loadOptionsMethod: 'getModelFields',

View file

@ -202,6 +202,7 @@ export const customResourceDescription: INodeProperties[] = [
displayName: 'Fields to Include',
name: 'fieldsList',
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: [],
typeOptions: {
loadOptionsMethod: 'getModelFields',

View file

@ -183,6 +183,7 @@ export const noteDescription: INodeProperties[] = [
displayName: 'Fields to Include',
name: 'fieldsList',
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: [],
typeOptions: {
loadOptionsMethod: 'getModelFields',

View file

@ -238,6 +238,7 @@ export const opportunityDescription: INodeProperties[] = [
displayName: 'Fields to Include',
name: 'fieldsList',
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: [],
typeOptions: {
loadOptionsMethod: 'getModelFields',

View file

@ -139,6 +139,7 @@ const vehicleLicensePlateField = {
const vehicleColorField = {
displayName: 'Color',
name: 'color',
// eslint-disable-next-line n8n-nodes-base/node-param-color-type-unused
type: 'string',
default: '',
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 {
IExecuteFunctions,
} 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 {
IExecuteFunctions,
} 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 {
IExecuteFunctions,
} 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 {
createDeferredPromise,
IDataObject,
@ -10,6 +10,7 @@ import {
ITriggerFunctions,
ITriggerResponse,
LoggerProxy as Logger,
NodeOperationError,
} from 'n8n-workflow';
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;
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') {

View file

@ -8,6 +8,7 @@ import {
INodeExecutionData,
INodeType,
INodeTypeDescription,
NodeOperationError,
} from 'n8n-workflow';
import {
@ -384,7 +385,7 @@ export class Ssh implements INodeType {
const item = items[i];
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;
@ -392,7 +393,7 @@ export class Ssh implements INodeType {
const binaryData = item.binary[propertyNameUpload] as IBinaryData;
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);

View file

@ -9,6 +9,7 @@ import {
INodePropertyOptions,
INodeType,
INodeTypeDescription,
NodeOperationError,
} from 'n8n-workflow';
import {
@ -267,7 +268,7 @@ export class Stripe implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i) as IDataObject;
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));
@ -386,7 +387,7 @@ export class Stripe implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i) as IDataObject;
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));
@ -470,7 +471,7 @@ export class Stripe implements INodeType {
const body = {} as IDataObject;
if (type !== 'cardToken') {
throw new Error('Only card token creation implemented.');
throw new NodeOperationError(this.getNode(), 'Only card token creation implemented.');
}
body.card = {

View file

@ -254,6 +254,7 @@ export class SurveyMonkeyTrigger implements INodeType {
displayName: 'Survey Names or IDs',
name: 'surveyIds',
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: {
show: {
objectType: [
@ -295,6 +296,7 @@ export class SurveyMonkeyTrigger implements INodeType {
displayName: 'Collector Names or IDs',
name: 'collectorIds',
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: {
show: {
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 {
INodeTypeDescription,
} from 'n8n-workflow';

View file

@ -149,6 +149,7 @@ export const epicFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',
@ -416,6 +417,7 @@ export const epicFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',

View file

@ -195,6 +195,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',
@ -471,6 +472,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',
@ -648,6 +650,7 @@ export const issueFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',

View file

@ -168,6 +168,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',
@ -413,6 +414,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',
@ -587,6 +589,7 @@ export const taskFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',

View file

@ -198,6 +198,7 @@ export const userStoryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',
@ -430,6 +431,7 @@ export const userStoryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',
@ -598,6 +600,7 @@ export const userStoryFields: INodeProperties[] = [
displayName: 'Tag Names or IDs',
name: 'tags',
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: {
loadOptionsDependsOn: [
'projectId',

View file

@ -322,6 +322,7 @@ export const observableFields: INodeProperties[] = [
displayName: 'Analyzer Names or IDs',
name: 'analyzers',
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,
default: [],
typeOptions: {

View file

@ -561,6 +561,7 @@ export class Todoist implements INodeType {
displayName: 'Label Names or IDs',
name: 'labels',
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: {
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.',
},
{
displayName: 'Direct Mentions Name or ID',
displayName: 'Direct Mention Names or IDs',
name: 'direct_mentions',
type: 'multiOptions',
typeOptions: {

View file

@ -274,7 +274,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData;
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);
@ -378,7 +378,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData;
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);
@ -549,7 +549,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData;
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);
@ -623,7 +623,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData;
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);
@ -726,7 +726,7 @@ export class Twist implements INodeType {
const binaryData = item[binaryProperty] as IBinaryData;
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);

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';

View file

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