@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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +155 -0
  3. package/dist/src/cli/api.d.ts +10 -0
  4. package/dist/src/cli/api.js +57 -0
  5. package/dist/src/cli/api.js.map +1 -0
  6. package/dist/src/cli/build.d.ts +2 -0
  7. package/dist/src/cli/build.js +162 -0
  8. package/dist/src/cli/build.js.map +1 -0
  9. package/dist/src/cli/compile.d.ts +2 -0
  10. package/dist/src/cli/compile.js +149 -0
  11. package/dist/src/cli/compile.js.map +1 -0
  12. package/dist/src/cli/deploy.d.ts +4 -0
  13. package/dist/src/cli/deploy.js +47 -0
  14. package/dist/src/cli/deploy.js.map +1 -0
  15. package/dist/src/cli/dev.d.ts +2 -0
  16. package/dist/src/cli/dev.js +54 -0
  17. package/dist/src/cli/dev.js.map +1 -0
  18. package/dist/src/cli/init.d.ts +1 -0
  19. package/dist/src/cli/init.js +237 -0
  20. package/dist/src/cli/init.js.map +1 -0
  21. package/dist/src/cli/main.d.ts +2 -0
  22. package/dist/src/cli/main.js +249 -0
  23. package/dist/src/cli/main.js.map +1 -0
  24. package/dist/src/cli/run.d.ts +2 -0
  25. package/dist/src/cli/run.js +84 -0
  26. package/dist/src/cli/run.js.map +1 -0
  27. package/dist/src/cli/server.d.ts +2 -0
  28. package/dist/src/cli/server.js +62 -0
  29. package/dist/src/cli/server.js.map +1 -0
  30. package/dist/src/cli/setup.d.ts +1 -0
  31. package/dist/src/cli/setup.js +62 -0
  32. package/dist/src/cli/setup.js.map +1 -0
  33. package/dist/src/cli/sync.d.ts +4 -0
  34. package/dist/src/cli/sync.js +45 -0
  35. package/dist/src/cli/sync.js.map +1 -0
  36. package/dist/src/cli/ui.d.ts +5 -0
  37. package/dist/src/cli/ui.js +66 -0
  38. package/dist/src/cli/ui.js.map +1 -0
  39. package/dist/src/compiler/analyze.d.ts +15 -0
  40. package/dist/src/compiler/analyze.js +26 -0
  41. package/dist/src/compiler/analyze.js.map +1 -0
  42. package/dist/src/compiler/diagnostics.d.ts +28 -0
  43. package/dist/src/compiler/diagnostics.js +26 -0
  44. package/dist/src/compiler/diagnostics.js.map +1 -0
  45. package/dist/src/compiler/inputs.d.ts +30 -0
  46. package/dist/src/compiler/inputs.js +2 -0
  47. package/dist/src/compiler/inputs.js.map +1 -0
  48. package/dist/src/compiler/json.d.ts +15 -0
  49. package/dist/src/compiler/json.js +83 -0
  50. package/dist/src/compiler/json.js.map +1 -0
  51. package/dist/src/compiler/link.d.ts +18 -0
  52. package/dist/src/compiler/link.js +84 -0
  53. package/dist/src/compiler/link.js.map +1 -0
  54. package/dist/src/compiler/stable-json.d.ts +3 -0
  55. package/dist/src/compiler/stable-json.js +18 -0
  56. package/dist/src/compiler/stable-json.js.map +1 -0
  57. package/dist/src/compiler/validate.d.ts +9 -0
  58. package/dist/src/compiler/validate.js +25 -0
  59. package/dist/src/compiler/validate.js.map +1 -0
  60. package/dist/src/compiler/watch.d.ts +19 -0
  61. package/dist/src/compiler/watch.js +67 -0
  62. package/dist/src/compiler/watch.js.map +1 -0
  63. package/dist/src/compiler/workflow-file.d.ts +2 -0
  64. package/dist/src/compiler/workflow-file.js +27 -0
  65. package/dist/src/compiler/workflow-file.js.map +1 -0
  66. package/dist/src/generator/n8n-generator.d.ts +3 -0
  67. package/dist/src/generator/n8n-generator.js +129 -0
  68. package/dist/src/generator/n8n-generator.js.map +1 -0
  69. package/dist/src/graph/graph.d.ts +11 -0
  70. package/dist/src/graph/graph.js +76 -0
  71. package/dist/src/graph/graph.js.map +1 -0
  72. package/dist/src/index.d.ts +7 -0
  73. package/dist/src/index.js +5 -0
  74. package/dist/src/index.js.map +1 -0
  75. package/dist/src/ir/model.d.ts +58 -0
  76. package/dist/src/ir/model.js +29 -0
  77. package/dist/src/ir/model.js.map +1 -0
  78. package/dist/src/parser/n8n-parser.d.ts +8 -0
  79. package/dist/src/parser/n8n-parser.js +119 -0
  80. package/dist/src/parser/n8n-parser.js.map +1 -0
  81. package/dist/src/parser/n8n-schema.d.ts +60 -0
  82. package/dist/src/parser/n8n-schema.js +35 -0
  83. package/dist/src/parser/n8n-schema.js.map +1 -0
  84. package/dist/src/passes/auto-layout.d.ts +6 -0
  85. package/dist/src/passes/auto-layout.js +52 -0
  86. package/dist/src/passes/auto-layout.js.map +1 -0
  87. package/dist/src/passes/credential-isolation.d.ts +10 -0
  88. package/dist/src/passes/credential-isolation.js +56 -0
  89. package/dist/src/passes/credential-isolation.js.map +1 -0
  90. package/dist/src/passes/deterministic-ids.d.ts +7 -0
  91. package/dist/src/passes/deterministic-ids.js +40 -0
  92. package/dist/src/passes/deterministic-ids.js.map +1 -0
  93. package/dist/src/passes/expression-rewriter.d.ts +7 -0
  94. package/dist/src/passes/expression-rewriter.js +294 -0
  95. package/dist/src/passes/expression-rewriter.js.map +1 -0
  96. package/dist/src/passes/inline-subworkflows.d.ts +11 -0
  97. package/dist/src/passes/inline-subworkflows.js +437 -0
  98. package/dist/src/passes/inline-subworkflows.js.map +1 -0
  99. package/dist/src/passes/pass.d.ts +10 -0
  100. package/dist/src/passes/pass.js +2 -0
  101. package/dist/src/passes/pass.js.map +1 -0
  102. package/dist/src/validation/graph-integrity.d.ts +9 -0
  103. package/dist/src/validation/graph-integrity.js +104 -0
  104. package/dist/src/validation/graph-integrity.js.map +1 -0
  105. package/package.json +60 -0
