@qualifyze/airtable-formulator
Version:
Airtable Formula Manipulator
43 lines • 2.04 kB
JavaScript
;
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