All files / fast-redact/lib modifiers.js

100% Statements 61/61
100% Branches 27/27
100% Functions 7/7
100% Lines 56/56

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97    1x               6x 5x 5x 11x 11x         24x 24x 23x 23x 23x 23x 51x 51x 51x   23x       7x 7x 13x 13x         25x 25x 24x 24x 24x 41x 41x   41x 28x     24x       36x       41x 41x 41x         41x 41x 41x 32x 40x 40x 40x 40x 4x 4x   36x 36x 36x 36x 36x   32x     49x 49x 49x 49x 87x   49x    
'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) {
  const target = get(o, path)
  if (target == null) return {keys: null, values: null, target: null, flat: true}
  const keys = Object.keys(target)
  const length = keys.length
  const values = new Array(length)
  for (var i = 0; i < length; i++) {
    const k = keys[i]
    values[i] = target[k]
    target[k] = 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]
    target[key] = value
  }
}
 
function nestedRedact (store, o, path, ns, censor) {
  const target = get(o, path)
  if (target == null) return
  const keys = Object.keys(target)
  const length = keys.length
  for (var i = 0; i < length; i++) {
    const key = keys[i]
    const { value, parent, exists } = specialSet(target, key, ns, censor)
 
    if (exists === true && parent !== null) {
      store.push({key: ns[ns.length - 1], target: parent, value})
    }
  }
  return store
}
 
function has (obj, prop) {
  return Object.prototype.hasOwnProperty.call(obj, prop)
}
 
function specialSet (o, k, p, v) {
  var i = -1
  var l = p.length
  var li = l - 1
  var n
  var nv
  var ov
  var oov
  var exists = true
  ov = n = o[k]
  if (typeof n !== 'object') return {value: null, parent: null, exists}
  while (n != null && ++i < l) {
    k = p[i]
    nv = v
    oov = ov
    if (!(k in n)) {
      exists = false
      break
    }
    ov = n[k]
    nv = (i !== li) ? ov : nv
    n[k] = (has(n, k) && nv === ov) || typeof nv === 'undefined' ? n[k] : nv
    n = n[k]
    if (typeof n !== 'object') break
  }
  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
}