@qualifyze/airtable-formulator
Version:
Airtable Formula Manipulator
40 lines • 1.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.reduceFieldReferences = exports.isFieldReference = void 0;
const primitives_1 = require("./primitives");
const fieldReferenceType = "fieldReference";
function isFieldReferenceType(type) {
return type === fieldReferenceType;
}
function isFieldReference(node) {
return isFieldReferenceType(node.type);
}
exports.isFieldReference = isFieldReference;
function createFieldReference(node) {
if (!(0, primitives_1.isReference)(node)) {
// Sanity check
throw new Error((0, primitives_1.createNodeErrorMessage)(node, `expected reference type, but got ${node.type}`, "Internal"));
}
return {
...node,
type: fieldReferenceType,
};
}
function isValidNeighbour(node) {
return (0, primitives_1.isOperator)(node) || (0, primitives_1.isArgumentSeparator)(node);
}
const reduceFieldReferences = ([...nodes]) => {
const meaningfulNodes = (0, primitives_1.filterMeaningfulNodes)(nodes);
const references = meaningfulNodes.filter(primitives_1.isReference);
// A field reference can only be adjacent to operators or argument separators
const applicableReferences = new WeakSet(references.filter((reference) => {
const index = meaningfulNodes.indexOf(reference);
const previous = meaningfulNodes[index - 1];
const next = meaningfulNodes[index + 1];
return ((!previous || isValidNeighbour(previous)) &&
(!next || isValidNeighbour(next)));
}));
return nodes.map((node) => applicableReferences.has(node) ? createFieldReference(node) : node);
};
exports.reduceFieldReferences = reduceFieldReferences;
//# sourceMappingURL=field-reference.js.map