From f9339142c69b917a82e37fdc2a04f4a8bb6aa59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 13 Feb 2026 22:09:40 +0100 Subject: [PATCH] fix: add in the hasPrefix matcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../src/predicates/schema.test.ts | 2 ++ .../filter-predicates/src/predicates/schema.ts | 1 + .../blueprints/EntityCardBlueprint.test.tsx | 12 ++++++++++++ .../blueprints/EntityContentBlueprint.test.tsx | 12 ++++++++++++ .../EntityContextMenuItemBlueprint.test.tsx | 16 ++++++++++++++-- 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/filter-predicates/src/predicates/schema.test.ts b/packages/filter-predicates/src/predicates/schema.test.ts index 47f77bbce8..08c92c20e8 100644 --- a/packages/filter-predicates/src/predicates/schema.test.ts +++ b/packages/filter-predicates/src/predicates/schema.test.ts @@ -176,6 +176,7 @@ describe('parseFilterPredicate', () => { { $any: [{ x: { $exists: true } }] }, { $not: { x: { $exists: true } } }, { $not: { $all: [{ x: { $exists: true } }] } }, + { kind: { $hasPrefix: 'Com' } }, ]; it.each(predicates)( @@ -204,6 +205,7 @@ describe('parseFilterPredicate', () => { { $not: { x: { $unknown: true } } }, { $not: { $all: [{ x: { $unknown: true } }] } }, { $unknown: 'foo' }, + { kind: { $hasPrefix: 1 } }, { 'metadata.tags': ['foo', 'bar'] }, ]; diff --git a/packages/filter-predicates/src/predicates/schema.ts b/packages/filter-predicates/src/predicates/schema.ts index 9684660219..81652786c6 100644 --- a/packages/filter-predicates/src/predicates/schema.ts +++ b/packages/filter-predicates/src/predicates/schema.ts @@ -63,6 +63,7 @@ export function createZodV3FilterPredicateSchema( z.object({ $exists: z.boolean() }), z.object({ $in: z.array(primitiveSchema) }), z.object({ $contains: predicateSchema }), + z.object({ $hasPrefix: z.string() }), ]) as zodV3.ZodType; return predicateSchema; diff --git a/plugins/catalog-react/src/alpha/blueprints/EntityCardBlueprint.test.tsx b/plugins/catalog-react/src/alpha/blueprints/EntityCardBlueprint.test.tsx index ef823e7edf..0ae880a462 100644 --- a/plugins/catalog-react/src/alpha/blueprints/EntityCardBlueprint.test.tsx +++ b/plugins/catalog-react/src/alpha/blueprints/EntityCardBlueprint.test.tsx @@ -108,6 +108,18 @@ describe('EntityCardBlueprint', () => { ], "type": "object", }, + { + "additionalProperties": false, + "properties": { + "$hasPrefix": { + "type": "string", + }, + }, + "required": [ + "$hasPrefix", + ], + "type": "object", + }, ], }, "propertyNames": { diff --git a/plugins/catalog-react/src/alpha/blueprints/EntityContentBlueprint.test.tsx b/plugins/catalog-react/src/alpha/blueprints/EntityContentBlueprint.test.tsx index cd1053db0b..661f501b3f 100644 --- a/plugins/catalog-react/src/alpha/blueprints/EntityContentBlueprint.test.tsx +++ b/plugins/catalog-react/src/alpha/blueprints/EntityContentBlueprint.test.tsx @@ -110,6 +110,18 @@ describe('EntityContentBlueprint', () => { ], "type": "object", }, + { + "additionalProperties": false, + "properties": { + "$hasPrefix": { + "type": "string", + }, + }, + "required": [ + "$hasPrefix", + ], + "type": "object", + }, ], }, "propertyNames": { diff --git a/plugins/catalog-react/src/alpha/blueprints/EntityContextMenuItemBlueprint.test.tsx b/plugins/catalog-react/src/alpha/blueprints/EntityContextMenuItemBlueprint.test.tsx index d92fcc1863..6201f32f2d 100644 --- a/plugins/catalog-react/src/alpha/blueprints/EntityContextMenuItemBlueprint.test.tsx +++ b/plugins/catalog-react/src/alpha/blueprints/EntityContextMenuItemBlueprint.test.tsx @@ -48,7 +48,7 @@ describe('EntityContextMenuItemBlueprint', () => { }, ]; - it.each(data)('should return an extension with sane defaults', params => { + it.each(data)('should return an extension with sane defaults, %#', params => { const extension = EntityContextMenuItemBlueprint.make({ name: 'test', params, @@ -121,6 +121,18 @@ describe('EntityContextMenuItemBlueprint', () => { ], "type": "object", }, + { + "additionalProperties": false, + "properties": { + "$hasPrefix": { + "type": "string", + }, + }, + "required": [ + "$hasPrefix", + ], + "type": "object", + }, ], }, "propertyNames": { @@ -246,7 +258,7 @@ describe('EntityContextMenuItemBlueprint', () => { it.each([ { filter: { kind: 'Api' } }, { filter: (e: Entity) => e.kind.toLowerCase() === 'api' }, - ])('should return a filter function', async ({ filter }) => { + ])('should return a filter function, %#', async ({ filter }) => { const extension = EntityContextMenuItemBlueprint.make({ name: 'test', params: {