aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/searchQueryParser.test.ts16
-rw-r--r--packages/shared/searchQueryParser.ts5
-rw-r--r--packages/shared/types/search.ts7
3 files changed, 28 insertions, 0 deletions
diff --git a/packages/shared/searchQueryParser.test.ts b/packages/shared/searchQueryParser.test.ts
index 3fe3f388..aa11433f 100644
--- a/packages/shared/searchQueryParser.test.ts
+++ b/packages/shared/searchQueryParser.test.ts
@@ -123,6 +123,22 @@ describe("Search Query Parser", () => {
inverse: true,
},
});
+ expect(parseSearchQuery("is:broken")).toEqual({
+ result: "full",
+ text: "",
+ matcher: {
+ type: "brokenLinks",
+ brokenLinks: true,
+ },
+ });
+ expect(parseSearchQuery("-is:broken")).toEqual({
+ result: "full",
+ text: "",
+ matcher: {
+ type: "brokenLinks",
+ brokenLinks: false,
+ },
+ });
});
test("simple string queries", () => {
diff --git a/packages/shared/searchQueryParser.ts b/packages/shared/searchQueryParser.ts
index f919df96..7447593a 100644
--- a/packages/shared/searchQueryParser.ts
+++ b/packages/shared/searchQueryParser.ts
@@ -166,6 +166,11 @@ MATCHER.setPattern(
inverse: !!minus,
},
};
+ case "broken":
+ return {
+ text: "",
+ matcher: { type: "brokenLinks", brokenLinks: !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 caedcf94..c29270b8 100644
--- a/packages/shared/types/search.ts
+++ b/packages/shared/types/search.ts
@@ -83,6 +83,11 @@ const zTypeMatcher = z.object({
inverse: z.boolean(),
});
+const zBrokenLinksMatcher = z.object({
+ type: z.literal("brokenLinks"),
+ brokenLinks: z.boolean(),
+});
+
const zNonRecursiveMatcher = z.union([
zTagNameMatcher,
zListNameMatcher,
@@ -97,6 +102,7 @@ const zNonRecursiveMatcher = z.union([
zIsInListMatcher,
zTypeMatcher,
zRssFeedNameMatcher,
+ zBrokenLinksMatcher,
]);
type NonRecursiveMatcher = z.infer<typeof zNonRecursiveMatcher>;
@@ -120,6 +126,7 @@ export const zMatcherSchema: z.ZodType<Matcher> = z.lazy(() => {
zIsInListMatcher,
zTypeMatcher,
zRssFeedNameMatcher,
+ zBrokenLinksMatcher,
z.object({
type: z.literal("and"),
matchers: z.array(zMatcherSchema),