@n8n/eslint-plugin-community-nodes 0.24.0 → 0.26.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 (137) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/README.md +39 -52
  3. package/dist/plugin.d.ts +15 -93
  4. package/dist/plugin.d.ts.map +1 -1
  5. package/dist/plugin.js +0 -26
  6. package/dist/plugin.js.map +1 -1
  7. package/dist/rules/ai-node-package-json.d.ts +1 -1
  8. package/dist/rules/cred-class-field-icon-missing.d.ts +1 -1
  9. package/dist/rules/cred-class-oauth2-naming.d.ts +1 -1
  10. package/dist/rules/icon-validation.d.ts +1 -1
  11. package/dist/rules/index.d.ts +20 -33
  12. package/dist/rules/index.d.ts.map +1 -1
  13. package/dist/rules/index.js +0 -26
  14. package/dist/rules/index.js.map +1 -1
  15. package/dist/rules/no-credential-reuse.d.ts +1 -1
  16. package/dist/rules/no-dangerous-functions.d.ts +1 -1
  17. package/dist/rules/no-deprecated-workflow-functions.d.ts +1 -1
  18. package/dist/rules/no-restricted-imports.d.ts +1 -1
  19. package/dist/rules/no-restricted-imports.d.ts.map +1 -1
  20. package/dist/rules/no-restricted-imports.js +14 -5
  21. package/dist/rules/no-restricted-imports.js.map +1 -1
  22. package/dist/rules/node-class-description-icon-missing.d.ts +1 -1
  23. package/dist/rules/node-connection-type-literal.js.map +1 -1
  24. package/dist/rules/package-name-convention.d.ts +1 -1
  25. package/dist/rules/require-version.d.ts +1 -1
  26. package/dist/rules/trigger-node-conventions.d.ts +1 -1
  27. package/dist/rules/valid-author.d.ts +1 -1
  28. package/dist/rules/valid-credential-references.d.ts +1 -1
  29. package/dist/rules/valid-description.d.ts +1 -1
  30. package/dist/rules/valid-peer-dependencies.d.ts +1 -1
  31. package/dist/rules/webhook-lifecycle-complete.d.ts +1 -1
  32. package/dist/typecheck.tsbuildinfo +1 -1
  33. package/dist/utils/ast-utils.js.map +1 -1
  34. package/dist/utils/file-utils.d.ts +7 -0
  35. package/dist/utils/file-utils.d.ts.map +1 -1
  36. package/dist/utils/file-utils.js +28 -6
  37. package/dist/utils/file-utils.js.map +1 -1
  38. package/docs/rules/no-forbidden-lifecycle-scripts.md +1 -1
  39. package/docs/rules/no-restricted-imports.md +9 -0
  40. package/package.json +6 -5
  41. package/src/plugin.ts +0 -26
  42. package/src/rules/index.ts +0 -26
  43. package/src/rules/no-restricted-imports.test.ts +63 -0
  44. package/src/rules/no-restricted-imports.ts +17 -4
  45. package/src/utils/file-utils.ts +27 -6
  46. package/tsconfig.json +1 -1
  47. package/dist/rules/cred-class-name-field-conventions.d.ts +0 -2
  48. package/dist/rules/cred-class-name-field-conventions.d.ts.map +0 -1
  49. package/dist/rules/cred-class-name-field-conventions.js +0 -89
  50. package/dist/rules/cred-class-name-field-conventions.js.map +0 -1
  51. package/dist/rules/cred-class-name-suffix.d.ts +0 -2
  52. package/dist/rules/cred-class-name-suffix.d.ts.map +0 -1
  53. package/dist/rules/cred-class-name-suffix.js +0 -53
  54. package/dist/rules/cred-class-name-suffix.js.map +0 -1
  55. package/dist/rules/cred-filename-against-convention.d.ts +0 -2
  56. package/dist/rules/cred-filename-against-convention.d.ts.map +0 -1
  57. package/dist/rules/cred-filename-against-convention.js +0 -42
  58. package/dist/rules/cred-filename-against-convention.js.map +0 -1
  59. package/dist/rules/no-asterisk-in-option-names.d.ts +0 -2
  60. package/dist/rules/no-asterisk-in-option-names.d.ts.map +0 -1
  61. package/dist/rules/no-asterisk-in-option-names.js +0 -90
  62. package/dist/rules/no-asterisk-in-option-names.js.map +0 -1
  63. package/dist/rules/no-duplicate-param-options.d.ts +0 -2
  64. package/dist/rules/no-duplicate-param-options.d.ts.map +0 -1
  65. package/dist/rules/no-duplicate-param-options.js +0 -97
  66. package/dist/rules/no-duplicate-param-options.js.map +0 -1
  67. package/dist/rules/node-class-description-name-camelcase.d.ts +0 -2
  68. package/dist/rules/node-class-description-name-camelcase.d.ts.map +0 -1
  69. package/dist/rules/node-class-description-name-camelcase.js +0 -92
  70. package/dist/rules/node-class-description-name-camelcase.js.map +0 -1
  71. package/dist/rules/node-filename-against-convention.d.ts +0 -2
  72. package/dist/rules/node-filename-against-convention.d.ts.map +0 -1
  73. package/dist/rules/node-filename-against-convention.js +0 -61
  74. package/dist/rules/node-filename-against-convention.js.map +0 -1
  75. package/dist/rules/node-operation-error-itemindex.d.ts +0 -12
  76. package/dist/rules/node-operation-error-itemindex.d.ts.map +0 -1
  77. package/dist/rules/node-operation-error-itemindex.js +0 -184
  78. package/dist/rules/node-operation-error-itemindex.js.map +0 -1
  79. package/dist/rules/options-sorted-alphabetically.d.ts +0 -2
  80. package/dist/rules/options-sorted-alphabetically.d.ts.map +0 -1
  81. package/dist/rules/options-sorted-alphabetically.js +0 -95
  82. package/dist/rules/options-sorted-alphabetically.js.map +0 -1
  83. package/dist/rules/require-community-node-keyword.d.ts +0 -2
  84. package/dist/rules/require-community-node-keyword.d.ts.map +0 -1
  85. package/dist/rules/require-community-node-keyword.js +0 -65
  86. package/dist/rules/require-community-node-keyword.js.map +0 -1
  87. package/dist/rules/require-continue-on-fail.d.ts +0 -2
  88. package/dist/rules/require-continue-on-fail.d.ts.map +0 -1
  89. package/dist/rules/require-continue-on-fail.js +0 -76
  90. package/dist/rules/require-continue-on-fail.js.map +0 -1
  91. package/dist/rules/require-mit-license.d.ts +0 -2
  92. package/dist/rules/require-mit-license.d.ts.map +0 -1
  93. package/dist/rules/require-mit-license.js +0 -57
  94. package/dist/rules/require-mit-license.js.map +0 -1
  95. package/dist/rules/require-param-default.d.ts +0 -15
  96. package/dist/rules/require-param-default.d.ts.map +0 -1
  97. package/dist/rules/require-param-default.js +0 -75
  98. package/dist/rules/require-param-default.js.map +0 -1
  99. package/docs/rules/cred-class-name-field-conventions.md +0 -38
  100. package/docs/rules/cred-class-name-suffix.md +0 -46
  101. package/docs/rules/cred-filename-against-convention.md +0 -42
  102. package/docs/rules/no-asterisk-in-option-names.md +0 -61
  103. package/docs/rules/no-duplicate-param-options.md +0 -46
  104. package/docs/rules/node-class-description-name-camelcase.md +0 -41
  105. package/docs/rules/node-filename-against-convention.md +0 -50
  106. package/docs/rules/node-operation-error-itemindex.md +0 -81
  107. package/docs/rules/options-sorted-alphabetically.md +0 -63
  108. package/docs/rules/require-community-node-keyword.md +0 -45
  109. package/docs/rules/require-continue-on-fail.md +0 -56
  110. package/docs/rules/require-mit-license.md +0 -38
  111. package/docs/rules/require-param-default.md +0 -60
  112. package/src/rules/cred-class-name-field-conventions.test.ts +0 -121
  113. package/src/rules/cred-class-name-field-conventions.ts +0 -102
  114. package/src/rules/cred-class-name-suffix.test.ts +0 -74
  115. package/src/rules/cred-class-name-suffix.ts +0 -57
  116. package/src/rules/cred-filename-against-convention.test.ts +0 -72
  117. package/src/rules/cred-filename-against-convention.ts +0 -48
  118. package/src/rules/no-asterisk-in-option-names.test.ts +0 -185
  119. package/src/rules/no-asterisk-in-option-names.ts +0 -111
  120. package/src/rules/no-duplicate-param-options.test.ts +0 -125
  121. package/src/rules/no-duplicate-param-options.ts +0 -125
  122. package/src/rules/node-class-description-name-camelcase.test.ts +0 -121
  123. package/src/rules/node-class-description-name-camelcase.ts +0 -114
  124. package/src/rules/node-filename-against-convention.test.ts +0 -115
  125. package/src/rules/node-filename-against-convention.ts +0 -76
  126. package/src/rules/node-operation-error-itemindex.test.ts +0 -280
  127. package/src/rules/node-operation-error-itemindex.ts +0 -223
  128. package/src/rules/options-sorted-alphabetically.test.ts +0 -468
  129. package/src/rules/options-sorted-alphabetically.ts +0 -129
  130. package/src/rules/require-community-node-keyword.test.ts +0 -82
  131. package/src/rules/require-community-node-keyword.ts +0 -78
  132. package/src/rules/require-continue-on-fail.test.ts +0 -129
  133. package/src/rules/require-continue-on-fail.ts +0 -88
  134. package/src/rules/require-mit-license.test.ts +0 -67
  135. package/src/rules/require-mit-license.ts +0 -65
  136. package/src/rules/require-param-default.test.ts +0 -227
  137. package/src/rules/require-param-default.ts +0 -89
