update
This commit is contained in:
parent
d9becc67b6
commit
9308795b8b
964 changed files with 104265 additions and 16 deletions
96
node_modules/fast-redact/lib/modifiers.js
generated
vendored
Normal file
96
node_modules/fast-redact/lib/modifiers.js
generated
vendored
Normal file
|
@ -0,0 +1,96 @@
|
|||
'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) {
|
||||
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] = isCensorFct ? censor(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, isCensorFct) {
|
||||
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, isCensorFct)
|
||||
|
||||
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, f) {
|
||||
var i = -1
|
||||
var l = p.length
|
||||
var li = l - 1
|
||||
var n
|
||||
var nv
|
||||
var ov
|
||||
var oov = null
|
||||
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]
|
||||
oov = ov
|
||||
if (!(k in n)) {
|
||||
exists = false
|
||||
break
|
||||
}
|
||||
ov = n[k]
|
||||
nv = f ? v(ov) : v
|
||||
nv = (i !== li) ? ov : nv
|
||||
n[k] = (has(n, k) && nv === ov) || (nv === undefined && v !== 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
|
||||
}
|
45
node_modules/fast-redact/lib/parse.js
generated
vendored
Normal file
45
node_modules/fast-redact/lib/parse.js
generated
vendored
Normal file
|
@ -0,0 +1,45 @@
|
|||
'use strict'
|
||||
|
||||
const rx = require('./rx')
|
||||
|
||||
module.exports = parse
|
||||
|
||||
function parse ({ paths }) {
|
||||
const wildcards = []
|
||||
var wcLen = 0
|
||||
const secret = paths.reduce(function (o, strPath, ix) {
|
||||
var path = strPath.match(rx).map((p) => p.replace(/'|"|`/g, ''))
|
||||
const leadingBracket = strPath[0] === '['
|
||||
path = path.map((p) => {
|
||||
if (p[0] === '[') return p.substr(1, p.length - 2)
|
||||
else return p
|
||||
})
|
||||
const star = path.indexOf('*')
|
||||
if (star > -1) {
|
||||
const before = path.slice(0, star)
|
||||
const beforeStr = before.join('.')
|
||||
const after = path.slice(star + 1, path.length)
|
||||
if (after.indexOf('*') > -1) throw Error('fast-redact – Only one wildcard per path is supported')
|
||||
const nested = after.length > 0
|
||||
wcLen++
|
||||
wildcards.push({
|
||||
before,
|
||||
beforeStr,
|
||||
after,
|
||||
nested
|
||||
})
|
||||
} else {
|
||||
o[strPath] = {
|
||||
path: path,
|
||||
val: undefined,
|
||||
precensored: false,
|
||||
circle: '',
|
||||
escPath: JSON.stringify(strPath),
|
||||
leadingBracket: leadingBracket
|
||||
}
|
||||
}
|
||||
return o
|
||||
}, {})
|
||||
|
||||
return { wildcards, wcLen, secret }
|
||||
}
|
94
node_modules/fast-redact/lib/redactor.js
generated
vendored
Normal file
94
node_modules/fast-redact/lib/redactor.js
generated
vendored
Normal file
|
@ -0,0 +1,94 @@
|
|||
'use strict'
|
||||
|
||||
const rx = require('./rx')
|
||||
|
||||
module.exports = redactor
|
||||
|
||||
function redactor ({ secret, serialize, wcLen, strict, isCensorFct }, state) {
|
||||
/* eslint-disable-next-line */
|
||||
const redact = Function('o', `
|
||||
if (typeof o !== 'object' || o == null) {
|
||||
${strictImpl(strict, serialize)}
|
||||
}
|
||||
const { censor, secret } = this
|
||||
${redactTmpl(secret, isCensorFct)}
|
||||
this.compileRestore()
|
||||
${dynamicRedactTmpl(wcLen > 0, isCensorFct)}
|
||||
${resultTmpl(serialize)}
|
||||
`).bind(state)
|
||||
|
||||
if (serialize === false) {
|
||||
redact.restore = (o) => state.restore(o)
|
||||
}
|
||||
|
||||
return redact
|
||||
}
|
||||
|
||||
function redactTmpl (secret, isCensorFct) {
|
||||
return Object.keys(secret).map((path) => {
|
||||
const { escPath, leadingBracket } = secret[path]
|
||||
const skip = leadingBracket ? 1 : 0
|
||||
const delim = leadingBracket ? '' : '.'
|
||||
const hops = []
|
||||
var match
|
||||
while ((match = rx.exec(path)) !== null) {
|
||||
const [ , ix ] = match
|
||||
const { index, input } = match
|
||||
if (index > skip) hops.push(input.substring(0, index - (ix ? 0 : 1)))
|
||||
}
|
||||
var existence = hops.map((p) => `o${delim}${p}`).join(' && ')
|
||||
if (existence.length === 0) existence += `o${delim}${path} != null`
|
||||
else existence += ` && o${delim}${path} != null`
|
||||
|
||||
const circularDetection = `
|
||||
switch (true) {
|
||||
${hops.reverse().map((p) => `
|
||||
case o${delim}${p} === censor:
|
||||
secret[${escPath}].circle = ${JSON.stringify(p)}
|
||||
break
|
||||
`).join('\n')}
|
||||
}
|
||||
`
|
||||
return `
|
||||
if (${existence}) {
|
||||
const val = o${delim}${path}
|
||||
if (val === censor) {
|
||||
secret[${escPath}].precensored = true
|
||||
} else {
|
||||
secret[${escPath}].val = val
|
||||
o${delim}${path} = ${isCensorFct ? 'censor(val)' : 'censor'}
|
||||
${circularDetection}
|
||||
}
|
||||
}
|
||||
`
|
||||
}).join('\n')
|
||||
}
|
||||
|
||||
function dynamicRedactTmpl (hasWildcards, isCensorFct) {
|
||||
return hasWildcards === true ? `
|
||||
{
|
||||
const { wildcards, wcLen, groupRedact, nestedRedact } = this
|
||||
for (var i = 0; i < wcLen; i++) {
|
||||
const { before, beforeStr, after, nested } = wildcards[i]
|
||||
if (nested === true) {
|
||||
secret[beforeStr] = secret[beforeStr] || []
|
||||
nestedRedact(secret[beforeStr], o, before, after, censor, ${isCensorFct})
|
||||
} else secret[beforeStr] = groupRedact(o, before, censor, ${isCensorFct})
|
||||
}
|
||||
}
|
||||
` : ''
|
||||
}
|
||||
|
||||
function resultTmpl (serialize) {
|
||||
return serialize === false ? `return o` : `
|
||||
var s = this.serialize(o)
|
||||
this.restore(o)
|
||||
return s
|
||||
`
|
||||
}
|
||||
|
||||
function strictImpl (strict, serialize) {
|
||||
return strict === true
|
||||
? `throw Error('fast-redact: primitives cannot be redacted')`
|
||||
: serialize === false ? `return o` : `return this.serialize(o)`
|
||||
}
|
71
node_modules/fast-redact/lib/restorer.js
generated
vendored
Normal file
71
node_modules/fast-redact/lib/restorer.js
generated
vendored
Normal file
|
@ -0,0 +1,71 @@
|
|||
'use strict'
|
||||
|
||||
const { groupRestore, nestedRestore } = require('./modifiers')
|
||||
|
||||
module.exports = restorer
|
||||
|
||||
function restorer ({ secret, wcLen }) {
|
||||
return function compileRestore () {
|
||||
if (this.restore) return
|
||||
const paths = Object.keys(secret)
|
||||
.filter((path) => secret[path].precensored === false)
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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('')
|
||||
}
|
||||
|
||||
function restoreTmpl (resetters, paths, hasWildcards) {
|
||||
const dynamicReset = hasWildcards === true ? `
|
||||
const keys = Object.keys(secret)
|
||||
const len = keys.length
|
||||
for (var i = ${paths.length}; i < len; i++) {
|
||||
const k = keys[i]
|
||||
const o = secret[k]
|
||||
if (o.flat === true) this.groupRestore(o)
|
||||
else this.nestedRestore(o)
|
||||
secret[k] = null
|
||||
}
|
||||
` : ''
|
||||
|
||||
return `
|
||||
const secret = this.secret
|
||||
${resetters}
|
||||
${dynamicReset}
|
||||
return o
|
||||
`
|
||||
}
|
3
node_modules/fast-redact/lib/rx.js
generated
vendored
Normal file
3
node_modules/fast-redact/lib/rx.js
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
'use strict'
|
||||
|
||||
module.exports = /[^.[\]]+|\[((?:.)*?)\]/g
|
22
node_modules/fast-redact/lib/state.js
generated
vendored
Normal file
22
node_modules/fast-redact/lib/state.js
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
'use strict'
|
||||
|
||||
module.exports = state
|
||||
|
||||
function state (o) {
|
||||
const {
|
||||
secret,
|
||||
censor,
|
||||
isCensorFct,
|
||||
compileRestore,
|
||||
serialize,
|
||||
groupRedact,
|
||||
nestedRedact,
|
||||
wildcards,
|
||||
wcLen
|
||||
} = o
|
||||
const builder = [{ secret, censor, isCensorFct, compileRestore }]
|
||||
builder.push({ secret })
|
||||
if (serialize !== false) builder.push({ serialize })
|
||||
if (wcLen > 0) builder.push({ groupRedact, nestedRedact, wildcards, wcLen })
|
||||
return Object.assign(...builder)
|
||||
}
|
38
node_modules/fast-redact/lib/validator.js
generated
vendored
Normal file
38
node_modules/fast-redact/lib/validator.js
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
|||
'use strict'
|
||||
|
||||
const { createContext, runInContext } = require('vm')
|
||||
|
||||
module.exports = validator
|
||||
|
||||
function validator (opts = {}) {
|
||||
const {
|
||||
ERR_PATHS_MUST_BE_STRINGS = () => 'fast-redact - Paths must be strings',
|
||||
ERR_INVALID_PATH = (s) => `fast-redact – Invalid path (${s})`
|
||||
} = opts
|
||||
|
||||
return function validate ({ paths }) {
|
||||
paths.forEach((s) => {
|
||||
if (typeof s !== 'string') {
|
||||
throw Error(ERR_PATHS_MUST_BE_STRINGS())
|
||||
}
|
||||
try {
|
||||
if (/〇/.test(s)) throw Error()
|
||||
const proxy = new Proxy({}, { get: () => proxy, set: () => { throw Error() } })
|
||||
const expr = (s[0] === '[' ? '' : '.') + s.replace(/^\*/, '〇').replace(/\.\*/g, '.〇').replace(/\[\*\]/g, '[〇]')
|
||||
if (/\n|\r|;/.test(expr)) throw Error()
|
||||
if (/\/\*/.test(expr)) throw Error()
|
||||
runInContext(`
|
||||
(function () {
|
||||
'use strict'
|
||||
o${expr}
|
||||
if ([o${expr}].length !== 1) throw Error()
|
||||
})()
|
||||
`, createContext({ o: proxy, 〇: null }), {
|
||||
codeGeneration: { strings: false, wasm: false }
|
||||
})
|
||||
} catch (e) {
|
||||
throw Error(ERR_INVALID_PATH(s))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue