n8n-workflow 2.31.1 → 2.32.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 (408) hide show
  1. package/dist/cjs/augment-object.js +136 -146
  2. package/dist/cjs/augment-object.js.map +1 -1
  3. package/dist/cjs/build.tsbuildinfo +1 -1
  4. package/dist/cjs/common/find-ai-root-node-names.js +36 -46
  5. package/dist/cjs/common/find-ai-root-node-names.js.map +1 -1
  6. package/dist/cjs/common/get-child-nodes.js +8 -18
  7. package/dist/cjs/common/get-child-nodes.js.map +1 -1
  8. package/dist/cjs/common/get-connected-nodes.js +84 -94
  9. package/dist/cjs/common/get-connected-nodes.js.map +1 -1
  10. package/dist/cjs/common/get-node-by-name.js +16 -26
  11. package/dist/cjs/common/get-node-by-name.js.map +1 -1
  12. package/dist/cjs/common/get-parent-nodes.js +14 -24
  13. package/dist/cjs/common/get-parent-nodes.js.map +1 -1
  14. package/dist/cjs/common/index.js +9 -19
  15. package/dist/cjs/common/index.js.map +1 -1
  16. package/dist/cjs/common/map-connections-by-destination.js +31 -41
  17. package/dist/cjs/common/map-connections-by-destination.js.map +1 -1
  18. package/dist/cjs/common/resolve-variables.d.ts +8 -0
  19. package/dist/cjs/common/resolve-variables.d.ts.map +1 -1
  20. package/dist/cjs/common/resolve-variables.js +46 -33
  21. package/dist/cjs/common/resolve-variables.js.map +1 -1
  22. package/dist/cjs/connections-diff.js +58 -68
  23. package/dist/cjs/connections-diff.js.map +1 -1
  24. package/dist/cjs/constants.d.ts +3 -3
  25. package/dist/cjs/constants.d.ts.map +1 -1
  26. package/dist/cjs/constants.js +157 -166
  27. package/dist/cjs/constants.js.map +1 -1
  28. package/dist/cjs/credential-domain-restrictions.js +153 -163
  29. package/dist/cjs/credential-domain-restrictions.js.map +1 -1
  30. package/dist/cjs/cron.d.ts.map +1 -1
  31. package/dist/cjs/cron.js +25 -35
  32. package/dist/cjs/cron.js.map +1 -1
  33. package/dist/cjs/data-table.types.js +10 -20
  34. package/dist/cjs/data-table.types.js.map +1 -1
  35. package/dist/cjs/dynamic-credentials-helpers.js +93 -103
  36. package/dist/cjs/dynamic-credentials-helpers.js.map +1 -1
  37. package/dist/cjs/errors/abstract/execution-base.error.d.ts.map +1 -1
  38. package/dist/cjs/errors/abstract/execution-base.error.js +41 -51
  39. package/dist/cjs/errors/abstract/execution-base.error.js.map +1 -1
  40. package/dist/cjs/errors/abstract/node.error.d.ts.map +1 -1
  41. package/dist/cjs/errors/abstract/node.error.js +142 -152
  42. package/dist/cjs/errors/abstract/node.error.js.map +1 -1
  43. package/dist/cjs/errors/base/base.error.d.ts.map +1 -1
  44. package/dist/cjs/errors/base/base.error.js +35 -45
  45. package/dist/cjs/errors/base/base.error.js.map +1 -1
  46. package/dist/cjs/errors/base/operational.error.d.ts.map +1 -1
  47. package/dist/cjs/errors/base/operational.error.js +17 -27
  48. package/dist/cjs/errors/base/operational.error.js.map +1 -1
  49. package/dist/cjs/errors/base/unexpected.error.d.ts.map +1 -1
  50. package/dist/cjs/errors/base/unexpected.error.js +17 -27
  51. package/dist/cjs/errors/base/unexpected.error.js.map +1 -1
  52. package/dist/cjs/errors/base/user.error.d.ts.map +1 -1
  53. package/dist/cjs/errors/base/user.error.js +17 -27
  54. package/dist/cjs/errors/base/user.error.js.map +1 -1
  55. package/dist/cjs/errors/cli-subworkflow-operation.error.js +7 -17
  56. package/dist/cjs/errors/cli-subworkflow-operation.error.js.map +1 -1
  57. package/dist/cjs/errors/db-connection-timeout-error.d.ts.map +1 -1
  58. package/dist/cjs/errors/db-connection-timeout-error.js +11 -21
  59. package/dist/cjs/errors/db-connection-timeout-error.js.map +1 -1
  60. package/dist/cjs/errors/execution-cancelled.error.d.ts.map +1 -1
  61. package/dist/cjs/errors/execution-cancelled.error.js +33 -43
  62. package/dist/cjs/errors/execution-cancelled.error.js.map +1 -1
  63. package/dist/cjs/errors/expression-class-extension.error.d.ts.map +1 -1
  64. package/dist/cjs/errors/expression-class-extension.error.js +9 -19
  65. package/dist/cjs/errors/expression-class-extension.error.js.map +1 -1
  66. package/dist/cjs/errors/expression-computed-destructuring.error.d.ts.map +1 -1
  67. package/dist/cjs/errors/expression-computed-destructuring.error.js +9 -19
  68. package/dist/cjs/errors/expression-computed-destructuring.error.js.map +1 -1
  69. package/dist/cjs/errors/expression-destructuring.error.d.ts.map +1 -1
  70. package/dist/cjs/errors/expression-destructuring.error.js +9 -19
  71. package/dist/cjs/errors/expression-destructuring.error.js.map +1 -1
  72. package/dist/cjs/errors/expression-extension.error.js +7 -17
  73. package/dist/cjs/errors/expression-extension.error.js.map +1 -1
  74. package/dist/cjs/errors/expression-reserved-variable.error.d.ts.map +1 -1
  75. package/dist/cjs/errors/expression-reserved-variable.error.js +9 -19
  76. package/dist/cjs/errors/expression-reserved-variable.error.js.map +1 -1
  77. package/dist/cjs/errors/expression-with-statement.error.d.ts.map +1 -1
  78. package/dist/cjs/errors/expression-with-statement.error.js +9 -19
  79. package/dist/cjs/errors/expression-with-statement.error.js.map +1 -1
  80. package/dist/cjs/errors/expression.error.d.ts.map +1 -1
  81. package/dist/cjs/errors/expression.error.js +33 -43
  82. package/dist/cjs/errors/expression.error.js.map +1 -1
  83. package/dist/cjs/errors/index.js +62 -72
  84. package/dist/cjs/errors/index.js.map +1 -1
  85. package/dist/cjs/errors/node-api.error.d.ts.map +1 -1
  86. package/dist/cjs/errors/node-api.error.js +227 -237
  87. package/dist/cjs/errors/node-api.error.js.map +1 -1
  88. package/dist/cjs/errors/node-operation.error.d.ts.map +1 -1
  89. package/dist/cjs/errors/node-operation.error.js +43 -53
  90. package/dist/cjs/errors/node-operation.error.js.map +1 -1
  91. package/dist/cjs/errors/node-ssl.error.d.ts.map +1 -1
  92. package/dist/cjs/errors/node-ssl.error.js +9 -19
  93. package/dist/cjs/errors/node-ssl.error.js.map +1 -1
  94. package/dist/cjs/errors/subworkflow-operation.error.d.ts.map +1 -1
  95. package/dist/cjs/errors/subworkflow-operation.error.js +18 -28
  96. package/dist/cjs/errors/subworkflow-operation.error.js.map +1 -1
  97. package/dist/cjs/errors/trigger-close.error.d.ts.map +1 -1
  98. package/dist/cjs/errors/trigger-close.error.js +11 -21
  99. package/dist/cjs/errors/trigger-close.error.js.map +1 -1
  100. package/dist/cjs/errors/webhook-taken.error.d.ts.map +1 -1
  101. package/dist/cjs/errors/webhook-taken.error.js +9 -19
  102. package/dist/cjs/errors/webhook-taken.error.js.map +1 -1
  103. package/dist/cjs/errors/workflow-activation.error.d.ts.map +1 -1
  104. package/dist/cjs/errors/workflow-activation.error.js +54 -64
  105. package/dist/cjs/errors/workflow-activation.error.js.map +1 -1
  106. package/dist/cjs/errors/workflow-configuration.error.js +10 -20
  107. package/dist/cjs/errors/workflow-configuration.error.js.map +1 -1
  108. package/dist/cjs/errors/workflow-deactivation.error.js +7 -17
  109. package/dist/cjs/errors/workflow-deactivation.error.js.map +1 -1
  110. package/dist/cjs/errors/workflow-operation.error.d.ts.map +1 -1
  111. package/dist/cjs/errors/workflow-operation.error.js +20 -30
  112. package/dist/cjs/errors/workflow-operation.error.js.map +1 -1
  113. package/dist/cjs/evaluation-helpers.js +16 -26
  114. package/dist/cjs/evaluation-helpers.js.map +1 -1
  115. package/dist/cjs/execution-context-establishment-hooks.d.ts.map +1 -1
  116. package/dist/cjs/execution-context-establishment-hooks.js +43 -49
  117. package/dist/cjs/execution-context-establishment-hooks.js.map +1 -1
  118. package/dist/cjs/execution-context.d.ts +14 -14
  119. package/dist/cjs/execution-context.d.ts.map +1 -1
  120. package/dist/cjs/execution-context.js +203 -213
  121. package/dist/cjs/execution-context.js.map +1 -1
  122. package/dist/cjs/execution-status.d.ts +2 -2
  123. package/dist/cjs/execution-status.d.ts.map +1 -1
  124. package/dist/cjs/execution-status.js +27 -37
  125. package/dist/cjs/execution-status.js.map +1 -1
  126. package/dist/cjs/expression-evaluator-proxy.d.ts.map +1 -1
  127. package/dist/cjs/expression-evaluator-proxy.js +18 -28
  128. package/dist/cjs/expression-evaluator-proxy.js.map +1 -1
  129. package/dist/cjs/expression-sandboxing.d.ts.map +1 -1
  130. package/dist/cjs/expression-sandboxing.js +447 -457
  131. package/dist/cjs/expression-sandboxing.js.map +1 -1
  132. package/dist/cjs/expression.d.ts.map +1 -1
  133. package/dist/cjs/expression.js +535 -546
  134. package/dist/cjs/expression.js.map +1 -1
  135. package/dist/cjs/expressions/expression-helpers.d.ts.map +1 -1
  136. package/dist/cjs/expressions/expression-helpers.js +13 -23
  137. package/dist/cjs/expressions/expression-helpers.js.map +1 -1
  138. package/dist/cjs/extensions/array-extensions.js +591 -601
  139. package/dist/cjs/extensions/array-extensions.js.map +1 -1
  140. package/dist/cjs/extensions/boolean-extensions.d.ts +1 -1
  141. package/dist/cjs/extensions/boolean-extensions.js +38 -48
  142. package/dist/cjs/extensions/boolean-extensions.js.map +1 -1
  143. package/dist/cjs/extensions/date-extensions.js +507 -517
  144. package/dist/cjs/extensions/date-extensions.js.map +1 -1
  145. package/dist/cjs/extensions/expression-extension.d.ts.map +1 -1
  146. package/dist/cjs/extensions/expression-extension.js +455 -465
  147. package/dist/cjs/extensions/expression-extension.js.map +1 -1
  148. package/dist/cjs/extensions/expression-parser.d.ts.map +1 -1
  149. package/dist/cjs/extensions/expression-parser.js +82 -92
  150. package/dist/cjs/extensions/expression-parser.js.map +1 -1
  151. package/dist/cjs/extensions/extended-functions.d.ts +10 -18
  152. package/dist/cjs/extensions/extended-functions.d.ts.map +1 -1
  153. package/dist/cjs/extensions/extended-functions.js +80 -90
  154. package/dist/cjs/extensions/extended-functions.js.map +1 -1
  155. package/dist/cjs/extensions/extensions.js +2 -12
  156. package/dist/cjs/extensions/index.js +10 -20
  157. package/dist/cjs/extensions/index.js.map +1 -1
  158. package/dist/cjs/extensions/number-extensions.js +226 -236
  159. package/dist/cjs/extensions/number-extensions.js.map +1 -1
  160. package/dist/cjs/extensions/object-extensions.js +274 -284
  161. package/dist/cjs/extensions/object-extensions.js.map +1 -1
  162. package/dist/cjs/extensions/string-extensions.d.ts +1 -1
  163. package/dist/cjs/extensions/string-extensions.d.ts.map +1 -1
  164. package/dist/cjs/extensions/string-extensions.js +769 -779
  165. package/dist/cjs/extensions/string-extensions.js.map +1 -1
  166. package/dist/cjs/extensions/utils.d.ts.map +1 -1
  167. package/dist/cjs/extensions/utils.js +35 -45
  168. package/dist/cjs/extensions/utils.js.map +1 -1
  169. package/dist/cjs/from-ai-parse-utils.js +393 -403
  170. package/dist/cjs/from-ai-parse-utils.js.map +1 -1
  171. package/dist/cjs/global-state.js +12 -22
  172. package/dist/cjs/global-state.js.map +1 -1
  173. package/dist/cjs/graph/graph-utils.js +166 -176
  174. package/dist/cjs/graph/graph-utils.js.map +1 -1
  175. package/dist/cjs/highlighted-data.js +13 -23
  176. package/dist/cjs/highlighted-data.js.map +1 -1
  177. package/dist/cjs/index.js +105 -115
  178. package/dist/cjs/index.js.map +1 -1
  179. package/dist/cjs/interfaces.d.ts +112 -22
  180. package/dist/cjs/interfaces.d.ts.map +1 -1
  181. package/dist/cjs/interfaces.js +62 -72
  182. package/dist/cjs/interfaces.js.map +1 -1
  183. package/dist/cjs/jmespath-query.js +26 -36
  184. package/dist/cjs/jmespath-query.js.map +1 -1
  185. package/dist/cjs/logger-proxy.d.ts.map +1 -1
  186. package/dist/cjs/logger-proxy.js +15 -25
  187. package/dist/cjs/logger-proxy.js.map +1 -1
  188. package/dist/cjs/mcp-helpers.js +10 -20
  189. package/dist/cjs/mcp-helpers.js.map +1 -1
  190. package/dist/cjs/message-event-bus.d.ts +184 -165
  191. package/dist/cjs/message-event-bus.d.ts.map +1 -1
  192. package/dist/cjs/message-event-bus.js +207 -217
  193. package/dist/cjs/message-event-bus.js.map +1 -1
  194. package/dist/cjs/metadata-utils.js +35 -45
  195. package/dist/cjs/metadata-utils.js.map +1 -1
  196. package/dist/cjs/native-methods/array.methods.js +527 -537
  197. package/dist/cjs/native-methods/array.methods.js.map +1 -1
  198. package/dist/cjs/native-methods/boolean.methods.js +18 -28
  199. package/dist/cjs/native-methods/boolean.methods.js.map +1 -1
  200. package/dist/cjs/native-methods/index.js +16 -26
  201. package/dist/cjs/native-methods/index.js.map +1 -1
  202. package/dist/cjs/native-methods/number.methods.js +79 -89
  203. package/dist/cjs/native-methods/number.methods.js.map +1 -1
  204. package/dist/cjs/native-methods/object.methods.js +7 -17
  205. package/dist/cjs/native-methods/object.methods.js.map +1 -1
  206. package/dist/cjs/native-methods/string.methods.js +474 -484
  207. package/dist/cjs/native-methods/string.methods.js.map +1 -1
  208. package/dist/cjs/node-grouping-validation.d.ts +6 -0
  209. package/dist/cjs/node-grouping-validation.d.ts.map +1 -1
  210. package/dist/cjs/node-grouping-validation.js +165 -144
  211. package/dist/cjs/node-grouping-validation.js.map +1 -1
  212. package/dist/cjs/node-helpers.d.ts.map +1 -1
  213. package/dist/cjs/node-helpers.js +1486 -1493
  214. package/dist/cjs/node-helpers.js.map +1 -1
  215. package/dist/cjs/node-parameters/filter-parameter.d.ts.map +1 -1
  216. package/dist/cjs/node-parameters/filter-parameter.js +315 -325
  217. package/dist/cjs/node-parameters/filter-parameter.js.map +1 -1
  218. package/dist/cjs/node-parameters/node-parameter-value-type-guard.js +105 -115
  219. package/dist/cjs/node-parameters/node-parameter-value-type-guard.js.map +1 -1
  220. package/dist/cjs/node-parameters/parameter-type-validation.js +120 -130
  221. package/dist/cjs/node-parameters/parameter-type-validation.js.map +1 -1
  222. package/dist/cjs/node-parameters/path-utils.js +21 -31
  223. package/dist/cjs/node-parameters/path-utils.js.map +1 -1
  224. package/dist/cjs/node-parameters/rename-node-utils.js +22 -32
  225. package/dist/cjs/node-parameters/rename-node-utils.js.map +1 -1
  226. package/dist/cjs/node-reference-parser-utils.js +472 -482
  227. package/dist/cjs/node-reference-parser-utils.js.map +1 -1
  228. package/dist/cjs/node-validation.js +59 -69
  229. package/dist/cjs/node-validation.js.map +1 -1
  230. package/dist/cjs/observable-object.js +56 -66
  231. package/dist/cjs/observable-object.js.map +1 -1
  232. package/dist/cjs/redaction-channels.js +36 -46
  233. package/dist/cjs/redaction-channels.js.map +1 -1
  234. package/dist/cjs/run-execution-data/run-execution-data.js +15 -25
  235. package/dist/cjs/run-execution-data/run-execution-data.js.map +1 -1
  236. package/dist/cjs/run-execution-data/run-execution-data.v0.js +2 -12
  237. package/dist/cjs/run-execution-data/run-execution-data.v1.js +26 -36
  238. package/dist/cjs/run-execution-data/run-execution-data.v1.js.map +1 -1
  239. package/dist/cjs/run-execution-data-factory.js +113 -123
  240. package/dist/cjs/run-execution-data-factory.js.map +1 -1
  241. package/dist/cjs/schemas.d.ts +13 -13
  242. package/dist/cjs/schemas.d.ts.map +1 -1
  243. package/dist/cjs/schemas.js +351 -360
  244. package/dist/cjs/schemas.js.map +1 -1
  245. package/dist/cjs/sub-workflow-output.js +10 -20
  246. package/dist/cjs/sub-workflow-output.js.map +1 -1
  247. package/dist/cjs/telemetry-helpers.d.ts.map +1 -1
  248. package/dist/cjs/telemetry-helpers.js +716 -726
  249. package/dist/cjs/telemetry-helpers.js.map +1 -1
  250. package/dist/cjs/tool-helpers.js +18 -28
  251. package/dist/cjs/tool-helpers.js.map +1 -1
  252. package/dist/cjs/trigger-identity.js +41 -51
  253. package/dist/cjs/trigger-identity.js.map +1 -1
  254. package/dist/cjs/trimmed-task-data.js +21 -31
  255. package/dist/cjs/trimmed-task-data.js.map +1 -1
  256. package/dist/cjs/type-guards.d.ts +3 -3
  257. package/dist/cjs/type-guards.d.ts.map +1 -1
  258. package/dist/cjs/type-guards.js +74 -84
  259. package/dist/cjs/type-guards.js.map +1 -1
  260. package/dist/cjs/type-validation.d.ts.map +1 -1
  261. package/dist/cjs/type-validation.js +383 -393
  262. package/dist/cjs/type-validation.js.map +1 -1
  263. package/dist/cjs/utils.d.ts +2 -2
  264. package/dist/cjs/utils.d.ts.map +1 -1
  265. package/dist/cjs/utils.js +430 -440
  266. package/dist/cjs/utils.js.map +1 -1
  267. package/dist/cjs/versioned-node-type.d.ts.map +1 -1
  268. package/dist/cjs/versioned-node-type.js +20 -30
  269. package/dist/cjs/versioned-node-type.js.map +1 -1
  270. package/dist/cjs/workflow-checksum.js +67 -77
  271. package/dist/cjs/workflow-checksum.js.map +1 -1
  272. package/dist/cjs/workflow-data-proxy-env-provider.js +58 -68
  273. package/dist/cjs/workflow-data-proxy-env-provider.js.map +1 -1
  274. package/dist/cjs/workflow-data-proxy-helpers.js +8 -18
  275. package/dist/cjs/workflow-data-proxy-helpers.js.map +1 -1
  276. package/dist/cjs/workflow-data-proxy.d.ts.map +1 -1
  277. package/dist/cjs/workflow-data-proxy.js +1162 -1172
  278. package/dist/cjs/workflow-data-proxy.js.map +1 -1
  279. package/dist/cjs/workflow-diff.d.ts +2 -1
  280. package/dist/cjs/workflow-diff.d.ts.map +1 -1
  281. package/dist/cjs/workflow-diff.js +292 -300
  282. package/dist/cjs/workflow-diff.js.map +1 -1
  283. package/dist/cjs/workflow-environments-helper.js +23 -33
  284. package/dist/cjs/workflow-environments-helper.js.map +1 -1
  285. package/dist/cjs/workflow-expression.d.ts.map +1 -1
  286. package/dist/cjs/workflow-expression.js +97 -107
  287. package/dist/cjs/workflow-expression.js.map +1 -1
  288. package/dist/cjs/workflow-structure-validation.d.ts.map +1 -1
  289. package/dist/cjs/workflow-structure-validation.js +140 -150
  290. package/dist/cjs/workflow-structure-validation.js.map +1 -1
  291. package/dist/cjs/workflow-validation.js +40 -50
  292. package/dist/cjs/workflow-validation.js.map +1 -1
  293. package/dist/cjs/workflow.d.ts.map +1 -1
  294. package/dist/cjs/workflow.js +612 -622
  295. package/dist/cjs/workflow.js.map +1 -1
  296. package/dist/esm/common/get-child-nodes.js.map +1 -1
  297. package/dist/esm/common/get-connected-nodes.js.map +1 -1
  298. package/dist/esm/common/get-parent-nodes.js.map +1 -1
  299. package/dist/esm/common/resolve-variables.d.ts +8 -0
  300. package/dist/esm/common/resolve-variables.d.ts.map +1 -1
  301. package/dist/esm/common/resolve-variables.js +22 -0
  302. package/dist/esm/common/resolve-variables.js.map +1 -1
  303. package/dist/esm/constants.d.ts +3 -3
  304. package/dist/esm/constants.d.ts.map +1 -1
  305. package/dist/esm/cron.d.ts.map +1 -1
  306. package/dist/esm/errors/abstract/execution-base.error.d.ts.map +1 -1
  307. package/dist/esm/errors/abstract/execution-base.error.js.map +1 -1
  308. package/dist/esm/errors/abstract/node.error.d.ts.map +1 -1
  309. package/dist/esm/errors/abstract/node.error.js.map +1 -1
  310. package/dist/esm/errors/base/base.error.d.ts.map +1 -1
  311. package/dist/esm/errors/base/base.error.js.map +1 -1
  312. package/dist/esm/errors/base/operational.error.d.ts.map +1 -1
  313. package/dist/esm/errors/base/operational.error.js.map +1 -1
  314. package/dist/esm/errors/base/unexpected.error.d.ts.map +1 -1
  315. package/dist/esm/errors/base/unexpected.error.js.map +1 -1
  316. package/dist/esm/errors/base/user.error.d.ts.map +1 -1
  317. package/dist/esm/errors/base/user.error.js.map +1 -1
  318. package/dist/esm/errors/db-connection-timeout-error.d.ts.map +1 -1
  319. package/dist/esm/errors/execution-cancelled.error.d.ts.map +1 -1
  320. package/dist/esm/errors/expression-class-extension.error.d.ts.map +1 -1
  321. package/dist/esm/errors/expression-computed-destructuring.error.d.ts.map +1 -1
  322. package/dist/esm/errors/expression-destructuring.error.d.ts.map +1 -1
  323. package/dist/esm/errors/expression-reserved-variable.error.d.ts.map +1 -1
  324. package/dist/esm/errors/expression-with-statement.error.d.ts.map +1 -1
  325. package/dist/esm/errors/expression.error.d.ts.map +1 -1
  326. package/dist/esm/errors/node-api.error.d.ts.map +1 -1
  327. package/dist/esm/errors/node-api.error.js.map +1 -1
  328. package/dist/esm/errors/node-operation.error.d.ts.map +1 -1
  329. package/dist/esm/errors/node-operation.error.js.map +1 -1
  330. package/dist/esm/errors/node-ssl.error.d.ts.map +1 -1
  331. package/dist/esm/errors/subworkflow-operation.error.d.ts.map +1 -1
  332. package/dist/esm/errors/trigger-close.error.d.ts.map +1 -1
  333. package/dist/esm/errors/trigger-close.error.js.map +1 -1
  334. package/dist/esm/errors/webhook-taken.error.d.ts.map +1 -1
  335. package/dist/esm/errors/workflow-activation.error.d.ts.map +1 -1
  336. package/dist/esm/errors/workflow-activation.error.js.map +1 -1
  337. package/dist/esm/errors/workflow-operation.error.d.ts.map +1 -1
  338. package/dist/esm/execution-context-establishment-hooks.d.ts.map +1 -1
  339. package/dist/esm/execution-context-establishment-hooks.js +7 -3
  340. package/dist/esm/execution-context-establishment-hooks.js.map +1 -1
  341. package/dist/esm/execution-context.d.ts +14 -14
  342. package/dist/esm/execution-context.d.ts.map +1 -1
  343. package/dist/esm/execution-status.d.ts +2 -2
  344. package/dist/esm/execution-status.d.ts.map +1 -1
  345. package/dist/esm/expression-evaluator-proxy.d.ts.map +1 -1
  346. package/dist/esm/expression-sandboxing.d.ts.map +1 -1
  347. package/dist/esm/expression-sandboxing.js.map +1 -1
  348. package/dist/esm/expression.d.ts.map +1 -1
  349. package/dist/esm/expression.js.map +1 -1
  350. package/dist/esm/expressions/expression-helpers.d.ts.map +1 -1
  351. package/dist/esm/extensions/boolean-extensions.d.ts +1 -1
  352. package/dist/esm/extensions/expression-extension.d.ts.map +1 -1
  353. package/dist/esm/extensions/expression-parser.d.ts.map +1 -1
  354. package/dist/esm/extensions/extended-functions.d.ts +10 -18
  355. package/dist/esm/extensions/extended-functions.d.ts.map +1 -1
  356. package/dist/esm/extensions/number-extensions.js.map +1 -1
  357. package/dist/esm/extensions/string-extensions.d.ts +1 -1
  358. package/dist/esm/extensions/string-extensions.d.ts.map +1 -1
  359. package/dist/esm/extensions/string-extensions.js.map +1 -1
  360. package/dist/esm/extensions/utils.d.ts.map +1 -1
  361. package/dist/esm/from-ai-parse-utils.js.map +1 -1
  362. package/dist/esm/interfaces.d.ts +112 -22
  363. package/dist/esm/interfaces.d.ts.map +1 -1
  364. package/dist/esm/interfaces.js.map +1 -1
  365. package/dist/esm/logger-proxy.d.ts.map +1 -1
  366. package/dist/esm/message-event-bus.d.ts +184 -165
  367. package/dist/esm/message-event-bus.d.ts.map +1 -1
  368. package/dist/esm/message-event-bus.js +2 -2
  369. package/dist/esm/message-event-bus.js.map +1 -1
  370. package/dist/esm/node-grouping-validation.d.ts +6 -0
  371. package/dist/esm/node-grouping-validation.d.ts.map +1 -1
  372. package/dist/esm/node-grouping-validation.js +34 -5
  373. package/dist/esm/node-grouping-validation.js.map +1 -1
  374. package/dist/esm/node-helpers.d.ts.map +1 -1
  375. package/dist/esm/node-helpers.js +3 -0
  376. package/dist/esm/node-helpers.js.map +1 -1
  377. package/dist/esm/node-parameters/filter-parameter.d.ts.map +1 -1
  378. package/dist/esm/node-parameters/filter-parameter.js.map +1 -1
  379. package/dist/esm/node-reference-parser-utils.js.map +1 -1
  380. package/dist/esm/run-execution-data-factory.js.map +1 -1
  381. package/dist/esm/schemas.d.ts +13 -13
  382. package/dist/esm/schemas.d.ts.map +1 -1
  383. package/dist/esm/schemas.js +1 -0
  384. package/dist/esm/schemas.js.map +1 -1
  385. package/dist/esm/telemetry-helpers.d.ts.map +1 -1
  386. package/dist/esm/telemetry-helpers.js.map +1 -1
  387. package/dist/esm/type-guards.d.ts +3 -3
  388. package/dist/esm/type-guards.d.ts.map +1 -1
  389. package/dist/esm/type-validation.d.ts.map +1 -1
  390. package/dist/esm/type-validation.js.map +1 -1
  391. package/dist/esm/typecheck.tsbuildinfo +1 -1
  392. package/dist/esm/utils.d.ts +2 -2
  393. package/dist/esm/utils.d.ts.map +1 -1
  394. package/dist/esm/utils.js.map +1 -1
  395. package/dist/esm/versioned-node-type.d.ts.map +1 -1
  396. package/dist/esm/workflow-data-proxy.d.ts.map +1 -1
  397. package/dist/esm/workflow-data-proxy.js.map +1 -1
  398. package/dist/esm/workflow-diff.d.ts +2 -1
  399. package/dist/esm/workflow-diff.d.ts.map +1 -1
  400. package/dist/esm/workflow-diff.js +3 -1
  401. package/dist/esm/workflow-diff.js.map +1 -1
  402. package/dist/esm/workflow-expression.d.ts.map +1 -1
  403. package/dist/esm/workflow-expression.js.map +1 -1
  404. package/dist/esm/workflow-structure-validation.d.ts.map +1 -1
  405. package/dist/esm/workflow-structure-validation.js.map +1 -1
  406. package/dist/esm/workflow.d.ts.map +1 -1
  407. package/dist/esm/workflow.js.map +1 -1
  408. package/package.json +9 -8
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2
3
  if (k2 === undefined) k2 = k;
