n8n-workflow 2.31.2 → 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.
- package/dist/cjs/augment-object.js +136 -146
- package/dist/cjs/augment-object.js.map +1 -1
- package/dist/cjs/build.tsbuildinfo +1 -1
- package/dist/cjs/common/find-ai-root-node-names.js +36 -46
- package/dist/cjs/common/find-ai-root-node-names.js.map +1 -1
- package/dist/cjs/common/get-child-nodes.js +8 -18
- package/dist/cjs/common/get-child-nodes.js.map +1 -1
- package/dist/cjs/common/get-connected-nodes.js +84 -94
- package/dist/cjs/common/get-connected-nodes.js.map +1 -1
- package/dist/cjs/common/get-node-by-name.js +16 -26
- package/dist/cjs/common/get-node-by-name.js.map +1 -1
- package/dist/cjs/common/get-parent-nodes.js +14 -24
- package/dist/cjs/common/get-parent-nodes.js.map +1 -1
- package/dist/cjs/common/index.js +9 -19
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/common/map-connections-by-destination.js +31 -41
- package/dist/cjs/common/map-connections-by-destination.js.map +1 -1
- package/dist/cjs/common/resolve-variables.d.ts +8 -0
- package/dist/cjs/common/resolve-variables.d.ts.map +1 -1
- package/dist/cjs/common/resolve-variables.js +46 -33
- package/dist/cjs/common/resolve-variables.js.map +1 -1
- package/dist/cjs/connections-diff.js +58 -68
- package/dist/cjs/connections-diff.js.map +1 -1
- package/dist/cjs/constants.d.ts +3 -3
- package/dist/cjs/constants.d.ts.map +1 -1
- package/dist/cjs/constants.js +157 -166
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/credential-domain-restrictions.js +153 -163
- package/dist/cjs/credential-domain-restrictions.js.map +1 -1
- package/dist/cjs/cron.d.ts.map +1 -1
- package/dist/cjs/cron.js +25 -35
- package/dist/cjs/cron.js.map +1 -1
- package/dist/cjs/data-table.types.js +10 -20
- package/dist/cjs/data-table.types.js.map +1 -1
- package/dist/cjs/dynamic-credentials-helpers.js +93 -103
- package/dist/cjs/dynamic-credentials-helpers.js.map +1 -1
- package/dist/cjs/errors/abstract/execution-base.error.d.ts.map +1 -1
- package/dist/cjs/errors/abstract/execution-base.error.js +41 -51
- package/dist/cjs/errors/abstract/execution-base.error.js.map +1 -1
- package/dist/cjs/errors/abstract/node.error.d.ts.map +1 -1
- package/dist/cjs/errors/abstract/node.error.js +142 -152
- package/dist/cjs/errors/abstract/node.error.js.map +1 -1
- package/dist/cjs/errors/base/base.error.d.ts.map +1 -1
- package/dist/cjs/errors/base/base.error.js +35 -45
- package/dist/cjs/errors/base/base.error.js.map +1 -1
- package/dist/cjs/errors/base/operational.error.d.ts.map +1 -1
- package/dist/cjs/errors/base/operational.error.js +17 -27
- package/dist/cjs/errors/base/operational.error.js.map +1 -1
- package/dist/cjs/errors/base/unexpected.error.d.ts.map +1 -1
- package/dist/cjs/errors/base/unexpected.error.js +17 -27
- package/dist/cjs/errors/base/unexpected.error.js.map +1 -1
- package/dist/cjs/errors/base/user.error.d.ts.map +1 -1
- package/dist/cjs/errors/base/user.error.js +17 -27
- package/dist/cjs/errors/base/user.error.js.map +1 -1
- package/dist/cjs/errors/cli-subworkflow-operation.error.js +7 -17
- package/dist/cjs/errors/cli-subworkflow-operation.error.js.map +1 -1
- package/dist/cjs/errors/db-connection-timeout-error.d.ts.map +1 -1
- package/dist/cjs/errors/db-connection-timeout-error.js +11 -21
- package/dist/cjs/errors/db-connection-timeout-error.js.map +1 -1
- package/dist/cjs/errors/execution-cancelled.error.d.ts.map +1 -1
- package/dist/cjs/errors/execution-cancelled.error.js +33 -43
- package/dist/cjs/errors/execution-cancelled.error.js.map +1 -1
- package/dist/cjs/errors/expression-class-extension.error.d.ts.map +1 -1
- package/dist/cjs/errors/expression-class-extension.error.js +9 -19
- package/dist/cjs/errors/expression-class-extension.error.js.map +1 -1
- package/dist/cjs/errors/expression-computed-destructuring.error.d.ts.map +1 -1
- package/dist/cjs/errors/expression-computed-destructuring.error.js +9 -19
- package/dist/cjs/errors/expression-computed-destructuring.error.js.map +1 -1
- package/dist/cjs/errors/expression-destructuring.error.d.ts.map +1 -1
- package/dist/cjs/errors/expression-destructuring.error.js +9 -19
- package/dist/cjs/errors/expression-destructuring.error.js.map +1 -1
- package/dist/cjs/errors/expression-extension.error.js +7 -17
- package/dist/cjs/errors/expression-extension.error.js.map +1 -1
- package/dist/cjs/errors/expression-reserved-variable.error.d.ts.map +1 -1
- package/dist/cjs/errors/expression-reserved-variable.error.js +9 -19
- package/dist/cjs/errors/expression-reserved-variable.error.js.map +1 -1
- package/dist/cjs/errors/expression-with-statement.error.d.ts.map +1 -1
- package/dist/cjs/errors/expression-with-statement.error.js +9 -19
- package/dist/cjs/errors/expression-with-statement.error.js.map +1 -1
- package/dist/cjs/errors/expression.error.d.ts.map +1 -1
- package/dist/cjs/errors/expression.error.js +33 -43
- package/dist/cjs/errors/expression.error.js.map +1 -1
- package/dist/cjs/errors/index.js +62 -72
- package/dist/cjs/errors/index.js.map +1 -1
- package/dist/cjs/errors/node-api.error.d.ts.map +1 -1
- package/dist/cjs/errors/node-api.error.js +227 -237
- package/dist/cjs/errors/node-api.error.js.map +1 -1
- package/dist/cjs/errors/node-operation.error.d.ts.map +1 -1
- package/dist/cjs/errors/node-operation.error.js +43 -53
- package/dist/cjs/errors/node-operation.error.js.map +1 -1
- package/dist/cjs/errors/node-ssl.error.d.ts.map +1 -1
- package/dist/cjs/errors/node-ssl.error.js +9 -19
- package/dist/cjs/errors/node-ssl.error.js.map +1 -1
- package/dist/cjs/errors/subworkflow-operation.error.d.ts.map +1 -1
- package/dist/cjs/errors/subworkflow-operation.error.js +18 -28
- package/dist/cjs/errors/subworkflow-operation.error.js.map +1 -1
- package/dist/cjs/errors/trigger-close.error.d.ts.map +1 -1
- package/dist/cjs/errors/trigger-close.error.js +11 -21
- package/dist/cjs/errors/trigger-close.error.js.map +1 -1
- package/dist/cjs/errors/webhook-taken.error.d.ts.map +1 -1
- package/dist/cjs/errors/webhook-taken.error.js +9 -19
- package/dist/cjs/errors/webhook-taken.error.js.map +1 -1
- package/dist/cjs/errors/workflow-activation.error.d.ts.map +1 -1
- package/dist/cjs/errors/workflow-activation.error.js +54 -64
- package/dist/cjs/errors/workflow-activation.error.js.map +1 -1
- package/dist/cjs/errors/workflow-configuration.error.js +10 -20
- package/dist/cjs/errors/workflow-configuration.error.js.map +1 -1
- package/dist/cjs/errors/workflow-deactivation.error.js +7 -17
- package/dist/cjs/errors/workflow-deactivation.error.js.map +1 -1
- package/dist/cjs/errors/workflow-operation.error.d.ts.map +1 -1
- package/dist/cjs/errors/workflow-operation.error.js +20 -30
- package/dist/cjs/errors/workflow-operation.error.js.map +1 -1
- package/dist/cjs/evaluation-helpers.js +16 -26
- package/dist/cjs/evaluation-helpers.js.map +1 -1
- package/dist/cjs/execution-context-establishment-hooks.d.ts.map +1 -1
- package/dist/cjs/execution-context-establishment-hooks.js +43 -53
- package/dist/cjs/execution-context-establishment-hooks.js.map +1 -1
- package/dist/cjs/execution-context.d.ts +14 -14
- package/dist/cjs/execution-context.d.ts.map +1 -1
- package/dist/cjs/execution-context.js +203 -213
- package/dist/cjs/execution-context.js.map +1 -1
- package/dist/cjs/execution-status.d.ts +2 -2
- package/dist/cjs/execution-status.d.ts.map +1 -1
- package/dist/cjs/execution-status.js +27 -37
- package/dist/cjs/execution-status.js.map +1 -1
- package/dist/cjs/expression-evaluator-proxy.d.ts.map +1 -1
- package/dist/cjs/expression-evaluator-proxy.js +18 -28
- package/dist/cjs/expression-evaluator-proxy.js.map +1 -1
- package/dist/cjs/expression-sandboxing.d.ts.map +1 -1
- package/dist/cjs/expression-sandboxing.js +447 -457
- package/dist/cjs/expression-sandboxing.js.map +1 -1
- package/dist/cjs/expression.d.ts.map +1 -1
- package/dist/cjs/expression.js +535 -546
- package/dist/cjs/expression.js.map +1 -1
- package/dist/cjs/expressions/expression-helpers.d.ts.map +1 -1
- package/dist/cjs/expressions/expression-helpers.js +13 -23
- package/dist/cjs/expressions/expression-helpers.js.map +1 -1
- package/dist/cjs/extensions/array-extensions.js +591 -601
- package/dist/cjs/extensions/array-extensions.js.map +1 -1
- package/dist/cjs/extensions/boolean-extensions.d.ts +1 -1
- package/dist/cjs/extensions/boolean-extensions.js +38 -48
- package/dist/cjs/extensions/boolean-extensions.js.map +1 -1
- package/dist/cjs/extensions/date-extensions.js +507 -517
- package/dist/cjs/extensions/date-extensions.js.map +1 -1
- package/dist/cjs/extensions/expression-extension.d.ts.map +1 -1
- package/dist/cjs/extensions/expression-extension.js +455 -465
- package/dist/cjs/extensions/expression-extension.js.map +1 -1
- package/dist/cjs/extensions/expression-parser.d.ts.map +1 -1
- package/dist/cjs/extensions/expression-parser.js +82 -92
- package/dist/cjs/extensions/expression-parser.js.map +1 -1
- package/dist/cjs/extensions/extended-functions.d.ts +10 -18
- package/dist/cjs/extensions/extended-functions.d.ts.map +1 -1
- package/dist/cjs/extensions/extended-functions.js +80 -90
- package/dist/cjs/extensions/extended-functions.js.map +1 -1
- package/dist/cjs/extensions/extensions.js +2 -12
- package/dist/cjs/extensions/index.js +10 -20
- package/dist/cjs/extensions/index.js.map +1 -1
- package/dist/cjs/extensions/number-extensions.js +226 -236
- package/dist/cjs/extensions/number-extensions.js.map +1 -1
- package/dist/cjs/extensions/object-extensions.js +274 -284
- package/dist/cjs/extensions/object-extensions.js.map +1 -1
- package/dist/cjs/extensions/string-extensions.d.ts +1 -1
- package/dist/cjs/extensions/string-extensions.d.ts.map +1 -1
- package/dist/cjs/extensions/string-extensions.js +769 -779
- package/dist/cjs/extensions/string-extensions.js.map +1 -1
- package/dist/cjs/extensions/utils.d.ts.map +1 -1
- package/dist/cjs/extensions/utils.js +35 -45
- package/dist/cjs/extensions/utils.js.map +1 -1
- package/dist/cjs/from-ai-parse-utils.js +393 -403
- package/dist/cjs/from-ai-parse-utils.js.map +1 -1
- package/dist/cjs/global-state.js +12 -22
- package/dist/cjs/global-state.js.map +1 -1
- package/dist/cjs/graph/graph-utils.js +166 -176
- package/dist/cjs/graph/graph-utils.js.map +1 -1
- package/dist/cjs/highlighted-data.js +13 -23
- package/dist/cjs/highlighted-data.js.map +1 -1
- package/dist/cjs/index.js +105 -115
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interfaces.d.ts +112 -22
- package/dist/cjs/interfaces.d.ts.map +1 -1
- package/dist/cjs/interfaces.js +62 -72
- package/dist/cjs/interfaces.js.map +1 -1
- package/dist/cjs/jmespath-query.js +26 -36
- package/dist/cjs/jmespath-query.js.map +1 -1
- package/dist/cjs/logger-proxy.d.ts.map +1 -1
- package/dist/cjs/logger-proxy.js +15 -25
- package/dist/cjs/logger-proxy.js.map +1 -1
- package/dist/cjs/mcp-helpers.js +10 -20
- package/dist/cjs/mcp-helpers.js.map +1 -1
- package/dist/cjs/message-event-bus.d.ts +184 -165
- package/dist/cjs/message-event-bus.d.ts.map +1 -1
- package/dist/cjs/message-event-bus.js +207 -217
- package/dist/cjs/message-event-bus.js.map +1 -1
- package/dist/cjs/metadata-utils.js +35 -45
- package/dist/cjs/metadata-utils.js.map +1 -1
- package/dist/cjs/native-methods/array.methods.js +527 -537
- package/dist/cjs/native-methods/array.methods.js.map +1 -1
- package/dist/cjs/native-methods/boolean.methods.js +18 -28
- package/dist/cjs/native-methods/boolean.methods.js.map +1 -1
- package/dist/cjs/native-methods/index.js +16 -26
- package/dist/cjs/native-methods/index.js.map +1 -1
- package/dist/cjs/native-methods/number.methods.js +79 -89
- package/dist/cjs/native-methods/number.methods.js.map +1 -1
- package/dist/cjs/native-methods/object.methods.js +7 -17
- package/dist/cjs/native-methods/object.methods.js.map +1 -1
- package/dist/cjs/native-methods/string.methods.js +474 -484
- package/dist/cjs/native-methods/string.methods.js.map +1 -1
- package/dist/cjs/node-grouping-validation.d.ts +6 -0
- package/dist/cjs/node-grouping-validation.d.ts.map +1 -1
- package/dist/cjs/node-grouping-validation.js +165 -144
- package/dist/cjs/node-grouping-validation.js.map +1 -1
- package/dist/cjs/node-helpers.d.ts.map +1 -1
- package/dist/cjs/node-helpers.js +1486 -1493
- package/dist/cjs/node-helpers.js.map +1 -1
- package/dist/cjs/node-parameters/filter-parameter.d.ts.map +1 -1
- package/dist/cjs/node-parameters/filter-parameter.js +315 -325
- package/dist/cjs/node-parameters/filter-parameter.js.map +1 -1
- package/dist/cjs/node-parameters/node-parameter-value-type-guard.js +105 -115
- package/dist/cjs/node-parameters/node-parameter-value-type-guard.js.map +1 -1
- package/dist/cjs/node-parameters/parameter-type-validation.js +120 -130
- package/dist/cjs/node-parameters/parameter-type-validation.js.map +1 -1
- package/dist/cjs/node-parameters/path-utils.js +21 -31
- package/dist/cjs/node-parameters/path-utils.js.map +1 -1
- package/dist/cjs/node-parameters/rename-node-utils.js +22 -32
- package/dist/cjs/node-parameters/rename-node-utils.js.map +1 -1
- package/dist/cjs/node-reference-parser-utils.js +472 -482
- package/dist/cjs/node-reference-parser-utils.js.map +1 -1
- package/dist/cjs/node-validation.js +59 -69
- package/dist/cjs/node-validation.js.map +1 -1
- package/dist/cjs/observable-object.js +56 -66
- package/dist/cjs/observable-object.js.map +1 -1
- package/dist/cjs/redaction-channels.js +36 -46
- package/dist/cjs/redaction-channels.js.map +1 -1
- package/dist/cjs/run-execution-data/run-execution-data.js +15 -25
- package/dist/cjs/run-execution-data/run-execution-data.js.map +1 -1
- package/dist/cjs/run-execution-data/run-execution-data.v0.js +2 -12
- package/dist/cjs/run-execution-data/run-execution-data.v1.js +26 -36
- package/dist/cjs/run-execution-data/run-execution-data.v1.js.map +1 -1
- package/dist/cjs/run-execution-data-factory.js +113 -123
- package/dist/cjs/run-execution-data-factory.js.map +1 -1
- package/dist/cjs/schemas.d.ts +13 -13
- package/dist/cjs/schemas.d.ts.map +1 -1
- package/dist/cjs/schemas.js +351 -360
- package/dist/cjs/schemas.js.map +1 -1
- package/dist/cjs/sub-workflow-output.js +10 -20
- package/dist/cjs/sub-workflow-output.js.map +1 -1
- package/dist/cjs/telemetry-helpers.d.ts.map +1 -1
- package/dist/cjs/telemetry-helpers.js +716 -726
- package/dist/cjs/telemetry-helpers.js.map +1 -1
- package/dist/cjs/tool-helpers.js +18 -28
- package/dist/cjs/tool-helpers.js.map +1 -1
- package/dist/cjs/trigger-identity.js +41 -51
- package/dist/cjs/trigger-identity.js.map +1 -1
- package/dist/cjs/trimmed-task-data.js +21 -31
- package/dist/cjs/trimmed-task-data.js.map +1 -1
- package/dist/cjs/type-guards.d.ts +3 -3
- package/dist/cjs/type-guards.d.ts.map +1 -1
- package/dist/cjs/type-guards.js +74 -84
- package/dist/cjs/type-guards.js.map +1 -1
- package/dist/cjs/type-validation.d.ts.map +1 -1
- package/dist/cjs/type-validation.js +383 -393
- package/dist/cjs/type-validation.js.map +1 -1
- package/dist/cjs/utils.d.ts +2 -2
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +430 -440
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/versioned-node-type.d.ts.map +1 -1
- package/dist/cjs/versioned-node-type.js +20 -30
- package/dist/cjs/versioned-node-type.js.map +1 -1
- package/dist/cjs/workflow-checksum.js +67 -77
- package/dist/cjs/workflow-checksum.js.map +1 -1
- package/dist/cjs/workflow-data-proxy-env-provider.js +58 -68
- package/dist/cjs/workflow-data-proxy-env-provider.js.map +1 -1
- package/dist/cjs/workflow-data-proxy-helpers.js +8 -18
- package/dist/cjs/workflow-data-proxy-helpers.js.map +1 -1
- package/dist/cjs/workflow-data-proxy.d.ts.map +1 -1
- package/dist/cjs/workflow-data-proxy.js +1162 -1172
- package/dist/cjs/workflow-data-proxy.js.map +1 -1
- package/dist/cjs/workflow-diff.d.ts +2 -1
- package/dist/cjs/workflow-diff.d.ts.map +1 -1
- package/dist/cjs/workflow-diff.js +292 -300
- package/dist/cjs/workflow-diff.js.map +1 -1
- package/dist/cjs/workflow-environments-helper.js +23 -33
- package/dist/cjs/workflow-environments-helper.js.map +1 -1
- package/dist/cjs/workflow-expression.d.ts.map +1 -1
- package/dist/cjs/workflow-expression.js +97 -107
- package/dist/cjs/workflow-expression.js.map +1 -1
- package/dist/cjs/workflow-structure-validation.d.ts.map +1 -1
- package/dist/cjs/workflow-structure-validation.js +140 -150
- package/dist/cjs/workflow-structure-validation.js.map +1 -1
- package/dist/cjs/workflow-validation.js +40 -50
- package/dist/cjs/workflow-validation.js.map +1 -1
- package/dist/cjs/workflow.d.ts.map +1 -1
- package/dist/cjs/workflow.js +612 -622
- package/dist/cjs/workflow.js.map +1 -1
- package/dist/esm/common/get-child-nodes.js.map +1 -1
- package/dist/esm/common/get-connected-nodes.js.map +1 -1
- package/dist/esm/common/get-parent-nodes.js.map +1 -1
- package/dist/esm/common/resolve-variables.d.ts +8 -0
- package/dist/esm/common/resolve-variables.d.ts.map +1 -1
- package/dist/esm/common/resolve-variables.js +22 -0
- package/dist/esm/common/resolve-variables.js.map +1 -1
- package/dist/esm/constants.d.ts +3 -3
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/cron.d.ts.map +1 -1
- package/dist/esm/errors/abstract/execution-base.error.d.ts.map +1 -1
- package/dist/esm/errors/abstract/execution-base.error.js.map +1 -1
- package/dist/esm/errors/abstract/node.error.d.ts.map +1 -1
- package/dist/esm/errors/abstract/node.error.js.map +1 -1
- package/dist/esm/errors/base/base.error.d.ts.map +1 -1
- package/dist/esm/errors/base/base.error.js.map +1 -1
- package/dist/esm/errors/base/operational.error.d.ts.map +1 -1
- package/dist/esm/errors/base/operational.error.js.map +1 -1
- package/dist/esm/errors/base/unexpected.error.d.ts.map +1 -1
- package/dist/esm/errors/base/unexpected.error.js.map +1 -1
- package/dist/esm/errors/base/user.error.d.ts.map +1 -1
- package/dist/esm/errors/base/user.error.js.map +1 -1
- package/dist/esm/errors/db-connection-timeout-error.d.ts.map +1 -1
- package/dist/esm/errors/execution-cancelled.error.d.ts.map +1 -1
- package/dist/esm/errors/expression-class-extension.error.d.ts.map +1 -1
- package/dist/esm/errors/expression-computed-destructuring.error.d.ts.map +1 -1
- package/dist/esm/errors/expression-destructuring.error.d.ts.map +1 -1
- package/dist/esm/errors/expression-reserved-variable.error.d.ts.map +1 -1
- package/dist/esm/errors/expression-with-statement.error.d.ts.map +1 -1
- package/dist/esm/errors/expression.error.d.ts.map +1 -1
- package/dist/esm/errors/node-api.error.d.ts.map +1 -1
- package/dist/esm/errors/node-api.error.js.map +1 -1
- package/dist/esm/errors/node-operation.error.d.ts.map +1 -1
- package/dist/esm/errors/node-operation.error.js.map +1 -1
- package/dist/esm/errors/node-ssl.error.d.ts.map +1 -1
- package/dist/esm/errors/subworkflow-operation.error.d.ts.map +1 -1
- package/dist/esm/errors/trigger-close.error.d.ts.map +1 -1
- package/dist/esm/errors/trigger-close.error.js.map +1 -1
- package/dist/esm/errors/webhook-taken.error.d.ts.map +1 -1
- package/dist/esm/errors/workflow-activation.error.d.ts.map +1 -1
- package/dist/esm/errors/workflow-activation.error.js.map +1 -1
- package/dist/esm/errors/workflow-operation.error.d.ts.map +1 -1
- package/dist/esm/execution-context-establishment-hooks.d.ts.map +1 -1
- package/dist/esm/execution-context.d.ts +14 -14
- package/dist/esm/execution-context.d.ts.map +1 -1
- package/dist/esm/execution-status.d.ts +2 -2
- package/dist/esm/execution-status.d.ts.map +1 -1
- package/dist/esm/expression-evaluator-proxy.d.ts.map +1 -1
- package/dist/esm/expression-sandboxing.d.ts.map +1 -1
- package/dist/esm/expression-sandboxing.js.map +1 -1
- package/dist/esm/expression.d.ts.map +1 -1
- package/dist/esm/expression.js.map +1 -1
- package/dist/esm/expressions/expression-helpers.d.ts.map +1 -1
- package/dist/esm/extensions/boolean-extensions.d.ts +1 -1
- package/dist/esm/extensions/expression-extension.d.ts.map +1 -1
- package/dist/esm/extensions/expression-parser.d.ts.map +1 -1
- package/dist/esm/extensions/extended-functions.d.ts +10 -18
- package/dist/esm/extensions/extended-functions.d.ts.map +1 -1
- package/dist/esm/extensions/number-extensions.js.map +1 -1
- package/dist/esm/extensions/string-extensions.d.ts +1 -1
- package/dist/esm/extensions/string-extensions.d.ts.map +1 -1
- package/dist/esm/extensions/string-extensions.js.map +1 -1
- package/dist/esm/extensions/utils.d.ts.map +1 -1
- package/dist/esm/from-ai-parse-utils.js.map +1 -1
- package/dist/esm/interfaces.d.ts +112 -22
- package/dist/esm/interfaces.d.ts.map +1 -1
- package/dist/esm/interfaces.js.map +1 -1
- package/dist/esm/logger-proxy.d.ts.map +1 -1
- package/dist/esm/message-event-bus.d.ts +184 -165
- package/dist/esm/message-event-bus.d.ts.map +1 -1
- package/dist/esm/message-event-bus.js +2 -2
- package/dist/esm/message-event-bus.js.map +1 -1
- package/dist/esm/node-grouping-validation.d.ts +6 -0
- package/dist/esm/node-grouping-validation.d.ts.map +1 -1
- package/dist/esm/node-grouping-validation.js +34 -5
- package/dist/esm/node-grouping-validation.js.map +1 -1
- package/dist/esm/node-helpers.d.ts.map +1 -1
- package/dist/esm/node-helpers.js +3 -0
- package/dist/esm/node-helpers.js.map +1 -1
- package/dist/esm/node-parameters/filter-parameter.d.ts.map +1 -1
- package/dist/esm/node-parameters/filter-parameter.js.map +1 -1
- package/dist/esm/node-reference-parser-utils.js.map +1 -1
- package/dist/esm/run-execution-data-factory.js.map +1 -1
- package/dist/esm/schemas.d.ts +13 -13
- package/dist/esm/schemas.d.ts.map +1 -1
- package/dist/esm/schemas.js +1 -0
- package/dist/esm/schemas.js.map +1 -1
- package/dist/esm/telemetry-helpers.d.ts.map +1 -1
- package/dist/esm/telemetry-helpers.js.map +1 -1
- package/dist/esm/type-guards.d.ts +3 -3
- package/dist/esm/type-guards.d.ts.map +1 -1
- package/dist/esm/type-validation.d.ts.map +1 -1
- package/dist/esm/type-validation.js.map +1 -1
- package/dist/esm/typecheck.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +2 -2
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/versioned-node-type.d.ts.map +1 -1
- package/dist/esm/workflow-data-proxy.d.ts.map +1 -1
- package/dist/esm/workflow-data-proxy.js.map +1 -1
- package/dist/esm/workflow-diff.d.ts +2 -1
- package/dist/esm/workflow-diff.d.ts.map +1 -1
- package/dist/esm/workflow-diff.js +3 -1
- package/dist/esm/workflow-diff.js.map +1 -1
- package/dist/esm/workflow-expression.d.ts.map +1 -1
- package/dist/esm/workflow-expression.js.map +1 -1
- package/dist/esm/workflow-structure-validation.d.ts.map +1 -1
- package/dist/esm/workflow-structure-validation.js.map +1 -1
- package/dist/esm/workflow.d.ts.map +1 -1
- package/dist/esm/workflow.js.map +1 -1
- package/package.json +10 -9
package/dist/cjs/expression.js
CHANGED
|
@@ -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
|
-
(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
'
|
|
180
|
-
'
|
|
181
|
-
'
|
|
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
|
-
*
|
|
190
|
-
*
|
|
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
|
-
|
|
199
|
-
return
|
|
200
|
-
|
|
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
|
-
*
|
|
219
|
-
*
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
*
|
|
246
|
-
* @private
|
|
314
|
+
* Denylist
|
|
247
315
|
*/
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
*
|
|
253
|
-
* Should be called once during application startup.
|
|
254
|
-
* Only available in Node.js environments (not in browser).
|
|
378
|
+
* Allowlist
|
|
255
379
|
*/
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
if (Expression.vmEvaluator)
|
|
285
|
-
return await Expression.vmEvaluator.acquire(this);
|
|
286
|
-
return false;
|
|
458
|
+
if (value === null) {
|
|
459
|
+
return 'null';
|
|
287
460
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
461
|
+
let typeName = value.constructor.name ?? 'Object';
|
|
462
|
+
if (luxon_1.DateTime.isDateTime(value)) {
|
|
463
|
+
typeName = 'DateTime';
|
|
291
464
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
457
|
-
|
|
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
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
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
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
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
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
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
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
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
|
-
|
|
579
|
+
const result = Expression.vmEvaluator.evaluate(expression, data, this, {
|
|
580
|
+
timezone: this.timezone,
|
|
581
|
+
});
|
|
582
|
+
return result;
|
|
601
583
|
}
|
|
602
584
|
catch (error) {
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
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
|
-
|
|
618
|
-
|
|
606
|
+
}
|
|
607
|
+
exports.Expression = Expression;
|
|
619
608
|
//# sourceMappingURL=expression.js.map
|