@@ -1,184 +0,0 @@
1
- /**
2
- * Flags `new NodeOperationError(...)` or `new NodeApiError(...)` inside item
3
- * loops in `execute()` methods that omit `{ itemIndex }` from the options
4
- * argument. Without it, n8n cannot associate the error with the specific item
5
- * that caused it, breaking per-item error reporting and `continueOnFail`.
6
- *
7
- * "Item loop" means a `for` or `for...of` that iterates over the result of
8
- * `this.getInputData()` (or a variable initialised from it). Errors outside
9
- * such loops — e.g. in webhook handlers or trigger setup — are not flagged.
10
- */
11
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
12
- import { createRule, findObjectProperty, isFileType, isNodeTypeClass } from '../utils/index.js';
13
- const ITEM_ERROR_CLASSES = new Set(['NodeOperationError', 'NodeApiError']);
14
- /** Returns true when `node` is a bare `this.getInputData(...)` call. */
15
- function isGetInputDataCall(node) {
16
- return (node.callee.type === AST_NODE_TYPES.MemberExpression &&
17
- node.callee.object.type === AST_NODE_TYPES.ThisExpression &&
18
- node.callee.property.type === AST_NODE_TYPES.Identifier &&
19
- node.callee.property.name === 'getInputData');
20
- }
21
- /** Returns true when `node` is `<varName>.length` for any name in `varNames`. */
22
- function isLengthAccessOnVariable(node, varNames) {
23
- return (node.type === AST_NODE_TYPES.MemberExpression &&
24
- !node.computed &&
25
- node.property.type === AST_NODE_TYPES.Identifier &&
26
- node.property.name === 'length' &&
27
- node.object.type === AST_NODE_TYPES.Identifier &&
28
- varNames.has(node.object.name));
29
- }
30
- /**
31
- * Returns true when the `for` test condition references `<itemVar>.length`,
32
- * indicating that the loop iterates over an items array.
33
- */
34
- function isItemForLoop(node, itemVarNames) {
35
- if (!node.test || node.test.type !== AST_NODE_TYPES.BinaryExpression)
36
- return false;
37
- const { left, right } = node.test;
38
- return (isLengthAccessOnVariable(left, itemVarNames) || isLengthAccessOnVariable(right, itemVarNames));
39
- }
40
- /**
41
- * Returns true when the `for...of` iterable is an items variable or a direct
42
- * `this.getInputData()` call.
43
- */
44
- function isItemForOfLoop(node, itemVarNames) {
45
- const { right } = node;
46
- if (right.type === AST_NODE_TYPES.Identifier && itemVarNames.has(right.name)) {
47
- return true;
48
- }
49
- return right.type === AST_NODE_TYPES.CallExpression && isGetInputDataCall(right);
50
- }
51
- /**
52
- * Returns true when the `NodeOperationError` / `NodeApiError` constructor call
53
- * already has an `{ itemIndex }` property in its options argument, or when the
54
- * options argument cannot be statically inspected (variable / spread) — in
55
- * which case we give the benefit of the doubt.
56
- */
57
- function hasItemIndexOption(node) {
58
- const { arguments: args } = node;
59
- if (args.length < 3)
60
- return false;
61
- const optionsArg = args[2];
62
- // Non-object-literal (bare variable reference) — can't statically check, assume OK.
63
- if (!optionsArg || optionsArg.type !== AST_NODE_TYPES.ObjectExpression) {
64
- return true;
65
- }
66
- // itemIndex must be an explicit own property of the options object.
67
- // Spread elements (e.g. { ...opts }) are not sufficient — they may not
68
- // include itemIndex and would silently bypass this requirement.
69
- return findObjectProperty(optionsArg, 'itemIndex') !== null;
70
- }
71
- export const NodeOperationErrorItemIndexRule = createRule({
72
- name: 'node-operation-error-itemindex',
73
- meta: {
74
- type: 'problem',
75
- docs: {
76
- description: 'Require { itemIndex } in NodeOperationError / NodeApiError options inside item loops',
77
- },
78
- messages: {
79
- missingItemIndex: '`new {{ errorClass }}(...)` inside an item loop must include `{ itemIndex }` as the ' +
80
- 'third argument so n8n can associate the error with the failing item.',
81
- },
82
- schema: [],
83
- },
84
- defaultOptions: [],
85
- create(context) {
86
- if (!isFileType(context.filename, '.node.ts')) {
87
- return {};
88
- }
89
- let inNodeTypeClass = false;
90
- let inExecuteMethod = false;
91
- /** Names of variables initialised from `this.getInputData()` in the current execute() scope. */
92
- const itemVariableNames = new Set();
93
- /** AST nodes for loops that are confirmed item loops. */
94
- const itemLoopNodes = new Set();
95
- /** Number of currently open item loops (supports nested loops). */
96
- let itemLoopDepth = 0;
97
- function resetExecuteState() {
98
- inExecuteMethod = false;
99
- itemVariableNames.clear();
100
- itemLoopNodes.clear();
101
- itemLoopDepth = 0;
102
- }
103
- return {
104
- ClassDeclaration(node) {
105
- if (isNodeTypeClass(node)) {
106
- inNodeTypeClass = true;
107
- }
108
- },
109
- 'ClassDeclaration:exit'() {
110
- inNodeTypeClass = false;
111
- resetExecuteState();
112
- },
113
- MethodDefinition(node) {
114
- if (inNodeTypeClass &&
115
- node.key.type === AST_NODE_TYPES.Identifier &&
116
- node.key.name === 'execute') {
117
- inExecuteMethod = true;
118
- }
119
- },
120
- 'MethodDefinition:exit'(node) {
121
- if (inExecuteMethod &&
122
- node.key.type === AST_NODE_TYPES.Identifier &&
123
- node.key.name === 'execute') {
124
- resetExecuteState();
125
- }
126
- },
127
- VariableDeclarator(node) {
128
- if (!inExecuteMethod)
129
- return;
130
- if (!node.init)
131
- return;
132
- if (node.id.type !== AST_NODE_TYPES.Identifier)
133
- return;
134
- if (node.init.type === AST_NODE_TYPES.CallExpression && isGetInputDataCall(node.init)) {
135
- itemVariableNames.add(node.id.name);
136
- }
137
- },
138
- ForStatement(node) {
139
- if (!inExecuteMethod)
140
- return;
141
- if (isItemForLoop(node, itemVariableNames)) {
142
- itemLoopNodes.add(node);
143
- itemLoopDepth++;
144
- }
145
- },
146
- 'ForStatement:exit'(node) {
147
- if (itemLoopNodes.has(node)) {
148
- itemLoopNodes.delete(node);
149
- itemLoopDepth--;
150
- }
151
- },
152
- ForOfStatement(node) {
153
- if (!inExecuteMethod)
154
- return;
155
- if (isItemForOfLoop(node, itemVariableNames)) {
156
- itemLoopNodes.add(node);
157
- itemLoopDepth++;
158
- }
159
- },
160
- 'ForOfStatement:exit'(node) {
161
- if (itemLoopNodes.has(node)) {
162
- itemLoopNodes.delete(node);
163
- itemLoopDepth--;
164
- }
165
- },
166
- NewExpression(node) {
167
- if (itemLoopDepth === 0)
168
- return;
169
- if (node.callee.type !== AST_NODE_TYPES.Identifier ||
170
- !ITEM_ERROR_CLASSES.has(node.callee.name)) {
171
- return;
172
- }
173
- if (!hasItemIndexOption(node)) {
174
- context.report({
175
- node,
176
- messageId: 'missingItemIndex',
177
- data: { errorClass: node.callee.name },
178
- });
179
- }
180
- },
181
- };
182
- },
183
- });
184
- //# sourceMappingURL=node-operation-error-itemindex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-operation-error-itemindex.js","sourceRoot":"","sources":["../../src/rules/node-operation-error-itemindex.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const OptionsSortedAlphabeticallyRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"optionsNotSorted", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
- //# sourceMappingURL=options-sorted-alphabetically.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"options-sorted-alphabetically.d.ts","sourceRoot":"","sources":["../../src/rules/options-sorted-alphabetically.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,+BAA+B,qJAoH1C,CAAC"}
@@ -1,95 +0,0 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
2
- import { isNodeTypeClass, findClassProperty, findObjectProperty, getStringLiteralValue, isFileType, createRule, } from '../utils/index.js';
3
- export const OptionsSortedAlphabeticallyRule = createRule({
4
- name: 'options-sorted-alphabetically',
5
- meta: {
6
- type: 'suggestion',
7
- docs: {
8
- description: 'Enforce alphabetical ordering of options arrays in n8n node properties',
9
- },
10
- messages: {
11
- optionsNotSorted: 'Options in "{{ displayName }}" are not sorted alphabetically. Expected order: {{ expectedOrder }}.',
12
- },
13
- schema: [],
14
- },
15
- defaultOptions: [],
16
- create(context) {
17
- if (!isFileType(context.filename, '.node.ts')) {
18
- return {};
19
- }
20
- const analyzeNodeDescription = (descriptionValue) => {
21
- if (!descriptionValue || descriptionValue.type !== AST_NODE_TYPES.ObjectExpression) {
22
- return;
23
- }
24
- const propertiesProperty = findObjectProperty(descriptionValue, 'properties');
25
- if (!propertiesProperty?.value ||
26
- propertiesProperty.value.type !== AST_NODE_TYPES.ArrayExpression) {
27
- return;
28
- }
29
- for (const property of propertiesProperty.value.elements) {
30
- if (!property || property.type !== AST_NODE_TYPES.ObjectExpression) {
31
- continue;
32
- }
33
- const typeProperty = findObjectProperty(property, 'type');
34
- const type = typeProperty ? getStringLiteralValue(typeProperty.value) : null;
35
- if (type !== 'options') {
36
- continue;
37
- }
38
- const optionsProperty = findObjectProperty(property, 'options');
39
- if (!optionsProperty?.value ||
40
- optionsProperty.value.type !== AST_NODE_TYPES.ArrayExpression) {
41
- continue;
42
- }
43
- const optionsArray = optionsProperty.value;
44
- // Extract all option names; skip if any name is non-literal (dynamic options)
45
- const names = [];
46
- let hasDynamicName = false;
47
- for (const option of optionsArray.elements) {
48
- if (!option || option.type !== AST_NODE_TYPES.ObjectExpression) {
49
- hasDynamicName = true;
50
- break;
51
- }
52
- const nameProperty = findObjectProperty(option, 'name');
53
- const name = nameProperty ? getStringLiteralValue(nameProperty.value) : null;
54
- if (name === null) {
55
- hasDynamicName = true;
56
- break;
57
- }
58
- names.push(name);
59
- }
60
- if (hasDynamicName || names.length <= 1) {
61
- continue;
62
- }
63
- const sorted = [...names].sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));
64
- const isSorted = names.every((name, i) => name === sorted[i]);
65
- if (isSorted) {
66
- continue;
67
- }
68
- const displayNameProperty = findObjectProperty(property, 'displayName');
69
- const displayName = (displayNameProperty ? getStringLiteralValue(displayNameProperty.value) : null) ??
70
- 'unknown';
71
- context.report({
72
- node: optionsArray,
73
- messageId: 'optionsNotSorted',
74
- data: {
75
- displayName,
76
- expectedOrder: sorted.join(', '),
77
- },
78
- });
79
- }
80
- };
81
- return {
82
- ClassDeclaration(node) {
83
- if (!isNodeTypeClass(node)) {
84
- return;
85
- }
86
- const descriptionProperty = findClassProperty(node, 'description');
87
- if (!descriptionProperty) {
88
- return;
89
- }
90
- analyzeNodeDescription(descriptionProperty.value);
91
- },
92
- };
93
- },
94
- });
95
- //# sourceMappingURL=options-sorted-alphabetically.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"options-sorted-alphabetically.js","sourceRoot":"","sources":["../../src/rules/options-sorted-alphabetically.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,UAAU,GACV,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,+BAA+B,GAAG,UAAU,CAAC;IACzD,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACL,WAAW,EAAE,wEAAwE;SACrF;QACD,QAAQ,EAAE;YACT,gBAAgB,EACf,oGAAoG;SACrG;QACD,MAAM,EAAE,EAAE;KACV;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,MAAM,sBAAsB,GAAG,CAAC,gBAA4C,EAAQ,EAAE;YACrF,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;gBACpF,OAAO;YACR,CAAC;YAED,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;YAC9E,IACC,CAAC,kBAAkB,EAAE,KAAK;gBAC1B,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,EAC/D,CAAC;gBACF,OAAO;YACR,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC1D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;oBACpE,SAAS;gBACV,CAAC;gBAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAE7E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACxB,SAAS;gBACV,CAAC;gBAED,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAChE,IACC,CAAC,eAAe,EAAE,KAAK;oBACvB,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,EAC5D,CAAC;oBACF,SAAS;gBACV,CAAC;gBAED,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC;gBAE3C,8EAA8E;gBAC9E,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,IAAI,cAAc,GAAG,KAAK,CAAC;gBAE3B,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;oBAC5C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;wBAChE,cAAc,GAAG,IAAI,CAAC;wBACtB,MAAM;oBACP,CAAC;oBACD,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBACxD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC7E,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBACnB,cAAc,GAAG,IAAI,CAAC;wBACtB,MAAM;oBACP,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;gBAED,IAAI,cAAc,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACzC,SAAS;gBACV,CAAC;gBAED,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CACtD,CAAC;gBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,QAAQ,EAAE,CAAC;oBACd,SAAS;gBACV,CAAC;gBAED,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;gBACxE,MAAM,WAAW,GAChB,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC/E,SAAS,CAAC;gBAEX,OAAO,CAAC,MAAM,CAAC;oBACd,IAAI,EAAE,YAAY;oBAClB,SAAS,EAAE,kBAAkB;oBAC7B,IAAI,EAAE;wBACL,WAAW;wBACX,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;qBAChC;iBACD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC;QAEF,OAAO;YACN,gBAAgB,CAAC,IAAI;gBACpB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,OAAO;gBACR,CAAC;gBAED,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;gBACnE,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC1B,OAAO;gBACR,CAAC;gBAED,sBAAsB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACnD,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const RequireCommunityNodeKeywordRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingKeyword" | "missingKeywordsArray", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
- //# sourceMappingURL=require-community-node-keyword.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-community-node-keyword.d.ts","sourceRoot":"","sources":["../../src/rules/require-community-node-keyword.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,+BAA+B,4KAsE1C,CAAC"}
@@ -1,65 +0,0 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
2
- import { createRule, findJsonProperty } from '../utils/index.js';
3
- const REQUIRED_KEYWORD = 'n8n-community-node-package';
4
- export const RequireCommunityNodeKeywordRule = createRule({
5
- name: 'require-community-node-keyword',
6
- meta: {
7
- type: 'problem',
8
- docs: {
9
- description: 'Require the "n8n-community-node-package" keyword in community node package.json',
10
- },
11
- fixable: 'code',
12
- messages: {
13
- missingKeyword: `The "keywords" array must include "${REQUIRED_KEYWORD}". This keyword is required for n8n to discover community node packages.`,
14
- missingKeywordsArray: `The package.json must have a "keywords" array containing "${REQUIRED_KEYWORD}".`,
15
- },
16
- schema: [],
17
- },
18
- defaultOptions: [],
19
- create(context) {
20
- if (!context.filename.endsWith('package.json')) {
21
- return {};
22
- }
23
- return {
24
- ObjectExpression(node) {
25
- if (node.parent?.type !== AST_NODE_TYPES.ExpressionStatement) {
26
- return;
27
- }
28
- const keywordsProp = findJsonProperty(node, 'keywords');
29
- if (!keywordsProp) {
30
- context.report({
31
- node,
32
- messageId: 'missingKeywordsArray',
33
- fix(fixer) {
34
- const lastProp = node.properties[node.properties.length - 1];
35
- if (!lastProp) {
36
- return fixer.replaceText(node, `{ "keywords": ["${REQUIRED_KEYWORD}"] }`);
37
- }
38
- return fixer.insertTextAfter(lastProp, `, "keywords": ["${REQUIRED_KEYWORD}"]`);
39
- },
40
- });
41
- return;
42
- }
43
- if (keywordsProp.value.type !== AST_NODE_TYPES.ArrayExpression) {
44
- return;
45
- }
46
- const keywordsArray = keywordsProp.value;
47
- const hasRequiredKeyword = keywordsArray.elements.some((element) => element?.type === AST_NODE_TYPES.Literal && element.value === REQUIRED_KEYWORD);
48
- if (!hasRequiredKeyword) {
49
- context.report({
50
- node: keywordsProp,
51
- messageId: 'missingKeyword',
52
- fix(fixer) {
53
- const lastElement = keywordsArray.elements[keywordsArray.elements.length - 1];
54
- if (!lastElement) {
55
- return fixer.replaceText(keywordsArray, `["${REQUIRED_KEYWORD}"]`);
56
- }
57
- return fixer.insertTextAfter(lastElement, `, "${REQUIRED_KEYWORD}"`);
58
- },
59
- });
60
- }
61
- },
62
- };
63
- },
64
- });
65
- //# sourceMappingURL=require-community-node-keyword.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-community-node-keyword.js","sourceRoot":"","sources":["../../src/rules/require-community-node-keyword.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD,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,iFAAiF;SAClF;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACT,cAAc,EAAE,sCAAsC,gBAAgB,0EAA0E;YAChJ,oBAAoB,EAAE,6DAA6D,gBAAgB,IAAI;SACvG;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,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,mBAAmB,EAAE,CAAC;oBAC9D,OAAO;gBACR,CAAC;gBAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAExD,IAAI,CAAC,YAAY,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI;wBACJ,SAAS,EAAE,sBAAsB;wBACjC,GAAG,CAAC,KAAK;4BACR,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;4BAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACf,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,mBAAmB,gBAAgB,MAAM,CAAC,CAAC;4BAC3E,CAAC;4BACD,OAAO,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,mBAAmB,gBAAgB,IAAI,CAAC,CAAC;wBACjF,CAAC;qBACD,CAAC,CAAC;oBACH,OAAO;gBACR,CAAC;gBAED,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,EAAE,CAAC;oBAChE,OAAO;gBACR,CAAC;gBAED,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC;gBACzC,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CACrD,CAAC,OAAO,EAAE,EAAE,CACX,OAAO,EAAE,IAAI,KAAK,cAAc,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,gBAAgB,CAC/E,CAAC;gBAEF,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACzB,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,gBAAgB;wBAC3B,GAAG,CAAC,KAAK;4BACR,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;4BAC9E,IAAI,CAAC,WAAW,EAAE,CAAC;gCAClB,OAAO,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,gBAAgB,IAAI,CAAC,CAAC;4BACpE,CAAC;4BACD,OAAO,KAAK,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,gBAAgB,GAAG,CAAC,CAAC;wBACtE,CAAC;qBACD,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const RequireContinueOnFailRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingContinueOnFail", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
- //# sourceMappingURL=require-continue-on-fail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-continue-on-fail.d.ts","sourceRoot":"","sources":["../../src/rules/require-continue-on-fail.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,yBAAyB,0JAyCpC,CAAC"}
@@ -1,76 +0,0 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
2
- import { isNodeTypeClass } from '../utils/index.js';
3
- import { createRule } from '../utils/rule-creator.js';
4
- /** Keys that are not child AST nodes (back-references, metadata). */
5
- const NON_CHILD_KEYS = new Set(['parent', 'loc', 'range', 'start', 'end', 'tokens', 'comments']);
6
- /**
7
- * Recursively checks whether any descendant of the given AST node is a
8
- * `this.continueOnFail()` call expression.
9
- */
10
- function containsContinueOnFailCall(node) {
11
- if (node.type === AST_NODE_TYPES.CallExpression &&
12
- node.callee.type === AST_NODE_TYPES.MemberExpression &&
13
- node.callee.object.type === AST_NODE_TYPES.ThisExpression &&
14
- node.callee.property.type === AST_NODE_TYPES.Identifier &&
15
- node.callee.property.name === 'continueOnFail') {
16
- return true;
17
- }
18
- for (const key of Object.keys(node)) {
19
- if (NON_CHILD_KEYS.has(key))
20
- continue;
21
- const value = node[key];
22
- if (Array.isArray(value)) {
23
- for (const child of value) {
24
- if (child && typeof child === 'object' && 'type' in child) {
25
- if (containsContinueOnFailCall(child)) {
26
- return true;
27
- }
28
- }
29
- }
30
- }
31
- else if (value && typeof value === 'object' && 'type' in value) {
32
- if (containsContinueOnFailCall(value)) {
33
- return true;
34
- }
35
- }
36
- }
37
- return false;
38
- }
39
- export const RequireContinueOnFailRule = createRule({
40
- name: 'require-continue-on-fail',
41
- meta: {
42
- type: 'problem',
43
- docs: {
44
- description: 'Require continueOnFail() handling in execute() methods of node classes',
45
- },
46
- messages: {
47
- missingContinueOnFail: 'execute() method must handle this.continueOnFail() for proper error handling. ' +
48
- 'Wrap item processing in a try/catch and check this.continueOnFail() in the catch block.',
49
- },
50
- schema: [],
51
- },
52
- defaultOptions: [],
53
- create(context) {
54
- return {
55
- ClassDeclaration(node) {
56
- if (!isNodeTypeClass(node)) {
57
- return;
58
- }
59
- for (const member of node.body.body) {
60
- if (member.type !== AST_NODE_TYPES.MethodDefinition ||
61
- member.key.type !== AST_NODE_TYPES.Identifier ||
62
- member.key.name !== 'execute') {
63
- continue;
64
- }
65
- if (member.value.body && !containsContinueOnFailCall(member.value.body)) {
66
- context.report({
67
- node: member.key,
68
- messageId: 'missingContinueOnFail',
69
- });
70
- }
71
- }
72
- },
73
- };
74
- },
75
- });
76
- //# sourceMappingURL=require-continue-on-fail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-continue-on-fail.js","sourceRoot":"","sources":["../../src/rules/require-continue-on-fail.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const RequireMitLicenseRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingLicense" | "wrongLicense", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
- //# sourceMappingURL=require-mit-license.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-mit-license.d.ts","sourceRoot":"","sources":["../../src/rules/require-mit-license.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,qBAAqB,oKAyDhC,CAAC"}
@@ -1,57 +0,0 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
2
- import { createRule, findJsonProperty, getStringLiteralValue } from '../utils/index.js';
3
- const REQUIRED_LICENSE = 'MIT';
4
- export const RequireMitLicenseRule = createRule({
5
- name: 'require-mit-license',
6
- meta: {
7
- type: 'problem',
8
- docs: {
9
- description: 'Require the "license" field in community node package.json to be "MIT"',
10
- },
11
- fixable: 'code',
12
- messages: {
13
- missingLicense: `The package.json must have a "license" field set to "${REQUIRED_LICENSE}".`,
14
- wrongLicense: `The "license" field must be "${REQUIRED_LICENSE}".`,
15
- },
16
- schema: [],
17
- },
18
- defaultOptions: [],
19
- create(context) {
20
- if (!context.filename.endsWith('package.json')) {
21
- return {};
22
- }
23
- return {
24
- ObjectExpression(node) {
25
- if (node.parent?.type !== AST_NODE_TYPES.ExpressionStatement) {
26
- return;
27
- }
28
- const licenseProp = findJsonProperty(node, 'license');
29
- if (!licenseProp) {
30
- context.report({
31
- node,
32
- messageId: 'missingLicense',
33
- fix(fixer) {
34
- const lastProp = node.properties[node.properties.length - 1];
35
- if (!lastProp) {
36
- return fixer.replaceText(node, `{ "license": "${REQUIRED_LICENSE}" }`);
37
- }
38
- return fixer.insertTextAfter(lastProp, `, "license": "${REQUIRED_LICENSE}"`);
39
- },
40
- });
41
- return;
42
- }
43
- if (getStringLiteralValue(licenseProp.value) === REQUIRED_LICENSE) {
44
- return;
45
- }
46
- context.report({
47
- node: licenseProp.value,
48
- messageId: 'wrongLicense',
49
- fix(fixer) {
50
- return fixer.replaceText(licenseProp.value, `"${REQUIRED_LICENSE}"`);
51
- },
52
- });
53
- },
54
- };
55
- },
56
- });
57
- //# sourceMappingURL=require-mit-license.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-mit-license.js","sourceRoot":"","sources":["../../src/rules/require-mit-license.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;IAC/C,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EAAE,wEAAwE;SACrF;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACT,cAAc,EAAE,wDAAwD,gBAAgB,IAAI;YAC5F,YAAY,EAAE,gCAAgC,gBAAgB,IAAI;SAClE;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,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,mBAAmB,EAAE,CAAC;oBAC9D,OAAO;gBACR,CAAC;gBAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAEtD,IAAI,CAAC,WAAW,EAAE,CAAC;oBAClB,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI;wBACJ,SAAS,EAAE,gBAAgB;wBAC3B,GAAG,CAAC,KAAK;4BACR,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;4BAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACf,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,iBAAiB,gBAAgB,KAAK,CAAC,CAAC;4BACxE,CAAC;4BACD,OAAO,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,iBAAiB,gBAAgB,GAAG,CAAC,CAAC;wBAC9E,CAAC;qBACD,CAAC,CAAC;oBACH,OAAO;gBACR,CAAC;gBAED,IAAI,qBAAqB,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,gBAAgB,EAAE,CAAC;oBACnE,OAAO;gBACR,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACd,IAAI,EAAE,WAAW,CAAC,KAAK;oBACvB,SAAS,EAAE,cAAc;oBACzB,GAAG,CAAC,KAAK;wBACR,OAAO,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,gBAAgB,GAAG,CAAC,CAAC;oBACtE,CAAC;iBACD,CAAC,CAAC;YACJ,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Requires every node parameter to declare a `default` property.
3
- *
4
- * A parameter is detected structurally: an object literal inside a node's
5
- * `description` with `displayName`, `name`, and `type` all set to string
6
- * literals — the shape every `INodeProperties` entry has. This avoids
7
- * hardcoding the `NodePropertyTypes` union (which would silently go stale as
8
- * new types are added) and naturally excludes `options`-array entries, which
9
- * carry `name`/`value` but no `displayName`/`type`.
10
- *
11
- * Without a `default`, n8n cannot reliably initialise the parameter's value,
12
- * which leads to inconsistent runtime behaviour in the editor and on execution.
13
- */
14
- export declare const RequireParamDefaultRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingDefault", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
15
- //# sourceMappingURL=require-param-default.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-param-default.d.ts","sourceRoot":"","sources":["../../src/rules/require-param-default.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA0BH,eAAO,MAAM,uBAAuB,mJAkDlC,CAAC"}
@@ -1,75 +0,0 @@
1
- /**
2
- * Requires every node parameter to declare a `default` property.
3
- *
4
- * A parameter is detected structurally: an object literal inside a node's
5
- * `description` with `displayName`, `name`, and `type` all set to string
6
- * literals — the shape every `INodeProperties` entry has. This avoids
7
- * hardcoding the `NodePropertyTypes` union (which would silently go stale as
8
- * new types are added) and naturally excludes `options`-array entries, which
9
- * carry `name`/`value` but no `displayName`/`type`.
10
- *
11
- * Without a `default`, n8n cannot reliably initialise the parameter's value,
12
- * which leads to inconsistent runtime behaviour in the editor and on execution.
13
- */
14
- import { simpleTraverse } from '@typescript-eslint/typescript-estree';
15
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
16
- import { createRule, findClassProperty, findObjectProperty, getStringLiteralValue, isFileType, isNodeTypeClass, } from '../utils/index.js';
17
- /** Property keys an `INodeProperties` parameter always carries as string literals. */
18
- const REQUIRED_PARAM_KEYS = ['displayName', 'name', 'type'];
19
- /** Returns true when the object literal has the shape of a node parameter. */
20
- function isNodeParameter(node) {
21
- return REQUIRED_PARAM_KEYS.every((key) => {
22
- const property = findObjectProperty(node, key);
23
- return property !== null && getStringLiteralValue(property.value) !== null;
24
- });
25
- }
26
- export const RequireParamDefaultRule = createRule({
27
- name: 'require-param-default',
28
- meta: {
29
- type: 'problem',
30
- docs: {
31
- description: 'Require every node parameter to declare a default value.',
32
- },
33
- messages: {
34
- missingDefault: "Node parameter '{{ name }}' is missing a `default` value. Add a `default` property so the parameter initialises consistently.",
35
- },
36
- schema: [],
37
- },
38
- defaultOptions: [],
39
- create(context) {
40
- if (!isFileType(context.filename, '.node.ts')) {
41
- return {};
42
- }
43
- const reportIfMissingDefault = (node) => {
44
- if (!isNodeParameter(node) || findObjectProperty(node, 'default') !== null) {
45
- return;
46
- }
47
- const nameProperty = findObjectProperty(node, 'name');
48
- context.report({
49
- node,
50
- messageId: 'missingDefault',
51
- data: { name: getStringLiteralValue(nameProperty?.value ?? null) ?? '' },
52
- });
53
- };
54
- return {
55
- // Scope to an INodeType class's `description`, then walk only that
56
- // subtree, so helper classes and object literals elsewhere in the file
57
- // (e.g. in method bodies) that share the parameter shape are ignored.
58
- ClassDeclaration(node) {
59
- if (!isNodeTypeClass(node))
60
- return;
61
- const description = findClassProperty(node, 'description');
62
- if (description?.value?.type !== AST_NODE_TYPES.ObjectExpression)
63
- return;
64
- simpleTraverse(description.value, {
65
- enter(child) {
66
- if (child.type === AST_NODE_TYPES.ObjectExpression) {
67
- reportIfMissingDefault(child);
68
- }
69
- },
70
- });
71
- },
72
- };
73
- },
74
- });
75
- //# sourceMappingURL=require-param-default.js.map