From 3adb534f9fdb84b23e7f66a5f3ae1e2f8b90b2c6 Mon Sep 17 00:00:00 2001 From: niizom Date: Fri, 20 Mar 2026 18:10:52 +0500 Subject: [PATCH 1/8] [CDX-390]: update VarioationsMap type --- src/types/index.d.ts | 20 ++++++++++++++++---- src/types/tests/autocomplete.test-d.ts | 1 + src/types/tests/search.test-d.ts | 1 + 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 998e7784..552e1006 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -90,8 +90,8 @@ export type ErrorData = { }; export interface ResultSources extends Record { - token_match: { count: number; [key: string]: any }; - embeddings_match: { count: number; [key: string]: any }; + token_match: { count: number;[key: string]: any }; + embeddings_match: { count: number;[key: string]: any }; } export interface SortOption extends Record { @@ -215,6 +215,17 @@ export type FilterExpressionRange = { export type FilterExpressionRangeValue = ['-inf' | number, 'inf' | number]; +export interface FilterNode { + field: string; + value: string | number | boolean; +} + +export interface FilterBy { + and?: Array; + or?: Array; + not?: FilterNode | FilterBy; +} + export interface Item extends Record { value: string; is_slotted: boolean; @@ -249,10 +260,11 @@ export interface VariationsMap { name: string, field: string }>; + filter_by: FilterBy; values: { [key: string]: { - aggregation: 'first' | 'min' | 'max' | 'all', - field: string + aggregation: 'first' | 'min' | 'max' | 'all', + field: string }, }, dtype: 'array' | 'object' diff --git a/src/types/tests/autocomplete.test-d.ts b/src/types/tests/autocomplete.test-d.ts index a3021394..fd23b04e 100644 --- a/src/types/tests/autocomplete.test-d.ts +++ b/src/types/tests/autocomplete.test-d.ts @@ -65,6 +65,7 @@ expectAssignable({ field: 'data.VariationId', }, ], + filter_by: {}, values: { availability: { aggregation: 'all', diff --git a/src/types/tests/search.test-d.ts b/src/types/tests/search.test-d.ts index 1bd91f49..05619cb1 100644 --- a/src/types/tests/search.test-d.ts +++ b/src/types/tests/search.test-d.ts @@ -132,6 +132,7 @@ expectAssignable({ field: 'data.VariationId', }, ], + filter_by: {}, values: { availability: { aggregation: 'all', From cf7f1c26f4043e29c4bc7d8e9d37e4e464409c64 Mon Sep 17 00:00:00 2001 From: niizom Date: Fri, 20 Mar 2026 20:35:37 +0500 Subject: [PATCH 2/8] [CDX-390]: add discriminated union for VariationValue types --- src/types/index.d.ts | 29 ++++++++++++++++++++------ src/types/tests/autocomplete.test-d.ts | 1 - src/types/tests/search.test-d.ts | 1 - 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 552e1006..58107e52 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -255,17 +255,34 @@ export interface SearchSuggestion extends Item { } & ItemData; } +export type VariationsMapResponse = Array> | Record; + +export type Aggregation = 'first' | 'min' | 'max' | 'all' | 'count' | 'field_count' | 'value_count' + +export interface VariationsMapBaseValue { + aggregation: Aggregation; + field: string; +} + +export interface VariationsMapValueCount extends VariationsMapBaseValue { + aggregation: 'value_count'; + field: string; + value: boolean | number | string; +} + +export interface VariationsMapStandardValue extends VariationsMapBaseValue { + aggregation: Exclude + field: string; +} + export interface VariationsMap { - group_by: Array<{ + group_by?: Array<{ name: string, field: string }>; - filter_by: FilterBy; + filter_by?: FilterBy; values: { - [key: string]: { - aggregation: 'first' | 'min' | 'max' | 'all', - field: string - }, + [key: string]: VariationsMapValueCount | VariationsMapStandardValue, }, dtype: 'array' | 'object' } diff --git a/src/types/tests/autocomplete.test-d.ts b/src/types/tests/autocomplete.test-d.ts index fd23b04e..a3021394 100644 --- a/src/types/tests/autocomplete.test-d.ts +++ b/src/types/tests/autocomplete.test-d.ts @@ -65,7 +65,6 @@ expectAssignable({ field: 'data.VariationId', }, ], - filter_by: {}, values: { availability: { aggregation: 'all', diff --git a/src/types/tests/search.test-d.ts b/src/types/tests/search.test-d.ts index 05619cb1..1bd91f49 100644 --- a/src/types/tests/search.test-d.ts +++ b/src/types/tests/search.test-d.ts @@ -132,7 +132,6 @@ expectAssignable({ field: 'data.VariationId', }, ], - filter_by: {}, values: { availability: { aggregation: 'all', From 15db7a8961eea8ba7809f9ccc1ab268d2e221ebd Mon Sep 17 00:00:00 2001 From: niizom Date: Fri, 20 Mar 2026 20:43:01 +0500 Subject: [PATCH 3/8] [CDX-390]: update FilterNode to union type --- src/types/index.d.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 58107e52..138d7b53 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -215,11 +215,18 @@ export type FilterExpressionRange = { export type FilterExpressionRangeValue = ['-inf' | number, 'inf' | number]; -export interface FilterNode { +export interface VariationsMapSingleFilter { field: string; value: string | number | boolean; } +export interface VariationsMapRange { + field: string; + range: [number, number]; +} + +export type FilterNode = VariationsMapSingleFilter | VariationsMapRange; + export interface FilterBy { and?: Array; or?: Array; @@ -257,7 +264,7 @@ export interface SearchSuggestion extends Item { export type VariationsMapResponse = Array> | Record; -export type Aggregation = 'first' | 'min' | 'max' | 'all' | 'count' | 'field_count' | 'value_count' +export type Aggregation = 'first' | 'min' | 'max' | 'all' | 'count' | 'field_count' | 'value_count'; export interface VariationsMapBaseValue { aggregation: Aggregation; @@ -271,7 +278,7 @@ export interface VariationsMapValueCount extends VariationsMapBaseValue { } export interface VariationsMapStandardValue extends VariationsMapBaseValue { - aggregation: Exclude + aggregation: Exclude; field: string; } From ffb91285d69c38ded7fdf4da1166e1a57f9630dc Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Tue, 24 Mar 2026 15:21:36 +0300 Subject: [PATCH 4/8] Address comment --- src/types/index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 138d7b53..fd93b407 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -241,6 +241,7 @@ export interface Item extends Record { data?: ItemData; strategy?: { id: string }; variations?: { data?: ItemData, value: string }[] + variationsMap?: VariationsMapResponse; } export interface ItemData extends Record { From de16580b6fbbaf70627b1fd736f9ef82561888e8 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Tue, 24 Mar 2026 15:24:04 +0300 Subject: [PATCH 5/8] Lint --- src/types/index.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/index.d.ts b/src/types/index.d.ts index fd93b407..249ad4fc 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -90,8 +90,8 @@ export type ErrorData = { }; export interface ResultSources extends Record { - token_match: { count: number;[key: string]: any }; - embeddings_match: { count: number;[key: string]: any }; + token_match: { count: number; [key: string]: any }; + embeddings_match: { count: number; [key: string]: any }; } export interface SortOption extends Record { From 2d8476645e0a76d0d59291e7e9880fdba9cf137f Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Tue, 24 Mar 2026 15:26:25 +0300 Subject: [PATCH 6/8] Update types --- src/types/index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 249ad4fc..999dadef 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -274,7 +274,6 @@ export interface VariationsMapBaseValue { export interface VariationsMapValueCount extends VariationsMapBaseValue { aggregation: 'value_count'; - field: string; value: boolean | number | string; } From bb9102cc19267ce2c41516790beac2fe60e0f3c5 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Tue, 24 Mar 2026 15:42:26 +0300 Subject: [PATCH 7/8] Update types --- src/types/browse.d.ts | 3 ++- src/types/index.d.ts | 2 +- src/types/tests/autocomplete.test-d.ts | 14 ++++++++++++++ src/types/tests/browse.test-d.ts | 14 ++++++++++++++ src/types/tests/search.test-d.ts | 14 ++++++++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/types/browse.d.ts b/src/types/browse.d.ts index f5063c28..bfb201db 100644 --- a/src/types/browse.d.ts +++ b/src/types/browse.d.ts @@ -13,6 +13,7 @@ import { ResultSources, SortOption, VariationsMap, + VariationsMapResponse, } from '.'; import EventDispatcher from './event-dispatcher'; @@ -136,7 +137,7 @@ export interface BrowseResultData extends Record { is_slotted: false; labels: Record; variations?: Record[]; - variations_map?: Record | Record[]; + variationsMap?: VariationsMapResponse; } export interface BrowseRequestType extends Record { diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 999dadef..5acb9184 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -222,7 +222,7 @@ export interface VariationsMapSingleFilter { export interface VariationsMapRange { field: string; - range: [number, number]; + range: FilterExpressionRangeValue; } export type FilterNode = VariationsMapSingleFilter | VariationsMapRange; diff --git a/src/types/tests/autocomplete.test-d.ts b/src/types/tests/autocomplete.test-d.ts index a3021394..52180a4d 100644 --- a/src/types/tests/autocomplete.test-d.ts +++ b/src/types/tests/autocomplete.test-d.ts @@ -65,6 +65,20 @@ expectAssignable({ field: 'data.VariationId', }, ], + filter_by: { + and: [ + { field: 'data.availability', value: 'in stock' }, + { + not: { field: 'data.discontinued', value: true }, + }, + { + or: [ + { field: 'data.price', range: [10, 100] }, + { field: 'data.backorderable', value: 'true' }, + ], + }, + ], + }, values: { availability: { aggregation: 'all', diff --git a/src/types/tests/browse.test-d.ts b/src/types/tests/browse.test-d.ts index 06abafc9..c3e6176f 100644 --- a/src/types/tests/browse.test-d.ts +++ b/src/types/tests/browse.test-d.ts @@ -123,6 +123,20 @@ expectAssignable({ field: 'data.VariationId', }, ], + filter_by: { + and: [ + { field: 'data.availability', value: 'in stock' }, + { + not: { field: 'data.discontinued', value: true }, + }, + { + or: [ + { field: 'data.price', range: [10, 100] }, + { field: 'data.backorderable', value: 'true' }, + ], + }, + ], + }, values: { availability: { aggregation: 'all', diff --git a/src/types/tests/search.test-d.ts b/src/types/tests/search.test-d.ts index 1bd91f49..1dfe49c6 100644 --- a/src/types/tests/search.test-d.ts +++ b/src/types/tests/search.test-d.ts @@ -132,6 +132,20 @@ expectAssignable({ field: 'data.VariationId', }, ], + filter_by: { + and: [ + { field: 'data.availability', value: 'in stock' }, + { + not: { field: 'data.discontinued', value: true }, + }, + { + or: [ + { field: 'data.price', range: [10, 100] }, + { field: 'data.backorderable', value: 'true' }, + ], + }, + ], + }, values: { availability: { aggregation: 'all', From c2292f551f2b34287fcbc5afa3cd5f33b3cc1e09 Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Tue, 24 Mar 2026 15:54:39 +0300 Subject: [PATCH 8/8] Address comments --- src/types/browse.d.ts | 2 +- src/types/index.d.ts | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/types/browse.d.ts b/src/types/browse.d.ts index bfb201db..fd92b478 100644 --- a/src/types/browse.d.ts +++ b/src/types/browse.d.ts @@ -137,7 +137,7 @@ export interface BrowseResultData extends Record { is_slotted: false; labels: Record; variations?: Record[]; - variationsMap?: VariationsMapResponse; + variations_map?: VariationsMapResponse; } export interface BrowseRequestType extends Record { diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 5acb9184..6ba5fc57 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -12,6 +12,10 @@ export * from './browse'; export * from './tracker'; export * from './event-dispatcher'; +type RequireAtLeastOne = + Pick> & + { [K in Keys]-?: Required> & Partial>> }[Keys]; + export interface NetworkParameters extends Record { timeout?: number; } @@ -227,11 +231,11 @@ export interface VariationsMapRange { export type FilterNode = VariationsMapSingleFilter | VariationsMapRange; -export interface FilterBy { +export type FilterBy = RequireAtLeastOne<{ and?: Array; or?: Array; not?: FilterNode | FilterBy; -} +}>; export interface Item extends Record { value: string; @@ -241,7 +245,7 @@ export interface Item extends Record { data?: ItemData; strategy?: { id: string }; variations?: { data?: ItemData, value: string }[] - variationsMap?: VariationsMapResponse; + variations_map?: VariationsMapResponse; } export interface ItemData extends Record { @@ -279,7 +283,6 @@ export interface VariationsMapValueCount extends VariationsMapBaseValue { export interface VariationsMapStandardValue extends VariationsMapBaseValue { aggregation: Exclude; - field: string; } export interface VariationsMap {