n8n-workflow 2.42.2 → 2.43.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 (225) hide show
  1. package/dist/cjs/build.tsbuildinfo +1 -1
  2. package/dist/cjs/common/get-runnable-nodes.d.ts +31 -0
  3. package/dist/cjs/common/get-runnable-nodes.d.ts.map +1 -0
  4. package/dist/cjs/common/get-runnable-nodes.js +97 -0
  5. package/dist/cjs/common/get-runnable-nodes.js.map +1 -0
  6. package/dist/cjs/common/index.d.ts +1 -0
  7. package/dist/cjs/common/index.d.ts.map +1 -1
  8. package/dist/cjs/common/index.js +1 -0
  9. package/dist/cjs/common/index.js.map +1 -1
  10. package/dist/cjs/constants.d.ts +1 -0
  11. package/dist/cjs/constants.d.ts.map +1 -1
  12. package/dist/cjs/constants.js +4 -3
  13. package/dist/cjs/constants.js.map +1 -1
  14. package/dist/cjs/errors/abstract/execution-base.error.d.ts +1 -1
  15. package/dist/cjs/errors/abstract/execution-base.error.d.ts.map +1 -1
  16. package/dist/cjs/errors/abstract/execution-base.error.js +2 -2
  17. package/dist/cjs/errors/abstract/execution-base.error.js.map +1 -1
  18. package/dist/cjs/errors/db-connection-timeout-error.d.ts +1 -1
  19. package/dist/cjs/errors/db-connection-timeout-error.d.ts.map +1 -1
  20. package/dist/cjs/errors/db-connection-timeout-error.js +2 -2
  21. package/dist/cjs/errors/db-connection-timeout-error.js.map +1 -1
  22. package/dist/cjs/errors/index.d.ts +1 -5
  23. package/dist/cjs/errors/index.d.ts.map +1 -1
  24. package/dist/cjs/errors/index.js +7 -11
  25. package/dist/cjs/errors/index.js.map +1 -1
  26. package/dist/cjs/errors/node-operation.error.js +2 -2
  27. package/dist/cjs/errors/node-operation.error.js.map +1 -1
  28. package/dist/cjs/errors/node-version-not-found.error.d.ts +1 -1
  29. package/dist/cjs/errors/node-version-not-found.error.d.ts.map +1 -1
  30. package/dist/cjs/errors/node-version-not-found.error.js +2 -2
  31. package/dist/cjs/errors/node-version-not-found.error.js.map +1 -1
  32. package/dist/cjs/errors/trigger-close.error.d.ts +1 -1
  33. package/dist/cjs/errors/trigger-close.error.d.ts.map +1 -1
  34. package/dist/cjs/errors/trigger-close.error.js +2 -2
  35. package/dist/cjs/errors/trigger-close.error.js.map +1 -1
  36. package/dist/cjs/expression.d.ts +6 -0
  37. package/dist/cjs/expression.d.ts.map +1 -1
  38. package/dist/cjs/expression.js +22 -7
  39. package/dist/cjs/expression.js.map +1 -1
  40. package/dist/cjs/expressions/native-evaluation/evaluator.d.ts +21 -0
  41. package/dist/cjs/expressions/native-evaluation/evaluator.d.ts.map +1 -0
  42. package/dist/cjs/expressions/native-evaluation/evaluator.js +372 -0
  43. package/dist/cjs/expressions/native-evaluation/evaluator.js.map +1 -0
  44. package/dist/cjs/expressions/native-evaluation/grammar.d.ts +63 -0
  45. package/dist/cjs/expressions/native-evaluation/grammar.d.ts.map +1 -0
  46. package/dist/cjs/expressions/native-evaluation/grammar.js +113 -0
  47. package/dist/cjs/expressions/native-evaluation/grammar.js.map +1 -0
  48. package/dist/cjs/expressions/native-evaluation/index.d.ts +17 -0
  49. package/dist/cjs/expressions/native-evaluation/index.d.ts.map +1 -0
  50. package/dist/cjs/expressions/native-evaluation/index.js +144 -0
  51. package/dist/cjs/expressions/native-evaluation/index.js.map +1 -0
  52. package/dist/cjs/expressions/native-evaluation/parser.d.ts +6 -0
  53. package/dist/cjs/expressions/native-evaluation/parser.d.ts.map +1 -0
  54. package/dist/cjs/expressions/native-evaluation/parser.js +159 -0
  55. package/dist/cjs/expressions/native-evaluation/parser.js.map +1 -0
  56. package/dist/cjs/extensions/date-extensions.js +2 -2
  57. package/dist/cjs/extensions/number-extensions.js +2 -2
  58. package/dist/cjs/extensions/string-extensions.js +1 -1
  59. package/dist/cjs/index.d.ts +2 -1
  60. package/dist/cjs/index.d.ts.map +1 -1
  61. package/dist/cjs/index.js +5 -1
  62. package/dist/cjs/index.js.map +1 -1
  63. package/dist/cjs/interfaces.d.ts +27 -6
  64. package/dist/cjs/interfaces.d.ts.map +1 -1
  65. package/dist/cjs/interfaces.js +3 -0
  66. package/dist/cjs/interfaces.js.map +1 -1
  67. package/dist/cjs/native-methods/array.methods.js +4 -4
  68. package/dist/cjs/node-helpers.d.ts +13 -1
  69. package/dist/cjs/node-helpers.d.ts.map +1 -1
  70. package/dist/cjs/node-helpers.js +3 -1
  71. package/dist/cjs/node-helpers.js.map +1 -1
  72. package/dist/cjs/node-parameters/filter-parameter.d.ts +1 -1
  73. package/dist/cjs/node-parameters/filter-parameter.d.ts.map +1 -1
  74. package/dist/cjs/node-parameters/filter-parameter.js +2 -2
  75. package/dist/cjs/node-parameters/filter-parameter.js.map +1 -1
  76. package/dist/cjs/node-validation.d.ts +17 -5
  77. package/dist/cjs/node-validation.d.ts.map +1 -1
  78. package/dist/cjs/node-validation.js +39 -16
  79. package/dist/cjs/node-validation.js.map +1 -1
  80. package/dist/cjs/run-execution-data/run-execution-data.v1.d.ts +13 -0
  81. package/dist/cjs/run-execution-data/run-execution-data.v1.d.ts.map +1 -1
  82. package/dist/cjs/run-execution-data/run-execution-data.v1.js.map +1 -1
  83. package/dist/cjs/run-execution-data-factory.d.ts +1 -0
  84. package/dist/cjs/run-execution-data-factory.d.ts.map +1 -1
  85. package/dist/cjs/run-execution-data-factory.js +1 -0
  86. package/dist/cjs/run-execution-data-factory.js.map +1 -1
  87. package/dist/cjs/sub-workflow-output.d.ts +13 -1
  88. package/dist/cjs/sub-workflow-output.d.ts.map +1 -1
  89. package/dist/cjs/sub-workflow-output.js +64 -0
  90. package/dist/cjs/sub-workflow-output.js.map +1 -1
  91. package/dist/cjs/utils.js +2 -2
  92. package/dist/cjs/utils.js.map +1 -1
  93. package/dist/cjs/webhook-description-fields.d.ts +31 -0
  94. package/dist/cjs/webhook-description-fields.d.ts.map +1 -1
  95. package/dist/cjs/webhook-description-fields.js +34 -0
  96. package/dist/cjs/webhook-description-fields.js.map +1 -1
  97. package/dist/esm/common/get-runnable-nodes.d.ts +31 -0
  98. package/dist/esm/common/get-runnable-nodes.d.ts.map +1 -0
  99. package/dist/esm/common/get-runnable-nodes.js +93 -0
  100. package/dist/esm/common/get-runnable-nodes.js.map +1 -0
  101. package/dist/esm/common/index.d.ts +1 -0
  102. package/dist/esm/common/index.d.ts.map +1 -1
  103. package/dist/esm/common/index.js +1 -0
  104. package/dist/esm/common/index.js.map +1 -1
  105. package/dist/esm/constants.d.ts +1 -0
  106. package/dist/esm/constants.d.ts.map +1 -1
  107. package/dist/esm/constants.js +1 -0
  108. package/dist/esm/constants.js.map +1 -1
  109. package/dist/esm/errors/abstract/execution-base.error.d.ts +1 -1
  110. package/dist/esm/errors/abstract/execution-base.error.d.ts.map +1 -1
  111. package/dist/esm/errors/abstract/execution-base.error.js +1 -1
  112. package/dist/esm/errors/abstract/execution-base.error.js.map +1 -1
  113. package/dist/esm/errors/db-connection-timeout-error.d.ts +1 -1
  114. package/dist/esm/errors/db-connection-timeout-error.d.ts.map +1 -1
  115. package/dist/esm/errors/db-connection-timeout-error.js +1 -1
  116. package/dist/esm/errors/db-connection-timeout-error.js.map +1 -1
  117. package/dist/esm/errors/index.d.ts +1 -5
  118. package/dist/esm/errors/index.d.ts.map +1 -1
  119. package/dist/esm/errors/index.js +1 -5
  120. package/dist/esm/errors/index.js.map +1 -1
  121. package/dist/esm/errors/node-operation.error.js +1 -1
  122. package/dist/esm/errors/node-operation.error.js.map +1 -1
  123. package/dist/esm/errors/node-version-not-found.error.d.ts +1 -1
  124. package/dist/esm/errors/node-version-not-found.error.d.ts.map +1 -1
  125. package/dist/esm/errors/node-version-not-found.error.js +1 -1
  126. package/dist/esm/errors/node-version-not-found.error.js.map +1 -1
  127. package/dist/esm/errors/trigger-close.error.d.ts +1 -1
  128. package/dist/esm/errors/trigger-close.error.d.ts.map +1 -1
  129. package/dist/esm/errors/trigger-close.error.js +1 -1
  130. package/dist/esm/errors/trigger-close.error.js.map +1 -1
  131. package/dist/esm/expression.d.ts +6 -0
  132. package/dist/esm/expression.d.ts.map +1 -1
  133. package/dist/esm/expression.js +22 -7
  134. package/dist/esm/expression.js.map +1 -1
  135. package/dist/esm/expressions/native-evaluation/evaluator.d.ts +21 -0
  136. package/dist/esm/expressions/native-evaluation/evaluator.d.ts.map +1 -0
  137. package/dist/esm/expressions/native-evaluation/evaluator.js +366 -0
  138. package/dist/esm/expressions/native-evaluation/evaluator.js.map +1 -0
  139. package/dist/esm/expressions/native-evaluation/grammar.d.ts +63 -0
  140. package/dist/esm/expressions/native-evaluation/grammar.d.ts.map +1 -0
  141. package/dist/esm/expressions/native-evaluation/grammar.js +108 -0
  142. package/dist/esm/expressions/native-evaluation/grammar.js.map +1 -0
  143. package/dist/esm/expressions/native-evaluation/index.d.ts +17 -0
  144. package/dist/esm/expressions/native-evaluation/index.d.ts.map +1 -0
  145. package/dist/esm/expressions/native-evaluation/index.js +137 -0
  146. package/dist/esm/expressions/native-evaluation/index.js.map +1 -0
  147. package/dist/esm/expressions/native-evaluation/parser.d.ts +6 -0
  148. package/dist/esm/expressions/native-evaluation/parser.d.ts.map +1 -0
  149. package/dist/esm/expressions/native-evaluation/parser.js +156 -0
  150. package/dist/esm/expressions/native-evaluation/parser.js.map +1 -0
  151. package/dist/esm/extensions/date-extensions.js +2 -2
  152. package/dist/esm/extensions/number-extensions.js +2 -2
  153. package/dist/esm/extensions/string-extensions.js +1 -1
  154. package/dist/esm/index.d.ts +2 -1
  155. package/dist/esm/index.d.ts.map +1 -1
  156. package/dist/esm/index.js +2 -1
  157. package/dist/esm/index.js.map +1 -1
  158. package/dist/esm/interfaces.d.ts +27 -6
  159. package/dist/esm/interfaces.d.ts.map +1 -1
  160. package/dist/esm/interfaces.js +3 -0
  161. package/dist/esm/interfaces.js.map +1 -1
  162. package/dist/esm/native-methods/array.methods.js +4 -4
  163. package/dist/esm/node-helpers.d.ts +13 -1
  164. package/dist/esm/node-helpers.d.ts.map +1 -1
  165. package/dist/esm/node-helpers.js +3 -1
  166. package/dist/esm/node-helpers.js.map +1 -1
  167. package/dist/esm/node-parameters/filter-parameter.d.ts +1 -1
  168. package/dist/esm/node-parameters/filter-parameter.d.ts.map +1 -1
  169. package/dist/esm/node-parameters/filter-parameter.js +1 -1
  170. package/dist/esm/node-parameters/filter-parameter.js.map +1 -1
  171. package/dist/esm/node-validation.d.ts +17 -5
  172. package/dist/esm/node-validation.d.ts.map +1 -1
  173. package/dist/esm/node-validation.js +39 -16
  174. package/dist/esm/node-validation.js.map +1 -1
  175. package/dist/esm/run-execution-data/run-execution-data.v1.d.ts +13 -0
  176. package/dist/esm/run-execution-data/run-execution-data.v1.d.ts.map +1 -1
  177. package/dist/esm/run-execution-data/run-execution-data.v1.js.map +1 -1
  178. package/dist/esm/run-execution-data-factory.d.ts +1 -0
  179. package/dist/esm/run-execution-data-factory.d.ts.map +1 -1
  180. package/dist/esm/run-execution-data-factory.js +1 -0
  181. package/dist/esm/run-execution-data-factory.js.map +1 -1
  182. package/dist/esm/sub-workflow-output.d.ts +13 -1
  183. package/dist/esm/sub-workflow-output.d.ts.map +1 -1
  184. package/dist/esm/sub-workflow-output.js +60 -0
  185. package/dist/esm/sub-workflow-output.js.map +1 -1
  186. package/dist/esm/typecheck.tsbuildinfo +1 -1
  187. package/dist/esm/utils.js +1 -1
  188. package/dist/esm/utils.js.map +1 -1
  189. package/dist/esm/webhook-description-fields.d.ts +31 -0
  190. package/dist/esm/webhook-description-fields.d.ts.map +1 -1
  191. package/dist/esm/webhook-description-fields.js +33 -0
  192. package/dist/esm/webhook-description-fields.js.map +1 -1
  193. package/package.json +15 -14
  194. package/dist/cjs/errors/base/base.error.d.ts +0 -26
  195. package/dist/cjs/errors/base/base.error.d.ts.map +0 -1
  196. package/dist/cjs/errors/base/base.error.js +0 -43
  197. package/dist/cjs/errors/base/base.error.js.map +0 -1
  198. package/dist/cjs/errors/base/operational.error.d.ts +0 -16
  199. package/dist/cjs/errors/base/operational.error.d.ts.map +0 -1
  200. package/dist/cjs/errors/base/operational.error.js +0 -19
  201. package/dist/cjs/errors/base/operational.error.js.map +0 -1
  202. package/dist/cjs/errors/base/unexpected.error.d.ts +0 -16
  203. package/dist/cjs/errors/base/unexpected.error.d.ts.map +0 -1
  204. package/dist/cjs/errors/base/unexpected.error.js +0 -19
  205. package/dist/cjs/errors/base/unexpected.error.js.map +0 -1
  206. package/dist/cjs/errors/base/user.error.d.ts +0 -18
  207. package/dist/cjs/errors/base/user.error.d.ts.map +0 -1
  208. package/dist/cjs/errors/base/user.error.js +0 -19
  209. package/dist/cjs/errors/base/user.error.js.map +0 -1
  210. package/dist/esm/errors/base/base.error.d.ts +0 -26
  211. package/dist/esm/errors/base/base.error.d.ts.map +0 -1
  212. package/dist/esm/errors/base/base.error.js +0 -36
  213. package/dist/esm/errors/base/base.error.js.map +0 -1
  214. package/dist/esm/errors/base/operational.error.d.ts +0 -16
  215. package/dist/esm/errors/base/operational.error.d.ts.map +0 -1
  216. package/dist/esm/errors/base/operational.error.js +0 -15
  217. package/dist/esm/errors/base/operational.error.js.map +0 -1
  218. package/dist/esm/errors/base/unexpected.error.d.ts +0 -16
  219. package/dist/esm/errors/base/unexpected.error.d.ts.map +0 -1
  220. package/dist/esm/errors/base/unexpected.error.js +0 -15
  221. package/dist/esm/errors/base/unexpected.error.js.map +0 -1
  222. package/dist/esm/errors/base/user.error.d.ts +0 -18
  223. package/dist/esm/errors/base/user.error.d.ts.map +0 -1
  224. package/dist/esm/errors/base/user.error.js +0 -15
  225. package/dist/esm/errors/base/user.error.js.map +0 -1
