ng-anonymize
Version:
Data anonymization library for Angular
79 lines • 13.7 kB
JavaScript
import { __decorate } from "tslib";
import { Pipe } from '@angular/core';
import { AnonymizeDataType, AnonymizeDefaultValues, AnonymizeMethod, } from "../models/anonymize.models";
/* Predefined constants for text processing */
var ALPHABET = 'abcdefghijjklmnopqrstuvwyz';
var lowerAlpha = ALPHABET.split('');
var upperAlpha = ALPHABET.toUpperCase().split('');
var nums = '0123456789'.split('');
var AnonymizePipe = /** @class */ (function () {
function AnonymizePipe() {
}
AnonymizePipe.prototype.transform = function (value, method, options) {
if (method === void 0) { method = AnonymizeMethod.Randomize; }
if (!value)
return '';
// Extract options or default
var _a = options || {}, type = _a.type, _b = _a.mask, mask = _b === void 0 ? AnonymizeDefaultValues.MaskChar : _b, bleed = _a.bleed;
switch (method) {
case AnonymizeMethod.First:
// Replace all but first bleed characters by mask
return value.split('').map(function (c, index) { return index < (bleed || AnonymizeDefaultValues.LeftReveal) ? c : mask; }).join('');
case AnonymizeMethod.Last:
// Replace all but last bleed characters by mask
return value.split('').map(function (c, index) { return index >= value.length - (bleed || AnonymizeDefaultValues.RightReveal) ? c : mask; }).join('');
case AnonymizeMethod.Randomize:
// Replace each character with random value of same character class
return value.split('').map(function (c, index) {
var isLowerAlpha = lowerAlpha.indexOf(c) >= 0;
var isUpperAlpha = upperAlpha.indexOf(c) >= 0;
var isNum = nums.indexOf(c) >= 0;
var charClass = isLowerAlpha ? lowerAlpha : isUpperAlpha ? upperAlpha : isNum ? nums : null;
if (!charClass)
return c;
if (type === AnonymizeDataType.Phone) {
if (index < AnonymizeDefaultValues.PhoneCcLength)
return c;
}
return charClass[Math.floor(Math.random() * charClass.length)];
}).join('');
case AnonymizeMethod.Shuffle:
// Swap positions of all characters, preserving position of same character class
var chars = value.split('');
var shuffledAlpha_1 = chars
.filter(function (c) { return lowerAlpha.indexOf(c) >= 0 || upperAlpha.indexOf(c) >= 0; }).sort(function () { return 0.5 - Math.random(); });
var shuffledNums_1 = chars
.filter(function (c) { return nums.indexOf(c) >= 0; }).sort(function () { return 0.5 - Math.random(); });
return chars.map(function (c, index) {
var isLowerAlpha = lowerAlpha.indexOf(c) >= 0;
var isUpperAlpha = upperAlpha.indexOf(c) >= 0;
var isNum = nums.indexOf(c) >= 0;
var charClass = isLowerAlpha ? lowerAlpha : isUpperAlpha ? upperAlpha : isNum ? nums : null;
if (!charClass)
return c;
if (type === AnonymizeDataType.Phone) {
// If type = phone, do not transform first 3 characters
if (index < AnonymizeDefaultValues.PhoneCcLength)
return c;
}
var newChar = isNum ? shuffledNums_1.pop() : shuffledAlpha_1.pop();
if (isUpperAlpha)
newChar = newChar.toUpperCase();
else if (isLowerAlpha)
newChar = newChar.toLowerCase();
return newChar;
}).join('');
default:
return value || '';
}
};
AnonymizePipe = __decorate([
Pipe({
name: 'anonymize',
pure: true
})
], AnonymizePipe);
return AnonymizePipe;
}());
export { AnonymizePipe };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5vbnltaXplLnBpcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1hbm9ueW1pemUvIiwic291cmNlcyI6WyJsaWIvcGlwZXMvYW5vbnltaXplLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGVBQWUsR0FFaEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyw4Q0FBOEM7QUFDOUMsSUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUM7QUFDOUMsSUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QyxJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BELElBQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFNcEM7SUFBQTtJQXNEQSxDQUFDO0lBcERDLGlDQUFTLEdBQVQsVUFBVSxLQUFhLEVBQUUsTUFBbUQsRUFBRSxPQUE4QjtRQUFuRix1QkFBQSxFQUFBLFNBQTBCLGVBQWUsQ0FBQyxTQUFTO1FBQzFFLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEIsOEJBQThCO1FBQ3hCLElBQUEsa0JBQXlGLEVBQXhGLGNBQUksRUFBRSxZQUFzQyxFQUF0QywyREFBc0MsRUFBRSxnQkFBMEMsQ0FBQztRQUVoRyxRQUFRLE1BQU0sRUFBRTtZQUNkLEtBQUssZUFBZSxDQUFDLEtBQUs7Z0JBQ3hCLGlEQUFpRDtnQkFDakQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsRUFBRSxLQUFLLElBQUssT0FBQSxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksc0JBQXNCLENBQUMsVUFB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LEFBdERELElBc0RDO1NBdERZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BpcGUsIFBpcGVUcmFuc2Zvcm19IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBbm9ueW1pemVQaXBlT3B0aW9uc30gZnJvbSBcIi4vYW5vbnltaXplLnBpcGUubW9kZWxcIjtcbmltcG9ydCB7XG4gIEFub255bWl6ZURhdGFUeXBlLFxuICBBbm9ueW1pemVEZWZhdWx0VmFsdWVzLFxuICBBbm9ueW1pemVNZXRob2QsXG4gIEFub255bWl6ZU9wdGlvbnMsXG59IGZyb20gXCIuLi9tb2RlbHMvYW5vbnltaXplLm1vZGVsc1wiO1xuXG4vKiBQcmVkZWZpbmVkIGNvbnN0YW50cyBmb3IgdGV4dCBwcm9jZXNzaW5nICovXG5jb25zdCBBTFBIQUJFVCA9ICdhYmNkZWZnaGlqamtsbW5vcHFyc3R1dnd5eic7XG5jb25zdCBsb3dlckFscGhhID0gQUxQSEFCRVQuc3BsaXQoJycpO1xuY29uc3QgdXBwZXJBbHBoYSA9IEFMUEhBQkVULnRvVXBwZXJDYXNlKCkuc3BsaXQoJycpO1xuY29uc3QgbnVtcyA9ICcwMTIzNDU2Nzg5Jy5zcGxpdCgnJyk7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ2Fub255bWl6ZScsXG4gIHB1cmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgQW5vbnltaXplUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBtZXRob2Q6IEFub255bWl6ZU1ldGhvZCA9IEFub255bWl6ZU1ldGhvZC5SYW5kb21pemUsIG9wdGlvbnM/OiBBbm9ueW1pemVQaXBlT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIC8vICBFeHRyYWN0IG9wdGlvbnMgb3IgZGVmYXVsdFxuICAgIGNvbnN0IHt0eXBlLCBtYXNrID0gQW5vbnltaXplRGVmYXVsdFZhbHVlcy5NYXNrQ2hhciwgYmxlZWR9ID0gb3B0aW9ucyBhcyBBbm9ueW1pemVPcHRpb25zIHx8IHt9O1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgQW5vbnltaXplTWV0aG9kLkZpcnN0OlxuICAgICAgICAvLyBSZXBsYWNlIGFsbCBidXQgZmlyc3QgYmxlZWQgY2hhcmFjdGVycyBieSBtYXNrXG4gICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJykubWFwKChjLCBpbmRleCkgPT4gaW5kZXggPCAoYmxlZWQgfHwgQW5vbnltaXplRGVmYXVsdFZhbHVlcy5MZWZ0UmV2ZWFsKSA/IGMgOiBtYXNrKS5qb2luKCcnKTtcbiAgICAgIGNhc2UgQW5vbnltaXplTWV0aG9kLkxhc3Q6XG4gICAgICAgIC8vIFJlcGxhY2UgYWxsIGJ1dCBsYXN0ICBibGVlZCBjaGFyYWN0ZXJzIGJ5IG1hc2tcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5tYXAoKGMsIGluZGV4KSA9PiBpbmRleCA+PSB2YWx1ZS5sZW5ndGggLSAoYmxlZWQgfHwgQW5vbnltaXplRGVmYXVsdFZhbHVlcy5SaWdodFJldmVhbCkgPyBjIDogbWFzaykuam9pbignJyk7XG4gICAgICBjYXNlIEFub255bWl6ZU1ldGhvZC5SYW5kb21pemU6XG4gICAgICAgIC8vIFJlcGxhY2UgZWFjaCBjaGFyYWN0ZXIgd2l0aCByYW5kb20gdmFsdWUgb2Ygc2FtZSBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5tYXAoKGMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNMb3dlckFscGhhID0gbG93ZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNVcHBlckFscGhhID0gdXBwZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNOdW0gPSBudW1zLmluZGV4T2YoYykgPj0gMDtcbiAgICAgICAgICBjb25zdCBjaGFyQ2xhc3MgPSBpc0xvd2VyQWxwaGEgPyBsb3dlckFscGhhIDogaXNVcHBlckFscGhhID8gdXBwZXJBbHBoYSA6IGlzTnVtID8gbnVtcyA6IG51bGw7XG4gICAgICAgICAgaWYgKCFjaGFyQ2xhc3MpIHJldHVybiBjO1xuICAgICAgICAgIGlmICh0eXBlID09PSBBbm9ueW1pemVEYXRhVHlwZS5QaG9uZSkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgQW5vbnltaXplRGVmYXVsdFZhbHVlcy5QaG9uZUNjTGVuZ3RoKSByZXR1cm4gYztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNoYXJDbGFzc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyQ2xhc3MubGVuZ3RoKV07XG4gICAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgY2FzZSBBbm9ueW1pemVNZXRob2QuU2h1ZmZsZTpcbiAgICAgICAgLy8gU3dhcCBwb3NpdGlvbnMgb2YgYWxsIGNoYXJhY3RlcnMsIHByZXNlcnZpbmcgcG9zaXRpb24gb2Ygc2FtZSBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgICAgY29uc3QgY2hhcnMgPSB2YWx1ZS5zcGxpdCgnJyk7XG4gICAgICAgIGNvbnN0IHNodWZmbGVkQWxwaGEgPSBjaGFyc1xuICAgICAgICAgIC5maWx0ZXIoYyA9PiBsb3dlckFscGhhLmluZGV4T2YoYykgPj0gMCB8fCB1cHBlckFscGhhLmluZGV4T2YoYykgPj0gMCkuc29ydCgoKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgY29uc3Qgc2h1ZmZsZWROdW1zID0gY2hhcnNcbiAgICAgICAgICAuZmlsdGVyKGMgPT4gbnVtcy5pbmRleE9mKGMpID49IDApLnNvcnQoKCkgPT4gMC41IC0gTWF0aC5yYW5kb20oKSk7XG4gICAgICAgIHJldHVybiBjaGFycy5tYXAoKGMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNMb3dlckFscGhhID0gbG93ZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNVcHBlckFscGhhID0gdXBwZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNOdW0gPSBudW1zLmluZGV4T2YoYykgPj0gMDtcbiAgICAgICAgICBjb25zdCBjaGFyQ2xhc3MgPSBpc0xvd2VyQWxwaGEgPyBsb3dlckFscGhhIDogaXNVcHBlckFscGhhID8gdXBwZXJBbHBoYSA6IGlzTnVtID8gbnVtcyA6IG51bGw7XG4gICAgICAgICAgaWYgKCFjaGFyQ2xhc3MpIHJldHVybiBjO1xuICAgICAgICAgIGlmICh0eXBlID09PSBBbm9ueW1pemVEYXRhVHlwZS5QaG9uZSkge1xuICAgICAgICAgICAgLy8gIElmIHR5cGUgPSBwaG9uZSwgZG8gbm90IHRyYW5zZm9ybSBmaXJzdCAzIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGlmIChpbmRleCA8IEFub255bWl6ZURlZmF1bHRWYWx1ZXMuUGhvbmVDY0xlbmd0aCkgcmV0dXJuIGM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBuZXdDaGFyID0gaXNOdW0gPyBzaHVmZmxlZE51bXMucG9wKCkgOiBzaHVmZmxlZEFscGhhLnBvcCgpO1xuICAgICAgICAgIGlmIChpc1VwcGVyQWxwaGEpIG5ld0NoYXIgPSBuZXdDaGFyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgZWxzZSBpZiAoaXNMb3dlckFscGhhKSBuZXdDaGFyID0gbmV3Q2hhci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHJldHVybiBuZXdDaGFyO1xuICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZSB8fCAnJztcbiAgICB9XG4gIH1cblxufVxuIl19