@n8n/workflow-sdk 0.26.0 → 0.27.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/dist/ast-interpreter/index.d.ts +1 -1
- package/dist/ast-interpreter/index.js +2 -1
- package/dist/ast-interpreter/index.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/cli/index.js +19 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/node-definition-dirs.d.ts +6 -0
- package/dist/cli/node-definition-dirs.js +63 -0
- package/dist/cli/node-definition-dirs.js.map +1 -0
- package/dist/cli/validate.d.ts +5 -0
- package/dist/cli/validate.js +203 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/codegen/code-generator.js +4 -1
- package/dist/codegen/code-generator.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/lint/ast-walk.d.ts +7 -0
- package/dist/lint/ast-walk.js +43 -0
- package/dist/lint/ast-walk.js.map +1 -0
- package/dist/lint/code-node/extract-snippets.d.ts +13 -0
- package/dist/lint/code-node/extract-snippets.js +110 -0
- package/dist/lint/code-node/extract-snippets.js.map +1 -0
- package/dist/lint/code-node/js.d.ts +8 -0
- package/dist/lint/code-node/js.js +219 -0
- package/dist/lint/code-node/js.js.map +1 -0
- package/dist/lint/code-node/python.d.ts +5 -0
- package/dist/lint/code-node/python.js +25 -0
- package/dist/lint/code-node/python.js.map +1 -0
- package/dist/lint/index.d.ts +8 -0
- package/dist/lint/index.js +25 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/lint/lint-workflow-source.d.ts +2 -0
- package/dist/lint/lint-workflow-source.js +47 -0
- package/dist/lint/lint-workflow-source.js.map +1 -0
- package/dist/lint/sdk/workflow-sdk-lint.d.ts +12 -0
- package/dist/lint/sdk/workflow-sdk-lint.js +271 -0
- package/dist/lint/sdk/workflow-sdk-lint.js.map +1 -0
- package/dist/lint/types.d.ts +15 -0
- package/dist/lint/types.js +7 -0
- package/dist/lint/types.js.map +1 -0
- package/dist/mock-data/context.d.ts +5 -2
- package/dist/mock-data/context.js +109 -6
- package/dist/mock-data/context.js.map +1 -1
- package/dist/mock-data/index.d.ts +2 -1
- package/dist/mock-data/index.js +4 -1
- package/dist/mock-data/index.js.map +1 -1
- package/dist/mock-data/parse.js +11 -2
- package/dist/mock-data/parse.js.map +1 -1
- package/dist/mock-data/prompt.js +9 -1
- package/dist/mock-data/prompt.js.map +1 -1
- package/dist/mock-data/types.d.ts +12 -0
- package/dist/mock-data/validate.d.ts +10 -0
- package/dist/mock-data/validate.js +77 -0
- package/dist/mock-data/validate.js.map +1 -0
- package/dist/prompts/sdk-reference/sdk-language.js +10 -5
- package/dist/prompts/sdk-reference/sdk-language.js.map +1 -1
- package/dist/types/base.d.ts +9 -1
- package/dist/validation/index.d.ts +7 -34
- package/dist/validation/index.js +22 -698
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/informational-validation-codes.d.ts +1 -0
- package/dist/validation/informational-validation-codes.js +7 -0
- package/dist/validation/informational-validation-codes.js.map +1 -0
- package/dist/validation/issue-severity.d.ts +6 -0
- package/dist/validation/issue-severity.js +24 -0
- package/dist/validation/issue-severity.js.map +1 -0
- package/dist/validation/{resolve-schema.d.ts → node-parameter-schema/resolve-schema.d.ts} +1 -1
- package/dist/validation/{resolve-schema.js → node-parameter-schema/resolve-schema.js} +1 -1
- package/dist/validation/node-parameter-schema/resolve-schema.js.map +1 -0
- package/dist/validation/{schema-helpers.d.ts → node-parameter-schema/schema-helpers.d.ts} +1 -1
- package/dist/validation/{schema-helpers.js → node-parameter-schema/schema-helpers.js} +1 -1
- package/dist/validation/node-parameter-schema/schema-helpers.js.map +1 -0
- package/dist/validation/{schema-validator.js → node-parameter-schema/schema-validator.js} +1 -1
- package/dist/validation/node-parameter-schema/schema-validator.js.map +1 -0
- package/dist/validation/{test-schema-setup.js → node-parameter-schema/test-schema-setup.js} +3 -3
- package/dist/validation/node-parameter-schema/test-schema-setup.js.map +1 -0
- package/dist/validation/{input-resolver.js → node-port-resolvers/resolve-main-input-count.js} +1 -1
- package/dist/validation/node-port-resolvers/resolve-main-input-count.js.map +1 -0
- package/dist/validation/{output-resolver.js → node-port-resolvers/resolve-main-output-count.js} +1 -1
- package/dist/validation/node-port-resolvers/resolve-main-output-count.js.map +1 -0
- package/dist/validation/validate-workflow-builder.d.ts +44 -0
- package/dist/validation/validate-workflow-builder.js +132 -0
- package/dist/validation/validate-workflow-builder.js.map +1 -0
- package/dist/validation/validate-workflow.d.ts +36 -0
- package/dist/validation/validate-workflow.js +723 -0
- package/dist/validation/validate-workflow.js.map +1 -0
- package/dist/validation.d.ts +2 -2
- package/dist/validation.js +6 -2
- package/dist/validation.js.map +1 -1
- package/dist/workflow-builder/plugins/serializers/json-serializer.js +11 -6
- package/dist/workflow-builder/plugins/serializers/json-serializer.js.map +1 -1
- package/dist/workflow-builder/plugins/types.d.ts +6 -7
- package/dist/workflow-builder/plugins/types.js.map +1 -1
- package/dist/workflow-builder/plugins/validators/disconnected-node-validator.js +1 -1
- package/dist/workflow-builder/plugins/validators/disconnected-node-validator.js.map +1 -1
- package/dist/workflow-builder/plugins/validators/missing-trigger-validator.js +1 -1
- package/dist/workflow-builder/plugins/validators/missing-trigger-validator.js.map +1 -1
- package/dist/workflow-builder/workflow-import.d.ts +2 -6
- package/dist/workflow-builder/workflow-import.js +5 -2
- package/dist/workflow-builder/workflow-import.js.map +1 -1
- package/dist/workflow-builder.js +7 -9
- package/dist/workflow-builder.js.map +1 -1
- package/package.json +11 -6
- package/dist/validation/input-resolver.js.map +0 -1
- package/dist/validation/output-resolver.js.map +0 -1
- package/dist/validation/resolve-schema.js.map +0 -1
- package/dist/validation/schema-helpers.js.map +0 -1
- package/dist/validation/schema-validator.js.map +0 -1
- package/dist/validation/test-schema-setup.js.map +0 -1
- /package/dist/validation/{schema-validator.d.ts → node-parameter-schema/schema-validator.d.ts} +0 -0
- /package/dist/validation/{test-schema-setup.d.ts → node-parameter-schema/test-schema-setup.d.ts} +0 -0
- /package/dist/validation/{input-resolver.d.ts → node-port-resolvers/resolve-main-input-count.d.ts} +0 -0
- /package/dist/validation/{output-resolver.d.ts → node-port-resolvers/resolve-main-output-count.d.ts} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Node } from 'estree';
|
|
2
|
+
import type { SourceLintIssue } from './types';
|
|
3
|
+
export declare function walkAst(node: Node, visit: (n: Node, parent: Node | undefined) => void, options?: {
|
|
4
|
+
parent?: Node;
|
|
5
|
+
skipChildren?: (n: Node, parent: Node | undefined) => boolean;
|
|
6
|
+
}): void;
|
|
7
|
+
export declare function dedupeSourceLintIssues(issues: SourceLintIssue[]): SourceLintIssue[];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.walkAst = walkAst;
|
|
4
|
+
exports.dedupeSourceLintIssues = dedupeSourceLintIssues;
|
|
5
|
+
function isEstreeNode(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && 'type' in value;
|
|
7
|
+
}
|
|
8
|
+
function walkAst(node, visit, options = {}) {
|
|
9
|
+
const { parent, skipChildren } = options;
|
|
10
|
+
visit(node, parent);
|
|
11
|
+
if (skipChildren?.(node, parent))
|
|
12
|
+
return;
|
|
13
|
+
for (const key of Object.keys(node)) {
|
|
14
|
+
if (key === 'loc' || key === 'range')
|
|
15
|
+
continue;
|
|
16
|
+
const value = node[key];
|
|
17
|
+
if (!value || typeof value !== 'object')
|
|
18
|
+
continue;
|
|
19
|
+
if (Array.isArray(value)) {
|
|
20
|
+
for (const entry of value) {
|
|
21
|
+
if (isEstreeNode(entry)) {
|
|
22
|
+
walkAst(entry, visit, { parent: node, skipChildren });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (isEstreeNode(value)) {
|
|
27
|
+
walkAst(value, visit, { parent: node, skipChildren });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function dedupeSourceLintIssues(issues) {
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const out = [];
|
|
34
|
+
for (const issue of issues) {
|
|
35
|
+
const key = `${issue.lintTarget}|${issue.code}|${issue.line ?? ''}|${issue.column ?? ''}|${issue.message}`;
|
|
36
|
+
if (seen.has(key))
|
|
37
|
+
continue;
|
|
38
|
+
seen.add(key);
|
|
39
|
+
out.push(issue);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ast-walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-walk.js","sourceRoot":"","sources":["../../src/lint/ast-walk.ts"],"names":[],"mappings":";;;;AAIA,SAAS,YAAY,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AACvE,CAAC;AAMD,iBACC,IAAU,EACV,KAAkD,EAClD,OAAO,GAGH,EAAE;IAEN,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACzC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpB,IAAI,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;QAAE,OAAO;IAEzC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAsB,EAAE,CAAC;QAC1D,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO;YAAE,SAAS;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC3B,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;gBACvD,CAAC;YACF,CAAC;QACF,CAAC;aAAM,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;AACF,CAAC;AAED,gCAAuC,MAAyB;IAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3G,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Node, Program } from 'estree';
|
|
2
|
+
export type CodeExecutionMode = 'runOnceForAllItems' | 'runOnceForEachItem';
|
|
3
|
+
export interface EmbeddedCodeSnippet {
|
|
4
|
+
parameter: 'jsCode' | 'pythonCode';
|
|
5
|
+
code: string;
|
|
6
|
+
line?: number;
|
|
7
|
+
column?: number;
|
|
8
|
+
mode?: CodeExecutionMode;
|
|
9
|
+
}
|
|
10
|
+
export declare function isEmbeddedCodePropertyValue(node: Node, parent: Node | undefined): boolean;
|
|
11
|
+
export declare function buildParentMap(ast: Program): Map<Node, Node>;
|
|
12
|
+
export declare function extractEmbeddedCodeSnippets(ast: Program, source: string, parents?: ReadonlyMap<Node, Node>): EmbeddedCodeSnippet[];
|
|
13
|
+
export declare function extractEmbeddedCodeSnippetsFromSource(source: string): EmbeddedCodeSnippet[];
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isEmbeddedCodePropertyValue = isEmbeddedCodePropertyValue;
|
|
4
|
+
exports.buildParentMap = buildParentMap;
|
|
5
|
+
exports.extractEmbeddedCodeSnippets = extractEmbeddedCodeSnippets;
|
|
6
|
+
exports.extractEmbeddedCodeSnippetsFromSource = extractEmbeddedCodeSnippetsFromSource;
|
|
7
|
+
const ast_interpreter_1 = require("../../ast-interpreter");
|
|
8
|
+
const ast_walk_1 = require("../ast-walk");
|
|
9
|
+
function locationOf(node) {
|
|
10
|
+
if (!node.loc)
|
|
11
|
+
return {};
|
|
12
|
+
return { line: node.loc.start.line, column: node.loc.start.column + 1 };
|
|
13
|
+
}
|
|
14
|
+
function propertyKeyName(key) {
|
|
15
|
+
if (key.type === 'Identifier')
|
|
16
|
+
return key.name;
|
|
17
|
+
if (key.type === 'Literal' && typeof key.value === 'string')
|
|
18
|
+
return key.value;
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
function stringFromNode(node, source) {
|
|
22
|
+
if (node.type === 'Literal' && typeof node.value === 'string') {
|
|
23
|
+
return node.value;
|
|
24
|
+
}
|
|
25
|
+
if (node.type === 'TemplateLiteral' && node.expressions.length === 0) {
|
|
26
|
+
return node.quasis.map((q) => q.value.cooked ?? q.value.raw).join('');
|
|
27
|
+
}
|
|
28
|
+
if ('start' in node &&
|
|
29
|
+
'end' in node &&
|
|
30
|
+
typeof node.start === 'number' &&
|
|
31
|
+
typeof node.end === 'number') {
|
|
32
|
+
const raw = source.slice(node.start, node.end);
|
|
33
|
+
if (node.type === 'TemplateLiteral') {
|
|
34
|
+
return raw.slice(1, raw.endsWith('`') ? -1 : undefined);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
function modeFromObject(obj) {
|
|
40
|
+
for (const prop of obj.properties) {
|
|
41
|
+
if (prop.type !== 'Property' || prop.computed)
|
|
42
|
+
continue;
|
|
43
|
+
if (propertyKeyName(prop.key) !== 'mode')
|
|
44
|
+
continue;
|
|
45
|
+
if (prop.value.type === 'Literal' && typeof prop.value.value === 'string') {
|
|
46
|
+
if (prop.value.value === 'runOnceForEachItem')
|
|
47
|
+
return 'runOnceForEachItem';
|
|
48
|
+
if (prop.value.value === 'runOnceForAllItems')
|
|
49
|
+
return 'runOnceForAllItems';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function enclosingObjectExpression(node, parents) {
|
|
55
|
+
let current = node;
|
|
56
|
+
while (current) {
|
|
57
|
+
if (current.type === 'ObjectExpression')
|
|
58
|
+
return current;
|
|
59
|
+
current = parents.get(current);
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
function isEmbeddedCodePropertyValue(node, parent) {
|
|
64
|
+
if (parent?.type !== 'Property' || parent.computed)
|
|
65
|
+
return false;
|
|
66
|
+
const key = propertyKeyName(parent.key);
|
|
67
|
+
if (key !== 'jsCode' && key !== 'pythonCode')
|
|
68
|
+
return false;
|
|
69
|
+
return node === parent.value;
|
|
70
|
+
}
|
|
71
|
+
function buildParentMap(ast) {
|
|
72
|
+
const parents = new Map();
|
|
73
|
+
(0, ast_walk_1.walkAst)(ast, (node, parent) => {
|
|
74
|
+
if (parent)
|
|
75
|
+
parents.set(node, parent);
|
|
76
|
+
});
|
|
77
|
+
return parents;
|
|
78
|
+
}
|
|
79
|
+
function extractEmbeddedCodeSnippets(ast, source, parents = buildParentMap(ast)) {
|
|
80
|
+
const snippets = [];
|
|
81
|
+
(0, ast_walk_1.walkAst)(ast, (node) => {
|
|
82
|
+
if (node.type !== 'Property' || node.computed)
|
|
83
|
+
return;
|
|
84
|
+
const key = propertyKeyName(node.key);
|
|
85
|
+
if (key !== 'jsCode' && key !== 'pythonCode')
|
|
86
|
+
return;
|
|
87
|
+
const code = stringFromNode(node.value, source);
|
|
88
|
+
if (code === undefined || code.length === 0)
|
|
89
|
+
return;
|
|
90
|
+
const enclosing = enclosingObjectExpression(node, parents);
|
|
91
|
+
snippets.push({
|
|
92
|
+
parameter: key,
|
|
93
|
+
code,
|
|
94
|
+
...locationOf(node.value),
|
|
95
|
+
mode: enclosing ? modeFromObject(enclosing) : undefined,
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
return snippets;
|
|
99
|
+
}
|
|
100
|
+
function extractEmbeddedCodeSnippetsFromSource(source) {
|
|
101
|
+
let ast;
|
|
102
|
+
try {
|
|
103
|
+
ast = (0, ast_interpreter_1.parseSDKCode)(source);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
return extractEmbeddedCodeSnippets(ast, source, buildParentMap(ast));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=extract-snippets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-snippets.js","sourceRoot":"","sources":["../../../src/lint/code-node/extract-snippets.ts"],"names":[],"mappings":";;;;;;AAEA,2DAAqD;AACrD,0CAAsC;AActC,SAAS,UAAU,CAAC,IAAU;IAC7B,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,eAAe,CAAC,GAAoB;IAC5C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IAC9E,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,IAAU,EAAE,MAAc;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IACC,OAAO,IAAI,IAAI;QACf,KAAK,IAAI,IAAI;QACb,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAC9B,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAC3B,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACrC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,GAAqB;IAC5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxD,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM;YAAE,SAAS;QACnD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3E,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,oBAAoB;gBAAE,OAAO,oBAAoB,CAAC;YAC3E,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,oBAAoB;gBAAE,OAAO,oBAAoB,CAAC;QAC5E,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,yBAAyB,CACjC,IAAU,EACV,OAAgC;IAEhC,IAAI,OAAO,GAAqB,IAAI,CAAC;IACrC,OAAO,OAAO,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB;YAAE,OAAO,OAAO,CAAC;QACxD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAGD,qCAA4C,IAAU,EAAE,MAAwB;IAC/E,IAAI,MAAM,EAAE,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjE,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC;AAC9B,CAAC;AAED,wBAA+B,GAAY;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAc,CAAC;IACtC,IAAA,kBAAO,EAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC7B,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AAChB,CAAC;AAKD,qCACC,GAAY,EACZ,MAAc,EACd,OAAO,GAA4B,cAAc,CAAC,GAAG,CAAC;IAEtD,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAE3C,IAAA,kBAAO,EAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtD,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,YAAY;YAAE,OAAO;QAErD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpD,MAAM,SAAS,GAAG,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC;YACb,SAAS,EAAE,GAAG;YACd,IAAI;YACJ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;SACvD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AACjB,CAAC;AAGD,+CAAsD,MAAc;IACnE,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACJ,GAAG,GAAG,IAAA,8BAAY,EAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CodeExecutionMode } from './extract-snippets';
|
|
2
|
+
import { type SourceLintIssue } from '../types';
|
|
3
|
+
export interface LintJsCodeOptions {
|
|
4
|
+
mode?: CodeExecutionMode;
|
|
5
|
+
nodeName?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function lintJsCode(jsCode: string, options?: LintJsCodeOptions): SourceLintIssue[];
|
|
8
|
+
export declare function hasNestedTemplateLiterals(jsCode: string): boolean;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.lintJsCode = lintJsCode;
|
|
37
|
+
exports.hasNestedTemplateLiterals = hasNestedTemplateLiterals;
|
|
38
|
+
const acorn = __importStar(require("acorn"));
|
|
39
|
+
const ast_walk_1 = require("../ast-walk");
|
|
40
|
+
const types_1 = require("../types");
|
|
41
|
+
const NETWORK_CALLEE_NAMES = new Set(['fetch', 'axios', 'XMLHttpRequest']);
|
|
42
|
+
const HTTP_MODULES = new Set([
|
|
43
|
+
'http',
|
|
44
|
+
'https',
|
|
45
|
+
'http2',
|
|
46
|
+
'node-fetch',
|
|
47
|
+
'axios',
|
|
48
|
+
'got',
|
|
49
|
+
'undici',
|
|
50
|
+
'node:http',
|
|
51
|
+
'node:https',
|
|
52
|
+
'node:http2',
|
|
53
|
+
]);
|
|
54
|
+
const FORBIDDEN_MODULE_PREFIXES = ['luxon', 'openai', '@openai/', 'langchain', '@langchain/'];
|
|
55
|
+
const EACH_ITEM_DISALLOWED_INPUT_METHODS = new Set(['first', 'last', 'all', 'itemMatching']);
|
|
56
|
+
function parseJs(code) {
|
|
57
|
+
const opts = {
|
|
58
|
+
ecmaVersion: 'latest',
|
|
59
|
+
locations: true,
|
|
60
|
+
allowReturnOutsideFunction: true,
|
|
61
|
+
};
|
|
62
|
+
try {
|
|
63
|
+
return acorn.parse(code, { ...opts, sourceType: 'script' });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
try {
|
|
67
|
+
return acorn.parse(code, { ...opts, sourceType: 'module' });
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function stringLiteralArg(node) {
|
|
75
|
+
if (!node)
|
|
76
|
+
return undefined;
|
|
77
|
+
if (node.type === 'Literal' && typeof node.value === 'string')
|
|
78
|
+
return node.value;
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
function isRequireCall(call) {
|
|
82
|
+
return call.callee.type === 'Identifier' && call.callee.name === 'require';
|
|
83
|
+
}
|
|
84
|
+
function moduleSpecifierFromCall(call) {
|
|
85
|
+
if (isRequireCall(call)) {
|
|
86
|
+
return stringLiteralArg(call.arguments[0]);
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
function moduleIsForbidden(specifier) {
|
|
91
|
+
return FORBIDDEN_MODULE_PREFIXES.some((prefix) => specifier === prefix || specifier.startsWith(prefix));
|
|
92
|
+
}
|
|
93
|
+
function hasNestedTemplateLiteral(ast) {
|
|
94
|
+
let found = false;
|
|
95
|
+
(0, ast_walk_1.walkAst)(ast, (node) => {
|
|
96
|
+
if (found || node.type !== 'TemplateLiteral')
|
|
97
|
+
return;
|
|
98
|
+
for (const expr of node.expressions) {
|
|
99
|
+
let nested = false;
|
|
100
|
+
(0, ast_walk_1.walkAst)(expr, (inner) => {
|
|
101
|
+
if (inner.type === 'TemplateLiteral')
|
|
102
|
+
nested = true;
|
|
103
|
+
});
|
|
104
|
+
if (nested) {
|
|
105
|
+
found = true;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return found;
|
|
111
|
+
}
|
|
112
|
+
function lintJsCode(jsCode, options = {}) {
|
|
113
|
+
if (jsCode.length === 0)
|
|
114
|
+
return [];
|
|
115
|
+
const ast = parseJs(jsCode);
|
|
116
|
+
if (!ast)
|
|
117
|
+
return [];
|
|
118
|
+
const issues = [];
|
|
119
|
+
const namePrefix = options.nodeName ? `'${options.nodeName}' ` : '';
|
|
120
|
+
let sawNetwork = false;
|
|
121
|
+
let sawForbiddenImport = false;
|
|
122
|
+
let disallowedInputMethod;
|
|
123
|
+
(0, ast_walk_1.walkAst)(ast, (node) => {
|
|
124
|
+
if (node.type === 'ImportDeclaration') {
|
|
125
|
+
const source = node.source.type === 'Literal' ? String(node.source.value) : '';
|
|
126
|
+
if (moduleIsForbidden(source))
|
|
127
|
+
sawForbiddenImport = true;
|
|
128
|
+
if (HTTP_MODULES.has(source))
|
|
129
|
+
sawNetwork = true;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (node.type === 'ImportExpression') {
|
|
133
|
+
const mod = stringLiteralArg(node.source);
|
|
134
|
+
if (mod) {
|
|
135
|
+
if (HTTP_MODULES.has(mod))
|
|
136
|
+
sawNetwork = true;
|
|
137
|
+
if (moduleIsForbidden(mod))
|
|
138
|
+
sawForbiddenImport = true;
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (node.type === 'CallExpression') {
|
|
143
|
+
const call = node;
|
|
144
|
+
if (call.callee.type === 'Identifier' && NETWORK_CALLEE_NAMES.has(call.callee.name)) {
|
|
145
|
+
sawNetwork = true;
|
|
146
|
+
}
|
|
147
|
+
if (call.callee.type === 'MemberExpression' &&
|
|
148
|
+
!call.callee.computed &&
|
|
149
|
+
call.callee.property.type === 'Identifier' &&
|
|
150
|
+
EACH_ITEM_DISALLOWED_INPUT_METHODS.has(call.callee.property.name) &&
|
|
151
|
+
call.callee.object.type === 'Identifier' &&
|
|
152
|
+
call.callee.object.name === '$input' &&
|
|
153
|
+
disallowedInputMethod === undefined) {
|
|
154
|
+
disallowedInputMethod = call.callee.property.name;
|
|
155
|
+
}
|
|
156
|
+
const required = moduleSpecifierFromCall(call);
|
|
157
|
+
if (required) {
|
|
158
|
+
if (HTTP_MODULES.has(required))
|
|
159
|
+
sawNetwork = true;
|
|
160
|
+
if (moduleIsForbidden(required))
|
|
161
|
+
sawForbiddenImport = true;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (node.type === 'NewExpression' &&
|
|
165
|
+
node.callee.type === 'Identifier' &&
|
|
166
|
+
node.callee.name === 'XMLHttpRequest') {
|
|
167
|
+
sawNetwork = true;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
if (sawNetwork) {
|
|
171
|
+
issues.push((0, types_1.lintIssue)({
|
|
172
|
+
code: 'CODE_NODE_NETWORK_CALL',
|
|
173
|
+
message: `${namePrefix}Code node calls fetch/axios/XMLHttpRequest or requires an HTTP module. ` +
|
|
174
|
+
'Code nodes have no network access at runtime — make the HTTP/API call with an HTTP Request node ' +
|
|
175
|
+
'and transform its output in the Code node instead.',
|
|
176
|
+
lintTarget: 'jsCode',
|
|
177
|
+
nodeName: options.nodeName,
|
|
178
|
+
parameterPath: 'jsCode',
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
if (sawForbiddenImport) {
|
|
182
|
+
issues.push((0, types_1.lintIssue)({
|
|
183
|
+
code: 'CODE_NODE_FORBIDDEN_IMPORT',
|
|
184
|
+
message: `${namePrefix}Code node imports a module unavailable in the sandbox (luxon, openai, langchain, …). ` +
|
|
185
|
+
'Use JavaScript `Date`/`Intl`, `$now`/`$today`, existing workflow data, or dedicated AI nodes instead.',
|
|
186
|
+
lintTarget: 'jsCode',
|
|
187
|
+
nodeName: options.nodeName,
|
|
188
|
+
parameterPath: 'jsCode',
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
if (options.mode === 'runOnceForEachItem' && disallowedInputMethod !== undefined) {
|
|
192
|
+
issues.push((0, types_1.lintIssue)({
|
|
193
|
+
code: 'CODE_MODE_API_MISUSE',
|
|
194
|
+
message: `${namePrefix}uses mode: 'runOnceForEachItem' but calls $input.${disallowedInputMethod}(). ` +
|
|
195
|
+
`$input.${disallowedInputMethod}() is only available in runOnceForAllItems (the default). ` +
|
|
196
|
+
'Switch mode to runOnceForAllItems, or use $input.item / $json for per-item work.',
|
|
197
|
+
lintTarget: 'jsCode',
|
|
198
|
+
nodeName: options.nodeName,
|
|
199
|
+
parameterPath: 'jsCode',
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
if (hasNestedTemplateLiteral(ast)) {
|
|
203
|
+
issues.push((0, types_1.lintIssue)({
|
|
204
|
+
code: 'CODE_NESTED_TEMPLATE_LITERAL',
|
|
205
|
+
message: `${namePrefix}Code node uses nested template literals, which often break after save. ` +
|
|
206
|
+
'Build multi-line strings with arrays joined by a runtime separator, e.g. ' +
|
|
207
|
+
'`const LF = String.fromCharCode(10); return lines.join(LF);`.',
|
|
208
|
+
lintTarget: 'jsCode',
|
|
209
|
+
nodeName: options.nodeName,
|
|
210
|
+
parameterPath: 'jsCode',
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
return issues;
|
|
214
|
+
}
|
|
215
|
+
function hasNestedTemplateLiterals(jsCode) {
|
|
216
|
+
const ast = parseJs(jsCode);
|
|
217
|
+
return ast ? hasNestedTemplateLiteral(ast) : false;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=js.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js.js","sourceRoot":"","sources":["../../../src/lint/code-node/js.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.lintPythonCode = lintPythonCode;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const PYTHON_NETWORK_IMPORT = /(?:^|\n)\s*(?:import|from)\s+(?:requests|urllib(?:\.[\w.]+)?|httpx|aiohttp|http\.client)\b/m;
|
|
6
|
+
const PYTHON_NETWORK_FROM_IMPORT = /(?:^|\n)\s*from\s+http\s+import\s+client\b/m;
|
|
7
|
+
function lintPythonCode(pythonCode, options = {}) {
|
|
8
|
+
if (pythonCode.length === 0)
|
|
9
|
+
return [];
|
|
10
|
+
const issues = [];
|
|
11
|
+
const namePrefix = options.nodeName ? `'${options.nodeName}' ` : '';
|
|
12
|
+
if (PYTHON_NETWORK_IMPORT.test(pythonCode) || PYTHON_NETWORK_FROM_IMPORT.test(pythonCode)) {
|
|
13
|
+
issues.push((0, types_1.lintIssue)({
|
|
14
|
+
code: 'CODE_NODE_NETWORK_CALL',
|
|
15
|
+
message: `${namePrefix}Code node uses requests/urllib/httpx or another HTTP library. ` +
|
|
16
|
+
'Code nodes have no network access at runtime — make the HTTP/API call with an HTTP Request node ' +
|
|
17
|
+
'and process its output in this node instead.',
|
|
18
|
+
lintTarget: 'pythonCode',
|
|
19
|
+
nodeName: options.nodeName,
|
|
20
|
+
parameterPath: 'pythonCode',
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
return issues;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/lint/code-node/python.ts"],"names":[],"mappings":";;;AAAA,oCAA2D;AAG3D,MAAM,qBAAqB,GAC1B,6FAA6F,CAAC;AAG/F,MAAM,0BAA0B,GAAG,6CAA6C,CAAC;AASjF,wBACC,UAAkB,EAClB,OAAO,GAA0B,EAAE;IAEnC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpE,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3F,MAAM,CAAC,IAAI,CACV,IAAA,iBAAS,EAAC;YACT,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EACN,GAAG,UAAU,gEAAgE;gBAC7E,kGAAkG;gBAClG,8CAA8C;YAC/C,UAAU,EAAE,YAAY;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,aAAa,EAAE,YAAY;SAC3B,CAAC,CACF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { LintTarget, SourceLintIssue } from './types';
|
|
2
|
+
export { lintIssue } from './types';
|
|
3
|
+
export { walkAst, dedupeSourceLintIssues } from './ast-walk';
|
|
4
|
+
export { lintWorkflowSource } from './lint-workflow-source';
|
|
5
|
+
export { prepareSourceForLint, lintWorkflowSdkSource, lintWorkflowSdkAst, } from './sdk/workflow-sdk-lint';
|
|
6
|
+
export { lintJsCode, hasNestedTemplateLiterals } from './code-node/js';
|
|
7
|
+
export { lintPythonCode } from './code-node/python';
|
|
8
|
+
export { extractEmbeddedCodeSnippets, extractEmbeddedCodeSnippetsFromSource, isEmbeddedCodePropertyValue, buildParentMap, type CodeExecutionMode, type EmbeddedCodeSnippet, } from './code-node/extract-snippets';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildParentMap = exports.isEmbeddedCodePropertyValue = exports.extractEmbeddedCodeSnippetsFromSource = exports.extractEmbeddedCodeSnippets = exports.lintPythonCode = exports.hasNestedTemplateLiterals = exports.lintJsCode = exports.lintWorkflowSdkAst = exports.lintWorkflowSdkSource = exports.prepareSourceForLint = exports.lintWorkflowSource = exports.dedupeSourceLintIssues = exports.walkAst = exports.lintIssue = void 0;
|
|
4
|
+
var types_1 = require("./types");
|
|
5
|
+
Object.defineProperty(exports, "lintIssue", { enumerable: true, get: function () { return types_1.lintIssue; } });
|
|
6
|
+
var ast_walk_1 = require("./ast-walk");
|
|
7
|
+
Object.defineProperty(exports, "walkAst", { enumerable: true, get: function () { return ast_walk_1.walkAst; } });
|
|
8
|
+
Object.defineProperty(exports, "dedupeSourceLintIssues", { enumerable: true, get: function () { return ast_walk_1.dedupeSourceLintIssues; } });
|
|
9
|
+
var lint_workflow_source_1 = require("./lint-workflow-source");
|
|
10
|
+
Object.defineProperty(exports, "lintWorkflowSource", { enumerable: true, get: function () { return lint_workflow_source_1.lintWorkflowSource; } });
|
|
11
|
+
var workflow_sdk_lint_1 = require("./sdk/workflow-sdk-lint");
|
|
12
|
+
Object.defineProperty(exports, "prepareSourceForLint", { enumerable: true, get: function () { return workflow_sdk_lint_1.prepareSourceForLint; } });
|
|
13
|
+
Object.defineProperty(exports, "lintWorkflowSdkSource", { enumerable: true, get: function () { return workflow_sdk_lint_1.lintWorkflowSdkSource; } });
|
|
14
|
+
Object.defineProperty(exports, "lintWorkflowSdkAst", { enumerable: true, get: function () { return workflow_sdk_lint_1.lintWorkflowSdkAst; } });
|
|
15
|
+
var js_1 = require("./code-node/js");
|
|
16
|
+
Object.defineProperty(exports, "lintJsCode", { enumerable: true, get: function () { return js_1.lintJsCode; } });
|
|
17
|
+
Object.defineProperty(exports, "hasNestedTemplateLiterals", { enumerable: true, get: function () { return js_1.hasNestedTemplateLiterals; } });
|
|
18
|
+
var python_1 = require("./code-node/python");
|
|
19
|
+
Object.defineProperty(exports, "lintPythonCode", { enumerable: true, get: function () { return python_1.lintPythonCode; } });
|
|
20
|
+
var extract_snippets_1 = require("./code-node/extract-snippets");
|
|
21
|
+
Object.defineProperty(exports, "extractEmbeddedCodeSnippets", { enumerable: true, get: function () { return extract_snippets_1.extractEmbeddedCodeSnippets; } });
|
|
22
|
+
Object.defineProperty(exports, "extractEmbeddedCodeSnippetsFromSource", { enumerable: true, get: function () { return extract_snippets_1.extractEmbeddedCodeSnippetsFromSource; } });
|
|
23
|
+
Object.defineProperty(exports, "isEmbeddedCodePropertyValue", { enumerable: true, get: function () { return extract_snippets_1.isEmbeddedCodePropertyValue; } });
|
|
24
|
+
Object.defineProperty(exports, "buildParentMap", { enumerable: true, get: function () { return extract_snippets_1.buildParentMap; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lint/index.ts"],"names":[],"mappings":";;;AAQA,iCAAoC;AAA3B,kGAAA,SAAS,OAAA;AAClB,uCAA6D;AAApD,mGAAA,OAAO,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AACxC,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,6DAIiC;AAHhC,yHAAA,oBAAoB,OAAA;AACpB,0HAAA,qBAAqB,OAAA;AACrB,uHAAA,kBAAkB,OAAA;AAEnB,qCAAuE;AAA9D,gGAAA,UAAU,OAAA;AAAE,+GAAA,yBAAyB,OAAA;AAC9C,6CAAoD;AAA3C,wGAAA,cAAc,OAAA;AACvB,iEAOsC;AANrC,+HAAA,2BAA2B,OAAA;AAC3B,yIAAA,qCAAqC,OAAA;AACrC,+HAAA,2BAA2B,OAAA;AAC3B,kHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.lintWorkflowSource = lintWorkflowSource;
|
|
4
|
+
const ast_interpreter_1 = require("../ast-interpreter");
|
|
5
|
+
const ast_walk_1 = require("./ast-walk");
|
|
6
|
+
const extract_snippets_1 = require("./code-node/extract-snippets");
|
|
7
|
+
const js_1 = require("./code-node/js");
|
|
8
|
+
const python_1 = require("./code-node/python");
|
|
9
|
+
const workflow_sdk_lint_1 = require("./sdk/workflow-sdk-lint");
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
function lintWorkflowSource(source) {
|
|
12
|
+
const { code, asConstMatches } = (0, workflow_sdk_lint_1.prepareSourceForLint)(source);
|
|
13
|
+
let ast;
|
|
14
|
+
try {
|
|
15
|
+
ast = (0, ast_interpreter_1.parseSDKCode)(code);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return (0, ast_walk_1.dedupeSourceLintIssues)(asConstMatches.map((match) => (0, types_1.lintIssue)({
|
|
19
|
+
code: 'SDK_AS_CONST',
|
|
20
|
+
message: '`as const` is TypeScript-only and the workflow parser cannot interpret it. Remove the assertion.',
|
|
21
|
+
line: match.line,
|
|
22
|
+
column: match.column + 1,
|
|
23
|
+
lintTarget: 'sdk',
|
|
24
|
+
})));
|
|
25
|
+
}
|
|
26
|
+
const sdkIssues = (0, workflow_sdk_lint_1.lintWorkflowSdkAst)(ast, asConstMatches);
|
|
27
|
+
const parents = (0, extract_snippets_1.buildParentMap)(ast);
|
|
28
|
+
const snippets = (0, extract_snippets_1.extractEmbeddedCodeSnippets)(ast, code, parents);
|
|
29
|
+
const embeddedIssues = [];
|
|
30
|
+
for (const snippet of snippets) {
|
|
31
|
+
const base = { line: snippet.line, column: snippet.column };
|
|
32
|
+
if (snippet.parameter === 'jsCode') {
|
|
33
|
+
embeddedIssues.push(...(0, js_1.lintJsCode)(snippet.code, { mode: snippet.mode }).map((issue) => ({
|
|
34
|
+
...issue,
|
|
35
|
+
...base,
|
|
36
|
+
})));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
embeddedIssues.push(...(0, python_1.lintPythonCode)(snippet.code).map((issue) => ({
|
|
40
|
+
...issue,
|
|
41
|
+
...base,
|
|
42
|
+
})));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return (0, ast_walk_1.dedupeSourceLintIssues)([...sdkIssues, ...embeddedIssues]);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=lint-workflow-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-workflow-source.js","sourceRoot":"","sources":["../../src/lint/lint-workflow-source.ts"],"names":[],"mappings":";;;AAAA,wDAAkD;AAClD,yCAAoD;AACpD,mEAA2F;AAC3F,uCAA4C;AAC5C,+CAAoD;AACpD,+DAAmF;AACnF,mCAA0D;AAM1D,4BAAmC,MAAc;IAChD,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,IAAA,wCAAoB,EAAC,MAAM,CAAC,CAAC;IAE9D,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACJ,GAAG,GAAG,IAAA,8BAAY,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QAER,OAAO,IAAA,iCAAsB,EAC5B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,IAAA,iBAAS,EAAC;YACT,IAAI,EAAE,cAAc;YACpB,OAAO,EACN,kGAAkG;YACnG,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;YACxB,UAAU,EAAE,KAAc;SAC1B,CAAC,CACF,CACD,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,sCAAkB,EAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAA,iCAAc,EAAC,GAAG,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAA,8CAA2B,EAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEjE,MAAM,cAAc,GAAsB,EAAE,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5D,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACpC,cAAc,CAAC,IAAI,CAClB,GAAG,IAAA,eAAU,EAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnE,GAAG,KAAK;gBACR,GAAG,IAAI;aACP,CAAC,CAAC,CACH,CAAC;QACH,CAAC;aAAM,CAAC;YACP,cAAc,CAAC,IAAI,CAClB,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC/C,GAAG,KAAK;gBACR,GAAG,IAAI;aACP,CAAC,CAAC,CACH,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,IAAA,iCAAsB,EAAC,CAAC,GAAG,SAAS,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Program } from 'estree';
|
|
2
|
+
import { type SourceLintIssue } from '../types';
|
|
3
|
+
export interface AsConstMatch {
|
|
4
|
+
line: number;
|
|
5
|
+
column: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function prepareSourceForLint(source: string): {
|
|
8
|
+
code: string;
|
|
9
|
+
asConstMatches: AsConstMatch[];
|
|
10
|
+
};
|
|
11
|
+
export declare function lintWorkflowSdkAst(ast: Program, asConstMatches?: AsConstMatch[]): SourceLintIssue[];
|
|
12
|
+
export declare function lintWorkflowSdkSource(source: string): SourceLintIssue[];
|