UNPKG

@qualifyze/airtable-formulator

Version:
57 lines 2.81 kB
"use strict"; 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