@qualifyze/airtable-formulator
Version:
Airtable Formula Manipulator
40 lines • 1.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parse = void 0;
const tokenize_1 = require("./tokenize");
const nodes_1 = require("./nodes");
function reduceGroups(reducer) {
// Using named function here as it makes debugging easier
function reduceGroups(nodes) {
return nodes.map((node) => (0, nodes_1.isGroupNode)(node)
? { ...node, members: reduceNodes(node.members) } ?? node
: node);
}
const reduceNodes = (0, nodes_1.composeReducers)(reduceGroups, reducer);
return reduceNodes;
}
const reduceNodes = reduceGroups((0, nodes_1.separateNodes)((0, nodes_1.eagerlyRepeat)((0, nodes_1.composeReducers)(nodes_1.reduceEnclosedExpressions, nodes_1.reduceFieldReferences, nodes_1.reduceFunctionReferences, nodes_1.reduceModifiers, nodes_1.reduceOperations, nodes_1.reduceArgumentLists, nodes_1.reduceFunctionCalls))));
/**
* Parses a formula string into an AST.
* @experimental This function is experimental, potentially unstable and may change in future versions.
* @param formula
* @param options
*/
function parse(formula, { removeSpace = false } = {}) {
const tokenGroup = (0, tokenize_1.tokenize)(formula);
const nodes = reduceNodes(tokenGroup.members);
const [expression = null, unexpectedNode] = (0, nodes_1.reduceSpaces)(nodes);
if (unexpectedNode) {
throw new Error((0, nodes_1.createNodeErrorMessage)(unexpectedNode, `Unexpected node ${unexpectedNode.type}`));
}
if (expression !== null && !(0, nodes_1.isExpressionNode)(expression)) {
throw new Error((0, nodes_1.createNodeErrorMessage)(expression, `Expected to find an expression, got ${expression.type} instead`));
}
if (expression && removeSpace) {
const [expressionWithoutSpaces] = reduceGroups(nodes_1.reduceSpaces)([expression]);
return expressionWithoutSpaces;
}
return expression;
}
exports.parse = parse;
//# sourceMappingURL=parse.js.map