From 22ffb2b2966ce6adfd77e513793338072bd0c742 Mon Sep 17 00:00:00 2001 From: Jake Lewis Date: Mon, 13 Apr 2026 15:51:05 -0500 Subject: [PATCH 1/3] fix(Typescript, Search): `q_settings`,`advanced` mutual exclusivity --- src/services/search/__tests__/query.spec.ts | 26 +++++++++++++++++++++ src/services/search/service/query.ts | 15 +++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/services/search/__tests__/query.spec.ts b/src/services/search/__tests__/query.spec.ts index cbeb13e8..e4a4c96b 100644 --- a/src/services/search/__tests__/query.spec.ts +++ b/src/services/search/__tests__/query.spec.ts @@ -151,6 +151,32 @@ describe('search – query', () => { filters: [], }; expect(requireOneFilter).toBeDefined(); + + const requestWithQSettings: query.GSearchRequest = { + q: 'test', + q_settings: { + mode: 'query_string', + default_operator: 'and', + }, + }; + expect(requestWithQSettings).toBeDefined(); + + const requestWithAdvanced: query.GSearchRequest = { + q: 'test', + advanced: true, + }; + expect(requestWithAdvanced).toBeDefined(); + + // @ts-expect-error `q_settings` and `advanced` are mutually exclusive + const requestWithQSettingsAndAdvanced: query.GSearchRequest = { + q: 'test', + q_settings: { + mode: 'query_string', + default_operator: 'and', + }, + advanced: true, + }; + expect(requestWithQSettingsAndAdvanced).toBeDefined(); }); test('Content Generic', async () => { diff --git a/src/services/search/service/query.ts b/src/services/search/service/query.ts index 7a3d1140..03eb633d 100644 --- a/src/services/search/service/query.ts +++ b/src/services/search/service/query.ts @@ -95,7 +95,6 @@ type InternalGSearchRequest = { q?: string; offset?: number; limit?: number; - advanced?: boolean; bypass_visible_to?: boolean; result_format_version?: ResultFormatVersion; filter_principal_sets?: string[]; @@ -113,9 +112,19 @@ export type GSearchRequest = | (Omit & { q: InternalGSearchRequest['q']; }) - | (Omit & { + | ((Omit & { filters: [GFilter, ...GFilter[]]; - }); + }) & + ( + | { + q_settings?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['q_settings']; + advanced?: never; + } + | { + advanced?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['advanced']; + q_settings?: never; + } + )); /** * @param index_id The UUID of the index to query. From bab6bcfeb12a2c46db26583b17385dec4ba38f7f Mon Sep 17 00:00:00 2001 From: Joe Bottigliero <694253+jbottigliero@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:18:59 -0500 Subject: [PATCH 2/3] chore: refactor --- src/services/search/service/query.ts | 34 +++++++++++++++++----------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/services/search/service/query.ts b/src/services/search/service/query.ts index 03eb633d..fc60dc85 100644 --- a/src/services/search/service/query.ts +++ b/src/services/search/service/query.ts @@ -102,29 +102,37 @@ type InternalGSearchRequest = { facets?: GFacet[]; boosts?: GBoost[]; sort?: GSort[]; + q_settings?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['q_settings']; + advanced?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['advanced']; }; +/** + * `q_settings` and `advanced` are mutually exclusive. + * @see https://docs.globus.org/api/search/reference/post_query/#gsearchrequest + */ +type QSettingsOrAdvanced = + | { + q_settings?: InternalGSearchRequest['q_settings']; + advanced?: never; + } + | { + advanced?: InternalGSearchRequest['advanced']; + q_settings?: never; + }; + /** * You must provide either `q` or `filters`. * @see https://docs.globus.org/api/search/reference/post_query/#gsearchrequest */ -export type GSearchRequest = +export type GSearchRequest = ( | (Omit & { q: InternalGSearchRequest['q']; }) - | ((Omit & { + | (Omit & { filters: [GFilter, ...GFilter[]]; - }) & - ( - | { - q_settings?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['q_settings']; - advanced?: never; - } - | { - advanced?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['advanced']; - q_settings?: never; - } - )); + }) +) & + QSettingsOrAdvanced; /** * @param index_id The UUID of the index to query. From cb3b853096c5f7a035d6889d8cb8b99350deceaa Mon Sep 17 00:00:00 2001 From: Joe Bottigliero <694253+jbottigliero@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:30:09 -0500 Subject: [PATCH 3/3] test: fix mode const --- src/services/search/__tests__/query.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/search/__tests__/query.spec.ts b/src/services/search/__tests__/query.spec.ts index e4a4c96b..ab4d1ee5 100644 --- a/src/services/search/__tests__/query.spec.ts +++ b/src/services/search/__tests__/query.spec.ts @@ -171,7 +171,7 @@ describe('search – query', () => { const requestWithQSettingsAndAdvanced: query.GSearchRequest = { q: 'test', q_settings: { - mode: 'query_string', + mode: 'query_string' as const, default_operator: 'and', }, advanced: true,