From 079ce322af6b408ec05adbd74756c2d92d59cf88 Mon Sep 17 00:00:00 2001 From: Jonas Berlin Date: Fri, 17 Oct 2025 14:49:49 +0300 Subject: [PATCH 1/3] Fix browse types based on empirical testing --- src/types/browse.d.ts | 60 ++++++++++++++++++++++++++----------------- src/types/index.d.ts | 36 ++++++++++++++++++-------- 2 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/types/browse.d.ts b/src/types/browse.d.ts index 691251a2..f5063c28 100644 --- a/src/types/browse.d.ts +++ b/src/types/browse.d.ts @@ -1,4 +1,5 @@ import { + BrowseFacet, Collection, ConstructorClientOptions, Facet, @@ -31,7 +32,7 @@ export interface IBrowseParameters { hiddenFacets?: string[]; variationsMap?: VariationsMap; qsParam?: Record; - filterMatchTypes?: Record + filterMatchTypes?: Record; } declare class Browse { @@ -77,40 +78,52 @@ declare class Browse { /** ********* * Browse results returned from server ********** */ -export interface BrowseResponse extends Record { - request?: Partial; - response?: Partial; - result_id?: string; +export interface BrowseResponse + extends Record { + + request: Omit; + response: ResponseType; + result_id: string; ad_based?: boolean; } export type GetBrowseResultsResponse = - BrowseResponse; + BrowseResponse; export type GetBrowseResultsForItemIdsResponse = - BrowseResponse; + BrowseResponse; export type GetBrowseGroupsResponse = BrowseResponse< Pick< GetBrowseResultsResponseData, 'result_sources' | 'groups' | 'refined_content' - > + >, + 'browse_filter_name' | 'browse_filter_value' | 'searchandized_items' | 'facet_name' >; export type GetBrowseFacetsResponse = BrowseResponse< - Pick + GetBrowseFacetsResultsResponseData, + 'browse_filter_name' | 'browse_filter_value' | 'searchandized_items' | 'facet_name' >; export type GetBrowseFacetOptionsResponse = BrowseResponse< - Pick + Pick, + 'browse_filter_name' | 'browse_filter_value' | 'searchandized_items' >; export interface GetBrowseResultsResponseData extends Record { - result_sources: Partial; - facets: Partial[]; - groups: Partial[]; - results: Partial[]; - sort_options: Partial[]; + result_sources: ResultSources; + facets: Facet[]; + groups: Group[]; + results: BrowseResultData[]; + sort_options: SortOption[]; refined_content: Record[]; total_num_results: number; - features: Partial[]; - collection: Partial; + features: Feature[]; + collection?: Partial; + related_searches?: Record[]; + related_browse_pages?: Record[]; +} + +export interface GetBrowseFacetsResultsResponseData extends Record { + facets: BrowseFacet[]; + total_num_results: number; } export interface BrowseResultData extends Record { @@ -122,23 +135,24 @@ export interface BrowseResultData extends Record { value: string; is_slotted: false; labels: Record; - variations: Record[]; - variations_map: Record | Record[]; + variations?: Record[]; + variations_map?: Record | Record[]; } export interface BrowseRequestType extends Record { browse_filter_name: string; browse_filter_value: string; - filter_match_types: Record; - filters: Record; - fmt_options: Record; + filter_match_types?: Record; + filters?: Record; + fmt_options: FmtOptions; + facet_name: string; num_results_per_page: number; page: number; section: string; sort_by: string; sort_order: string; term: string; - query: string; + query?: string; features: Partial; feature_variants: Partial; searchandized_items: Record; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index ce217566..61885b3d 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -94,6 +94,7 @@ export interface SortOption extends Record { display_name: string; sort_order: string; status: string; + hidden: boolean; } export interface Feature extends Record { @@ -107,44 +108,59 @@ export interface Feature extends Record { } | null; } -export type Facet = RangeFacet | OptionFacet; +export type Facet = RangeFacet | OptionFacet | HierarchialOptionFacet; + +export type BrowseFacet = Pick; export interface BaseFacet extends Record { data: Record; - status: Record; display_name: string; name: string; hidden: boolean; } export interface RangeFacet extends BaseFacet, Record { - max: number; - min: number; + status?: { min: RangeMin, max: RangeMax }; + max: RangeMax; + min: RangeMin; type: 'range'; } export interface OptionFacet extends BaseFacet, Record { options: FacetOption[]; - type: 'multiple' | 'single' | 'hierarchical'; + type: 'multiple' | 'single'; +} + +export interface HierarchialOptionFacet extends BaseFacet, Record { + options: HierarchialFacetOption[]; + type: 'hierarchical'; } export interface FacetOption extends Record { count: number; display_name: string; value: string; - options?: FacetOption[]; - range?: ['-inf' | number, 'inf' | number]; + range?: [RangeMin, RangeMax]; status: string; + data: Record; } +export interface HierarchialFacetOption extends FacetOption { + options?: HierarchialFacetOption[]; +} + +export type RangeMin = '-inf' | number; +export type RangeMax = '+inf' | 'inf' | number + export interface Group extends BaseGroup, Record { - count?: number; + count: number; data?: Record; - parents?: BaseGroup[]; - children?: Group[]; + parents: BaseGroup[]; + children: Group[]; } export interface Collection extends Record { + // documentation says this field is called `id` collection_id: string; display_name: string; data: Record; From 09bcbaa7a9f8d5782024533a9bfb534234d7bbeb Mon Sep 17 00:00:00 2001 From: Jonas Berlin Date: Fri, 17 Oct 2025 14:49:54 +0300 Subject: [PATCH 2/3] Fix search types based on empirical testing --- src/types/search.d.ts | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/types/search.d.ts b/src/types/search.d.ts index 5c865e0f..293cce95 100644 --- a/src/types/search.d.ts +++ b/src/types/search.d.ts @@ -1,4 +1,5 @@ import { + BrowseResultData, ConstructorClientOptions, Facet, Feature, @@ -56,27 +57,29 @@ declare class Search { * search results returned from server ********** */ export interface SearchResponse { - request: Partial; - response: Partial; + request: SearchRequestType; + response: SearchResponseType | Redirect; result_id: string; } export interface SearchResponseType extends Record { - result_sources: Partial; - facets: Partial[]; - groups: Partial[]; - results: Partial[]; - sort_options: Partial[]; + result_sources: ResultSources; + facets: Facet[]; + groups: Group[]; + results: Result[]; + sort_options: SortOption[]; refined_content: Record[]; total_num_results: number; - features: Partial[]; + features: Feature[]; + related_searches?: Record[]; + related_browse_pages?: Record[]; } export interface SearchRequestType extends Record { page: number; num_results_per_page: number; section: string; - blacklist_rules: boolean; + blacklist_rules?: boolean; term: string; fmt_options: FmtOptions; sort_by: string; @@ -89,18 +92,7 @@ export interface SearchRequestType extends Record { pre_filter_expression?: FilterExpression; } -export interface Result extends Record { - matched_terms: string[]; - data: { - id: string; - [key: string]: any; - }; - value: string; - is_slotted: false; - labels: Record; - variations: Record[]; - variations_map: Record | Record[]; -} +export type Result = BrowseResultData; export interface Redirect extends Record { redirect: { From f0114e5988fbbe7ea01b0125cd06460cad771720 Mon Sep 17 00:00:00 2001 From: Aleksei Pavlov Date: Mon, 29 Dec 2025 14:08:38 +0100 Subject: [PATCH 3/3] Fix types in browse and search tests --- src/types/tests/browse.test-d.ts | 2 + src/types/tests/search.test-d.ts | 174 ++++++++++++++++--------------- 2 files changed, 92 insertions(+), 84 deletions(-) diff --git a/src/types/tests/browse.test-d.ts b/src/types/tests/browse.test-d.ts index 3e066913..06abafc9 100644 --- a/src/types/tests/browse.test-d.ts +++ b/src/types/tests/browse.test-d.ts @@ -29,6 +29,7 @@ expectAssignable({ data: {}, }, ], + groups: [], results: [ { matched_terms: [], @@ -62,6 +63,7 @@ expectAssignable({ display_name: 'A - Z', sort_order: 'descending', status: '', + hidden: false, }, ], refined_content: [], diff --git a/src/types/tests/search.test-d.ts b/src/types/tests/search.test-d.ts index 2bb8b6cc..1bd91f49 100644 --- a/src/types/tests/search.test-d.ts +++ b/src/types/tests/search.test-d.ts @@ -1,97 +1,103 @@ import { expectAssignable } from 'tsd'; -import { SearchResponse } from '../search'; +import { SearchResponse, SearchResponseType } from '../search'; -expectAssignable({ - response: { - result_sources: { - token_match: { - count: 122, - }, - embeddings_match: { - count: 0, - }, +const response: SearchResponseType = { + result_sources: { + token_match: { + count: 122, + }, + embeddings_match: { + count: 0, }, - facets: [ - { - display_name: 'price', - name: 'price', - data: {}, - type: 'range', - hidden: false, - status: {}, + }, + facets: [ + { + display_name: 'price', + name: 'price', + data: {}, + type: 'range', + hidden: false, + status: { min: 0.99, max: 4799.99, }, - ], - groups: [ - { - group_id: 'All', - display_name: 'All', - count: 454, - data: {}, - children: [ - { - group_id: '123', - display_name: '123', - count: 62, - data: {}, - children: [], - parents: [ - { - display_name: 'All', - group_id: 'All', - }, - ], - }, - ], - parents: [], - }, - ], - results: [ - { - matched_terms: ['red'], - data: { - id: '123', - url: 'https://example', - keywords: ['Red Rock'], - image_url: 'https://example', - group_ids: ['123', '1234'], - }, - value: '123', - is_slotted: false, - labels: {}, - variations: [ - { - data: { - variation_id: '123', + min: 0.99, + max: 4799.99, + }, + ], + groups: [ + { + group_id: 'All', + display_name: 'All', + count: 454, + data: {}, + children: [ + { + group_id: '123', + display_name: '123', + count: 62, + data: {}, + children: [], + parents: [ + { + display_name: 'All', + group_id: 'All', }, - value: '123', - }, - ], - }, - ], - sort_options: [ - { - sort_by: 'relevance', - display_name: 'Relevance', - sort_order: 'descending', - status: 'selected', + ], + }, + ], + parents: [], + }, + ], + results: [ + { + matched_terms: ['red'], + data: { + id: '123', + url: 'https://example', + keywords: ['Red Rock'], + image_url: 'https://example', + group_ids: ['123', '1234'], }, - ], - refined_content: [], - total_num_results: 454, - features: [ - { - feature_name: 'auto_generated_refined_query_rules', - display_name: 'Affinity Engine', - enabled: true, - variant: { - name: 'default_rules', - display_name: 'Default weights', + value: '123', + is_slotted: false, + labels: {}, + variations: [ + { + data: { + variation_id: '123', + }, + value: '123', }, + ], + }, + ], + sort_options: [ + { + sort_by: 'relevance', + display_name: 'Relevance', + sort_order: 'descending', + status: 'selected', + hidden: false, + }, + ], + refined_content: [], + total_num_results: 454, + features: [ + { + feature_name: 'auto_generated_refined_query_rules', + display_name: 'Affinity Engine', + enabled: true, + variant: { + name: 'default_rules', + display_name: 'Default weights', }, - ], - }, + }, + ], +}; + +expectAssignable({ + response, result_id: 'dda3208c-0f0c-412e-92d9-7abf1d21e228', request: { page: 1,