Files
calendar/packages/lib/raqb/evaluateRaqbLogic.ts
T

60 lines
1.7 KiB
TypeScript

"use client";
import { Utils as QbUtils, type JsonTree } from "react-awesome-query-builder";
import { safeStringify } from "@calcom/lib/safeStringify";
import jsonLogic from "./jsonLogic";
export const enum RaqbLogicResult {
MATCH = "MATCH",
NO_MATCH = "NO_MATCH",
LOGIC_NOT_FOUND_SO_MATCHED = "LOGIC_NOT_FOUND_SO_MATCHED",
}
export const evaluateRaqbLogic = (
{
queryValue,
queryBuilderConfig,
data,
beStrictWithEmptyLogic = false,
}: {
queryValue: JsonTree;
queryBuilderConfig: any;
data: Record<string, unknown>;
beStrictWithEmptyLogic?: boolean;
},
config: {
// 2 - Error/Warning
// 1 - Info
// 0 - Debug
logLevel: 0 | 1 | 2;
} = {
logLevel: 1,
}
): RaqbLogicResult => {
const state = {
tree: QbUtils.checkTree(QbUtils.loadTree(queryValue), queryBuilderConfig),
config: queryBuilderConfig,
};
const jsonLogicQuery = QbUtils.jsonLogicFormat(state.tree, state.config);
const logic = jsonLogicQuery.logic;
if (!logic) {
if (beStrictWithEmptyLogic && queryValue.children1 && Object.keys(queryValue.children1).length > 0) {
throw new Error("Couldn't build the logic from the query value");
}
console.log(
"No logic found",
safeStringify({ queryValue, queryBuilderConfigFields: queryBuilderConfig.fields })
);
// If no logic is provided, then consider it a match
return RaqbLogicResult.LOGIC_NOT_FOUND_SO_MATCHED;
}
if (config.logLevel >= 1) {
console.log("Checking logic with data", safeStringify({ logic, data }));
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return !!jsonLogic.apply(logic as any, data) ? RaqbLogicResult.MATCH : RaqbLogicResult.NO_MATCH;
};