You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					171 lines
				
				4.5 KiB
			
		
		
			
		
	
	
					171 lines
				
				4.5 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | module.exports = { | ||
|  |   groupRedact, | ||
|  |   groupRestore, | ||
|  |   nestedRedact, | ||
|  |   nestedRestore | ||
|  | } | ||
|  | 
 | ||
|  | function groupRestore ({ keys, values, target }) { | ||
|  |   if (target == null) return | ||
|  |   const length = keys.length | ||
|  |   for (var i = 0; i < length; i++) { | ||
|  |     const k = keys[i] | ||
|  |     target[k] = values[i] | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function groupRedact (o, path, censor, isCensorFct, censorFctTakesPath) { | ||
|  |   const target = get(o, path) | ||
|  |   if (target == null) return { keys: null, values: null, target: null, flat: true } | ||
|  |   const keys = Object.keys(target) | ||
|  |   const keysLength = keys.length | ||
|  |   const pathLength = path.length | ||
|  |   const pathWithKey = censorFctTakesPath ? [...path] : undefined | ||
|  |   const values = new Array(keysLength) | ||
|  | 
 | ||
|  |   for (var i = 0; i < keysLength; i++) { | ||
|  |     const key = keys[i] | ||
|  |     values[i] = target[key] | ||
|  | 
 | ||
|  |     if (censorFctTakesPath) { | ||
|  |       pathWithKey[pathLength] = key | ||
|  |       target[key] = censor(target[key], pathWithKey) | ||
|  |     } else if (isCensorFct) { | ||
|  |       target[key] = censor(target[key]) | ||
|  |     } else { | ||
|  |       target[key] = censor | ||
|  |     } | ||
|  |   } | ||
|  |   return { keys, values, target, flat: true } | ||
|  | } | ||
|  | 
 | ||
|  | function nestedRestore (arr) { | ||
|  |   const length = arr.length | ||
|  |   for (var i = 0; i < length; i++) { | ||
|  |     const { key, target, value } = arr[i] | ||
|  |     if (has(target, key)) { | ||
|  |       target[key] = value | ||
|  |     } | ||
|  |     /* istanbul ignore else */ | ||
|  |     if (typeof target === 'object') { | ||
|  |       const targetKeys = Object.keys(target) | ||
|  |       for (var j = 0; j < targetKeys.length; j++) { | ||
|  |         const tKey = targetKeys[j] | ||
|  |         const subTarget = target[tKey] | ||
|  |         if (has(subTarget, key)) { | ||
|  |           subTarget[key] = value | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function nestedRedact (store, o, path, ns, censor, isCensorFct, censorFctTakesPath) { | ||
|  |   const target = get(o, path) | ||
|  |   if (target == null) return | ||
|  |   const keys = Object.keys(target) | ||
|  |   const keysLength = keys.length | ||
|  |   for (var i = 0; i < keysLength; i++) { | ||
|  |     const key = keys[i] | ||
|  |     const { value, parent, exists } = | ||
|  |       specialSet(target, key, path, ns, censor, isCensorFct, censorFctTakesPath) | ||
|  | 
 | ||
|  |     if (exists === true && parent !== null) { | ||
|  |       store.push({ key: ns[ns.length - 1], target: parent, value }) | ||
|  |     } | ||
|  |   } | ||
|  |   return store | ||
|  | } | ||
|  | 
 | ||
|  | function has (obj, prop) { | ||
|  |   return obj !== undefined && obj !== null | ||
|  |     ? ('hasOwn' in Object ? Object.hasOwn(obj, prop) : Object.prototype.hasOwnProperty.call(obj, prop)) | ||
|  |     : false | ||
|  | } | ||
|  | 
 | ||
|  | function specialSet (o, k, path, afterPath, censor, isCensorFct, censorFctTakesPath) { | ||
|  |   const afterPathLen = afterPath.length | ||
|  |   const lastPathIndex = afterPathLen - 1 | ||
|  |   const originalKey = k | ||
|  |   var i = -1 | ||
|  |   var n | ||
|  |   var nv | ||
|  |   var ov | ||
|  |   var oov = null | ||
|  |   var exists = true | ||
|  |   var wc = null | ||
|  |   ov = n = o[k] | ||
|  |   if (typeof n !== 'object') return { value: null, parent: null, exists } | ||
|  |   while (n != null && ++i < afterPathLen) { | ||
|  |     k = afterPath[i] | ||
|  |     oov = ov | ||
|  |     if (k !== '*' && !wc && !(typeof n === 'object' && k in n)) { | ||
|  |       exists = false | ||
|  |       break | ||
|  |     } | ||
|  |     if (k === '*') { | ||
|  |       wc = k | ||
|  |       if (i !== lastPathIndex) { | ||
|  |         continue | ||
|  |       } | ||
|  |     } | ||
|  |     if (wc) { | ||
|  |       const wcKeys = Object.keys(n) | ||
|  |       for (var j = 0; j < wcKeys.length; j++) { | ||
|  |         const wck = wcKeys[j] | ||
|  |         const wcov = n[wck] | ||
|  |         const kIsWc = k === '*' | ||
|  |         if (kIsWc || (typeof wcov === 'object' && wcov !== null && k in wcov)) { | ||
|  |           if (kIsWc) { | ||
|  |             ov = wcov | ||
|  |           } else { | ||
|  |             ov = wcov[k] | ||
|  |           } | ||
|  |           nv = (i !== lastPathIndex) | ||
|  |             ? ov | ||
|  |             : (isCensorFct | ||
|  |               ? (censorFctTakesPath ? censor(ov, [...path, originalKey, ...afterPath]) : censor(ov)) | ||
|  |               : censor) | ||
|  |           if (kIsWc) { | ||
|  |             n[wck] = nv | ||
|  |           } else { | ||
|  |             if (wcov[k] === nv) { | ||
|  |               exists = false | ||
|  |             } else { | ||
|  |               wcov[k] = (nv === undefined && censor !== undefined) || (has(wcov, k) && nv === ov) ? wcov[k] : nv | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |       wc = null | ||
|  |     } else { | ||
|  |       ov = n[k] | ||
|  |       nv = (i !== lastPathIndex) | ||
|  |         ? ov | ||
|  |         : (isCensorFct | ||
|  |           ? (censorFctTakesPath ? censor(ov, [...path, originalKey, ...afterPath]) : censor(ov)) | ||
|  |           : censor) | ||
|  |       n[k] = (has(n, k) && nv === ov) || (nv === undefined && censor !== undefined) ? n[k] : nv | ||
|  |       n = n[k] | ||
|  |     } | ||
|  |     if (typeof n !== 'object') break | ||
|  |     // prevent circular structure, see https://github.com/pinojs/pino/issues/1513
 | ||
|  |     if (ov === oov) { | ||
|  |       exists = false | ||
|  |     } | ||
|  |   } | ||
|  |   return { value: ov, parent: oov, exists } | ||
|  | } | ||
|  | 
 | ||
|  | function get (o, p) { | ||
|  |   var i = -1 | ||
|  |   var l = p.length | ||
|  |   var n = o | ||
|  |   while (n != null && ++i < l) { | ||
|  |     n = n[p[i]] | ||
|  |   } | ||
|  |   return n | ||
|  | } |