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
						
					
					
				| '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
 | |
| }
 |