@n8n/workflow-sdk 0.2.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 (322) hide show
  1. package/LICENSE.md +88 -0
  2. package/README.md +30 -0
  3. package/dist/ast-interpreter/errors.d.ts +19 -0
  4. package/dist/ast-interpreter/errors.js +64 -0
  5. package/dist/ast-interpreter/errors.js.map +1 -0
  6. package/dist/ast-interpreter/index.d.ts +5 -0
  7. package/dist/ast-interpreter/index.js +18 -0
  8. package/dist/ast-interpreter/index.js.map +1 -0
  9. package/dist/ast-interpreter/interpreter.d.ts +2 -0
  10. package/dist/ast-interpreter/interpreter.js +471 -0
  11. package/dist/ast-interpreter/interpreter.js.map +1 -0
  12. package/dist/ast-interpreter/parser.d.ts +2 -0
  13. package/dist/ast-interpreter/parser.js +61 -0
  14. package/dist/ast-interpreter/parser.js.map +1 -0
  15. package/dist/ast-interpreter/validators.d.ts +13 -0
  16. package/dist/ast-interpreter/validators.js +243 -0
  17. package/dist/ast-interpreter/validators.js.map +1 -0
  18. package/dist/build.tsbuildinfo +1 -0
  19. package/dist/cli/code-to-json.d.ts +1 -0
  20. package/dist/cli/code-to-json.js +51 -0
  21. package/dist/cli/code-to-json.js.map +1 -0
  22. package/dist/cli/index.d.ts +2 -0
  23. package/dist/cli/index.js +25 -0
  24. package/dist/cli/index.js.map +1 -0
  25. package/dist/cli/json-to-code.d.ts +1 -0
  26. package/dist/cli/json-to-code.js +60 -0
  27. package/dist/cli/json-to-code.js.map +1 -0
  28. package/dist/cli/utils.d.ts +1 -0
  29. package/dist/cli/utils.js +16 -0
  30. package/dist/cli/utils.js.map +1 -0
  31. package/dist/codegen/code-generator.d.ts +14 -0
  32. package/dist/codegen/code-generator.js +807 -0
  33. package/dist/codegen/code-generator.js.map +1 -0
  34. package/dist/codegen/composite-builder.d.ts +3 -0
  35. package/dist/codegen/composite-builder.js +718 -0
  36. package/dist/codegen/composite-builder.js.map +1 -0
  37. package/dist/codegen/composite-handlers/build-utils.d.ts +24 -0
  38. package/dist/codegen/composite-handlers/build-utils.js +79 -0
  39. package/dist/codegen/composite-handlers/build-utils.js.map +1 -0
  40. package/dist/codegen/composite-handlers/error-handler.d.ts +6 -0
  41. package/dist/codegen/composite-handlers/error-handler.js +51 -0
  42. package/dist/codegen/composite-handlers/error-handler.js.map +1 -0
  43. package/dist/codegen/composite-handlers/if-else-handler.d.ts +5 -0
  44. package/dist/codegen/composite-handlers/if-else-handler.js +57 -0
  45. package/dist/codegen/composite-handlers/if-else-handler.js.map +1 -0
  46. package/dist/codegen/composite-handlers/index.d.ts +1 -0
  47. package/dist/codegen/composite-handlers/index.js +17 -0
  48. package/dist/codegen/composite-handlers/index.js.map +1 -0
  49. package/dist/codegen/composite-handlers/merge-handler.d.ts +5 -0
  50. package/dist/codegen/composite-handlers/merge-handler.js +25 -0
  51. package/dist/codegen/composite-handlers/merge-handler.js.map +1 -0
  52. package/dist/codegen/composite-handlers/sib-handler.d.ts +5 -0
  53. package/dist/codegen/composite-handlers/sib-handler.js +57 -0
  54. package/dist/codegen/composite-handlers/sib-handler.js.map +1 -0
  55. package/dist/codegen/composite-handlers/switch-case-handler.d.ts +5 -0
  56. package/dist/codegen/composite-handlers/switch-case-handler.js +80 -0
  57. package/dist/codegen/composite-handlers/switch-case-handler.js.map +1 -0
  58. package/dist/codegen/composite-tree.d.ts +81 -0
  59. package/dist/codegen/composite-tree.js +3 -0
  60. package/dist/codegen/composite-tree.js.map +1 -0
  61. package/dist/codegen/config-builder.d.ts +7 -0
  62. package/dist/codegen/config-builder.js +22 -0
  63. package/dist/codegen/config-builder.js.map +1 -0
  64. package/dist/codegen/constants.d.ts +5 -0
  65. package/dist/codegen/constants.js +30 -0
  66. package/dist/codegen/constants.js.map +1 -0
  67. package/dist/codegen/deferred-connections.d.ts +20 -0
  68. package/dist/codegen/deferred-connections.js +46 -0
  69. package/dist/codegen/deferred-connections.js.map +1 -0
  70. package/dist/codegen/execution-schema-jsdoc.d.ts +3 -0
  71. package/dist/codegen/execution-schema-jsdoc.js +109 -0
  72. package/dist/codegen/execution-schema-jsdoc.js.map +1 -0
  73. package/dist/codegen/execution-status.d.ts +9 -0
  74. package/dist/codegen/execution-status.js +42 -0
  75. package/dist/codegen/execution-status.js.map +1 -0
  76. package/dist/codegen/expression-annotator.d.ts +2 -0
  77. package/dist/codegen/expression-annotator.js +38 -0
  78. package/dist/codegen/expression-annotator.js.map +1 -0
  79. package/dist/codegen/graph-annotator.d.ts +2 -0
  80. package/dist/codegen/graph-annotator.js +107 -0
  81. package/dist/codegen/graph-annotator.js.map +1 -0
  82. package/dist/codegen/index.d.ts +20 -0
  83. package/dist/codegen/index.js +60 -0
  84. package/dist/codegen/index.js.map +1 -0
  85. package/dist/codegen/merge-pattern.d.ts +12 -0
  86. package/dist/codegen/merge-pattern.js +119 -0
  87. package/dist/codegen/merge-pattern.js.map +1 -0
  88. package/dist/codegen/node-type-utils.d.ts +4 -0
  89. package/dist/codegen/node-type-utils.js +38 -0
  90. package/dist/codegen/node-type-utils.js.map +1 -0
  91. package/dist/codegen/output-utils.d.ts +9 -0
  92. package/dist/codegen/output-utils.js +68 -0
  93. package/dist/codegen/output-utils.js.map +1 -0
  94. package/dist/codegen/parse-workflow-code.d.ts +3 -0
  95. package/dist/codegen/parse-workflow-code.js +438 -0
  96. package/dist/codegen/parse-workflow-code.js.map +1 -0
  97. package/dist/codegen/semantic-graph.d.ts +3 -0
  98. package/dist/codegen/semantic-graph.js +216 -0
  99. package/dist/codegen/semantic-graph.js.map +1 -0
  100. package/dist/codegen/semantic-registry.d.ts +18 -0
  101. package/dist/codegen/semantic-registry.js +102 -0
  102. package/dist/codegen/semantic-registry.js.map +1 -0
  103. package/dist/codegen/sib-merge-handler.d.ts +20 -0
  104. package/dist/codegen/sib-merge-handler.js +92 -0
  105. package/dist/codegen/sib-merge-handler.js.map +1 -0
  106. package/dist/codegen/string-utils.d.ts +6 -0
  107. package/dist/codegen/string-utils.js +38 -0
  108. package/dist/codegen/string-utils.js.map +1 -0
  109. package/dist/codegen/subnode-generator.d.ts +17 -0
  110. package/dist/codegen/subnode-generator.js +219 -0
  111. package/dist/codegen/subnode-generator.js.map +1 -0
  112. package/dist/codegen/types.d.ts +40 -0
  113. package/dist/codegen/types.js +16 -0
  114. package/dist/codegen/types.js.map +1 -0
  115. package/dist/codegen/variable-names.d.ts +8 -0
  116. package/dist/codegen/variable-names.js +121 -0
  117. package/dist/codegen/variable-names.js.map +1 -0
  118. package/dist/constants/index.d.ts +1 -0
  119. package/dist/constants/index.js +14 -0
  120. package/dist/constants/index.js.map +1 -0
  121. package/dist/constants/node-types.d.ts +19 -0
  122. package/dist/constants/node-types.js +46 -0
  123. package/dist/constants/node-types.js.map +1 -0
  124. package/dist/expression/index.d.ts +6 -0
  125. package/dist/expression/index.js +181 -0
  126. package/dist/expression/index.js.map +1 -0
  127. package/dist/expression.d.ts +1 -0
  128. package/dist/expression.js +10 -0
  129. package/dist/expression.js.map +1 -0
  130. package/dist/generate-types/generate-node-defs-cli.d.ts +7 -0
  131. package/dist/generate-types/generate-node-defs-cli.js +99 -0
  132. package/dist/generate-types/generate-node-defs-cli.js.map +1 -0
  133. package/dist/generate-types/generate-types.d.ts +163 -0
  134. package/dist/generate-types/generate-types.js +2569 -0
  135. package/dist/generate-types/generate-types.js.map +1 -0
  136. package/dist/generate-types/generate-zod-schemas.d.ts +41 -0
  137. package/dist/generate-types/generate-zod-schemas.js +1129 -0
  138. package/dist/generate-types/generate-zod-schemas.js.map +1 -0
  139. package/dist/generate-types/index.d.ts +3 -0
  140. package/dist/generate-types/index.js +62 -0
  141. package/dist/generate-types/index.js.map +1 -0
  142. package/dist/generate-types/zod-helpers.d.ts +189 -0
  143. package/dist/generate-types/zod-helpers.js +76 -0
  144. package/dist/generate-types/zod-helpers.js.map +1 -0
  145. package/dist/index.d.ts +20 -0
  146. package/dist/index.js +87 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/types/aliases.d.ts +5 -0
  149. package/dist/types/aliases.js +3 -0
  150. package/dist/types/aliases.js.map +1 -0
  151. package/dist/types/base.d.ts +395 -0
  152. package/dist/types/base.js +22 -0
  153. package/dist/types/base.js.map +1 -0
  154. package/dist/utils/code-helpers.d.ts +7 -0
  155. package/dist/utils/code-helpers.js +47 -0
  156. package/dist/utils/code-helpers.js.map +1 -0
  157. package/dist/utils/index.d.ts +2 -0
  158. package/dist/utils/index.js +11 -0
  159. package/dist/utils/index.js.map +1 -0
  160. package/dist/utils/safe-access.d.ts +3 -0
  161. package/dist/utils/safe-access.js +21 -0
  162. package/dist/utils/safe-access.js.map +1 -0
  163. package/dist/utils/trigger-detection.d.ts +1 -0
  164. package/dist/utils/trigger-detection.js +17 -0
  165. package/dist/utils/trigger-detection.js.map +1 -0
  166. package/dist/validation/display-options.d.ts +18 -0
  167. package/dist/validation/display-options.js +194 -0
  168. package/dist/validation/display-options.js.map +1 -0
  169. package/dist/validation/index.d.ts +34 -0
  170. package/dist/validation/index.js +428 -0
  171. package/dist/validation/index.js.map +1 -0
  172. package/dist/validation/input-resolver.d.ts +2 -0
  173. package/dist/validation/input-resolver.js +23 -0
  174. package/dist/validation/input-resolver.js.map +1 -0
  175. package/dist/validation/resolve-schema.d.ts +14 -0
  176. package/dist/validation/resolve-schema.js +105 -0
  177. package/dist/validation/resolve-schema.js.map +1 -0
  178. package/dist/validation/schema-helpers.d.ts +164 -0
  179. package/dist/validation/schema-helpers.js +51 -0
  180. package/dist/validation/schema-helpers.js.map +1 -0
  181. package/dist/validation/schema-validator.d.ts +22 -0
  182. package/dist/validation/schema-validator.js +402 -0
  183. package/dist/validation/schema-validator.js.map +1 -0
  184. package/dist/validation/test-schema-setup.d.ts +2 -0
  185. package/dist/validation/test-schema-setup.js +108 -0
  186. package/dist/validation/test-schema-setup.js.map +1 -0
  187. package/dist/validation.d.ts +1 -0
  188. package/dist/validation.js +9 -0
  189. package/dist/validation.js.map +1 -0
  190. package/dist/workflow-builder/connection-utils.d.ts +4 -0
  191. package/dist/workflow-builder/connection-utils.js +42 -0
  192. package/dist/workflow-builder/connection-utils.js.map +1 -0
  193. package/dist/workflow-builder/constants.d.ts +3 -0
  194. package/dist/workflow-builder/constants.js +7 -0
  195. package/dist/workflow-builder/constants.js.map +1 -0
  196. package/dist/workflow-builder/control-flow-builders/if-else.d.ts +2 -0
  197. package/dist/workflow-builder/control-flow-builders/if-else.js +3 -0
  198. package/dist/workflow-builder/control-flow-builders/if-else.js.map +1 -0
  199. package/dist/workflow-builder/control-flow-builders/next-batch.d.ts +2 -0
  200. package/dist/workflow-builder/control-flow-builders/next-batch.js +7 -0
  201. package/dist/workflow-builder/control-flow-builders/next-batch.js.map +1 -0
  202. package/dist/workflow-builder/control-flow-builders/split-in-batches.d.ts +27 -0
  203. package/dist/workflow-builder/control-flow-builders/split-in-batches.js +268 -0
  204. package/dist/workflow-builder/control-flow-builders/split-in-batches.js.map +1 -0
  205. package/dist/workflow-builder/control-flow-builders/switch-case.d.ts +2 -0
  206. package/dist/workflow-builder/control-flow-builders/switch-case.js +3 -0
  207. package/dist/workflow-builder/control-flow-builders/switch-case.js.map +1 -0
  208. package/dist/workflow-builder/layout-utils.d.ts +2 -0
  209. package/dist/workflow-builder/layout-utils.js +54 -0
  210. package/dist/workflow-builder/layout-utils.js.map +1 -0
  211. package/dist/workflow-builder/node-builders/index.d.ts +2 -0
  212. package/dist/workflow-builder/node-builders/index.js +29 -0
  213. package/dist/workflow-builder/node-builders/index.js.map +1 -0
  214. package/dist/workflow-builder/node-builders/node-builder.d.ts +26 -0
  215. package/dist/workflow-builder/node-builders/node-builder.js +596 -0
  216. package/dist/workflow-builder/node-builders/node-builder.js.map +1 -0
  217. package/dist/workflow-builder/node-builders/subnode-builders.d.ts +25 -0
  218. package/dist/workflow-builder/node-builders/subnode-builders.js +110 -0
  219. package/dist/workflow-builder/node-builders/subnode-builders.js.map +1 -0
  220. package/dist/workflow-builder/pin-data-utils.d.ts +5 -0
  221. package/dist/workflow-builder/pin-data-utils.js +54 -0
  222. package/dist/workflow-builder/pin-data-utils.js.map +1 -0
  223. package/dist/workflow-builder/plugins/composite-handlers/branch-handler-utils.d.ts +9 -0
  224. package/dist/workflow-builder/plugins/composite-handlers/branch-handler-utils.js +162 -0
  225. package/dist/workflow-builder/plugins/composite-handlers/branch-handler-utils.js.map +1 -0
  226. package/dist/workflow-builder/plugins/composite-handlers/if-else-handler.d.ts +5 -0
  227. package/dist/workflow-builder/plugins/composite-handlers/if-else-handler.js +83 -0
  228. package/dist/workflow-builder/plugins/composite-handlers/if-else-handler.js.map +1 -0
  229. package/dist/workflow-builder/plugins/composite-handlers/index.d.ts +3 -0
  230. package/dist/workflow-builder/plugins/composite-handlers/index.js +10 -0
  231. package/dist/workflow-builder/plugins/composite-handlers/index.js.map +1 -0
  232. package/dist/workflow-builder/plugins/composite-handlers/split-in-batches-handler.d.ts +15 -0
  233. package/dist/workflow-builder/plugins/composite-handlers/split-in-batches-handler.js +216 -0
  234. package/dist/workflow-builder/plugins/composite-handlers/split-in-batches-handler.js.map +1 -0
  235. package/dist/workflow-builder/plugins/composite-handlers/switch-case-handler.d.ts +5 -0
  236. package/dist/workflow-builder/plugins/composite-handlers/switch-case-handler.js +91 -0
  237. package/dist/workflow-builder/plugins/composite-handlers/switch-case-handler.js.map +1 -0
  238. package/dist/workflow-builder/plugins/defaults.d.ts +2 -0
  239. package/dist/workflow-builder/plugins/defaults.js +53 -0
  240. package/dist/workflow-builder/plugins/defaults.js.map +1 -0
  241. package/dist/workflow-builder/plugins/index.d.ts +3 -0
  242. package/dist/workflow-builder/plugins/index.js +9 -0
  243. package/dist/workflow-builder/plugins/index.js.map +1 -0
  244. package/dist/workflow-builder/plugins/registry.d.ts +22 -0
  245. package/dist/workflow-builder/plugins/registry.js +98 -0
  246. package/dist/workflow-builder/plugins/registry.js.map +1 -0
  247. package/dist/workflow-builder/plugins/serializers/index.d.ts +1 -0
  248. package/dist/workflow-builder/plugins/serializers/index.js +6 -0
  249. package/dist/workflow-builder/plugins/serializers/index.js.map +1 -0
  250. package/dist/workflow-builder/plugins/serializers/json-serializer.d.ts +3 -0
  251. package/dist/workflow-builder/plugins/serializers/json-serializer.js +140 -0
  252. package/dist/workflow-builder/plugins/serializers/json-serializer.js.map +1 -0
  253. package/dist/workflow-builder/plugins/types.d.ts +76 -0
  254. package/dist/workflow-builder/plugins/types.js +29 -0
  255. package/dist/workflow-builder/plugins/types.js.map +1 -0
  256. package/dist/workflow-builder/plugins/validators/agent-validator.d.ts +2 -0
  257. package/dist/workflow-builder/plugins/validators/agent-validator.js +45 -0
  258. package/dist/workflow-builder/plugins/validators/agent-validator.js.map +1 -0
  259. package/dist/workflow-builder/plugins/validators/chain-llm-validator.d.ts +2 -0
  260. package/dist/workflow-builder/plugins/validators/chain-llm-validator.js +39 -0
  261. package/dist/workflow-builder/plugins/validators/chain-llm-validator.js.map +1 -0
  262. package/dist/workflow-builder/plugins/validators/date-method-validator.d.ts +2 -0
  263. package/dist/workflow-builder/plugins/validators/date-method-validator.js +28 -0
  264. package/dist/workflow-builder/plugins/validators/date-method-validator.js.map +1 -0
  265. package/dist/workflow-builder/plugins/validators/disconnected-node-validator.d.ts +2 -0
  266. package/dist/workflow-builder/plugins/validators/disconnected-node-validator.js +142 -0
  267. package/dist/workflow-builder/plugins/validators/disconnected-node-validator.js.map +1 -0
  268. package/dist/workflow-builder/plugins/validators/expression-path-validator.d.ts +2 -0
  269. package/dist/workflow-builder/plugins/validators/expression-path-validator.js +155 -0
  270. package/dist/workflow-builder/plugins/validators/expression-path-validator.js.map +1 -0
  271. package/dist/workflow-builder/plugins/validators/expression-prefix-validator.d.ts +2 -0
  272. package/dist/workflow-builder/plugins/validators/expression-prefix-validator.js +32 -0
  273. package/dist/workflow-builder/plugins/validators/expression-prefix-validator.js.map +1 -0
  274. package/dist/workflow-builder/plugins/validators/from-ai-validator.d.ts +2 -0
  275. package/dist/workflow-builder/plugins/validators/from-ai-validator.js +30 -0
  276. package/dist/workflow-builder/plugins/validators/from-ai-validator.js.map +1 -0
  277. package/dist/workflow-builder/plugins/validators/http-request-validator.d.ts +2 -0
  278. package/dist/workflow-builder/plugins/validators/http-request-validator.js +55 -0
  279. package/dist/workflow-builder/plugins/validators/http-request-validator.js.map +1 -0
  280. package/dist/workflow-builder/plugins/validators/index.d.ts +15 -0
  281. package/dist/workflow-builder/plugins/validators/index.js +34 -0
  282. package/dist/workflow-builder/plugins/validators/index.js.map +1 -0
  283. package/dist/workflow-builder/plugins/validators/max-nodes-validator.d.ts +2 -0
  284. package/dist/workflow-builder/plugins/validators/max-nodes-validator.js +40 -0
  285. package/dist/workflow-builder/plugins/validators/max-nodes-validator.js.map +1 -0
  286. package/dist/workflow-builder/plugins/validators/merge-node-validator.d.ts +2 -0
  287. package/dist/workflow-builder/plugins/validators/merge-node-validator.js +54 -0
  288. package/dist/workflow-builder/plugins/validators/merge-node-validator.js.map +1 -0
  289. package/dist/workflow-builder/plugins/validators/missing-trigger-validator.d.ts +2 -0
  290. package/dist/workflow-builder/plugins/validators/missing-trigger-validator.js +27 -0
  291. package/dist/workflow-builder/plugins/validators/missing-trigger-validator.js.map +1 -0
  292. package/dist/workflow-builder/plugins/validators/no-nodes-validator.d.ts +2 -0
  293. package/dist/workflow-builder/plugins/validators/no-nodes-validator.js +23 -0
  294. package/dist/workflow-builder/plugins/validators/no-nodes-validator.js.map +1 -0
  295. package/dist/workflow-builder/plugins/validators/set-node-validator.d.ts +2 -0
  296. package/dist/workflow-builder/plugins/validators/set-node-validator.js +41 -0
  297. package/dist/workflow-builder/plugins/validators/set-node-validator.js.map +1 -0
  298. package/dist/workflow-builder/plugins/validators/subnode-connection-validator.d.ts +2 -0
  299. package/dist/workflow-builder/plugins/validators/subnode-connection-validator.js +64 -0
  300. package/dist/workflow-builder/plugins/validators/subnode-connection-validator.js.map +1 -0
  301. package/dist/workflow-builder/plugins/validators/tool-node-validator.d.ts +2 -0
  302. package/dist/workflow-builder/plugins/validators/tool-node-validator.js +37 -0
  303. package/dist/workflow-builder/plugins/validators/tool-node-validator.js.map +1 -0
  304. package/dist/workflow-builder/string-utils.d.ts +9 -0
  305. package/dist/workflow-builder/string-utils.js +237 -0
  306. package/dist/workflow-builder/string-utils.js.map +1 -0
  307. package/dist/workflow-builder/subnode-utils.d.ts +2 -0
  308. package/dist/workflow-builder/subnode-utils.js +180 -0
  309. package/dist/workflow-builder/subnode-utils.js.map +1 -0
  310. package/dist/workflow-builder/type-guards.d.ts +15 -0
  311. package/dist/workflow-builder/type-guards.js +48 -0
  312. package/dist/workflow-builder/type-guards.js.map +1 -0
  313. package/dist/workflow-builder/validation-helpers.d.ts +27 -0
  314. package/dist/workflow-builder/validation-helpers.js +195 -0
  315. package/dist/workflow-builder/validation-helpers.js.map +1 -0
  316. package/dist/workflow-builder/workflow-import.d.ts +15 -0
  317. package/dist/workflow-builder/workflow-import.js +102 -0
  318. package/dist/workflow-builder/workflow-import.js.map +1 -0
  319. package/dist/workflow-builder.d.ts +2 -0
  320. package/dist/workflow-builder.js +636 -0
  321. package/dist/workflow-builder.js.map +1 -0
  322. package/package.json +61 -0
