ng-anonymize
Version:
Data anonymization library for Angular
159 lines (151 loc) • 6.43 kB
JavaScript
import { __decorate } from 'tslib';
import { Pipe, ɵɵdefineInjectable, Injectable, NgModule } from '@angular/core';
/* Default settings exported for internal only
Todo: allow consumer to query or set these
*/
var AnonymizeDefaultValues = {
PhoneCcLength: 3,
MaskChar: '*',
LeftReveal: 3,
RightReveal: 4
};
/* List of implemented anonymization methods.
For more details, see documentation
*/
var AnonymizeMethod;
(function (AnonymizeMethod) {
AnonymizeMethod["Randomize"] = "randomize";
AnonymizeMethod["Shuffle"] = "shuffle";
AnonymizeMethod["First"] = "first";
AnonymizeMethod["Last"] = "last"; // Reveal only x last characters
})(AnonymizeMethod || (AnonymizeMethod = {}));
/* Method metadata for internal use only
*/
var AnonymizeMethods = [
{
name: AnonymizeMethod.Randomize,
label: 'Randomize'
},
{
name: AnonymizeMethod.Shuffle,
label: 'Shuffle'
},
{
name: AnonymizeMethod.First,
label: 'First'
},
{
name: AnonymizeMethod.Last,
label: 'Last'
},
];
var AnonymizeDataType;
(function (AnonymizeDataType) {
AnonymizeDataType["Phone"] = "phone";
})(AnonymizeDataType || (AnonymizeDataType = {}));
/* 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;
}());
/* TODO: expose services for consumer */
var NgAnonymizeService = /** @class */ (function () {
function NgAnonymizeService() {
}
NgAnonymizeService.ɵprov = ɵɵdefineInjectable({ factory: function NgAnonymizeService_Factory() { return new NgAnonymizeService(); }, token: NgAnonymizeService, providedIn: "root" });
NgAnonymizeService = __decorate([
Injectable({
providedIn: 'root'
})
], NgAnonymizeService);
return NgAnonymizeService;
}());
var NgAnonymizeModule = /** @class */ (function () {
function NgAnonymizeModule() {
}
NgAnonymizeModule = __decorate([
NgModule({
declarations: [AnonymizePipe],
imports: [],
exports: [AnonymizePipe]
})
], NgAnonymizeModule);
return NgAnonymizeModule;
}());
/*
* Public API Surface of ng-anonymize
*/
/**
* Generated bundle index. Do not edit.
*/
export { AnonymizeDataType, AnonymizeDefaultValues, AnonymizeMethod, AnonymizeMethods, AnonymizePipe, NgAnonymizeModule, NgAnonymizeService };
//# sourceMappingURL=ng-anonymize.js.map