From d1b73d41d2803c3a30c7c1eac146ee21601a46d2 Mon Sep 17 00:00:00 2001 From: Sandor Karpf Date: Wed, 10 Dec 2025 18:08:34 +0100 Subject: [PATCH] fix: $contains may have only string value additionally in an entity filter. Signed-off-by: Sandor Karpf --- plugins/catalog-react/report-alpha.api.md | 4 +-- .../createEntityPredicateSchema.test.ts | 1 + .../predicates/createEntityPredicateSchema.ts | 35 +++++++++++++------ .../src/alpha/predicates/types.ts | 4 +-- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/plugins/catalog-react/report-alpha.api.md b/plugins/catalog-react/report-alpha.api.md index 44e8c29d30..40a83851b6 100644 --- a/plugins/catalog-react/report-alpha.api.md +++ b/plugins/catalog-react/report-alpha.api.md @@ -478,7 +478,7 @@ export const EntityIconLinkBlueprint: ExtensionBlueprint<{ export type EntityPredicate = | EntityPredicateExpression | EntityPredicatePrimitive - | EntityPredicatePrimitive[] + | never[] | { $all: EntityPredicate[]; } @@ -515,7 +515,7 @@ export type EntityPredicateValue = $in: EntityPredicatePrimitive[]; } | { - $contains: EntityPredicate; + $contains: EntityPredicateExpression | string; }; // @alpha diff --git a/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.test.ts b/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.test.ts index 24d75c76fa..52e4d097af 100644 --- a/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.test.ts +++ b/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.test.ts @@ -91,6 +91,7 @@ describe('createEntityPredicateSchema', () => { const predicates: Array< Exclude > = [ + ['service', 'website'], { kind: { 1: 'foo' } }, { kind: { foo: 'bar' } }, { kind: { $unknown: 'foo' } }, diff --git a/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.ts b/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.ts index cfd2e451df..2dcdadd826 100644 --- a/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.ts +++ b/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.ts @@ -14,36 +14,51 @@ * limitations under the License. */ -import { EntityPredicate, EntityPredicateValue } from './types'; +import { + EntityPredicate, + EntityPredicateExpression, + EntityPredicatePrimitive, + EntityPredicateValue, +} from './types'; import type { z as zImpl, ZodType } from 'zod'; /** @internal */ export function createEntityPredicateSchema(z: typeof zImpl) { - const primitiveSchema = z.union([z.string(), z.number(), z.boolean()]); + const primitiveSchema = z.union([ + z.string(), + z.number(), + z.boolean(), + ]) as ZodType; - const comparableValueSchema = z.union([ - primitiveSchema, - z.array(primitiveSchema), - ]); + const onlyEmptyArraySchema = z.array(z.never()) as ZodType; // eslint-disable-next-line prefer-const let valuePredicateSchema: ZodType; + const expressionSchema = z.lazy(() => + z.union([ + z.record(z.string().regex(/^(?!\$).*$/), valuePredicateSchema), + z.record(z.string().regex(/(?!\$)+/), z.never()), + ]), + ) as ZodType; + const predicateSchema = z.lazy(() => z.union([ - comparableValueSchema, + expressionSchema, + primitiveSchema, + onlyEmptyArraySchema, z.object({ $all: z.array(predicateSchema) }), z.object({ $any: z.array(predicateSchema) }), z.object({ $not: predicateSchema }), - z.record(z.string().regex(/^(?!\$).*$/), valuePredicateSchema), ]), ) as ZodType; valuePredicateSchema = z.union([ - comparableValueSchema, + primitiveSchema, + z.array(primitiveSchema), z.object({ $exists: z.boolean() }), z.object({ $in: z.array(primitiveSchema) }), - z.object({ $contains: predicateSchema }), + z.object({ $contains: z.union([expressionSchema, z.string()]) }), ]) as ZodType; return predicateSchema; diff --git a/plugins/catalog-react/src/alpha/predicates/types.ts b/plugins/catalog-react/src/alpha/predicates/types.ts index 1a7b2faf36..8745610eae 100644 --- a/plugins/catalog-react/src/alpha/predicates/types.ts +++ b/plugins/catalog-react/src/alpha/predicates/types.ts @@ -18,7 +18,7 @@ export type EntityPredicate = | EntityPredicateExpression | EntityPredicatePrimitive - | EntityPredicatePrimitive[] + | never[] | { $all: EntityPredicate[] } | { $any: EntityPredicate[] } | { $not: EntityPredicate }; @@ -36,7 +36,7 @@ export type EntityPredicateValue = | EntityPredicatePrimitive[] | { $exists: boolean } | { $in: EntityPredicatePrimitive[] } - | { $contains: EntityPredicate }; + | { $contains: EntityPredicateExpression | string }; /** @alpha */ export type EntityPredicatePrimitive = string | number | boolean;