packages/aws-cdk-lib/aws-events/lib/util.ts (49 lines of code) (raw):

import { EventPattern } from './event-pattern'; import { UnscopedValidationError } from '../../core'; /** * Merge the `src` event pattern into the `dest` event pattern by adding all * values from `src` into the fields in `dest`. * * See `rule.addEventPattern` for details. */ export function mergeEventPattern(dest: any, src: any) { dest = dest || { }; mergeObject(dest, src); return dest; function mergeObject(destObj: any, srcObj: any) { if (typeof(srcObj) !== 'object') { throw new UnscopedValidationError(`Invalid event pattern '${JSON.stringify(srcObj)}', expecting an object or an array`); } for (const field of Object.keys(srcObj)) { const srcValue = srcObj[field]; const destValue = destObj[field]; if (srcValue === undefined) { continue; } if (typeof(srcValue) !== 'object') { throw new UnscopedValidationError(`Invalid event pattern field { ${field}: ${JSON.stringify(srcValue)} }. All fields must be arrays`); } // dest doesn't have this field if (destObj[field] === undefined) { destObj[field] = srcValue; continue; } if (Array.isArray(srcValue) !== Array.isArray(destValue)) { throw new UnscopedValidationError(`Invalid event pattern field ${field}. ` + `Type mismatch between existing pattern ${JSON.stringify(destValue)} and added pattern ${JSON.stringify(srcValue)}`); } // if this is an array, concat and deduplicate the values if (Array.isArray(srcValue)) { const result = [...destValue, ...srcValue]; const resultJson = result.map(i => JSON.stringify(i)); destObj[field] = result.filter((value, index) => resultJson.indexOf(JSON.stringify(value)) === index); continue; } // otherwise, it's an object, so recurse mergeObject(destObj[field], srcValue); } } } /** * Transform an eventPattern object into a valid Event Rule Pattern * by changing detailType into detail-type when present. */ export function renderEventPattern(eventPattern: EventPattern): any { if (Object.keys(eventPattern).length === 0) { return undefined; } // rename 'detailType' to 'detail-type' const out: any = {}; for (let key of Object.keys(eventPattern)) { const value = (eventPattern as any)[key]; if (key === 'detailType') { key = 'detail-type'; } out[key] = value; } return out; }