aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/searchQueryParser.test.ts32
-rw-r--r--packages/shared/searchQueryParser.ts10
-rw-r--r--packages/shared/types/search.ts14
3 files changed, 56 insertions, 0 deletions
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<typeof zNonRecursiveMatcher>;
@@ -65,6 +77,8 @@ export const zMatcherSchema: z.ZodType<Matcher> = z.lazy(() => {
zFavouritedMatcher,
zDateAfterMatcher,
zDateBeforeMatcher,
+ zIsTaggedMatcher,
+ zIsInListMatcher,
z.object({
type: z.literal("and"),
matchers: z.array(zMatcherSchema),