From 96cc11ef321b4580430c05f9344c6eb7dbddcf23 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Tue, 31 Dec 2024 14:15:02 +0000 Subject: feat: Add support for searching for tagged and listed items --- packages/shared/searchQueryParser.test.ts | 32 +++++++++++++++++++++++++++++++ packages/shared/searchQueryParser.ts | 10 ++++++++++ packages/shared/types/search.ts | 14 ++++++++++++++ 3 files changed, 56 insertions(+) (limited to 'packages/shared') diff --git a/packages/shared/searchQueryParser.test.ts b/packages/shared/searchQueryParser.test.ts index 5bbb3f77..5af7ca2f 100644 --- a/packages/shared/searchQueryParser.test.ts +++ b/packages/shared/searchQueryParser.test.ts @@ -36,6 +36,38 @@ describe("Search Query Parser", () => { favourited: false, }, }); + expect(parseSearchQuery("is:tagged")).toEqual({ + result: "full", + text: "", + matcher: { + type: "tagged", + tagged: true, + }, + }); + expect(parseSearchQuery("-is:tagged")).toEqual({ + result: "full", + text: "", + matcher: { + type: "tagged", + tagged: false, + }, + }); + expect(parseSearchQuery("is:inlist")).toEqual({ + result: "full", + text: "", + matcher: { + type: "inlist", + inList: true, + }, + }); + expect(parseSearchQuery("-is:inlist")).toEqual({ + result: "full", + text: "", + matcher: { + type: "inlist", + inList: false, + }, + }); }); test("simple string queries", () => { diff --git a/packages/shared/searchQueryParser.ts b/packages/shared/searchQueryParser.ts index 02129c14..e52af274 100644 --- a/packages/shared/searchQueryParser.ts +++ b/packages/shared/searchQueryParser.ts @@ -126,6 +126,16 @@ MATCHER.setPattern( text: "", matcher: { type: "archived", archived: !minus }, }; + case "tagged": + return { + text: "", + matcher: { type: "tagged", tagged: !minus }, + }; + case "inlist": + return { + text: "", + matcher: { type: "inlist", inList: !minus }, + }; default: // If the token is not known, emit it as pure text return { diff --git a/packages/shared/types/search.ts b/packages/shared/types/search.ts index 4d947a05..9d97fdd8 100644 --- a/packages/shared/types/search.ts +++ b/packages/shared/types/search.ts @@ -40,6 +40,16 @@ const zDateBeforeMatcher = z.object({ inverse: z.boolean(), }); +const zIsTaggedMatcher = z.object({ + type: z.literal("tagged"), + tagged: z.boolean(), +}); + +const zIsInListMatcher = z.object({ + type: z.literal("inlist"), + inList: z.boolean(), +}); + const zNonRecursiveMatcher = z.union([ zTagNameMatcher, zListNameMatcher, @@ -48,6 +58,8 @@ const zNonRecursiveMatcher = z.union([ zFavouritedMatcher, zDateAfterMatcher, zDateBeforeMatcher, + zIsTaggedMatcher, + zIsInListMatcher, ]); type NonRecursiveMatcher = z.infer; @@ -65,6 +77,8 @@ export const zMatcherSchema: z.ZodType = z.lazy(() => { zFavouritedMatcher, zDateAfterMatcher, zDateBeforeMatcher, + zIsTaggedMatcher, + zIsInListMatcher, z.object({ type: z.literal("and"), matchers: z.array(zMatcherSchema), -- cgit v1.2.3-70-g09d2