@n8n/eslint-plugin-community-nodes 0.20.0 → 0.21.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$colon$unchecked.log +1 -1
- package/README.md +9 -1
- 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-filename-against-convention.d.ts +2 -0
- package/dist/rules/cred-filename-against-convention.d.ts.map +1 -0
- package/dist/rules/cred-filename-against-convention.js +42 -0
- package/dist/rules/cred-filename-against-convention.js.map +1 -0
- package/dist/rules/icon-prefer-themed-variants.d.ts +2 -0
- package/dist/rules/icon-prefer-themed-variants.d.ts.map +1 -0
- package/dist/rules/icon-prefer-themed-variants.js +53 -0
- package/dist/rules/icon-prefer-themed-variants.js.map +1 -0
- package/dist/rules/icon-validation.d.ts +1 -1
- package/dist/rules/icon-validation.d.ts.map +1 -1
- package/dist/rules/icon-validation.js +4 -25
- package/dist/rules/icon-validation.js.map +1 -1
- package/dist/rules/index.d.ts +9 -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/no-dangerous-functions.d.ts +2 -0
- package/dist/rules/no-dangerous-functions.d.ts.map +1 -0
- package/dist/rules/no-dangerous-functions.js +121 -0
- package/dist/rules/no-dangerous-functions.js.map +1 -0
- package/dist/rules/no-emoji-in-options.d.ts +2 -0
- package/dist/rules/no-emoji-in-options.d.ts.map +1 -0
- package/dist/rules/no-emoji-in-options.js +86 -0
- package/dist/rules/no-emoji-in-options.js.map +1 -0
- package/dist/rules/node-filename-against-convention.d.ts +2 -0
- package/dist/rules/node-filename-against-convention.d.ts.map +1 -0
- package/dist/rules/node-filename-against-convention.js +61 -0
- package/dist/rules/node-filename-against-convention.js.map +1 -0
- package/dist/rules/node-registration-complete.d.ts +2 -0
- package/dist/rules/node-registration-complete.d.ts.map +1 -0
- package/dist/rules/node-registration-complete.js +60 -0
- package/dist/rules/node-registration-complete.js.map +1 -0
- package/dist/rules/require-version.d.ts +2 -0
- package/dist/rules/require-version.d.ts.map +1 -0
- package/dist/rules/require-version.js +50 -0
- package/dist/rules/require-version.js.map +1 -0
- package/dist/rules/valid-author.d.ts +2 -0
- package/dist/rules/valid-author.d.ts.map +1 -0
- package/dist/rules/valid-author.js +89 -0
- package/dist/rules/valid-author.js.map +1 -0
- package/dist/typecheck.tsbuildinfo +1 -0
- package/dist/utils/file-utils.d.ts +7 -2
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +47 -10
- package/dist/utils/file-utils.js.map +1 -1
- package/docs/rules/cred-filename-against-convention.md +42 -0
- package/docs/rules/icon-prefer-themed-variants.md +71 -0
- package/docs/rules/icon-validation.md +5 -3
- package/docs/rules/no-dangerous-functions.md +41 -0
- package/docs/rules/no-emoji-in-options.md +60 -0
- package/docs/rules/node-filename-against-convention.md +50 -0
- package/docs/rules/node-registration-complete.md +46 -0
- package/docs/rules/require-version.md +51 -0
- package/docs/rules/valid-author.md +60 -0
- package/package.json +4 -4
- package/src/plugin.ts +16 -0
- package/src/rules/cred-filename-against-convention.test.ts +72 -0
- package/src/rules/cred-filename-against-convention.ts +48 -0
- package/src/rules/icon-prefer-themed-variants.test.ts +128 -0
- package/src/rules/icon-prefer-themed-variants.ts +70 -0
- package/src/rules/icon-validation.test.ts +10 -0
- package/src/rules/icon-validation.ts +4 -28
- package/src/rules/index.ts +16 -0
- package/src/rules/no-dangerous-functions.test.ts +83 -0
- package/src/rules/no-dangerous-functions.ts +155 -0
- package/src/rules/no-emoji-in-options.test.ts +157 -0
- package/src/rules/no-emoji-in-options.ts +105 -0
- package/src/rules/node-filename-against-convention.test.ts +115 -0
- package/src/rules/node-filename-against-convention.ts +76 -0
- package/src/rules/node-registration-complete.test.ts +87 -0
- package/src/rules/node-registration-complete.ts +79 -0
- package/src/rules/require-version.test.ts +90 -0
- package/src/rules/require-version.ts +62 -0
- package/src/rules/valid-author.test.ts +108 -0
- package/src/rules/valid-author.ts +100 -0
- package/src/utils/file-utils.ts +58 -11
- package/tsconfig.build.tsbuildinfo +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Credential filename must match the credential class name (`@n8n/community-nodes/cred-filename-against-convention`)
|
|
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
|
+
This rule enforces that the basename of a `*.credentials.ts` file (without the
|
|
10
|
+
`.credentials.ts` extension) matches the name of the credential class it
|
|
11
|
+
contains. The class name is the source of truth.
|
|
12
|
+
|
|
13
|
+
Keeping filenames in sync with class names makes credentials predictable to
|
|
14
|
+
locate and matches the convention used throughout n8n's built-in credentials.
|
|
15
|
+
|
|
16
|
+
## Examples
|
|
17
|
+
|
|
18
|
+
### Incorrect
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// File: GithubApi.credentials.ts
|
|
22
|
+
import type { ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
23
|
+
|
|
24
|
+
export class GitlabApi implements ICredentialType {
|
|
25
|
+
name = 'gitlabApi';
|
|
26
|
+
displayName = 'GitLab API';
|
|
27
|
+
properties: INodeProperties[] = [];
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Correct
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
// File: GithubApi.credentials.ts
|
|
35
|
+
import type { ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
36
|
+
|
|
37
|
+
export class GithubApi implements ICredentialType {
|
|
38
|
+
name = 'githubApi';
|
|
39
|
+
displayName = 'GitHub API';
|
|
40
|
+
properties: INodeProperties[] = [];
|
|
41
|
+
}
|
|
42
|
+
```
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Encourage node and credential icons to provide light/dark variants instead of a single icon file (`@n8n/community-nodes/icon-prefer-themed-variants`)
|
|
2
|
+
|
|
3
|
+
⚠️ This rule _warns_ in the following configs: ✅ `recommended`, ☑️ `recommendedWithoutN8nCloudSupport`.
|
|
4
|
+
|
|
5
|
+
<!-- end auto-generated rule header -->
|
|
6
|
+
|
|
7
|
+
## Rule Details
|
|
8
|
+
|
|
9
|
+
n8n supports themed icons via the `{ light, dark }` object form, and the
|
|
10
|
+
marketplace/preview UI renders both variants for nodes that aren't installed yet.
|
|
11
|
+
A single icon file often renders poorly on one of the two themes (for example, a
|
|
12
|
+
dark glyph on a dark background).
|
|
13
|
+
|
|
14
|
+
This rule warns when a node or credential defines its icon as a single file
|
|
15
|
+
string instead of the themed `{ light, dark }` object. It is a **warning**, not
|
|
16
|
+
an error: most existing nodes ship a single icon, so this nudges authors toward
|
|
17
|
+
themed variants without failing verification.
|
|
18
|
+
|
|
19
|
+
The companion `icon-validation` rule still validates that the referenced files
|
|
20
|
+
exist, use the `file:` protocol, and that the light and dark variants point to
|
|
21
|
+
different files.
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
|
|
25
|
+
### ❌ Incorrect
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
export class MyNode implements INodeType {
|
|
29
|
+
description: INodeTypeDescription = {
|
|
30
|
+
displayName: 'My Node',
|
|
31
|
+
name: 'myNode',
|
|
32
|
+
icon: 'file:icons/my-icon.svg', // Single file — renders poorly on one theme
|
|
33
|
+
// ...
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
export class MyApi implements ICredentialType {
|
|
40
|
+
name = 'myApi';
|
|
41
|
+
displayName = 'My API';
|
|
42
|
+
icon = 'file:icons/my-icon.svg'; // Single file
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### ✅ Correct
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
export class MyNode implements INodeType {
|
|
50
|
+
description: INodeTypeDescription = {
|
|
51
|
+
displayName: 'My Node',
|
|
52
|
+
name: 'myNode',
|
|
53
|
+
icon: {
|
|
54
|
+
light: 'file:icons/my-icon.light.svg',
|
|
55
|
+
dark: 'file:icons/my-icon.dark.svg',
|
|
56
|
+
},
|
|
57
|
+
// ...
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
export class MyApi implements ICredentialType {
|
|
64
|
+
name = 'myApi';
|
|
65
|
+
displayName = 'My API';
|
|
66
|
+
icon = {
|
|
67
|
+
light: 'file:icons/my-icon.light.svg',
|
|
68
|
+
dark: 'file:icons/my-icon.dark.svg',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
```
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Validate node and credential icon files exist,
|
|
1
|
+
# Validate node and credential icon files exist, use the file: protocol, and that light/dark icons are different (`@n8n/community-nodes/icon-validation`)
|
|
2
2
|
|
|
3
3
|
💼 This rule is enabled in the following configs: ✅ `recommended`, ☑️ `recommendedWithoutN8nCloudSupport`.
|
|
4
4
|
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
## Rule Details
|
|
10
10
|
|
|
11
|
-
Validates that your node and credential icon files exist
|
|
11
|
+
Validates that your node and credential icon files exist and use the correct `file:` protocol. Icons must be different files when providing light/dark theme variants.
|
|
12
|
+
|
|
13
|
+
Both SVG and PNG icons are accepted. SVG is recommended (it scales cleanly and supports theming), but PNG is allowed — see the `icon-prefer-themed-variants` rule for the related light/dark nudge.
|
|
12
14
|
|
|
13
15
|
## Examples
|
|
14
16
|
|
|
@@ -19,7 +21,7 @@ export class MyNode implements INodeType {
|
|
|
19
21
|
description: INodeTypeDescription = {
|
|
20
22
|
displayName: 'My Node',
|
|
21
23
|
name: 'myNode',
|
|
22
|
-
icon: 'icons/my-icon.
|
|
24
|
+
icon: 'icons/my-icon.svg', // Missing 'file:' prefix
|
|
23
25
|
// ...
|
|
24
26
|
};
|
|
25
27
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Disallow `eval`, the `Function` constructor, and `child_process` process-spawning functions (`exec`, `spawn`, etc.) in community nodes (`@n8n/community-nodes/no-dangerous-functions`)
|
|
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
|
+
Community nodes run inside the n8n runtime, often on shared infrastructure. Functions that execute arbitrary code from strings or spawn operating-system processes are a primary vector for remote code execution and command injection, and have no legitimate use in a community node. This rule bans them outright:
|
|
10
|
+
|
|
11
|
+
- **`eval(...)`** — executes arbitrary code from a string.
|
|
12
|
+
- **`Function(...)` / `new Function(...)`** — the `Function` constructor is an `eval` equivalent that builds a callable from a string body.
|
|
13
|
+
- **`child_process` process spawners** — `exec`, `execSync`, `execFile`, `execFileSync`, `spawn`, `spawnSync`, and `fork`.
|
|
14
|
+
|
|
15
|
+
The `child_process` functions are detected only when they originate from the `child_process` / `node:child_process` module (via `import` or `require`), so unrelated methods such as `RegExp.prototype.exec` are not affected.
|
|
16
|
+
|
|
17
|
+
This complements [`no-restricted-imports`](no-restricted-imports.md) (which blocks the `child_process` module entirely on n8n Cloud) and [`no-restricted-globals`](no-restricted-globals.md), providing a clear, specific error and defense-in-depth that also applies when the import restrictions are relaxed.
|
|
18
|
+
|
|
19
|
+
## Examples
|
|
20
|
+
|
|
21
|
+
### ❌ Incorrect
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { exec } from 'child_process';
|
|
25
|
+
|
|
26
|
+
eval(userProvidedCode);
|
|
27
|
+
|
|
28
|
+
const compiled = new Function('return ' + expression);
|
|
29
|
+
|
|
30
|
+
exec(`rm -rf ${userInput}`);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### ✅ Correct
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// Parse data instead of evaluating it.
|
|
37
|
+
const value = JSON.parse(rawJson);
|
|
38
|
+
|
|
39
|
+
// Use n8n helpers and well-scoped library APIs instead of spawning processes.
|
|
40
|
+
const response = await this.helpers.httpRequest({ url });
|
|
41
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Disallow emoji characters in node option name and displayName values (`@n8n/community-nodes/no-emoji-in-options`)
|
|
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
|
+
User-facing labels in a node — the node's `displayName`, each property's
|
|
10
|
+
`displayName`, and the `name` of entries in `options` arrays — are rendered
|
|
11
|
+
directly in the n8n editor. Emoji in these labels render inconsistently across
|
|
12
|
+
platforms, break alphabetical sorting and search, and clash with the editor's
|
|
13
|
+
visual language. This rule flags any emoji character (pictographs such as 🚀 or
|
|
14
|
+
✅, and regional-indicator flag emoji such as 🇺🇸) found in a `name` or
|
|
15
|
+
`displayName` string within a node's `description`.
|
|
16
|
+
|
|
17
|
+
Accented and non-Latin characters (e.g. `Café`, `日本語`) are allowed — only
|
|
18
|
+
emoji are reported.
|
|
19
|
+
|
|
20
|
+
## Examples
|
|
21
|
+
|
|
22
|
+
### Incorrect
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
export class MyNode implements INodeType {
|
|
26
|
+
description: INodeTypeDescription = {
|
|
27
|
+
displayName: '🚀 My Node',
|
|
28
|
+
name: 'myNode',
|
|
29
|
+
properties: [
|
|
30
|
+
{
|
|
31
|
+
displayName: 'Operation',
|
|
32
|
+
name: 'operation',
|
|
33
|
+
type: 'options',
|
|
34
|
+
options: [{ name: '✅ Create', value: 'create' }],
|
|
35
|
+
default: 'create',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Correct
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
export class MyNode implements INodeType {
|
|
46
|
+
description: INodeTypeDescription = {
|
|
47
|
+
displayName: 'My Node',
|
|
48
|
+
name: 'myNode',
|
|
49
|
+
properties: [
|
|
50
|
+
{
|
|
51
|
+
displayName: 'Operation',
|
|
52
|
+
name: 'operation',
|
|
53
|
+
type: 'options',
|
|
54
|
+
options: [{ name: 'Create', value: 'create' }],
|
|
55
|
+
default: 'create',
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Node filename must match the node `description.name` (`@n8n/community-nodes/node-filename-against-convention`)
|
|
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 `*.node.ts` file must be named after its node's `description.name`, with the
|
|
10
|
+
first character upper-cased. The source of truth is `description.name` — **not**
|
|
11
|
+
the class name. Keeping the filename in sync with the registered node name makes
|
|
12
|
+
nodes predictable to locate and matches the convention n8n tooling expects.
|
|
13
|
+
|
|
14
|
+
A trailing version suffix (`V2`, `V3`, …) is allowed, so versioned implementations
|
|
15
|
+
such as `GithubV2.node.ts` are accepted for a node whose `description.name` is
|
|
16
|
+
`github`.
|
|
17
|
+
|
|
18
|
+
The comparison is case-sensitive: a node named `github` must live in
|
|
19
|
+
`Github.node.ts`, not `github.node.ts` or `GitHub.node.ts`.
|
|
20
|
+
|
|
21
|
+
This rule is not auto-fixable because ESLint cannot rename files. Rename the file
|
|
22
|
+
to the reported name.
|
|
23
|
+
|
|
24
|
+
## Examples
|
|
25
|
+
|
|
26
|
+
### ❌ Incorrect
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// File: Gitlab.node.ts
|
|
30
|
+
export class Github implements INodeType {
|
|
31
|
+
description: INodeTypeDescription = {
|
|
32
|
+
displayName: 'GitHub',
|
|
33
|
+
name: 'github', // expected file to be named "Github.node.ts"
|
|
34
|
+
// ...
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### ✅ Correct
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// File: Github.node.ts (or GithubV2.node.ts)
|
|
43
|
+
export class Github implements INodeType {
|
|
44
|
+
description: INodeTypeDescription = {
|
|
45
|
+
displayName: 'GitHub',
|
|
46
|
+
name: 'github',
|
|
47
|
+
// ...
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Ensure every `.node.ts` file in the `nodes/` directory is registered in the "n8n.nodes" array of package.json (`@n8n/community-nodes/node-registration-complete`)
|
|
2
|
+
|
|
3
|
+
⚠️ This rule _warns_ in the following configs: ✅ `recommended`, ☑️ `recommendedWithoutN8nCloudSupport`.
|
|
4
|
+
|
|
5
|
+
<!-- end auto-generated rule header -->
|
|
6
|
+
|
|
7
|
+
## Rule Details
|
|
8
|
+
|
|
9
|
+
n8n discovers the nodes in a community package from the `n8n.nodes` array in `package.json`. Any `.node.ts` file that exists in the package's `nodes/` directory but is missing from that array will be silently excluded from the published package — the node simply won't show up in n8n.
|
|
10
|
+
|
|
11
|
+
This rule cross-references the `.node.ts` files found in the `nodes/` directory against the entries in `n8n.nodes` and flags every node file that is not registered, so missing registrations are caught at lint time rather than after publishing.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
Given a package with these files on disk:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
nodes/Foo/Foo.node.ts
|
|
19
|
+
nodes/Bar/Bar.node.ts
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### ❌ Incorrect
|
|
23
|
+
|
|
24
|
+
`Bar.node.ts` exists but is not registered:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"name": "n8n-nodes-my-service",
|
|
29
|
+
"n8n": {
|
|
30
|
+
"nodes": ["dist/nodes/Foo/Foo.node.js"]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### ✅ Correct
|
|
36
|
+
|
|
37
|
+
Every node file is registered:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"name": "n8n-nodes-my-service",
|
|
42
|
+
"n8n": {
|
|
43
|
+
"nodes": ["dist/nodes/Foo/Foo.node.js", "dist/nodes/Bar/Bar.node.js"]
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Require a valid "version" field in community node package.json (`@n8n/community-nodes/require-version`)
|
|
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 must declare a `version` field in its `package.json`. npm refuses to publish a package without a valid [semantic version](https://semver.org/), and n8n relies on the version to track and update installed community packages.
|
|
10
|
+
|
|
11
|
+
This rule reports a missing `version` key as well as a value that is not a valid semantic version string (for example `"1.0"`, `"v1.0.0"`, a range like `"^1.0.0"`, an empty string, or a non-string value).
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
### ❌ Incorrect
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"name": "n8n-nodes-acme"
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"name": "n8n-nodes-acme",
|
|
26
|
+
"version": "1.0"
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"name": "n8n-nodes-acme",
|
|
33
|
+
"version": "v1.0.0"
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### ✅ Correct
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"name": "n8n-nodes-acme",
|
|
42
|
+
"version": "1.0.0"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"name": "n8n-nodes-acme",
|
|
49
|
+
"version": "0.1.0-beta.1"
|
|
50
|
+
}
|
|
51
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Require a non-empty author name and email in package.json (`@n8n/community-nodes/valid-author`)
|
|
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
|
+
A published community node package should identify its author. This rule
|
|
10
|
+
requires the `package.json` to declare an `author` with at minimum a non-empty
|
|
11
|
+
`name` and `email`, so users and n8n can reach the maintainer.
|
|
12
|
+
|
|
13
|
+
Both npm `author` forms are supported:
|
|
14
|
+
|
|
15
|
+
- the object form `{ "name": "...", "email": "..." }`
|
|
16
|
+
- the shorthand string form `"Name <email> (url)"`
|
|
17
|
+
|
|
18
|
+
Whitespace-only values count as empty. The literal `<...>` placeholder pattern
|
|
19
|
+
left over from the node starter template is handled separately by the
|
|
20
|
+
[`no-template-placeholders`](./no-template-placeholders.md) rule.
|
|
21
|
+
|
|
22
|
+
## Examples
|
|
23
|
+
|
|
24
|
+
### ❌ Incorrect
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"name": "n8n-nodes-my-service"
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"name": "n8n-nodes-my-service",
|
|
35
|
+
"author": { "name": "Jane Doe" }
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"name": "n8n-nodes-my-service",
|
|
42
|
+
"author": "Jane Doe"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### ✅ Correct
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"name": "n8n-nodes-my-service",
|
|
51
|
+
"author": { "name": "Jane Doe", "email": "jane@example.com" }
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"name": "n8n-nodes-my-service",
|
|
58
|
+
"author": "Jane Doe <jane@example.com> (https://example.com)"
|
|
59
|
+
}
|
|
60
|
+
```
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@n8n/eslint-plugin-community-nodes",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.21.0",
|
|
5
5
|
"main": "./dist/plugin.js",
|
|
6
6
|
"types": "./dist/plugin.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"rimraf": "6.0.1",
|
|
24
24
|
"typescript": "6.0.2",
|
|
25
25
|
"vitest": "^4.1.1",
|
|
26
|
-
"@n8n/typescript-config": "1.
|
|
27
|
-
"@n8n/vitest-config": "1.
|
|
28
|
-
"n8n-workflow": "2.
|
|
26
|
+
"@n8n/typescript-config": "1.6.0",
|
|
27
|
+
"@n8n/vitest-config": "1.15.0",
|
|
28
|
+
"n8n-workflow": "2.27.0"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"eslint": "9.29.0",
|
package/src/plugin.ts
CHANGED
|
@@ -26,16 +26,19 @@ const configs = {
|
|
|
26
26
|
'@n8n/community-nodes/credential-password-field': 'error',
|
|
27
27
|
'@n8n/community-nodes/n8n-object-validation': 'error',
|
|
28
28
|
'@n8n/community-nodes/no-deprecated-workflow-functions': 'error',
|
|
29
|
+
'@n8n/community-nodes/no-emoji-in-options': 'error',
|
|
29
30
|
'@n8n/community-nodes/node-usable-as-tool': 'error',
|
|
30
31
|
'@n8n/community-nodes/package-name-convention': 'error',
|
|
31
32
|
'@n8n/community-nodes/credential-test-required': 'error',
|
|
32
33
|
'@n8n/community-nodes/no-credential-reuse': 'error',
|
|
34
|
+
'@n8n/community-nodes/no-dangerous-functions': 'error',
|
|
33
35
|
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': 'error',
|
|
34
36
|
'@n8n/community-nodes/no-http-request-with-manual-auth': 'error',
|
|
35
37
|
'@n8n/community-nodes/no-overrides-field': 'error',
|
|
36
38
|
'@n8n/community-nodes/no-runtime-dependencies': 'error',
|
|
37
39
|
'@n8n/community-nodes/no-template-placeholders': 'error',
|
|
38
40
|
'@n8n/community-nodes/icon-validation': 'error',
|
|
41
|
+
'@n8n/community-nodes/icon-prefer-themed-variants': 'warn',
|
|
39
42
|
'@n8n/community-nodes/options-sorted-alphabetically': 'warn',
|
|
40
43
|
'@n8n/community-nodes/resource-operation-pattern': 'warn',
|
|
41
44
|
'@n8n/community-nodes/credential-documentation-url': 'error',
|
|
@@ -43,14 +46,19 @@ const configs = {
|
|
|
43
46
|
'@n8n/community-nodes/cred-class-name-field-conventions': 'error',
|
|
44
47
|
'@n8n/community-nodes/cred-class-name-suffix': 'error',
|
|
45
48
|
'@n8n/community-nodes/cred-class-oauth2-naming': 'error',
|
|
49
|
+
'@n8n/community-nodes/cred-filename-against-convention': 'error',
|
|
46
50
|
'@n8n/community-nodes/node-connection-type-literal': 'error',
|
|
51
|
+
'@n8n/community-nodes/node-filename-against-convention': 'error',
|
|
47
52
|
'@n8n/community-nodes/missing-paired-item': 'error',
|
|
48
53
|
'@n8n/community-nodes/no-builder-hint-leakage': 'error',
|
|
49
54
|
'@n8n/community-nodes/node-operation-error-itemindex': 'error',
|
|
55
|
+
'@n8n/community-nodes/node-registration-complete': 'warn',
|
|
50
56
|
'@n8n/community-nodes/require-community-node-keyword': 'warn',
|
|
51
57
|
'@n8n/community-nodes/require-continue-on-fail': 'error',
|
|
52
58
|
'@n8n/community-nodes/require-node-api-error': 'error',
|
|
53
59
|
'@n8n/community-nodes/require-node-description-fields': 'error',
|
|
60
|
+
'@n8n/community-nodes/require-version': 'error',
|
|
61
|
+
'@n8n/community-nodes/valid-author': 'error',
|
|
54
62
|
'@n8n/community-nodes/valid-credential-references': 'error',
|
|
55
63
|
'@n8n/community-nodes/valid-description': 'error',
|
|
56
64
|
'@n8n/community-nodes/valid-peer-dependencies': 'error',
|
|
@@ -67,16 +75,19 @@ const configs = {
|
|
|
67
75
|
'@n8n/community-nodes/credential-password-field': 'error',
|
|
68
76
|
'@n8n/community-nodes/n8n-object-validation': 'error',
|
|
69
77
|
'@n8n/community-nodes/no-deprecated-workflow-functions': 'error',
|
|
78
|
+
'@n8n/community-nodes/no-emoji-in-options': 'error',
|
|
70
79
|
'@n8n/community-nodes/node-usable-as-tool': 'error',
|
|
71
80
|
'@n8n/community-nodes/package-name-convention': 'error',
|
|
72
81
|
'@n8n/community-nodes/credential-test-required': 'error',
|
|
73
82
|
'@n8n/community-nodes/no-credential-reuse': 'error',
|
|
83
|
+
'@n8n/community-nodes/no-dangerous-functions': 'error',
|
|
74
84
|
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': 'error',
|
|
75
85
|
'@n8n/community-nodes/no-http-request-with-manual-auth': 'error',
|
|
76
86
|
'@n8n/community-nodes/no-overrides-field': 'error',
|
|
77
87
|
'@n8n/community-nodes/no-runtime-dependencies': 'error',
|
|
78
88
|
'@n8n/community-nodes/no-template-placeholders': 'error',
|
|
79
89
|
'@n8n/community-nodes/icon-validation': 'error',
|
|
90
|
+
'@n8n/community-nodes/icon-prefer-themed-variants': 'warn',
|
|
80
91
|
'@n8n/community-nodes/options-sorted-alphabetically': 'warn',
|
|
81
92
|
'@n8n/community-nodes/credential-documentation-url': 'error',
|
|
82
93
|
'@n8n/community-nodes/resource-operation-pattern': 'warn',
|
|
@@ -84,14 +95,19 @@ const configs = {
|
|
|
84
95
|
'@n8n/community-nodes/cred-class-name-field-conventions': 'error',
|
|
85
96
|
'@n8n/community-nodes/cred-class-name-suffix': 'error',
|
|
86
97
|
'@n8n/community-nodes/cred-class-oauth2-naming': 'error',
|
|
98
|
+
'@n8n/community-nodes/cred-filename-against-convention': 'error',
|
|
87
99
|
'@n8n/community-nodes/node-connection-type-literal': 'error',
|
|
100
|
+
'@n8n/community-nodes/node-filename-against-convention': 'error',
|
|
88
101
|
'@n8n/community-nodes/missing-paired-item': 'error',
|
|
89
102
|
'@n8n/community-nodes/no-builder-hint-leakage': 'error',
|
|
90
103
|
'@n8n/community-nodes/node-operation-error-itemindex': 'error',
|
|
104
|
+
'@n8n/community-nodes/node-registration-complete': 'warn',
|
|
91
105
|
'@n8n/community-nodes/require-community-node-keyword': 'warn',
|
|
92
106
|
'@n8n/community-nodes/require-continue-on-fail': 'error',
|
|
93
107
|
'@n8n/community-nodes/require-node-api-error': 'error',
|
|
94
108
|
'@n8n/community-nodes/require-node-description-fields': 'error',
|
|
109
|
+
'@n8n/community-nodes/require-version': 'error',
|
|
110
|
+
'@n8n/community-nodes/valid-author': 'error',
|
|
95
111
|
'@n8n/community-nodes/valid-credential-references': 'error',
|
|
96
112
|
'@n8n/community-nodes/valid-description': 'error',
|
|
97
113
|
'@n8n/community-nodes/valid-peer-dependencies': 'error',
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { RuleTester } from '@typescript-eslint/rule-tester';
|
|
2
|
+
|
|
3
|
+
import { CredFilenameAgainstConventionRule } from './cred-filename-against-convention.js';
|
|
4
|
+
|
|
5
|
+
const ruleTester = new RuleTester();
|
|
6
|
+
|
|
7
|
+
function createCredentialCode(className: string): string {
|
|
8
|
+
return `
|
|
9
|
+
import type { ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
10
|
+
|
|
11
|
+
export class ${className} implements ICredentialType {
|
|
12
|
+
name = '${className.charAt(0).toLowerCase() + className.slice(1)}';
|
|
13
|
+
displayName = '${className}';
|
|
14
|
+
properties: INodeProperties[] = [];
|
|
15
|
+
}`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function createRegularClass(): string {
|
|
19
|
+
return `
|
|
20
|
+
export class SomeHelper {
|
|
21
|
+
name = 'githubApi';
|
|
22
|
+
}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
ruleTester.run('cred-filename-against-convention', CredFilenameAgainstConventionRule, {
|
|
26
|
+
valid: [
|
|
27
|
+
{
|
|
28
|
+
name: 'filename matches credential class name',
|
|
29
|
+
filename: '/tmp/GithubApi.credentials.ts',
|
|
30
|
+
code: createCredentialCode('GithubApi'),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'multi-word class name matches filename',
|
|
34
|
+
filename: '/tmp/GoogleSheetsOAuth2Api.credentials.ts',
|
|
35
|
+
code: createCredentialCode('GoogleSheetsOAuth2Api'),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'class not implementing ICredentialType is ignored',
|
|
39
|
+
filename: '/tmp/Github.credentials.ts',
|
|
40
|
+
code: createRegularClass(),
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'non-.credentials.ts file is ignored',
|
|
44
|
+
filename: '/tmp/GithubApi.ts',
|
|
45
|
+
code: createCredentialCode('Mismatch'),
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
invalid: [
|
|
49
|
+
{
|
|
50
|
+
name: 'filename does not match class name',
|
|
51
|
+
filename: '/tmp/GithubApi.credentials.ts',
|
|
52
|
+
code: createCredentialCode('GitlabApi'),
|
|
53
|
+
errors: [
|
|
54
|
+
{
|
|
55
|
+
messageId: 'renameFile',
|
|
56
|
+
data: { className: 'GitlabApi', expected: 'GitlabApi.credentials.ts' },
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'filename has wrong casing',
|
|
62
|
+
filename: '/tmp/githubApi.credentials.ts',
|
|
63
|
+
code: createCredentialCode('GithubApi'),
|
|
64
|
+
errors: [
|
|
65
|
+
{
|
|
66
|
+
messageId: 'renameFile',
|
|
67
|
+
data: { className: 'GithubApi', expected: 'GithubApi.credentials.ts' },
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
});
|