@flat8n/cli 0.1.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/LICENSE +21 -0
- package/README.md +155 -0
- package/dist/src/cli/api.d.ts +10 -0
- package/dist/src/cli/api.js +57 -0
- package/dist/src/cli/api.js.map +1 -0
- package/dist/src/cli/build.d.ts +2 -0
- package/dist/src/cli/build.js +162 -0
- package/dist/src/cli/build.js.map +1 -0
- package/dist/src/cli/compile.d.ts +2 -0
- package/dist/src/cli/compile.js +149 -0
- package/dist/src/cli/compile.js.map +1 -0
- package/dist/src/cli/deploy.d.ts +4 -0
- package/dist/src/cli/deploy.js +47 -0
- package/dist/src/cli/deploy.js.map +1 -0
- package/dist/src/cli/dev.d.ts +2 -0
- package/dist/src/cli/dev.js +54 -0
- package/dist/src/cli/dev.js.map +1 -0
- package/dist/src/cli/init.d.ts +1 -0
- package/dist/src/cli/init.js +237 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/main.d.ts +2 -0
- package/dist/src/cli/main.js +249 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/run.d.ts +2 -0
- package/dist/src/cli/run.js +84 -0
- package/dist/src/cli/run.js.map +1 -0
- package/dist/src/cli/server.d.ts +2 -0
- package/dist/src/cli/server.js +62 -0
- package/dist/src/cli/server.js.map +1 -0
- package/dist/src/cli/setup.d.ts +1 -0
- package/dist/src/cli/setup.js +62 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/sync.d.ts +4 -0
- package/dist/src/cli/sync.js +45 -0
- package/dist/src/cli/sync.js.map +1 -0
- package/dist/src/cli/ui.d.ts +5 -0
- package/dist/src/cli/ui.js +66 -0
- package/dist/src/cli/ui.js.map +1 -0
- package/dist/src/compiler/analyze.d.ts +15 -0
- package/dist/src/compiler/analyze.js +26 -0
- package/dist/src/compiler/analyze.js.map +1 -0
- package/dist/src/compiler/diagnostics.d.ts +28 -0
- package/dist/src/compiler/diagnostics.js +26 -0
- package/dist/src/compiler/diagnostics.js.map +1 -0
- package/dist/src/compiler/inputs.d.ts +30 -0
- package/dist/src/compiler/inputs.js +2 -0
- package/dist/src/compiler/inputs.js.map +1 -0
- package/dist/src/compiler/json.d.ts +15 -0
- package/dist/src/compiler/json.js +83 -0
- package/dist/src/compiler/json.js.map +1 -0
- package/dist/src/compiler/link.d.ts +18 -0
- package/dist/src/compiler/link.js +84 -0
- package/dist/src/compiler/link.js.map +1 -0
- package/dist/src/compiler/stable-json.d.ts +3 -0
- package/dist/src/compiler/stable-json.js +18 -0
- package/dist/src/compiler/stable-json.js.map +1 -0
- package/dist/src/compiler/validate.d.ts +9 -0
- package/dist/src/compiler/validate.js +25 -0
- package/dist/src/compiler/validate.js.map +1 -0
- package/dist/src/compiler/watch.d.ts +19 -0
- package/dist/src/compiler/watch.js +67 -0
- package/dist/src/compiler/watch.js.map +1 -0
- package/dist/src/compiler/workflow-file.d.ts +2 -0
- package/dist/src/compiler/workflow-file.js +27 -0
- package/dist/src/compiler/workflow-file.js.map +1 -0
- package/dist/src/generator/n8n-generator.d.ts +3 -0
- package/dist/src/generator/n8n-generator.js +129 -0
- package/dist/src/generator/n8n-generator.js.map +1 -0
- package/dist/src/graph/graph.d.ts +11 -0
- package/dist/src/graph/graph.js +76 -0
- package/dist/src/graph/graph.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ir/model.d.ts +58 -0
- package/dist/src/ir/model.js +29 -0
- package/dist/src/ir/model.js.map +1 -0
- package/dist/src/parser/n8n-parser.d.ts +8 -0
- package/dist/src/parser/n8n-parser.js +119 -0
- package/dist/src/parser/n8n-parser.js.map +1 -0
- package/dist/src/parser/n8n-schema.d.ts +60 -0
- package/dist/src/parser/n8n-schema.js +35 -0
- package/dist/src/parser/n8n-schema.js.map +1 -0
- package/dist/src/passes/auto-layout.d.ts +6 -0
- package/dist/src/passes/auto-layout.js +52 -0
- package/dist/src/passes/auto-layout.js.map +1 -0
- package/dist/src/passes/credential-isolation.d.ts +10 -0
- package/dist/src/passes/credential-isolation.js +56 -0
- package/dist/src/passes/credential-isolation.js.map +1 -0
- package/dist/src/passes/deterministic-ids.d.ts +7 -0
- package/dist/src/passes/deterministic-ids.js +40 -0
- package/dist/src/passes/deterministic-ids.js.map +1 -0
- package/dist/src/passes/expression-rewriter.d.ts +7 -0
- package/dist/src/passes/expression-rewriter.js +294 -0
- package/dist/src/passes/expression-rewriter.js.map +1 -0
- package/dist/src/passes/inline-subworkflows.d.ts +11 -0
- package/dist/src/passes/inline-subworkflows.js +437 -0
- package/dist/src/passes/inline-subworkflows.js.map +1 -0
- package/dist/src/passes/pass.d.ts +10 -0
- package/dist/src/passes/pass.js +2 -0
- package/dist/src/passes/pass.js.map +1 -0
- package/dist/src/validation/graph-integrity.d.ts +9 -0
- package/dist/src/validation/graph-integrity.js +104 -0
- package/dist/src/validation/graph-integrity.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/compiler/link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { isJsonObject } from "./json.js";
|
|
2
|
+
export function sortJson(value) {
|
|
3
|
+
if (Array.isArray(value)) {
|
|
4
|
+
return value.map((item) => sortJson(item));
|
|
5
|
+
}
|
|
6
|
+
if (isJsonObject(value)) {
|
|
7
|
+
const output = {};
|
|
8
|
+
for (const key of Object.keys(value).sort()) {
|
|
9
|
+
output[key] = sortJson(value[key]);
|
|
10
|
+
}
|
|
11
|
+
return output;
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
export function stableStringify(value) {
|
|
16
|
+
return `${JSON.stringify(sortJson(value), null, 2)}\n`;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=stable-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stable-json.js","sourceRoot":"","sources":["../../../src/compiler/stable-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAA4B,CAAC;IACxE,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CompilerDiagnostic } from "./diagnostics.js";
|
|
2
|
+
import type { ValidateInput } from "./inputs.js";
|
|
3
|
+
import type { GraphStats } from "../ir/model.js";
|
|
4
|
+
export interface ValidationResult {
|
|
5
|
+
readonly ok: boolean;
|
|
6
|
+
readonly diagnostics: readonly CompilerDiagnostic[];
|
|
7
|
+
readonly stats?: GraphStats;
|
|
8
|
+
}
|
|
9
|
+
export declare function validate(input: ValidateInput): ValidationResult;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { parseN8nWorkflow } from "../parser/n8n-parser.js";
|
|
2
|
+
import { collectGraphStats, validateWorkflowIR } from "../validation/graph-integrity.js";
|
|
3
|
+
export function validate(input) {
|
|
4
|
+
const parsed = parseN8nWorkflow({
|
|
5
|
+
id: input.id ?? "workflow",
|
|
6
|
+
path: input.path ?? "<memory>",
|
|
7
|
+
workflow: input.workflow
|
|
8
|
+
});
|
|
9
|
+
if (parsed.workflow === undefined) {
|
|
10
|
+
return {
|
|
11
|
+
ok: false,
|
|
12
|
+
diagnostics: parsed.diagnostics
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const diagnostics = [
|
|
16
|
+
...parsed.diagnostics,
|
|
17
|
+
...validateWorkflowIR(parsed.workflow, "validation")
|
|
18
|
+
];
|
|
19
|
+
return {
|
|
20
|
+
ok: diagnostics.every((item) => item.severity !== "error"),
|
|
21
|
+
diagnostics,
|
|
22
|
+
stats: collectGraphStats(parsed.workflow)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/compiler/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AASzF,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,UAAU;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,UAAU;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,GAAG,MAAM,CAAC,WAAW;QACrB,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;KACrD,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC1D,WAAW;QACX,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC;KAC1C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LinkOptions } from "./inputs.js";
|
|
2
|
+
import { type LinkResult } from "./link.js";
|
|
3
|
+
export interface WatchInput {
|
|
4
|
+
readonly entryPath: string;
|
|
5
|
+
readonly dependencies?: Readonly<Record<string, string>>;
|
|
6
|
+
readonly options?: LinkOptions;
|
|
7
|
+
readonly intervalMs?: number;
|
|
8
|
+
readonly signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
export type WatchEvent = {
|
|
11
|
+
readonly kind: "compiled";
|
|
12
|
+
readonly changedPaths: readonly string[];
|
|
13
|
+
readonly result: LinkResult;
|
|
14
|
+
} | {
|
|
15
|
+
readonly kind: "error";
|
|
16
|
+
readonly path?: string;
|
|
17
|
+
readonly error: Error;
|
|
18
|
+
};
|
|
19
|
+
export declare function watch(input: WatchInput): AsyncIterable<WatchEvent>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { link } from "./link.js";
|
|
3
|
+
import { readWorkflowSource } from "./workflow-file.js";
|
|
4
|
+
export async function* watch(input) {
|
|
5
|
+
const intervalMs = input.intervalMs ?? 500;
|
|
6
|
+
const cache = new Map();
|
|
7
|
+
while (!(input.signal?.aborted ?? false)) {
|
|
8
|
+
const changedPaths = [];
|
|
9
|
+
try {
|
|
10
|
+
const entry = await readCachedWorkflow(cache, input.entryPath, "entry", changedPaths);
|
|
11
|
+
const dependencies = {};
|
|
12
|
+
for (const [id, path] of Object.entries(input.dependencies ?? {})) {
|
|
13
|
+
dependencies[id] = await readCachedWorkflow(cache, path, id, changedPaths);
|
|
14
|
+
}
|
|
15
|
+
if (changedPaths.length > 0) {
|
|
16
|
+
const linkInput = {
|
|
17
|
+
entry,
|
|
18
|
+
dependencies,
|
|
19
|
+
...(input.options === undefined ? {} : { options: input.options })
|
|
20
|
+
};
|
|
21
|
+
yield {
|
|
22
|
+
kind: "compiled",
|
|
23
|
+
changedPaths,
|
|
24
|
+
result: link(linkInput)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
yield {
|
|
30
|
+
kind: "error",
|
|
31
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
await delay(intervalMs, input.signal);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function readCachedWorkflow(cache, path, id, changedPaths) {
|
|
38
|
+
const metadata = await stat(path);
|
|
39
|
+
const cached = cache.get(path);
|
|
40
|
+
if (cached !== undefined && cached.mtimeMs === metadata.mtimeMs && cached.size === metadata.size) {
|
|
41
|
+
return cached.source;
|
|
42
|
+
}
|
|
43
|
+
const source = await readWorkflowSource(path, id);
|
|
44
|
+
cache.set(path, {
|
|
45
|
+
id,
|
|
46
|
+
path,
|
|
47
|
+
mtimeMs: metadata.mtimeMs,
|
|
48
|
+
size: metadata.size,
|
|
49
|
+
source
|
|
50
|
+
});
|
|
51
|
+
changedPaths.push(path);
|
|
52
|
+
return source;
|
|
53
|
+
}
|
|
54
|
+
function delay(ms, signal) {
|
|
55
|
+
return new Promise((resolve) => {
|
|
56
|
+
if (signal?.aborted ?? false) {
|
|
57
|
+
resolve();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const timeout = setTimeout(resolve, ms);
|
|
61
|
+
signal?.addEventListener("abort", () => {
|
|
62
|
+
clearTimeout(timeout);
|
|
63
|
+
resolve();
|
|
64
|
+
}, { once: true });
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/compiler/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { asJsonValue, isJsonObject } from "./json.js";
|
|
4
|
+
export async function readWorkflowSource(path, id) {
|
|
5
|
+
const absolutePath = resolve(path);
|
|
6
|
+
const text = await readFile(absolutePath, "utf8");
|
|
7
|
+
const parsed = parseJson(text, absolutePath);
|
|
8
|
+
const workflow = asJsonValue(parsed);
|
|
9
|
+
if (workflow === undefined || !isJsonObject(workflow)) {
|
|
10
|
+
throw new Error(`Workflow file "${absolutePath}" must contain JSON object root`);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
id,
|
|
14
|
+
path: absolutePath,
|
|
15
|
+
workflow
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function parseJson(text, path) {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(text);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
24
|
+
throw new Error(`Workflow file "${path}" contains invalid JSON: ${message}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=workflow-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-file.js","sourceRoot":"","sources":["../../../src/compiler/workflow-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,EAAU;IAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,kBAAkB,YAAY,iCAAiC,CAAC,CAAC;IACnF,CAAC;IAED,OAAO;QACL,EAAE;QACF,IAAI,EAAE,YAAY;QAClB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,4BAA4B,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { sortJson } from "../compiler/stable-json.js";
|
|
2
|
+
import { compareEdges } from "../graph/graph.js";
|
|
3
|
+
export function generateN8nWorkflow(workflow) {
|
|
4
|
+
const root = {
|
|
5
|
+
...workflow.properties,
|
|
6
|
+
name: workflow.name,
|
|
7
|
+
nodes: [...workflow.nodes]
|
|
8
|
+
.sort((left, right) => left.name.localeCompare(right.name))
|
|
9
|
+
.map((node) => generateNode(node)),
|
|
10
|
+
connections: generateConnections(workflow.edges)
|
|
11
|
+
};
|
|
12
|
+
const settings = generateSettings(workflow);
|
|
13
|
+
if (settings !== undefined) {
|
|
14
|
+
root.settings = settings;
|
|
15
|
+
}
|
|
16
|
+
return sortJson(root);
|
|
17
|
+
}
|
|
18
|
+
function generateNode(node) {
|
|
19
|
+
if (node.id === undefined || node.id.length === 0) {
|
|
20
|
+
throw new Error(`generation invariant failed: node "${node.name}" has no deterministic id`);
|
|
21
|
+
}
|
|
22
|
+
const output = {
|
|
23
|
+
...node.properties,
|
|
24
|
+
id: node.id,
|
|
25
|
+
name: node.name,
|
|
26
|
+
parameters: node.parameters,
|
|
27
|
+
position: [node.position[0], node.position[1]],
|
|
28
|
+
type: node.type,
|
|
29
|
+
typeVersion: node.typeVersion
|
|
30
|
+
};
|
|
31
|
+
const credentials = generateCredentials(node.credentials);
|
|
32
|
+
if (credentials !== undefined) {
|
|
33
|
+
output.credentials = credentials;
|
|
34
|
+
}
|
|
35
|
+
return output;
|
|
36
|
+
}
|
|
37
|
+
function generateCredentials(credentials) {
|
|
38
|
+
const credentialEntries = Object.entries(credentials).sort(([left], [right]) => left.localeCompare(right));
|
|
39
|
+
if (credentialEntries.length === 0) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const output = {};
|
|
43
|
+
for (const [credentialType, credential] of credentialEntries) {
|
|
44
|
+
const item = { ...credential.properties };
|
|
45
|
+
if (credential.id !== undefined) {
|
|
46
|
+
item.id = credential.id;
|
|
47
|
+
}
|
|
48
|
+
if (credential.name !== undefined) {
|
|
49
|
+
item.name = credential.name;
|
|
50
|
+
}
|
|
51
|
+
output[credentialType] = item;
|
|
52
|
+
}
|
|
53
|
+
return output;
|
|
54
|
+
}
|
|
55
|
+
function generateSettings(workflow) {
|
|
56
|
+
const output = { ...workflow.settings.properties };
|
|
57
|
+
const vars = workflow.settings.vars;
|
|
58
|
+
if (Object.keys(vars).length > 0) {
|
|
59
|
+
const sortedVars = {};
|
|
60
|
+
for (const key of Object.keys(vars).sort()) {
|
|
61
|
+
sortedVars[key] = vars[key];
|
|
62
|
+
}
|
|
63
|
+
output.vars = sortedVars;
|
|
64
|
+
}
|
|
65
|
+
return Object.keys(output).length === 0 ? undefined : output;
|
|
66
|
+
}
|
|
67
|
+
function generateConnections(edges) {
|
|
68
|
+
const root = {};
|
|
69
|
+
for (const edge of [...edges].sort(compareEdges)) {
|
|
70
|
+
const sourceEntry = getOrCreateObject(root, edge.source);
|
|
71
|
+
const outputGroups = getOrCreateArray(sourceEntry, edge.outputType);
|
|
72
|
+
while (outputGroups.length <= edge.outputIndex) {
|
|
73
|
+
outputGroups.push([]);
|
|
74
|
+
}
|
|
75
|
+
const targetList = outputGroups[edge.outputIndex];
|
|
76
|
+
if (!Array.isArray(targetList)) {
|
|
77
|
+
throw new Error(`internal connection shape violation for ${edge.source}.${edge.outputType}[${edge.outputIndex}]`);
|
|
78
|
+
}
|
|
79
|
+
targetList.push({
|
|
80
|
+
index: edge.inputIndex,
|
|
81
|
+
node: edge.target,
|
|
82
|
+
type: edge.inputType
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
sortConnectionTargets(root);
|
|
86
|
+
return root;
|
|
87
|
+
}
|
|
88
|
+
function getOrCreateObject(parent, key) {
|
|
89
|
+
const existing = parent[key];
|
|
90
|
+
if (existing !== undefined) {
|
|
91
|
+
return existing;
|
|
92
|
+
}
|
|
93
|
+
const created = {};
|
|
94
|
+
parent[key] = created;
|
|
95
|
+
return created;
|
|
96
|
+
}
|
|
97
|
+
function getOrCreateArray(parent, key) {
|
|
98
|
+
const existing = parent[key];
|
|
99
|
+
if (existing !== undefined) {
|
|
100
|
+
return existing;
|
|
101
|
+
}
|
|
102
|
+
const created = [];
|
|
103
|
+
parent[key] = created;
|
|
104
|
+
return created;
|
|
105
|
+
}
|
|
106
|
+
function sortConnectionTargets(root) {
|
|
107
|
+
for (const outputsValue of Object.values(root)) {
|
|
108
|
+
const outputs = outputsValue;
|
|
109
|
+
for (const groupsValue of Object.values(outputs)) {
|
|
110
|
+
const groups = groupsValue;
|
|
111
|
+
for (const targetsValue of groups) {
|
|
112
|
+
if (!Array.isArray(targetsValue)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
targetsValue.sort((left, right) => compareTarget(left, right));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function compareTarget(left, right) {
|
|
121
|
+
const leftNode = String(left.node ?? "");
|
|
122
|
+
const rightNode = String(right.node ?? "");
|
|
123
|
+
const leftType = String(left.type ?? "");
|
|
124
|
+
const rightType = String(right.type ?? "");
|
|
125
|
+
const leftIndex = typeof left.index === "number" ? left.index : 0;
|
|
126
|
+
const rightIndex = typeof right.index === "number" ? right.index : 0;
|
|
127
|
+
return leftNode.localeCompare(rightNode) || leftType.localeCompare(rightType) || leftIndex - rightIndex;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=n8n-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"n8n-generator.js","sourceRoot":"","sources":["../../../src/generator/n8n-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CompilerDiagnostic } from "../compiler/diagnostics.js";
|
|
2
|
+
import type { EdgeIR, NodeIR, WorkflowIR } from "../ir/model.js";
|
|
3
|
+
export interface WorkflowGraph {
|
|
4
|
+
readonly workflow: WorkflowIR;
|
|
5
|
+
readonly nodesByName: ReadonlyMap<string, NodeIR>;
|
|
6
|
+
readonly incomingByNode: ReadonlyMap<string, readonly EdgeIR[]>;
|
|
7
|
+
readonly outgoingByNode: ReadonlyMap<string, readonly EdgeIR[]>;
|
|
8
|
+
readonly diagnostics: readonly CompilerDiagnostic[];
|
|
9
|
+
}
|
|
10
|
+
export declare function buildWorkflowGraph(workflow: WorkflowIR, pass?: string): WorkflowGraph;
|
|
11
|
+
export declare function compareEdges(left: EdgeIR, right: EdgeIR): number;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { diagnostic } from "../compiler/diagnostics.js";
|
|
2
|
+
export function buildWorkflowGraph(workflow, pass = "graph") {
|
|
3
|
+
const diagnostics = [];
|
|
4
|
+
const nodesByName = new Map();
|
|
5
|
+
for (const node of workflow.nodes) {
|
|
6
|
+
if (nodesByName.has(node.name)) {
|
|
7
|
+
diagnostics.push(diagnostic({
|
|
8
|
+
pass,
|
|
9
|
+
workflow: workflow.id,
|
|
10
|
+
node: node.name,
|
|
11
|
+
location: node.source,
|
|
12
|
+
cause: `duplicate node name "${node.name}"`,
|
|
13
|
+
invariant: "node names must be unique inside workflow graph",
|
|
14
|
+
suggestion: "rename source node or let linker namespace imported workflows"
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
nodesByName.set(node.name, node);
|
|
18
|
+
}
|
|
19
|
+
const incomingMutable = new Map();
|
|
20
|
+
const outgoingMutable = new Map();
|
|
21
|
+
for (const edge of workflow.edges) {
|
|
22
|
+
if (!nodesByName.has(edge.source)) {
|
|
23
|
+
diagnostics.push(diagnostic({
|
|
24
|
+
pass,
|
|
25
|
+
workflow: workflow.id,
|
|
26
|
+
node: edge.source,
|
|
27
|
+
location: edge.sourcePointer,
|
|
28
|
+
cause: `connection source "${edge.source}" does not exist`,
|
|
29
|
+
invariant: "every connection source must reference an existing node",
|
|
30
|
+
suggestion: "fix connections block or restore missing node"
|
|
31
|
+
}));
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (!nodesByName.has(edge.target)) {
|
|
35
|
+
diagnostics.push(diagnostic({
|
|
36
|
+
pass,
|
|
37
|
+
workflow: workflow.id,
|
|
38
|
+
node: edge.target,
|
|
39
|
+
location: edge.sourcePointer,
|
|
40
|
+
cause: `connection target "${edge.target}" does not exist`,
|
|
41
|
+
invariant: "every connection target must reference an existing node",
|
|
42
|
+
suggestion: "fix target node name in connections block"
|
|
43
|
+
}));
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const incoming = incomingMutable.get(edge.target) ?? [];
|
|
47
|
+
incoming.push(edge);
|
|
48
|
+
incomingMutable.set(edge.target, incoming);
|
|
49
|
+
const outgoing = outgoingMutable.get(edge.source) ?? [];
|
|
50
|
+
outgoing.push(edge);
|
|
51
|
+
outgoingMutable.set(edge.source, outgoing);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
workflow,
|
|
55
|
+
nodesByName,
|
|
56
|
+
incomingByNode: freezeEdgeMap(incomingMutable),
|
|
57
|
+
outgoingByNode: freezeEdgeMap(outgoingMutable),
|
|
58
|
+
diagnostics
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function freezeEdgeMap(source) {
|
|
62
|
+
const output = new Map();
|
|
63
|
+
for (const [key, value] of source.entries()) {
|
|
64
|
+
output.set(key, [...value].sort(compareEdges));
|
|
65
|
+
}
|
|
66
|
+
return output;
|
|
67
|
+
}
|
|
68
|
+
export function compareEdges(left, right) {
|
|
69
|
+
return (left.source.localeCompare(right.source) ||
|
|
70
|
+
left.outputType.localeCompare(right.outputType) ||
|
|
71
|
+
left.outputIndex - right.outputIndex ||
|
|
72
|
+
left.target.localeCompare(right.target) ||
|
|
73
|
+
left.inputType.localeCompare(right.inputType) ||
|
|
74
|
+
left.inputIndex - right.inputIndex);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/graph/graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAWxD,MAAM,UAAU,kBAAkB,CAAC,QAAoB,EAAE,IAAI,GAAG,OAAO;IACrE,MAAM,WAAW,GAAyB,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;gBACT,IAAI;gBACJ,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,MAAM;gBACrB,KAAK,EAAE,wBAAwB,IAAI,CAAC,IAAI,GAAG;gBAC3C,SAAS,EAAE,iDAAiD;gBAC5D,UAAU,EAAE,+DAA+D;aAC5E,CAAC,CACH,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;IACpD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEpD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;gBACT,IAAI;gBACJ,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBACrB,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,KAAK,EAAE,sBAAsB,IAAI,CAAC,MAAM,kBAAkB;gBAC1D,SAAS,EAAE,yDAAyD;gBACpE,UAAU,EAAE,+CAA+C;aAC5D,CAAC,CACH,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CACd,UAAU,CAAC;gBACT,IAAI;gBACJ,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBACrB,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,KAAK,EAAE,sBAAsB,IAAI,CAAC,MAAM,kBAAkB;gBAC1D,SAAS,EAAE,yDAAyD;gBACpE,UAAU,EAAE,2CAA2C;aACxD,CAAC,CACH,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,QAAQ;QACR,WAAW;QACX,cAAc,EAAE,aAAa,CAAC,eAAe,CAAC;QAC9C,cAAc,EAAE,aAAa,CAAC,eAAe,CAAC;QAC9C,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAA8C;IACnE,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa;IACtD,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;QACpC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;QACvC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { analyze, type AnalyzeResult, type WorkflowAnalysis } from "./compiler/analyze.js";
|
|
2
|
+
export { link, linkOrThrow, type LinkResult } from "./compiler/link.js";
|
|
3
|
+
export { validate, type ValidationResult } from "./compiler/validate.js";
|
|
4
|
+
export { watch, type WatchEvent, type WatchInput } from "./compiler/watch.js";
|
|
5
|
+
export type { AnalyzeInput, LayoutOptions, LinkInput, LinkOptions, ValidateInput, WorkflowSource } from "./compiler/inputs.js";
|
|
6
|
+
export type { CompilerDiagnostic, DiagnosticSeverity, SourceLocation } from "./compiler/diagnostics.js";
|
|
7
|
+
export type { JsonArray, JsonObject, JsonPrimitive, JsonValue } from "./compiler/json.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA6C,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAyB,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,KAAK,EAAoC,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { JsonObject, JsonValue } from "../compiler/json.js";
|
|
2
|
+
export type Position = readonly [number, number];
|
|
3
|
+
export interface SourcePointer {
|
|
4
|
+
readonly workflowId: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly pointer: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CredentialReferenceIR {
|
|
9
|
+
readonly id?: string;
|
|
10
|
+
readonly name?: string;
|
|
11
|
+
readonly properties: JsonObject;
|
|
12
|
+
}
|
|
13
|
+
export type CredentialMapIR = Readonly<Record<string, CredentialReferenceIR>>;
|
|
14
|
+
export interface NodeIR {
|
|
15
|
+
readonly id?: string;
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly originalName: string;
|
|
18
|
+
readonly type: string;
|
|
19
|
+
readonly typeVersion: number;
|
|
20
|
+
readonly position: Position;
|
|
21
|
+
readonly parameters: JsonObject;
|
|
22
|
+
readonly credentials: CredentialMapIR;
|
|
23
|
+
readonly properties: JsonObject;
|
|
24
|
+
readonly source: SourcePointer;
|
|
25
|
+
}
|
|
26
|
+
export interface EdgeIR {
|
|
27
|
+
readonly source: string;
|
|
28
|
+
readonly outputType: string;
|
|
29
|
+
readonly outputIndex: number;
|
|
30
|
+
readonly target: string;
|
|
31
|
+
readonly inputType: string;
|
|
32
|
+
readonly inputIndex: number;
|
|
33
|
+
readonly sourcePointer: SourcePointer;
|
|
34
|
+
}
|
|
35
|
+
export interface WorkflowSettingsIR {
|
|
36
|
+
readonly vars: Readonly<Record<string, JsonValue>>;
|
|
37
|
+
readonly properties: JsonObject;
|
|
38
|
+
}
|
|
39
|
+
export interface WorkflowIR {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly path: string;
|
|
43
|
+
readonly nodes: readonly NodeIR[];
|
|
44
|
+
readonly edges: readonly EdgeIR[];
|
|
45
|
+
readonly settings: WorkflowSettingsIR;
|
|
46
|
+
readonly properties: JsonObject;
|
|
47
|
+
}
|
|
48
|
+
export interface GraphStats {
|
|
49
|
+
readonly nodes: number;
|
|
50
|
+
readonly edges: number;
|
|
51
|
+
readonly triggers: number;
|
|
52
|
+
readonly executeWorkflowNodes: number;
|
|
53
|
+
readonly variables: number;
|
|
54
|
+
}
|
|
55
|
+
export declare function withNodeName(node: NodeIR, name: string, id: string, position: Position): NodeIR;
|
|
56
|
+
export declare function withNodeParameters(node: NodeIR, parameters: JsonObject): NodeIR;
|
|
57
|
+
export declare function withNodeCredentials(node: NodeIR, credentials: CredentialMapIR): NodeIR;
|
|
58
|
+
export declare function withWorkflow(workflow: WorkflowIR, nodes: readonly NodeIR[], edges: readonly EdgeIR[], settings: WorkflowSettingsIR): WorkflowIR;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function withNodeName(node, name, id, position) {
|
|
2
|
+
return {
|
|
3
|
+
...node,
|
|
4
|
+
id,
|
|
5
|
+
name,
|
|
6
|
+
position
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function withNodeParameters(node, parameters) {
|
|
10
|
+
return {
|
|
11
|
+
...node,
|
|
12
|
+
parameters
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function withNodeCredentials(node, credentials) {
|
|
16
|
+
return {
|
|
17
|
+
...node,
|
|
18
|
+
credentials
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function withWorkflow(workflow, nodes, edges, settings) {
|
|
22
|
+
return {
|
|
23
|
+
...workflow,
|
|
24
|
+
nodes,
|
|
25
|
+
edges,
|
|
26
|
+
settings
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/ir/model.ts"],"names":[],"mappings":"AAgEA,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,EAAU,EAAE,QAAkB;IACrF,OAAO;QACL,GAAG,IAAI;QACP,EAAE;QACF,IAAI;QACJ,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAsB;IACrE,OAAO;QACL,GAAG,IAAI;QACP,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,WAA4B;IAC5E,OAAO;QACL,GAAG,IAAI;QACP,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAoB,EACpB,KAAwB,EACxB,KAAwB,EACxB,QAA4B;IAE5B,OAAO;QACL,GAAG,QAAQ;QACX,KAAK;QACL,KAAK;QACL,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CompilerDiagnostic } from "../compiler/diagnostics.js";
|
|
2
|
+
import type { WorkflowSource } from "../compiler/inputs.js";
|
|
3
|
+
import type { WorkflowIR } from "../ir/model.js";
|
|
4
|
+
export interface ParseResult {
|
|
5
|
+
readonly workflow?: WorkflowIR;
|
|
6
|
+
readonly diagnostics: readonly CompilerDiagnostic[];
|
|
7
|
+
}
|
|
8
|
+
export declare function parseN8nWorkflow(source: WorkflowSource): ParseResult;
|