resume-anonymizer
Version:
A flexible NPM package for anonymizing resumes to reduce bias in hiring
65 lines (64 loc) • 2.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Replacer = void 0;
class Replacer {
constructor(pseudonymPatterns) {
this.pseudonymPatterns = pseudonymPatterns;
this.replacements = new Map();
this.counters = new Map();
this.changeLog = {};
}
getOrCreateReplacement(original, type) {
const key = `${type}:${original}`;
if (this.replacements.has(key)) {
return this.replacements.get(key);
}
const pattern = this.pseudonymPatterns[type] || `${type.charAt(0).toUpperCase() + type.slice(1)} <number>`;
const counter = this.counters.get(type) || 0;
this.counters.set(type, counter + 1);
let replacement;
if (pattern.includes('<number>')) {
replacement = pattern.replace('<number>', (counter + 1).toString());
}
else if (pattern.includes('<letter>')) {
replacement = pattern.replace('<letter>', String.fromCharCode(65 + counter));
}
else {
replacement = counter === 0 ? pattern : `${pattern} ${counter + 1}`;
}
this.replacements.set(key, replacement);
this.logChange(type, original, replacement);
return replacement;
}
logChange(type, original, replacement) {
switch (type) {
case 'name':
this.changeLog.name = { original, replacedWith: replacement };
break;
case 'company':
if (!this.changeLog.companies)
this.changeLog.companies = [];
this.changeLog.companies.push({ original, replacedWith: replacement });
break;
case 'person':
if (!this.changeLog.references)
this.changeLog.references = [];
this.changeLog.references.push({ original, replacedWith: replacement });
break;
case 'education':
if (!this.changeLog.educationInstitutions)
this.changeLog.educationInstitutions = [];
this.changeLog.educationInstitutions.push({ original, replacedWith: replacement });
break;
}
}
replaceInText(text, original, replacement) {
const escaped = original.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const regex = new RegExp(`\\b${escaped}\\b`, 'gi');
return text.replace(regex, replacement);
}
getAllReplacements() {
return new Map(this.replacements);
}
}
exports.Replacer = Replacer;