Strip leading @ in from: queries (#11158)
This commit is contained in:
@@ -26,6 +26,23 @@ describe(`extractSearchPostsParams`, () => {
|
|||||||
input: `cats to:alice`,
|
input: `cats to:alice`,
|
||||||
output: {q: `cats`, mentions: `alice`},
|
output: {q: `cats`, mentions: `alice`},
|
||||||
},
|
},
|
||||||
|
// Handles may be typed with a leading @ (e.g. from:@alice.bsky.social),
|
||||||
|
// which the appview rejects. Strip it to match the advanced-search dialog.
|
||||||
|
{
|
||||||
|
name: `strips a leading @ from from:`,
|
||||||
|
input: `cats from:@alice.bsky.social`,
|
||||||
|
output: {q: `cats`, author: `alice.bsky.social`},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `strips a leading @ from mentions:`,
|
||||||
|
input: `cats mentions:@alice.bsky.social`,
|
||||||
|
output: {q: `cats`, mentions: `alice.bsky.social`},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `strips a leading @ from to: (mentions alias)`,
|
||||||
|
input: `cats to:@alice.bsky.social`,
|
||||||
|
output: {q: `cats`, mentions: `alice.bsky.social`},
|
||||||
|
},
|
||||||
// `me` is resolved by the backend, so the :me operators stay in q verbatim
|
// `me` is resolved by the backend, so the :me operators stay in q verbatim
|
||||||
// instead of being lifted into author/mentions.
|
// instead of being lifted into author/mentions.
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,6 +13,17 @@ import {
|
|||||||
|
|
||||||
const DATE_RE = /^\d{4}-\d{2}-\d{2}/
|
const DATE_RE = /^\d{4}-\d{2}-\d{2}/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strips a leading `@` from a handle so `from:@alice.bsky.social` and
|
||||||
|
* `from:alice.bsky.social` both resolve to the same author. Mirrors the marker
|
||||||
|
* stripping the advanced-search dialog applies to handles entered in its
|
||||||
|
* filter fields (see `serializeAdvancedSearch`), which otherwise 400s the
|
||||||
|
* appview.
|
||||||
|
*/
|
||||||
|
function stripHandleMarker(value: string): string {
|
||||||
|
return value.startsWith('@') ? value.slice(1) : value
|
||||||
|
}
|
||||||
|
|
||||||
export type ExtractedSearchParams = {
|
export type ExtractedSearchParams = {
|
||||||
q: string
|
q: string
|
||||||
author?: string
|
author?: string
|
||||||
@@ -111,12 +122,12 @@ export function extractSearchPostsParams(query: string): ExtractedSearchParams {
|
|||||||
* query text verbatim rather than lifting it into a structured param.
|
* query text verbatim rather than lifting it into a structured param.
|
||||||
*/
|
*/
|
||||||
if (value === 'me') remaining.push(token)
|
if (value === 'me') remaining.push(token)
|
||||||
else result.author ??= value
|
else result.author ??= stripHandleMarker(value)
|
||||||
break
|
break
|
||||||
case 'mentions':
|
case 'mentions':
|
||||||
case 'to':
|
case 'to':
|
||||||
if (value === 'me') remaining.push(token)
|
if (value === 'me') remaining.push(token)
|
||||||
else result.mentions ??= value
|
else result.mentions ??= stripHandleMarker(value)
|
||||||
break
|
break
|
||||||
case 'domain':
|
case 'domain':
|
||||||
result.domain ??= value
|
result.domain ??= value
|
||||||
|
|||||||
Reference in New Issue
Block a user