aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/searchQueryParser.test.ts36
-rw-r--r--packages/shared/searchQueryParser.ts11
-rw-r--r--packages/shared/types/search.ts8
3 files changed, 54 insertions, 1 deletions
diff --git a/packages/shared/searchQueryParser.test.ts b/packages/shared/searchQueryParser.test.ts
index 17accd1e..ff69756c 100644
--- a/packages/shared/searchQueryParser.test.ts
+++ b/packages/shared/searchQueryParser.test.ts
@@ -244,6 +244,42 @@ describe("Search Query Parser", () => {
inverse: true,
},
});
+ expect(parseSearchQuery("feed:my-feed")).toEqual({
+ result: "full",
+ text: "",
+ matcher: {
+ type: "rssFeedName",
+ feedName: "my-feed",
+ inverse: false,
+ },
+ });
+ expect(parseSearchQuery("-feed:my-feed")).toEqual({
+ result: "full",
+ text: "",
+ matcher: {
+ type: "rssFeedName",
+ feedName: "my-feed",
+ inverse: true,
+ },
+ });
+ expect(parseSearchQuery('feed:"my feed"')).toEqual({
+ result: "full",
+ text: "",
+ matcher: {
+ type: "rssFeedName",
+ feedName: "my feed",
+ inverse: false,
+ },
+ });
+ expect(parseSearchQuery('-feed:"my feed"')).toEqual({
+ result: "full",
+ text: "",
+ matcher: {
+ type: "rssFeedName",
+ feedName: "my feed",
+ inverse: true,
+ },
+ });
});
test("date queries", () => {
expect(parseSearchQuery("after:2023-10-12")).toEqual({
diff --git a/packages/shared/searchQueryParser.ts b/packages/shared/searchQueryParser.ts
index 3d8a1519..d4e2bf2b 100644
--- a/packages/shared/searchQueryParser.ts
+++ b/packages/shared/searchQueryParser.ts
@@ -40,7 +40,7 @@ const lexerRules: [RegExp, TokenType][] = [
[/^\s+or/i, TokenType.Or],
[/^#/, TokenType.Hash],
- [/^(is|url|list|after|before):/, TokenType.Qualifier],
+ [/^(is|url|list|after|before|feed):/, TokenType.Qualifier],
[/^"([^"]+)"/, TokenType.StringLiteral],
@@ -204,6 +204,15 @@ MATCHER.setPattern(
text: "",
matcher: { type: "listName", listName: ident, inverse: !!minus },
};
+ case "feed:":
+ return {
+ text: "",
+ matcher: {
+ type: "rssFeedName",
+ feedName: ident,
+ inverse: !!minus,
+ },
+ };
case "after:":
try {
return {
diff --git a/packages/shared/types/search.ts b/packages/shared/types/search.ts
index 19c5d0e2..533eea25 100644
--- a/packages/shared/types/search.ts
+++ b/packages/shared/types/search.ts
@@ -14,6 +14,12 @@ const zListNameMatcher = z.object({
inverse: z.boolean(),
});
+const zRssFeedNameMatcher = z.object({
+ type: z.literal("rssFeedName"),
+ feedName: z.string(),
+ inverse: z.boolean(),
+});
+
const zArchivedMatcher = z.object({
type: z.literal("archived"),
archived: z.boolean(),
@@ -73,6 +79,7 @@ const zNonRecursiveMatcher = z.union([
zIsTaggedMatcher,
zIsInListMatcher,
zTypeMatcher,
+ zRssFeedNameMatcher,
]);
type NonRecursiveMatcher = z.infer<typeof zNonRecursiveMatcher>;
@@ -93,6 +100,7 @@ export const zMatcherSchema: z.ZodType<Matcher> = z.lazy(() => {
zIsTaggedMatcher,
zIsInListMatcher,
zTypeMatcher,
+ zRssFeedNameMatcher,
z.object({
type: z.literal("and"),
matchers: z.array(zMatcherSchema),