@@ -0,0 +1,366 @@
1
+ import { ExpressionExtensionError } from '../../errors/expression-extension.error';
2
+ import { ExpressionError } from '../../errors/expression.error';
3
+ import { ARRAY_METHODS, MAX_DEPTH, MAX_RESULT_LENGTH, NUMBER_METHODS, STRING_METHODS, hasOwn, isArray, isObj, toNum, toStr, } from './grammar';
4
+ // ── Evaluation: total over the grammar. ────────────────────────────────────
5
+ //
6
+ // evalNode reads only fields parseSimple constructed, because those are the
7
+ // only fields that exist. The switch has no default branch: adding a kind to
8
+ // the grammar stops compilation until it is handled here.
9
+ /**
10
+ * Thrown when a runtime value falls outside what parsing proved statically
11
+ * (a whitelisted string method on a non-string receiver, an operator on an
12
+ * object operand, a result above MAX_RESULT_LENGTH). The whole evaluation is
13
+ * abandoned and the caller re-runs the expression through the regular engine
14
+ * pipeline. Anything evaluated before the bail runs again in the engine: a
15
+ * nested `$parameter` expression, or a getter on a data object. Expressions
16
+ * are pure and workflow data is JSON, so the only cost is the repeated work.
17
+ */
18
+ export class EngineFallbackError extends Error {
19
+ }
20
+ /**
21
+ * Thrown by an optional member/call on a nullish receiver and caught by the
22
+ * enclosing chain node, which yields undefined for the whole chain. One
23
+ * shared instance: a missing optional hop is ordinary data, not an error.
24
+ */
25
+ class ChainShortCircuit extends Error {
26
+ }
27
+ const chainShortCircuit = new ChainShortCircuit();
28
+ /**
29
+ * Property lookup on a non-nullish primitive is well-defined and side-effect
30
+ * free, so primitives are indexable here even though the predicate's type
31
+ * only names objects.
32
+ */
33
+ const isIndexable = (value) => value !== null && value !== undefined;
34
+ /**
35
+ * Operators only ever see primitives. An object operand would coerce through
36
+ * its valueOf/toString on the host, where the engine sees a structured-clone
37
+ * copy; a reference comparison would differ from the engine's copy semantics.
38
+ */
39
+ const isPrimitive = (value) => value === null || (typeof value !== 'object' && typeof value !== 'function');
40
+ export function bounded(value) {
41
+ const isSizeable = typeof value === 'string' || isArray(value);
42
+ if (isSizeable && value.length > MAX_RESULT_LENGTH) {
43
+ throw new EngineFallbackError();
44
+ }
45
+ return value;
46
+ }
47
+ // Operand casts are intentional: the interpreter must reproduce JS coercion
48
+ // semantics exactly (parity with the engines), not re-implement them.
49
+ /* eslint-disable @typescript-eslint/no-explicit-any */
50
+ const binaryOps = Object.freeze({
51
+ '===': (l, r) => l === r,
52
+ '!==': (l, r) => l !== r,
53
+ // eslint-disable-next-line eqeqeq
54
+ '==': (l, r) => l == r,
55
+ // eslint-disable-next-line eqeqeq
56
+ '!=': (l, r) => l != r,
57
+ '<': (l, r) => l < r,
58
+ '<=': (l, r) => l <= r,
59
+ '>': (l, r) => l > r,
60
+ '>=': (l, r) => l >= r,
61
+ '+': (l, r) => bounded(l + r),
62
+ '-': (l, r) => l - r,
63
+ '*': (l, r) => l * r,
64
+ '/': (l, r) => l / r,
65
+ '%': (l, r) => l % r,
66
+ });
67
+ /* eslint-enable @typescript-eslint/no-explicit-any */
68
+ function evalMember(node, data) {
69
+ const object = evalNode(node.object, data);
70
+ if (node.optional && (object === null || object === undefined)) {
71
+ throw chainShortCircuit;
72
+ }
73
+ if (!isIndexable(object)) {
74
+ throw new TypeError(`Cannot read properties of ${toStr(object)} (reading '${node.key}')`);
75
+ }
76
+ // Below the roots (get-trap proxies, where Object.hasOwn misreports every
77
+ // key) the data is plain JSON, so an inherited property is a host prototype
78
+ // the isolates never see. The engine decides what it yields.
79
+ const inherited = node.object.kind !== 'root' &&
80
+ typeof object === 'object' &&
81
+ node.key in object &&
82
+ !hasOwn(object, node.key);
83
+ if (inherited) {
84
+ throw new EngineFallbackError();
85
+ }
86
+ const value = object[node.key];
87
+ // Neither crosses an engine boundary the same way twice (the vm bridge
88
+ // drops a nested function but fails on an inherited one; legacy throws),
89
+ // so the configured engine decides rather than this module guessing.
90
+ if (typeof value === 'function' || typeof value === 'symbol') {
91
+ throw new EngineFallbackError();
92
+ }
93
+ return value;
94
+ }
95
+ /**
96
+ * Parsing only proves the method name; the receiver's type is data. A
97
+ * receiver whose type has no allowlist entry for the method could be
98
+ * intercepted by extensions, so it hands the whole expression to the engine.
99
+ */
100
+ function methodFor(receiver, name) {
101
+ let method;
102
+ if (typeof receiver === 'string') {
103
+ method = STRING_METHODS.get(name);
104
+ }
105
+ else if (typeof receiver === 'number') {
106
+ method = NUMBER_METHODS.get(name);
107
+ }
108
+ else if (isArray(receiver)) {
109
+ method = ARRAY_METHODS.get(name);
110
+ }
111
+ if (method === undefined)
112
+ throw new EngineFallbackError();
113
+ return method;
114
+ }
115
+ /**
116
+ * Arguments are primitives, plus arrays for concat. An object argument would
117
+ * compare by live reference where the isolate compares copies (includes/
118
+ * indexOf) or coerce on the host where the isolate sees a copy.
119
+ */
120
+ function isAllowedArgument(method, arg) {
121
+ if (isPrimitive(arg))
122
+ return true;
123
+ return method === 'concat' && isArray(arg);
124
+ }
125
+ /**
126
+ * The engine runs under a timeout; a synchronous native call cannot be
127
+ * interrupted, so the input size is the budget. A receiver above the result
128
+ * cap goes to the engine before any work is done, and the amplifying methods
129
+ * (which can allocate far beyond MAX_RESULT_LENGTH before bounded() sees the
130
+ * result) bail on an upper bound of their output.
131
+ */
132
+ function assertPreflightSize(receiver, method, args) {
133
+ let upperBound = typeof receiver === 'number' ? 0 : receiver.length;
134
+ if (method === 'concat') {
135
+ for (const arg of args) {
136
+ upperBound += isArray(arg) ? arg.length : 1;
137
+ }
138
+ }
139
+ else if (method === 'flat' && isArray(receiver)) {
140
+ const depth = args.length === 0 ? 1 : toNum(args[0]);
141
+ upperBound = flatSize(receiver, depth);
142
+ }
143
+ else if ((method === 'replace' || method === 'replaceAll') && typeof receiver === 'string') {
144
+ // A missing replacement inserts the string "undefined".
145
+ const replacement = args.length < 2 ? 'undefined' : toStr(args[1]);
146
+ // Three replacement tokens expand: `$&`, `$\`` and `$'` insert match
147
+ // context, so the output is not bounded by the replacement's length.
148
+ // `$$` is an escaped literal `$`; strip those pairs first so that `$$&`
149
+ // (a literal "$&") stays native while `$$$&` (a literal "$" then `$&`)
150
+ // bails. With a string pattern every other `$` is literal.
151
+ if (/\$[&`']/.test(replacement.replaceAll('$$', '')))
152
+ throw new EngineFallbackError();
153
+ upperBound =
154
+ method === 'replace'
155
+ ? receiver.length + replacement.length
156
+ : (receiver.length + 1) * (replacement.length + 1);
157
+ }
158
+ else if (method === 'join' && isArray(receiver)) {
159
+ // Only an undefined separator means ","; null joins with "null".
160
+ const separator = args[0] === undefined ? ',' : toStr(args[0]);
161
+ upperBound = separator.length * Math.max(receiver.length - 1, 0);
162
+ for (const element of receiver) {
163
+ upperBound += toStr(element ?? '').length;
164
+ }
165
+ }
166
+ if (upperBound > MAX_RESULT_LENGTH) {
167
+ throw new EngineFallbackError();
168
+ }
169
+ }
170
+ /**
171
+ * Element count of `array.flat(depth)`, stopping early once past the cap
172
+ * (a nested structure can flatten to far more elements than the outer
173
+ * array holds).
174
+ */
175
+ function flatSize(array, depth) {
176
+ let size = 0;
177
+ for (const element of array) {
178
+ size += depth >= 1 && isArray(element) ? flatSize(element, depth - 1) : 1;
179
+ if (size > MAX_RESULT_LENGTH)
180
+ break;
181
+ }
182
+ return size;
183
+ }
184
+ /**
185
+ * Array methods that call toString on their elements: join() on every
186
+ * element, toSorted()'s default comparator on both operands per comparison.
187
+ * On nested arrays that work is proportional to the nested size, which no
188
+ * element count bounds, so these run natively over primitive elements only.
189
+ */
190
+ const STRINGIFIES_ELEMENTS = new Set(['join', 'toSorted']);
191
+ /**
192
+ * Hands off to the engine unless every element is a primitive. O(n) over a
193
+ * receiver the size cap already limits, and runs before anything is
194
+ * stringified.
195
+ */
196
+ function assertPrimitiveElements(receiver) {
197
+ // The receiver cap applies before the scan, so the scan never walks more
198
+ // than the cap either.
199
+ if (receiver.length > MAX_RESULT_LENGTH)
200
+ throw new EngineFallbackError();
201
+ for (const element of receiver) {
202
+ if (!isPrimitive(element))
203
+ throw new EngineFallbackError();
204
+ }
205
+ }
206
+ /**
207
+ * Content size of a JSON value: string lengths plus one per element and
208
+ * key, stopping early past the budget. Deeper than the grammar's own depth
209
+ * cap hands off: the engine owns data that deep.
210
+ */
211
+ function contentWeight(value, budget, depth = 0) {
212
+ if (depth > MAX_DEPTH)
213
+ throw new EngineFallbackError();
214
+ if (typeof value === 'string')
215
+ return value.length;
216
+ if (!isObj(value))
217
+ return 1;
218
+ let weight = 1;
219
+ if (isArray(value)) {
220
+ for (const element of value) {
221
+ weight += contentWeight(element, budget - weight, depth + 1);
222
+ if (weight > budget)
223
+ break;
224
+ }
225
+ return weight;
226
+ }
227
+ // Walk keys without materialising an entries array: an object with many
228
+ // keys would otherwise be copied before the budget is checked.
229
+ for (const key in value) {
230
+ if (!hasOwn(value, key))
231
+ continue;
232
+ weight += key.length + contentWeight(value[key], budget - weight, depth + 1);
233
+ if (weight > budget)
234
+ break;
235
+ }
236
+ return weight;
237
+ }
238
+ /**
239
+ * concat() is the one method that can hold more content than the payload
240
+ * delivered: N arguments that reference one large string become N copies
241
+ * when the result is cloned (copyResult) and N operands for every method
242
+ * downstream (join, toSorted, includes). Element count does not see that,
243
+ * so concat is bounded by the content size of receiver plus arguments.
244
+ */
245
+ function assertConcatWeight(receiver, args) {
246
+ let weight = contentWeight(receiver, MAX_RESULT_LENGTH);
247
+ for (const arg of args) {
248
+ if (weight > MAX_RESULT_LENGTH)
249
+ break;
250
+ weight += contentWeight(arg, MAX_RESULT_LENGTH - weight);
251
+ }
252
+ if (weight > MAX_RESULT_LENGTH)
253
+ throw new EngineFallbackError();
254
+ }
255
+ function evalCall(node, data) {
256
+ const receiver = evalNode(node.receiver, data);
257
+ const receiverMissing = receiver === null || receiver === undefined;
258
+ if (node.optional && receiverMissing) {
259
+ throw chainShortCircuit;
260
+ }
261
+ if (receiverMissing) {
262
+ throw new TypeError(`Cannot read properties of ${toStr(receiver)} (reading '${node.method}')`);
263
+ }
264
+ // An own property shadowing the method (an engine-resolved $parameter value
265
+ // can carry one) would take precedence in the engines.
266
+ if (hasOwn(receiver, node.method)) {
267
+ throw new EngineFallbackError();
268
+ }
269
+ const method = methodFor(receiver, node.method);
270
+ const args = node.args.map((argument) => evalNode(argument, data));
271
+ if (!args.every((arg) => isAllowedArgument(node.method, arg))) {
272
+ throw new EngineFallbackError();
273
+ }
274
+ if (isArray(receiver)) {
275
+ if (STRINGIFIES_ELEMENTS.has(node.method))
276
+ assertPrimitiveElements(receiver);
277
+ if (node.method === 'concat')
278
+ assertConcatWeight(receiver, args);
279
+ }
280
+ assertPreflightSize(receiver, node.method, args);
281
+ return bounded(method.apply(receiver, args));
282
+ }
283
+ function evalChain(node, data) {
284
+ try {
285
+ return evalNode(node.expression, data);
286
+ }
287
+ catch (error) {
288
+ if (error === chainShortCircuit)
289
+ return undefined;
290
+ throw error;
291
+ }
292
+ }
293
+ function evalUnary(node, data) {
294
+ const argument = evalNode(node.argument, data);
295
+ if (node.op === '!') {
296
+ return !argument;
297
+ }
298
+ if (!isPrimitive(argument)) {
299
+ throw new EngineFallbackError();
300
+ }
301
+ return node.op === '-' ? -toNum(argument) : toNum(argument);
302
+ }
303
+ function evalBinary(node, data) {
304
+ const left = evalNode(node.left, data);
305
+ const right = evalNode(node.right, data);
306
+ if (!isPrimitive(left) || !isPrimitive(right)) {
307
+ throw new EngineFallbackError();
308
+ }
309
+ return binaryOps[node.op](left, right);
310
+ }
311
+ function evalLogical(node, data) {
312
+ const left = evalNode(node.left, data);
313
+ switch (node.op) {
314
+ case '&&':
315
+ return left ? evalNode(node.right, data) : left;
316
+ case '||':
317
+ return left ? left : evalNode(node.right, data);
318
+ case '??':
319
+ return left ?? evalNode(node.right, data);
320
+ }
321
+ }
322
+ function evalNode(node, data) {
323
+ switch (node.kind) {
324
+ case 'literal':
325
+ return node.value;
326
+ case 'root':
327
+ return node.name === '$json' ? data.$json : data.$parameter;
328
+ case 'undefined':
329
+ return undefined;
330
+ case 'member':
331
+ return evalMember(node, data);
332
+ case 'chain':
333
+ return evalChain(node, data);
334
+ case 'unary':
335
+ return evalUnary(node, data);
336
+ case 'binary':
337
+ return evalBinary(node, data);
338
+ case 'logical':
339
+ return evalLogical(node, data);
340
+ case 'conditional':
341
+ return evalNode(node.test, data)
342
+ ? evalNode(node.consequent, data)
343
+ : evalNode(node.alternate, data);
344
+ case 'call':
345
+ return evalCall(node, data);
346
+ }
347
+ }
348
+ /**
349
+ * Tournament wraps each code chunk in try/catch and routes errors to the E()
350
+ * handler, which rethrows ExpressionErrors and swallows everything else (the
351
+ * chunk then yields undefined). Mirror that exactly.
352
+ */
353
+ export function evalChunk(node, data) {
354
+ try {
355
+ return evalNode(node, data);
356
+ }
357
+ catch (error) {
358
+ const rethrow = error instanceof EngineFallbackError ||
359
+ error instanceof ExpressionError ||
360
+ error instanceof ExpressionExtensionError;
361
+ if (rethrow)
362
+ throw error;
363
+ return undefined;
364
+ }
365
+ }
366
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../src/expressions/native-evaluation/evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { namedTypes } from 'ast-types';
2
+ export declare const BINARY_OPS: readonly ['===', '!==', '==', '!=', '<', '<=', '>', '>=', '+', '-', '*', '/', '%'];
3
+ export declare const UNARY_OPS: readonly ['!', '-', '+'];
4
+ export type BinaryOp = (typeof BINARY_OPS)[number];
5
+ export type LogicalOp = namedTypes.LogicalExpression['operator'];
6
+ export type UnaryOp = (typeof UNARY_OPS)[number];
7
+ export type SimpleNode = {
8
+ kind: 'literal';
9
+ value: string | number | boolean | null;
10
+ } | {
11
+ kind: 'root';
12
+ name: '$json' | '$parameter';
13
+ } | {
14
+ kind: 'undefined';
15
+ } | {
16
+ kind: 'member';
17
+ object: SimpleNode;
18
+ key: string | number;
19
+ optional: boolean;
20
+ } | {
21
+ kind: 'chain';
22
+ expression: SimpleNode;
23
+ } | {
24
+ kind: 'unary';
25
+ op: UnaryOp;
26
+ argument: SimpleNode;
27
+ } | {
28
+ kind: 'binary';
29
+ op: BinaryOp;
30
+ left: SimpleNode;
31
+ right: SimpleNode;
32
+ } | {
33
+ kind: 'logical';
34
+ op: LogicalOp;
35
+ left: SimpleNode;
36
+ right: SimpleNode;
37
+ } | {
38
+ kind: 'conditional';
39
+ test: SimpleNode;
40
+ consequent: SimpleNode;
41
+ alternate: SimpleNode;
42
+ } | {
43
+ kind: 'call';
44
+ receiver: SimpleNode;
45
+ method: string;
46
+ args: SimpleNode[];
47
+ optional: boolean;
48
+ };
49
+ export declare const isArray: (arg: any) => arg is any[];
50
+ export declare const hasOwn: (o: object, v: PropertyKey) => boolean;
51
+ export declare const toStr: StringConstructor;
52
+ export declare const toNum: NumberConstructor;
53
+ export declare const clone: typeof structuredClone;
54
+ export type NativeMethod = (this: unknown, ...args: unknown[]) => unknown;
55
+ export declare const STRING_METHODS: ReadonlyMap<string, NativeMethod>;
56
+ export declare const NUMBER_METHODS: ReadonlyMap<string, NativeMethod>;
57
+ export declare const ARRAY_METHODS: ReadonlyMap<string, NativeMethod>;
58
+ export declare const CALLABLE_METHODS: Set<string>;
59
+ export declare const MAX_RESULT_LENGTH = 1000000;
60
+ export declare const MAX_DEPTH = 64;
61
+ export declare const isObj: (value: unknown) => value is Record<string, unknown>;
62
+ export declare const isOneOf: <T extends string>(ops: readonly T[], op: unknown) => op is T;
63
+ //# sourceMappingURL=grammar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.d.ts","sourceRoot":"","sources":["../../../../src/expressions/native-evaluation/grammar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ // The closed subset grammar, its operator and method allowlists, and the
2
+ // limits the parser and the evaluator share. See index.ts for the overview.
3
+ export const BINARY_OPS = [
4
+ '===',
5
+ '!==',
6
+ '==',
7
+ '!=',
8
+ '<',
9
+ '<=',
10
+ '>',
11
+ '>=',
12
+ '+',
13
+ '-',
14
+ '*',
15
+ '/',
16
+ '%',
17
+ ];
18
+ export const UNARY_OPS = ['!', '-', '+'];
19
+ // Roots are `$json` and `$parameter` only (the literal comparisons in
20
+ // parseIdentifier). More roots are CAT-4697. `$now`/`$today` are excluded on
21
+ // purpose: they are Luxon DateTimes whose methods would make every useful
22
+ // expression on them a CallExpression anyway.
23
+ //
24
+ // Note on $parameter: the proxy resolves nested `=` parameter values by
25
+ // re-entering resolveSimpleParameterValue - a nested non-simple value simply
26
+ // takes the engine path there (under lazy acquisition, creating the bridge on
27
+ // demand).
28
+ // Intrinsics are captured at import so a later patch to a prototype or a
29
+ // global (a polyfill, a community package) does not change what the native
30
+ // path runs; the isolates never see such a patch either.
31
+ export const { isArray } = Array;
32
+ export const { hasOwn } = Object;
33
+ export const toStr = String;
34
+ export const toNum = Number;
35
+ export const clone = structuredClone;
36
+ const captureMethods = (proto, names) => {
37
+ const methods = new Map();
38
+ for (const name of names) {
39
+ const method = Reflect.get(proto, name);
40
+ if (typeof method === 'function')
41
+ methods.set(name, method);
42
+ }
43
+ return methods;
44
+ };
45
+ // Native prototype methods callable on a receiver of the matching type.
46
+ // Every name here must stay disjoint from the expression-extension method
47
+ // names (extendSyntax rewrites extension calls into `extend()` dispatch;
48
+ // natives pass through untouched) - pinned by a test in the parity corpus.
49
+ // The receiver's type is only known at runtime: a receiver whose type has no
50
+ // allowlist entry for the method makes the evaluation bail to the engine
51
+ // (EngineFallbackError below). Callback-taking forms (regex/function args,
52
+ // array callbacks) are unrepresentable: those argument nodes decline parsing.
53
+ // Accepting callbacks is CAT-4698.
54
+ export const STRING_METHODS = captureMethods(String.prototype, [
55
+ 'toUpperCase',
56
+ 'toLowerCase',
57
+ 'trim',
58
+ 'trimStart',
59
+ 'trimEnd',
60
+ 'includes',
61
+ 'startsWith',
62
+ 'endsWith',
63
+ 'slice',
64
+ 'indexOf',
65
+ 'charAt',
66
+ 'replace',
67
+ 'replaceAll',
68
+ ]);
69
+ export const NUMBER_METHODS = captureMethods(Number.prototype, [
70
+ 'toFixed',
71
+ 'toPrecision',
72
+ 'toString',
73
+ ]);
74
+ // Non-mutating methods only: the receiver is the live workflow data (the vm
75
+ // engine evaluates a copy inside the isolate), so an in-place mutator like
76
+ // sort()/reverse()/fill() would corrupt execution data as a side effect. Use
77
+ // the toSorted()/toReversed() immutable variants instead. Iterator-returning
78
+ // methods (entries/values/keys) are also excluded: a live iterator has no
79
+ // equivalent representation across the engine boundary.
80
+ export const ARRAY_METHODS = captureMethods(Array.prototype, [
81
+ 'includes',
82
+ 'indexOf',
83
+ 'lastIndexOf',
84
+ 'join',
85
+ 'slice',
86
+ 'at',
87
+ 'concat',
88
+ 'flat',
89
+ 'toSorted',
90
+ 'toReversed',
91
+ ]);
92
+ export const CALLABLE_METHODS = new Set([
93
+ ...STRING_METHODS.keys(),
94
+ ...NUMBER_METHODS.keys(),
95
+ ...ARRAY_METHODS.keys(),
96
+ ]);
97
+ // The engine evaluates under a timeout and a memory limit; this interpreter
98
+ // has neither. A string or array result above this length is handed to the
99
+ // engine so those limits apply (nested replaceAll('', ...) or concat chains
100
+ // can otherwise expand without bound on the main thread).
101
+ export const MAX_RESULT_LENGTH = 1_000_000;
102
+ // Nesting depth of the subset grammar. Parsing and evaluation both recurse
103
+ // once per level, so this keeps a pathological expression off the host stack;
104
+ // real expressions are a handful of levels deep.
105
+ export const MAX_DEPTH = 64;
106
+ export const isObj = (value) => typeof value === 'object' && value !== null;
107
+ export const isOneOf = (ops, op) => typeof op === 'string' && ops.includes(op);
108
+ //# sourceMappingURL=grammar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.js","sourceRoot":"","sources":["../../../../src/expressions/native-evaluation/grammar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { IWorkflowDataProxyData } from '../../interfaces';
2
+ export { CALLABLE_METHODS, MAX_RESULT_LENGTH } from './grammar';
3
+ /** Does the expression (leading `=` stripped) fit the native subset? */
4
+ export declare function isNativelyEvaluable(expression: string): boolean;
5
+ /**
6
+ * Evaluate an expression (with the leading `=` already stripped) in-process.
7
+ * Returns `{ handled: false }` when the expression is outside the subset or a
8
+ * runtime value fell outside what parsing proved; the caller must then run
9
+ * the regular pipeline.
10
+ */
11
+ export declare function evaluateNatively(expression: string, data: IWorkflowDataProxyData): {
12
+ handled: true;
13
+ value: unknown;
14
+ } | {
15
+ handled: false;
16
+ };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/expressions/native-evaluation/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAyGhE,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,sBAAsB,GAC1B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,CAYxD"}