@n8n/eslint-plugin-community-nodes 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/README.md +7 -0
- package/dist/plugin.d.ts +48 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +16 -0
- package/dist/plugin.js.map +1 -1
- package/dist/rules/cred-class-name-suffix.d.ts +2 -0
- package/dist/rules/cred-class-name-suffix.d.ts.map +1 -0
- package/dist/rules/cred-class-name-suffix.js +53 -0
- package/dist/rules/cred-class-name-suffix.js.map +1 -0
- package/dist/rules/cred-class-oauth2-naming.d.ts +2 -0
- package/dist/rules/cred-class-oauth2-naming.d.ts.map +1 -0
- package/dist/rules/cred-class-oauth2-naming.js +96 -0
- package/dist/rules/cred-class-oauth2-naming.js.map +1 -0
- package/dist/rules/index.d.ts +11 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +16 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/n8n-object-validation.d.ts +5 -0
- package/dist/rules/n8n-object-validation.d.ts.map +1 -0
- package/dist/rules/n8n-object-validation.js +148 -0
- package/dist/rules/n8n-object-validation.js.map +1 -0
- package/dist/rules/no-builder-hint-leakage.d.ts +7 -0
- package/dist/rules/no-builder-hint-leakage.d.ts.map +1 -0
- package/dist/rules/no-builder-hint-leakage.js +99 -0
- package/dist/rules/no-builder-hint-leakage.js.map +1 -0
- package/dist/rules/no-overrides-field.js +1 -1
- package/dist/rules/no-overrides-field.js.map +1 -1
- package/dist/rules/no-runtime-dependencies.d.ts +2 -0
- package/dist/rules/no-runtime-dependencies.d.ts.map +1 -0
- package/dist/rules/no-runtime-dependencies.js +41 -0
- package/dist/rules/no-runtime-dependencies.js.map +1 -0
- package/dist/rules/no-template-placeholders.d.ts +2 -0
- package/dist/rules/no-template-placeholders.d.ts.map +1 -0
- package/dist/rules/no-template-placeholders.js +57 -0
- package/dist/rules/no-template-placeholders.js.map +1 -0
- package/dist/rules/node-operation-error-itemindex.d.ts +12 -0
- package/dist/rules/node-operation-error-itemindex.d.ts.map +1 -0
- package/dist/rules/node-operation-error-itemindex.js +184 -0
- package/dist/rules/node-operation-error-itemindex.js.map +1 -0
- package/dist/rules/valid-credential-references.d.ts +2 -0
- package/dist/rules/valid-credential-references.d.ts.map +1 -0
- package/dist/rules/valid-credential-references.js +77 -0
- package/dist/rules/valid-credential-references.js.map +1 -0
- package/dist/rules/webhook-lifecycle-complete.d.ts +1 -1
- package/dist/rules/webhook-lifecycle-complete.d.ts.map +1 -1
- package/dist/rules/webhook-lifecycle-complete.js +8 -0
- package/dist/rules/webhook-lifecycle-complete.js.map +1 -1
- package/dist/utils/ast-utils.d.ts.map +1 -1
- package/dist/utils/ast-utils.js +5 -1
- package/dist/utils/ast-utils.js.map +1 -1
- package/docs/rules/cred-class-name-suffix.md +46 -0
- package/docs/rules/cred-class-oauth2-naming.md +68 -0
- package/docs/rules/n8n-object-validation.md +93 -0
- package/docs/rules/no-overrides-field.md +5 -5
- package/docs/rules/no-runtime-dependencies.md +58 -0
- package/docs/rules/no-template-placeholders.md +51 -0
- package/docs/rules/node-operation-error-itemindex.md +81 -0
- package/docs/rules/valid-credential-references.md +78 -0
- package/package.json +3 -3
- package/src/plugin.ts +16 -0
- package/src/rules/cred-class-name-suffix.test.ts +74 -0
- package/src/rules/cred-class-name-suffix.ts +57 -0
- package/src/rules/cred-class-oauth2-naming.test.ts +197 -0
- package/src/rules/cred-class-oauth2-naming.ts +118 -0
- package/src/rules/index.ts +16 -0
- package/src/rules/n8n-object-validation.test.ts +202 -0
- package/src/rules/n8n-object-validation.ts +200 -0
- package/src/rules/no-builder-hint-leakage.test.ts +84 -0
- package/src/rules/no-builder-hint-leakage.ts +112 -0
- package/src/rules/no-overrides-field.ts +1 -1
- package/src/rules/no-runtime-dependencies.test.ts +50 -0
- package/src/rules/no-runtime-dependencies.ts +50 -0
- package/src/rules/no-template-placeholders.test.ts +135 -0
- package/src/rules/no-template-placeholders.ts +68 -0
- package/src/rules/node-operation-error-itemindex.test.ts +280 -0
- package/src/rules/node-operation-error-itemindex.ts +223 -0
- package/src/rules/valid-credential-references.test.ts +230 -0
- package/src/rules/valid-credential-references.ts +105 -0
- package/src/rules/webhook-lifecycle-complete.test.ts +5 -0
- package/src/rules/webhook-lifecycle-complete.ts +10 -0
- package/src/utils/ast-utils.ts +5 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flags `new NodeOperationError(...)` or `new NodeApiError(...)` inside item
|
|
3
|
+
* loops in `execute()` methods that omit `{ itemIndex }` from the options
|
|
4
|
+
* argument. Without it, n8n cannot associate the error with the specific item
|
|
5
|
+
* that caused it, breaking per-item error reporting and `continueOnFail`.
|
|
6
|
+
*
|
|
7
|
+
* "Item loop" means a `for` or `for...of` that iterates over the result of
|
|
8
|
+
* `this.getInputData()` (or a variable initialised from it). Errors outside
|
|
9
|
+
* such loops — e.g. in webhook handlers or trigger setup — are not flagged.
|
|
10
|
+
*/
|
|
11
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
12
|
+
import { createRule, findObjectProperty, isFileType, isNodeTypeClass } from '../utils/index.js';
|
|
13
|
+
const ITEM_ERROR_CLASSES = new Set(['NodeOperationError', 'NodeApiError']);
|
|
14
|
+
/** Returns true when `node` is a bare `this.getInputData(...)` call. */
|
|
15
|
+
function isGetInputDataCall(node) {
|
|
16
|
+
return (node.callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
17
|
+
node.callee.object.type === AST_NODE_TYPES.ThisExpression &&
|
|
18
|
+
node.callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
19
|
+
node.callee.property.name === 'getInputData');
|
|
20
|
+
}
|
|
21
|
+
/** Returns true when `node` is `<varName>.length` for any name in `varNames`. */
|
|
22
|
+
function isLengthAccessOnVariable(node, varNames) {
|
|
23
|
+
return (node.type === AST_NODE_TYPES.MemberExpression &&
|
|
24
|
+
!node.computed &&
|
|
25
|
+
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
26
|
+
node.property.name === 'length' &&
|
|
27
|
+
node.object.type === AST_NODE_TYPES.Identifier &&
|
|
28
|
+
varNames.has(node.object.name));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns true when the `for` test condition references `<itemVar>.length`,
|
|
32
|
+
* indicating that the loop iterates over an items array.
|
|
33
|
+
*/
|
|
34
|
+
function isItemForLoop(node, itemVarNames) {
|
|
35
|
+
if (!node.test || node.test.type !== AST_NODE_TYPES.BinaryExpression)
|
|
36
|
+
return false;
|
|
37
|
+
const { left, right } = node.test;
|
|
38
|
+
return (isLengthAccessOnVariable(left, itemVarNames) || isLengthAccessOnVariable(right, itemVarNames));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns true when the `for...of` iterable is an items variable or a direct
|
|
42
|
+
* `this.getInputData()` call.
|
|
43
|
+
*/
|
|
44
|
+
function isItemForOfLoop(node, itemVarNames) {
|
|
45
|
+
const { right } = node;
|
|
46
|
+
if (right.type === AST_NODE_TYPES.Identifier && itemVarNames.has(right.name)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return right.type === AST_NODE_TYPES.CallExpression && isGetInputDataCall(right);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns true when the `NodeOperationError` / `NodeApiError` constructor call
|
|
53
|
+
* already has an `{ itemIndex }` property in its options argument, or when the
|
|
54
|
+
* options argument cannot be statically inspected (variable / spread) — in
|
|
55
|
+
* which case we give the benefit of the doubt.
|
|
56
|
+
*/
|
|
57
|
+
function hasItemIndexOption(node) {
|
|
58
|
+
const { arguments: args } = node;
|
|
59
|
+
if (args.length < 3)
|
|
60
|
+
return false;
|
|
61
|
+
const optionsArg = args[2];
|
|
62
|
+
// Non-object-literal (bare variable reference) — can't statically check, assume OK.
|
|
63
|
+
if (!optionsArg || optionsArg.type !== AST_NODE_TYPES.ObjectExpression) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
// itemIndex must be an explicit own property of the options object.
|
|
67
|
+
// Spread elements (e.g. { ...opts }) are not sufficient — they may not
|
|
68
|
+
// include itemIndex and would silently bypass this requirement.
|
|
69
|
+
return findObjectProperty(optionsArg, 'itemIndex') !== null;
|
|
70
|
+
}
|
|
71
|
+
export const NodeOperationErrorItemIndexRule = createRule({
|
|
72
|
+
name: 'node-operation-error-itemindex',
|
|
73
|
+
meta: {
|
|
74
|
+
type: 'problem',
|
|
75
|
+
docs: {
|
|
76
|
+
description: 'Require { itemIndex } in NodeOperationError / NodeApiError options inside item loops',
|
|
77
|
+
},
|
|
78
|
+
messages: {
|
|
79
|
+
missingItemIndex: '`new {{ errorClass }}(...)` inside an item loop must include `{ itemIndex }` as the ' +
|
|
80
|
+
'third argument so n8n can associate the error with the failing item.',
|
|
81
|
+
},
|
|
82
|
+
schema: [],
|
|
83
|
+
},
|
|
84
|
+
defaultOptions: [],
|
|
85
|
+
create(context) {
|
|
86
|
+
if (!isFileType(context.filename, '.node.ts')) {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
let inNodeTypeClass = false;
|
|
90
|
+
let inExecuteMethod = false;
|
|
91
|
+
/** Names of variables initialised from `this.getInputData()` in the current execute() scope. */
|
|
92
|
+
const itemVariableNames = new Set();
|
|
93
|
+
/** AST nodes for loops that are confirmed item loops. */
|
|
94
|
+
const itemLoopNodes = new Set();
|
|
95
|
+
/** Number of currently open item loops (supports nested loops). */
|
|
96
|
+
let itemLoopDepth = 0;
|
|
97
|
+
function resetExecuteState() {
|
|
98
|
+
inExecuteMethod = false;
|
|
99
|
+
itemVariableNames.clear();
|
|
100
|
+
itemLoopNodes.clear();
|
|
101
|
+
itemLoopDepth = 0;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
ClassDeclaration(node) {
|
|
105
|
+
if (isNodeTypeClass(node)) {
|
|
106
|
+
inNodeTypeClass = true;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
'ClassDeclaration:exit'() {
|
|
110
|
+
inNodeTypeClass = false;
|
|
111
|
+
resetExecuteState();
|
|
112
|
+
},
|
|
113
|
+
MethodDefinition(node) {
|
|
114
|
+
if (inNodeTypeClass &&
|
|
115
|
+
node.key.type === AST_NODE_TYPES.Identifier &&
|
|
116
|
+
node.key.name === 'execute') {
|
|
117
|
+
inExecuteMethod = true;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
'MethodDefinition:exit'(node) {
|
|
121
|
+
if (inExecuteMethod &&
|
|
122
|
+
node.key.type === AST_NODE_TYPES.Identifier &&
|
|
123
|
+
node.key.name === 'execute') {
|
|
124
|
+
resetExecuteState();
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
VariableDeclarator(node) {
|
|
128
|
+
if (!inExecuteMethod)
|
|
129
|
+
return;
|
|
130
|
+
if (!node.init)
|
|
131
|
+
return;
|
|
132
|
+
if (node.id.type !== AST_NODE_TYPES.Identifier)
|
|
133
|
+
return;
|
|
134
|
+
if (node.init.type === AST_NODE_TYPES.CallExpression && isGetInputDataCall(node.init)) {
|
|
135
|
+
itemVariableNames.add(node.id.name);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
ForStatement(node) {
|
|
139
|
+
if (!inExecuteMethod)
|
|
140
|
+
return;
|
|
141
|
+
if (isItemForLoop(node, itemVariableNames)) {
|
|
142
|
+
itemLoopNodes.add(node);
|
|
143
|
+
itemLoopDepth++;
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
'ForStatement:exit'(node) {
|
|
147
|
+
if (itemLoopNodes.has(node)) {
|
|
148
|
+
itemLoopNodes.delete(node);
|
|
149
|
+
itemLoopDepth--;
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
ForOfStatement(node) {
|
|
153
|
+
if (!inExecuteMethod)
|
|
154
|
+
return;
|
|
155
|
+
if (isItemForOfLoop(node, itemVariableNames)) {
|
|
156
|
+
itemLoopNodes.add(node);
|
|
157
|
+
itemLoopDepth++;
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
'ForOfStatement:exit'(node) {
|
|
161
|
+
if (itemLoopNodes.has(node)) {
|
|
162
|
+
itemLoopNodes.delete(node);
|
|
163
|
+
itemLoopDepth--;
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
NewExpression(node) {
|
|
167
|
+
if (itemLoopDepth === 0)
|
|
168
|
+
return;
|
|
169
|
+
if (node.callee.type !== AST_NODE_TYPES.Identifier ||
|
|
170
|
+
!ITEM_ERROR_CLASSES.has(node.callee.name)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (!hasItemIndexOption(node)) {
|
|
174
|
+
context.report({
|
|
175
|
+
node,
|
|
176
|
+
messageId: 'missingItemIndex',
|
|
177
|
+
data: { errorClass: node.callee.name },
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=node-operation-error-itemindex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-operation-error-itemindex.js","sourceRoot":"","sources":["../../src/rules/node-operation-error-itemindex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-credential-references.d.ts","sourceRoot":"","sources":["../../src/rules/valid-credential-references.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,6BAA6B,sKAyFxC,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { TSESTree } from '@typescript-eslint/types';
|
|
2
|
+
import { isNodeTypeClass, findClassProperty, findArrayLiteralProperty, extractCredentialNameFromArray, findPackageJson, readPackageJsonCredentials, isFileType, findSimilarStrings, createRule, } from '../utils/index.js';
|
|
3
|
+
export const ValidCredentialReferencesRule = createRule({
|
|
4
|
+
name: 'valid-credential-references',
|
|
5
|
+
meta: {
|
|
6
|
+
type: 'problem',
|
|
7
|
+
docs: {
|
|
8
|
+
description: 'Ensure credentials referenced in node descriptions exist as credential classes in the package',
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
credentialNotFound: 'Credential "{{ credentialName }}" does not exist in this package. Check for typos or ensure the credential class is declared and listed in package.json.',
|
|
12
|
+
didYouMean: "Did you mean '{{ suggestedName }}'?",
|
|
13
|
+
},
|
|
14
|
+
schema: [],
|
|
15
|
+
hasSuggestions: true,
|
|
16
|
+
},
|
|
17
|
+
defaultOptions: [],
|
|
18
|
+
create(context) {
|
|
19
|
+
if (!isFileType(context.filename, '.node.ts')) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
let packageCredentials = null;
|
|
23
|
+
const loadPackageCredentials = () => {
|
|
24
|
+
if (packageCredentials !== null) {
|
|
25
|
+
return packageCredentials;
|
|
26
|
+
}
|
|
27
|
+
const packageJsonPath = findPackageJson(context.filename);
|
|
28
|
+
if (!packageJsonPath) {
|
|
29
|
+
packageCredentials = new Set();
|
|
30
|
+
return packageCredentials;
|
|
31
|
+
}
|
|
32
|
+
packageCredentials = readPackageJsonCredentials(packageJsonPath);
|
|
33
|
+
return packageCredentials;
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
ClassDeclaration(node) {
|
|
37
|
+
if (!isNodeTypeClass(node)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const descriptionProperty = findClassProperty(node, 'description');
|
|
41
|
+
if (!descriptionProperty?.value ||
|
|
42
|
+
descriptionProperty.value.type !== TSESTree.AST_NODE_TYPES.ObjectExpression) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const credentialsArray = findArrayLiteralProperty(descriptionProperty.value, 'credentials');
|
|
46
|
+
if (!credentialsArray) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const knownCredentials = loadPackageCredentials();
|
|
50
|
+
if (knownCredentials.size === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
credentialsArray.elements.forEach((element) => {
|
|
54
|
+
const credentialInfo = extractCredentialNameFromArray(element);
|
|
55
|
+
if (!credentialInfo || knownCredentials.has(credentialInfo.name)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const similar = findSimilarStrings(credentialInfo.name, knownCredentials);
|
|
59
|
+
const suggestions = similar.map((suggestedName) => ({
|
|
60
|
+
messageId: 'didYouMean',
|
|
61
|
+
data: { suggestedName },
|
|
62
|
+
fix(fixer) {
|
|
63
|
+
return fixer.replaceText(credentialInfo.node, `"${suggestedName}"`);
|
|
64
|
+
},
|
|
65
|
+
}));
|
|
66
|
+
context.report({
|
|
67
|
+
node: credentialInfo.node,
|
|
68
|
+
messageId: 'credentialNotFound',
|
|
69
|
+
data: { credentialName: credentialInfo.name },
|
|
70
|
+
suggest: suggestions,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=valid-credential-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-credential-references.js","sourceRoot":"","sources":["../../src/rules/valid-credential-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const WebhookLifecycleCompleteRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingWebhookMethods" | "missingLifecycleMethod", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
1
|
+
export declare const WebhookLifecycleCompleteRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingWebhookMethods" | "emptyWebhookMethods" | "missingLifecycleMethod", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
2
2
|
//# sourceMappingURL=webhook-lifecycle-complete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-lifecycle-complete.d.ts","sourceRoot":"","sources":["../../src/rules/webhook-lifecycle-complete.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,4BAA4B,
|
|
1
|
+
{"version":3,"file":"webhook-lifecycle-complete.d.ts","sourceRoot":"","sources":["../../src/rules/webhook-lifecycle-complete.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,4BAA4B,6MAkFvC,CAAC"}
|
|
@@ -39,6 +39,7 @@ export const WebhookLifecycleCompleteRule = createRule({
|
|
|
39
39
|
},
|
|
40
40
|
messages: {
|
|
41
41
|
missingWebhookMethods: 'Webhook trigger node is missing the `webhookMethods` property. Implement `checkExists`, `create`, and `delete` to register, verify, and clean up the webhook on the third-party service.',
|
|
42
|
+
emptyWebhookMethods: 'Webhook trigger node has an empty `webhookMethods` object. Define at least one lifecycle group with `checkExists`, `create`, and `delete` methods.',
|
|
42
43
|
missingLifecycleMethod: 'Webhook trigger lifecycle is incomplete. `webhookMethods.{{group}}` is missing: {{missing}}. All of `checkExists`, `create`, and `delete` must be implemented.',
|
|
43
44
|
},
|
|
44
45
|
schema: [],
|
|
@@ -69,6 +70,13 @@ export const WebhookLifecycleCompleteRule = createRule({
|
|
|
69
70
|
if (webhookMethodsProperty.value.type !== AST_NODE_TYPES.ObjectExpression) {
|
|
70
71
|
return;
|
|
71
72
|
}
|
|
73
|
+
if (webhookMethodsProperty.value.properties.length === 0) {
|
|
74
|
+
context.report({
|
|
75
|
+
node: webhookMethodsProperty.key,
|
|
76
|
+
messageId: 'emptyWebhookMethods',
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
72
80
|
for (const groupProperty of webhookMethodsProperty.value.properties) {
|
|
73
81
|
if (groupProperty.type !== AST_NODE_TYPES.Property)
|
|
74
82
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-lifecycle-complete.js","sourceRoot":"","sources":["../../src/rules/webhook-lifecycle-complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EACN,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GACf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,gBAAgB,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAGtE;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,gBAA2C;IACvE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC1E,IAAI,gBAAgB,EAAE,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAClF,OAAO,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,qFAAqF;AACrF,SAAS,gBAAgB,CAAC,QAAuC,EAAE,IAAY;IAC9E,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,QAAQ,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEpC,MAAM,UAAU,GACf,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;QAC/E,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAC/E,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,kBAAkB;QACzD,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,uBAAuB,CAC9D,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAgC;IAC3D,OAAO,gBAAgB,CAAC,MAAM,CAC7B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CACpF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,UAAU,CAAC;IACtD,IAAI,EAAE,4BAA4B;IAClC,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EACV,gHAAgH;SACjH;QACD,QAAQ,EAAE;YACT,qBAAqB,EACpB,0LAA0L;YAC3L,sBAAsB,EACrB,gKAAgK;SACjK;QACD,MAAM,EAAE,EAAE;KACV;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACb,OAAO;YACN,gBAAgB,CAAC,IAAI;gBACpB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;oBAAE,OAAO;gBAEnC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;gBACnE,IAAI,CAAC,mBAAmB;oBAAE,OAAO;gBAEjC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,CAAC;gBACnD,IAAI,gBAAgB,EAAE,IAAI,KAAK,cAAc,CAAC,gBAAgB;oBAAE,OAAO;gBAEvE,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAEzE,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBACvE,OAAO;gBACR,CAAC;gBAED,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC;oBACpC,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;wBACrB,SAAS,EAAE,uBAAuB;qBAClC,CAAC,CAAC;oBACH,OAAO;gBACR,CAAC;gBAED,IAAI,sBAAsB,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;oBAC3E,OAAO;gBACR,CAAC;gBAED,KAAK,MAAM,aAAa,IAAI,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACrE,IAAI,aAAa,CAAC,IAAI,KAAK,cAAc,CAAC,QAAQ;wBAAE,SAAS;oBAC7D,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;wBAAE,SAAS;oBAE3E,MAAM,SAAS,GACd,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;wBACnD,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI;wBACxB,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;4BAClD,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;4BACjC,CAAC,CAAC,SAAS,CAAC;oBAEf,MAAM,OAAO,GAAG,kBAAkB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;wBAAE,SAAS;oBAEnC,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI,EAAE,aAAa,CAAC,GAAG;wBACvB,SAAS,EAAE,wBAAwB;wBACnC,IAAI,EAAE;4BACL,KAAK,EAAE,SAAS;4BAChB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;yBAClD;qBACD,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"webhook-lifecycle-complete.js","sourceRoot":"","sources":["../../src/rules/webhook-lifecycle-complete.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAezD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAUxE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAE9E;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,EAC/B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAQpC;AAED,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAQ1B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAK5F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAevE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAGjF;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAQ1B;AAED,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,eAAe,GAAG,IAAI,CAMjC;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,EACjC,WAAW,EAAE,MAAM,GACjB,OAAO,CAST;AAED,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAC7B,QAAQ,CAAC,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/ast-utils.js
CHANGED
|
@@ -76,7 +76,11 @@ export function hasArrayLiteralValue(node, searchValue) {
|
|
|
76
76
|
element.value === searchValue);
|
|
77
77
|
}
|
|
78
78
|
export function getTopLevelObjectInJson(node) {
|
|
79
|
-
|
|
79
|
+
// In a JSON file parsed as JS, the root object is the sole expression of
|
|
80
|
+
// the program, so its parent is an ExpressionStatement. Anything else
|
|
81
|
+
// (Property, ArrayExpression, etc.) is nested and must not be treated as
|
|
82
|
+
// the package root.
|
|
83
|
+
if (node.parent?.type !== AST_NODE_TYPES.ExpressionStatement) {
|
|
80
84
|
return null;
|
|
81
85
|
}
|
|
82
86
|
return node;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Credential class names must be suffixed with `Api` (`@n8n/community-nodes/cred-class-name-suffix`)
|
|
2
|
+
|
|
3
|
+
💼 This rule is enabled in the following configs: ✅ `recommended`, ☑️ `recommendedWithoutN8nCloudSupport`.
|
|
4
|
+
|
|
5
|
+
🔧 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix).
|
|
6
|
+
|
|
7
|
+
<!-- end auto-generated rule header -->
|
|
8
|
+
|
|
9
|
+
## Rule Details
|
|
10
|
+
|
|
11
|
+
Credential classes (those implementing `ICredentialType` in `*.credentials.ts` files) must have a class name ending in `Api`. This is the n8n convention so credentials are easily recognisable in code, in import statements, and across the credential registry.
|
|
12
|
+
|
|
13
|
+
For OAuth2 credentials extending the OAuth2 base, see the sibling rule `cred-class-oauth2-naming` which enforces the more specific `OAuth2Api` suffix.
|
|
14
|
+
|
|
15
|
+
## Opt-out
|
|
16
|
+
|
|
17
|
+
For legitimate exceptions (for example credentials representing custom auth headers where the `Api` suffix would be misleading), disable the rule for the specific class with a standard ESLint comment:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// eslint-disable-next-line @n8n/community-nodes/cred-class-name-suffix
|
|
21
|
+
export class CustomAuthHeader implements ICredentialType {
|
|
22
|
+
// ...
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Examples
|
|
27
|
+
|
|
28
|
+
### ❌ Incorrect
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
export class MyService implements ICredentialType {
|
|
32
|
+
name = 'myServiceApi';
|
|
33
|
+
displayName = 'My Service API';
|
|
34
|
+
properties: INodeProperties[] = [];
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### ✅ Correct
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
export class MyServiceApi implements ICredentialType {
|
|
42
|
+
name = 'myServiceApi';
|
|
43
|
+
displayName = 'My Service API';
|
|
44
|
+
properties: INodeProperties[] = [];
|
|
45
|
+
}
|
|
46
|
+
```
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# OAuth2 credentials must include `OAuth2` in the class name, `name`, and `displayName` (`@n8n/community-nodes/cred-class-oauth2-naming`)
|
|
2
|
+
|
|
3
|
+
💼 This rule is enabled in the following configs: ✅ `recommended`, ☑️ `recommendedWithoutN8nCloudSupport`.
|
|
4
|
+
|
|
5
|
+
🔧 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix).
|
|
6
|
+
|
|
7
|
+
<!-- end auto-generated rule header -->
|
|
8
|
+
|
|
9
|
+
## Rule Details
|
|
10
|
+
|
|
11
|
+
OAuth2 credentials must consistently identify themselves as OAuth2 across all three naming surfaces. This makes them easy to distinguish from other auth flavours (API key, basic auth) in code, in import statements, and in the credentials picker.
|
|
12
|
+
|
|
13
|
+
A credential class is considered an OAuth2 credential if **any** of the following are true:
|
|
14
|
+
|
|
15
|
+
- The class name contains `OAuth2` (e.g. `GoogleOAuth2Api`).
|
|
16
|
+
- The class TypeScript-extends a base whose name contains `OAuth2` (e.g. `class GoogleOAuth2Api extends OAuth2Api`).
|
|
17
|
+
- The `extends` class field references an `OAuth2` credential (e.g. `extends = ['oAuth2Api']`).
|
|
18
|
+
- The `name` or `displayName` field contains `OAuth2`.
|
|
19
|
+
|
|
20
|
+
When a credential is detected as OAuth2, all of the following must contain `OAuth2`:
|
|
21
|
+
|
|
22
|
+
- Class name (must end with `OAuth2Api`).
|
|
23
|
+
- `name` class field.
|
|
24
|
+
- `displayName` class field.
|
|
25
|
+
|
|
26
|
+
The class name is auto-fixable; `name` and `displayName` must be updated manually because their casing convention varies.
|
|
27
|
+
|
|
28
|
+
## Examples
|
|
29
|
+
|
|
30
|
+
### ❌ Incorrect
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// Class name detected as OAuth2 but `name` and `displayName` lack OAuth2.
|
|
34
|
+
export class GoogleOAuth2Api implements ICredentialType {
|
|
35
|
+
name = 'googleApi';
|
|
36
|
+
displayName = 'Google API';
|
|
37
|
+
properties: INodeProperties[] = [];
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// Extends OAuth2 base, but neither class name, `name`, nor `displayName` reflect that.
|
|
43
|
+
export class GoogleApi implements ICredentialType {
|
|
44
|
+
name = 'googleApi';
|
|
45
|
+
displayName = 'Google API';
|
|
46
|
+
extends = ['oAuth2Api'];
|
|
47
|
+
properties: INodeProperties[] = [];
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### ✅ Correct
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
export class GoogleOAuth2Api implements ICredentialType {
|
|
55
|
+
name = 'googleOAuth2Api';
|
|
56
|
+
displayName = 'Google OAuth2 API';
|
|
57
|
+
extends = ['oAuth2Api'];
|
|
58
|
+
properties: INodeProperties[] = [];
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Migrated from
|
|
63
|
+
|
|
64
|
+
This rule consolidates three rules from the legacy `eslint-plugin-n8n-nodes-base` plugin into a single conceptual check:
|
|
65
|
+
|
|
66
|
+
- `cred-class-name-missing-oauth2-suffix`
|
|
67
|
+
- `cred-class-field-name-missing-oauth2`
|
|
68
|
+
- `cred-class-field-display-name-missing-oauth2`
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Validate the structure of the "n8n" object in community node package.json (required keys, types, and dist/ paths) (`@n8n/community-nodes/n8n-object-validation`)
|
|
2
|
+
|
|
3
|
+
💼 This rule is enabled in the following configs: ✅ `recommended`, ☑️ `recommendedWithoutN8nCloudSupport`.
|
|
4
|
+
|
|
5
|
+
<!-- end auto-generated rule header -->
|
|
6
|
+
|
|
7
|
+
## Rule Details
|
|
8
|
+
|
|
9
|
+
Every community node package declares its nodes and credentials inside the
|
|
10
|
+
top-level `n8n` object in `package.json`. n8n loads packages by reading this
|
|
11
|
+
object: it looks up `n8n.n8nNodesApiVersion` to pick the correct loader, and it
|
|
12
|
+
loads each path in `n8n.nodes` and `n8n.credentials` as compiled JavaScript
|
|
13
|
+
relative to the package root. If any of those fields are missing, mistyped, or
|
|
14
|
+
point at TypeScript sources instead of compiled output, the package fails to
|
|
15
|
+
register at install time and the failure is opaque to the user.
|
|
16
|
+
|
|
17
|
+
This rule enforces the structural contract:
|
|
18
|
+
|
|
19
|
+
- `package.json` must contain an `n8n` object.
|
|
20
|
+
- `n8n.n8nNodesApiVersion` must be present and a positive integer. It must live
|
|
21
|
+
inside `n8n`, not at the root.
|
|
22
|
+
- `n8n.nodes` must be a non-empty array of strings, each starting with `dist/`.
|
|
23
|
+
- `n8n.credentials`, if present, must be an array of strings, each starting
|
|
24
|
+
with `dist/`.
|
|
25
|
+
|
|
26
|
+
The `dist/` prefix is required because community nodes ship compiled
|
|
27
|
+
JavaScript; n8n cannot load TypeScript sources at runtime. Variants such as
|
|
28
|
+
`./dist/...` or `DIST/...` are rejected to keep the convention consistent with
|
|
29
|
+
the templates published by `@n8n/node-cli` and `@n8n/create-node`.
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Incorrect
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"name": "n8n-nodes-example",
|
|
38
|
+
"version": "1.0.0"
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"name": "n8n-nodes-example",
|
|
45
|
+
"n8nNodesApiVersion": 1,
|
|
46
|
+
"n8n": {
|
|
47
|
+
"nodes": ["dist/nodes/Foo/Foo.node.js"]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"name": "n8n-nodes-example",
|
|
55
|
+
"n8n": {
|
|
56
|
+
"n8nNodesApiVersion": "1",
|
|
57
|
+
"nodes": ["nodes/Foo/Foo.node.js"]
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"name": "n8n-nodes-example",
|
|
65
|
+
"n8n": {
|
|
66
|
+
"n8nNodesApiVersion": 1,
|
|
67
|
+
"nodes": []
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"name": "n8n-nodes-example",
|
|
75
|
+
"n8n": {
|
|
76
|
+
"n8nNodesApiVersion": 1,
|
|
77
|
+
"nodes": ["./dist/nodes/Foo/Foo.node.js"]
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Correct
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"name": "n8n-nodes-example",
|
|
87
|
+
"n8n": {
|
|
88
|
+
"n8nNodesApiVersion": 1,
|
|
89
|
+
"nodes": ["dist/nodes/Foo/Foo.node.js"],
|
|
90
|
+
"credentials": ["dist/credentials/Foo.credentials.js"]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
## Rule Details
|
|
8
8
|
|
|
9
|
-
The `overrides` field in `package.json`
|
|
9
|
+
The `overrides` field in `package.json` forces specific versions of (transitive) dependencies. n8n installs each community package into an isolated `node_modules` tree (peer deps stripped before install, `require()` walks up from each node's compiled file), so an override in one node only affects that node's own resolution — it does **not** bleed into other nodes or into n8n core. The rule bans the field anyway because:
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
11
|
+
- **Almost always unintentional.** In practice, `overrides` blocks in community nodes are copy-pasted boilerplate from unrelated projects, sometimes alongside an empty `dependencies` so the override is a literal no-op.
|
|
12
|
+
- **No useful effect today.** Because of isolation, a maintainer who believes their override coordinates versions across nodes is wrong about what it does. The block is dead weight at best, actively misleading at worst.
|
|
13
|
+
- **Future-proofing.** If the install layout ever moves toward hoisting or partial sharing, today's "harmless" overrides start affecting other nodes' resolution. Banning the field now keeps that change safe to make.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Most community nodes do not need third-party runtime libraries at all. n8n core already provides HTTP requests (`this.helpers.httpRequest`, `this.helpers.httpRequestWithAuthentication`), credential resolution, binary data helpers, and other common building blocks via the execute context — these should be the default. `dependencies` and `peerDependencies` are restricted by [`no-runtime-dependencies`](no-runtime-dependencies.md) and [`valid-peer-dependencies`](valid-peer-dependencies.md) respectively, so neither is a workaround for `overrides`.
|
|
16
16
|
|
|
17
17
|
## Examples
|
|
18
18
|
|