@@ -0,0 +1,54 @@
1
+ import chokidar from "chokidar";
2
+ import pc from "picocolors";
3
+ import { runBuild } from "./build.js";
4
+ import { runSync } from "./sync.js";
5
+ import { showBranding, renderDashboardMenu, startKeyboardListener } from "./ui.js";
6
+ export async function runDev(options) {
7
+ console.clear();
8
+ showBranding();
9
+ const cwd = process.cwd();
10
+ let isBuilding = false;
11
+ const rebuildAndSync = async () => {
12
+ if (isBuilding)
13
+ return;
14
+ isBuilding = true;
15
+ try {
16
+ process.stdout.write(pc.dim(`\n--- Build triggered at ${new Date().toLocaleTimeString()} ---\n`));
17
+ const buildCode = await runBuild(options);
18
+ if (buildCode === 0) {
19
+ await runSync({ apiKey: process.env.N8N_API_KEY });
20
+ }
21
+ else {
22
+ process.stdout.write(pc.yellow(`\n⚠ Skipping sync due to build errors.\n`));
23
+ }
24
+ }
25
+ finally {
26
+ isBuilding = false;
27
+ }
28
+ };
29
+ // Perform initial build & sync
30
+ await rebuildAndSync();
31
+ renderDashboardMenu();
32
+ const watcher = chokidar.watch("**/*.json", {
33
+ cwd,
34
+ ignored: ["dist/**", "node_modules/**", ".git/**", "build/**"],
35
+ ignoreInitial: true
36
+ });
37
+ watcher.on("all", async (event, path) => {
38
+ process.stdout.write(pc.cyan(`\nℹ File ${path} changed. Rebuilding...\n`));
39
+ await rebuildAndSync();
40
+ renderDashboardMenu();
41
+ });
42
+ startKeyboardListener(async () => {
43
+ process.stdout.write(pc.cyan(`\nℹ Manual reload triggered...\n`));
44
+ await rebuildAndSync();
45
+ renderDashboardMenu();
46
+ }, () => {
47
+ process.stdout.write(pc.yellow('\n⚠ Stopping dev server...\n'));
48
+ watcher.close();
49
+ process.exit(0);
50
+ });
51
+ // Keep process alive
52
+ return new Promise(() => { });
53
+ }
54
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/dev.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGnF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAoB;IAC/C,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,YAAY,EAAE,CAAC;IAEf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,IAAI,UAAU;YAAE,OAAO;QACvB,UAAU,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,+BAA+B;IAC/B,MAAM,cAAc,EAAE,CAAC;IACvB,mBAAmB,EAAE,CAAC;IAEtB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE;QAC1C,GAAG;QACH,OAAO,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,CAAC;QAC9D,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,2BAA2B,CAAC,CAAC,CAAC;QAC3E,MAAM,cAAc,EAAE,CAAC;QACvB,mBAAmB,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,qBAAqB,CACnB,KAAK,IAAI,EAAE;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAClE,MAAM,cAAc,EAAE,CAAC;QACvB,mBAAmB,EAAE,CAAC;IACxB,CAAC,EACD,GAAG,EAAE;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CACF,CAAC;IAEF,qBAAqB;IACrB,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runInit(): Promise<number>;
@@ -0,0 +1,237 @@
1
+ import { mkdir, writeFile, readdir } from "node:fs/promises";
2
+ import { resolve, join, basename } from "node:path";
3
+ import { exec } from "node:child_process";
4
+ import { promisify } from "node:util";
5
+ import pc from "picocolors";
6
+ import { intro, outro, text, confirm, spinner, log } from "@clack/prompts";
7
+ import { showBranding } from "./ui.js";
8
+ const execAsync = promisify(exec);
9
+ const PACKAGE_JSON_TEMPLATE = (name) => `{
10
+ "name": "${name}",
11
+ "version": "1.0.0",
12
+ "description": "An n8n workflow project powered by flat8n",
13
+ "scripts": {
14
+ "dev": "flat8n",
15
+ "build": "flat8n link --entry workflows/main.json --out dist/main.json",
16
+ "start": "npx n8n start"
17
+ },
18
+ "dependencies": {},
19
+ "devDependencies": {
20
+ "@flat8n/cli": "latest"
21
+ }
22
+ }
23
+ `;
24
+ const GITIGNORE_TEMPLATE = `node_modules/
25
+ dist/
26
+ .env
27
+ .n8n/
28
+ `;
29
+ const ENV_TEMPLATE = `# The port your local n8n dev server runs on
30
+ N8N_PORT=5678
31
+
32
+ # The host your local n8n dev server binds to
33
+ N8N_HOST=localhost
34
+
35
+ # Security key for n8n encryption (change this in production)
36
+ N8N_ENCRYPTION_KEY=my-super-secret-encryption-key
37
+ `;
38
+ const CONFIG_TEMPLATE = `{
39
+ "$schema": "https://flat8n.com/schema.json",
40
+ "workflowsDir": "workflows",
41
+ "outDir": "dist"
42
+ }
43
+ `;
44
+ const README_TEMPLATE = (name) => `# ${name}
45
+
46
+ [![flat8n](https://img.shields.io/badge/flat8n-FF6E4A.svg)](https://github.com/jvondev/flat8n)
47
+
48
+ A modern n8n workflow project, scaffolded with [flat8n](https://github.com/jvondev/flat8n).
49
+
50
+ ## Development
51
+
52
+ Run the dev server (automatically starts a local n8n instance and watches your files for changes):
53
+
54
+ \`\`\`bash
55
+ npm run dev
56
+ \`\`\`
57
+
58
+ ## Build
59
+
60
+ Compile your modular workflows into a single deployable monolithic JSON workflow:
61
+
62
+ \`\`\`bash
63
+ npm run build
64
+ \`\`\`
65
+
66
+ ## Architecture
67
+
68
+ Your source workflows are in the \`workflows/\` directory.
69
+ Shared or reusable logic goes in \`workflows/subworkflows/\`.
70
+ `;
71
+ const MAIN_JSON_TEMPLATE = `{
72
+ "name": "Main Entrypoint",
73
+ "nodes": [
74
+ {
75
+ "parameters": {
76
+ "httpMethod": "POST",
77
+ "path": "test",
78
+ "options": {}
79
+ },
80
+ "id": "1",
81
+ "name": "Webhook",
82
+ "type": "n8n-nodes-base.webhook",
83
+ "typeVersion": 1,
84
+ "position": [0, 0],
85
+ "webhookId": "test-webhook"
86
+ },
87
+ {
88
+ "parameters": {
89
+ "workflowId": "child"
90
+ },
91
+ "id": "2",
92
+ "name": "Execute Subworkflow",
93
+ "type": "n8n-nodes-base.executeWorkflow",
94
+ "typeVersion": 1,
95
+ "position": [200, 0]
96
+ }
97
+ ],
98
+ "connections": {
99
+ "Webhook": {
100
+ "main": [
101
+ [
102
+ {
103
+ "node": "Execute Subworkflow",
104
+ "type": "main",
105
+ "index": 0
106
+ }
107
+ ]
108
+ ]
109
+ }
110
+ }
111
+ }
112
+ `;
113
+ const CHILD_JSON_TEMPLATE = `{
114
+ "name": "Child Module",
115
+ "id": "child",
116
+ "nodes": [
117
+ {
118
+ "parameters": {},
119
+ "id": "1",
120
+ "name": "Execute Workflow Trigger",
121
+ "type": "n8n-nodes-base.executeWorkflowTrigger",
122
+ "typeVersion": 1,
123
+ "position": [0, 0]
124
+ },
125
+ {
126
+ "parameters": {
127
+ "jsCode": "return $input.all();"
128
+ },
129
+ "id": "2",
130
+ "name": "Process Logic",
131
+ "type": "n8n-nodes-base.code",
132
+ "typeVersion": 2,
133
+ "position": [200, 0]
134
+ }
135
+ ],
136
+ "connections": {
137
+ "Execute Workflow Trigger": {
138
+ "main": [
139
+ [
140
+ {
141
+ "node": "Process Logic",
142
+ "type": "main",
143
+ "index": 0
144
+ }
145
+ ]
146
+ ]
147
+ }
148
+ }
149
+ }
150
+ `;
151
+ export async function runInit() {
152
+ console.clear();
153
+ showBranding();
154
+ intro(pc.bgCyan(pc.black(" init ")));
155
+ const cwd = process.cwd();
156
+ const cwdFiles = await readdir(cwd);
157
+ const allowedFiles = new Set([".git", ".DS_Store", ".vscode", ".idea", "Thumbs.db"]);
158
+ const isCwdEmpty = cwdFiles.every(f => allowedFiles.has(f));
159
+ let targetDir = ".";
160
+ if (!isCwdEmpty) {
161
+ const dirPrompt = await text({
162
+ message: "Project name (creates a new folder, or '.' for current directory)",
163
+ placeholder: "my-n8n-app",
164
+ defaultValue: "my-n8n-app",
165
+ validate: (val) => {
166
+ if (!val || val.length === 0)
167
+ return "Project name is required";
168
+ if (!/^[a-z0-9-_./]+$/.test(val))
169
+ return "Invalid path format";
170
+ return;
171
+ }
172
+ });
173
+ if (typeof dirPrompt !== "string") {
174
+ outro("Initialization cancelled.");
175
+ return 1;
176
+ }
177
+ targetDir = dirPrompt;
178
+ if (targetDir === ".") {
179
+ const confirmOverwrite = await confirm({
180
+ message: "Current directory is not empty. Continue and potentially overwrite files?",
181
+ initialValue: false
182
+ });
183
+ if (typeof confirmOverwrite !== "boolean" || !confirmOverwrite) {
184
+ outro("Initialization cancelled.");
185
+ return 1;
186
+ }
187
+ }
188
+ }
189
+ const projectDir = resolve(cwd, targetDir);
190
+ const projectName = targetDir === "." ? basename(cwd) : basename(projectDir);
191
+ const initGit = await confirm({
192
+ message: "Initialize a new Git repository?",
193
+ initialValue: true
194
+ });
195
+ if (typeof initGit !== "boolean") {
196
+ outro("Initialization cancelled.");
197
+ return 1;
198
+ }
199
+ const s = spinner();
200
+ s.start(`Creating project in ${projectDir}...`);
201
+ try {
202
+ // 1. Create Directories
203
+ await mkdir(projectDir, { recursive: true });
204
+ await mkdir(join(projectDir, "workflows"), { recursive: true });
205
+ await mkdir(join(projectDir, "workflows", "subworkflows"), { recursive: true });
206
+ // 2. Write Config / Root Files
207
+ await writeFile(join(projectDir, "package.json"), PACKAGE_JSON_TEMPLATE(projectName));
208
+ await writeFile(join(projectDir, ".gitignore"), GITIGNORE_TEMPLATE);
209
+ await writeFile(join(projectDir, ".env.example"), ENV_TEMPLATE);
210
+ await writeFile(join(projectDir, "flat8n.config.json"), CONFIG_TEMPLATE);
211
+ await writeFile(join(projectDir, "README.md"), README_TEMPLATE(projectName));
212
+ // 3. Write Workflows
213
+ await writeFile(join(projectDir, "workflows", "main.json"), MAIN_JSON_TEMPLATE);
214
+ await writeFile(join(projectDir, "workflows", "subworkflows", "child.json"), CHILD_JSON_TEMPLATE);
215
+ s.stop(pc.green(`✔ Project scaffolded successfully in ${projectDir}`));
216
+ if (initGit) {
217
+ s.start("Initializing Git repository...");
218
+ try {
219
+ await execAsync("git init", { cwd: projectDir });
220
+ s.stop(pc.green("✔ Git repository initialized"));
221
+ }
222
+ catch (err) {
223
+ s.stop(pc.red("✖ Failed to initialize Git repository"));
224
+ }
225
+ }
226
+ const cdInstruction = targetDir === "." ? "" : ` cd ${targetDir}\n`;
227
+ log.info(`\n${pc.bold("Next steps:")}\n${cdInstruction} npm install\n npm run dev`);
228
+ outro(pc.cyan("Happy automating!"));
229
+ return 0;
230
+ }
231
+ catch (error) {
232
+ s.stop(pc.red("✖ Failed to create project"));
233
+ log.error(error.message);
234
+ return 1;
235
+ }
236
+ }
237
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env node
2
+ import { writeFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { analyze } from "../compiler/analyze.js";
5
+ import { formatDiagnostic } from "../compiler/diagnostics.js";
6
+ import { link } from "../compiler/link.js";
7
+ import { validate } from "../compiler/validate.js";
8
+ import { readWorkflowSource } from "../compiler/workflow-file.js";
9
+ import { runUnified } from "./run.js";
10
+ import { join } from "node:path";
11
+ // Natively load .env from the consumer's current working directory if it exists
12
+ try {
13
+ process.loadEnvFile(join(process.cwd(), ".env"));
14
+ }
15
+ catch (e) {
16
+ // Silently ignore if no .env file exists
17
+ }
18
+ async function main(argv) {
19
+ const args = parseArgs(argv);
20
+ if (args.command === "help") {
21
+ process.stdout.write(helpText());
22
+ return 0;
23
+ }
24
+ if (args.command === "run") {
25
+ process.env.FLATT8N_DEV_MODE = "1";
26
+ return runUnified(args.options);
27
+ }
28
+ if (args.command === "init") {
29
+ const { runInit } = await import("./init.js");
30
+ return runInit();
31
+ }
32
+ if (args.entry === undefined) {
33
+ process.stderr.write("Missing required --entry <workflow.json>\n");
34
+ return 2;
35
+ }
36
+ if (args.command === "validate") {
37
+ const entry = await readWorkflowSource(args.entry, "entry");
38
+ const result = validate({
39
+ workflow: entry.workflow,
40
+ id: entry.id,
41
+ path: entry.path
42
+ });
43
+ writeDiagnostics(result.diagnostics);
44
+ if (result.stats !== undefined) {
45
+ process.stdout.write(`${JSON.stringify(result.stats, null, 2)}\n`);
46
+ }
47
+ return result.ok ? 0 : 1;
48
+ }
49
+ const entry = await readWorkflowSource(args.entry, "entry");
50
+ const dependencies = await readDependencies(args.deps);
51
+ if (args.command === "analyze") {
52
+ const result = analyze({ entry, dependencies });
53
+ writeDiagnostics(result.diagnostics);
54
+ process.stdout.write(`${JSON.stringify(result.workflows, null, 2)}\n`);
55
+ return result.ok ? 0 : 1;
56
+ }
57
+ const result = link({
58
+ entry,
59
+ dependencies,
60
+ options: args.options
61
+ });
62
+ writeDiagnostics(result.diagnostics);
63
+ if (!result.ok) {
64
+ return 1;
65
+ }
66
+ if (args.out === undefined) {
67
+ process.stdout.write(result.json);
68
+ return 0;
69
+ }
70
+ await writeFile(resolve(args.out), result.json, "utf8");
71
+ return 0;
72
+ }
73
+ function parseArgs(argv) {
74
+ let commandStr = argv[0];
75
+ let parsedCmd = parseCommandStr(commandStr);
76
+ let command = "run";
77
+ let startIndex = 0;
78
+ if (parsedCmd !== undefined) {
79
+ command = parsedCmd;
80
+ startIndex = 1;
81
+ }
82
+ else if (commandStr === undefined) {
83
+ command = "run";
84
+ }
85
+ else if (!commandStr.startsWith("-")) {
86
+ throw new Error(`Unknown command "${commandStr}"`);
87
+ }
88
+ else {
89
+ command = "run";
90
+ }
91
+ const deps = {};
92
+ const credentialIdOverrides = {};
93
+ let entry;
94
+ let out;
95
+ let credentialPolicy;
96
+ let direction;
97
+ let spacing;
98
+ for (let index = startIndex; index < argv.length; index += 1) {
99
+ const arg = argv[index];
100
+ switch (arg) {
101
+ case "--entry":
102
+ entry = readValue(argv, index, arg);
103
+ index += 1;
104
+ break;
105
+ case "--out":
106
+ out = readValue(argv, index, arg);
107
+ index += 1;
108
+ break;
109
+ case "--dep": {
110
+ const value = readValue(argv, index, arg);
111
+ const parsed = parseKeyValue(value, "--dep");
112
+ deps[parsed.key] = parsed.value;
113
+ index += 1;
114
+ break;
115
+ }
116
+ case "--credential-id": {
117
+ const value = readValue(argv, index, arg);
118
+ const parsed = parseKeyValue(value, "--credential-id");
119
+ credentialIdOverrides[parsed.key] = parsed.value;
120
+ index += 1;
121
+ break;
122
+ }
123
+ case "--credential-policy": {
124
+ const value = readValue(argv, index, arg);
125
+ if (value !== "stripIds" && value !== "preserveIds") {
126
+ throw new Error("--credential-policy must be stripIds or preserveIds");
127
+ }
128
+ credentialPolicy = value;
129
+ index += 1;
130
+ break;
131
+ }
132
+ case "--layout-direction": {
133
+ const value = readValue(argv, index, arg);
134
+ if (value !== "right" && value !== "left" && value !== "down" && value !== "up") {
135
+ throw new Error("--layout-direction must be right, left, down, or up");
136
+ }
137
+ direction = value;
138
+ index += 1;
139
+ break;
140
+ }
141
+ case "--layout-spacing": {
142
+ const value = readValue(argv, index, arg);
143
+ const parsed = Number(value);
144
+ if (!Number.isFinite(parsed) || parsed < 0) {
145
+ throw new Error("--layout-spacing must be non-negative finite number");
146
+ }
147
+ spacing = parsed;
148
+ index += 1;
149
+ break;
150
+ }
151
+ default:
152
+ if (command !== "run") {
153
+ throw new Error(`Unknown argument "${arg ?? ""}"`);
154
+ }
155
+ }
156
+ }
157
+ const options = {
158
+ ...(credentialPolicy === undefined ? {} : { credentialPolicy }),
159
+ ...(Object.keys(credentialIdOverrides).length === 0 ? {} : { credentialIdOverrides }),
160
+ ...(direction === undefined && spacing === undefined ? {} : { layout: { ...(direction === undefined ? {} : { direction }), ...(spacing === undefined ? {} : { spacing }) } })
161
+ };
162
+ return {
163
+ command,
164
+ ...(entry === undefined ? {} : { entry }),
165
+ ...(out === undefined ? {} : { out }),
166
+ deps,
167
+ options
168
+ };
169
+ }
170
+ function parseCommandStr(value) {
171
+ switch (value) {
172
+ case "link":
173
+ case "validate":
174
+ case "analyze":
175
+ case "run":
176
+ case "init":
177
+ return value;
178
+ case "help":
179
+ case "--help":
180
+ case "-h":
181
+ return "help";
182
+ default:
183
+ return undefined;
184
+ }
185
+ }
186
+ function readValue(argv, index, flag) {
187
+ const value = argv[index + 1];
188
+ if (value === undefined || value.startsWith("--")) {
189
+ throw new Error(`${flag} requires value`);
190
+ }
191
+ return value;
192
+ }
193
+ function parseKeyValue(value, flag) {
194
+ const separator = value.indexOf("=");
195
+ if (separator <= 0 || separator === value.length - 1) {
196
+ throw new Error(`${flag} requires key=value`);
197
+ }
198
+ return {
199
+ key: value.slice(0, separator),
200
+ value: value.slice(separator + 1)
201
+ };
202
+ }
203
+ async function readDependencies(deps) {
204
+ const output = {};
205
+ for (const [id, path] of Object.entries(deps)) {
206
+ output[id] = await readWorkflowSource(path, id);
207
+ }
208
+ return output;
209
+ }
210
+ function writeDiagnostics(diagnostics) {
211
+ for (const item of diagnostics) {
212
+ const line = formatDiagnostic(item);
213
+ if (item.severity === "error") {
214
+ process.stderr.write(`${line}\n`);
215
+ }
216
+ else {
217
+ process.stdout.write(`${line}\n`);
218
+ }
219
+ }
220
+ }
221
+ function helpText() {
222
+ return `flat8n
223
+
224
+ Usage:
225
+ flat8n # Boot n8n, auto-build workflows, deploy, and watch
226
+ flat8n init # Scaffold a new n8n project
227
+ flat8n link --entry a.json --out b.json # Manual link with specific entry
228
+ flat8n validate --entry workflow.json
229
+ flat8n analyze --entry workflow.json --dep child=child.json
230
+
231
+ Options:
232
+ --dep <id=path> Register dependency workflow
233
+ --out <path> Write linked workflow JSON
234
+ --credential-policy <mode> stripIds | preserveIds
235
+ --credential-id <key=id> Override credential id by node.type, type, or name
236
+ --layout-direction <direction> right | left | down | up
237
+ --layout-spacing <number> Canvas spacing for inlined workflows
238
+ `;
239
+ }
240
+ main(process.argv.slice(2))
241
+ .then((code) => {
242
+ process.exitCode = code;
243
+ })
244
+ .catch((error) => {
245
+ const message = error instanceof Error ? error.message : String(error);
246
+ process.stderr.write(`${message}\n`);
247
+ process.exitCode = 1;
248
+ });
249
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAA2B,MAAM,4BAA4B,CAAC;AAEvF,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,gFAAgF;AAChF,IAAI,CAAC;IACH,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,yCAAyC;AAC3C,CAAC;AAUD,KAAK,UAAU,IAAI,CAAC,IAAuB;IACzC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC;QACnC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACnE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAC;QACH,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAChD,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC;QAClB,KAAK;QACL,YAAY;QACZ,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,IAAuB;IACxC,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,SAAS,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE5C,IAAI,OAAO,GAA0B,KAAK,CAAC;IAC3C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,GAAG,SAAS,CAAC;QACpB,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;SAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,GAAG,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,MAAM,qBAAqB,GAA2B,EAAE,CAAC;IACzD,IAAI,KAAyB,CAAC;IAC9B,IAAI,GAAuB,CAAC;IAC5B,IAAI,gBAAiD,CAAC;IACtD,IAAI,SAAqC,CAAC;IAC1C,IAAI,OAA2B,CAAC;IAEhC,KAAK,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,SAAS;gBACZ,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBACpC,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,OAAO;gBACV,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBAClC,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;gBAChC,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;gBACvD,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;gBACjD,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;YACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC1C,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;oBACpD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACzE,CAAC;gBACD,gBAAgB,GAAG,KAAK,CAAC;gBACzB,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;YACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC1C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAChF,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACzE,CAAC;gBACD,SAAS,GAAG,KAAK,CAAC;gBAClB,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACzE,CAAC;gBACD,OAAO,GAAG,MAAM,CAAC;gBACjB,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;YACD;gBACE,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;gBACrD,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAgB;QAC3B,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;QAC/D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC;QACrF,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;KAC9K,CAAC;IAEF,OAAO;QACL,OAAO;QACP,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACrC,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAuB,EAAE,KAAa,EAAE,IAAY;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,IAAY;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;IAChD,CAAC;IACD,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAsC;IACpE,MAAM,MAAM,GAAmC,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,WAA0C;IAClE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;;;;;;;;;;;;;;;;CAgBR,CAAC;AACF,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACxB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { LinkOptions } from "../compiler/inputs.js";
2
+ export declare function runUnified(options: LinkOptions): Promise<number>;
@@ -0,0 +1,84 @@
1
+ import chokidar from "chokidar";
2
+ import pc from "picocolors";
3
+ import { log } from "@clack/prompts";
4
+ import { runCompile } from "./compile.js";
5
+ import { runDeploy } from "./deploy.js";
6
+ import { showBranding, renderDashboardMenu, startKeyboardListener } from "./ui.js";
7
+ import { ensureEnvironment } from "./setup.js";
8
+ import { bootN8n, killN8n } from "./server.js";
9
+ export async function runUnified(options) {
10
+ console.clear();
11
+ showBranding();
12
+ const cwd = process.cwd();
13
+ // 1. Compile initially
14
+ const initialBuildCode = await runCompile(options);
15
+ if (initialBuildCode !== 0) {
16
+ log.error("Fix build errors before continuing.");
17
+ return 1;
18
+ }
19
+ // 2. Ask to deploy
20
+ if (!process.stdout.isTTY) {
21
+ return 0;
22
+ }
23
+ const prompts = await import("@clack/prompts");
24
+ const shouldSync = await prompts.confirm({
25
+ message: "Would you like to deploy these compiled workflows to n8n directly?",
26
+ initialValue: false
27
+ });
28
+ if (prompts.isCancel(shouldSync) || !shouldSync) {
29
+ return 0;
30
+ }
31
+ // 3. Ensure Environment (API Key Flow)
32
+ await ensureEnvironment();
33
+ // Set up graceful exit for Ctrl+C so background n8n doesn't zombie
34
+ process.on("SIGINT", () => {
35
+ log.warn("Received Ctrl+C. Cleaning up background engines...");
36
+ killN8n();
37
+ process.exit(0);
38
+ });
39
+ // 4. Boot and Deploy
40
+ await bootN8n();
41
+ await runDeploy({ apiKey: process.env.N8N_API_KEY });
42
+ // 4. Start Watcher
43
+ let isBuilding = false;
44
+ async function rebuildAndSync() {
45
+ if (isBuilding)
46
+ return;
47
+ isBuilding = true;
48
+ try {
49
+ const buildCode = await runCompile(options);
50
+ if (buildCode === 0) {
51
+ await runDeploy({ apiKey: process.env.N8N_API_KEY });
52
+ }
53
+ else {
54
+ log.warn("Skipping sync due to build errors.");
55
+ }
56
+ }
57
+ finally {
58
+ isBuilding = false;
59
+ }
60
+ }
61
+ const watcher = chokidar.watch(cwd, {
62
+ ignored: [/node_modules/, /\.git/, /dist/],
63
+ ignoreInitial: true,
64
+ });
65
+ watcher.on("all", async (event, path) => {
66
+ log.info(`File ${path} changed. Rebuilding...`);
67
+ await rebuildAndSync();
68
+ renderDashboardMenu();
69
+ });
70
+ renderDashboardMenu();
71
+ startKeyboardListener(async () => {
72
+ log.info("Manual reload triggered...");
73
+ await rebuildAndSync();
74
+ renderDashboardMenu();
75
+ }, () => {
76
+ log.warn("Stopping dev server...");
77
+ watcher.close();
78
+ killN8n();
79
+ process.exit(0);
80
+ });
81
+ // Keep process alive
82
+ return new Promise(() => { });
83
+ }
84
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"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"}