@n8n/eslint-plugin-community-nodes 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/README.md +5 -0
- package/dist/plugin.d.ts +36 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +12 -0
- package/dist/plugin.js.map +1 -1
- package/dist/rules/cred-class-name-suffix.d.ts +2 -0
- package/dist/rules/cred-class-name-suffix.d.ts.map +1 -0
- package/dist/rules/cred-class-name-suffix.js +53 -0
- package/dist/rules/cred-class-name-suffix.js.map +1 -0
- package/dist/rules/cred-class-oauth2-naming.d.ts +2 -0
- package/dist/rules/cred-class-oauth2-naming.d.ts.map +1 -0
- package/dist/rules/cred-class-oauth2-naming.js +96 -0
- package/dist/rules/cred-class-oauth2-naming.js.map +1 -0
- package/dist/rules/index.d.ts +8 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +12 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/n8n-object-validation.d.ts +5 -0
- package/dist/rules/n8n-object-validation.d.ts.map +1 -0
- package/dist/rules/n8n-object-validation.js +148 -0
- package/dist/rules/n8n-object-validation.js.map +1 -0
- package/dist/rules/no-builder-hint-leakage.d.ts +7 -0
- package/dist/rules/no-builder-hint-leakage.d.ts.map +1 -0
- package/dist/rules/no-builder-hint-leakage.js +99 -0
- package/dist/rules/no-builder-hint-leakage.js.map +1 -0
- package/dist/rules/no-overrides-field.js +1 -1
- package/dist/rules/no-overrides-field.js.map +1 -1
- package/dist/rules/no-template-placeholders.d.ts +2 -0
- package/dist/rules/no-template-placeholders.d.ts.map +1 -0
- package/dist/rules/no-template-placeholders.js +57 -0
- package/dist/rules/no-template-placeholders.js.map +1 -0
- package/dist/rules/node-operation-error-itemindex.d.ts +12 -0
- package/dist/rules/node-operation-error-itemindex.d.ts.map +1 -0
- package/dist/rules/node-operation-error-itemindex.js +184 -0
- package/dist/rules/node-operation-error-itemindex.js.map +1 -0
- package/dist/utils/ast-utils.d.ts.map +1 -1
- package/dist/utils/ast-utils.js +5 -1
- package/dist/utils/ast-utils.js.map +1 -1
- package/docs/rules/cred-class-name-suffix.md +46 -0
- package/docs/rules/cred-class-oauth2-naming.md +68 -0
- package/docs/rules/n8n-object-validation.md +93 -0
- package/docs/rules/no-overrides-field.md +5 -5
- package/docs/rules/no-template-placeholders.md +51 -0
- package/docs/rules/node-operation-error-itemindex.md +81 -0
- package/package.json +2 -2
- package/src/plugin.ts +12 -0
- package/src/rules/cred-class-name-suffix.test.ts +74 -0
- package/src/rules/cred-class-name-suffix.ts +57 -0
- package/src/rules/cred-class-oauth2-naming.test.ts +197 -0
- package/src/rules/cred-class-oauth2-naming.ts +118 -0
- package/src/rules/index.ts +12 -0
- package/src/rules/n8n-object-validation.test.ts +202 -0
- package/src/rules/n8n-object-validation.ts +200 -0
- package/src/rules/no-builder-hint-leakage.test.ts +84 -0
- package/src/rules/no-builder-hint-leakage.ts +112 -0
- package/src/rules/no-overrides-field.ts +1 -1
- package/src/rules/no-template-placeholders.test.ts +135 -0
- package/src/rules/no-template-placeholders.ts +68 -0
- package/src/rules/node-operation-error-itemindex.test.ts +280 -0
- package/src/rules/node-operation-error-itemindex.ts +223 -0
- package/src/utils/ast-utils.ts +5 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { createRule, findJsonProperty, getTopLevelObjectInJson } from '../utils/index.js';
|
|
3
|
+
export const N8nObjectValidationRule = createRule({
|
|
4
|
+
name: 'n8n-object-validation',
|
|
5
|
+
meta: {
|
|
6
|
+
type: 'problem',
|
|
7
|
+
docs: {
|
|
8
|
+
description: 'Validate the structure of the "n8n" object in community node package.json (required keys, types, and dist/ paths)',
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
missingN8nObject: 'Community node package.json must contain an "n8n" object describing the package.',
|
|
12
|
+
wrongLocationApiVersion: '"n8nNodesApiVersion" must be inside the "n8n" section, not at the root level of package.json.',
|
|
13
|
+
missingNodesApiVersion: 'The "n8n" object must declare "n8nNodesApiVersion" (a positive integer).',
|
|
14
|
+
invalidNodesApiVersion: '"n8n.n8nNodesApiVersion" must be a positive integer, got {{ value }}.',
|
|
15
|
+
missingN8nNodes: 'The "n8n" object must declare "nodes" as an array of "dist/" paths.',
|
|
16
|
+
n8nNodesNotArray: '"n8n.nodes" must be an array of "dist/" paths.',
|
|
17
|
+
emptyN8nNodes: '"n8n.nodes" must contain at least one path.',
|
|
18
|
+
n8nCredentialsNotArray: '"n8n.credentials" must be an array of "dist/" paths.',
|
|
19
|
+
nodePathNotString: 'Each entry in "n8n.nodes" must be a string starting with "dist/".',
|
|
20
|
+
nodePathNotInDist: 'Path "{{ path }}" in "n8n.nodes" must start with "dist/" (compiled output).',
|
|
21
|
+
credentialPathNotString: 'Each entry in "n8n.credentials" must be a string starting with "dist/".',
|
|
22
|
+
credentialPathNotInDist: 'Path "{{ path }}" in "n8n.credentials" must start with "dist/" (compiled output).',
|
|
23
|
+
invalidStrict: '"n8n.strict" must be a boolean, got {{ value }}.',
|
|
24
|
+
},
|
|
25
|
+
schema: [],
|
|
26
|
+
},
|
|
27
|
+
defaultOptions: [],
|
|
28
|
+
create(context) {
|
|
29
|
+
if (!context.filename.endsWith('package.json')) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
ObjectExpression(node) {
|
|
34
|
+
const root = getTopLevelObjectInJson(node);
|
|
35
|
+
if (!root)
|
|
36
|
+
return;
|
|
37
|
+
// Catch n8nNodesApiVersion accidentally placed at root level.
|
|
38
|
+
const rootApiVersionProp = findJsonProperty(root, 'n8nNodesApiVersion');
|
|
39
|
+
if (rootApiVersionProp) {
|
|
40
|
+
context.report({
|
|
41
|
+
node: rootApiVersionProp,
|
|
42
|
+
messageId: 'wrongLocationApiVersion',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const n8nProp = findJsonProperty(root, 'n8n');
|
|
46
|
+
if (!n8nProp) {
|
|
47
|
+
context.report({
|
|
48
|
+
node: root,
|
|
49
|
+
messageId: 'missingN8nObject',
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (n8nProp.value.type !== AST_NODE_TYPES.ObjectExpression) {
|
|
54
|
+
context.report({
|
|
55
|
+
node: n8nProp,
|
|
56
|
+
messageId: 'missingN8nObject',
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const n8nObject = n8nProp.value;
|
|
61
|
+
validateApiVersion(context, n8nObject);
|
|
62
|
+
validateNodes(context, n8nObject);
|
|
63
|
+
validateCredentials(context, n8nObject);
|
|
64
|
+
validateStrict(context, n8nObject);
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
function validateApiVersion(context, n8nObject) {
|
|
70
|
+
const apiVersionProp = findJsonProperty(n8nObject, 'n8nNodesApiVersion');
|
|
71
|
+
if (!apiVersionProp) {
|
|
72
|
+
context.report({ node: n8nObject, messageId: 'missingNodesApiVersion' });
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const valueNode = apiVersionProp.value;
|
|
76
|
+
if (valueNode.type !== AST_NODE_TYPES.Literal || !isPositiveInteger(valueNode.value)) {
|
|
77
|
+
context.report({
|
|
78
|
+
node: apiVersionProp,
|
|
79
|
+
messageId: 'invalidNodesApiVersion',
|
|
80
|
+
data: {
|
|
81
|
+
value: String(valueNode.type === AST_NODE_TYPES.Literal ? valueNode.value : 'non-literal'),
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function validateStrict(context, n8nObject) {
|
|
87
|
+
const strictProp = findJsonProperty(n8nObject, 'strict');
|
|
88
|
+
if (!strictProp)
|
|
89
|
+
return; // optional
|
|
90
|
+
const valueNode = strictProp.value;
|
|
91
|
+
if (valueNode.type !== AST_NODE_TYPES.Literal || typeof valueNode.value !== 'boolean') {
|
|
92
|
+
context.report({
|
|
93
|
+
node: strictProp,
|
|
94
|
+
messageId: 'invalidStrict',
|
|
95
|
+
data: {
|
|
96
|
+
value: String(valueNode.type === AST_NODE_TYPES.Literal ? valueNode.value : 'non-literal'),
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function validateNodes(context, n8nObject) {
|
|
102
|
+
const nodesProp = findJsonProperty(n8nObject, 'nodes');
|
|
103
|
+
if (!nodesProp) {
|
|
104
|
+
context.report({ node: n8nObject, messageId: 'missingN8nNodes' });
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (nodesProp.value.type !== AST_NODE_TYPES.ArrayExpression) {
|
|
108
|
+
context.report({ node: nodesProp, messageId: 'n8nNodesNotArray' });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const elements = nodesProp.value.elements;
|
|
112
|
+
if (elements.length === 0) {
|
|
113
|
+
context.report({ node: nodesProp, messageId: 'emptyN8nNodes' });
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
validatePathArray(context, elements, 'nodePathNotString', 'nodePathNotInDist');
|
|
117
|
+
}
|
|
118
|
+
function validateCredentials(context, n8nObject) {
|
|
119
|
+
const credentialsProp = findJsonProperty(n8nObject, 'credentials');
|
|
120
|
+
if (!credentialsProp)
|
|
121
|
+
return; // optional
|
|
122
|
+
if (credentialsProp.value.type !== AST_NODE_TYPES.ArrayExpression) {
|
|
123
|
+
context.report({ node: credentialsProp, messageId: 'n8nCredentialsNotArray' });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
validatePathArray(context, credentialsProp.value.elements, 'credentialPathNotString', 'credentialPathNotInDist');
|
|
127
|
+
}
|
|
128
|
+
function validatePathArray(context, elements, notStringMessageId, notInDistMessageId) {
|
|
129
|
+
for (const element of elements) {
|
|
130
|
+
if (!element)
|
|
131
|
+
continue;
|
|
132
|
+
if (element.type !== AST_NODE_TYPES.Literal || typeof element.value !== 'string') {
|
|
133
|
+
context.report({ node: element, messageId: notStringMessageId });
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (!element.value.startsWith('dist/')) {
|
|
137
|
+
context.report({
|
|
138
|
+
node: element,
|
|
139
|
+
messageId: notInDistMessageId,
|
|
140
|
+
data: { path: element.value },
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function isPositiveInteger(value) {
|
|
146
|
+
return typeof value === 'number' && Number.isInteger(value) && value > 0;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=n8n-object-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n8n-object-validation.js","sourceRoot":"","sources":["../../src/rules/n8n-object-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type Options = [{
|
|
2
|
+
scope?: 'builderHint' | 'all';
|
|
3
|
+
}];
|
|
4
|
+
type MessageIds = 'wireExpression' | 'connectionTypeLiteral';
|
|
5
|
+
export declare const NoBuilderHintLeakageRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageIds, Options, unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=no-builder-hint-leakage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-builder-hint-leakage.d.ts","sourceRoot":"","sources":["../../src/rules/no-builder-hint-leakage.ts"],"names":[],"mappings":"AAaA,KAAK,OAAO,GAAG,CAAC;IAAE,KAAK,CAAC,EAAE,aAAa,GAAG,KAAK,CAAA;CAAE,CAAC,CAAC;AACnD,KAAK,UAAU,GAAG,gBAAgB,GAAG,uBAAuB,CAAC;AAyB7D,eAAO,MAAM,wBAAwB,kJAwEnC,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { createRule } from '../utils/index.js';
|
|
3
|
+
const WIRE_EXPRESSION_RE = /={{/;
|
|
4
|
+
const CONNECTION_NAME_GROUP = 'agent|chain|document|embedding|languageModel|memory|outputParser|retriever|reranker|textSplitter|tool|vectorStore';
|
|
5
|
+
const CONNECTION_NAME_RE = new RegExp(`\\bai_(${CONNECTION_NAME_GROUP})\\b`, 'g');
|
|
6
|
+
// Strings that are *exactly* a connection name are structured data values,
|
|
7
|
+
// not prose, so they're allowed (e.g. `connectionType: 'ai_languageModel'`).
|
|
8
|
+
const EXACT_CONNECTION_NAME_RE = new RegExp(`^ai_(${CONNECTION_NAME_GROUP})$`);
|
|
9
|
+
function isPropertyKey(node) {
|
|
10
|
+
const parent = node.parent;
|
|
11
|
+
return parent?.type === AST_NODE_TYPES.Property && parent.key === node;
|
|
12
|
+
}
|
|
13
|
+
function isInsideBuilderHintValue(node) {
|
|
14
|
+
let current = node;
|
|
15
|
+
let parent = current.parent;
|
|
16
|
+
while (parent) {
|
|
17
|
+
if (parent.type === AST_NODE_TYPES.Property &&
|
|
18
|
+
parent.value === current &&
|
|
19
|
+
((parent.key.type === AST_NODE_TYPES.Identifier && parent.key.name === 'builderHint') ||
|
|
20
|
+
(parent.key.type === AST_NODE_TYPES.Literal && parent.key.value === 'builderHint'))) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
current = parent;
|
|
24
|
+
parent = current.parent;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
export const NoBuilderHintLeakageRule = createRule({
|
|
29
|
+
name: 'no-builder-hint-leakage',
|
|
30
|
+
meta: {
|
|
31
|
+
type: 'problem',
|
|
32
|
+
docs: {
|
|
33
|
+
description: 'Disallow wire-format expression syntax (={{...}}) and NodeConnectionType string literals in builderHint texts and AI-builder prompts. Use expr() and SDK-canonical references instead.',
|
|
34
|
+
},
|
|
35
|
+
messages: {
|
|
36
|
+
wireExpression: 'Wire-format expression syntax leaks into {{ ctx }}. Use the expr() SDK helper instead.',
|
|
37
|
+
connectionTypeLiteral: 'NodeConnectionType literal "{{ value }}" leaks wire format into {{ ctx }}. Refer to the SDK helper instead (e.g. languageModel(), tool(), memory()).',
|
|
38
|
+
},
|
|
39
|
+
schema: [
|
|
40
|
+
{
|
|
41
|
+
type: 'object',
|
|
42
|
+
description: 'Configures where the rule scans for forbidden patterns. Default `builderHint` only checks string values inside builderHint property values; `all` checks every string in the file (used for AI-builder prompts).',
|
|
43
|
+
properties: {
|
|
44
|
+
scope: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
enum: ['builderHint', 'all'],
|
|
47
|
+
description: '`builderHint` (default): only flag strings inside builderHint property values. `all`: flag every string literal/template in the file.',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
additionalProperties: false,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
defaultOptions: [{}],
|
|
55
|
+
create(context, [options]) {
|
|
56
|
+
const scope = options.scope ?? 'builderHint';
|
|
57
|
+
const ctx = scope === 'all' ? 'AI-builder prompt' : 'builderHint';
|
|
58
|
+
function reportFor(node, str) {
|
|
59
|
+
if (WIRE_EXPRESSION_RE.test(str)) {
|
|
60
|
+
context.report({ node, messageId: 'wireExpression', data: { ctx } });
|
|
61
|
+
}
|
|
62
|
+
if (EXACT_CONNECTION_NAME_RE.test(str))
|
|
63
|
+
return;
|
|
64
|
+
CONNECTION_NAME_RE.lastIndex = 0;
|
|
65
|
+
let match;
|
|
66
|
+
while ((match = CONNECTION_NAME_RE.exec(str)) !== null) {
|
|
67
|
+
context.report({
|
|
68
|
+
node,
|
|
69
|
+
messageId: 'connectionTypeLiteral',
|
|
70
|
+
data: { value: match[0], ctx },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function shouldCheck(node) {
|
|
75
|
+
if (isPropertyKey(node))
|
|
76
|
+
return false;
|
|
77
|
+
if (scope === 'all')
|
|
78
|
+
return true;
|
|
79
|
+
return isInsideBuilderHintValue(node);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
Literal(node) {
|
|
83
|
+
if (typeof node.value !== 'string')
|
|
84
|
+
return;
|
|
85
|
+
if (!shouldCheck(node))
|
|
86
|
+
return;
|
|
87
|
+
reportFor(node, node.value);
|
|
88
|
+
},
|
|
89
|
+
TemplateLiteral(node) {
|
|
90
|
+
if (!shouldCheck(node))
|
|
91
|
+
return;
|
|
92
|
+
for (const quasi of node.quasis) {
|
|
93
|
+
reportFor(quasi, quasi.value.cooked ?? quasi.value.raw);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=no-builder-hint-leakage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-builder-hint-leakage.js","sourceRoot":"","sources":["../../src/rules/no-builder-hint-leakage.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export const NoOverridesFieldRule = createRule({
|
|
|
8
8
|
description: 'Ban the "overrides" field in community node package.json',
|
|
9
9
|
},
|
|
10
10
|
messages: {
|
|
11
|
-
overridesForbidden: 'The "overrides" field is not allowed in community node packages.
|
|
11
|
+
overridesForbidden: 'The "overrides" field is not allowed in community node packages. Each community package installs into an isolated dependency tree, so overrides do not affect other nodes or n8n core — in practice they are copy-pasted boilerplate with no useful effect. Use the helpers on the execute context (this.helpers.httpRequest, etc.) instead; most community nodes do not need third-party runtime libraries.',
|
|
12
12
|
},
|
|
13
13
|
schema: [],
|
|
14
14
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-overrides-field.js","sourceRoot":"","sources":["../../src/rules/no-overrides-field.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC9C,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EAAE,0DAA0D;SACvE;QACD,QAAQ,EAAE;YACT,kBAAkB,EACjB,
|
|
1
|
+
{"version":3,"file":"no-overrides-field.js","sourceRoot":"","sources":["../../src/rules/no-overrides-field.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC9C,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EAAE,0DAA0D;SACvE;QACD,QAAQ,EAAE;YACT,kBAAkB,EACjB,8YAA8Y;SAC/Y;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,aAAa,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC1D,IAAI,CAAC,aAAa,EAAE,CAAC;oBACpB,OAAO;gBACR,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACd,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,oBAAoB;iBAC/B,CAAC,CAAC;YACJ,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-template-placeholders.d.ts","sourceRoot":"","sources":["../../src/rules/no-template-placeholders.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,0BAA0B,0JA+CrC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { createRule } from '../utils/index.js';
|
|
3
|
+
const ANGLE_PLACEHOLDER = /<[^<>\n]+?>/;
|
|
4
|
+
const MUSTACHE_PLACEHOLDER = /\{\{[^{}\n]+?\}\}/;
|
|
5
|
+
function findPlaceholder(value) {
|
|
6
|
+
const angleMatch = ANGLE_PLACEHOLDER.exec(value);
|
|
7
|
+
if (angleMatch) {
|
|
8
|
+
return { pattern: angleMatch[0], type: 'angle' };
|
|
9
|
+
}
|
|
10
|
+
const mustacheMatch = MUSTACHE_PLACEHOLDER.exec(value);
|
|
11
|
+
if (mustacheMatch) {
|
|
12
|
+
return { pattern: mustacheMatch[0], type: 'mustache' };
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
export const NoTemplatePlaceholdersRule = createRule({
|
|
17
|
+
name: 'no-template-placeholders',
|
|
18
|
+
meta: {
|
|
19
|
+
type: 'problem',
|
|
20
|
+
docs: {
|
|
21
|
+
description: 'Disallow unresolved template placeholders in package.json',
|
|
22
|
+
},
|
|
23
|
+
messages: {
|
|
24
|
+
unresolvedPlaceholder: 'String value contains an unresolved template placeholder "{{ pattern }}". Replace it with a real value before publishing.',
|
|
25
|
+
},
|
|
26
|
+
schema: [],
|
|
27
|
+
},
|
|
28
|
+
defaultOptions: [],
|
|
29
|
+
create(context) {
|
|
30
|
+
if (!context.filename.endsWith('package.json')) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
Literal(node) {
|
|
35
|
+
if (typeof node.value !== 'string') {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Skip property keys — only flag values.
|
|
39
|
+
if (node.parent?.type === AST_NODE_TYPES.Property &&
|
|
40
|
+
node.parent.key === node &&
|
|
41
|
+
!node.parent.computed) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const placeholder = findPlaceholder(node.value);
|
|
45
|
+
if (!placeholder) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
context.report({
|
|
49
|
+
node,
|
|
50
|
+
messageId: 'unresolvedPlaceholder',
|
|
51
|
+
data: { pattern: placeholder.pattern },
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=no-template-placeholders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-template-placeholders.js","sourceRoot":"","sources":["../../src/rules/no-template-placeholders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAEjD,SAAS,eAAe,CAAC,KAAa;IACrC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;IACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC;IACpD,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EAAE,2DAA2D;SACxE;QACD,QAAQ,EAAE;YACT,qBAAqB,EACpB,2HAA2H;SAC5H;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,OAAO,CAAC,IAAsB;gBAC7B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACpC,OAAO;gBACR,CAAC;gBAED,yCAAyC;gBACzC,IACC,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,QAAQ;oBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI;oBACxB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EACpB,CAAC;oBACF,OAAO;gBACR,CAAC;gBAED,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChD,IAAI,CAAC,WAAW,EAAE,CAAC;oBAClB,OAAO;gBACR,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACd,IAAI;oBACJ,SAAS,EAAE,uBAAuB;oBAClC,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE;iBACtC,CAAC,CAAC;YACJ,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
export declare const NodeOperationErrorItemIndexRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingItemIndex", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
12
|
+
//# sourceMappingURL=node-operation-error-itemindex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-operation-error-itemindex.d.ts","sourceRoot":"","sources":["../../src/rules/node-operation-error-itemindex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiFH,eAAO,MAAM,+BAA+B,qJAoI1C,CAAC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flags `new NodeOperationError(...)` or `new NodeApiError(...)` inside item
|
|
3
|
+
* loops in `execute()` methods that omit `{ itemIndex }` from the options
|
|
4
|
+
* argument. Without it, n8n cannot associate the error with the specific item
|
|
5
|
+
* that caused it, breaking per-item error reporting and `continueOnFail`.
|
|
6
|
+
*
|
|
7
|
+
* "Item loop" means a `for` or `for...of` that iterates over the result of
|
|
8
|
+
* `this.getInputData()` (or a variable initialised from it). Errors outside
|
|
9
|
+
* such loops — e.g. in webhook handlers or trigger setup — are not flagged.
|
|
10
|
+
*/
|
|
11
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
12
|
+
import { createRule, findObjectProperty, isFileType, isNodeTypeClass } from '../utils/index.js';
|
|
13
|
+
const ITEM_ERROR_CLASSES = new Set(['NodeOperationError', 'NodeApiError']);
|
|
14
|
+
/** Returns true when `node` is a bare `this.getInputData(...)` call. */
|
|
15
|
+
function isGetInputDataCall(node) {
|
|
16
|
+
return (node.callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
17
|
+
node.callee.object.type === AST_NODE_TYPES.ThisExpression &&
|
|
18
|
+
node.callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
19
|
+
node.callee.property.name === 'getInputData');
|
|
20
|
+
}
|
|
21
|
+
/** Returns true when `node` is `<varName>.length` for any name in `varNames`. */
|
|
22
|
+
function isLengthAccessOnVariable(node, varNames) {
|
|
23
|
+
return (node.type === AST_NODE_TYPES.MemberExpression &&
|
|
24
|
+
!node.computed &&
|
|
25
|
+
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
26
|
+
node.property.name === 'length' &&
|
|
27
|
+
node.object.type === AST_NODE_TYPES.Identifier &&
|
|
28
|
+
varNames.has(node.object.name));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns true when the `for` test condition references `<itemVar>.length`,
|
|
32
|
+
* indicating that the loop iterates over an items array.
|
|
33
|
+
*/
|
|
34
|
+
function isItemForLoop(node, itemVarNames) {
|
|
35
|
+
if (!node.test || node.test.type !== AST_NODE_TYPES.BinaryExpression)
|
|
36
|
+
return false;
|
|
37
|
+
const { left, right } = node.test;
|
|
38
|
+
return (isLengthAccessOnVariable(left, itemVarNames) || isLengthAccessOnVariable(right, itemVarNames));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns true when the `for...of` iterable is an items variable or a direct
|
|
42
|
+
* `this.getInputData()` call.
|
|
43
|
+
*/
|
|
44
|
+
function isItemForOfLoop(node, itemVarNames) {
|
|
45
|
+
const { right } = node;
|
|
46
|
+
if (right.type === AST_NODE_TYPES.Identifier && itemVarNames.has(right.name)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return right.type === AST_NODE_TYPES.CallExpression && isGetInputDataCall(right);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns true when the `NodeOperationError` / `NodeApiError` constructor call
|
|
53
|
+
* already has an `{ itemIndex }` property in its options argument, or when the
|
|
54
|
+
* options argument cannot be statically inspected (variable / spread) — in
|
|
55
|
+
* which case we give the benefit of the doubt.
|
|
56
|
+
*/
|
|
57
|
+
function hasItemIndexOption(node) {
|
|
58
|
+
const { arguments: args } = node;
|
|
59
|
+
if (args.length < 3)
|
|
60
|
+
return false;
|
|
61
|
+
const optionsArg = args[2];
|
|
62
|
+
// Non-object-literal (bare variable reference) — can't statically check, assume OK.
|
|
63
|
+
if (!optionsArg || optionsArg.type !== AST_NODE_TYPES.ObjectExpression) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
// itemIndex must be an explicit own property of the options object.
|
|
67
|
+
// Spread elements (e.g. { ...opts }) are not sufficient — they may not
|
|
68
|
+
// include itemIndex and would silently bypass this requirement.
|
|
69
|
+
return findObjectProperty(optionsArg, 'itemIndex') !== null;
|
|
70
|
+
}
|
|
71
|
+
export const NodeOperationErrorItemIndexRule = createRule({
|
|
72
|
+
name: 'node-operation-error-itemindex',
|
|
73
|
+
meta: {
|
|
74
|
+
type: 'problem',
|
|
75
|
+
docs: {
|
|
76
|
+
description: 'Require { itemIndex } in NodeOperationError / NodeApiError options inside item loops',
|
|
77
|
+
},
|
|
78
|
+
messages: {
|
|
79
|
+
missingItemIndex: '`new {{ errorClass }}(...)` inside an item loop must include `{ itemIndex }` as the ' +
|
|
80
|
+
'third argument so n8n can associate the error with the failing item.',
|
|
81
|
+
},
|
|
82
|
+
schema: [],
|
|
83
|
+
},
|
|
84
|
+
defaultOptions: [],
|
|
85
|
+
create(context) {
|
|
86
|
+
if (!isFileType(context.filename, '.node.ts')) {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
let inNodeTypeClass = false;
|
|
90
|
+
let inExecuteMethod = false;
|
|
91
|
+
/** Names of variables initialised from `this.getInputData()` in the current execute() scope. */
|
|
92
|
+
const itemVariableNames = new Set();
|
|
93
|
+
/** AST nodes for loops that are confirmed item loops. */
|
|
94
|
+
const itemLoopNodes = new Set();
|
|
95
|
+
/** Number of currently open item loops (supports nested loops). */
|
|
96
|
+
let itemLoopDepth = 0;
|
|
97
|
+
function resetExecuteState() {
|
|
98
|
+
inExecuteMethod = false;
|
|
99
|
+
itemVariableNames.clear();
|
|
100
|
+
itemLoopNodes.clear();
|
|
101
|
+
itemLoopDepth = 0;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
ClassDeclaration(node) {
|
|
105
|
+
if (isNodeTypeClass(node)) {
|
|
106
|
+
inNodeTypeClass = true;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
'ClassDeclaration:exit'() {
|
|
110
|
+
inNodeTypeClass = false;
|
|
111
|
+
resetExecuteState();
|
|
112
|
+
},
|
|
113
|
+
MethodDefinition(node) {
|
|
114
|
+
if (inNodeTypeClass &&
|
|
115
|
+
node.key.type === AST_NODE_TYPES.Identifier &&
|
|
116
|
+
node.key.name === 'execute') {
|
|
117
|
+
inExecuteMethod = true;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
'MethodDefinition:exit'(node) {
|
|
121
|
+
if (inExecuteMethod &&
|
|
122
|
+
node.key.type === AST_NODE_TYPES.Identifier &&
|
|
123
|
+
node.key.name === 'execute') {
|
|
124
|
+
resetExecuteState();
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
VariableDeclarator(node) {
|
|
128
|
+
if (!inExecuteMethod)
|
|
129
|
+
return;
|
|
130
|
+
if (!node.init)
|
|
131
|
+
return;
|
|
132
|
+
if (node.id.type !== AST_NODE_TYPES.Identifier)
|
|
133
|
+
return;
|
|
134
|
+
if (node.init.type === AST_NODE_TYPES.CallExpression && isGetInputDataCall(node.init)) {
|
|
135
|
+
itemVariableNames.add(node.id.name);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
ForStatement(node) {
|
|
139
|
+
if (!inExecuteMethod)
|
|
140
|
+
return;
|
|
141
|
+
if (isItemForLoop(node, itemVariableNames)) {
|
|
142
|
+
itemLoopNodes.add(node);
|
|
143
|
+
itemLoopDepth++;
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
'ForStatement:exit'(node) {
|
|
147
|
+
if (itemLoopNodes.has(node)) {
|
|
148
|
+
itemLoopNodes.delete(node);
|
|
149
|
+
itemLoopDepth--;
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
ForOfStatement(node) {
|
|
153
|
+
if (!inExecuteMethod)
|
|
154
|
+
return;
|
|
155
|
+
if (isItemForOfLoop(node, itemVariableNames)) {
|
|
156
|
+
itemLoopNodes.add(node);
|
|
157
|
+
itemLoopDepth++;
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
'ForOfStatement:exit'(node) {
|
|
161
|
+
if (itemLoopNodes.has(node)) {
|
|
162
|
+
itemLoopNodes.delete(node);
|
|
163
|
+
itemLoopDepth--;
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
NewExpression(node) {
|
|
167
|
+
if (itemLoopDepth === 0)
|
|
168
|
+
return;
|
|
169
|
+
if (node.callee.type !== AST_NODE_TYPES.Identifier ||
|
|
170
|
+
!ITEM_ERROR_CLASSES.has(node.callee.name)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (!hasItemIndexOption(node)) {
|
|
174
|
+
context.report({
|
|
175
|
+
node,
|
|
176
|
+
messageId: 'missingItemIndex',
|
|
177
|
+
data: { errorClass: node.callee.name },
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=node-operation-error-itemindex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-operation-error-itemindex.js","sourceRoot":"","sources":["../../src/rules/node-operation-error-itemindex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAezD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAUxE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAE9E;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,EAC/B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAQpC;AAED,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAQ1B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAK5F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAevE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAGjF;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAQ1B;AAED,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,eAAe,GAAG,IAAI,CAMjC;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,EACjC,WAAW,EAAE,MAAM,GACjB,OAAO,CAST;AAED,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAC7B,QAAQ,CAAC,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAezD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAUxE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAE9E;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,EAC/B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAQpC;AAED,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAQ1B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAK5F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAevE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAGjF;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAQ1B;AAED,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,QAAQ,CAAC,gBAAgB,EAC9B,YAAY,EAAE,MAAM,GAClB,QAAQ,CAAC,eAAe,GAAG,IAAI,CAMjC;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,EACjC,WAAW,EAAE,MAAM,GACjB,OAAO,CAST;AAED,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAC7B,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CASlC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,GAAG,OAAO,CAM1E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,GAAG,OAAO,CAO1E;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAA;CAAE,GAAG,IAAI,CA6BjE;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAA;CAAE,GAAG,IAAI,CAG9C;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAO5E;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOvF;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAO9F;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,GAAE,MAAU,EACvB,UAAU,GAAE,MAAU,GACpB,MAAM,EAAE,CAeV"}
|
package/dist/utils/ast-utils.js
CHANGED
|
@@ -76,7 +76,11 @@ export function hasArrayLiteralValue(node, searchValue) {
|
|
|
76
76
|
element.value === searchValue);
|
|
77
77
|
}
|
|
78
78
|
export function getTopLevelObjectInJson(node) {
|
|
79
|
-
|
|
79
|
+
// In a JSON file parsed as JS, the root object is the sole expression of
|
|
80
|
+
// the program, so its parent is an ExpressionStatement. Anything else
|
|
81
|
+
// (Property, ArrayExpression, etc.) is nested and must not be treated as
|
|
82
|
+
// the package root.
|
|
83
|
+
if (node.parent?.type !== AST_NODE_TYPES.ExpressionStatement) {
|
|
80
84
|
return null;
|
|
81
85
|
}
|
|
82
86
|
return node;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,SAAS,mBAAmB,CAAC,IAA+B,EAAE,aAAqB;IAClF,OAAO,CACN,IAAI,CAAC,UAAU,EAAE,IAAI,CACpB,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,iBAAiB;QAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAClD,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,aAAa,CACvC,IAAI,KAAK,CACV,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAA+B;IAC9D,IAAI,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,cAAc,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAA+B;IACpE,OAAO,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,IAA+B,EAC/B,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,CAAC,MAAM,EAAE,EAAE,CACV,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,kBAAkB;QACjD,MAAM,CAAC,GAAG,EAAE,IAAI,KAAK,cAAc,CAAC,UAAU;QAC9C,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CACjC,CAAC;IACF,OAAO,QAAQ,EAAE,IAAI,KAAK,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,GAA8B,EAC9B,YAAoB;IAEpB,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CACnC,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,QAAQ;QACrC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAC/B,CAAC;IACF,OAAO,QAAQ,EAAE,IAAI,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAA0B;IACzD,IAAI,IAAI,EAAE,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAyC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAA0B;IAC/D,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAA0B;IACvD,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,IACC,IAAI,EAAE,IAAI,KAAK,cAAc,CAAC,eAAe;QAC7C,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EACvB,CAAC;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAA0B;IAChE,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,GAA8B,EAC9B,YAAoB;IAEpB,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CACnC,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,QAAQ;QACrC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;QACxC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,YAAY,CAChC,CAAC;IACF,OAAO,QAAQ,EAAE,IAAI,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,GAA8B,EAC9B,YAAoB;IAEpB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,EAAE,CAAC;QAC7D,OAAO,QAAQ,CAAC,KAAK,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,IAAiC,EACjC,WAAmB;IAEnB,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,cAAc,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAEtE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAC9B,CAAC,OAAO,EAAE,EAAE,CACX,OAAO,EAAE,IAAI,KAAK,cAAc,CAAC,OAAO;QACxC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;QACjC,OAAO,CAAC,KAAK,KAAK,WAAW,CAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CACtC,IAA+B;IAE/B,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"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"}
|