You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.4 KiB
JavaScript
68 lines
1.4 KiB
JavaScript
var { Cache, normalizePath, split, forEach } = require('./')
|
|
|
|
var setCache = new Cache(512),
|
|
getCache = new Cache(512)
|
|
|
|
function makeSafe(path, param) {
|
|
var result = param,
|
|
parts = split(path),
|
|
isLast
|
|
|
|
forEach(parts, function (part, isBracket, isArray, idx, parts) {
|
|
isLast = idx === parts.length - 1
|
|
|
|
part = isBracket || isArray ? '[' + part + ']' : '.' + part
|
|
|
|
result += part + (!isLast ? ' || {})' : ')')
|
|
})
|
|
|
|
return new Array(parts.length + 1).join('(') + result
|
|
}
|
|
|
|
function expr(expression, safe, param) {
|
|
expression = expression || ''
|
|
|
|
if (typeof safe === 'string') {
|
|
param = safe
|
|
safe = false
|
|
}
|
|
|
|
param = param || 'data'
|
|
|
|
if (expression && expression.charAt(0) !== '[') expression = '.' + expression
|
|
|
|
return safe ? makeSafe(expression, param) : param + expression
|
|
}
|
|
|
|
module.exports = {
|
|
expr,
|
|
setter: function (path) {
|
|
if (
|
|
path.indexOf('__proto__') !== -1 ||
|
|
path.indexOf('constructor') !== -1 ||
|
|
path.indexOf('prototype') !== -1
|
|
) {
|
|
return (obj) => obj
|
|
}
|
|
|
|
return (
|
|
setCache.get(path) ||
|
|
setCache.set(
|
|
path,
|
|
new Function('data, value', expr(path, 'data') + ' = value')
|
|
)
|
|
)
|
|
},
|
|
|
|
getter: function (path, safe) {
|
|
var key = path + '_' + safe
|
|
return (
|
|
getCache.get(key) ||
|
|
getCache.set(
|
|
key,
|
|
new Function('data', 'return ' + expr(path, safe, 'data'))
|
|
)
|
|
)
|
|
},
|
|
}
|