UNPKG

ng-anonymize

Version:

Data anonymization library for Angular

75 lines 13.3 kB
import { __decorate } from "tslib"; import { Pipe } from '@angular/core'; import { AnonymizeDataType, AnonymizeDefaultValues, AnonymizeMethod, } from "../models/anonymize.models"; /* Predefined constants for text processing */ const ALPHABET = 'abcdefghijjklmnopqrstuvwyz'; const lowerAlpha = ALPHABET.split(''); const upperAlpha = ALPHABET.toUpperCase().split(''); const nums = '0123456789'.split(''); let AnonymizePipe = class AnonymizePipe { transform(value, method = AnonymizeMethod.Randomize, options) { if (!value) return ''; // Extract options or default const { type, mask = AnonymizeDefaultValues.MaskChar, bleed } = options || {}; switch (method) { case AnonymizeMethod.First: // Replace all but first bleed characters by mask return value.split('').map((c, index) => index < (bleed || AnonymizeDefaultValues.LeftReveal) ? c : mask).join(''); case AnonymizeMethod.Last: // Replace all but last bleed characters by mask return value.split('').map((c, index) => 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((c, index) => { const isLowerAlpha = lowerAlpha.indexOf(c) >= 0; const isUpperAlpha = upperAlpha.indexOf(c) >= 0; const isNum = nums.indexOf(c) >= 0; const 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 const chars = value.split(''); const shuffledAlpha = chars .filter(c => lowerAlpha.indexOf(c) >= 0 || upperAlpha.indexOf(c) >= 0).sort(() => 0.5 - Math.random()); const shuffledNums = chars .filter(c => nums.indexOf(c) >= 0).sort(() => 0.5 - Math.random()); return chars.map((c, index) => { const isLowerAlpha = lowerAlpha.indexOf(c) >= 0; const isUpperAlpha = upperAlpha.indexOf(c) >= 0; const isNum = nums.indexOf(c) >= 0; const 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; } let newChar = isNum ? shuffledNums.pop() : shuffledAlpha.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); export { AnonymizePipe }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5vbnltaXplLnBpcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1hbm9ueW1pemUvIiwic291cmNlcyI6WyJsaWIvcGlwZXMvYW5vbnltaXplLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGVBQWUsR0FFaEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyw4Q0FBOEM7QUFDOUMsTUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUM7QUFDOUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFNcEMsSUFBYSxhQUFhLEdBQTFCLE1BQWEsYUFBYTtJQUV4QixTQUFTLENBQUMsS0FBYSxFQUFFLFNBQTBCLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBOEI7UUFDMUcsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0Qiw4QkFBOEI7UUFDOUIsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBQyxHQUFHLE9BQTJCLElBQUksRUFBRSxDQUFDO1FBRWhHLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxlQUFlLENBQUMsS0FBSztnQkFDeEIsaURBQWlEO2dCQUNqRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLHNCQUFz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bXBvcnQge1BpcGUsIFBpcGVUcmFuc2Zvcm19IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBbm9ueW1pemVQaXBlT3B0aW9uc30gZnJvbSBcIi4vYW5vbnltaXplLnBpcGUubW9kZWxcIjtcbmltcG9ydCB7XG4gIEFub255bWl6ZURhdGFUeXBlLFxuICBBbm9ueW1pemVEZWZhdWx0VmFsdWVzLFxuICBBbm9ueW1pemVNZXRob2QsXG4gIEFub255bWl6ZU9wdGlvbnMsXG59IGZyb20gXCIuLi9tb2RlbHMvYW5vbnltaXplLm1vZGVsc1wiO1xuXG4vKiBQcmVkZWZpbmVkIGNvbnN0YW50cyBmb3IgdGV4dCBwcm9jZXNzaW5nICovXG5jb25zdCBBTFBIQUJFVCA9ICdhYmNkZWZnaGlqamtsbW5vcHFyc3R1dnd5eic7XG5jb25zdCBsb3dlckFscGhhID0gQUxQSEFCRVQuc3BsaXQoJycpO1xuY29uc3QgdXBwZXJBbHBoYSA9IEFMUEhBQkVULnRvVXBwZXJDYXNlKCkuc3BsaXQoJycpO1xuY29uc3QgbnVtcyA9ICcwMTIzNDU2Nzg5Jy5zcGxpdCgnJyk7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ2Fub255bWl6ZScsXG4gIHB1cmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgQW5vbnltaXplUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBtZXRob2Q6IEFub255bWl6ZU1ldGhvZCA9IEFub255bWl6ZU1ldGhvZC5SYW5kb21pemUsIG9wdGlvbnM/OiBBbm9ueW1pemVQaXBlT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIC8vICBFeHRyYWN0IG9wdGlvbnMgb3IgZGVmYXVsdFxuICAgIGNvbnN0IHt0eXBlLCBtYXNrID0gQW5vbnltaXplRGVmYXVsdFZhbHVlcy5NYXNrQ2hhciwgYmxlZWR9ID0gb3B0aW9ucyBhcyBBbm9ueW1pemVPcHRpb25zIHx8IHt9O1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgQW5vbnltaXplTWV0aG9kLkZpcnN0OlxuICAgICAgICAvLyBSZXBsYWNlIGFsbCBidXQgZmlyc3QgYmxlZWQgY2hhcmFjdGVycyBieSBtYXNrXG4gICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJykubWFwKChjLCBpbmRleCkgPT4gaW5kZXggPCAoYmxlZWQgfHwgQW5vbnltaXplRGVmYXVsdFZhbHVlcy5MZWZ0UmV2ZWFsKSA/IGMgOiBtYXNrKS5qb2luKCcnKTtcbiAgICAgIGNhc2UgQW5vbnltaXplTWV0aG9kLkxhc3Q6XG4gICAgICAgIC8vIFJlcGxhY2UgYWxsIGJ1dCBsYXN0ICBibGVlZCBjaGFyYWN0ZXJzIGJ5IG1hc2tcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5tYXAoKGMsIGluZGV4KSA9PiBpbmRleCA+PSB2YWx1ZS5sZW5ndGggLSAoYmxlZWQgfHwgQW5vbnltaXplRGVmYXVsdFZhbHVlcy5SaWdodFJldmVhbCkgPyBjIDogbWFzaykuam9pbignJyk7XG4gICAgICBjYXNlIEFub255bWl6ZU1ldGhvZC5SYW5kb21pemU6XG4gICAgICAgIC8vIFJlcGxhY2UgZWFjaCBjaGFyYWN0ZXIgd2l0aCByYW5kb20gdmFsdWUgb2Ygc2FtZSBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5tYXAoKGMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNMb3dlckFscGhhID0gbG93ZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNVcHBlckFscGhhID0gdXBwZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNOdW0gPSBudW1zLmluZGV4T2YoYykgPj0gMDtcbiAgICAgICAgICBjb25zdCBjaGFyQ2xhc3MgPSBpc0xvd2VyQWxwaGEgPyBsb3dlckFscGhhIDogaXNVcHBlckFscGhhID8gdXBwZXJBbHBoYSA6IGlzTnVtID8gbnVtcyA6IG51bGw7XG4gICAgICAgICAgaWYgKCFjaGFyQ2xhc3MpIHJldHVybiBjO1xuICAgICAgICAgIGlmICh0eXBlID09PSBBbm9ueW1pemVEYXRhVHlwZS5QaG9uZSkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgQW5vbnltaXplRGVmYXVsdFZhbHVlcy5QaG9uZUNjTGVuZ3RoKSByZXR1cm4gYztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNoYXJDbGFzc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyQ2xhc3MubGVuZ3RoKV07XG4gICAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgY2FzZSBBbm9ueW1pemVNZXRob2QuU2h1ZmZsZTpcbiAgICAgICAgLy8gU3dhcCBwb3NpdGlvbnMgb2YgYWxsIGNoYXJhY3RlcnMsIHByZXNlcnZpbmcgcG9zaXRpb24gb2Ygc2FtZSBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgICAgY29uc3QgY2hhcnMgPSB2YWx1ZS5zcGxpdCgnJyk7XG4gICAgICAgIGNvbnN0IHNodWZmbGVkQWxwaGEgPSBjaGFyc1xuICAgICAgICAgIC5maWx0ZXIoYyA9PiBsb3dlckFscGhhLmluZGV4T2YoYykgPj0gMCB8fCB1cHBlckFscGhhLmluZGV4T2YoYykgPj0gMCkuc29ydCgoKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgY29uc3Qgc2h1ZmZsZWROdW1zID0gY2hhcnNcbiAgICAgICAgICAuZmlsdGVyKGMgPT4gbnVtcy5pbmRleE9mKGMpID49IDApLnNvcnQoKCkgPT4gMC41IC0gTWF0aC5yYW5kb20oKSk7XG4gICAgICAgIHJldHVybiBjaGFycy5tYXAoKGMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNMb3dlckFscGhhID0gbG93ZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNVcHBlckFscGhhID0gdXBwZXJBbHBoYS5pbmRleE9mKGMpID49IDA7XG4gICAgICAgICAgY29uc3QgaXNOdW0gPSBudW1zLmluZGV4T2YoYykgPj0gMDtcbiAgICAgICAgICBjb25zdCBjaGFyQ2xhc3MgPSBpc0xvd2VyQWxwaGEgPyBsb3dlckFscGhhIDogaXNVcHBlckFscGhhID8gdXBwZXJBbHBoYSA6IGlzTnVtID8gbnVtcyA6IG51bGw7XG4gICAgICAgICAgaWYgKCFjaGFyQ2xhc3MpIHJldHVybiBjO1xuICAgICAgICAgIGlmICh0eXBlID09PSBBbm9ueW1pemVEYXRhVHlwZS5QaG9uZSkge1xuICAgICAgICAgICAgLy8gIElmIHR5cGUgPSBwaG9uZSwgZG8gbm90IHRyYW5zZm9ybSBmaXJzdCAzIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGlmIChpbmRleCA8IEFub255bWl6ZURlZmF1bHRWYWx1ZXMuUGhvbmVDY0xlbmd0aCkgcmV0dXJuIGM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBuZXdDaGFyID0gaXNOdW0gPyBzaHVmZmxlZE51bXMucG9wKCkgOiBzaHVmZmxlZEFscGhhLnBvcCgpO1xuICAgICAgICAgIGlmIChpc1VwcGVyQWxwaGEpIG5ld0NoYXIgPSBuZXdDaGFyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgZWxzZSBpZiAoaXNMb3dlckFscGhhKSBuZXdDaGFyID0gbmV3Q2hhci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHJldHVybiBuZXdDaGFyO1xuICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZSB8fCAnJztcbiAgICB9XG4gIH1cblxufVxuIl19