aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared/searchQueryParser.ts
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2026-02-08 15:53:14 +0000
committerGitHub <noreply@github.com>2026-02-08 15:53:14 +0000
commitb05a7531b76d580fc2378d3fed12f57e5f4b35b1 (patch)
treec80d578507321ebe43f540649daba2bdec47f939 /packages/shared/searchQueryParser.ts
parent960ca9b67915408f26b825886f2b6c6481a658dc (diff)
downloadkarakeep-b05a7531b76d580fc2378d3fed12f57e5f4b35b1.tar.zst
feat: add source filter to query language (#2465)
* feat: add source filter to query language Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * autocomplete source --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'packages/shared/searchQueryParser.ts')
-rw-r--r--packages/shared/searchQueryParser.ts24
1 files changed, 22 insertions, 2 deletions
diff --git a/packages/shared/searchQueryParser.ts b/packages/shared/searchQueryParser.ts
index 027a662f..7eb3b185 100644
--- a/packages/shared/searchQueryParser.ts
+++ b/packages/shared/searchQueryParser.ts
@@ -16,7 +16,7 @@ import {
} from "typescript-parsec";
import { z } from "zod";
-import { BookmarkTypes } from "./types/bookmarks";
+import { BookmarkTypes, zBookmarkSourceSchema } from "./types/bookmarks";
import { Matcher } from "./types/search";
import { parseRelativeDate } from "./utils/relativeDateUtils";
@@ -42,7 +42,10 @@ const lexerRules: [RegExp, TokenType][] = [
[/^\s+or/i, TokenType.Or],
[/^#/, TokenType.Hash],
- [/^(is|url|list|after|before|age|feed|title|tag):/, TokenType.Qualifier],
+ [
+ /^(is|url|list|after|before|age|feed|title|tag|source):/,
+ TokenType.Qualifier,
+ ],
[/^"([^"]+)"/, TokenType.StringLiteral],
@@ -230,6 +233,23 @@ MATCHER.setPattern(
inverse: !!minus,
},
};
+ case "source:": {
+ const parsed = zBookmarkSourceSchema.safeParse(ident);
+ if (!parsed.success) {
+ return {
+ text: (minus?.text ?? "") + qualifier.text + ident,
+ matcher: undefined,
+ };
+ }
+ return {
+ text: "",
+ matcher: {
+ type: "source",
+ source: parsed.data,
+ inverse: !!minus,
+ },
+ };
+ }
case "after:":
try {
return {