expression-language
Version:
Javascript implementation of symfony/expression-language
90 lines (89 loc) • 2.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.issetFn = exports.default = void 0;
var _ExpressionFunction = _interopRequireDefault(require("../ExpressionFunction"));
var _AbstractProvider = _interopRequireDefault(require("./AbstractProvider"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
class ArrayProvider extends _AbstractProvider.default {
getFunctions() {
return [issetFn];
}
}
exports.default = ArrayProvider;
const issetFn = exports.issetFn = new _ExpressionFunction.default('isset', function compiler(variable) {
return `isset(${variable})`;
}, function evaluator(values, variable) {
let baseName = "",
parts = [],
gathering = "",
gathered = "";
for (let i = 0; i < variable.length; i++) {
let char = variable[i];
if (char === "]") {
gathering = "";
parts.push({
type: 'array',
index: gathered.replace(/"/g, "").replace(/'/g, "")
});
gathered = "";
continue;
}
if (char === "[") {
gathering = "array";
gathered = "";
continue;
}
if (gathering === "object" && (!/[A-z0-9_]/.test(char) || i === variable.length - 1)) {
let lastChar = false;
if (i === variable.length - 1) {
gathered += char;
lastChar = true;
}
gathering = "";
parts.push({
type: 'object',
attribute: gathered
});
gathered = "";
if (lastChar) {
continue;
}
}
if (char === ".") {
gathering = "object";
gathered = "";
continue;
}
if (gathering) {
gathered += char;
} else {
baseName += char;
}
}
if (parts.length > 0) {
//console.log("Parts: ", parts);
if (values[baseName] !== undefined) {
let baseVar = values[baseName];
for (let part of parts) {
if (part.type === "array") {
if (baseVar[part.index] === undefined) {
return false;
}
baseVar = baseVar[part.index];
}
if (part.type === "object") {
if (baseVar[part.attribute] === undefined) {
return false;
}
baseVar = baseVar[part.attribute];
}
}
return true;
}
return false;
} else {
return values[baseName] !== undefined;
}
});