@qualifyze/airtable-formulator
Version:
Airtable Formula Manipulator
56 lines • 2.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.compile = void 0;
const schema_1 = require("./schema");
function compile(formula) {
const validationErrors = (0, schema_1.validate)(formula);
if (validationErrors.length > 0) {
throw new Error(`Error in validating formula notation: ${JSON.stringify(validationErrors, null, 2)}`);
}
return _compile(formula);
}
exports.compile = compile;
function _compileFieldReference({ field }) {
// XXX Airtable API does not support curly braces in fieldnames, even though fieldname can contain curly braces
if (field.includes("{") || field.includes("}")) {
throw new Error(`Invalid field name: '${field}'`);
}
return `{${field}}`;
}
function _compileBoolean(bool) {
return _compile([bool ? "TRUE" : "FALSE"], bool);
}
function _compileComposite(compositeOperation, parent) {
const [name, ...args] = compositeOperation;
const compiledArgs = args.map((arg) => _compile(arg, compositeOperation));
if ((0, schema_1.isFunctionName)(name)) {
return _compileFunctionCall([name, ...compiledArgs]);
}
return _compileOperation([name, ...compiledArgs], parent);
}
function _compileFunctionCall([name, ...args]) {
return `${name}(${args.join(",")})`;
}
function _compileOperation([op, ...args], parent) {
const operationString = args.join(op);
if (parent && (0, schema_1.isOperation)(parent)) {
return `(${operationString})`;
}
return operationString;
}
function _compile(formula, parent) {
switch (typeof formula) {
case "boolean":
return _compileBoolean(formula);
case "number":
return `${formula}`;
case "string":
return JSON.stringify(formula);
default:
if (Array.isArray(formula)) {
return _compileComposite(formula, parent);
}
return _compileFieldReference(formula);
}
}
//# sourceMappingURL=compiler.js.map