UNPKG

@qualifyze/airtable-formulator

Version:
43 lines 2.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reduceFunctionReferences = exports.isFunctionReference = void 0; const primitives_1 = require("./primitives"); const argument_list_1 = require("./argument-list"); const functionReferenceType = "functionReference"; function isFunctionReferenceType(type) { return type === functionReferenceType; } function isFunctionReference(node) { return isFunctionReferenceType(node.type); } exports.isFunctionReference = isFunctionReference; function createFunctionReference(node) { if (!(0, primitives_1.isReference)(node)) { // Sanity check throw new Error((0, primitives_1.createNodeErrorMessage)(node, `expected reference type as a source for function reference, but got ${node.type}`, "Internal")); } return { ...node, type: functionReferenceType, }; } const reduceFunctionReferences = ([...nodes]) => { const meaningfulNodes = (0, primitives_1.filterMeaningfulNodes)(nodes); // Function name does not have spaces and thus cannot be enclosed by braces. const references = meaningfulNodes .filter(primitives_1.isReference) .filter((node) => !(0, primitives_1.isEnclosedNode)(node)); // A function reference must have an operator, argumentSeparator or nothing before it // and an argument list after it. const applicableReferences = new WeakSet(references.filter((reference) => { const index = meaningfulNodes.indexOf(reference); const previous = meaningfulNodes[index - 1]; const next = meaningfulNodes[index + 1]; return ((!previous || (0, primitives_1.isOperator)(previous) || (0, primitives_1.isArgumentSeparator)(previous)) && next && (0, argument_list_1.isArgumentListNode)(next)); })); return nodes.map((node) => applicableReferences.has(node) ? createFunctionReference(node) : node); }; exports.reduceFunctionReferences = reduceFunctionReferences; //# sourceMappingURL=function-reference.js.map