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