You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
| /* eslint-env node */
 | |
| 
 | |
| const Path = require('path');
 | |
| 
 | |
| const compose = require('lodash/fp/compose');
 | |
| const escapeRegExp = require('lodash/escapeRegExp');
 | |
| const isRegExp = require('lodash/isRegExp');
 | |
| const isString = require('lodash/isString');
 | |
| 
 | |
| 
 | |
| const PHONE_NUMBER_PATTERN = /\+\d{7,12}(\d{3})/g;
 | |
| const GROUP_ID_PATTERN = /(group\()([^)]+)(\))/g;
 | |
| 
 | |
| const APP_ROOT_PATH = Path.join(__dirname, '..', '..', '..');
 | |
| const APP_ROOT_PATH_PATTERN = (() => {
 | |
|   try {
 | |
|     // Safe `String::replaceAll`:
 | |
|     // https://github.com/lodash/lodash/issues/1084#issuecomment-86698786
 | |
|     return new RegExp(escapeRegExp(APP_ROOT_PATH), 'g');
 | |
|   } catch (error) {
 | |
|     return null;
 | |
|   }
 | |
| })();
 | |
| 
 | |
| const REDACTION_PLACEHOLDER = '[REDACTED]';
 | |
| 
 | |
| //      redactPhoneNumbers :: String -> String
 | |
| exports.redactPhoneNumbers = (text) => {
 | |
|   if (!isString(text)) {
 | |
|     throw new TypeError('`text` must be a string');
 | |
|   }
 | |
| 
 | |
|   return text.replace(PHONE_NUMBER_PATTERN, `+${REDACTION_PLACEHOLDER}$1`);
 | |
| };
 | |
| 
 | |
| //      redactGroupIds :: String -> String
 | |
| exports.redactGroupIds = (text) => {
 | |
|   if (!isString(text)) {
 | |
|     throw new TypeError('`text` must be a string');
 | |
|   }
 | |
| 
 | |
|   return text.replace(
 | |
|     GROUP_ID_PATTERN,
 | |
|     (match, before, id, after) =>
 | |
|       `${before}${REDACTION_PLACEHOLDER}${id.slice(-3)}${after}`
 | |
|   );
 | |
| };
 | |
| 
 | |
| //      redactSensitivePaths :: String -> String
 | |
| exports.redactSensitivePaths = (text) => {
 | |
|   if (!isString(text)) {
 | |
|     throw new TypeError('`text` must be a string');
 | |
|   }
 | |
| 
 | |
|   if (!isRegExp(APP_ROOT_PATH_PATTERN)) {
 | |
|     return text;
 | |
|   }
 | |
| 
 | |
|   return text.replace(APP_ROOT_PATH_PATTERN, REDACTION_PLACEHOLDER);
 | |
| };
 | |
| 
 | |
| //      redactAll :: String -> String
 | |
| exports.redactAll = compose(
 | |
|   exports.redactSensitivePaths,
 | |
|   exports.redactGroupIds,
 | |
|   exports.redactPhoneNumbers
 | |
| );
 |