3
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -31,589 +32,577 @@ var __importStar = (this && this.__importStar) || (function () {
31
32
  return result;
32
33
  };
33
34
  })();
34
- (function (factory) {
35
- if (typeof module === "object" && typeof module.exports === "object") {
36
- var v = factory(require, exports);
37
- if (v !== undefined) module.exports = v;
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Expression = void 0;
37
+ const expression_runtime_1 = require("@n8n/expression-runtime");
38
+ const luxon_1 = require("luxon");
39
+ const errors_1 = require("./errors");
40
+ const expression_extension_error_1 = require("./errors/expression-extension.error");
41
+ const expression_error_1 = require("./errors/expression.error");
42
+ const expression_evaluator_proxy_1 = require("./expression-evaluator-proxy");
43
+ const expression_sandboxing_1 = require("./expression-sandboxing");
44
+ const expression_helpers_1 = require("./expressions/expression-helpers");
45
+ const LoggerProxy = __importStar(require("./logger-proxy"));
46
+ const extensions_1 = require("./extensions");
47
+ const expression_extension_1 = require("./extensions/expression-extension");
48
+ const extended_functions_1 = require("./extensions/extended-functions");
49
+ const IS_FRONTEND_IN_DEV_MODE = typeof process === 'object' &&
50
+ Object.keys(process).length === 1 &&
51
+ 'env' in process &&
52
+ Object.keys(process.env).length === 0;
53
+ const IS_FRONTEND = typeof process === 'undefined' || IS_FRONTEND_IN_DEV_MODE;
54
+ const isSyntaxError = (error) => error instanceof SyntaxError || (error instanceof Error && error.name === 'SyntaxError');
55
+ const isExpressionError = (error) => error instanceof expression_error_1.ExpressionError || error instanceof expression_extension_error_1.ExpressionExtensionError;
56
+ const isTypeError = (error) => error instanceof TypeError || (error instanceof Error && error.name === 'TypeError');
57
+ // Make sure that error get forwarded
58
+ (0, expression_evaluator_proxy_1.setErrorHandler)((error) => {
59
+ if (isExpressionError(error))
60
+ throw error;
61
+ });
62
+ /**
63
+ * Map errors from the VM expression evaluator to host-side error types.
64
+ *
65
+ * The VM bridge can only reconstruct plain Error objects with .name set,
66
+ * because it can't import ExpressionError/ExpressionExtensionError from
67
+ * packages/workflow without creating a circular dependency.
68
+ *
69
+ * TODO: Move this reconstruction into the bridge once expression-runtime
70
+ * can depend on workflow error classes (or a shared error package exists).
71
+ */
72
+ function mapVmError(error) {
73
+ if (isExpressionError(error))
74
+ return error;
75
+ // Runtime error types (TimeoutError, MemoryLimitError, etc.) must be
76
+ // checked before the name-based reconstruction below, because they
77
+ // extend the runtime's ExpressionError and share .name === 'ExpressionError'.
78
+ if (error instanceof expression_runtime_1.TimeoutError) {
79
+ const wrapped = new expression_error_1.ExpressionError('Expression timed out');
80
+ wrapped.cause = error;
81
+ return wrapped;
38
82
  }
39
- else if (typeof define === "function" && define.amd) {
40
- define(["require", "exports", "@n8n/expression-runtime", "luxon", "./errors", "./errors/expression-extension.error", "./errors/expression.error", "./expression-evaluator-proxy", "./expression-sandboxing", "./expressions/expression-helpers", "./logger-proxy", "./extensions", "./extensions/expression-extension", "./extensions/extended-functions"], factory);
83
+ if (error instanceof expression_runtime_1.MemoryLimitError) {
84
+ const wrapped = new expression_error_1.ExpressionError('Expression exceeded memory limit');
85
+ wrapped.cause = error;
86
+ return wrapped;
41
87
  }
42
- })(function (require, exports) {
43
- "use strict";
44
- var __syncRequire = typeof module === "object" && typeof module.exports === "object";
45
- Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.Expression = void 0;
47
- const expression_runtime_1 = require("@n8n/expression-runtime");
48
- const luxon_1 = require("luxon");
49
- const errors_1 = require("./errors");
50
- const expression_extension_error_1 = require("./errors/expression-extension.error");
51
- const expression_error_1 = require("./errors/expression.error");
52
- const expression_evaluator_proxy_1 = require("./expression-evaluator-proxy");
53
- const expression_sandboxing_1 = require("./expression-sandboxing");
54
- const expression_helpers_1 = require("./expressions/expression-helpers");
55
- const LoggerProxy = __importStar(require("./logger-proxy"));
56
- const extensions_1 = require("./extensions");
57
- const expression_extension_1 = require("./extensions/expression-extension");
58
- const extended_functions_1 = require("./extensions/extended-functions");
59
- const IS_FRONTEND_IN_DEV_MODE = typeof process === 'object' &&
60
- Object.keys(process).length === 1 &&
61
- 'env' in process &&
62
- Object.keys(process.env).length === 0;
63
- const IS_FRONTEND = typeof process === 'undefined' || IS_FRONTEND_IN_DEV_MODE;
64
- const isSyntaxError = (error) => error instanceof SyntaxError || (error instanceof Error && error.name === 'SyntaxError');
65
- const isExpressionError = (error) => error instanceof expression_error_1.ExpressionError || error instanceof expression_extension_error_1.ExpressionExtensionError;
66
- const isTypeError = (error) => error instanceof TypeError || (error instanceof Error && error.name === 'TypeError');
67
- // Make sure that error get forwarded
68
- (0, expression_evaluator_proxy_1.setErrorHandler)((error) => {
69
- if (isExpressionError(error))
70
- throw error;
71
- });
72
- /**
73
- * Map errors from the VM expression evaluator to host-side error types.
74
- *
75
- * The VM bridge can only reconstruct plain Error objects with .name set,
76
- * because it can't import ExpressionError/ExpressionExtensionError from
77
- * packages/workflow without creating a circular dependency.
78
- *
79
- * TODO: Move this reconstruction into the bridge once expression-runtime
80
- * can depend on workflow error classes (or a shared error package exists).
81
- */
82
- function mapVmError(error) {
83
- if (isExpressionError(error))
84
- return error;
85
- // Runtime error types (TimeoutError, MemoryLimitError, etc.) must be
86
- // checked before the name-based reconstruction below, because they
87
- // extend the runtime's ExpressionError and share .name === 'ExpressionError'.
88
- if (error instanceof expression_runtime_1.TimeoutError) {
89
- const wrapped = new expression_error_1.ExpressionError('Expression timed out');
90
- wrapped.cause = error;
91
- return wrapped;
92
- }
93
- if (error instanceof expression_runtime_1.MemoryLimitError) {
94
- const wrapped = new expression_error_1.ExpressionError('Expression exceeded memory limit');
95
- wrapped.cause = error;
96
- return wrapped;
97
- }
98
- if (error instanceof expression_runtime_1.SecurityViolationError) {
99
- const wrapped = new expression_error_1.ExpressionError(error.message);
100
- wrapped.cause = error;
101
- return wrapped;
102
- }
103
- // Name-based reconstruction for errors that crossed the isolate boundary
104
- if (error instanceof Error && error.name === 'ExpressionExtensionError') {
105
- const reconstructed = new expression_extension_error_1.ExpressionExtensionError(error.message);
106
- Object.assign(reconstructed, error);
107
- return reconstructed;
108
- }
109
- if (error instanceof Error && error.name === 'ExpressionError') {
110
- const reconstructed = new expression_error_1.ExpressionError(error.message);
111
- Object.assign(reconstructed, error);
112
- return reconstructed;
113
- }
114
- if (isSyntaxError(error))
115
- return new expression_error_1.ExpressionError('invalid syntax');
116
- if (error instanceof Error)
117
- return error;
118
- return new Error(String(error));
88
+ if (error instanceof expression_runtime_1.SecurityViolationError) {
89
+ const wrapped = new expression_error_1.ExpressionError(error.message);
90
+ wrapped.cause = error;
91
+ return wrapped;
119
92
  }
120
- /**
121
- * Creates a safe Object wrapper that removes dangerous static methods
122
- * that could be used to bypass property access sanitization.
123
- *
124
- * Blocked methods:
125
- * - defineProperty/defineProperties: Can set properties bypassing access checks
126
- * - setPrototypeOf/getPrototypeOf: Can manipulate prototype chains
127
- * - getOwnPropertyDescriptor(s): Can introspect sensitive properties
128
- * - __defineGetter__/__defineSetter__: Legacy methods that can bypass set traps
129
- * - __lookupGetter__/__lookupSetter__: Can introspect getters/setters
130
- *
131
- * Object.create is wrapped to prevent passing property descriptors (2nd argument)
132
- */
133
- const createSafeObject = () => {
134
- const safeCreate = (proto) => {
135
- // Only allow single-argument create (no property descriptors)
136
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
137
- return Object.create(proto);
138
- };
139
- // Block dangerous static and prototype methods
140
- const blockedMethods = new Set([
141
- // Static methods that can bypass property access checks
142
- 'defineProperty',
143
- 'defineProperties',
144
- 'setPrototypeOf',
145
- 'getPrototypeOf',
146
- 'getOwnPropertyDescriptor',
147
- 'getOwnPropertyDescriptors',
148
- // Legacy methods that can bypass Proxy set traps
149
- '__defineGetter__',
150
- '__defineSetter__',
151
- '__lookupGetter__',
152
- '__lookupSetter__',
153
- ]);
154
- // Create a proxy that blocks dangerous methods
155
- return new Proxy(Object, {
156
- get(target, prop, receiver) {
157
- if (blockedMethods.has(prop)) {
158
- return undefined;
159
- }
160
- // Wrap Object.create to prevent property descriptor argument
161
- if (prop === 'create') {
162
- return safeCreate;
163
- }
164
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
165
- return Reflect.get(target, prop, receiver);
166
- },
167
- // Block defineProperty trap to prevent __defineGetter__ from working
168
- defineProperty() {
169
- return false;
170
- },
171
- });
93
+ // Name-based reconstruction for errors that crossed the isolate boundary
94
+ if (error instanceof Error && error.name === 'ExpressionExtensionError') {
95
+ const reconstructed = new expression_extension_error_1.ExpressionExtensionError(error.message);
96
+ Object.assign(reconstructed, error);
97
+ return reconstructed;
98
+ }
99
+ if (error instanceof Error && error.name === 'ExpressionError') {
100
+ const reconstructed = new expression_error_1.ExpressionError(error.message);
101
+ Object.assign(reconstructed, error);
102
+ return reconstructed;
103
+ }
104
+ if (isSyntaxError(error))
105
+ return new expression_error_1.ExpressionError('invalid syntax');
106
+ if (error instanceof Error)
107
+ return error;
108
+ return new Error(String(error));
109
+ }
110
+ /**
111
+ * Creates a safe Object wrapper that removes dangerous static methods
112
+ * that could be used to bypass property access sanitization.
113
+ *
114
+ * Blocked methods:
115
+ * - defineProperty/defineProperties: Can set properties bypassing access checks
116
+ * - setPrototypeOf/getPrototypeOf: Can manipulate prototype chains
117
+ * - getOwnPropertyDescriptor(s): Can introspect sensitive properties
118
+ * - __defineGetter__/__defineSetter__: Legacy methods that can bypass set traps
119
+ * - __lookupGetter__/__lookupSetter__: Can introspect getters/setters
120
+ *
121
+ * Object.create is wrapped to prevent passing property descriptors (2nd argument)
122
+ */
123
+ const createSafeObject = () => {
124
+ const safeCreate = (proto) => {
125
+ // Only allow single-argument create (no property descriptors)
126
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
127
+ return Object.create(proto);
172
128
  };
173
- /**
174
- * List of properties that are blocked on Error and all Error subclasses.
175
- * These properties can be exploited for sandbox escape via V8's stack trace API.
176
- */
177
- const blockedErrorProperties = new Set([
178
- // V8 stack trace manipulation
179
- 'captureStackTrace',
180
- 'prepareStackTrace',
181
- 'stackTraceLimit',
129
+ // Block dangerous static and prototype methods
130
+ const blockedMethods = new Set([
131
+ // Static methods that can bypass property access checks
132
+ 'defineProperty',
133
+ 'defineProperties',
134
+ 'setPrototypeOf',
135
+ 'getPrototypeOf',
136
+ 'getOwnPropertyDescriptor',
137
+ 'getOwnPropertyDescriptors',
182
138
  // Legacy methods that can bypass Proxy set traps
183
139
  '__defineGetter__',
184
140
  '__defineSetter__',
185
141
  '__lookupGetter__',
186
142
  '__lookupSetter__',
187
143
  ]);
144
+ // Create a proxy that blocks dangerous methods
145
+ return new Proxy(Object, {
146
+ get(target, prop, receiver) {
147
+ if (blockedMethods.has(prop)) {
148
+ return undefined;
149
+ }
150
+ // Wrap Object.create to prevent property descriptor argument
151
+ if (prop === 'create') {
152
+ return safeCreate;
153
+ }
154
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
155
+ return Reflect.get(target, prop, receiver);
156
+ },
157
+ // Block defineProperty trap to prevent __defineGetter__ from working
158
+ defineProperty() {
159
+ return false;
160
+ },
161
+ });
162
+ };
163
+ /**
164
+ * List of properties that are blocked on Error and all Error subclasses.
165
+ * These properties can be exploited for sandbox escape via V8's stack trace API.
166
+ */
167
+ const blockedErrorProperties = new Set([
168
+ // V8 stack trace manipulation
169
+ 'captureStackTrace',
170
+ 'prepareStackTrace',
171
+ 'stackTraceLimit',
172
+ // Legacy methods that can bypass Proxy set traps
173
+ '__defineGetter__',
174
+ '__defineSetter__',
175
+ '__lookupGetter__',
176
+ '__lookupSetter__',
177
+ ]);
178
+ /**
179
+ * Creates a safe Error constructor that removes dangerous static methods
180
+ * like captureStackTrace and prepareStackTrace which can be exploited for RCE.
181
+ *
182
+ * The V8 prepareStackTrace attack works by:
183
+ * 1. Setting Error.prepareStackTrace to a malicious function
184
+ * 2. Creating a new Error and accessing its .stack property
185
+ * 3. V8 calls the prepareStackTrace function with CallSite objects
186
+ * 4. CallSite.getThis() returns the real global object, escaping the sandbox
187
+ */
188
+ const createSafeError = () => {
189
+ return new Proxy(Error, {
190
+ get(target, prop, receiver) {
191
+ if (blockedErrorProperties.has(prop)) {
192
+ return undefined;
193
+ }
194
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
195
+ return Reflect.get(target, prop, receiver);
196
+ },
197
+ set() {
198
+ // Prevent setting any properties on Error (like prepareStackTrace)
199
+ return false;
200
+ },
201
+ defineProperty() {
202
+ // Prevent defineProperty (blocks __defineGetter__ internally)
203
+ return false;
204
+ },
205
+ });
206
+ };
207
+ /**
208
+ * Creates a safe wrapper for Error subclasses (TypeError, SyntaxError, etc.)
209
+ * While prepareStackTrace is only on Error in V8, we wrap subclasses for defense in depth.
210
+ */
211
+ const createSafeErrorSubclass = (ErrorClass) => {
212
+ return new Proxy(ErrorClass, {
213
+ get(target, prop, receiver) {
214
+ if (blockedErrorProperties.has(prop)) {
215
+ return undefined;
216
+ }
217
+ return Reflect.get(target, prop, receiver);
218
+ },
219
+ set() {
220
+ return false;
221
+ },
222
+ defineProperty() {
223
+ return false;
224
+ },
225
+ });
226
+ };
227
+ class Expression {
228
+ timezone;
229
+ static expressionEngine = 'legacy';
230
+ static vmEvaluator;
231
+ constructor(timezone) {
232
+ this.timezone = timezone;
233
+ }
188
234
  /**
189
- * Creates a safe Error constructor that removes dangerous static methods
190
- * like captureStackTrace and prepareStackTrace which can be exploited for RCE.
191
- *
192
- * The V8 prepareStackTrace attack works by:
193
- * 1. Setting Error.prepareStackTrace to a malicious function
194
- * 2. Creating a new Error and accessing its .stack property
195
- * 3. V8 calls the prepareStackTrace function with CallSite objects
196
- * 4. CallSite.getThis() returns the real global object, escaping the sandbox
235
+ * Check if VM evaluator should be used for evaluation.
236
+ * @private
197
237
  */
198
- const createSafeError = () => {
199
- return new Proxy(Error, {
200
- get(target, prop, receiver) {
201
- if (blockedErrorProperties.has(prop)) {
202
- return undefined;
203
- }
204
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
205
- return Reflect.get(target, prop, receiver);
206
- },
207
- set() {
208
- // Prevent setting any properties on Error (like prepareStackTrace)
209
- return false;
210
- },
211
- defineProperty() {
212
- // Prevent defineProperty (blocks __defineGetter__ internally)
213
- return false;
214
- },
215
- });
216
- };
238
+ static shouldUseVm() {
239
+ return this.expressionEngine === 'vm' && !IS_FRONTEND && !!this.vmEvaluator;
240
+ }
217
241
  /**
218
- * Creates a safe wrapper for Error subclasses (TypeError, SyntaxError, etc.)
219
- * While prepareStackTrace is only on Error in V8, we wrap subclasses for defense in depth.
242
+ * Initialize the VM evaluator (if feature flag is enabled).
243
+ * Should be called once during application startup.
244
+ * Only available in Node.js environments (not in browser).
220
245
  */
221
- const createSafeErrorSubclass = (ErrorClass) => {
222
- return new Proxy(ErrorClass, {
223
- get(target, prop, receiver) {
224
- if (blockedErrorProperties.has(prop)) {
225
- return undefined;
226
- }
227
- return Reflect.get(target, prop, receiver);
228
- },
229
- set() {
230
- return false;
231
- },
232
- defineProperty() {
233
- return false;
234
- },
235
- });
236
- };
237
- class Expression {
238
- timezone;
239
- static expressionEngine = 'legacy';
240
- static vmEvaluator;
241
- constructor(timezone) {
242
- this.timezone = timezone;
246
+ static async initExpressionEngine(options) {
247
+ if (options.engine !== 'vm' || IS_FRONTEND)
248
+ return;
249
+ this.expressionEngine = options.engine;
250
+ if (!this.vmEvaluator) {
251
+ // Dynamic import to avoid loading expression-runtime in browser environments
252
+ const { ExpressionEvaluator, IsolatedVmBridge } = await import('@n8n/expression-runtime');
253
+ this.vmEvaluator = new ExpressionEvaluator({
254
+ createBridge: () => new IsolatedVmBridge({
255
+ timeout: options.bridgeTimeout,
256
+ memoryLimit: options.bridgeMemoryLimit,
257
+ logger: LoggerProxy,
258
+ }),
259
+ maxCodeCacheSize: options.maxCodeCacheSize,
260
+ poolSize: options.poolSize,
261
+ idleTimeoutMs: options.idleTimeoutMs,
262
+ hooks: {
263
+ before: [expression_sandboxing_1.ThisSanitizer],
264
+ after: [expression_sandboxing_1.PrototypeSanitizer, expression_sandboxing_1.DollarSignValidator],
265
+ },
266
+ logger: LoggerProxy,
267
+ observability: options.observability,
268
+ });
269
+ await this.vmEvaluator.initialize();
270
+ }
271
+ }
272
+ /** Returns whether an isolate was newly acquired; `false` means this caller already held one and must not release it. */
273
+ async acquireIsolate() {
274
+ if (Expression.vmEvaluator)
275
+ return await Expression.vmEvaluator.acquire(this);
276
+ return false;
277
+ }
278
+ async releaseIsolate() {
279
+ if (Expression.vmEvaluator)
280
+ await Expression.vmEvaluator.release(this);
281
+ }
282
+ /**
283
+ * Dispose the VM evaluator and release resources.
284
+ * Should be called during application shutdown or test teardown.
285
+ */
286
+ static async disposeExpressionEngine() {
287
+ if (this.vmEvaluator) {
288
+ await this.vmEvaluator.dispose();
289
+ this.vmEvaluator = undefined;
243
290
  }
291
+ }
292
+ /**
293
+ * Get the active expression evaluation implementation.
294
+ * Used for testing and verification.
295
+ */
296
+ static getActiveImplementation() {
297
+ if (this.shouldUseVm())
298
+ return 'vm';
299
+ return 'legacy';
300
+ }
301
+ /**
302
+ * Set the expression engine programmatically.
303
+ *
304
+ * WARNING: This is a global setting — switching engines mid-execution could
305
+ * cause a workflow to evaluate some expressions with one engine and some with
306
+ * another. Only use this in benchmarks and tests, never in production code.
307
+ * In production, set `N8N_EXPRESSION_ENGINE` before process startup instead.
308
+ */
309
+ static setExpressionEngine(engine) {
310
+ this.expressionEngine = engine;
311
+ }
312
+ static initializeGlobalContext(data) {
244
313
  /**
245
- * Check if VM evaluator should be used for evaluation.
246
- * @private
314
+ * Denylist
247
315
  */
248
- static shouldUseVm() {
249
- return this.expressionEngine === 'vm' && !IS_FRONTEND && !!this.vmEvaluator;
316
+ data.document = {};
317
+ data.global = {};
318
+ data.window = {};
319
+ data.Window = {};
320
+ data.this = {};
321
+ data.globalThis = {};
322
+ data.self = {};
323
+ // Alerts
324
+ data.alert = {};
325
+ data.prompt = {};
326
+ data.confirm = {};
327
+ // Prevent Remote Code Execution
328
+ data.eval = {};
329
+ data.uneval = {};
330
+ data.setTimeout = {};
331
+ data.setInterval = {};
332
+ data.setImmediate = {};
333
+ data.clearImmediate = {};
334
+ data.queueMicrotask = {};
335
+ data.Function = {};
336
+ // Prevent Node.js module access
337
+ data.require = {};
338
+ data.module = {};
339
+ data.Buffer = {};
340
+ data.__dirname = {};
341
+ data.__filename = {};
342
+ // Prevent requests
343
+ data.fetch = {};
344
+ data.XMLHttpRequest = {};
345
+ // Prevent control abstraction
346
+ data.Promise = {};
347
+ data.Generator = {};
348
+ data.GeneratorFunction = {};
349
+ data.AsyncFunction = {};
350
+ data.AsyncGenerator = {};
351
+ data.AsyncGeneratorFunction = {};
352
+ // Prevent WASM
353
+ data.WebAssembly = {};
354
+ // Prevent Reflection
355
+ data.Reflect = {};
356
+ data.Proxy = {};
357
+ // These four names are inherited from `Object.prototype`. In the secure-mode
358
+ // task-runner sandbox `Object.prototype` is frozen, so plain assignment walks
359
+ // the prototype chain to the now read-only inherited property and throws in
360
+ // strict mode. Define them as own properties to overwrite them safely.
361
+ for (const key of [
362
+ '__lookupGetter__',
363
+ '__lookupSetter__',
364
+ '__defineGetter__',
365
+ '__defineSetter__',
366
+ ]) {
367
+ Object.defineProperty(data, key, {
368
+ value: undefined,
369
+ writable: true,
370
+ enumerable: true,
371
+ configurable: true,
372
+ });
250
373
  }
374
+ // Deprecated
375
+ data.escape = {};
376
+ data.unescape = {};
251
377
  /**
252
- * Initialize the VM evaluator (if feature flag is enabled).
253
- * Should be called once during application startup.
254
- * Only available in Node.js environments (not in browser).
378
+ * Allowlist
255
379
  */
256
- static async initExpressionEngine(options) {
257
- if (options.engine !== 'vm' || IS_FRONTEND)
258
- return;
259
- this.expressionEngine = options.engine;
260
- if (!this.vmEvaluator) {
261
- // Dynamic import to avoid loading expression-runtime in browser environments
262
- const { ExpressionEvaluator, IsolatedVmBridge } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require('@n8n/expression-runtime'))) : new Promise((resolve_1, reject_1) => { require(['@n8n/expression-runtime'], resolve_1, reject_1); }).then(__importStar));
263
- this.vmEvaluator = new ExpressionEvaluator({
264
- createBridge: () => new IsolatedVmBridge({
265
- timeout: options.bridgeTimeout,
266
- memoryLimit: options.bridgeMemoryLimit,
267
- logger: LoggerProxy,
268
- }),
269
- maxCodeCacheSize: options.maxCodeCacheSize,
270
- poolSize: options.poolSize,
271
- idleTimeoutMs: options.idleTimeoutMs,
272
- hooks: {
273
- before: [expression_sandboxing_1.ThisSanitizer],
274
- after: [expression_sandboxing_1.PrototypeSanitizer, expression_sandboxing_1.DollarSignValidator],
275
- },
276
- logger: LoggerProxy,
277
- observability: options.observability,
278
- });
279
- await this.vmEvaluator.initialize();
280
- }
380
+ // Dates
381
+ data.Date = Date;
382
+ data.DateTime = luxon_1.DateTime;
383
+ data.Interval = luxon_1.Interval;
384
+ data.Duration = luxon_1.Duration;
385
+ // Objects - use safe wrapper to block dangerous methods like defineProperty
386
+ data.Object = createSafeObject();
387
+ // Arrays
388
+ data.Array = Array;
389
+ data.Int8Array = Int8Array;
390
+ data.Uint8Array = Uint8Array;
391
+ data.Uint8ClampedArray = Uint8ClampedArray;
392
+ data.Int16Array = Int16Array;
393
+ data.Uint16Array = Uint16Array;
394
+ data.Int32Array = Int32Array;
395
+ data.Uint32Array = Uint32Array;
396
+ data.Float32Array = Float32Array;
397
+ data.Float64Array = Float64Array;
398
+ data.BigInt64Array = typeof BigInt64Array !== 'undefined' ? BigInt64Array : {};
399
+ data.BigUint64Array = typeof BigUint64Array !== 'undefined' ? BigUint64Array : {};
400
+ // Collections
401
+ data.Map = typeof Map !== 'undefined' ? Map : {};
402
+ data.WeakMap = typeof WeakMap !== 'undefined' ? WeakMap : {};
403
+ data.Set = typeof Set !== 'undefined' ? Set : {};
404
+ data.WeakSet = typeof WeakSet !== 'undefined' ? WeakSet : {};
405
+ // Errors - use safe wrappers to block prepareStackTrace, captureStackTrace,
406
+ // and other dangerous properties that could enable sandbox escape
407
+ data.Error = createSafeError();
408
+ data.TypeError = createSafeErrorSubclass(TypeError);
409
+ data.SyntaxError = createSafeErrorSubclass(SyntaxError);
410
+ data.EvalError = createSafeErrorSubclass(EvalError);
411
+ data.RangeError = createSafeErrorSubclass(RangeError);
412
+ data.ReferenceError = createSafeErrorSubclass(ReferenceError);
413
+ data.URIError = createSafeErrorSubclass(URIError);
414
+ // Internationalization
415
+ data.Intl = typeof Intl !== 'undefined' ? Intl : {};
416
+ // Text
417
+ // eslint-disable-next-line id-denylist
418
+ data.String = String;
419
+ data.RegExp = RegExp;
420
+ // Math
421
+ data.Math = Math;
422
+ // eslint-disable-next-line id-denylist
423
+ data.Number = Number;
424
+ data.BigInt = typeof BigInt !== 'undefined' ? BigInt : {};
425
+ data.Infinity = Infinity;
426
+ data.NaN = NaN;
427
+ data.isFinite = Number.isFinite;
428
+ data.isNaN = Number.isNaN;
429
+ data.parseFloat = parseFloat;
430
+ data.parseInt = parseInt;
431
+ // Structured data
432
+ data.JSON = JSON;
433
+ data.ArrayBuffer = typeof ArrayBuffer !== 'undefined' ? ArrayBuffer : {};
434
+ data.SharedArrayBuffer = typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer : {};
435
+ data.Atomics = typeof Atomics !== 'undefined' ? Atomics : {};
436
+ data.DataView = typeof DataView !== 'undefined' ? DataView : {};
437
+ data.encodeURI = encodeURI;
438
+ data.encodeURIComponent = encodeURIComponent;
439
+ data.decodeURI = decodeURI;
440
+ data.decodeURIComponent = decodeURIComponent;
441
+ // Other
442
+ // eslint-disable-next-line id-denylist
443
+ data.Boolean = Boolean;
444
+ data.Symbol = Symbol;
445
+ }
446
+ static resolveWithoutWorkflow(expression, data = {}) {
447
+ return (0, expression_evaluator_proxy_1.evaluateExpression)(expression, data);
448
+ }
449
+ /**
450
+ * Converts an object to a string in a way to make it clear that
451
+ * the value comes from an object
452
+ *
453
+ */
454
+ convertObjectValueToString(value) {
455
+ if (value instanceof luxon_1.DateTime && value.invalidReason !== null) {
456
+ throw new errors_1.UserError('invalid DateTime');
281
457
  }
282
- /** Returns whether an isolate was newly acquired; `false` means this caller already held one and must not release it. */
283
- async acquireIsolate() {
284
- if (Expression.vmEvaluator)
285
- return await Expression.vmEvaluator.acquire(this);
286
- return false;
458
+ if (value === null) {
459
+ return 'null';
287
460
  }
288
- async releaseIsolate() {
289
- if (Expression.vmEvaluator)
290
- await Expression.vmEvaluator.release(this);
461
+ let typeName = value.constructor.name ?? 'Object';
462
+ if (luxon_1.DateTime.isDateTime(value)) {
463
+ typeName = 'DateTime';
291
464
  }
292
- /**
293
- * Dispose the VM evaluator and release resources.
294
- * Should be called during application shutdown or test teardown.
295
- */
296
- static async disposeExpressionEngine() {
297
- if (this.vmEvaluator) {
298
- await this.vmEvaluator.dispose();
299
- this.vmEvaluator = undefined;
300
- }
465
+ let result = '';
466
+ if (value instanceof Date) {
467
+ // We don't want to use JSON.stringify for dates since it disregards workflow timezone
468
+ result = luxon_1.DateTime.fromJSDate(value, {
469
+ zone: this.timezone,
470
+ }).toISO();
301
471
  }
302
- /**
303
- * Get the active expression evaluation implementation.
304
- * Used for testing and verification.
305
- */
306
- static getActiveImplementation() {
307
- if (this.shouldUseVm())
308
- return 'vm';
309
- return 'legacy';
472
+ else if (luxon_1.DateTime.isDateTime(value)) {
473
+ result = value.toString();
310
474
  }
311
- /**
312
- * Set the expression engine programmatically.
313
- *
314
- * WARNING: This is a global setting — switching engines mid-execution could
315
- * cause a workflow to evaluate some expressions with one engine and some with
316
- * another. Only use this in benchmarks and tests, never in production code.
317
- * In production, set `N8N_EXPRESSION_ENGINE` before process startup instead.
318
- */
319
- static setExpressionEngine(engine) {
320
- this.expressionEngine = engine;
475
+ else {
476
+ result = JSON.stringify(value);
321
477
  }
322
- static initializeGlobalContext(data) {
323
- /**
324
- * Denylist
325
- */
326
- data.document = {};
327
- data.global = {};
328
- data.window = {};
329
- data.Window = {};
330
- data.this = {};
331
- data.globalThis = {};
332
- data.self = {};
333
- // Alerts
334
- data.alert = {};
335
- data.prompt = {};
336
- data.confirm = {};
337
- // Prevent Remote Code Execution
338
- data.eval = {};
339
- data.uneval = {};
340
- data.setTimeout = {};
341
- data.setInterval = {};
342
- data.setImmediate = {};
343
- data.clearImmediate = {};
344
- data.queueMicrotask = {};
345
- data.Function = {};
346
- // Prevent Node.js module access
347
- data.require = {};
348
- data.module = {};
349
- data.Buffer = {};
350
- data.__dirname = {};
351
- data.__filename = {};
352
- // Prevent requests
353
- data.fetch = {};
354
- data.XMLHttpRequest = {};
355
- // Prevent control abstraction
356
- data.Promise = {};
357
- data.Generator = {};
358
- data.GeneratorFunction = {};
359
- data.AsyncFunction = {};
360
- data.AsyncGenerator = {};
361
- data.AsyncGeneratorFunction = {};
362
- // Prevent WASM
363
- data.WebAssembly = {};
364
- // Prevent Reflection
365
- data.Reflect = {};
366
- data.Proxy = {};
367
- // These four names are inherited from `Object.prototype`. In the secure-mode
368
- // task-runner sandbox `Object.prototype` is frozen, so plain assignment walks
369
- // the prototype chain to the now read-only inherited property and throws in
370
- // strict mode. Define them as own properties to overwrite them safely.
371
- for (const key of [
372
- '__lookupGetter__',
373
- '__lookupSetter__',
374
- '__defineGetter__',
375
- '__defineSetter__',
376
- ]) {
377
- Object.defineProperty(data, key, {
378
- value: undefined,
379
- writable: true,
380
- enumerable: true,
381
- configurable: true,
382
- });
383
- }
384
- // Deprecated
385
- data.escape = {};
386
- data.unescape = {};
387
- /**
388
- * Allowlist
389
- */
390
- // Dates
391
- data.Date = Date;
392
- data.DateTime = luxon_1.DateTime;
393
- data.Interval = luxon_1.Interval;
394
- data.Duration = luxon_1.Duration;
395
- // Objects - use safe wrapper to block dangerous methods like defineProperty
396
- data.Object = createSafeObject();
397
- // Arrays
398
- data.Array = Array;
399
- data.Int8Array = Int8Array;
400
- data.Uint8Array = Uint8Array;
401
- data.Uint8ClampedArray = Uint8ClampedArray;
402
- data.Int16Array = Int16Array;
403
- data.Uint16Array = Uint16Array;
404
- data.Int32Array = Int32Array;
405
- data.Uint32Array = Uint32Array;
406
- data.Float32Array = Float32Array;
407
- data.Float64Array = Float64Array;
408
- data.BigInt64Array = typeof BigInt64Array !== 'undefined' ? BigInt64Array : {};
409
- data.BigUint64Array = typeof BigUint64Array !== 'undefined' ? BigUint64Array : {};
410
- // Collections
411
- data.Map = typeof Map !== 'undefined' ? Map : {};
412
- data.WeakMap = typeof WeakMap !== 'undefined' ? WeakMap : {};
413
- data.Set = typeof Set !== 'undefined' ? Set : {};
414
- data.WeakSet = typeof WeakSet !== 'undefined' ? WeakSet : {};
415
- // Errors - use safe wrappers to block prepareStackTrace, captureStackTrace,
416
- // and other dangerous properties that could enable sandbox escape
417
- data.Error = createSafeError();
418
- data.TypeError = createSafeErrorSubclass(TypeError);
419
- data.SyntaxError = createSafeErrorSubclass(SyntaxError);
420
- data.EvalError = createSafeErrorSubclass(EvalError);
421
- data.RangeError = createSafeErrorSubclass(RangeError);
422
- data.ReferenceError = createSafeErrorSubclass(ReferenceError);
423
- data.URIError = createSafeErrorSubclass(URIError);
424
- // Internationalization
425
- data.Intl = typeof Intl !== 'undefined' ? Intl : {};
426
- // Text
427
- // eslint-disable-next-line id-denylist
428
- data.String = String;
429
- data.RegExp = RegExp;
430
- // Math
431
- data.Math = Math;
432
- // eslint-disable-next-line id-denylist
433
- data.Number = Number;
434
- data.BigInt = typeof BigInt !== 'undefined' ? BigInt : {};
435
- data.Infinity = Infinity;
436
- data.NaN = NaN;
437
- data.isFinite = Number.isFinite;
438
- data.isNaN = Number.isNaN;
439
- data.parseFloat = parseFloat;
440
- data.parseInt = parseInt;
441
- // Structured data
442
- data.JSON = JSON;
443
- data.ArrayBuffer = typeof ArrayBuffer !== 'undefined' ? ArrayBuffer : {};
444
- data.SharedArrayBuffer = typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer : {};
445
- data.Atomics = typeof Atomics !== 'undefined' ? Atomics : {};
446
- data.DataView = typeof DataView !== 'undefined' ? DataView : {};
447
- data.encodeURI = encodeURI;
448
- data.encodeURIComponent = encodeURIComponent;
449
- data.decodeURI = decodeURI;
450
- data.decodeURIComponent = decodeURIComponent;
451
- // Other
452
- // eslint-disable-next-line id-denylist
453
- data.Boolean = Boolean;
454
- data.Symbol = Symbol;
478
+ result = result
479
+ .replace(/,"/g, ', "') // spacing for
480
+ .replace(/":/g, '": '); // readability
481
+ return `[${typeName}: ${result}]`;
482
+ }
483
+ /**
484
+ * Resolves the parameter value. If it is an expression it will execute it and
485
+ * return the result. For everything simply the supplied value will be returned.
486
+ *
487
+ * @param {NodeParameterValue} parameterValue - The parameter value to resolve
488
+ * @param {IWorkflowDataProxyData} data - The workflow data proxy data
489
+ * @param {boolean} [returnObjectAsString=false] - Whether to convert objects to strings
490
+ */
491
+ resolveSimpleParameterValue(parameterValue, data, returnObjectAsString = false) {
492
+ // Check if it is an expression
493
+ if (!(0, expression_helpers_1.isExpression)(parameterValue)) {
494
+ // Is no expression so return value
495
+ return parameterValue;
455
496
  }
456
- static resolveWithoutWorkflow(expression, data = {}) {
457
- return (0, expression_evaluator_proxy_1.evaluateExpression)(expression, data);
497
+ // Is an expression
498
+ // Remove the equal sign
499
+ parameterValue = parameterValue.substr(1);
500
+ // Support only a subset of process properties
501
+ data.process =
502
+ typeof process !== 'undefined'
503
+ ? {
504
+ arch: process.arch,
505
+ env: process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE !== 'false' ? {} : process.env,
506
+ platform: process.platform,
507
+ pid: process.pid,
508
+ ppid: process.ppid,
509
+ release: process.release,
510
+ version: process.version,
511
+ versions: process.versions,
512
+ }
513
+ : {};
514
+ Expression.initializeGlobalContext(data);
515
+ const usingVm = Expression.shouldUseVm();
516
+ // Expression extensions — only attached for the legacy engine.
517
+ //
518
+ // In the VM engine, function-typed bindings on `data` are
519
+ // structurally unreachable: the bridge's `getValueAtPath` returns
520
+ // `undefined` for any function-typed value, and the in-isolate
521
+ // runtime resolves helpers itself via Tournament's polyfill
522
+ // (see packages/@n8n/expression-runtime/src/runtime/context.ts,
523
+ // where bare `extend(...)` calls bind to the in-isolate copy on
524
+ // `target.extend`). Setting them on `data` in VM mode would be
525
+ // dead code.
526
+ if (!usingVm) {
527
+ data.extend = extensions_1.extend;
528
+ data.extendOptional = extensions_1.extendOptional;
458
529
  }
459
- /**
460
- * Converts an object to a string in a way to make it clear that
461
- * the value comes from an object
462
- *
463
- */
464
- convertObjectValueToString(value) {
465
- if (value instanceof luxon_1.DateTime && value.invalidReason !== null) {
466
- throw new errors_1.UserError('invalid DateTime');
467
- }
468
- if (value === null) {
469
- return 'null';
470
- }
471
- let typeName = value.constructor.name ?? 'Object';
472
- if (luxon_1.DateTime.isDateTime(value)) {
473
- typeName = 'DateTime';
474
- }
475
- let result = '';
476
- if (value instanceof Date) {
477
- // We don't want to use JSON.stringify for dates since it disregards workflow timezone
478
- result = luxon_1.DateTime.fromJSDate(value, {
479
- zone: this.timezone,
480
- }).toISO();
481
- }
482
- else if (luxon_1.DateTime.isDateTime(value)) {
483
- result = value.toString();
484
- }
485
- else {
486
- result = JSON.stringify(value);
487
- }
488
- result = result
489
- .replace(/,"/g, ', "') // spacing for
490
- .replace(/":/g, '": '); // readability
491
- return `[${typeName}: ${result}]`;
530
+ // In VM mode, strip `$jmesPath` / `$jmespath` from the data proxy.
531
+ // WorkflowDataProxy adds them, but the in-isolate `target.$jmespath`
532
+ // shadows them via Tournament's polyfill (see
533
+ // packages/@n8n/expression-runtime/src/runtime/context.ts). The delete
534
+ // makes them unreachable via direct path lookup through the bridge
535
+ // too, so the bridge can never invoke the host-side copies.
536
+ if (usingVm) {
537
+ delete data.$jmesPath;
538
+ delete data.$jmespath;
492
539
  }
493
- /**
494
- * Resolves the parameter value. If it is an expression it will execute it and
495
- * return the result. For everything simply the supplied value will be returned.
496
- *
497
- * @param {NodeParameterValue} parameterValue - The parameter value to resolve
498
- * @param {IWorkflowDataProxyData} data - The workflow data proxy data
499
- * @param {boolean} [returnObjectAsString=false] - Whether to convert objects to strings
500
- */
501
- resolveSimpleParameterValue(parameterValue, data, returnObjectAsString = false) {
502
- // Check if it is an expression
503
- if (!(0, expression_helpers_1.isExpression)(parameterValue)) {
504
- // Is no expression so return value
505
- return parameterValue;
506
- }
507
- // Is an expression
508
- // Remove the equal sign
509
- parameterValue = parameterValue.substr(1);
510
- // Support only a subset of process properties
511
- data.process =
512
- typeof process !== 'undefined'
513
- ? {
514
- arch: process.arch,
515
- env: process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE !== 'false' ? {} : process.env,
516
- platform: process.platform,
517
- pid: process.pid,
518
- ppid: process.ppid,
519
- release: process.release,
520
- version: process.version,
521
- versions: process.versions,
522
- }
523
- : {};
524
- Expression.initializeGlobalContext(data);
525
- const usingVm = Expression.shouldUseVm();
526
- // Expression extensions — only attached for the legacy engine.
527
- //
528
- // In the VM engine, function-typed bindings on `data` are
529
- // structurally unreachable: the bridge's `getValueAtPath` returns
530
- // `undefined` for any function-typed value, and the in-isolate
531
- // runtime resolves helpers itself via Tournament's polyfill
532
- // (see packages/@n8n/expression-runtime/src/runtime/context.ts,
533
- // where bare `extend(...)` calls bind to the in-isolate copy on
534
- // `target.extend`). Setting them on `data` in VM mode would be
535
- // dead code.
536
- if (!usingVm) {
537
- data.extend = extensions_1.extend;
538
- data.extendOptional = extensions_1.extendOptional;
539
- }
540
- // In VM mode, strip `$jmesPath` / `$jmespath` from the data proxy.
541
- // WorkflowDataProxy adds them, but the in-isolate `target.$jmespath`
542
- // shadows them via Tournament's polyfill (see
543
- // packages/@n8n/expression-runtime/src/runtime/context.ts). The delete
544
- // makes them unreachable via direct path lookup through the bridge
545
- // too, so the bridge can never invoke the host-side copies.
546
- if (usingVm) {
547
- delete data.$jmesPath;
548
- delete data.$jmespath;
549
- }
550
- Object.defineProperty(data, expression_sandboxing_1.sanitizerName, {
551
- value: expression_sandboxing_1.sanitizer,
552
- writable: false,
553
- configurable: false,
540
+ Object.defineProperty(data, expression_sandboxing_1.sanitizerName, {
541
+ value: expression_sandboxing_1.sanitizer,
542
+ writable: false,
543
+ configurable: false,
544
+ });
545
+ Object.assign(data, extended_functions_1.extendedFunctions);
546
+ const constructorValidation = new RegExp(/\.\s*constructor/gm);
547
+ if (parameterValue.match(constructorValidation)) {
548
+ throw new expression_error_1.ExpressionError('Expression contains invalid constructor function call', {
549
+ causeDetailed: 'Constructor override attempt is not allowed due to security concerns',
550
+ runIndex: data.$thisRunIndex,
551
+ itemIndex: data.$thisItemIndex,
554
552
  });
555
- Object.assign(data, extended_functions_1.extendedFunctions);
556
- const constructorValidation = new RegExp(/\.\s*constructor/gm);
557
- if (parameterValue.match(constructorValidation)) {
558
- throw new expression_error_1.ExpressionError('Expression contains invalid constructor function call', {
559
- causeDetailed: 'Constructor override attempt is not allowed due to security concerns',
560
- runIndex: data.$thisRunIndex,
561
- itemIndex: data.$thisItemIndex,
562
- });
563
- }
564
- // Execute the expression
565
- const extendedExpression = (0, expression_extension_1.extendSyntax)(parameterValue);
566
- const returnValue = this.renderExpression(extendedExpression, data);
567
- if (typeof returnValue === 'function') {
568
- if (returnValue.name === 'DateTime')
569
- throw new errors_1.UserError('this is a DateTime, please access its methods');
570
- throw new errors_1.UserError('this is a function, please add ()');
571
- }
572
- else if (typeof returnValue === 'string') {
573
- return returnValue;
574
- }
575
- else if (returnValue !== null && typeof returnValue === 'object') {
576
- if (returnObjectAsString) {
577
- return this.convertObjectValueToString(returnValue);
578
- }
579
- }
553
+ }
554
+ // Execute the expression
555
+ const extendedExpression = (0, expression_extension_1.extendSyntax)(parameterValue);
556
+ const returnValue = this.renderExpression(extendedExpression, data);
557
+ if (typeof returnValue === 'function') {
558
+ if (returnValue.name === 'DateTime')
559
+ throw new errors_1.UserError('this is a DateTime, please access its methods');
560
+ throw new errors_1.UserError('this is a function, please add ()');
561
+ }
562
+ else if (typeof returnValue === 'string') {
580
563
  return returnValue;
581
564
  }
582
- renderExpression(expression, data) {
583
- // Use VM evaluator if engine is set to 'vm' and we're not in the browser
584
- if (Expression.expressionEngine === 'vm' && !IS_FRONTEND) {
585
- if (!Expression.vmEvaluator) {
586
- throw new errors_1.UnexpectedError('N8N_EXPRESSION_ENGINE=vm is enabled but VM evaluator is not initialized. Call Expression.initExpressionEngine() during application startup.');
587
- }
588
- try {
589
- const result = Expression.vmEvaluator.evaluate(expression, data, this, {
590
- timezone: this.timezone,
591
- });
592
- return result;
593
- }
594
- catch (error) {
595
- throw mapVmError(error);
596
- }
565
+ else if (returnValue !== null && typeof returnValue === 'object') {
566
+ if (returnObjectAsString) {
567
+ return this.convertObjectValueToString(returnValue);
568
+ }
569
+ }
570
+ return returnValue;
571
+ }
572
+ renderExpression(expression, data) {
573
+ // Use VM evaluator if engine is set to 'vm' and we're not in the browser
574
+ if (Expression.expressionEngine === 'vm' && !IS_FRONTEND) {
575
+ if (!Expression.vmEvaluator) {
576
+ throw new errors_1.UnexpectedError('N8N_EXPRESSION_ENGINE=vm is enabled but VM evaluator is not initialized. Call Expression.initExpressionEngine() during application startup.');
597
577
  }
598
- // Fall back to current implementation
599
578
  try {
600
- return (0, expression_evaluator_proxy_1.evaluateExpression)(expression, data);
579
+ const result = Expression.vmEvaluator.evaluate(expression, data, this, {
580
+ timezone: this.timezone,
581
+ });
582
+ return result;
601
583
  }
602
584
  catch (error) {
603
- if (isExpressionError(error))
604
- throw error;
605
- if (isSyntaxError(error))
606
- throw new errors_1.UserError('invalid syntax');
607
- if (isTypeError(error) && IS_FRONTEND && error.message.endsWith('is not a function')) {
608
- const match = error.message.match(/(?<msg>[^.]+is not a function)/);
609
- if (!match?.groups?.msg)
610
- return null;
611
- throw new errors_1.UserError(match.groups.msg);
612
- }
585
+ throw mapVmError(error);
586
+ }
587
+ }
588
+ // Fall back to current implementation
589
+ try {
590
+ return (0, expression_evaluator_proxy_1.evaluateExpression)(expression, data);
591
+ }
592
+ catch (error) {
593
+ if (isExpressionError(error))
594
+ throw error;
595
+ if (isSyntaxError(error))
596
+ throw new errors_1.UserError('invalid syntax');
597
+ if (isTypeError(error) && IS_FRONTEND && error.message.endsWith('is not a function')) {
598
+ const match = error.message.match(/(?<msg>[^.]+is not a function)/);
599
+ if (!match?.groups?.msg)
600
+ return null;
601
+ throw new errors_1.UserError(match.groups.msg);
613
602
  }
614
- return null;
615
603
  }
604
+ return null;
616
605
  }
617
- exports.Expression = Expression;
618
- });
606
+ }
607
+ exports.Expression = Expression;
619
608
  //# sourceMappingURL=expression.js.map