@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,194 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.checkConditions = checkConditions;
7
+ exports.getPropertyValue = getPropertyValue;
8
+ exports.matchesDisplayOptions = matchesDisplayOptions;
9
+ const get_1 = __importDefault(require("lodash/get"));
10
+ const isEqual_1 = __importDefault(require("lodash/isEqual"));
11
+ function isDisplayCondition(value) {
12
+ return (value !== null &&
13
+ typeof value === 'object' &&
14
+ '_cnd' in value &&
15
+ Object.keys(value).length === 1);
16
+ }
17
+ function isRegexPath(path) {
18
+ return path.includes('|') || path.includes('(');
19
+ }
20
+ function getAllPaths(obj, prefix = '') {
21
+ if (obj === null || obj === undefined || typeof obj !== 'object') {
22
+ return prefix ? [prefix] : [];
23
+ }
24
+ const paths = [];
25
+ if (prefix)
26
+ paths.push(prefix);
27
+ for (const key of Object.keys(obj)) {
28
+ const newPrefix = prefix ? `${prefix}.${key}` : key;
29
+ paths.push(...getAllPaths(obj[key], newPrefix));
30
+ }
31
+ return paths;
32
+ }
33
+ function getMatchingPathValues(context, regexPath) {
34
+ const rootParams = context.rootParameters ?? context.parameters;
35
+ const pattern = regexPath.startsWith('/') ? regexPath.slice(1) : regexPath;
36
+ const regexPattern = '^' + pattern.replace(/\./g, '\\.').replace(/\\\.\(/g, '.(') + '$';
37
+ const regex = new RegExp(regexPattern);
38
+ const allPaths = getAllPaths(rootParams);
39
+ const matchingValues = [];
40
+ for (const path of allPaths) {
41
+ if (regex.test(path)) {
42
+ const value = (0, get_1.default)(rootParams, path);
43
+ if (value !== undefined) {
44
+ matchingValues.push(Array.isArray(value) ? value : [value]);
45
+ }
46
+ }
47
+ }
48
+ return matchingValues;
49
+ }
50
+ function checkConditions(conditions, actualValues) {
51
+ return conditions.some((condition) => {
52
+ if (isDisplayCondition(condition)) {
53
+ const [key, targetValue] = Object.entries(condition._cnd)[0];
54
+ if (actualValues.length === 0) {
55
+ if (key === 'not')
56
+ return true;
57
+ return false;
58
+ }
59
+ return actualValues.every((propertyValue) => {
60
+ if (key === 'eq') {
61
+ return (0, isEqual_1.default)(propertyValue, targetValue);
62
+ }
63
+ if (key === 'not') {
64
+ return !(0, isEqual_1.default)(propertyValue, targetValue);
65
+ }
66
+ if (key === 'gte') {
67
+ return propertyValue >= targetValue;
68
+ }
69
+ if (key === 'lte') {
70
+ return propertyValue <= targetValue;
71
+ }
72
+ if (key === 'gt') {
73
+ return propertyValue > targetValue;
74
+ }
75
+ if (key === 'lt') {
76
+ return propertyValue < targetValue;
77
+ }
78
+ if (key === 'between') {
79
+ const { from, to } = targetValue;
80
+ return propertyValue >= from && propertyValue <= to;
81
+ }
82
+ if (key === 'includes') {
83
+ return propertyValue.includes(targetValue);
84
+ }
85
+ if (key === 'startsWith') {
86
+ return propertyValue.startsWith(targetValue);
87
+ }
88
+ if (key === 'endsWith') {
89
+ return propertyValue.endsWith(targetValue);
90
+ }
91
+ if (key === 'regex') {
92
+ return new RegExp(targetValue).test(propertyValue);
93
+ }
94
+ if (key === 'exists') {
95
+ return propertyValue !== null && propertyValue !== undefined && propertyValue !== '';
96
+ }
97
+ return false;
98
+ });
99
+ }
100
+ return actualValues.includes(condition);
101
+ });
102
+ }
103
+ function getPropertyValue(context, propertyName) {
104
+ let value;
105
+ if (propertyName.charAt(0) === '/') {
106
+ const rootParams = context.rootParameters ?? context.parameters;
107
+ value = (0, get_1.default)(rootParams, propertyName.slice(1));
108
+ if (value === undefined && context.defaults) {
109
+ value = (0, get_1.default)(context.defaults, propertyName.slice(1));
110
+ }
111
+ }
112
+ else if (propertyName === '@version') {
113
+ value = context.nodeVersion ?? 0;
114
+ }
115
+ else if (propertyName === '@tool') {
116
+ value = context.isToolNode ?? false;
117
+ }
118
+ else {
119
+ value = (0, get_1.default)(context.parameters, propertyName);
120
+ if (value === undefined && context.defaults) {
121
+ value = (0, get_1.default)(context.defaults, propertyName);
122
+ }
123
+ }
124
+ if (value && typeof value === 'object' && '__rl' in value) {
125
+ const rlValue = value;
126
+ if (rlValue.__rl === true && 'value' in rlValue) {
127
+ value = rlValue.value;
128
+ }
129
+ }
130
+ if (!Array.isArray(value)) {
131
+ return [value];
132
+ }
133
+ return value;
134
+ }
135
+ function getRawPropertyValue(context, propertyName) {
136
+ if (propertyName.charAt(0) === '/') {
137
+ const rootParams = context.rootParameters ?? context.parameters;
138
+ return (0, get_1.default)(rootParams, propertyName.slice(1));
139
+ }
140
+ if (propertyName === '@version' || propertyName === '@tool') {
141
+ return undefined;
142
+ }
143
+ return (0, get_1.default)(context.parameters, propertyName);
144
+ }
145
+ function isUnselectedResourceLocator(value) {
146
+ if (!value || typeof value !== 'object' || !('__rl' in value))
147
+ return false;
148
+ const rl = value;
149
+ return rl.__rl === true && rl.value === '';
150
+ }
151
+ function matchesDisplayOptions(context, displayOptions) {
152
+ const { show, hide } = displayOptions;
153
+ if (show) {
154
+ for (const propertyName of Object.keys(show)) {
155
+ const conditions = show[propertyName];
156
+ if (isRegexPath(propertyName)) {
157
+ const matchingPathValues = getMatchingPathValues(context, propertyName);
158
+ if (matchingPathValues.length === 0) {
159
+ return false;
160
+ }
161
+ const anyMatch = matchingPathValues.some((values) => {
162
+ if (values.some((v) => typeof v === 'string' && v.charAt(0) === '=')) {
163
+ return true;
164
+ }
165
+ return checkConditions(conditions, values);
166
+ });
167
+ if (!anyMatch) {
168
+ return false;
169
+ }
170
+ continue;
171
+ }
172
+ const values = getPropertyValue(context, propertyName);
173
+ if (values.some((v) => typeof v === 'string' && v.charAt(0) === '=')) {
174
+ return true;
175
+ }
176
+ if (!checkConditions(conditions, values)) {
177
+ return false;
178
+ }
179
+ }
180
+ }
181
+ if (hide) {
182
+ for (const propertyName of Object.keys(hide)) {
183
+ if (isUnselectedResourceLocator(getRawPropertyValue(context, propertyName))) {
184
+ continue;
185
+ }
186
+ const values = getPropertyValue(context, propertyName);
187
+ if (values.length !== 0 && checkConditions(hide[propertyName], values)) {
188
+ return false;
189
+ }
190
+ }
191
+ }
192
+ return true;
193
+ }
194
+ //# sourceMappingURL=display-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-options.js","sourceRoot":"","sources":["../../src/validation/display-options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { INodeTypes } from 'n8n-workflow';
2
+ import type { WorkflowBuilder, WorkflowJSON } from '../types/base';
3
+ export { setSchemaBaseDirs } from './schema-validator';
4
+ export type ValidationErrorCode = 'NO_NODES' | 'MISSING_TRIGGER' | 'DISCONNECTED_NODE' | 'MISSING_PARAMETER' | 'INVALID_CONNECTION' | 'CIRCULAR_REFERENCE' | 'INVALID_EXPRESSION' | 'AGENT_STATIC_PROMPT' | 'AGENT_NO_SYSTEM_MESSAGE' | 'HARDCODED_CREDENTIALS' | 'SET_CREDENTIAL_FIELD' | 'MERGE_SINGLE_INPUT' | 'TOOL_NO_PARAMETERS' | 'FROM_AI_IN_NON_TOOL' | 'MISSING_EXPRESSION_PREFIX' | 'INVALID_PARAMETER' | 'INVALID_INPUT_INDEX' | 'SUBNODE_NOT_CONNECTED' | 'SUBNODE_PARAMETER_MISMATCH' | 'UNSUPPORTED_SUBNODE_INPUT' | 'MAX_NODES_EXCEEDED' | 'INVALID_EXPRESSION_PATH' | 'PARTIAL_EXPRESSION_PATH' | 'INVALID_DATE_METHOD';
5
+ export declare class ValidationError {
6
+ readonly code: ValidationErrorCode;
7
+ readonly message: string;
8
+ readonly nodeName?: string;
9
+ readonly parameterName?: string;
10
+ readonly violationLevel?: 'critical' | 'major' | 'minor';
11
+ constructor(code: ValidationErrorCode, message: string, nodeName?: string, parameterName?: string, violationLevel?: 'critical' | 'major' | 'minor');
12
+ }
13
+ export declare class ValidationWarning {
14
+ readonly code: ValidationErrorCode;
15
+ readonly message: string;
16
+ readonly nodeName?: string;
17
+ readonly parameterPath?: string;
18
+ readonly originalName?: string;
19
+ readonly violationLevel?: 'critical' | 'major' | 'minor';
20
+ constructor(code: ValidationErrorCode, message: string, nodeName?: string, parameterPath?: string, originalName?: string, violationLevel?: 'critical' | 'major' | 'minor');
21
+ }
22
+ export interface ValidationResult {
23
+ valid: boolean;
24
+ errors: ValidationError[];
25
+ warnings: ValidationWarning[];
26
+ }
27
+ export interface ValidationOptions {
28
+ strictMode?: boolean;
29
+ allowDisconnectedNodes?: boolean;
30
+ allowNoTrigger?: boolean;
31
+ validateSchema?: boolean;
32
+ nodeTypesProvider?: INodeTypes;
33
+ }
34
+ export declare function validateWorkflow(workflowOrJson: WorkflowBuilder | WorkflowJSON, options?: ValidationOptions): ValidationResult;
@@ -0,0 +1,428 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationWarning = exports.ValidationError = exports.setSchemaBaseDirs = void 0;
4
+ exports.validateWorkflow = validateWorkflow;
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ const display_options_1 = require("./display-options");
7
+ const input_resolver_1 = require("./input-resolver");
8
+ const schema_validator_1 = require("./schema-validator");
9
+ const node_types_1 = require("../constants/node-types");
10
+ var schema_validator_2 = require("./schema-validator");
11
+ Object.defineProperty(exports, "setSchemaBaseDirs", { enumerable: true, get: function () { return schema_validator_2.setSchemaBaseDirs; } });
12
+ class ValidationError {
13
+ constructor(code, message, nodeName, parameterName, violationLevel) {
14
+ this.code = code;
15
+ this.message = message;
16
+ this.nodeName = nodeName;
17
+ this.parameterName = parameterName;
18
+ this.violationLevel = violationLevel;
19
+ }
20
+ }
21
+ exports.ValidationError = ValidationError;
22
+ class ValidationWarning {
23
+ constructor(code, message, nodeName, parameterPath, originalName, violationLevel) {
24
+ this.code = code;
25
+ this.message = message;
26
+ this.nodeName = nodeName;
27
+ this.parameterPath = parameterPath;
28
+ this.originalName = originalName;
29
+ this.violationLevel = violationLevel;
30
+ }
31
+ }
32
+ exports.ValidationWarning = ValidationWarning;
33
+ function isTriggerNode(type) {
34
+ return (type.includes('Trigger') ||
35
+ type.includes('trigger') ||
36
+ type.includes('Webhook') ||
37
+ type.includes('webhook') ||
38
+ type.includes('Schedule') ||
39
+ type.includes('schedule') ||
40
+ type.includes('Poll') ||
41
+ type.includes('poll'));
42
+ }
43
+ const AI_CONNECTION_TYPES = [
44
+ 'ai_languageModel',
45
+ 'ai_memory',
46
+ 'ai_tool',
47
+ 'ai_outputParser',
48
+ 'ai_embedding',
49
+ 'ai_vectorStore',
50
+ 'ai_retriever',
51
+ 'ai_document',
52
+ 'ai_textSplitter',
53
+ 'ai_reranker',
54
+ ];
55
+ const AI_CONNECTION_TO_SUBNODE_FIELD = {
56
+ ai_languageModel: 'model',
57
+ ai_memory: 'memory',
58
+ ai_tool: 'tools',
59
+ ai_outputParser: 'outputParser',
60
+ ai_embedding: 'embedding',
61
+ ai_vectorStore: 'vectorStore',
62
+ ai_retriever: 'retriever',
63
+ ai_document: 'documentLoader',
64
+ ai_textSplitter: 'textSplitter',
65
+ ai_reranker: 'reranker',
66
+ };
67
+ const AI_ARRAY_TYPES = new Set(['ai_tool']);
68
+ function reconstructSubnodesFromConnections(targetNodeName, json) {
69
+ const subnodes = {};
70
+ const nodesByName = new Map();
71
+ for (const node of json.nodes) {
72
+ if (node.name) {
73
+ nodesByName.set(node.name, node);
74
+ }
75
+ }
76
+ for (const [sourceNodeName, nodeConnections] of Object.entries(json.connections)) {
77
+ for (const connType of AI_CONNECTION_TYPES) {
78
+ const aiConns = nodeConnections[connType];
79
+ if (!aiConns || !Array.isArray(aiConns))
80
+ continue;
81
+ for (const outputs of aiConns) {
82
+ if (!outputs)
83
+ continue;
84
+ for (const conn of outputs) {
85
+ if (conn.node === targetNodeName) {
86
+ const subnodeField = AI_CONNECTION_TO_SUBNODE_FIELD[connType];
87
+ if (!subnodeField)
88
+ continue;
89
+ const sourceNode = nodesByName.get(sourceNodeName);
90
+ if (!sourceNode)
91
+ continue;
92
+ const subnodeConfig = {
93
+ type: sourceNode.type,
94
+ version: sourceNode.typeVersion,
95
+ parameters: sourceNode.parameters ?? {},
96
+ };
97
+ if (AI_ARRAY_TYPES.has(connType)) {
98
+ const existing = subnodes[subnodeField];
99
+ if (Array.isArray(existing)) {
100
+ existing.push(subnodeConfig);
101
+ }
102
+ else {
103
+ subnodes[subnodeField] = [subnodeConfig];
104
+ }
105
+ }
106
+ else {
107
+ subnodes[subnodeField] = subnodeConfig;
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ return Object.keys(subnodes).length > 0 ? subnodes : undefined;
115
+ }
116
+ function hasAiConnectionToParent(nodeName, json) {
117
+ const nodeConnections = json.connections[nodeName];
118
+ if (!nodeConnections)
119
+ return false;
120
+ for (const connType of AI_CONNECTION_TYPES) {
121
+ const aiConns = nodeConnections[connType];
122
+ if (aiConns && Array.isArray(aiConns)) {
123
+ for (const outputs of aiConns) {
124
+ if (outputs && outputs.length > 0) {
125
+ return true;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ return false;
131
+ }
132
+ function isToolSubnode(nodeName, json) {
133
+ const nodeConnections = json.connections[nodeName];
134
+ if (!nodeConnections)
135
+ return false;
136
+ const toolConns = nodeConnections.ai_tool;
137
+ if (toolConns && Array.isArray(toolConns)) {
138
+ for (const outputs of toolConns) {
139
+ if (outputs && outputs.length > 0) {
140
+ return true;
141
+ }
142
+ }
143
+ }
144
+ return false;
145
+ }
146
+ function findDisconnectedNodes(json) {
147
+ const hasIncoming = new Set();
148
+ for (const [_sourceName, nodeConnections] of Object.entries(json.connections)) {
149
+ if (nodeConnections.main) {
150
+ for (const outputs of nodeConnections.main) {
151
+ if (outputs) {
152
+ for (const connection of outputs) {
153
+ hasIncoming.add(connection.node);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ const disconnected = [];
160
+ for (const node of json.nodes) {
161
+ if (!node.name)
162
+ continue;
163
+ if (hasIncoming.has(node.name))
164
+ continue;
165
+ if (isTriggerNode(node.type))
166
+ continue;
167
+ if ((0, node_types_1.isStickyNoteType)(node.type))
168
+ continue;
169
+ if (hasAiConnectionToParent(node.name, json))
170
+ continue;
171
+ disconnected.push(node.name);
172
+ }
173
+ return disconnected;
174
+ }
175
+ function validateWorkflow(workflowOrJson, options = {}) {
176
+ const json = 'toJSON' in workflowOrJson ? workflowOrJson.toJSON() : workflowOrJson;
177
+ const errors = [];
178
+ const warnings = [];
179
+ if (!options.allowNoTrigger) {
180
+ const hasTrigger = json.nodes.some((node) => isTriggerNode(node.type));
181
+ if (!hasTrigger) {
182
+ warnings.push(new ValidationWarning('MISSING_TRIGGER', 'Workflow has no trigger node. It will need to be started manually.'));
183
+ }
184
+ }
185
+ if (!options.allowDisconnectedNodes) {
186
+ const disconnected = findDisconnectedNodes(json);
187
+ for (const nodeName of disconnected) {
188
+ warnings.push(new ValidationWarning('DISCONNECTED_NODE', `Node '${nodeName}' is not connected to any input. It will not receive data.`, nodeName));
189
+ }
190
+ }
191
+ if (options.strictMode) {
192
+ for (const node of json.nodes) {
193
+ if ((0, node_types_1.isHttpRequestType)(node.type)) {
194
+ if (!node.parameters?.url && !node.parameters?.requestUrl) {
195
+ warnings.push(new ValidationWarning('MISSING_PARAMETER', `HTTP Request node '${node.name}' may be missing URL parameter`, node.name));
196
+ }
197
+ }
198
+ }
199
+ }
200
+ if (options.validateSchema !== false) {
201
+ for (const node of json.nodes) {
202
+ const version = typeof node.typeVersion === 'string'
203
+ ? parseFloat(node.typeVersion)
204
+ : (node.typeVersion ?? 1);
205
+ const config = {};
206
+ if (node.parameters !== undefined) {
207
+ config.parameters = node.parameters;
208
+ }
209
+ const nodeWithSubnodes = node;
210
+ if (nodeWithSubnodes.subnodes !== undefined) {
211
+ config.subnodes = nodeWithSubnodes.subnodes;
212
+ }
213
+ else if (node.name) {
214
+ const reconstructed = reconstructSubnodesFromConnections(node.name, json);
215
+ if (reconstructed) {
216
+ config.subnodes = reconstructed;
217
+ }
218
+ }
219
+ const isToolNode = node.name ? isToolSubnode(node.name, json) : false;
220
+ const schemaResult = (0, schema_validator_1.validateNodeConfig)(node.type, version, config, { isToolNode });
221
+ if (!schemaResult.valid) {
222
+ for (const error of schemaResult.errors) {
223
+ let message = error.message;
224
+ if (error.path === 'subnodes' &&
225
+ message.includes('Unknown field') &&
226
+ options.nodeTypesProvider) {
227
+ const nodeType = options.nodeTypesProvider.getByNameAndVersion(node.type, version);
228
+ const validInputs = nodeType?.description?.builderHint?.inputs;
229
+ if (validInputs) {
230
+ const validSubnodes = Object.keys(validInputs)
231
+ .map((k) => AI_CONNECTION_TO_SUBNODE_FIELD[k])
232
+ .filter(Boolean);
233
+ if (validSubnodes.length > 0) {
234
+ message = message.replace(/Unknown field\(s\) at "subnodes": (.+)\./, `Invalid subnode(s) $1. This node only accepts: ${validSubnodes.join(', ')}.`);
235
+ }
236
+ }
237
+ }
238
+ warnings.push(new ValidationWarning('INVALID_PARAMETER', `Node "${node.name}": ${message}`, node.name));
239
+ }
240
+ }
241
+ }
242
+ }
243
+ if (options.nodeTypesProvider) {
244
+ checkNodeInputIndices(json, options.nodeTypesProvider, warnings);
245
+ validateSubnodeParameters(json, options.nodeTypesProvider, warnings);
246
+ validateParentSupportsInputs(json, options.nodeTypesProvider, warnings);
247
+ }
248
+ return {
249
+ valid: errors.length === 0,
250
+ errors,
251
+ warnings,
252
+ };
253
+ }
254
+ const AI_CONNECTION_TO_SDK_FUNCTION = {
255
+ ai_languageModel: 'languageModel()',
256
+ ai_memory: 'memory()',
257
+ ai_tool: 'tool()',
258
+ ai_outputParser: 'outputParser()',
259
+ ai_embedding: 'embeddings()',
260
+ ai_vectorStore: 'vectorStore()',
261
+ ai_retriever: 'retriever()',
262
+ ai_document: 'documentLoader()',
263
+ ai_textSplitter: 'textSplitter()',
264
+ ai_reranker: 'reranker()',
265
+ };
266
+ function checkDisplayOptionsMatch(subnodeParams, displayOptions) {
267
+ const mismatches = [];
268
+ if (!displayOptions.show)
269
+ return { matches: true, mismatches };
270
+ for (const [paramName, expectedValues] of Object.entries(displayOptions.show)) {
271
+ if (!expectedValues)
272
+ continue;
273
+ const actualValue = subnodeParams[paramName];
274
+ if (!expectedValues.includes(actualValue)) {
275
+ mismatches.push({
276
+ param: paramName,
277
+ expected: expectedValues,
278
+ actual: actualValue,
279
+ });
280
+ }
281
+ }
282
+ return { matches: mismatches.length === 0, mismatches };
283
+ }
284
+ function validateSubnodeParameters(json, nodeTypesProvider, warnings) {
285
+ const nodesByName = new Map();
286
+ for (const node of json.nodes) {
287
+ if (node.name) {
288
+ nodesByName.set(node.name, node);
289
+ }
290
+ }
291
+ const connectionsByDest = (0, n8n_workflow_1.mapConnectionsByDestination)(json.connections);
292
+ for (const parentNode of json.nodes) {
293
+ if (!parentNode.name)
294
+ continue;
295
+ const parentNodeType = nodeTypesProvider.getByNameAndVersion(parentNode.type, typeof parentNode.typeVersion === 'string'
296
+ ? parseFloat(parentNode.typeVersion)
297
+ : (parentNode.typeVersion ?? 1));
298
+ const builderHintInputs = parentNodeType?.description?.builderHint?.inputs;
299
+ if (!builderHintInputs)
300
+ continue;
301
+ for (const [connectionType, inputConfig] of Object.entries(builderHintInputs)) {
302
+ if (!connectionType.startsWith('ai_'))
303
+ continue;
304
+ if (!inputConfig?.displayOptions?.show)
305
+ continue;
306
+ const incomingConnections = connectionsByDest[parentNode.name]?.[connectionType];
307
+ if (!incomingConnections)
308
+ continue;
309
+ for (const connList of incomingConnections) {
310
+ if (!connList)
311
+ continue;
312
+ for (const conn of connList) {
313
+ const subnodeName = conn.node;
314
+ const subnode = nodesByName.get(subnodeName);
315
+ if (!subnode?.parameters)
316
+ continue;
317
+ const { matches, mismatches } = checkDisplayOptionsMatch(subnode.parameters, inputConfig.displayOptions);
318
+ if (!matches) {
319
+ const sdkFn = AI_CONNECTION_TO_SDK_FUNCTION[connectionType] || connectionType;
320
+ const mismatchDetails = mismatches
321
+ .map((m) => `${m.param}='${String(m.actual)}' (expected: ${m.expected.map((v) => `'${String(v)}'`).join(' or ')})`)
322
+ .join(', ');
323
+ warnings.push(new ValidationWarning('SUBNODE_PARAMETER_MISMATCH', `'${subnodeName}' is connected to '${parentNode.name}' using ${sdkFn} but has ${mismatchDetails}. Update parameters to match the SDK function used.`, subnodeName, mismatches[0]?.param));
324
+ }
325
+ }
326
+ }
327
+ }
328
+ }
329
+ }
330
+ function buildConditionSummary(displayOptions, parentParams) {
331
+ if (!displayOptions.show)
332
+ return '';
333
+ const parts = [];
334
+ for (const [paramName, expectedValues] of Object.entries(displayOptions.show)) {
335
+ if (!expectedValues)
336
+ continue;
337
+ const actual = parentParams[paramName];
338
+ const expectedStr = expectedValues.map((v) => `'${String(v)}'`).join(' or ');
339
+ parts.push(`${paramName} should be ${expectedStr} (currently '${String(actual)}')`);
340
+ }
341
+ return parts.length > 0 ? `Required: ${parts.join(', ')}.` : '';
342
+ }
343
+ function validateParentSupportsInputs(json, nodeTypesProvider, warnings) {
344
+ const nodesByName = new Map();
345
+ for (const node of json.nodes) {
346
+ if (node.name) {
347
+ nodesByName.set(node.name, node);
348
+ }
349
+ }
350
+ const connectionsByDest = (0, n8n_workflow_1.mapConnectionsByDestination)(json.connections);
351
+ for (const parentNode of json.nodes) {
352
+ if (!parentNode.name)
353
+ continue;
354
+ const version = typeof parentNode.typeVersion === 'string'
355
+ ? parseFloat(parentNode.typeVersion)
356
+ : (parentNode.typeVersion ?? 1);
357
+ const parentNodeType = nodeTypesProvider.getByNameAndVersion(parentNode.type, version);
358
+ const builderHintInputs = parentNodeType?.description?.builderHint?.inputs;
359
+ if (!builderHintInputs)
360
+ continue;
361
+ const parentContext = {
362
+ parameters: (parentNode.parameters ?? {}),
363
+ nodeVersion: version,
364
+ rootParameters: (parentNode.parameters ?? {}),
365
+ };
366
+ for (const [connectionType, inputConfig] of Object.entries(builderHintInputs)) {
367
+ if (!connectionType.startsWith('ai_'))
368
+ continue;
369
+ if (!inputConfig?.displayOptions)
370
+ continue;
371
+ const parentSupportsInput = (0, display_options_1.matchesDisplayOptions)(parentContext, inputConfig.displayOptions);
372
+ if (parentSupportsInput)
373
+ continue;
374
+ const incomingConnections = connectionsByDest[parentNode.name]?.[connectionType];
375
+ if (!incomingConnections)
376
+ continue;
377
+ for (const connList of incomingConnections) {
378
+ if (!connList)
379
+ continue;
380
+ for (const conn of connList) {
381
+ const subnodeName = conn.node;
382
+ const subnodeField = AI_CONNECTION_TO_SUBNODE_FIELD[connectionType] || connectionType;
383
+ const conditionDetails = buildConditionSummary(inputConfig.displayOptions, (parentNode.parameters ?? {}));
384
+ warnings.push(new ValidationWarning('UNSUPPORTED_SUBNODE_INPUT', `'${subnodeName}' is connected to '${parentNode.name}' as ${subnodeField}, but '${parentNode.name}' does not support ${subnodeField} in its current configuration. ${conditionDetails}`, parentNode.name, undefined, undefined, 'major'));
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+ function checkNodeInputIndices(json, nodeTypesProvider, warnings) {
391
+ const nodesByName = new Map();
392
+ for (const node of json.nodes) {
393
+ if (node.name) {
394
+ nodesByName.set(node.name, node);
395
+ }
396
+ }
397
+ const warnedInputs = new Set();
398
+ for (const [_sourceName, nodeConnections] of Object.entries(json.connections)) {
399
+ const mainConnections = nodeConnections.main;
400
+ if (!mainConnections || !Array.isArray(mainConnections))
401
+ continue;
402
+ for (const outputs of mainConnections) {
403
+ if (!outputs)
404
+ continue;
405
+ for (const conn of outputs) {
406
+ const targetNodeName = conn.node;
407
+ const targetInputIndex = conn.index;
408
+ const targetNode = nodesByName.get(targetNodeName);
409
+ if (!targetNode)
410
+ continue;
411
+ const version = typeof targetNode.typeVersion === 'string'
412
+ ? parseFloat(targetNode.typeVersion)
413
+ : (targetNode.typeVersion ?? 1);
414
+ const mainInputCount = (0, input_resolver_1.resolveMainInputCount)(nodeTypesProvider, targetNode.type, version);
415
+ if (mainInputCount === undefined)
416
+ continue;
417
+ if (targetInputIndex >= mainInputCount) {
418
+ const warnKey = `${targetNodeName}:${targetInputIndex}`;
419
+ if (!warnedInputs.has(warnKey)) {
420
+ warnedInputs.add(warnKey);
421
+ warnings.push(new ValidationWarning('INVALID_INPUT_INDEX', `Connection to '${targetNodeName}' uses input index ${targetInputIndex}, but node only has ${mainInputCount} input(s) (indices 0-${mainInputCount - 1})`, targetNodeName));
422
+ }
423
+ }
424
+ }
425
+ }
426
+ }
427
+ }
428
+ //# sourceMappingURL=index.js.map