diff options
Diffstat (limited to 'packages/shared')
| -rw-r--r-- | packages/shared/searchQueryParser.test.ts | 16 | ||||
| -rw-r--r-- | packages/shared/searchQueryParser.ts | 5 | ||||
| -rw-r--r-- | packages/shared/types/search.ts | 7 |
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), |