@@ -0,0 +1,807 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateCode = generateCode;
4
+ const constants_1 = require("./constants");
5
+ const execution_schema_jsdoc_1 = require("./execution-schema-jsdoc");
6
+ const node_type_utils_1 = require("./node-type-utils");
7
+ const string_utils_1 = require("./string-utils");
8
+ const subnode_generator_1 = require("./subnode-generator");
9
+ const variable_names_1 = require("./variable-names");
10
+ function getIndent(ctx) {
11
+ return ' '.repeat(ctx.indent);
12
+ }
13
+ function generateSubnodeCall(subnodeNode, builderName, ctx) {
14
+ const parts = [];
15
+ parts.push(`type: '${subnodeNode.type}'`);
16
+ parts.push(`version: ${subnodeNode.json.typeVersion}`);
17
+ const configParts = [];
18
+ const defaultName = (0, node_type_utils_1.generateDefaultNodeName)(subnodeNode.type);
19
+ if (subnodeNode.json.name && subnodeNode.json.name !== defaultName) {
20
+ configParts.push(`name: '${(0, string_utils_1.escapeString)(subnodeNode.json.name)}'`);
21
+ }
22
+ if (subnodeNode.json.parameters && Object.keys(subnodeNode.json.parameters).length > 0) {
23
+ configParts.push(`parameters: ${(0, subnode_generator_1.formatValue)(subnodeNode.json.parameters, ctx)}`);
24
+ }
25
+ if (subnodeNode.json.credentials) {
26
+ configParts.push(`credentials: ${(0, subnode_generator_1.formatValue)(subnodeNode.json.credentials, ctx)}`);
27
+ }
28
+ const pos = subnodeNode.json.position;
29
+ if (pos && (pos[0] !== 0 || pos[1] !== 0)) {
30
+ configParts.push(`position: [${pos[0]}, ${pos[1]}]`);
31
+ }
32
+ const nestedSubnodesConfig = generateSubnodesConfigForNode(subnodeNode, ctx);
33
+ if (nestedSubnodesConfig) {
34
+ configParts.push(`subnodes: ${nestedSubnodesConfig}`);
35
+ }
36
+ if (configParts.length > 0) {
37
+ parts.push(`config: { ${configParts.join(', ')} }`);
38
+ }
39
+ else {
40
+ parts.push('config: {}');
41
+ }
42
+ return `${builderName}({ ${parts.join(', ')} })`;
43
+ }
44
+ function generateSubnodesConfigForNode(node, ctx) {
45
+ if (node.subnodes.length === 0) {
46
+ return null;
47
+ }
48
+ const grouped = new Map();
49
+ for (const sub of node.subnodes) {
50
+ const subnodeNode = ctx.graph.nodes.get(sub.subnodeName);
51
+ if (!subnodeNode)
52
+ continue;
53
+ const existing = grouped.get(sub.connectionType) ?? [];
54
+ existing.push(subnodeNode);
55
+ grouped.set(sub.connectionType, existing);
56
+ }
57
+ const entries = [];
58
+ for (const [connType, subnodeNodes] of grouped) {
59
+ const configKey = constants_1.AI_CONNECTION_TO_CONFIG_KEY[connType];
60
+ const builderName = constants_1.AI_CONNECTION_TO_BUILDER[connType];
61
+ if (subnodeNodes.length === 0)
62
+ continue;
63
+ const calls = subnodeNodes.map((n) => generateSubnodeCall(n, builderName, ctx));
64
+ if (constants_1.AI_ALWAYS_ARRAY_TYPES.has(connType)) {
65
+ entries.push(`${configKey}: [${calls.join(', ')}]`);
66
+ }
67
+ else if (constants_1.AI_OPTIONAL_ARRAY_TYPES.has(connType)) {
68
+ if (subnodeNodes.length === 1) {
69
+ entries.push(`${configKey}: ${calls[0]}`);
70
+ }
71
+ else {
72
+ entries.push(`${configKey}: [${calls.join(', ')}]`);
73
+ }
74
+ }
75
+ else {
76
+ entries.push(`${configKey}: ${calls[0]}`);
77
+ }
78
+ }
79
+ if (entries.length === 0) {
80
+ return null;
81
+ }
82
+ return `{ ${entries.join(', ')} }`;
83
+ }
84
+ function generateSubnodesConfig(node, ctx) {
85
+ return generateSubnodesConfigForNode(node, ctx);
86
+ }
87
+ function collectSubnodesAsVariables(node, ctx) {
88
+ if (node.subnodes.length === 0)
89
+ return;
90
+ for (const sub of node.subnodes) {
91
+ const subnodeNode = ctx.graph.nodes.get(sub.subnodeName);
92
+ if (!subnodeNode)
93
+ continue;
94
+ collectSubnodesAsVariables(subnodeNode, ctx);
95
+ const builderName = constants_1.AI_CONNECTION_TO_BUILDER[sub.connectionType];
96
+ ctx.subnodeVariables.set(sub.subnodeName, { node: subnodeNode, builderName });
97
+ }
98
+ }
99
+ function generateSubnodeCallWithVarRefs(subnodeNode, builderName, ctx) {
100
+ const parts = [];
101
+ parts.push(`type: '${subnodeNode.type}'`);
102
+ parts.push(`version: ${subnodeNode.json.typeVersion}`);
103
+ const configParts = [];
104
+ const defaultName = (0, node_type_utils_1.generateDefaultNodeName)(subnodeNode.type);
105
+ if (subnodeNode.json.name && subnodeNode.json.name !== defaultName) {
106
+ configParts.push(`name: '${(0, string_utils_1.escapeString)(subnodeNode.json.name)}'`);
107
+ }
108
+ if (subnodeNode.json.parameters && Object.keys(subnodeNode.json.parameters).length > 0) {
109
+ configParts.push(`parameters: ${(0, subnode_generator_1.formatValue)(subnodeNode.json.parameters, ctx)}`);
110
+ }
111
+ if (subnodeNode.json.credentials) {
112
+ configParts.push(`credentials: ${(0, subnode_generator_1.formatValue)(subnodeNode.json.credentials, ctx)}`);
113
+ }
114
+ const pos = subnodeNode.json.position;
115
+ if (pos && (pos[0] !== 0 || pos[1] !== 0)) {
116
+ configParts.push(`position: [${pos[0]}, ${pos[1]}]`);
117
+ }
118
+ const nestedSubnodesConfig = generateSubnodesConfigWithVarRefs(subnodeNode, ctx);
119
+ if (nestedSubnodesConfig) {
120
+ configParts.push(`subnodes: ${nestedSubnodesConfig}`);
121
+ }
122
+ if (configParts.length > 0) {
123
+ parts.push(`config: { ${configParts.join(', ')} }`);
124
+ }
125
+ else {
126
+ parts.push('config: {}');
127
+ }
128
+ return `${builderName}({ ${parts.join(', ')} })`;
129
+ }
130
+ function generateSubnodesConfigWithVarRefs(node, ctx) {
131
+ if (node.subnodes.length === 0) {
132
+ return null;
133
+ }
134
+ const grouped = new Map();
135
+ for (const sub of node.subnodes) {
136
+ const varName = (0, variable_names_1.getVarName)(sub.subnodeName, ctx);
137
+ const existing = grouped.get(sub.connectionType) ?? [];
138
+ existing.push(varName);
139
+ grouped.set(sub.connectionType, existing);
140
+ }
141
+ const entries = [];
142
+ for (const [connType, varNames] of grouped) {
143
+ const configKey = constants_1.AI_CONNECTION_TO_CONFIG_KEY[connType];
144
+ if (varNames.length === 0)
145
+ continue;
146
+ if (constants_1.AI_ALWAYS_ARRAY_TYPES.has(connType)) {
147
+ entries.push(`${configKey}: [${varNames.join(', ')}]`);
148
+ }
149
+ else if (constants_1.AI_OPTIONAL_ARRAY_TYPES.has(connType)) {
150
+ if (varNames.length === 1) {
151
+ entries.push(`${configKey}: ${varNames[0]}`);
152
+ }
153
+ else {
154
+ entries.push(`${configKey}: [${varNames.join(', ')}]`);
155
+ }
156
+ }
157
+ else {
158
+ entries.push(`${configKey}: ${varNames[0]}`);
159
+ }
160
+ }
161
+ if (entries.length === 0) {
162
+ return null;
163
+ }
164
+ return `{ ${entries.join(', ')} }`;
165
+ }
166
+ function generateSubnodeVariableDeclarations(ctx) {
167
+ const declarations = [];
168
+ for (const [nodeName, { node, builderName }] of ctx.subnodeVariables) {
169
+ const varName = (0, variable_names_1.getUniqueVarName)(nodeName, ctx);
170
+ const call = generateSubnodeCallWithVarRefs(node, builderName, ctx);
171
+ declarations.push(`const ${varName} = ${call};`);
172
+ }
173
+ return declarations;
174
+ }
175
+ function generateNodeConfig(node, ctx) {
176
+ const indent = getIndent(ctx);
177
+ const innerIndent = getIndent({ ...ctx, indent: ctx.indent + 1 });
178
+ const parts = [];
179
+ parts.push(`${innerIndent}type: '${node.type}'`);
180
+ parts.push(`${innerIndent}version: ${node.json.typeVersion}`);
181
+ const configParts = [];
182
+ if (node.json.name) {
183
+ configParts.push(`name: '${(0, string_utils_1.escapeString)(node.json.name)}'`);
184
+ }
185
+ if (node.json.parameters && Object.keys(node.json.parameters).length > 0) {
186
+ configParts.push(`parameters: ${(0, subnode_generator_1.formatValue)(node.json.parameters, ctx)}`);
187
+ }
188
+ if (node.json.credentials) {
189
+ configParts.push(`credentials: ${(0, subnode_generator_1.formatValue)(node.json.credentials, ctx)}`);
190
+ }
191
+ const pos = node.json.position;
192
+ if (pos && (pos[0] !== 0 || pos[1] !== 0)) {
193
+ configParts.push(`position: [${pos[0]}, ${pos[1]}]`);
194
+ }
195
+ if (node.json.onError) {
196
+ configParts.push(`onError: '${node.json.onError}'`);
197
+ }
198
+ const subnodesConfig = ctx.subnodeVariables.size > 0
199
+ ? generateSubnodesConfigWithVarRefs(node, ctx)
200
+ : generateSubnodesConfig(node, ctx);
201
+ if (subnodesConfig) {
202
+ configParts.push(`subnodes: ${subnodesConfig}`);
203
+ }
204
+ if (configParts.length > 0) {
205
+ const configStr = configParts.join(', ');
206
+ const hasExpressionAnnotations = configStr.includes('/** @example');
207
+ const hasMultiline = configParts.some((entry) => entry.includes('\n'));
208
+ if (hasExpressionAnnotations || hasMultiline) {
209
+ const configIndent = getIndent({ ...ctx, indent: ctx.indent + 2 });
210
+ const withCommas = configParts.map((entry, i) => {
211
+ if (i === configParts.length - 1)
212
+ return entry;
213
+ const lastLineStart = entry.lastIndexOf('\n');
214
+ const lastLine = lastLineStart >= 0 ? entry.substring(lastLineStart) : entry;
215
+ if (lastLine.trimEnd().endsWith(',')) {
216
+ return entry;
217
+ }
218
+ return entry + ',';
219
+ });
220
+ parts.push(`${innerIndent}config: {\n${withCommas.map((p) => `${configIndent}${p}`).join('\n')}\n${innerIndent}}`);
221
+ }
222
+ else {
223
+ parts.push(`${innerIndent}config: { ${configStr} }`);
224
+ }
225
+ }
226
+ else {
227
+ parts.push(`${innerIndent}config: {}`);
228
+ }
229
+ const nodeName = node.json.name;
230
+ if (nodeName && ctx.nodeSchemas?.has(nodeName)) {
231
+ const schema = ctx.nodeSchemas.get(nodeName);
232
+ const outputSample = (0, execution_schema_jsdoc_1.schemaToOutputSample)(schema, ctx.valuesExcluded);
233
+ if (outputSample && Object.keys(outputSample).length > 0) {
234
+ if (ctx.valuesExcluded) {
235
+ parts.push(`${innerIndent}// Output values redacted`);
236
+ }
237
+ if (ctx.pinnedNodes?.has(nodeName)) {
238
+ parts.push(`${innerIndent}// Data is pinned. User must unpin node for real data`);
239
+ }
240
+ parts.push(`${innerIndent}output: [${(0, subnode_generator_1.formatValue)(outputSample, ctx)}]`);
241
+ }
242
+ }
243
+ return `{\n${parts.join(',\n')}\n${indent}}`;
244
+ }
245
+ function getVarRefOrInlineNode(node, ctx) {
246
+ const nodeName = node.json.name;
247
+ if (nodeName && ctx.variableNodes.has(nodeName)) {
248
+ return (0, variable_names_1.getVarName)(nodeName, ctx);
249
+ }
250
+ return generateNodeCall(node, ctx);
251
+ }
252
+ function getNodesInsideSticky(stickyNode, ctx) {
253
+ const pos = stickyNode.json.position ?? [0, 0];
254
+ const params = stickyNode.json.parameters;
255
+ const width = Number(params?.width) || 0;
256
+ const height = Number(params?.height) || 0;
257
+ if (width === 0 || height === 0)
258
+ return [];
259
+ const containedNodes = [];
260
+ for (const [nodeName, node] of ctx.graph.nodes) {
261
+ if ((0, node_type_utils_1.isStickyNote)(node.type))
262
+ continue;
263
+ const nodePos = node.json.position ?? [0, 0];
264
+ if (nodePos[0] >= pos[0] &&
265
+ nodePos[0] <= pos[0] + width &&
266
+ nodePos[1] >= pos[1] &&
267
+ nodePos[1] <= pos[1] + height) {
268
+ const varName = ctx.nodeNameToVarName.get(nodeName);
269
+ if (varName)
270
+ containedNodes.push(varName);
271
+ }
272
+ }
273
+ return containedNodes;
274
+ }
275
+ function generateStickyCall(node, ctx) {
276
+ const content = (0, string_utils_1.escapeString)(node.json.parameters?.content ?? '');
277
+ const nodesInside = getNodesInsideSticky(node, ctx);
278
+ const nodesStr = `[${nodesInside.join(', ')}]`;
279
+ const options = [];
280
+ if (node.json.name) {
281
+ options.push(`name: '${(0, string_utils_1.escapeString)(node.json.name)}'`);
282
+ }
283
+ const params = node.json.parameters;
284
+ if (params?.color !== undefined) {
285
+ options.push(`color: ${String(params.color)}`);
286
+ }
287
+ if (params?.width !== undefined) {
288
+ options.push(`width: ${Number(params.width)}`);
289
+ }
290
+ if (params?.height !== undefined) {
291
+ options.push(`height: ${Number(params.height)}`);
292
+ }
293
+ const pos = node.json.position;
294
+ if (pos && (pos[0] !== 0 || pos[1] !== 0)) {
295
+ options.push(`position: [${pos[0]}, ${pos[1]}]`);
296
+ }
297
+ const optionsStr = options.length > 0 ? `, { ${options.join(', ')} }` : '';
298
+ return `sticky('${content}', ${nodesStr}${optionsStr})`;
299
+ }
300
+ function generateMergeCall(node, ctx) {
301
+ const indent = getIndent(ctx);
302
+ const innerIndent = getIndent({ ...ctx, indent: ctx.indent + 1 });
303
+ const parts = [];
304
+ parts.push(`${innerIndent}version: ${node.json.typeVersion}`);
305
+ const configParts = [];
306
+ if (node.json.name) {
307
+ configParts.push(`name: '${(0, string_utils_1.escapeString)(node.json.name)}'`);
308
+ }
309
+ if (node.json.parameters && Object.keys(node.json.parameters).length > 0) {
310
+ configParts.push(`parameters: ${(0, subnode_generator_1.formatValue)(node.json.parameters, ctx)}`);
311
+ }
312
+ if (node.json.credentials) {
313
+ configParts.push(`credentials: ${(0, subnode_generator_1.formatValue)(node.json.credentials, ctx)}`);
314
+ }
315
+ const pos = node.json.position;
316
+ if (pos && (pos[0] !== 0 || pos[1] !== 0)) {
317
+ configParts.push(`position: [${pos[0]}, ${pos[1]}]`);
318
+ }
319
+ if (node.json.onError) {
320
+ configParts.push(`onError: '${node.json.onError}'`);
321
+ }
322
+ if (configParts.length > 0) {
323
+ parts.push(`${innerIndent}config: { ${configParts.join(', ')} }`);
324
+ }
325
+ return `merge({\n${parts.join(',\n')}\n${indent}})`;
326
+ }
327
+ function generateNodeCall(node, ctx) {
328
+ if ((0, node_type_utils_1.isStickyNote)(node.type)) {
329
+ return generateStickyCall(node, ctx);
330
+ }
331
+ if ((0, node_type_utils_1.isMergeType)(node.type)) {
332
+ return generateMergeCall(node, ctx);
333
+ }
334
+ const config = generateNodeConfig(node, ctx);
335
+ if ((0, node_type_utils_1.isTriggerType)(node.type)) {
336
+ return `trigger(${config})`;
337
+ }
338
+ else {
339
+ return `node(${config})`;
340
+ }
341
+ }
342
+ function generateLeafCode(leaf, ctx) {
343
+ const nodeName = leaf.node.json.name;
344
+ if (nodeName && ctx.variableNodes.has(nodeName)) {
345
+ return (0, variable_names_1.getVarName)(nodeName, ctx);
346
+ }
347
+ const nodeCall = generateNodeCall(leaf.node, ctx);
348
+ if (nodeName) {
349
+ const jsdoc = generateNodeJSDoc(nodeName, ctx);
350
+ if (jsdoc) {
351
+ return `${jsdoc}\n${nodeCall}`;
352
+ }
353
+ }
354
+ return nodeCall;
355
+ }
356
+ function generateLeaf(leaf, ctx) {
357
+ let code = generateLeafCode(leaf, ctx);
358
+ if (leaf.errorHandler) {
359
+ const errorHandlerCode = generateComposite(leaf.errorHandler, ctx);
360
+ code += `\n${getIndent(ctx)}.onError(${errorHandlerCode})`;
361
+ }
362
+ return code;
363
+ }
364
+ function generateChain(chain, ctx) {
365
+ const parts = [];
366
+ for (let i = 0; i < chain.nodes.length; i++) {
367
+ const node = chain.nodes[i];
368
+ const nodeCode = generateComposite(node, ctx);
369
+ if (i === 0) {
370
+ parts.push(nodeCode);
371
+ }
372
+ else {
373
+ parts.push(`.to(${nodeCode})`);
374
+ }
375
+ }
376
+ return parts.join('\n' + getIndent(ctx));
377
+ }
378
+ function generateVarRef(varRef, _ctx) {
379
+ return varRef.varName;
380
+ }
381
+ function generateBranchCode(branch, ctx) {
382
+ if (branch === null)
383
+ return 'null';
384
+ if (Array.isArray(branch)) {
385
+ const branchesCode = branch.map((b) => generateComposite(b, ctx)).join(', ');
386
+ return `[${branchesCode}]`;
387
+ }
388
+ return generateComposite(branch, ctx);
389
+ }
390
+ function generateIfElse(ifElse, ctx) {
391
+ const innerCtx = { ...ctx, indent: ctx.indent + 1 };
392
+ const ifNodeRef = getVarRefOrInlineNode(ifElse.ifNode, ctx);
393
+ let code = ifNodeRef;
394
+ if (ifElse.trueBranch !== null) {
395
+ const trueBranchCode = generateBranchCode(ifElse.trueBranch, innerCtx);
396
+ code += `.onTrue(${trueBranchCode})`;
397
+ }
398
+ if (ifElse.falseBranch !== null) {
399
+ const falseBranchCode = generateBranchCode(ifElse.falseBranch, innerCtx);
400
+ code += `.onFalse(${falseBranchCode})`;
401
+ }
402
+ return code;
403
+ }
404
+ function generateSwitchCase(switchCase, ctx) {
405
+ const innerCtx = { ...ctx, indent: ctx.indent + 1 };
406
+ const switchNodeRef = getVarRefOrInlineNode(switchCase.switchNode, ctx);
407
+ if (switchCase.cases.length === 0) {
408
+ return switchNodeRef;
409
+ }
410
+ let code = switchNodeRef;
411
+ switchCase.cases.forEach((c, i) => {
412
+ const caseIndex = switchCase.caseIndices[i] ?? i;
413
+ const caseCode = generateBranchCode(c, innerCtx);
414
+ code += `.onCase(${caseIndex}, ${caseCode})`;
415
+ });
416
+ return code;
417
+ }
418
+ function generateMerge(merge, ctx) {
419
+ const innerCtx = { ...ctx, indent: ctx.indent + 1 };
420
+ const inputEntries = merge.branches
421
+ .map((b, i) => {
422
+ const inputIndex = merge.inputIndices[i] ?? i;
423
+ return `input${inputIndex}: ${generateComposite(b, innerCtx)}`;
424
+ })
425
+ .join(', ');
426
+ const mergeNodeRef = getVarRefOrInlineNode(merge.mergeNode, ctx);
427
+ return `merge(${mergeNodeRef}, { ${inputEntries} })`;
428
+ }
429
+ function branchEndsWithVarRef(branch) {
430
+ if (branch === null)
431
+ return false;
432
+ if (Array.isArray(branch)) {
433
+ return branch.some((b) => branchEndsWithVarRef(b));
434
+ }
435
+ if (branch.kind === 'chain') {
436
+ const lastNode = branch.nodes[branch.nodes.length - 1];
437
+ return lastNode?.kind === 'varRef';
438
+ }
439
+ return branch.kind === 'varRef';
440
+ }
441
+ function stripTrailingVarRefFromCode(code, varName) {
442
+ const toPattern = new RegExp(`\\.to\\(${(0, string_utils_1.escapeRegexChars)(varName)}\\)$`);
443
+ if (toPattern.test(code)) {
444
+ return code.replace(toPattern, '');
445
+ }
446
+ if (code.trim() === varName) {
447
+ return null;
448
+ }
449
+ return code;
450
+ }
451
+ function generateSplitInBatches(sib, ctx) {
452
+ const innerCtx = { ...ctx, indent: ctx.indent + 1 };
453
+ const sibVarName = (0, variable_names_1.getVarName)(sib.sibNode.name, ctx);
454
+ let code = `splitInBatches(${sibVarName})`;
455
+ if (sib.loopChain) {
456
+ let eachCode;
457
+ if (Array.isArray(sib.loopChain)) {
458
+ const transformedBranches = sib.loopChain.map((branch) => {
459
+ let branchCode = generateComposite(branch, innerCtx);
460
+ if (branchEndsWithVarRef(branch)) {
461
+ const strippedCode = stripTrailingVarRefFromCode(branchCode, sibVarName);
462
+ if (strippedCode === null) {
463
+ branchCode = `nextBatch(${sibVarName})`;
464
+ }
465
+ else {
466
+ branchCode = `${strippedCode}.to(nextBatch(${sibVarName}))`;
467
+ }
468
+ }
469
+ return branchCode;
470
+ });
471
+ eachCode = `[${transformedBranches.join(', ')}]`;
472
+ }
473
+ else {
474
+ eachCode = generateBranchCode(sib.loopChain, innerCtx);
475
+ if (branchEndsWithVarRef(sib.loopChain)) {
476
+ const strippedCode = stripTrailingVarRefFromCode(eachCode, sibVarName);
477
+ if (strippedCode === null) {
478
+ eachCode = `nextBatch(${sibVarName})`;
479
+ }
480
+ else {
481
+ eachCode = `${strippedCode}.to(nextBatch(${sibVarName}))`;
482
+ }
483
+ }
484
+ }
485
+ code += `\n${getIndent(ctx)}.onEachBatch(${eachCode})`;
486
+ }
487
+ if (sib.doneChain) {
488
+ const doneCode = generateBranchCode(sib.doneChain, innerCtx);
489
+ code += `\n${getIndent(ctx)}.onDone(${doneCode})`;
490
+ }
491
+ return code;
492
+ }
493
+ function generateFanOut(fanOut, ctx) {
494
+ const innerCtx = { ...ctx, indent: ctx.indent + 1 };
495
+ const sourceCode = generateComposite(fanOut.sourceNode, ctx);
496
+ const targetsCode = fanOut.targets
497
+ .map((target) => generateComposite(target, innerCtx))
498
+ .join(',\n' + getIndent(innerCtx));
499
+ return `${sourceCode}\n${getIndent(ctx)}.to([\n${getIndent(innerCtx)}${targetsCode}])`;
500
+ }
501
+ function generateExplicitConnections(explicitConns, ctx) {
502
+ if (explicitConns.nodes.length > 0) {
503
+ const firstNode = explicitConns.nodes[0];
504
+ const varName = (0, variable_names_1.getVarName)(firstNode.name, ctx);
505
+ return varName;
506
+ }
507
+ return '';
508
+ }
509
+ function generateMultiOutput(multiOutput, ctx) {
510
+ const varName = (0, variable_names_1.getVarName)(multiOutput.sourceNode.name, ctx);
511
+ return varName;
512
+ }
513
+ function generateComposite(node, ctx) {
514
+ switch (node.kind) {
515
+ case 'leaf':
516
+ return generateLeaf(node, ctx);
517
+ case 'chain':
518
+ return generateChain(node, ctx);
519
+ case 'varRef':
520
+ return generateVarRef(node, ctx);
521
+ case 'ifElse':
522
+ return generateIfElse(node, ctx);
523
+ case 'switchCase':
524
+ return generateSwitchCase(node, ctx);
525
+ case 'merge':
526
+ return generateMerge(node, ctx);
527
+ case 'splitInBatches':
528
+ return generateSplitInBatches(node, ctx);
529
+ case 'fanOut':
530
+ return generateFanOut(node, ctx);
531
+ case 'explicitConnections':
532
+ return generateExplicitConnections(node, ctx);
533
+ case 'multiOutput':
534
+ return generateMultiOutput(node, ctx);
535
+ }
536
+ }
537
+ function generateNodeJSDoc(nodeName, ctx) {
538
+ const jsdocParts = [];
539
+ const status = ctx.nodeExecutionStatus?.get(nodeName);
540
+ if (status?.status === 'error') {
541
+ jsdocParts.push(`@nodeExecutionStatus error - ${status.errorMessage}`);
542
+ }
543
+ else if (status?.status === 'success') {
544
+ jsdocParts.push('@nodeExecutionStatus success');
545
+ }
546
+ if (jsdocParts.length === 0)
547
+ return null;
548
+ const lines = ['/**'];
549
+ for (const part of jsdocParts) {
550
+ for (const line of part.split('\n')) {
551
+ lines.push(` * ${line}`);
552
+ }
553
+ }
554
+ lines.push(' */');
555
+ return lines.join('\n');
556
+ }
557
+ function generateVariableDeclarations(variables, ctx) {
558
+ const declarations = [];
559
+ for (const [nodeName, node] of variables) {
560
+ const varName = (0, variable_names_1.getUniqueVarName)(nodeName, ctx);
561
+ const nodeCall = generateNodeCall(node, ctx);
562
+ const jsdoc = generateNodeJSDoc(nodeName, ctx);
563
+ if (jsdoc) {
564
+ declarations.push(`${jsdoc}\nconst ${varName} = ${nodeCall};`);
565
+ }
566
+ else {
567
+ declarations.push(`const ${varName} = ${nodeCall};`);
568
+ }
569
+ ctx.generatedVars.add(nodeName);
570
+ }
571
+ return declarations.join('\n\n');
572
+ }
573
+ function collectNestedMultiOutputs(node, collected) {
574
+ if (!node)
575
+ return;
576
+ if (node.kind === 'multiOutput') {
577
+ collected.push(node);
578
+ for (const [, target] of node.outputTargets) {
579
+ collectNestedMultiOutputs(target, collected);
580
+ }
581
+ }
582
+ else if (node.kind === 'chain') {
583
+ for (const n of node.nodes) {
584
+ collectNestedMultiOutputs(n, collected);
585
+ }
586
+ }
587
+ else if (node.kind === 'splitInBatches') {
588
+ const sib = node;
589
+ if (sib.doneChain) {
590
+ if (Array.isArray(sib.doneChain)) {
591
+ for (const b of sib.doneChain)
592
+ collectNestedMultiOutputs(b, collected);
593
+ }
594
+ else {
595
+ collectNestedMultiOutputs(sib.doneChain, collected);
596
+ }
597
+ }
598
+ if (sib.loopChain) {
599
+ if (Array.isArray(sib.loopChain)) {
600
+ for (const b of sib.loopChain)
601
+ collectNestedMultiOutputs(b, collected);
602
+ }
603
+ else {
604
+ collectNestedMultiOutputs(sib.loopChain, collected);
605
+ }
606
+ }
607
+ }
608
+ else if (node.kind === 'ifElse') {
609
+ const ifElse = node;
610
+ if (ifElse.trueBranch) {
611
+ if (Array.isArray(ifElse.trueBranch)) {
612
+ for (const b of ifElse.trueBranch)
613
+ collectNestedMultiOutputs(b, collected);
614
+ }
615
+ else {
616
+ collectNestedMultiOutputs(ifElse.trueBranch, collected);
617
+ }
618
+ }
619
+ if (ifElse.falseBranch) {
620
+ if (Array.isArray(ifElse.falseBranch)) {
621
+ for (const b of ifElse.falseBranch)
622
+ collectNestedMultiOutputs(b, collected);
623
+ }
624
+ else {
625
+ collectNestedMultiOutputs(ifElse.falseBranch, collected);
626
+ }
627
+ }
628
+ }
629
+ else if (node.kind === 'switchCase') {
630
+ const switchCase = node;
631
+ for (const c of switchCase.cases) {
632
+ if (c) {
633
+ if (Array.isArray(c)) {
634
+ for (const b of c)
635
+ collectNestedMultiOutputs(b, collected);
636
+ }
637
+ else {
638
+ collectNestedMultiOutputs(c, collected);
639
+ }
640
+ }
641
+ }
642
+ }
643
+ else if (node.kind === 'fanOut') {
644
+ const fanOut = node;
645
+ collectNestedMultiOutputs(fanOut.sourceNode, collected);
646
+ for (const t of fanOut.targets) {
647
+ collectNestedMultiOutputs(t, collected);
648
+ }
649
+ }
650
+ else if (node.kind === 'merge') {
651
+ const merge = node;
652
+ for (const b of merge.branches) {
653
+ collectNestedMultiOutputs(b, collected);
654
+ }
655
+ }
656
+ }
657
+ function generateMultiOutputConnections(multiOutput, ctx) {
658
+ const calls = [];
659
+ const sourceVarName = (0, variable_names_1.getVarName)(multiOutput.sourceNode.name, ctx);
660
+ const sortedOutputs = [...multiOutput.outputTargets.entries()].sort((a, b) => a[0] - b[0]);
661
+ for (const [outputIndex, targetComposite] of sortedOutputs) {
662
+ const targetCode = generateComposite(targetComposite, ctx);
663
+ calls.push(['add', `${sourceVarName}.output(${outputIndex}).to(${targetCode})`]);
664
+ }
665
+ return calls;
666
+ }
667
+ function flattenToWorkflowCalls(root, ctx) {
668
+ const calls = [];
669
+ if (root.kind === 'multiOutput') {
670
+ const multiOutput = root;
671
+ const sourceVarName = (0, variable_names_1.getVarName)(multiOutput.sourceNode.name, ctx);
672
+ calls.push(['add', sourceVarName]);
673
+ const sortedOutputs = [...multiOutput.outputTargets.entries()].sort((a, b) => a[0] - b[0]);
674
+ for (const [outputIndex, targetComposite] of sortedOutputs) {
675
+ const targetCode = generateComposite(targetComposite, ctx);
676
+ calls.push(['add', `${sourceVarName}.output(${outputIndex}).to(${targetCode})`]);
677
+ }
678
+ }
679
+ else if (root.kind === 'explicitConnections') {
680
+ const explicitConns = root;
681
+ for (const node of explicitConns.nodes) {
682
+ const varName = (0, variable_names_1.getVarName)(node.name, ctx);
683
+ calls.push(['add', varName]);
684
+ }
685
+ for (const conn of explicitConns.connections) {
686
+ const sourceVar = (0, variable_names_1.getVarName)(conn.sourceNode, ctx);
687
+ const targetVar = (0, variable_names_1.getVarName)(conn.targetNode, ctx);
688
+ calls.push([
689
+ 'connect',
690
+ `${sourceVar}, ${conn.sourceOutput}, ${targetVar}, ${conn.targetInput}`,
691
+ ]);
692
+ }
693
+ }
694
+ else if (root.kind === 'chain') {
695
+ const nestedMultiOutputsInChain = [];
696
+ for (let i = 0; i < root.nodes.length; i++) {
697
+ const node = root.nodes[i];
698
+ if (node.kind === 'multiOutput') {
699
+ const multiOutput = node;
700
+ const sourceVarName = (0, variable_names_1.getVarName)(multiOutput.sourceNode.name, ctx);
701
+ const method = i === 0 ? 'add' : 'to';
702
+ calls.push([method, sourceVarName]);
703
+ const sortedOutputs = [...multiOutput.outputTargets.entries()].sort((a, b) => a[0] - b[0]);
704
+ for (const [outputIndex, targetComposite] of sortedOutputs) {
705
+ const targetCode = generateComposite(targetComposite, ctx);
706
+ calls.push(['add', `${sourceVarName}.output(${outputIndex}).to(${targetCode})`]);
707
+ }
708
+ }
709
+ else {
710
+ const method = i === 0 ? 'add' : 'to';
711
+ const code = generateComposite(node, ctx);
712
+ calls.push([method, code]);
713
+ collectNestedMultiOutputs(node, nestedMultiOutputsInChain);
714
+ }
715
+ }
716
+ for (const multiOutput of nestedMultiOutputsInChain) {
717
+ const multiOutputCalls = generateMultiOutputConnections(multiOutput, ctx);
718
+ calls.push(...multiOutputCalls);
719
+ }
720
+ }
721
+ else {
722
+ calls.push(['add', generateComposite(root, ctx)]);
723
+ const nestedMultiOutputs = [];
724
+ collectNestedMultiOutputs(root, nestedMultiOutputs);
725
+ for (const multiOutput of nestedMultiOutputs) {
726
+ const multiOutputCalls = generateMultiOutputConnections(multiOutput, ctx);
727
+ calls.push(...multiOutputCalls);
728
+ }
729
+ }
730
+ return calls;
731
+ }
732
+ function generateCode(tree, json, graph, executionContext) {
733
+ const ctx = {
734
+ indent: 0,
735
+ generatedVars: new Set(),
736
+ variableNodes: tree.variables,
737
+ graph,
738
+ nodeNameToVarName: new Map(),
739
+ usedVarNames: new Set(),
740
+ subnodeVariables: new Map(),
741
+ nodeSchemas: executionContext?.nodeSchemas,
742
+ nodeExecutionStatus: executionContext?.nodeExecutionStatus,
743
+ expressionAnnotations: executionContext?.expressionAnnotations,
744
+ workflowStatusJSDoc: executionContext?.workflowStatusJSDoc,
745
+ valuesExcluded: executionContext?.valuesExcluded,
746
+ pinnedNodes: executionContext?.pinnedNodes,
747
+ };
748
+ for (const node of graph.nodes.values()) {
749
+ collectSubnodesAsVariables(node, ctx);
750
+ }
751
+ const lines = [];
752
+ const subnodeDeclarations = generateSubnodeVariableDeclarations(ctx);
753
+ if (subnodeDeclarations.length > 0) {
754
+ lines.push(...subnodeDeclarations);
755
+ lines.push('');
756
+ }
757
+ if (tree.variables.size > 0) {
758
+ lines.push(generateVariableDeclarations(tree.variables, ctx));
759
+ lines.push('');
760
+ }
761
+ const workflowId = (0, string_utils_1.escapeString)(json.id ?? '');
762
+ const workflowName = (0, string_utils_1.escapeString)(json.name ?? '');
763
+ const settingsStr = json.settings && Object.keys(json.settings).length > 0 ? `, ${(0, subnode_generator_1.formatValue)(json.settings)}` : '';
764
+ lines.push(`const wf = workflow('${workflowId}', '${workflowName}'${settingsStr});`);
765
+ ctx.indent = 1;
766
+ const workflowCalls = [];
767
+ for (const root of tree.roots) {
768
+ const calls = flattenToWorkflowCalls(root, ctx);
769
+ for (const [method, code] of calls) {
770
+ workflowCalls.push(` .${method}(${code})`);
771
+ }
772
+ }
773
+ for (const conn of tree.deferredConnections) {
774
+ const sourceVarName = (0, variable_names_1.getVarName)(conn.sourceNodeName, ctx);
775
+ const targetVarName = (0, variable_names_1.getVarName)(conn.targetNode.name, ctx);
776
+ const sourceRef = conn.sourceOutputIndex > 0
777
+ ? `${sourceVarName}.output(${conn.sourceOutputIndex})`
778
+ : sourceVarName;
779
+ workflowCalls.push(` .add(${sourceRef}.to(${targetVarName}.input(${conn.targetInputIndex})))`);
780
+ }
781
+ for (const downstream of tree.deferredMergeDownstreams) {
782
+ const mergeVarName = (0, variable_names_1.getVarName)(downstream.mergeNode.name, ctx);
783
+ if (downstream.downstreamChain) {
784
+ const chainCode = generateComposite(downstream.downstreamChain, ctx);
785
+ workflowCalls.push(` .add(${mergeVarName})`);
786
+ workflowCalls.push(` .to(${chainCode})`);
787
+ }
788
+ }
789
+ lines.push('');
790
+ if (ctx.workflowStatusJSDoc) {
791
+ const jsdocLines = ['/**'];
792
+ for (const line of ctx.workflowStatusJSDoc.split('\n')) {
793
+ jsdocLines.push(` * ${line}`);
794
+ }
795
+ jsdocLines.push(' */');
796
+ lines.push(jsdocLines.join('\n'));
797
+ }
798
+ if (workflowCalls.length > 0) {
799
+ lines.push('export default wf');
800
+ lines.push(...workflowCalls);
801
+ }
802
+ else {
803
+ lines.push('export default wf');
804
+ }
805
+ return lines.join('\n');
806
+ }
807
+ //# sourceMappingURL=code-generator.js.map