28ff809739
* feat: add startsWith operator to routing forms - Implement startsWith operator in BasicConfig.ts for RAQB - Add custom JsonLogic operation for startsWith evaluation - Add startsWith support to jsonLogicToPrisma for reporting - Supports both form field response routing and attribute routing - Uses case-insensitive matching via normalize function Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com> * test: add comprehensive unit tests for startsWith operator - Add tests for operator availability in FormFieldsBaseConfig and AttributesBaseConfig - Add tests for JsonLogic configuration validation - Add tests for text widget operator integration - All 15 tests pass including new startsWith operator tests Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com> * test: move startsWith operator tests to jsonLogic.test.ts - Add comprehensive startsWith tests to packages/lib/raqb/jsonLogic.test.ts - Remove startsWith tests from packages/app-store/routing-forms/__tests__/config.test.ts - Tests verify case-insensitive matching, edge cases, and falsy value handling - All tests pass: jsonLogic.test.ts (18 passed) and config.test.ts (12 passed) Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com> * refactor: remove unused startsWith operator from jsonLogicToPrisma.ts - Remove startsWith entry from OPERATOR_MAP in jsonLogicToPrisma.ts - File is currently unused so this cleanup keeps PR focused - Core startsWith functionality remains intact in jsonLogic.ts and BasicConfig.ts Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com> * test: add comprehensive edge case tests for startsWith operator - Add test cases for non-string first argument (haystack) handling - Cover null, undefined, numbers, booleans, arrays, and objects - Update startsWith implementation to safely handle non-string inputs - Ensure operation returns false without throwing runtime errors - All tests now pass: 19 passed | 1 skipped Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com> * refactor: improve startsWith operation with type guards and String.prototype.startsWith - Change argument types from string to unknown for better type safety - Add type guards to return false when either operand is not a string - Use String.prototype.startsWith instead of indexOf for cleaner implementation - Keep existing empty-second check and normalize function calls - All tests continue to pass: 19 passed | 1 skipped Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
68 lines
1.7 KiB
TypeScript
68 lines
1.7 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
import jsonLogic from "json-logic-js";
|
|
|
|
// converts input to lowercase if string
|
|
function normalize<T extends string | string[]>(input: T): T {
|
|
if (typeof input === "string") {
|
|
return input.toLowerCase() as T;
|
|
}
|
|
if (input instanceof Array) {
|
|
return input.map((item) => {
|
|
if (typeof item === "string") {
|
|
return item.toLowerCase();
|
|
}
|
|
// if array item is not a string, return it as is
|
|
return item;
|
|
}) as T;
|
|
}
|
|
return input;
|
|
}
|
|
|
|
/**
|
|
* Single Select equals and not equals uses it
|
|
* Short Text equals and not equals uses it
|
|
*/
|
|
jsonLogic.add_operation("==", function (a: any, b: any) {
|
|
return normalize(a) == normalize(b);
|
|
});
|
|
|
|
jsonLogic.add_operation("===", function (a: any, b: any) {
|
|
return normalize(a) === normalize(b);
|
|
});
|
|
|
|
jsonLogic.add_operation("!==", function (a: any, b: any) {
|
|
return normalize(a) !== normalize(b);
|
|
});
|
|
|
|
jsonLogic.add_operation("!=", function (a: any, b: any) {
|
|
return normalize(a) != normalize(b);
|
|
});
|
|
|
|
/**
|
|
* Multiselect "equals" and "not equals" uses it
|
|
* Singleselect "any in" and "not in" uses it
|
|
* Long Text/Short Text/Email/Phone "contains" also uses it.
|
|
*/
|
|
jsonLogic.add_operation("in", function (a: string, b: string | string[]) {
|
|
const first = normalize(a);
|
|
const second = normalize(b);
|
|
if (!second) return false;
|
|
return second.indexOf(first) !== -1;
|
|
});
|
|
|
|
/**
|
|
* Short Text/Long Text "starts with" uses it
|
|
*/
|
|
jsonLogic.add_operation("starts_with", function (a: unknown, b: unknown) {
|
|
if (typeof a !== "string" || typeof b !== "string") return false;
|
|
|
|
const first = normalize(a);
|
|
const second = normalize(b);
|
|
|
|
if (!second) return false;
|
|
|
|
return first.startsWith(second);
|
|
});
|
|
|
|
export default jsonLogic;
|