Spaces:
Runtime error
Runtime error
| const { groupRestore, nestedRestore } = require('./modifiers') | |
| module.exports = restorer | |
| function restorer () { | |
| return function compileRestore () { | |
| if (this.restore) { | |
| this.restore.state.secret = this.secret | |
| return | |
| } | |
| const { secret, wcLen } = this | |
| const paths = Object.keys(secret) | |
| const resetters = resetTmpl(secret, paths) | |
| const hasWildcards = wcLen > 0 | |
| const state = hasWildcards ? { secret, groupRestore, nestedRestore } : { secret } | |
| /* eslint-disable-next-line */ | |
| this.restore = Function( | |
| 'o', | |
| restoreTmpl(resetters, paths, hasWildcards) | |
| ).bind(state) | |
| this.restore.state = state | |
| } | |
| } | |
| /** | |
| * Mutates the original object to be censored by restoring its original values | |
| * prior to censoring. | |
| * | |
| * @param {object} secret Compiled object describing which target fields should | |
| * be censored and the field states. | |
| * @param {string[]} paths The list of paths to censor as provided at | |
| * initialization time. | |
| * | |
| * @returns {string} String of JavaScript to be used by `Function()`. The | |
| * string compiles to the function that does the work in the description. | |
| */ | |
| function resetTmpl (secret, paths) { | |
| return paths.map((path) => { | |
| const { circle, escPath, leadingBracket } = secret[path] | |
| const delim = leadingBracket ? '' : '.' | |
| const reset = circle | |
| ? `o.${circle} = secret[${escPath}].val` | |
| : `o${delim}${path} = secret[${escPath}].val` | |
| const clear = `secret[${escPath}].val = undefined` | |
| return ` | |
| if (secret[${escPath}].val !== undefined) { | |
| try { ${reset} } catch (e) {} | |
| ${clear} | |
| } | |
| ` | |
| }).join('') | |
| } | |
| /** | |
| * Creates the body of the restore function | |
| * | |
| * Restoration of the redacted object happens | |
| * backwards, in reverse order of redactions, | |
| * so that repeated redactions on the same object | |
| * property can be eventually rolled back to the | |
| * original value. | |
| * | |
| * This way dynamic redactions are restored first, | |
| * starting from the last one working backwards and | |
| * followed by the static ones. | |
| * | |
| * @returns {string} the body of the restore function | |
| */ | |
| function restoreTmpl (resetters, paths, hasWildcards) { | |
| const dynamicReset = hasWildcards === true ? ` | |
| const keys = Object.keys(secret) | |
| const len = keys.length | |
| for (var i = len - 1; i >= ${paths.length}; i--) { | |
| const k = keys[i] | |
| const o = secret[k] | |
| if (o) { | |
| if (o.flat === true) this.groupRestore(o) | |
| else this.nestedRestore(o) | |
| secret[k] = null | |
| } | |
| } | |
| ` : '' | |
| return ` | |
| const secret = this.secret | |
| ${dynamicReset} | |
| ${resetters} | |
| return o | |
| ` | |
| } | |