n8n-workflow 2.31.1 → 2.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -49
- 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-establishment-hooks.js +7 -3
- package/dist/esm/execution-context-establishment-hooks.js.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 +9 -8
package/dist/cjs/utils.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);
|
|
@@ -34,475 +35,464 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
37
|
};
|
|
37
|
-
(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.removeCircularRefs = exports.isTraversableObject = exports.sleepWithAbort = exports.sleep = exports.jsonStringify = exports.replaceCircularReferences = exports.base64DecodeUTF8 = exports.jsonParse = exports.deepCopy = exports.isObjectEmpty = void 0;
|
|
40
|
+
exports.isObject = isObject;
|
|
41
|
+
exports.fileTypeFromMimeType = fileTypeFromMimeType;
|
|
42
|
+
exports.assert = assert;
|
|
43
|
+
exports.updateDisplayOptions = updateDisplayOptions;
|
|
44
|
+
exports.randomInt = randomInt;
|
|
45
|
+
exports.randomString = randomString;
|
|
46
|
+
exports.hasKey = hasKey;
|
|
47
|
+
exports.isSafeObjectProperty = isSafeObjectProperty;
|
|
48
|
+
exports.containsUnsafeObjectPropertyToken = containsUnsafeObjectPropertyToken;
|
|
49
|
+
exports.setSafeObjectProperty = setSafeObjectProperty;
|
|
50
|
+
exports.sanitizeXmlName = sanitizeXmlName;
|
|
51
|
+
exports.isCommunityPackageName = isCommunityPackageName;
|
|
52
|
+
exports.dedupe = dedupe;
|
|
53
|
+
exports.sanitizeFilename = sanitizeFilename;
|
|
54
|
+
exports.generateSecureToken = generateSecureToken;
|
|
55
|
+
const esprima_next_1 = require("esprima-next");
|
|
56
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
57
|
+
const jsonrepair_1 = require("jsonrepair");
|
|
58
|
+
const merge_1 = __importDefault(require("lodash/merge"));
|
|
59
|
+
const path_1 = __importDefault(require("path"));
|
|
60
|
+
const constants_1 = require("./constants");
|
|
61
|
+
const user_error_1 = require("./errors/base/user.error");
|
|
62
|
+
const execution_cancelled_error_1 = require("./errors/execution-cancelled.error");
|
|
63
|
+
const LoggerProxy = __importStar(require("./logger-proxy"));
|
|
64
|
+
const readStreamClasses = new Set(['ReadStream', 'Readable', 'ReadableStream']);
|
|
65
|
+
// NOTE: BigInt.prototype.toJSON is not available, which causes JSON.stringify to throw an error
|
|
66
|
+
// as well as the flatted stringify method. This is a workaround for that.
|
|
67
|
+
BigInt.prototype.toJSON = function () {
|
|
68
|
+
return this.toString();
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Type guard for plain objects suitable for key-based traversal/serialization.
|
|
72
|
+
*
|
|
73
|
+
* Returns `true` for objects whose prototype is `Object.prototype` (object literals)
|
|
74
|
+
* or `null` (`Object.create(null)`), and `false` for arrays and non-plain objects
|
|
75
|
+
* such as `Date`, `Map`, `Set`, and class instances.
|
|
76
|
+
*/
|
|
77
|
+
function isObject(value) {
|
|
78
|
+
if (value === null || typeof value !== 'object')
|
|
79
|
+
return false;
|
|
80
|
+
if (Array.isArray(value))
|
|
81
|
+
return false;
|
|
82
|
+
if (Object.prototype.toString.call(value) !== '[object Object]')
|
|
83
|
+
return false;
|
|
84
|
+
return Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null;
|
|
85
|
+
}
|
|
86
|
+
const isObjectEmpty = (obj) => {
|
|
87
|
+
if (obj === undefined || obj === null)
|
|
88
|
+
return true;
|
|
89
|
+
if (typeof obj === 'object') {
|
|
90
|
+
if (obj instanceof form_data_1.default)
|
|
91
|
+
return obj.getLengthSync() === 0;
|
|
92
|
+
if (Array.isArray(obj))
|
|
93
|
+
return obj.length === 0;
|
|
94
|
+
if (obj instanceof Set || obj instanceof Map)
|
|
95
|
+
return obj.size === 0;
|
|
96
|
+
if (ArrayBuffer.isView(obj) || obj instanceof ArrayBuffer)
|
|
97
|
+
return obj.byteLength === 0;
|
|
98
|
+
if (Symbol.iterator in obj || readStreamClasses.has(obj.constructor.name))
|
|
99
|
+
return false;
|
|
100
|
+
return Object.keys(obj).length === 0;
|
|
41
101
|
}
|
|
42
|
-
|
|
43
|
-
|
|
102
|
+
return true;
|
|
103
|
+
};
|
|
104
|
+
exports.isObjectEmpty = isObjectEmpty;
|
|
105
|
+
// Property keys that must never be copied onto a clone: assigning `__proto__`
|
|
106
|
+
// reassigns the clone's prototype, and `constructor`/`prototype` can shadow
|
|
107
|
+
// built-ins. Source data parsed from JSON can carry these as own properties.
|
|
108
|
+
const reservedCopyKeys = new Set(['__proto__', 'constructor', 'prototype']);
|
|
109
|
+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */
|
|
110
|
+
const deepCopy = (source, hash = new WeakMap(), path = '') => {
|
|
111
|
+
const hasOwnProp = Object.prototype.hasOwnProperty.bind(source);
|
|
112
|
+
// Primitives & Null & Function
|
|
113
|
+
if (typeof source !== 'object' || source === null || typeof source === 'function') {
|
|
114
|
+
return source;
|
|
44
115
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
exports.isObject = isObject;
|
|
50
|
-
exports.fileTypeFromMimeType = fileTypeFromMimeType;
|
|
51
|
-
exports.assert = assert;
|
|
52
|
-
exports.updateDisplayOptions = updateDisplayOptions;
|
|
53
|
-
exports.randomInt = randomInt;
|
|
54
|
-
exports.randomString = randomString;
|
|
55
|
-
exports.hasKey = hasKey;
|
|
56
|
-
exports.isSafeObjectProperty = isSafeObjectProperty;
|
|
57
|
-
exports.containsUnsafeObjectPropertyToken = containsUnsafeObjectPropertyToken;
|
|
58
|
-
exports.setSafeObjectProperty = setSafeObjectProperty;
|
|
59
|
-
exports.sanitizeXmlName = sanitizeXmlName;
|
|
60
|
-
exports.isCommunityPackageName = isCommunityPackageName;
|
|
61
|
-
exports.dedupe = dedupe;
|
|
62
|
-
exports.sanitizeFilename = sanitizeFilename;
|
|
63
|
-
exports.generateSecureToken = generateSecureToken;
|
|
64
|
-
const esprima_next_1 = require("esprima-next");
|
|
65
|
-
const form_data_1 = __importDefault(require("form-data"));
|
|
66
|
-
const jsonrepair_1 = require("jsonrepair");
|
|
67
|
-
const merge_1 = __importDefault(require("lodash/merge"));
|
|
68
|
-
const path_1 = __importDefault(require("path"));
|
|
69
|
-
const constants_1 = require("./constants");
|
|
70
|
-
const user_error_1 = require("./errors/base/user.error");
|
|
71
|
-
const execution_cancelled_error_1 = require("./errors/execution-cancelled.error");
|
|
72
|
-
const LoggerProxy = __importStar(require("./logger-proxy"));
|
|
73
|
-
const readStreamClasses = new Set(['ReadStream', 'Readable', 'ReadableStream']);
|
|
74
|
-
// NOTE: BigInt.prototype.toJSON is not available, which causes JSON.stringify to throw an error
|
|
75
|
-
// as well as the flatted stringify method. This is a workaround for that.
|
|
76
|
-
BigInt.prototype.toJSON = function () {
|
|
77
|
-
return this.toString();
|
|
78
|
-
};
|
|
79
|
-
/**
|
|
80
|
-
* Type guard for plain objects suitable for key-based traversal/serialization.
|
|
81
|
-
*
|
|
82
|
-
* Returns `true` for objects whose prototype is `Object.prototype` (object literals)
|
|
83
|
-
* or `null` (`Object.create(null)`), and `false` for arrays and non-plain objects
|
|
84
|
-
* such as `Date`, `Map`, `Set`, and class instances.
|
|
85
|
-
*/
|
|
86
|
-
function isObject(value) {
|
|
87
|
-
if (value === null || typeof value !== 'object')
|
|
88
|
-
return false;
|
|
89
|
-
if (Array.isArray(value))
|
|
90
|
-
return false;
|
|
91
|
-
if (Object.prototype.toString.call(value) !== '[object Object]')
|
|
92
|
-
return false;
|
|
93
|
-
return Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null;
|
|
116
|
+
// Date and other objects with toJSON method
|
|
117
|
+
// TODO: remove this when other code parts not expecting objects with `.toJSON` method called and add back checking for Date and cloning it properly
|
|
118
|
+
if (typeof source.toJSON === 'function') {
|
|
119
|
+
return source.toJSON();
|
|
94
120
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return obj.size === 0;
|
|
105
|
-
if (ArrayBuffer.isView(obj) || obj instanceof ArrayBuffer)
|
|
106
|
-
return obj.byteLength === 0;
|
|
107
|
-
if (Symbol.iterator in obj || readStreamClasses.has(obj.constructor.name))
|
|
108
|
-
return false;
|
|
109
|
-
return Object.keys(obj).length === 0;
|
|
110
|
-
}
|
|
111
|
-
return true;
|
|
112
|
-
};
|
|
113
|
-
exports.isObjectEmpty = isObjectEmpty;
|
|
114
|
-
// Property keys that must never be copied onto a clone: assigning `__proto__`
|
|
115
|
-
// reassigns the clone's prototype, and `constructor`/`prototype` can shadow
|
|
116
|
-
// built-ins. Source data parsed from JSON can carry these as own properties.
|
|
117
|
-
const reservedCopyKeys = new Set(['__proto__', 'constructor', 'prototype']);
|
|
118
|
-
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */
|
|
119
|
-
const deepCopy = (source, hash = new WeakMap(), path = '') => {
|
|
120
|
-
const hasOwnProp = Object.prototype.hasOwnProperty.bind(source);
|
|
121
|
-
// Primitives & Null & Function
|
|
122
|
-
if (typeof source !== 'object' || source === null || typeof source === 'function') {
|
|
123
|
-
return source;
|
|
121
|
+
if (hash.has(source)) {
|
|
122
|
+
return hash.get(source);
|
|
123
|
+
}
|
|
124
|
+
// Array
|
|
125
|
+
if (Array.isArray(source)) {
|
|
126
|
+
const clone = [];
|
|
127
|
+
const len = source.length;
|
|
128
|
+
for (let i = 0; i < len; i++) {
|
|
129
|
+
clone[i] = (0, exports.deepCopy)(source[i], hash, path + `[${i}]`);
|
|
124
130
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
return clone;
|
|
132
|
+
}
|
|
133
|
+
// Object
|
|
134
|
+
const clone = Object.create(Object.getPrototypeOf({}));
|
|
135
|
+
hash.set(source, clone);
|
|
136
|
+
for (const i in source) {
|
|
137
|
+
if (hasOwnProp(i) && !reservedCopyKeys.has(i)) {
|
|
138
|
+
clone[i] = (0, exports.deepCopy)(source[i], hash, path + `.${i}`);
|
|
129
139
|
}
|
|
130
|
-
|
|
131
|
-
|
|
140
|
+
}
|
|
141
|
+
return clone;
|
|
142
|
+
};
|
|
143
|
+
exports.deepCopy = deepCopy;
|
|
144
|
+
// eslint-enable
|
|
145
|
+
function syntaxNodeToValue(expression) {
|
|
146
|
+
switch (expression?.type) {
|
|
147
|
+
case esprima_next_1.Syntax.ObjectExpression:
|
|
148
|
+
return Object.fromEntries(expression.properties
|
|
149
|
+
.filter((prop) => prop.type === esprima_next_1.Syntax.Property)
|
|
150
|
+
.map(({ key, value }) => [syntaxNodeToValue(key), syntaxNodeToValue(value)]));
|
|
151
|
+
case esprima_next_1.Syntax.Identifier:
|
|
152
|
+
return expression.name;
|
|
153
|
+
case esprima_next_1.Syntax.Literal:
|
|
154
|
+
return expression.value;
|
|
155
|
+
case esprima_next_1.Syntax.ArrayExpression:
|
|
156
|
+
return expression.elements.map((exp) => syntaxNodeToValue(exp));
|
|
157
|
+
case esprima_next_1.Syntax.UnaryExpression: {
|
|
158
|
+
const value = syntaxNodeToValue(expression.argument);
|
|
159
|
+
if (typeof value === 'number' && expression.operator === '-') {
|
|
160
|
+
return -value;
|
|
161
|
+
}
|
|
162
|
+
return value;
|
|
132
163
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
164
|
+
default:
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Parse any JavaScript ObjectExpression, including:
|
|
170
|
+
* - single quoted keys
|
|
171
|
+
* - unquoted keys
|
|
172
|
+
*/
|
|
173
|
+
function parseJSObject(objectAsString) {
|
|
174
|
+
const jsExpression = (0, esprima_next_1.parse)(`(${objectAsString})`).body.find((node) => node.type === esprima_next_1.Syntax.ExpressionStatement && node.expression.type === esprima_next_1.Syntax.ObjectExpression);
|
|
175
|
+
return syntaxNodeToValue(jsExpression?.expression);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Parses a JSON string into an object with optional error handling and recovery mechanisms.
|
|
179
|
+
*
|
|
180
|
+
* @param {string} jsonString - The JSON string to parse.
|
|
181
|
+
* @param {Object} [options] - Optional settings for parsing the JSON string. Either `fallbackValue` or `errorMessage` can be set, but not both.
|
|
182
|
+
* @param {boolean} [options.acceptJSObject=false] - If true, attempts to recover from common JSON format errors by parsing the JSON string as a JavaScript Object.
|
|
183
|
+
* @param {boolean} [options.repairJSON=false] - If true, attempts to repair common JSON format errors by repairing the JSON string.
|
|
184
|
+
* @param {string} [options.errorMessage] - A custom error message to throw if the JSON string cannot be parsed.
|
|
185
|
+
* @param {*} [options.fallbackValue] - A fallback value to return if the JSON string cannot be parsed.
|
|
186
|
+
* @returns {Object} - The parsed object, or the fallback value if parsing fails and `fallbackValue` is set.
|
|
187
|
+
*/
|
|
188
|
+
const jsonParse = (jsonString, options) => {
|
|
189
|
+
try {
|
|
190
|
+
return JSON.parse(jsonString);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (options?.acceptJSObject) {
|
|
194
|
+
try {
|
|
195
|
+
const jsonStringCleaned = parseJSObject(jsonString);
|
|
196
|
+
return jsonStringCleaned;
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
// Ignore this error and return the original error or the fallback value
|
|
139
200
|
}
|
|
140
|
-
return clone;
|
|
141
201
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
202
|
+
if (options?.repairJSON) {
|
|
203
|
+
try {
|
|
204
|
+
const jsonStringCleaned = (0, jsonrepair_1.jsonrepair)(jsonString);
|
|
205
|
+
return JSON.parse(jsonStringCleaned);
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
// Ignore this error and return the original error or the fallback value
|
|
148
209
|
}
|
|
149
210
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// eslint-enable
|
|
154
|
-
function syntaxNodeToValue(expression) {
|
|
155
|
-
switch (expression?.type) {
|
|
156
|
-
case esprima_next_1.Syntax.ObjectExpression:
|
|
157
|
-
return Object.fromEntries(expression.properties
|
|
158
|
-
.filter((prop) => prop.type === esprima_next_1.Syntax.Property)
|
|
159
|
-
.map(({ key, value }) => [syntaxNodeToValue(key), syntaxNodeToValue(value)]));
|
|
160
|
-
case esprima_next_1.Syntax.Identifier:
|
|
161
|
-
return expression.name;
|
|
162
|
-
case esprima_next_1.Syntax.Literal:
|
|
163
|
-
return expression.value;
|
|
164
|
-
case esprima_next_1.Syntax.ArrayExpression:
|
|
165
|
-
return expression.elements.map((exp) => syntaxNodeToValue(exp));
|
|
166
|
-
case esprima_next_1.Syntax.UnaryExpression: {
|
|
167
|
-
const value = syntaxNodeToValue(expression.argument);
|
|
168
|
-
if (typeof value === 'number' && expression.operator === '-') {
|
|
169
|
-
return -value;
|
|
170
|
-
}
|
|
171
|
-
return value;
|
|
211
|
+
if (options?.fallbackValue !== undefined) {
|
|
212
|
+
if (options.fallbackValue instanceof Function) {
|
|
213
|
+
return options.fallbackValue();
|
|
172
214
|
}
|
|
173
|
-
|
|
174
|
-
|
|
215
|
+
return options.fallbackValue;
|
|
216
|
+
}
|
|
217
|
+
else if (options?.errorMessage) {
|
|
218
|
+
throw new user_error_1.UserError(options.errorMessage);
|
|
175
219
|
}
|
|
220
|
+
throw error;
|
|
176
221
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
222
|
+
};
|
|
223
|
+
exports.jsonParse = jsonParse;
|
|
224
|
+
/**
|
|
225
|
+
* Decodes a Base64 string with proper UTF-8 character handling.
|
|
226
|
+
*
|
|
227
|
+
* @param str - The Base64 string to decode
|
|
228
|
+
* @returns The decoded UTF-8 string
|
|
229
|
+
*/
|
|
230
|
+
const base64DecodeUTF8 = (str) => {
|
|
231
|
+
try {
|
|
232
|
+
// Use modern TextDecoder for proper UTF-8 handling
|
|
233
|
+
const bytes = new Uint8Array(atob(str)
|
|
234
|
+
.split('')
|
|
235
|
+
.map((char) => char.charCodeAt(0)));
|
|
236
|
+
return new TextDecoder('utf-8').decode(bytes);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
// Fallback method for older browsers
|
|
240
|
+
console.warn('TextDecoder not available, using fallback method');
|
|
241
|
+
return atob(str);
|
|
185
242
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const
|
|
243
|
+
};
|
|
244
|
+
exports.base64DecodeUTF8 = base64DecodeUTF8;
|
|
245
|
+
const replaceCircularReferences = (value, knownObjects = new WeakSet()) => {
|
|
246
|
+
if (typeof value !== 'object' || value === null || value instanceof RegExp)
|
|
247
|
+
return value;
|
|
248
|
+
if ('toJSON' in value && typeof value.toJSON === 'function')
|
|
249
|
+
return value.toJSON();
|
|
250
|
+
if (knownObjects.has(value))
|
|
251
|
+
return '[Circular Reference]';
|
|
252
|
+
knownObjects.add(value);
|
|
253
|
+
const copy = (Array.isArray(value) ? [] : {});
|
|
254
|
+
for (const key in value) {
|
|
255
|
+
if (reservedCopyKeys.has(key))
|
|
256
|
+
continue;
|
|
198
257
|
try {
|
|
199
|
-
|
|
258
|
+
copy[key] = (0, exports.replaceCircularReferences)(value[key], knownObjects);
|
|
200
259
|
}
|
|
201
260
|
catch (error) {
|
|
202
|
-
if (
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
catch (e) {
|
|
208
|
-
// Ignore this error and return the original error or the fallback value
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
if (options?.repairJSON) {
|
|
212
|
-
try {
|
|
213
|
-
const jsonStringCleaned = (0, jsonrepair_1.jsonrepair)(jsonString);
|
|
214
|
-
return JSON.parse(jsonStringCleaned);
|
|
215
|
-
}
|
|
216
|
-
catch (e) {
|
|
217
|
-
// Ignore this error and return the original error or the fallback value
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
if (options?.fallbackValue !== undefined) {
|
|
221
|
-
if (options.fallbackValue instanceof Function) {
|
|
222
|
-
return options.fallbackValue();
|
|
223
|
-
}
|
|
224
|
-
return options.fallbackValue;
|
|
225
|
-
}
|
|
226
|
-
else if (options?.errorMessage) {
|
|
227
|
-
throw new user_error_1.UserError(options.errorMessage);
|
|
261
|
+
if (error instanceof TypeError &&
|
|
262
|
+
error.message.includes('Cannot assign to read only property')) {
|
|
263
|
+
LoggerProxy.error('Error while replacing circular references: ' + error.message, { error });
|
|
264
|
+
continue; // Skip properties that cannot be assigned to (readonly, non-configurable, etc.)
|
|
228
265
|
}
|
|
229
266
|
throw error;
|
|
230
267
|
}
|
|
268
|
+
}
|
|
269
|
+
knownObjects.delete(value);
|
|
270
|
+
return copy;
|
|
271
|
+
};
|
|
272
|
+
exports.replaceCircularReferences = replaceCircularReferences;
|
|
273
|
+
const jsonStringify = (obj, options = {}) => {
|
|
274
|
+
return JSON.stringify(options?.replaceCircularRefs ? (0, exports.replaceCircularReferences)(obj) : obj);
|
|
275
|
+
};
|
|
276
|
+
exports.jsonStringify = jsonStringify;
|
|
277
|
+
const sleep = async (ms) => await new Promise((resolve) => {
|
|
278
|
+
setTimeout(resolve, ms);
|
|
279
|
+
});
|
|
280
|
+
exports.sleep = sleep;
|
|
281
|
+
const sleepWithAbort = async (ms, abortSignal) => await new Promise((resolve, reject) => {
|
|
282
|
+
if (abortSignal?.aborted) {
|
|
283
|
+
reject(new execution_cancelled_error_1.ManualExecutionCancelledError(''));
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const timeout = setTimeout(resolve, ms);
|
|
287
|
+
const abortHandler = () => {
|
|
288
|
+
clearTimeout(timeout);
|
|
289
|
+
reject(new execution_cancelled_error_1.ManualExecutionCancelledError(''));
|
|
231
290
|
};
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
291
|
+
abortSignal?.addEventListener('abort', abortHandler, { once: true });
|
|
292
|
+
});
|
|
293
|
+
exports.sleepWithAbort = sleepWithAbort;
|
|
294
|
+
function fileTypeFromMimeType(mimeType) {
|
|
295
|
+
if (mimeType.startsWith('application/json'))
|
|
296
|
+
return 'json';
|
|
297
|
+
if (mimeType.startsWith('text/html'))
|
|
298
|
+
return 'html';
|
|
299
|
+
if (mimeType.startsWith('image/'))
|
|
300
|
+
return 'image';
|
|
301
|
+
if (mimeType.startsWith('audio/'))
|
|
302
|
+
return 'audio';
|
|
303
|
+
if (mimeType.startsWith('video/'))
|
|
304
|
+
return 'video';
|
|
305
|
+
if (mimeType.startsWith('text/') || mimeType.startsWith('application/javascript'))
|
|
306
|
+
return 'text';
|
|
307
|
+
if (mimeType.startsWith('application/pdf'))
|
|
308
|
+
return 'pdf';
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
function assert(condition, msg) {
|
|
312
|
+
if (!condition) {
|
|
313
|
+
const error = new Error(msg ?? 'Invalid assertion');
|
|
314
|
+
// hide assert stack frame if supported
|
|
315
|
+
if (Error.hasOwnProperty('captureStackTrace')) {
|
|
316
|
+
// V8 only - https://nodejs.org/api/errors.html#errors_error_capturestacktrace_targetobject_constructoropt
|
|
317
|
+
Error.captureStackTrace(error, assert);
|
|
246
318
|
}
|
|
247
|
-
|
|
248
|
-
//
|
|
249
|
-
|
|
250
|
-
|
|
319
|
+
else if (error.stack) {
|
|
320
|
+
// fallback for IE and Firefox
|
|
321
|
+
error.stack = error.stack
|
|
322
|
+
.split('\n')
|
|
323
|
+
.slice(1) // skip assert function from stack frames
|
|
324
|
+
.join('\n');
|
|
251
325
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
LoggerProxy.error('Error while replacing circular references: ' + error.message, { error });
|
|
273
|
-
continue; // Skip properties that cannot be assigned to (readonly, non-configurable, etc.)
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const isTraversableObject = (value) => {
|
|
330
|
+
return value && typeof value === 'object' && !Array.isArray(value) && !!Object.keys(value).length;
|
|
331
|
+
};
|
|
332
|
+
exports.isTraversableObject = isTraversableObject;
|
|
333
|
+
const removeCircularRefs = (obj, seen = new Set()) => {
|
|
334
|
+
seen.add(obj);
|
|
335
|
+
Object.entries(obj).forEach(([key, value]) => {
|
|
336
|
+
if ((0, exports.isTraversableObject)(value)) {
|
|
337
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
338
|
+
seen.has(value) ? (obj[key] = { circularReference: true }) : (0, exports.removeCircularRefs)(value, seen);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
if (Array.isArray(value)) {
|
|
342
|
+
value.forEach((val, index) => {
|
|
343
|
+
if (seen.has(val)) {
|
|
344
|
+
value[index] = { circularReference: true };
|
|
345
|
+
return;
|
|
274
346
|
}
|
|
275
|
-
|
|
276
|
-
|
|
347
|
+
if ((0, exports.isTraversableObject)(val)) {
|
|
348
|
+
(0, exports.removeCircularRefs)(val, seen);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
277
351
|
}
|
|
278
|
-
knownObjects.delete(value);
|
|
279
|
-
return copy;
|
|
280
|
-
};
|
|
281
|
-
exports.replaceCircularReferences = replaceCircularReferences;
|
|
282
|
-
const jsonStringify = (obj, options = {}) => {
|
|
283
|
-
return JSON.stringify(options?.replaceCircularRefs ? (0, exports.replaceCircularReferences)(obj) : obj);
|
|
284
|
-
};
|
|
285
|
-
exports.jsonStringify = jsonStringify;
|
|
286
|
-
const sleep = async (ms) => await new Promise((resolve) => {
|
|
287
|
-
setTimeout(resolve, ms);
|
|
288
352
|
});
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
const abortHandler = () => {
|
|
297
|
-
clearTimeout(timeout);
|
|
298
|
-
reject(new execution_cancelled_error_1.ManualExecutionCancelledError(''));
|
|
353
|
+
};
|
|
354
|
+
exports.removeCircularRefs = removeCircularRefs;
|
|
355
|
+
function updateDisplayOptions(displayOptions, properties) {
|
|
356
|
+
return properties.map((nodeProperty) => {
|
|
357
|
+
return {
|
|
358
|
+
...nodeProperty,
|
|
359
|
+
displayOptions: (0, merge_1.default)({}, nodeProperty.displayOptions, displayOptions),
|
|
299
360
|
};
|
|
300
|
-
abortSignal?.addEventListener('abort', abortHandler, { once: true });
|
|
301
361
|
});
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
if (mimeType.startsWith('text/') || mimeType.startsWith('application/javascript'))
|
|
315
|
-
return 'text';
|
|
316
|
-
if (mimeType.startsWith('application/pdf'))
|
|
317
|
-
return 'pdf';
|
|
318
|
-
return;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Generates a random integer within a specified range.
|
|
365
|
+
*
|
|
366
|
+
* @param {number} min - The lower bound of the range. If `max` is not provided, this value is used as the upper bound and the lower bound is set to 0.
|
|
367
|
+
* @param {number} [max] - The upper bound of the range, not inclusive.
|
|
368
|
+
* @returns {number} A random integer within the specified range.
|
|
369
|
+
*/
|
|
370
|
+
function randomInt(min, max) {
|
|
371
|
+
if (max === undefined) {
|
|
372
|
+
max = min;
|
|
373
|
+
min = 0;
|
|
319
374
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
* @returns {string} A random alphanumeric string of the specified length or within the specified range of lengths.
|
|
392
|
-
*/
|
|
393
|
-
function randomString(minLength, maxLength) {
|
|
394
|
-
const length = maxLength === undefined ? minLength : randomInt(minLength, maxLength + 1);
|
|
395
|
-
return [...crypto.getRandomValues(new Uint32Array(length))]
|
|
396
|
-
.map((byte) => constants_1.ALPHABET[byte % constants_1.ALPHABET.length])
|
|
397
|
-
.join('');
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Checks if a value is an object with a specific key and provides a type guard for the key.
|
|
401
|
-
*/
|
|
402
|
-
function hasKey(value, key) {
|
|
403
|
-
return value !== null && typeof value === 'object' && value.hasOwnProperty(key);
|
|
375
|
+
return min + (crypto.getRandomValues(new Uint32Array(1))[0] % (max - min));
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Generates a random alphanumeric string of a specified length, or within a range of lengths.
|
|
379
|
+
*
|
|
380
|
+
* @param {number} minLength - If `maxLength` is not provided, this is the length of the string to generate. Otherwise, this is the lower bound of the range of possible lengths.
|
|
381
|
+
* @param {number} [maxLength] - The upper bound of the range of possible lengths. If provided, the actual length of the string will be a random number between `minLength` and `maxLength`, inclusive.
|
|
382
|
+
* @returns {string} A random alphanumeric string of the specified length or within the specified range of lengths.
|
|
383
|
+
*/
|
|
384
|
+
function randomString(minLength, maxLength) {
|
|
385
|
+
const length = maxLength === undefined ? minLength : randomInt(minLength, maxLength + 1);
|
|
386
|
+
return [...crypto.getRandomValues(new Uint32Array(length))]
|
|
387
|
+
.map((byte) => constants_1.ALPHABET[byte % constants_1.ALPHABET.length])
|
|
388
|
+
.join('');
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Checks if a value is an object with a specific key and provides a type guard for the key.
|
|
392
|
+
*/
|
|
393
|
+
function hasKey(value, key) {
|
|
394
|
+
return value !== null && typeof value === 'object' && value.hasOwnProperty(key);
|
|
395
|
+
}
|
|
396
|
+
const unsafeObjectProperties = new Set([
|
|
397
|
+
'__proto__',
|
|
398
|
+
'prototype',
|
|
399
|
+
'constructor',
|
|
400
|
+
'getPrototypeOf',
|
|
401
|
+
'setPrototypeOf',
|
|
402
|
+
'getOwnPropertyDescriptor',
|
|
403
|
+
'getOwnPropertyDescriptors',
|
|
404
|
+
'defineProperty',
|
|
405
|
+
'defineProperties',
|
|
406
|
+
'mainModule',
|
|
407
|
+
'binding',
|
|
408
|
+
'_linkedBinding',
|
|
409
|
+
'_load',
|
|
410
|
+
'prepareStackTrace',
|
|
411
|
+
'__lookupGetter__',
|
|
412
|
+
'__lookupSetter__',
|
|
413
|
+
'__defineGetter__',
|
|
414
|
+
'__defineSetter__',
|
|
415
|
+
'caller',
|
|
416
|
+
'callee',
|
|
417
|
+
'arguments',
|
|
418
|
+
'getBuiltinModule',
|
|
419
|
+
'dlopen',
|
|
420
|
+
'execve',
|
|
421
|
+
'loadEnvFile',
|
|
422
|
+
]);
|
|
423
|
+
/**
|
|
424
|
+
* Checks if a property key is safe to use on an object, preventing prototype pollution.
|
|
425
|
+
* setting untrusted properties can alter the object's prototype chain and introduce vulnerabilities.
|
|
426
|
+
*
|
|
427
|
+
* @see setSafeObjectProperty
|
|
428
|
+
*/
|
|
429
|
+
function isSafeObjectProperty(property) {
|
|
430
|
+
return !unsafeObjectProperties.has(property);
|
|
431
|
+
}
|
|
432
|
+
const unsafeObjectPropertyTokenPattern = new RegExp(`\\b(?:${[...unsafeObjectProperties]
|
|
433
|
+
.map((p) => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
|
|
434
|
+
.join('|')})\\b`);
|
|
435
|
+
function containsUnsafeObjectPropertyToken(input) {
|
|
436
|
+
return unsafeObjectPropertyTokenPattern.test(input);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Safely sets a property on an object, preventing prototype pollution.
|
|
440
|
+
*
|
|
441
|
+
* @see isSafeObjectProperty
|
|
442
|
+
*/
|
|
443
|
+
function setSafeObjectProperty(target, property, value) {
|
|
444
|
+
if (isSafeObjectProperty(property)) {
|
|
445
|
+
target[property] = value;
|
|
404
446
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
447
|
+
}
|
|
448
|
+
const DANGEROUS_XML_NAMES = new Set(['__proto__', 'constructor', 'prototype']);
|
|
449
|
+
function sanitizeXmlName(name) {
|
|
450
|
+
if (DANGEROUS_XML_NAMES.has(name))
|
|
451
|
+
return `sanitized_${name}`;
|
|
452
|
+
return name;
|
|
453
|
+
}
|
|
454
|
+
const COMMUNITY_PACKAGE_NAME_REGEX = /^(?!@n8n\/)(@[\w.-]+\/)?n8n-nodes-(?!base\b)\b\w+/g;
|
|
455
|
+
function isCommunityPackageName(packageName) {
|
|
456
|
+
COMMUNITY_PACKAGE_NAME_REGEX.lastIndex = 0;
|
|
457
|
+
// Community packages names start with <@username/>n8n-nodes- not followed by word 'base'
|
|
458
|
+
const nameMatch = COMMUNITY_PACKAGE_NAME_REGEX.exec(packageName);
|
|
459
|
+
return !!nameMatch;
|
|
460
|
+
}
|
|
461
|
+
function dedupe(arr) {
|
|
462
|
+
return [...new Set(arr)];
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Extracts a safe filename from a path or filename string.
|
|
466
|
+
*
|
|
467
|
+
* Handles both Unix and Windows path separators, removing directory
|
|
468
|
+
* components and null bytes to return just the filename.
|
|
469
|
+
*
|
|
470
|
+
* @param fileName - The filename or path to sanitize
|
|
471
|
+
* @returns The extracted filename without path components
|
|
472
|
+
*
|
|
473
|
+
* @example
|
|
474
|
+
* sanitizeFilename('path/to/file.txt') // returns 'file.txt'
|
|
475
|
+
* sanitizeFilename('/tmp/upload/doc.pdf') // returns 'doc.pdf'
|
|
476
|
+
* sanitizeFilename('C:\\Users\\file.txt') // returns 'file.txt'
|
|
477
|
+
* sanitizeFilename('../../../etc/passwd') // returns 'passwd'
|
|
478
|
+
*/
|
|
479
|
+
function sanitizeFilename(fileName) {
|
|
480
|
+
// Normalize to forward slashes first to handle Windows paths on Unix
|
|
481
|
+
const normalized = fileName.replace(/\\/g, '/');
|
|
482
|
+
// Extract just the filename, stripping all directory components
|
|
483
|
+
let sanitized = path_1.default.basename(normalized);
|
|
484
|
+
// Remove null bytes which could be used for null byte injection attacks
|
|
485
|
+
sanitized = sanitized.replace(/\0/g, '');
|
|
486
|
+
// If the result is empty or just dots, use a default name
|
|
487
|
+
if (!sanitized || /^\.+$/.test(sanitized)) {
|
|
488
|
+
sanitized = 'untitled';
|
|
440
489
|
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
*
|
|
450
|
-
* @see isSafeObjectProperty
|
|
451
|
-
*/
|
|
452
|
-
function setSafeObjectProperty(target, property, value) {
|
|
453
|
-
if (isSafeObjectProperty(property)) {
|
|
454
|
-
target[property] = value;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
const DANGEROUS_XML_NAMES = new Set(['__proto__', 'constructor', 'prototype']);
|
|
458
|
-
function sanitizeXmlName(name) {
|
|
459
|
-
if (DANGEROUS_XML_NAMES.has(name))
|
|
460
|
-
return `sanitized_${name}`;
|
|
461
|
-
return name;
|
|
462
|
-
}
|
|
463
|
-
const COMMUNITY_PACKAGE_NAME_REGEX = /^(?!@n8n\/)(@[\w.-]+\/)?n8n-nodes-(?!base\b)\b\w+/g;
|
|
464
|
-
function isCommunityPackageName(packageName) {
|
|
465
|
-
COMMUNITY_PACKAGE_NAME_REGEX.lastIndex = 0;
|
|
466
|
-
// Community packages names start with <@username/>n8n-nodes- not followed by word 'base'
|
|
467
|
-
const nameMatch = COMMUNITY_PACKAGE_NAME_REGEX.exec(packageName);
|
|
468
|
-
return !!nameMatch;
|
|
469
|
-
}
|
|
470
|
-
function dedupe(arr) {
|
|
471
|
-
return [...new Set(arr)];
|
|
472
|
-
}
|
|
473
|
-
/**
|
|
474
|
-
* Extracts a safe filename from a path or filename string.
|
|
475
|
-
*
|
|
476
|
-
* Handles both Unix and Windows path separators, removing directory
|
|
477
|
-
* components and null bytes to return just the filename.
|
|
478
|
-
*
|
|
479
|
-
* @param fileName - The filename or path to sanitize
|
|
480
|
-
* @returns The extracted filename without path components
|
|
481
|
-
*
|
|
482
|
-
* @example
|
|
483
|
-
* sanitizeFilename('path/to/file.txt') // returns 'file.txt'
|
|
484
|
-
* sanitizeFilename('/tmp/upload/doc.pdf') // returns 'doc.pdf'
|
|
485
|
-
* sanitizeFilename('C:\\Users\\file.txt') // returns 'file.txt'
|
|
486
|
-
* sanitizeFilename('../../../etc/passwd') // returns 'passwd'
|
|
487
|
-
*/
|
|
488
|
-
function sanitizeFilename(fileName) {
|
|
489
|
-
// Normalize to forward slashes first to handle Windows paths on Unix
|
|
490
|
-
const normalized = fileName.replace(/\\/g, '/');
|
|
491
|
-
// Extract just the filename, stripping all directory components
|
|
492
|
-
let sanitized = path_1.default.basename(normalized);
|
|
493
|
-
// Remove null bytes which could be used for null byte injection attacks
|
|
494
|
-
sanitized = sanitized.replace(/\0/g, '');
|
|
495
|
-
// If the result is empty or just dots, use a default name
|
|
496
|
-
if (!sanitized || /^\.+$/.test(sanitized)) {
|
|
497
|
-
sanitized = 'untitled';
|
|
498
|
-
}
|
|
499
|
-
return sanitized;
|
|
500
|
-
}
|
|
501
|
-
/** Generates a cryptographically secure 64-character hex token (256 bits). */
|
|
502
|
-
function generateSecureToken() {
|
|
503
|
-
const bytes = new Uint8Array(32);
|
|
504
|
-
crypto.getRandomValues(bytes);
|
|
505
|
-
return bytes.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '');
|
|
506
|
-
}
|
|
507
|
-
});
|
|
490
|
+
return sanitized;
|
|
491
|
+
}
|
|
492
|
+
/** Generates a cryptographically secure 64-character hex token (256 bits). */
|
|
493
|
+
function generateSecureToken() {
|
|
494
|
+
const bytes = new Uint8Array(32);
|
|
495
|
+
crypto.getRandomValues(bytes);
|
|
496
|
+
return bytes.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '');
|
|
497
|
+
}
|
|
508
498
|
//# sourceMappingURL=utils.js.map
|