diff --git a/packages/nodes-base/nodes/Aws/DynamoDB/utils.ts b/packages/nodes-base/nodes/Aws/DynamoDB/utils.ts index 7d910ca68a..af9acad651 100644 --- a/packages/nodes-base/nodes/Aws/DynamoDB/utils.ts +++ b/packages/nodes-base/nodes/Aws/DynamoDB/utils.ts @@ -1,4 +1,4 @@ -import { deepCopy, IDataObject, INodeExecutionData } from 'n8n-workflow'; +import { deepCopy, IDataObject, INodeExecutionData, assert } from 'n8n-workflow'; import { AdjustedPutItem, @@ -82,7 +82,11 @@ function decodeAttribute(type: AttributeValueType, attribute: string | IAttribut case 'NS': return attribute; case 'M': - return simplify(attribute as IAttributeValue); + assert( + typeof attribute === 'object' && !Array.isArray(attribute) && attribute !== null, + 'Attribute must be an object', + ); + return simplify(attribute); default: return null; } diff --git a/packages/workflow/src/index.ts b/packages/workflow/src/index.ts index 00f157d079..45028210c2 100644 --- a/packages/workflow/src/index.ts +++ b/packages/workflow/src/index.ts @@ -18,7 +18,7 @@ export * from './WorkflowErrors'; export * from './WorkflowHooks'; export * from './VersionedNodeType'; export { LoggerProxy, NodeHelpers, ObservableObject, TelemetryHelpers }; -export { deepCopy, jsonParse, sleep, fileTypeFromMimeType } from './utils'; +export { deepCopy, jsonParse, sleep, fileTypeFromMimeType, assert } from './utils'; export { isINodeProperties, isINodePropertyOptions, diff --git a/packages/workflow/src/utils.ts b/packages/workflow/src/utils.ts index 1a5d0aa051..d7fdbf26e6 100644 --- a/packages/workflow/src/utils.ts +++ b/packages/workflow/src/utils.ts @@ -74,3 +74,21 @@ export function fileTypeFromMimeType(mimeType: string): BinaryFileType | undefin if (mimeType.startsWith('text/')) return 'text'; return; } + +export function assert(condition: T, msg?: string): asserts condition { + if (!condition) { + const error = new Error(msg ?? 'Invalid assertion'); + // hide assert stack frame if supported + if (Error.hasOwnProperty('captureStackTrace')) { + // V8 only - https://nodejs.org/api/errors.html#errors_error_capturestacktrace_targetobject_constructoropt + Error.captureStackTrace(error, assert); + } else if (error.stack) { + // fallback for IE and Firefox + error.stack = error.stack + .split('\n') + .slice(1) // skip assert function from stack frames + .join('\n'); + } + throw error; + } +}