@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.
Files changed (83) hide show
  1. package/.turbo/turbo-build$colon$unchecked.log +1 -1
  2. package/README.md +9 -1
  3. package/dist/plugin.d.ts +48 -0
  4. package/dist/plugin.d.ts.map +1 -1
  5. package/dist/plugin.js +16 -0
  6. package/dist/plugin.js.map +1 -1
  7. package/dist/rules/cred-filename-against-convention.d.ts +2 -0
  8. package/dist/rules/cred-filename-against-convention.d.ts.map +1 -0
  9. package/dist/rules/cred-filename-against-convention.js +42 -0
  10. package/dist/rules/cred-filename-against-convention.js.map +1 -0
  11. package/dist/rules/icon-prefer-themed-variants.d.ts +2 -0
  12. package/dist/rules/icon-prefer-themed-variants.d.ts.map +1 -0
  13. package/dist/rules/icon-prefer-themed-variants.js +53 -0
  14. package/dist/rules/icon-prefer-themed-variants.js.map +1 -0
  15. package/dist/rules/icon-validation.d.ts +1 -1
  16. package/dist/rules/icon-validation.d.ts.map +1 -1
  17. package/dist/rules/icon-validation.js +4 -25
  18. package/dist/rules/icon-validation.js.map +1 -1
  19. package/dist/rules/index.d.ts +9 -1
  20. package/dist/rules/index.d.ts.map +1 -1
  21. package/dist/rules/index.js +16 -0
  22. package/dist/rules/index.js.map +1 -1
  23. package/dist/rules/no-dangerous-functions.d.ts +2 -0
  24. package/dist/rules/no-dangerous-functions.d.ts.map +1 -0
  25. package/dist/rules/no-dangerous-functions.js +121 -0
  26. package/dist/rules/no-dangerous-functions.js.map +1 -0
  27. package/dist/rules/no-emoji-in-options.d.ts +2 -0
  28. package/dist/rules/no-emoji-in-options.d.ts.map +1 -0
  29. package/dist/rules/no-emoji-in-options.js +86 -0
  30. package/dist/rules/no-emoji-in-options.js.map +1 -0
  31. package/dist/rules/node-filename-against-convention.d.ts +2 -0
  32. package/dist/rules/node-filename-against-convention.d.ts.map +1 -0
  33. package/dist/rules/node-filename-against-convention.js +61 -0
  34. package/dist/rules/node-filename-against-convention.js.map +1 -0
  35. package/dist/rules/node-registration-complete.d.ts +2 -0
  36. package/dist/rules/node-registration-complete.d.ts.map +1 -0
  37. package/dist/rules/node-registration-complete.js +60 -0
  38. package/dist/rules/node-registration-complete.js.map +1 -0
  39. package/dist/rules/require-version.d.ts +2 -0
  40. package/dist/rules/require-version.d.ts.map +1 -0
  41. package/dist/rules/require-version.js +50 -0
  42. package/dist/rules/require-version.js.map +1 -0
  43. package/dist/rules/valid-author.d.ts +2 -0
  44. package/dist/rules/valid-author.d.ts.map +1 -0
  45. package/dist/rules/valid-author.js +89 -0
  46. package/dist/rules/valid-author.js.map +1 -0
  47. package/dist/typecheck.tsbuildinfo +1 -0
  48. package/dist/utils/file-utils.d.ts +7 -2
  49. package/dist/utils/file-utils.d.ts.map +1 -1
  50. package/dist/utils/file-utils.js +47 -10
  51. package/dist/utils/file-utils.js.map +1 -1
  52. package/docs/rules/cred-filename-against-convention.md +42 -0
  53. package/docs/rules/icon-prefer-themed-variants.md +71 -0
  54. package/docs/rules/icon-validation.md +5 -3
  55. package/docs/rules/no-dangerous-functions.md +41 -0
  56. package/docs/rules/no-emoji-in-options.md +60 -0
  57. package/docs/rules/node-filename-against-convention.md +50 -0
  58. package/docs/rules/node-registration-complete.md +46 -0
  59. package/docs/rules/require-version.md +51 -0
  60. package/docs/rules/valid-author.md +60 -0
  61. package/package.json +4 -4
  62. package/src/plugin.ts +16 -0
  63. package/src/rules/cred-filename-against-convention.test.ts +72 -0
  64. package/src/rules/cred-filename-against-convention.ts +48 -0
  65. package/src/rules/icon-prefer-themed-variants.test.ts +128 -0
  66. package/src/rules/icon-prefer-themed-variants.ts +70 -0
  67. package/src/rules/icon-validation.test.ts +10 -0
  68. package/src/rules/icon-validation.ts +4 -28
  69. package/src/rules/index.ts +16 -0
  70. package/src/rules/no-dangerous-functions.test.ts +83 -0
  71. package/src/rules/no-dangerous-functions.ts +155 -0
  72. package/src/rules/no-emoji-in-options.test.ts +157 -0
  73. package/src/rules/no-emoji-in-options.ts +105 -0
  74. package/src/rules/node-filename-against-convention.test.ts +115 -0
  75. package/src/rules/node-filename-against-convention.ts +76 -0
  76. package/src/rules/node-registration-complete.test.ts +87 -0
  77. package/src/rules/node-registration-complete.ts +79 -0
  78. package/src/rules/require-version.test.ts +90 -0
  79. package/src/rules/require-version.ts +62 -0
  80. package/src/rules/valid-author.test.ts +108 -0
  81. package/src/rules/valid-author.ts +100 -0
  82. package/src/utils/file-utils.ts +58 -11
  83. 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, are SVG format, and light/dark icons are different (`@n8n/community-nodes/icon-validation`)
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, are in SVG format, and use the correct `file:` protocol. Icons must be different files when providing light/dark theme variants.
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.png', // Missing 'file:' prefix, wrong format
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.20.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.5.0",
27
- "@n8n/vitest-config": "1.14.0",
28
- "n8n-workflow": "2.26.0"
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
+ });