@energica-city/shared-amplify-utils
Version:
Shared utilities for AWS Amplify projects
81 lines • 9.58 kB
JavaScript
/**
* Shared sanitization utilities for middleware logging
*/
/**
* Checks if a field name indicates sensitive data
*/
function isSensitiveField(fieldName) {
const lowerKey = fieldName.toLowerCase();
return (lowerKey.includes('password') ||
lowerKey.includes('token') ||
lowerKey.includes('secret') ||
lowerKey.includes('key') ||
lowerKey.includes('auth'));
}
/**
* Sanitizes an array by recursively sanitizing each item
*/
function sanitizeArray(obj, config, currentDepth) {
return obj.map(item => sanitizeObject(item, config, currentDepth + 1));
}
/**
* Sanitizes an object's properties
*/
function sanitizeObjectProperties(obj, config, currentDepth) {
const { excludeFields = [] } = config;
const sanitized = {};
for (const [key, value] of Object.entries(obj)) {
if (excludeFields.includes(key)) {
sanitized[key] = '[REDACTED]';
}
else if (isSensitiveField(key)) {
sanitized[key] = '[REDACTED]';
}
else if (key === 'body' && typeof value === 'string') {
try {
const parsedBody = JSON.parse(value);
const sanitizedBody = sanitizeObject(parsedBody, config, currentDepth + 1);
sanitized[key] = JSON.stringify(sanitizedBody);
}
catch {
// Not a valid JSON string, treat as a regular field
sanitized[key] = sanitizeObject(value, config, currentDepth + 1);
}
}
else {
sanitized[key] = sanitizeObject(value, config, currentDepth + 1);
}
}
return sanitized;
}
/**
* Checks if a value is a primitive type
*/
function isPrimitive(obj) {
return (typeof obj === 'string' ||
typeof obj === 'number' ||
typeof obj === 'boolean');
}
/**
* Sanitizes an object by removing sensitive fields and limiting depth
*/
export function sanitizeObject(obj, config = {}, currentDepth = 0) {
const { maxDepth = 3 } = config;
if (currentDepth >= maxDepth) {
return '[Object: max depth reached]';
}
if (obj === null || obj === undefined) {
return obj;
}
if (isPrimitive(obj)) {
return obj;
}
if (Array.isArray(obj)) {
return sanitizeArray(obj, config, currentDepth);
}
if (typeof obj === 'object') {
return sanitizeObjectProperties(obj, config, currentDepth);
}
return '[Unknown type]';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FuaXRpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbWlkZGxld2FyZS91dGlscy9zYW5pdGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFVSDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsU0FBaUI7SUFDekMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pDLE9BQU8sQ0FDTCxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUM3QixRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUMxQixRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUMzQixRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN4QixRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUMxQixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxhQUFhLENBQ3BCLEdBQWMsRUFDZCxNQUEwQixFQUMxQixZQUFvQjtJQUVwQixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixHQUE0QixFQUM1QixNQUEwQixFQUMxQixZQUFvQjtJQUVwQixNQUFNLEVBQUUsYUFBYSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUN0QyxNQUFNLFNBQVMsR0FBNEIsRUFBRSxDQUFDO0lBRTlDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUNoQyxDQUFDO2FBQU0sSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckMsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUNsQyxVQUFVLEVBQ1YsTUFBTSxFQUNOLFlBQVksR0FBRyxDQUFDLENBQ2pCLENBQUM7Z0JBQ0YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxvREFBb0Q7Z0JBQ3BELFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEdBQVk7SUFDL0IsT0FBTyxDQUNMLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFDdkIsT0FBTyxHQUFHLEtBQUssUUFBUTtRQUN2QixPQUFPLEdBQUcsS0FBSyxTQUFTLENBQ3pCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixHQUFZLEVBQ1osU0FBNkIsRUFBRSxFQUMvQixZQUFZLEdBQUcsQ0FBQztJQUVoQixNQUFNLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUVoQyxJQUFJLFlBQVksSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLDZCQUE2QixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLHdCQUF3QixDQUM3QixHQUE4QixFQUM5QixNQUFNLEVBQ04sWUFBWSxDQUNiLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaGFyZWQgc2FuaXRpemF0aW9uIHV0aWxpdGllcyBmb3IgbWlkZGxld2FyZSBsb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzYW5pdGl6YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5pdGl6YXRpb25Db25maWcge1xuICBleGNsdWRlRmllbGRzPzogc3RyaW5nW107XG4gIG1heERlcHRoPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpZWxkIG5hbWUgaW5kaWNhdGVzIHNlbnNpdGl2ZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGlzU2Vuc2l0aXZlRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbG93ZXJLZXkgPSBmaWVsZE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICBsb3dlcktleS5pbmNsdWRlcygncGFzc3dvcmQnKSB8fFxuICAgIGxvd2VyS2V5LmluY2x1ZGVzKCd0b2tlbicpIHx8XG4gICAgbG93ZXJLZXkuaW5jbHVkZXMoJ3NlY3JldCcpIHx8XG4gICAgbG93ZXJLZXkuaW5jbHVkZXMoJ2tleScpIHx8XG4gICAgbG93ZXJLZXkuaW5jbHVkZXMoJ2F1dGgnKVxuICApO1xufVxuXG4vKipcbiAqIFNhbml0aXplcyBhbiBhcnJheSBieSByZWN1cnNpdmVseSBzYW5pdGl6aW5nIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBzYW5pdGl6ZUFycmF5KFxuICBvYmo6IHVua25vd25bXSxcbiAgY29uZmlnOiBTYW5pdGl6YXRpb25Db25maWcsXG4gIGN1cnJlbnREZXB0aDogbnVtYmVyLFxuKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIG9iai5tYXAoaXRlbSA9PiBzYW5pdGl6ZU9iamVjdChpdGVtLCBjb25maWcsIGN1cnJlbnREZXB0aCArIDEpKTtcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZXMgYW4gb2JqZWN0J3MgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBzYW5pdGl6ZU9iamVjdFByb3BlcnRpZXMoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogU2FuaXRpemF0aW9uQ29uZmlnLFxuICBjdXJyZW50RGVwdGg6IG51bWJlcixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyBleGNsdWRlRmllbGRzID0gW10gfSA9IGNvbmZpZztcbiAgY29uc3Qgc2FuaXRpemVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAoZXhjbHVkZUZpZWxkcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBzYW5pdGl6ZWRba2V5XSA9ICdbUkVEQUNURURdJztcbiAgICB9IGVsc2UgaWYgKGlzU2Vuc2l0aXZlRmllbGQoa2V5KSkge1xuICAgICAgc2FuaXRpemVkW2tleV0gPSAnW1JFREFDVEVEXSc7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdib2R5JyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNhbml0aXplZEJvZHkgPSBzYW5pdGl6ZU9iamVjdChcbiAgICAgICAgICBwYXJzZWRCb2R5LFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjdXJyZW50RGVwdGggKyAxLFxuICAgICAgICApO1xuICAgICAgICBzYW5pdGl6ZWRba2V5XSA9IEpTT04uc3RyaW5naWZ5KHNhbml0aXplZEJvZHkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vdCBhIHZhbGlkIEpTT04gc3RyaW5nLCB0cmVhdCBhcyBhIHJlZ3VsYXIgZmllbGRcbiAgICAgICAgc2FuaXRpemVkW2tleV0gPSBzYW5pdGl6ZU9iamVjdCh2YWx1ZSwgY29uZmlnLCBjdXJyZW50RGVwdGggKyAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2FuaXRpemVkW2tleV0gPSBzYW5pdGl6ZU9iamVjdCh2YWx1ZSwgY29uZmlnLCBjdXJyZW50RGVwdGggKyAxKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgcHJpbWl0aXZlIHR5cGVcbiAqL1xuZnVuY3Rpb24gaXNQcmltaXRpdmUob2JqOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHxcbiAgICB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fFxuICAgIHR5cGVvZiBvYmogPT09ICdib29sZWFuJ1xuICApO1xufVxuXG4vKipcbiAqIFNhbml0aXplcyBhbiBvYmplY3QgYnkgcmVtb3Zpbmcgc2Vuc2l0aXZlIGZpZWxkcyBhbmQgbGltaXRpbmcgZGVwdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplT2JqZWN0KFxuICBvYmo6IHVua25vd24sXG4gIGNvbmZpZzogU2FuaXRpemF0aW9uQ29uZmlnID0ge30sXG4gIGN1cnJlbnREZXB0aCA9IDAsXG4pOiB1bmtub3duIHtcbiAgY29uc3QgeyBtYXhEZXB0aCA9IDMgfSA9IGNvbmZpZztcblxuICBpZiAoY3VycmVudERlcHRoID49IG1heERlcHRoKSB7XG4gICAgcmV0dXJuICdbT2JqZWN0OiBtYXggZGVwdGggcmVhY2hlZF0nO1xuICB9XG5cbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHNhbml0aXplQXJyYXkob2JqLCBjb25maWcsIGN1cnJlbnREZXB0aCk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gc2FuaXRpemVPYmplY3RQcm9wZXJ0aWVzKFxuICAgICAgb2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgY29uZmlnLFxuICAgICAgY3VycmVudERlcHRoLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gJ1tVbmtub3duIHR5cGVdJztcbn1cbiJdfQ==