masked
Version:
Mask sensitive values in objects
88 lines (76 loc) • 3.06 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
typeof define === 'function' && define.amd ? define(factory) :
(factory());
}(this, (function () { 'use strict';
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _repeat = require('lodash/repeat');
var _forOwn = require('lodash/forOwn');
var MASK_CHAR = '*';
var _parse = function _parse(string) {
if (typeof string === 'string') {
try {
return JSON.parse(string);
} catch (err) {
return null;
}
}
return null;
};
var _maskedString = function _maskedString(_ref) {
var length = _ref.length,
maskChar = _ref.maskChar;
return _repeat(maskChar, length);
};
var masked = function masked(data, keys) {
var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
omitKeys = _ref2.omitKeys;
if (!data) {
return null;
}
if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) !== 'object' && !_parse(data)) {
return data;
}
if (!keys || !Array.isArray(keys) && typeof keys !== 'string') {
if (!keys) {
throw new Error('Second parameter `keys` not given');
}
throw new TypeError('Expected a string or array, got ' + (typeof keys === 'undefined' ? 'undefined' : _typeof(keys)));
}
var newData = _parse(data) || data;
if (Array.isArray(newData)) {
newData = newData.map(function (newData) {
if ((typeof newData === 'undefined' ? 'undefined' : _typeof(newData)) !== 'object') {
return newData;
}
return masked(newData, keys, { omitKeys: omitKeys });
});
} else {
newData = _extends({}, newData);
_forOwn(newData, function (value, key) {
if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {
if (Array.isArray(value) && Array.isArray(keys) && keys.includes(key)) {
if (omitKeys) {
delete newData[key];
} else {
newData[key] = value.map(function () {
return _maskedString({ length: 8, maskChar: MASK_CHAR });
});
}
} else {
newData[key] = masked(value, keys, { omitKeys: omitKeys });
}
} else if (key === keys || Array.isArray(keys) && keys.includes(key)) {
if (omitKeys) {
delete newData[key];
} else {
newData[key] = _maskedString({ length: 8, maskChar: MASK_CHAR });
}
}
});
}
return typeof data === 'string' && _parse(data) ? JSON.stringify(newData) : newData;
};
module.exports = masked;
})));