@n8n/eslint-plugin-community-nodes 0.10.0 → 0.12.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 +22 -17
- package/dist/plugin.d.ts +30 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +10 -0
- package/dist/plugin.js.map +1 -1
- package/dist/rules/index.d.ts +5 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +10 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/missing-paired-item.d.ts +16 -0
- package/dist/rules/missing-paired-item.d.ts.map +1 -0
- package/dist/rules/missing-paired-item.js +121 -0
- package/dist/rules/missing-paired-item.js.map +1 -0
- package/dist/rules/no-forbidden-lifecycle-scripts.d.ts +2 -0
- package/dist/rules/no-forbidden-lifecycle-scripts.d.ts.map +1 -0
- package/dist/rules/no-forbidden-lifecycle-scripts.js +59 -0
- package/dist/rules/no-forbidden-lifecycle-scripts.js.map +1 -0
- package/dist/rules/node-connection-type-literal.d.ts +2 -0
- package/dist/rules/node-connection-type-literal.d.ts.map +1 -0
- package/dist/rules/node-connection-type-literal.js +77 -0
- package/dist/rules/node-connection-type-literal.js.map +1 -0
- package/dist/rules/options-sorted-alphabetically.d.ts +2 -0
- package/dist/rules/options-sorted-alphabetically.d.ts.map +1 -0
- package/dist/rules/options-sorted-alphabetically.js +95 -0
- package/dist/rules/options-sorted-alphabetically.js.map +1 -0
- package/dist/rules/require-continue-on-fail.d.ts +2 -0
- package/dist/rules/require-continue-on-fail.d.ts.map +1 -0
- package/dist/rules/require-continue-on-fail.js +76 -0
- package/dist/rules/require-continue-on-fail.js.map +1 -0
- package/docs/rules/missing-paired-item.md +70 -0
- package/docs/rules/no-forbidden-lifecycle-scripts.md +46 -0
- package/docs/rules/node-connection-type-literal.md +46 -0
- package/docs/rules/options-sorted-alphabetically.md +63 -0
- package/docs/rules/require-continue-on-fail.md +56 -0
- package/package.json +9 -6
- package/src/plugin.ts +10 -0
- package/src/rules/index.ts +10 -0
- package/src/rules/missing-paired-item.test.ts +229 -0
- package/src/rules/missing-paired-item.ts +149 -0
- package/src/rules/no-forbidden-lifecycle-scripts.test.ts +103 -0
- package/src/rules/no-forbidden-lifecycle-scripts.ts +69 -0
- package/src/rules/node-connection-type-literal.test.ts +128 -0
- package/src/rules/node-connection-type-literal.ts +98 -0
- package/src/rules/options-sorted-alphabetically.test.ts +468 -0
- package/src/rules/options-sorted-alphabetically.ts +129 -0
- package/src/rules/require-continue-on-fail.test.ts +129 -0
- package/src/rules/require-continue-on-fail.ts +88 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @n8n/eslint-plugin-community-nodes@0.
|
|
2
|
+
> @n8n/eslint-plugin-community-nodes@0.12.0 build /home/runner/work/n8n/n8n/packages/@n8n/eslint-plugin-community-nodes
|
|
3
3
|
> tsc --project tsconfig.build.json
|
|
4
4
|
|
package/README.md
CHANGED
|
@@ -43,22 +43,27 @@ export default [
|
|
|
43
43
|
🔧 Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\
|
|
44
44
|
💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
|
|
45
45
|
|
|
46
|
-
| Name
|
|
47
|
-
|
|
|
48
|
-
| [ai-node-package-json](docs/rules/ai-node-package-json.md)
|
|
49
|
-
| [cred-class-field-icon-missing](docs/rules/cred-class-field-icon-missing.md)
|
|
50
|
-
| [credential-documentation-url](docs/rules/credential-documentation-url.md)
|
|
51
|
-
| [credential-password-field](docs/rules/credential-password-field.md)
|
|
52
|
-
| [credential-test-required](docs/rules/credential-test-required.md)
|
|
53
|
-
| [icon-validation](docs/rules/icon-validation.md)
|
|
54
|
-
| [
|
|
55
|
-
| [no-
|
|
56
|
-
| [no-
|
|
57
|
-
| [no-
|
|
58
|
-
| [no-
|
|
59
|
-
| [
|
|
60
|
-
| [
|
|
61
|
-
| [
|
|
62
|
-
| [
|
|
46
|
+
| Name | Description | 💼 | ⚠️ | 🔧 | 💡 |
|
|
47
|
+
| :--------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | :--- | :--- | :- | :- |
|
|
48
|
+
| [ai-node-package-json](docs/rules/ai-node-package-json.md) | Enforce consistency between n8n.aiNodeSdkVersion and ai-node-sdk peer dependency in community node packages | ✅ ☑️ | | | |
|
|
49
|
+
| [cred-class-field-icon-missing](docs/rules/cred-class-field-icon-missing.md) | Credential class must have an `icon` property defined | ✅ ☑️ | | | 💡 |
|
|
50
|
+
| [credential-documentation-url](docs/rules/credential-documentation-url.md) | Enforce valid credential documentationUrl format (URL or lowercase alphanumeric slug) | ✅ ☑️ | | 🔧 | |
|
|
51
|
+
| [credential-password-field](docs/rules/credential-password-field.md) | Ensure credential fields with sensitive names have typeOptions.password = true | ✅ ☑️ | | 🔧 | |
|
|
52
|
+
| [credential-test-required](docs/rules/credential-test-required.md) | Ensure credentials have a credential test | ✅ ☑️ | | | 💡 |
|
|
53
|
+
| [icon-validation](docs/rules/icon-validation.md) | Validate node and credential icon files exist, are SVG format, and light/dark icons are different | ✅ ☑️ | | | 💡 |
|
|
54
|
+
| [missing-paired-item](docs/rules/missing-paired-item.md) | Require pairedItem on INodeExecutionData objects in execute() methods to preserve item linking. | ✅ ☑️ | | | |
|
|
55
|
+
| [no-credential-reuse](docs/rules/no-credential-reuse.md) | Prevent credential re-use security issues by ensuring nodes only reference credentials from the same package | ✅ ☑️ | | | 💡 |
|
|
56
|
+
| [no-deprecated-workflow-functions](docs/rules/no-deprecated-workflow-functions.md) | Disallow usage of deprecated functions and types from n8n-workflow package | ✅ ☑️ | | | 💡 |
|
|
57
|
+
| [no-forbidden-lifecycle-scripts](docs/rules/no-forbidden-lifecycle-scripts.md) | Ban lifecycle scripts (prepare, preinstall, postinstall, etc.) in community node packages | ✅ ☑️ | | | |
|
|
58
|
+
| [no-http-request-with-manual-auth](docs/rules/no-http-request-with-manual-auth.md) | Disallow this.helpers.httpRequest() in functions that call this.getCredentials(). Use this.helpers.httpRequestWithAuthentication() instead. | ✅ ☑️ | | | |
|
|
59
|
+
| [no-restricted-globals](docs/rules/no-restricted-globals.md) | Disallow usage of restricted global variables in community nodes. | ✅ | | | |
|
|
60
|
+
| [no-restricted-imports](docs/rules/no-restricted-imports.md) | Disallow usage of restricted imports in community nodes. | ✅ | | | |
|
|
61
|
+
| [node-class-description-icon-missing](docs/rules/node-class-description-icon-missing.md) | Node class description must have an `icon` property defined | ✅ ☑️ | | | 💡 |
|
|
62
|
+
| [node-connection-type-literal](docs/rules/node-connection-type-literal.md) | Disallow string literals in node description `inputs`/`outputs` — use `NodeConnectionTypes` enum instead | ✅ ☑️ | | 🔧 | |
|
|
63
|
+
| [node-usable-as-tool](docs/rules/node-usable-as-tool.md) | Ensure node classes have usableAsTool property | ✅ ☑️ | | 🔧 | |
|
|
64
|
+
| [options-sorted-alphabetically](docs/rules/options-sorted-alphabetically.md) | Enforce alphabetical ordering of options arrays in n8n node properties | | ✅ ☑️ | | |
|
|
65
|
+
| [package-name-convention](docs/rules/package-name-convention.md) | Enforce correct package naming convention for n8n community nodes | ✅ ☑️ | | | 💡 |
|
|
66
|
+
| [require-continue-on-fail](docs/rules/require-continue-on-fail.md) | Require continueOnFail() handling in execute() methods of node classes | ✅ ☑️ | | | |
|
|
67
|
+
| [resource-operation-pattern](docs/rules/resource-operation-pattern.md) | Enforce proper resource/operation pattern for better UX in n8n nodes | | ✅ ☑️ | | |
|
|
63
68
|
|
|
64
69
|
<!-- end auto-generated rules list -->
|
package/dist/plugin.d.ts
CHANGED
|
@@ -23,12 +23,17 @@ declare const configs: {
|
|
|
23
23
|
'@n8n/community-nodes/package-name-convention': "error";
|
|
24
24
|
'@n8n/community-nodes/credential-test-required': "error";
|
|
25
25
|
'@n8n/community-nodes/no-credential-reuse': "error";
|
|
26
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': "error";
|
|
26
27
|
'@n8n/community-nodes/no-http-request-with-manual-auth': "error";
|
|
27
28
|
'@n8n/community-nodes/icon-validation': "error";
|
|
29
|
+
'@n8n/community-nodes/options-sorted-alphabetically': "warn";
|
|
28
30
|
'@n8n/community-nodes/resource-operation-pattern': "warn";
|
|
29
31
|
'@n8n/community-nodes/credential-documentation-url': "error";
|
|
30
32
|
'@n8n/community-nodes/node-class-description-icon-missing': "error";
|
|
31
33
|
'@n8n/community-nodes/cred-class-field-icon-missing': "error";
|
|
34
|
+
'@n8n/community-nodes/node-connection-type-literal': "error";
|
|
35
|
+
'@n8n/community-nodes/missing-paired-item': "error";
|
|
36
|
+
'@n8n/community-nodes/require-continue-on-fail': "error";
|
|
32
37
|
};
|
|
33
38
|
};
|
|
34
39
|
recommendedWithoutN8nCloudSupport: {
|
|
@@ -51,12 +56,17 @@ declare const configs: {
|
|
|
51
56
|
'@n8n/community-nodes/package-name-convention': "error";
|
|
52
57
|
'@n8n/community-nodes/credential-test-required': "error";
|
|
53
58
|
'@n8n/community-nodes/no-credential-reuse': "error";
|
|
59
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': "error";
|
|
54
60
|
'@n8n/community-nodes/no-http-request-with-manual-auth': "error";
|
|
55
61
|
'@n8n/community-nodes/icon-validation': "error";
|
|
62
|
+
'@n8n/community-nodes/options-sorted-alphabetically': "warn";
|
|
56
63
|
'@n8n/community-nodes/credential-documentation-url': "error";
|
|
57
64
|
'@n8n/community-nodes/resource-operation-pattern': "warn";
|
|
58
65
|
'@n8n/community-nodes/node-class-description-icon-missing': "error";
|
|
59
66
|
'@n8n/community-nodes/cred-class-field-icon-missing': "error";
|
|
67
|
+
'@n8n/community-nodes/node-connection-type-literal': "error";
|
|
68
|
+
'@n8n/community-nodes/missing-paired-item': "error";
|
|
69
|
+
'@n8n/community-nodes/require-continue-on-fail': "error";
|
|
60
70
|
};
|
|
61
71
|
};
|
|
62
72
|
};
|
|
@@ -84,12 +94,17 @@ declare const pluginWithConfigs: {
|
|
|
84
94
|
'@n8n/community-nodes/package-name-convention': "error";
|
|
85
95
|
'@n8n/community-nodes/credential-test-required': "error";
|
|
86
96
|
'@n8n/community-nodes/no-credential-reuse': "error";
|
|
97
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': "error";
|
|
87
98
|
'@n8n/community-nodes/no-http-request-with-manual-auth': "error";
|
|
88
99
|
'@n8n/community-nodes/icon-validation': "error";
|
|
100
|
+
'@n8n/community-nodes/options-sorted-alphabetically': "warn";
|
|
89
101
|
'@n8n/community-nodes/resource-operation-pattern': "warn";
|
|
90
102
|
'@n8n/community-nodes/credential-documentation-url': "error";
|
|
91
103
|
'@n8n/community-nodes/node-class-description-icon-missing': "error";
|
|
92
104
|
'@n8n/community-nodes/cred-class-field-icon-missing': "error";
|
|
105
|
+
'@n8n/community-nodes/node-connection-type-literal': "error";
|
|
106
|
+
'@n8n/community-nodes/missing-paired-item': "error";
|
|
107
|
+
'@n8n/community-nodes/require-continue-on-fail': "error";
|
|
93
108
|
};
|
|
94
109
|
};
|
|
95
110
|
recommendedWithoutN8nCloudSupport: {
|
|
@@ -112,12 +127,17 @@ declare const pluginWithConfigs: {
|
|
|
112
127
|
'@n8n/community-nodes/package-name-convention': "error";
|
|
113
128
|
'@n8n/community-nodes/credential-test-required': "error";
|
|
114
129
|
'@n8n/community-nodes/no-credential-reuse': "error";
|
|
130
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': "error";
|
|
115
131
|
'@n8n/community-nodes/no-http-request-with-manual-auth': "error";
|
|
116
132
|
'@n8n/community-nodes/icon-validation': "error";
|
|
133
|
+
'@n8n/community-nodes/options-sorted-alphabetically': "warn";
|
|
117
134
|
'@n8n/community-nodes/credential-documentation-url': "error";
|
|
118
135
|
'@n8n/community-nodes/resource-operation-pattern': "warn";
|
|
119
136
|
'@n8n/community-nodes/node-class-description-icon-missing': "error";
|
|
120
137
|
'@n8n/community-nodes/cred-class-field-icon-missing': "error";
|
|
138
|
+
'@n8n/community-nodes/node-connection-type-literal': "error";
|
|
139
|
+
'@n8n/community-nodes/missing-paired-item': "error";
|
|
140
|
+
'@n8n/community-nodes/require-continue-on-fail': "error";
|
|
121
141
|
};
|
|
122
142
|
};
|
|
123
143
|
};
|
|
@@ -152,12 +172,17 @@ declare const n8nCommunityNodesPlugin: {
|
|
|
152
172
|
'@n8n/community-nodes/package-name-convention': "error";
|
|
153
173
|
'@n8n/community-nodes/credential-test-required': "error";
|
|
154
174
|
'@n8n/community-nodes/no-credential-reuse': "error";
|
|
175
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': "error";
|
|
155
176
|
'@n8n/community-nodes/no-http-request-with-manual-auth': "error";
|
|
156
177
|
'@n8n/community-nodes/icon-validation': "error";
|
|
178
|
+
'@n8n/community-nodes/options-sorted-alphabetically': "warn";
|
|
157
179
|
'@n8n/community-nodes/resource-operation-pattern': "warn";
|
|
158
180
|
'@n8n/community-nodes/credential-documentation-url': "error";
|
|
159
181
|
'@n8n/community-nodes/node-class-description-icon-missing': "error";
|
|
160
182
|
'@n8n/community-nodes/cred-class-field-icon-missing': "error";
|
|
183
|
+
'@n8n/community-nodes/node-connection-type-literal': "error";
|
|
184
|
+
'@n8n/community-nodes/missing-paired-item': "error";
|
|
185
|
+
'@n8n/community-nodes/require-continue-on-fail': "error";
|
|
161
186
|
};
|
|
162
187
|
};
|
|
163
188
|
recommendedWithoutN8nCloudSupport: {
|
|
@@ -180,12 +205,17 @@ declare const n8nCommunityNodesPlugin: {
|
|
|
180
205
|
'@n8n/community-nodes/package-name-convention': "error";
|
|
181
206
|
'@n8n/community-nodes/credential-test-required': "error";
|
|
182
207
|
'@n8n/community-nodes/no-credential-reuse': "error";
|
|
208
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': "error";
|
|
183
209
|
'@n8n/community-nodes/no-http-request-with-manual-auth': "error";
|
|
184
210
|
'@n8n/community-nodes/icon-validation': "error";
|
|
211
|
+
'@n8n/community-nodes/options-sorted-alphabetically': "warn";
|
|
185
212
|
'@n8n/community-nodes/credential-documentation-url': "error";
|
|
186
213
|
'@n8n/community-nodes/resource-operation-pattern': "warn";
|
|
187
214
|
'@n8n/community-nodes/node-class-description-icon-missing': "error";
|
|
188
215
|
'@n8n/community-nodes/cred-class-field-icon-missing': "error";
|
|
216
|
+
'@n8n/community-nodes/node-connection-type-literal': "error";
|
|
217
|
+
'@n8n/community-nodes/missing-paired-item': "error";
|
|
218
|
+
'@n8n/community-nodes/require-continue-on-fail': "error";
|
|
189
219
|
};
|
|
190
220
|
};
|
|
191
221
|
};
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAG7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAYzC,QAAA,MAAM,OAAO;;;;;;;;;;uBAHI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAG7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAYzC,QAAA,MAAM,OAAO;;;;;;;;;;uBAHI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAAtB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CA0DE,CAAC;AAE1C,QAAA,MAAM,iBAAiB;;;;;;;;;;;2BA5DN,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAAtB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAtB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;CA4DiC,CAAC;AAEzE,QAAA,MAAM,uBAAuB;;;;;;;;;;;2BA9DZ,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAAtB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAtB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;CA8DU,CAAC;AAClD,eAAe,iBAAiB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -25,12 +25,17 @@ const configs = {
|
|
|
25
25
|
'@n8n/community-nodes/package-name-convention': 'error',
|
|
26
26
|
'@n8n/community-nodes/credential-test-required': 'error',
|
|
27
27
|
'@n8n/community-nodes/no-credential-reuse': 'error',
|
|
28
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': 'error',
|
|
28
29
|
'@n8n/community-nodes/no-http-request-with-manual-auth': 'error',
|
|
29
30
|
'@n8n/community-nodes/icon-validation': 'error',
|
|
31
|
+
'@n8n/community-nodes/options-sorted-alphabetically': 'warn',
|
|
30
32
|
'@n8n/community-nodes/resource-operation-pattern': 'warn',
|
|
31
33
|
'@n8n/community-nodes/credential-documentation-url': 'error',
|
|
32
34
|
'@n8n/community-nodes/node-class-description-icon-missing': 'error',
|
|
33
35
|
'@n8n/community-nodes/cred-class-field-icon-missing': 'error',
|
|
36
|
+
'@n8n/community-nodes/node-connection-type-literal': 'error',
|
|
37
|
+
'@n8n/community-nodes/missing-paired-item': 'error',
|
|
38
|
+
'@n8n/community-nodes/require-continue-on-fail': 'error',
|
|
34
39
|
},
|
|
35
40
|
},
|
|
36
41
|
recommendedWithoutN8nCloudSupport: {
|
|
@@ -46,12 +51,17 @@ const configs = {
|
|
|
46
51
|
'@n8n/community-nodes/package-name-convention': 'error',
|
|
47
52
|
'@n8n/community-nodes/credential-test-required': 'error',
|
|
48
53
|
'@n8n/community-nodes/no-credential-reuse': 'error',
|
|
54
|
+
'@n8n/community-nodes/no-forbidden-lifecycle-scripts': 'error',
|
|
49
55
|
'@n8n/community-nodes/no-http-request-with-manual-auth': 'error',
|
|
50
56
|
'@n8n/community-nodes/icon-validation': 'error',
|
|
57
|
+
'@n8n/community-nodes/options-sorted-alphabetically': 'warn',
|
|
51
58
|
'@n8n/community-nodes/credential-documentation-url': 'error',
|
|
52
59
|
'@n8n/community-nodes/resource-operation-pattern': 'warn',
|
|
53
60
|
'@n8n/community-nodes/node-class-description-icon-missing': 'error',
|
|
54
61
|
'@n8n/community-nodes/cred-class-field-icon-missing': 'error',
|
|
62
|
+
'@n8n/community-nodes/node-connection-type-literal': 'error',
|
|
63
|
+
'@n8n/community-nodes/missing-paired-item': 'error',
|
|
64
|
+
'@n8n/community-nodes/require-continue-on-fail': 'error',
|
|
55
65
|
},
|
|
56
66
|
},
|
|
57
67
|
};
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,MAAM,GAAG;IACd,IAAI,EAAE;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,sBAAsB;KACjC;IACD,8EAA8E;IAC9E,KAAK,EAAE,KAA+B;CACd,CAAC;AAE1B,MAAM,OAAO,GAAG;IACf,WAAW,EAAE;QACZ,OAAO,EAAE,CAAC,+BAA+B,CAAC;QAC1C,OAAO,EAAE;YACR,sBAAsB,EAAE,MAAM;SAC9B;QACD,KAAK,EAAE;YACN,2CAA2C,EAAE,OAAO;YACpD,4CAA4C,EAAE,OAAO;YACrD,4CAA4C,EAAE,OAAO;YACrD,gDAAgD,EAAE,OAAO;YACzD,uDAAuD,EAAE,OAAO;YAChE,0CAA0C,EAAE,OAAO;YACnD,8CAA8C,EAAE,OAAO;YACvD,+CAA+C,EAAE,OAAO;YACxD,0CAA0C,EAAE,OAAO;YACnD,uDAAuD,EAAE,OAAO;YAChE,sCAAsC,EAAE,OAAO;YAC/C,iDAAiD,EAAE,MAAM;YACzD,mDAAmD,EAAE,OAAO;YAC5D,0DAA0D,EAAE,OAAO;YACnE,oDAAoD,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,MAAM,GAAG;IACd,IAAI,EAAE;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,sBAAsB;KACjC;IACD,8EAA8E;IAC9E,KAAK,EAAE,KAA+B;CACd,CAAC;AAE1B,MAAM,OAAO,GAAG;IACf,WAAW,EAAE;QACZ,OAAO,EAAE,CAAC,+BAA+B,CAAC;QAC1C,OAAO,EAAE;YACR,sBAAsB,EAAE,MAAM;SAC9B;QACD,KAAK,EAAE;YACN,2CAA2C,EAAE,OAAO;YACpD,4CAA4C,EAAE,OAAO;YACrD,4CAA4C,EAAE,OAAO;YACrD,gDAAgD,EAAE,OAAO;YACzD,uDAAuD,EAAE,OAAO;YAChE,0CAA0C,EAAE,OAAO;YACnD,8CAA8C,EAAE,OAAO;YACvD,+CAA+C,EAAE,OAAO;YACxD,0CAA0C,EAAE,OAAO;YACnD,qDAAqD,EAAE,OAAO;YAC9D,uDAAuD,EAAE,OAAO;YAChE,sCAAsC,EAAE,OAAO;YAC/C,oDAAoD,EAAE,MAAM;YAC5D,iDAAiD,EAAE,MAAM;YACzD,mDAAmD,EAAE,OAAO;YAC5D,0DAA0D,EAAE,OAAO;YACnE,oDAAoD,EAAE,OAAO;YAC7D,mDAAmD,EAAE,OAAO;YAC5D,0CAA0C,EAAE,OAAO;YACnD,+CAA+C,EAAE,OAAO;SACxD;KACD;IACD,iCAAiC,EAAE;QAClC,OAAO,EAAE,CAAC,+BAA+B,CAAC;QAC1C,OAAO,EAAE;YACR,sBAAsB,EAAE,MAAM;SAC9B;QACD,KAAK,EAAE;YACN,2CAA2C,EAAE,OAAO;YACpD,gDAAgD,EAAE,OAAO;YACzD,uDAAuD,EAAE,OAAO;YAChE,0CAA0C,EAAE,OAAO;YACnD,8CAA8C,EAAE,OAAO;YACvD,+CAA+C,EAAE,OAAO;YACxD,0CAA0C,EAAE,OAAO;YACnD,qDAAqD,EAAE,OAAO;YAC9D,uDAAuD,EAAE,OAAO;YAChE,sCAAsC,EAAE,OAAO;YAC/C,oDAAoD,EAAE,MAAM;YAC5D,mDAAmD,EAAE,OAAO;YAC5D,iDAAiD,EAAE,MAAM;YACzD,0DAA0D,EAAE,OAAO;YACnE,oDAAoD,EAAE,OAAO;YAC7D,mDAAmD,EAAE,OAAO;YAC5D,0CAA0C,EAAE,OAAO;YACnD,+CAA+C,EAAE,OAAO;SACxD;KACD;CACuC,CAAC;AAE1C,MAAM,iBAAiB,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAA0B,CAAC;AAEzE,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAClD,eAAe,iBAAiB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -5,9 +5,11 @@ export declare const rules: {
|
|
|
5
5
|
'credential-password-field': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingPasswordOption", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
6
6
|
'no-deprecated-workflow-functions': import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedRequestFunction" | "deprecatedFunction" | "deprecatedType" | "deprecatedWithoutReplacement" | "suggestReplaceFunction" | "suggestReplaceType", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
7
7
|
'node-usable-as-tool': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingUsableAsTool", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
8
|
+
'options-sorted-alphabetically': import("@typescript-eslint/utils/ts-eslint").RuleModule<"optionsNotSorted", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
8
9
|
'package-name-convention': import("@typescript-eslint/utils/ts-eslint").RuleModule<"renameTo" | "invalidPackageName", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
9
10
|
'credential-test-required': import("@typescript-eslint/utils/ts-eslint").RuleModule<"addTemplate" | "missingCredentialTest", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
10
11
|
'no-credential-reuse': import("@typescript-eslint/utils/ts-eslint").RuleModule<"didYouMean" | "useAvailable" | "credentialNotInPackage", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
12
|
+
'no-forbidden-lifecycle-scripts': import("@typescript-eslint/utils/ts-eslint").RuleModule<"forbiddenScript", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
11
13
|
'no-http-request-with-manual-auth': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useHttpRequestWithAuthentication", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
12
14
|
'icon-validation': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingIcon" | "addPlaceholder" | "iconFileNotFound" | "iconNotSvg" | "lightDarkSame" | "invalidIconPath" | "addFileProtocol" | "changeExtension" | "similarIcon", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
13
15
|
'resource-operation-pattern': import("@typescript-eslint/utils/ts-eslint").RuleModule<"tooManyOperationsWithoutResources", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
@@ -17,5 +19,8 @@ export declare const rules: {
|
|
|
17
19
|
}], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
18
20
|
'node-class-description-icon-missing': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingIcon" | "addPlaceholder", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
19
21
|
'cred-class-field-icon-missing': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingIcon" | "addPlaceholder", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
22
|
+
'node-connection-type-literal': import("@typescript-eslint/utils/ts-eslint").RuleModule<"stringLiteralInInputs" | "stringLiteralInOutputs" | "unknownStringLiteralInInputs" | "unknownStringLiteralInOutputs", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
23
|
+
'missing-paired-item': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingPairedItem", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
24
|
+
'require-continue-on-fail': import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingContinueOnFail", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
20
25
|
};
|
|
21
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;CAqBuB,CAAC"}
|
package/dist/rules/index.js
CHANGED
|
@@ -4,14 +4,19 @@ import { CredentialDocumentationUrlRule } from './credential-documentation-url.j
|
|
|
4
4
|
import { CredentialPasswordFieldRule } from './credential-password-field.js';
|
|
5
5
|
import { CredentialTestRequiredRule } from './credential-test-required.js';
|
|
6
6
|
import { IconValidationRule } from './icon-validation.js';
|
|
7
|
+
import { MissingPairedItemRule } from './missing-paired-item.js';
|
|
7
8
|
import { NoCredentialReuseRule } from './no-credential-reuse.js';
|
|
8
9
|
import { NoDeprecatedWorkflowFunctionsRule } from './no-deprecated-workflow-functions.js';
|
|
10
|
+
import { NoForbiddenLifecycleScriptsRule } from './no-forbidden-lifecycle-scripts.js';
|
|
9
11
|
import { NoHttpRequestWithManualAuthRule } from './no-http-request-with-manual-auth.js';
|
|
10
12
|
import { NoRestrictedGlobalsRule } from './no-restricted-globals.js';
|
|
11
13
|
import { NoRestrictedImportsRule } from './no-restricted-imports.js';
|
|
12
14
|
import { NodeClassDescriptionIconMissingRule } from './node-class-description-icon-missing.js';
|
|
15
|
+
import { NodeConnectionTypeLiteralRule } from './node-connection-type-literal.js';
|
|
13
16
|
import { NodeUsableAsToolRule } from './node-usable-as-tool.js';
|
|
17
|
+
import { OptionsSortedAlphabeticallyRule } from './options-sorted-alphabetically.js';
|
|
14
18
|
import { PackageNameConventionRule } from './package-name-convention.js';
|
|
19
|
+
import { RequireContinueOnFailRule } from './require-continue-on-fail.js';
|
|
15
20
|
import { ResourceOperationPatternRule } from './resource-operation-pattern.js';
|
|
16
21
|
export const rules = {
|
|
17
22
|
'ai-node-package-json': AiNodePackageJsonRule,
|
|
@@ -20,14 +25,19 @@ export const rules = {
|
|
|
20
25
|
'credential-password-field': CredentialPasswordFieldRule,
|
|
21
26
|
'no-deprecated-workflow-functions': NoDeprecatedWorkflowFunctionsRule,
|
|
22
27
|
'node-usable-as-tool': NodeUsableAsToolRule,
|
|
28
|
+
'options-sorted-alphabetically': OptionsSortedAlphabeticallyRule,
|
|
23
29
|
'package-name-convention': PackageNameConventionRule,
|
|
24
30
|
'credential-test-required': CredentialTestRequiredRule,
|
|
25
31
|
'no-credential-reuse': NoCredentialReuseRule,
|
|
32
|
+
'no-forbidden-lifecycle-scripts': NoForbiddenLifecycleScriptsRule,
|
|
26
33
|
'no-http-request-with-manual-auth': NoHttpRequestWithManualAuthRule,
|
|
27
34
|
'icon-validation': IconValidationRule,
|
|
28
35
|
'resource-operation-pattern': ResourceOperationPatternRule,
|
|
29
36
|
'credential-documentation-url': CredentialDocumentationUrlRule,
|
|
30
37
|
'node-class-description-icon-missing': NodeClassDescriptionIconMissingRule,
|
|
31
38
|
'cred-class-field-icon-missing': CredClassFieldIconMissingRule,
|
|
39
|
+
'node-connection-type-literal': NodeConnectionTypeLiteralRule,
|
|
40
|
+
'missing-paired-item': MissingPairedItemRule,
|
|
41
|
+
'require-continue-on-fail': RequireContinueOnFailRule,
|
|
32
42
|
};
|
|
33
43
|
//# sourceMappingURL=index.js.map
|
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iCAAiC,EAAE,MAAM,uCAAuC,CAAC;AAC1F,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,mCAAmC,EAAE,MAAM,0CAA0C,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAE/E,MAAM,CAAC,MAAM,KAAK,GAAG;IACpB,sBAAsB,EAAE,qBAAqB;IAC7C,uBAAuB,EAAE,uBAAuB;IAChD,uBAAuB,EAAE,uBAAuB;IAChD,2BAA2B,EAAE,2BAA2B;IACxD,kCAAkC,EAAE,iCAAiC;IACrE,qBAAqB,EAAE,oBAAoB;IAC3C,yBAAyB,EAAE,yBAAyB;IACpD,0BAA0B,EAAE,0BAA0B;IACtD,qBAAqB,EAAE,qBAAqB;IAC5C,kCAAkC,EAAE,+BAA+B;IACnE,iBAAiB,EAAE,kBAAkB;IACrC,4BAA4B,EAAE,4BAA4B;IAC1D,8BAA8B,EAAE,8BAA8B;IAC9D,qCAAqC,EAAE,mCAAmC;IAC1E,+BAA+B,EAAE,6BAA6B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iCAAiC,EAAE,MAAM,uCAAuC,CAAC;AAC1F,OAAO,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,mCAAmC,EAAE,MAAM,0CAA0C,CAAC;AAC/F,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAE/E,MAAM,CAAC,MAAM,KAAK,GAAG;IACpB,sBAAsB,EAAE,qBAAqB;IAC7C,uBAAuB,EAAE,uBAAuB;IAChD,uBAAuB,EAAE,uBAAuB;IAChD,2BAA2B,EAAE,2BAA2B;IACxD,kCAAkC,EAAE,iCAAiC;IACrE,qBAAqB,EAAE,oBAAoB;IAC3C,+BAA+B,EAAE,+BAA+B;IAChE,yBAAyB,EAAE,yBAAyB;IACpD,0BAA0B,EAAE,0BAA0B;IACtD,qBAAqB,EAAE,qBAAqB;IAC5C,gCAAgC,EAAE,+BAA+B;IACjE,kCAAkC,EAAE,+BAA+B;IACnE,iBAAiB,EAAE,kBAAkB;IACrC,4BAA4B,EAAE,4BAA4B;IAC1D,8BAA8B,EAAE,8BAA8B;IAC9D,qCAAqC,EAAE,mCAAmC;IAC1E,+BAA+B,EAAE,6BAA6B;IAC9D,8BAA8B,EAAE,6BAA6B;IAC7D,qBAAqB,EAAE,qBAAqB;IAC5C,0BAA0B,EAAE,yBAAyB;CACb,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flags object literals with a `json` property but no `pairedItem` property
|
|
3
|
+
* inside `execute()` methods of `INodeType` classes.
|
|
4
|
+
*
|
|
5
|
+
* Missing `pairedItem` breaks downstream item-referencing expressions like
|
|
6
|
+
* `$('NodeName').item`. This rule catches the three most common patterns:
|
|
7
|
+
*
|
|
8
|
+
* - Object literals in `.map()` callbacks
|
|
9
|
+
* - Object literals passed to `.push()` calls
|
|
10
|
+
* - Object literals in return statements (typically `return [[{ json }]]`)
|
|
11
|
+
*
|
|
12
|
+
* Only flags object literals directly — variable references are skipped since
|
|
13
|
+
* their shape cannot be determined without type resolution.
|
|
14
|
+
*/
|
|
15
|
+
export declare const MissingPairedItemRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingPairedItem", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
16
|
+
//# sourceMappingURL=missing-paired-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-paired-item.d.ts","sourceRoot":"","sources":["../../src/rules/missing-paired-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiCH,eAAO,MAAM,qBAAqB,sJAsGhC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flags object literals with a `json` property but no `pairedItem` property
|
|
3
|
+
* inside `execute()` methods of `INodeType` classes.
|
|
4
|
+
*
|
|
5
|
+
* Missing `pairedItem` breaks downstream item-referencing expressions like
|
|
6
|
+
* `$('NodeName').item`. This rule catches the three most common patterns:
|
|
7
|
+
*
|
|
8
|
+
* - Object literals in `.map()` callbacks
|
|
9
|
+
* - Object literals passed to `.push()` calls
|
|
10
|
+
* - Object literals in return statements (typically `return [[{ json }]]`)
|
|
11
|
+
*
|
|
12
|
+
* Only flags object literals directly — variable references are skipped since
|
|
13
|
+
* their shape cannot be determined without type resolution.
|
|
14
|
+
*/
|
|
15
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
16
|
+
import { createRule, findObjectProperty, isFileType, isNodeTypeClass, isThisHelpersMethodCall, } from '../utils/index.js';
|
|
17
|
+
/**
|
|
18
|
+
* Checks whether the object is inside an array argument to
|
|
19
|
+
* `this.helpers.constructExecutionMetaData()`, which adds pairedItem
|
|
20
|
+
* via the second argument's `itemData` property.
|
|
21
|
+
*/
|
|
22
|
+
function isInsideConstructExecutionMetaData(node) {
|
|
23
|
+
// Pattern: constructExecutionMetaData([{ json: ... }], { itemData: ... })
|
|
24
|
+
// Walk up: ObjectExpression -> ArrayExpression -> CallExpression
|
|
25
|
+
const parent = node.parent;
|
|
26
|
+
if (parent?.type !== AST_NODE_TYPES.ArrayExpression)
|
|
27
|
+
return false;
|
|
28
|
+
const grandparent = parent.parent;
|
|
29
|
+
if (grandparent?.type !== AST_NODE_TYPES.CallExpression)
|
|
30
|
+
return false;
|
|
31
|
+
// Check it's the first argument
|
|
32
|
+
if (grandparent.arguments[0] !== parent)
|
|
33
|
+
return false;
|
|
34
|
+
return isThisHelpersMethodCall(grandparent, 'constructExecutionMetaData');
|
|
35
|
+
}
|
|
36
|
+
export const MissingPairedItemRule = createRule({
|
|
37
|
+
name: 'missing-paired-item',
|
|
38
|
+
meta: {
|
|
39
|
+
type: 'problem',
|
|
40
|
+
docs: {
|
|
41
|
+
description: 'Require pairedItem on INodeExecutionData objects in execute() methods to preserve item linking.',
|
|
42
|
+
},
|
|
43
|
+
messages: {
|
|
44
|
+
missingPairedItem: 'Missing pairedItem on INodeExecutionData object. Add `pairedItem: { item: index }` to preserve item linking. See https://docs.n8n.io/integrations/creating-nodes/build/reference/paired-items/',
|
|
45
|
+
},
|
|
46
|
+
schema: [],
|
|
47
|
+
hasSuggestions: false,
|
|
48
|
+
},
|
|
49
|
+
defaultOptions: [],
|
|
50
|
+
create(context) {
|
|
51
|
+
if (!isFileType(context.filename, '.node.ts')) {
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
let inNodeTypeClass = false;
|
|
55
|
+
let inExecuteMethod = false;
|
|
56
|
+
return {
|
|
57
|
+
ClassDeclaration(node) {
|
|
58
|
+
if (isNodeTypeClass(node)) {
|
|
59
|
+
inNodeTypeClass = true;
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
'ClassDeclaration:exit'() {
|
|
63
|
+
inNodeTypeClass = false;
|
|
64
|
+
inExecuteMethod = false;
|
|
65
|
+
},
|
|
66
|
+
MethodDefinition(node) {
|
|
67
|
+
if (inNodeTypeClass &&
|
|
68
|
+
node.key.type === AST_NODE_TYPES.Identifier &&
|
|
69
|
+
node.key.name === 'execute') {
|
|
70
|
+
inExecuteMethod = true;
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
'MethodDefinition:exit'(node) {
|
|
74
|
+
if (inExecuteMethod &&
|
|
75
|
+
node.key.type === AST_NODE_TYPES.Identifier &&
|
|
76
|
+
node.key.name === 'execute') {
|
|
77
|
+
inExecuteMethod = false;
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
ObjectExpression(node) {
|
|
81
|
+
if (!inExecuteMethod)
|
|
82
|
+
return;
|
|
83
|
+
const hasJson = findObjectProperty(node, 'json') !== null;
|
|
84
|
+
if (!hasJson)
|
|
85
|
+
return;
|
|
86
|
+
const hasPairedItem = findObjectProperty(node, 'pairedItem') !== null;
|
|
87
|
+
if (hasPairedItem)
|
|
88
|
+
return;
|
|
89
|
+
// Skip if inside constructExecutionMetaData() — it adds pairedItem via itemData
|
|
90
|
+
if (isInsideConstructExecutionMetaData(node))
|
|
91
|
+
return;
|
|
92
|
+
// Skip if the object contains spread elements — they may already provide pairedItem
|
|
93
|
+
const hasSpread = node.properties.some((prop) => prop.type === AST_NODE_TYPES.SpreadElement);
|
|
94
|
+
if (hasSpread)
|
|
95
|
+
return;
|
|
96
|
+
// Only flag if this looks like an INodeExecutionData object literal —
|
|
97
|
+
// must have `json` and optionally `binary`/`error`, nothing unexpected.
|
|
98
|
+
// Objects with many unrelated keys are likely not INodeExecutionData.
|
|
99
|
+
const knownKeys = new Set([
|
|
100
|
+
'json',
|
|
101
|
+
'binary',
|
|
102
|
+
'error',
|
|
103
|
+
'pairedItem',
|
|
104
|
+
'executionStatus',
|
|
105
|
+
'metadata',
|
|
106
|
+
'evaluationData',
|
|
107
|
+
'redaction',
|
|
108
|
+
'sendMessage',
|
|
109
|
+
'index',
|
|
110
|
+
]);
|
|
111
|
+
const allPropertiesKnown = node.properties.every((prop) => prop.type === AST_NODE_TYPES.Property &&
|
|
112
|
+
prop.key.type === AST_NODE_TYPES.Identifier &&
|
|
113
|
+
knownKeys.has(prop.key.name));
|
|
114
|
+
if (!allPropertiesKnown)
|
|
115
|
+
return;
|
|
116
|
+
context.report({ node, messageId: 'missingPairedItem' });
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=missing-paired-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-paired-item.js","sourceRoot":"","sources":["../../src/rules/missing-paired-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACN,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,uBAAuB,GACvB,MAAM,mBAAmB,CAAC;AAE3B;;;;GAIG;AACH,SAAS,kCAAkC,CAAC,IAA+B;IAC1E,0EAA0E;IAC1E,iEAAiE;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAElE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,IAAI,WAAW,EAAE,IAAI,KAAK,cAAc,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAEtE,gCAAgC;IAChC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAEtD,OAAO,uBAAuB,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;IAC/C,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EACV,iGAAiG;SAClG;QACD,QAAQ,EAAE;YACT,iBAAiB,EAChB,gMAAgM;SACjM;QACD,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,KAAK;KACrB;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACb,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC;QACX,CAAC;QAED,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,OAAO;YACN,gBAAgB,CAAC,IAAI;gBACpB,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,eAAe,GAAG,IAAI,CAAC;gBACxB,CAAC;YACF,CAAC;YAED,uBAAuB;gBACtB,eAAe,GAAG,KAAK,CAAC;gBACxB,eAAe,GAAG,KAAK,CAAC;YACzB,CAAC;YAED,gBAAgB,CAAC,IAA+B;gBAC/C,IACC,eAAe;oBACf,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,EAC1B,CAAC;oBACF,eAAe,GAAG,IAAI,CAAC;gBACxB,CAAC;YACF,CAAC;YAED,uBAAuB,CAAC,IAA+B;gBACtD,IACC,eAAe;oBACf,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,EAC1B,CAAC;oBACF,eAAe,GAAG,KAAK,CAAC;gBACzB,CAAC;YACF,CAAC;YAED,gBAAgB,CAAC,IAA+B;gBAC/C,IAAI,CAAC,eAAe;oBAAE,OAAO;gBAE7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;gBAC1D,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC;gBACtE,IAAI,aAAa;oBAAE,OAAO;gBAE1B,gFAAgF;gBAChF,IAAI,kCAAkC,CAAC,IAAI,CAAC;oBAAE,OAAO;gBAErD,oFAAoF;gBACpF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa,CACpD,CAAC;gBACF,IAAI,SAAS;oBAAE,OAAO;gBAEtB,sEAAsE;gBACtE,wEAAwE;gBACxE,sEAAsE;gBACtE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;oBACzB,MAAM;oBACN,QAAQ;oBACR,OAAO;oBACP,YAAY;oBACZ,iBAAiB;oBACjB,UAAU;oBACV,gBAAgB;oBAChB,WAAW;oBACX,aAAa;oBACb,OAAO;iBACP,CAAC,CAAC;gBACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAC/C,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,QAAQ;oBACrC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAC3C,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAC7B,CAAC;gBAEF,IAAI,CAAC,kBAAkB;oBAAE,OAAO;gBAEhC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC1D,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-forbidden-lifecycle-scripts.d.ts","sourceRoot":"","sources":["../../src/rules/no-forbidden-lifecycle-scripts.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,+BAA+B,oJAqD1C,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { createRule, findJsonProperty } from '../utils/index.js';
|
|
3
|
+
const FORBIDDEN_SCRIPTS = [
|
|
4
|
+
'prepare',
|
|
5
|
+
'preinstall',
|
|
6
|
+
'install',
|
|
7
|
+
'postinstall',
|
|
8
|
+
'prepublish',
|
|
9
|
+
'preprepare',
|
|
10
|
+
'postprepare',
|
|
11
|
+
];
|
|
12
|
+
export const NoForbiddenLifecycleScriptsRule = createRule({
|
|
13
|
+
name: 'no-forbidden-lifecycle-scripts',
|
|
14
|
+
meta: {
|
|
15
|
+
type: 'problem',
|
|
16
|
+
docs: {
|
|
17
|
+
description: 'Ban lifecycle scripts (prepare, preinstall, postinstall, etc.) in community node packages',
|
|
18
|
+
},
|
|
19
|
+
messages: {
|
|
20
|
+
forbiddenScript: 'Lifecycle script "{{ scriptName }}" is not allowed in community node packages. These scripts execute arbitrary code during installation.',
|
|
21
|
+
},
|
|
22
|
+
schema: [],
|
|
23
|
+
},
|
|
24
|
+
defaultOptions: [],
|
|
25
|
+
create(context) {
|
|
26
|
+
if (!context.filename.endsWith('package.json')) {
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
ObjectExpression(node) {
|
|
31
|
+
// Only process the root object, not nested ones
|
|
32
|
+
if (node.parent?.type === AST_NODE_TYPES.Property) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const scriptsProp = findJsonProperty(node, 'scripts');
|
|
36
|
+
if (!scriptsProp || scriptsProp.value.type !== AST_NODE_TYPES.ObjectExpression) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
for (const property of scriptsProp.value.properties) {
|
|
40
|
+
if (property.type !== AST_NODE_TYPES.Property)
|
|
41
|
+
continue;
|
|
42
|
+
const key = property.key.type === AST_NODE_TYPES.Identifier
|
|
43
|
+
? property.key.name
|
|
44
|
+
: property.key.type === AST_NODE_TYPES.Literal
|
|
45
|
+
? String(property.key.value)
|
|
46
|
+
: null;
|
|
47
|
+
if (key !== null && FORBIDDEN_SCRIPTS.includes(key)) {
|
|
48
|
+
context.report({
|
|
49
|
+
node: property,
|
|
50
|
+
messageId: 'forbiddenScript',
|
|
51
|
+
data: { scriptName: key },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=no-forbidden-lifecycle-scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-forbidden-lifecycle-scripts.js","sourceRoot":"","sources":["../../src/rules/no-forbidden-lifecycle-scripts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,iBAAiB,GAAG;IACzB,SAAS;IACT,YAAY;IACZ,SAAS;IACT,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,aAAa;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,UAAU,CAAC;IACzD,IAAI,EAAE,gCAAgC;IACtC,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EACV,2FAA2F;SAC5F;QACD,QAAQ,EAAE;YACT,eAAe,EACd,0IAA0I;SAC3I;QACD,MAAM,EAAE,EAAE;KACV;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,OAAO;YACN,gBAAgB,CAAC,IAA+B;gBAC/C,gDAAgD;gBAChD,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,QAAQ,EAAE,CAAC;oBACnD,OAAO;gBACR,CAAC;gBAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACtD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;oBAChF,OAAO;gBACR,CAAC;gBAED,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACrD,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,QAAQ;wBAAE,SAAS;oBAExD,MAAM,GAAG,GACR,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;wBAC9C,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI;wBACnB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;4BAC7C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;4BAC5B,CAAC,CAAC,IAAI,CAAC;oBAEV,IAAI,GAAG,KAAK,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrD,OAAO,CAAC,MAAM,CAAC;4BACd,IAAI,EAAE,QAAQ;4BACd,SAAS,EAAE,iBAAiB;4BAC5B,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;yBACzB,CAAC,CAAC;oBACJ,CAAC;gBACF,CAAC;YACF,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const NodeConnectionTypeLiteralRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"stringLiteralInInputs" | "stringLiteralInOutputs" | "unknownStringLiteralInInputs" | "unknownStringLiteralInOutputs", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
2
|
+
//# sourceMappingURL=node-connection-type-literal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-connection-type-literal.d.ts","sourceRoot":"","sources":["../../src/rules/node-connection-type-literal.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,6BAA6B,wPA0ExC,CAAC"}
|