@qualifyze/airtable-formulator
Version:
Airtable Formula Manipulator
57 lines • 2.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.reduceEnclosedExpressions = exports.isEnclosedExpressionNode = void 0;
const primitives_1 = require("./primitives");
const expression_1 = require("./expression");
const utils_1 = require("./utils");
const primitives_2 = require("./primitives");
function isEnclosedExpressionNodeMember(node) {
return (0, expression_1.isExpressionNode)(node) || (0, primitives_1.isSpace)(node);
}
function isEnclosedExpressionNode(node) {
const { expression } = node;
return ((0, primitives_1.isEnclosedWithParenthesis)(node) &&
(0, utils_1.checkArray)(node.members, isEnclosedExpressionNodeMember) &&
(0, primitives_1.isNode)(expression) &&
(0, expression_1.isExpressionNode)(expression));
}
exports.isEnclosedExpressionNode = isEnclosedExpressionNode;
function createEnclosedExpression(group) {
const [expression, badExpression] = group.members.filter(expression_1.isExpressionNode) || [];
const enclosedExpression = {
...(0, primitives_1.createEnclosedGroup)("enclosedExpression", group.members, group.opener, group.closer),
expression,
};
if (!expression || !(0, expression_1.isExpressionNode)(expression)) {
throw new Error((0, primitives_1.createNodeErrorMessage)(enclosedExpression, "Expected an expression inside parentheses"));
}
if (badExpression) {
throw new Error((0, primitives_1.createNodeErrorMessage)(badExpression, "Unexpected expression inside parentheses"));
}
if (!isEnclosedExpressionNode(enclosedExpression)) {
throw new Error((0, primitives_1.createNodeErrorMessage)(enclosedExpression, "Invalid Enclosed expression"));
}
return enclosedExpression;
}
function enclosesSingleExpression(group) {
return group.members.filter(expression_1.isExpressionNode).length === 1;
}
const reduceEnclosedExpressions = ([...nodes]) => {
const meaningfulNodes = (0, primitives_1.filterMeaningfulNodes)(nodes);
const enclosedExpressionGroups = meaningfulNodes
.filter((node) => node.type === "group")
.filter(primitives_1.isEnclosedWithParenthesis)
.filter(enclosesSingleExpression)
.filter((enclosedExpressionGroup) => {
const index = meaningfulNodes.indexOf(enclosedExpressionGroup);
const previous = meaningfulNodes[index - 1];
return !previous || !(0, primitives_2.isReference)(previous);
});
enclosedExpressionGroups.forEach((enclosedExpressionGroup) => {
const index = nodes.indexOf(enclosedExpressionGroup);
nodes.splice(index, 1, createEnclosedExpression(enclosedExpressionGroup));
});
return nodes;
};
exports.reduceEnclosedExpressions = reduceEnclosedExpressions;
//# sourceMappingURL=enclosed-expression.js.map