diff --git a/packages/app-store/routing-forms/lib/jsonLogicOverrides.ts b/packages/app-store/routing-forms/lib/jsonLogicOverrides.ts new file mode 100644 index 00000000000000..5627a29df1f6c3 --- /dev/null +++ b/packages/app-store/routing-forms/lib/jsonLogicOverrides.ts @@ -0,0 +1,53 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import jsonLogic from "json-logic-js"; + +// converts input to lowercase if string +function normalize(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; +}); + +export default jsonLogic; diff --git a/packages/app-store/routing-forms/lib/processRoute.tsx b/packages/app-store/routing-forms/lib/processRoute.tsx index d3268d2b439ff6..6565da7af1f3e1 100644 --- a/packages/app-store/routing-forms/lib/processRoute.tsx +++ b/packages/app-store/routing-forms/lib/processRoute.tsx @@ -1,5 +1,4 @@ import type { App_RoutingForms_Form } from "@prisma/client"; -import jsonLogic from "json-logic-js"; import { Utils as QbUtils } from "react-awesome-query-builder"; import type { z } from "zod"; @@ -8,6 +7,7 @@ import type { zodNonRouterRoute } from "../zod"; import { getQueryBuilderConfig } from "./getQueryBuilderConfig"; import { isFallbackRoute } from "./isFallbackRoute"; import isRouter from "./isRouter"; +import jsonLogic from "./jsonLogicOverrides"; export function processRoute({ form, diff --git a/playwright.config.ts b/playwright.config.ts index e5255fb47ae99d..0b5b248732753b 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -11,12 +11,12 @@ const outputDir = path.join(__dirname, "test-results"); // Dev Server on local can be slow to start up and process requests. So, keep timeouts really high on local, so that tests run reliably locally // So, if not in CI, keep the timers high, if the test is stuck somewhere and there is unnecessary wait developer can see in browser that it's stuck -const DEFAULT_NAVIGATION_TIMEOUT = process.env.CI ? 15000 : 50000; -const DEFAULT_EXPECT_TIMEOUT = process.env.CI ? 15000 : 50000; +const DEFAULT_NAVIGATION_TIMEOUT = process.env.CI ? 15000 : 120000; +const DEFAULT_EXPECT_TIMEOUT = process.env.CI ? 15000 : 120000; // Test Timeout can hit due to slow expect, slow navigation. // So, it should me much higher than sum of expect and navigation timeouts as there can be many async expects and navigations in a single test -const DEFAULT_TEST_TIMEOUT = process.env.CI ? 60000 : 120000; +const DEFAULT_TEST_TIMEOUT = process.env.CI ? 60000 : 240000; const headless = !!process.env.CI || !!process.env.PLAYWRIGHT_HEADLESS;