@faststore/api 4.3.0 → 4.4.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,9 +4,11 @@ export declare const getClients: (options: Options, ctx: GraphqlContext) => {
4
4
  search: {
5
5
  facets: (args: Omit<import('./search').SearchArgs, "type">) => Promise<import('./search/types/FacetSearchResult').FacetSearchResult>;
6
6
  products: (args: Omit<import('./search').SearchArgs, "type">) => Promise<import('./search/types/ProductSearchResult').ProductSearchResult>;
7
+ fetchProduct: ({ field, value, hideUnavailableItems: hideUnavailable, showInvisibleItems, }: import('./search').FetchProductArgs) => Promise<import('./search/types/ProductSearchResult').Product>;
8
+ productsByIdentifier: ({ field, values, showInvisibleItems, hideUnavailableItems: hideUnavailable, }: import('./search').ProductsByIdentifierArgs) => Promise<import('./search/types/ProductSearchResult').Product[]>;
7
9
  suggestedTerms: (args: Omit<import('./search').SearchArgs, "type">) => Promise<import('./search/types/ProductSearchResult').Suggestion>;
8
10
  topSearches: () => Promise<import('./search/types/ProductSearchResult').Suggestion>;
9
- productCount: (args: Pick<import('./search').SearchArgs, "query">) => Promise<import('./search/types/ProductCountResult').ProductCountResult>;
11
+ productCount: (args: Omit<import('./search').SearchArgs, "type" | "page" | "count" | "sort">) => Promise<import('./search/types/ProductCountResult').ProductCountResult>;
10
12
  };
11
13
  commerce: {
12
14
  catalog: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/vtex/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAA;AAIxC,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,EAAE,KAAK,cAAc;;;;;;;;;;;;;;;;;;;;;;;;kCAS2nG,CAAC;;;;;;;;;4BAAmxC,CAAC;;;;;;;;;;;;kBAAyiF,CAAC;mCAAoC,CAAC;uBAAyB,CAAC;;;;;;;;iCAAq5C,CAAC;4BAAoC,CAAC;+BAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAAgwgB,CAAC;;;;;;;;;uBAAkwB,CAAC;4BAA6B,CAAC;;4BAAqD,CAAC;;;;;;;;;;;;;;CAD5mzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/vtex/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAA;AAIxC,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,EAAE,KAAK,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;kCAS2nG,CAAC;;;;;;;;;4BAAmxC,CAAC;;;;;;;;;;;;kBAAyiF,CAAC;mCAAoC,CAAC;uBAAyB,CAAC;;;;;;;;iCAAq5C,CAAC;4BAAoC,CAAC;+BAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAAgwgB,CAAC;;;;;;;;;uBAAkwB,CAAC;4BAA6B,CAAC;;4BAAqD,CAAC;;;;;;;;;;;;;;CAD5mzB,CAAA"}
@@ -1,9 +1,10 @@
1
1
  import { GraphqlContext } from '../../';
2
2
  import { SelectedFacet } from '../../utils/facets';
3
+ import { ProductIdentifierField, Sort } from '../../utils/intelligentSearchRequest';
3
4
  import { Facet, FacetSearchResult, FacetValueBoolean } from './types/FacetSearchResult';
4
5
  import { ProductCountResult } from './types/ProductCountResult';
5
- import { ProductSearchResult, Suggestion } from './types/ProductSearchResult';
6
- export type Sort = 'price:desc' | 'price:asc' | 'orders:desc' | 'name:desc' | 'name:asc' | 'release:desc' | 'discount:desc' | '';
6
+ import { Product, ProductSearchResult, Suggestion } from './types/ProductSearchResult';
7
+ export type { ProductIdentifierField, Sort, } from '../../utils/intelligentSearchRequest';
7
8
  export interface SearchArgs {
8
9
  query?: string;
9
10
  page: number;
@@ -22,12 +23,26 @@ export interface ProductLocator {
22
23
  field: 'id' | 'slug';
23
24
  value: string;
24
25
  }
26
+ export interface FetchProductArgs {
27
+ field: ProductIdentifierField;
28
+ value: string;
29
+ showInvisibleItems?: boolean;
30
+ hideUnavailableItems?: boolean;
31
+ }
32
+ export interface ProductsByIdentifierArgs {
33
+ field: ProductIdentifierField;
34
+ values: string[];
35
+ showInvisibleItems?: boolean;
36
+ hideUnavailableItems?: boolean;
37
+ }
25
38
  export declare const isFacetBoolean: (facet: Facet) => facet is Facet<FacetValueBoolean>;
26
39
  export declare const IntelligentSearch: ({ account, environment, hideUnavailableItems, simulationBehavior, showSponsored, subDomainPrefix, }: Options, ctx: GraphqlContext) => {
27
40
  facets: (args: Omit<SearchArgs, "type">) => Promise<FacetSearchResult>;
28
41
  products: (args: Omit<SearchArgs, "type">) => Promise<ProductSearchResult>;
42
+ fetchProduct: ({ field, value, hideUnavailableItems: hideUnavailable, showInvisibleItems, }: FetchProductArgs) => Promise<Product>;
43
+ productsByIdentifier: ({ field, values, showInvisibleItems, hideUnavailableItems: hideUnavailable, }: ProductsByIdentifierArgs) => Promise<Product[]>;
29
44
  suggestedTerms: (args: Omit<SearchArgs, "type">) => Promise<Suggestion>;
30
45
  topSearches: () => Promise<Suggestion>;
31
- productCount: (args: Pick<SearchArgs, "query">) => Promise<ProductCountResult>;
46
+ productCount: (args: Omit<SearchArgs, "type" | "page" | "count" | "sort">) => Promise<ProductCountResult>;
32
47
  };
33
48
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/platforms/vtex/clients/search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAG5C,OAAO,KAAK,EAGV,aAAa,EACd,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EACV,KAAK,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,KAAK,EACV,mBAAmB,EACnB,UAAU,EACX,MAAM,6BAA6B,CAAA;AAEpC,MAAM,MAAM,IAAI,GACZ,YAAY,GACZ,WAAW,GACX,aAAa,GACb,WAAW,GACX,UAAU,GACV,cAAc,GACd,eAAe,GACf,EAAE,CAAA;AAEN,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,gBAAgB,GAAG,QAAQ,GAAG,oBAAoB,CAAA;IACxD,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;IAChC,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAA;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAsBD,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,KACX,KAAK,IAAI,KAAK,CAAC,iBAAiB,CAA0B,CAAA;AAe7D,eAAO,MAAM,iBAAiB,GAC5B,qGAOG,OAAO,EACV,KAAK,cAAc;mBA+MG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;qBA5BtB,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;2BAIxC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,UAAU,CAAC;uBAYE,OAAO,CAAC,UAAU,CAAC;yBAenC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,KAC9B,OAAO,CAAC,kBAAkB,CAAC;CAoB/B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/platforms/vtex/clients/search/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,IAAI,EACV,MAAM,sCAAsC,CAAA;AAE7C,OAAO,KAAK,EACV,KAAK,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EACnB,UAAU,EACX,MAAM,6BAA6B,CAAA;AAEpC,YAAY,EACV,sBAAsB,EACtB,IAAI,GACL,MAAM,sCAAsC,CAAA;AAM7C,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,gBAAgB,GAAG,QAAQ,GAAG,oBAAoB,CAAA;IACxD,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;IAChC,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAA;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,sBAAsB,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,sBAAsB,CAAA;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,KACX,KAAK,IAAI,KAAK,CAAC,iBAAiB,CAA0B,CAAA;AAiB7D,eAAO,MAAM,iBAAiB,GAC5B,qGAOG,OAAO,EACV,KAAK,cAAc;mBAoIG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;qBAtFtB,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;iGAQ7C,gBAAgB,KAAG,OAAO,CAAC,OAAO,CAAC;0GAwBnC,wBAAwB,KAAG,OAAO,CAAC,OAAO,EAAE,CAAC;2BA0BxC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,UAAU,CAAC;uBAcE,OAAO,CAAC,UAAU,CAAC;yBAiBnC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,KACzD,OAAO,CAAC,kBAAkB,CAAC;CAuB/B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"sku.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/vtex/loaders/sku.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,eAAO,MAAM,YAAY,GAAI,WAAW,OAAO,EAAE,SAAS,OAAO,4CA2ChE,CAAA"}
1
+ {"version":3,"file":"sku.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/vtex/loaders/sku.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGtD,eAAO,MAAM,YAAY,GAAI,WAAW,OAAO,EAAE,SAAS,OAAO,4CA0ChE,CAAA"}
@@ -2,13 +2,14 @@ import { ProcessOrderAuthorizationRule, QueryAllCollectionsArgs, QueryAllProduct
2
2
  import { CategoryTree } from '../clients/commerce/types/CategoryTree';
3
3
  import { ProfileAddress } from '../clients/commerce/types/Profile';
4
4
  import { SearchArgs } from '../clients/search';
5
+ import { ProductSearchResult } from '../clients/search/types/ProductSearchResult';
5
6
  import { GraphqlContext } from '../index';
6
7
  export declare const Query: {
7
8
  product: (_: unknown, { locator }: QueryProductArgs, ctx: GraphqlContext) => Promise<import('../utils/enhanceSku').EnhancedSku>;
8
9
  collection: (_: unknown, { slug }: QueryCollectionArgs, ctx: GraphqlContext) => Promise<import('../clients/commerce/types/Portal').CollectionPageType>;
9
10
  search: (_: unknown, { first, after: maybeAfter, sort, term, selectedFacets, sponsoredCount, }: QuerySearchArgs, ctx: GraphqlContext) => Promise<{
10
11
  searchArgs: Omit<SearchArgs, "type">;
11
- productSearchPromise: Promise<import('../../..').ProductSearchResult>;
12
+ productSearchPromise: Promise<ProductSearchResult>;
12
13
  }>;
13
14
  allProducts: (_: unknown, { first, after: maybeAfter }: QueryAllProductsArgs, ctx: GraphqlContext) => Promise<{
14
15
  pageInfo: {
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/vtex/resolvers/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,+BAA+B,CAAA;AAUtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAkB9C,eAAO,MAAM,KAAK;iBAEX,OAAO,eACG,gBAAgB,OACxB,cAAc;oBA+EhB,OAAO,YACA,mBAAmB,OACxB,cAAc;gBAShB,OAAO,6EAQP,eAAe,OACb,cAAc;;;;qBAuDhB,OAAO,gCACoB,oBAAoB,OAC7C,cAAc;;;;;;;;;;;;;kBAkChB,OAAO,kBACM,iBAAiB,OAC5B,cAAc;wBA0BhB,OAAO,gCACoB,uBAAuB,OAChD,cAAc;;;;;;;;;;;;;;;;;;uBAa6B,MAAM;;;;;kBA2CnD,OAAO,kCACsB,iBAAiB,OAC5C,cAAc;;;;;;;;;;;;;;;;;kBAkBhB,OAAO,4BACgB,iBAAiB,OACtC,cAAc;;;iBAqBhB,OAAO,yDAC6C,gBAAgB,OAClE,cAAc;;;;iBAqBhB,OAAO,UACF,gBAAgB,OACnB,cAAc;;;sBAyBhB,OAAO,YACA,qBAAqB,OAC1B,cAAc;mBAahB,OAAO,eACG,kBAAkB,OAC1B,cAAc;;;;;;;;;;;;;;;;;;;;;;;wBAqGhB,OAAO,WACD,uBAAuB,OAC3B,cAAc;;;;;;;;;;;;;;;sBAwBG,OAAO,MAAM,OAAO,QAAQ,cAAc;;;qBAQ3C,OAAO,MAAM,OAAO,OAAO,cAAc;;;;;;;;wBAqCtC,OAAO,MAAM,OAAO,OAAO,cAAc;;;;;sBAmD9D,OAAO,sBACU,qBAAqB,OACpC,cAAc;;;;;;;oBAe46P,CAAC;;;;;;;;;;;;;;;CADn8P,CAAA"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/vtex/resolvers/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,+BAA+B,CAAA;AAUtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAA;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AA4B9C,eAAO,MAAM,KAAK;iBAEX,OAAO,eACG,gBAAgB,OACxB,cAAc;oBAgFhB,OAAO,YACA,mBAAmB,OACxB,cAAc;gBAShB,OAAO,6EAQP,eAAe,OACb,cAAc;;;;qBA4EhB,OAAO,gCACoB,oBAAoB,OAC7C,cAAc;;;;;;;;;;;;;kBAkChB,OAAO,kBACM,iBAAiB,OAC5B,cAAc;wBAwBhB,OAAO,gCACoB,uBAAuB,OAChD,cAAc;;;;;;;;;;;;;;;;;;uBAa6B,MAAM;;;;;kBA2CnD,OAAO,kCACsB,iBAAiB,OAC5C,cAAc;;;;;;;;;;;;;;;;;kBAkBhB,OAAO,4BACgB,iBAAiB,OACtC,cAAc;;;iBAqBhB,OAAO,yDAC6C,gBAAgB,OAClE,cAAc;;;;iBAqBhB,OAAO,UACF,gBAAgB,OACnB,cAAc;;;sBAyBhB,OAAO,YACA,qBAAqB,OAC1B,cAAc;mBAahB,OAAO,eACG,kBAAkB,OAC1B,cAAc;;;;;;;;;;;;;;;;;;;;;;;wBAqGhB,OAAO,WACD,uBAAuB,OAC3B,cAAc;;;;;;;;;;;;;;;sBAwBG,OAAO,MAAM,OAAO,QAAQ,cAAc;;;qBAQ3C,OAAO,MAAM,OAAO,OAAO,cAAc;;;;;;;;wBAqCtC,OAAO,MAAM,OAAO,OAAO,cAAc;;;;;sBAmD9D,OAAO,sBACU,qBAAqB,OACpC,cAAc;;;;;;;oBAeo2N,CAAC;;;;;;;;;;;;;;;CAD33N,CAAA"}
@@ -0,0 +1,52 @@
1
+ export interface IntelligentSearchFacet {
2
+ key: string;
3
+ value: string;
4
+ }
5
+ export type Sort = 'price:desc' | 'price:asc' | 'orders:desc' | 'name:desc' | 'name:asc' | 'release:desc' | 'discount:desc' | '';
6
+ export type ProductIdentifierField = 'id' | 'slug' | 'ean' | 'reference' | 'sku';
7
+ export type IntelligentSearchEndpoint = 'product-search' | 'facets' | 'catalog-count' | 'products' | 'search-suggestions' | 'top-searches';
8
+ export interface IntelligentSearchDefaults {
9
+ salesChannel?: string | number;
10
+ regionId?: string;
11
+ locale: string;
12
+ hideUnavailableItems?: boolean;
13
+ simulationBehavior?: 'default' | 'skip' | 'only1P';
14
+ showSponsored?: boolean;
15
+ }
16
+ export interface IntelligentSearchRequestArgs {
17
+ query?: string;
18
+ page?: number;
19
+ count?: number;
20
+ sort?: Sort;
21
+ selectedFacets?: IntelligentSearchFacet[];
22
+ showInvisibleItems?: boolean;
23
+ hideUnavailableItems?: boolean;
24
+ sponsoredCount?: number;
25
+ allowRedirect?: boolean;
26
+ field?: ProductIdentifierField;
27
+ value?: string;
28
+ }
29
+ export interface IntelligentSearchRequestInput {
30
+ endpoint: IntelligentSearchEndpoint;
31
+ /** Decoded vtex_segment object (params + extraFacets are extracted internally). */
32
+ segment?: Record<string, unknown>;
33
+ defaults?: IntelligentSearchDefaults;
34
+ args?: IntelligentSearchRequestArgs;
35
+ }
36
+ export interface IntelligentSearchRequest {
37
+ /** Attribute path segment only (no base URL or endpoint prefix). */
38
+ path: string;
39
+ params: URLSearchParams;
40
+ toString(): string;
41
+ }
42
+ /**
43
+ * Reads and decodes the `vtex_segment` cookie. Does not create a segment.
44
+ * Returns an empty object when the cookie is absent or invalid.
45
+ */
46
+ export declare function parseSegmentCookie(cookieHeader?: string): Record<string, unknown>;
47
+ /**
48
+ * Pure builder for intelligent-search v1 path + query params.
49
+ * Callers assemble the full URL: `/api/intelligent-search/v1/${endpoint}/${request.path}?${request.params}`.
50
+ */
51
+ export declare function buildIntelligentSearchRequest(input: IntelligentSearchRequestInput): IntelligentSearchRequest;
52
+ //# sourceMappingURL=intelligentSearchRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligentSearchRequest.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/vtex/utils/intelligentSearchRequest.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AA8BD,MAAM,MAAM,IAAI,GACZ,YAAY,GACZ,WAAW,GACX,aAAa,GACb,WAAW,GACX,UAAU,GACV,cAAc,GACd,eAAe,GACf,EAAE,CAAA;AAEN,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,KAAK,CAAA;AAEhF,MAAM,MAAM,yBAAyB,GACjC,gBAAgB,GAChB,QAAQ,GACR,eAAe,GACf,UAAU,GACV,oBAAoB,GACpB,cAAc,CAAA;AAElB,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;IAClD,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,cAAc,CAAC,EAAE,sBAAsB,EAAE,CAAA;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,sBAAsB,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,yBAAyB,CAAA;IACnC,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,yBAAyB,CAAA;IACpC,IAAI,CAAC,EAAE,4BAA4B,CAAA;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,IAAI,MAAM,CAAA;CACnB;AA0CD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAoaD;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,6BAA6B,GACnC,wBAAwB,CAyD1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/api",
3
- "version": "4.3.0",
3
+ "version": "4.4.0-dev.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/cjs/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -58,11 +58,11 @@
58
58
  "vite": "7.1.5",
59
59
  "vite-plugin-dts": "4.5.4",
60
60
  "vitest": "^4.0.7",
61
- "@faststore/diagnostics": "^4.3.0"
61
+ "@faststore/diagnostics": "^4.4.0-dev.0"
62
62
  },
63
63
  "peerDependencies": {
64
64
  "graphql": "16.11.0",
65
- "@faststore/diagnostics": "4.3.0"
65
+ "@faststore/diagnostics": "4.4.0-dev.0"
66
66
  },
67
67
  "publishConfig": {
68
68
  "access": "public"
@@ -1,11 +1,14 @@
1
+ import pLimit from 'p-limit'
2
+
1
3
  import type { GraphqlContext } from '../../'
2
- import type { IStoreSelectedFacet } from '../../../../__generated__/schema'
3
4
  import { getWithCookie } from '../../utils/cookies'
4
- import type {
5
- FuzzyFacet,
6
- OperatorFacet,
7
- SelectedFacet,
8
- } from '../../utils/facets'
5
+ import type { SelectedFacet } from '../../utils/facets'
6
+ import {
7
+ buildIntelligentSearchRequest,
8
+ parseSegmentCookie,
9
+ type ProductIdentifierField,
10
+ type Sort,
11
+ } from '../../utils/intelligentSearchRequest'
9
12
  import { fetchAPI } from '../fetch'
10
13
  import type {
11
14
  Facet,
@@ -14,19 +17,19 @@ import type {
14
17
  } from './types/FacetSearchResult'
15
18
  import type { ProductCountResult } from './types/ProductCountResult'
16
19
  import type {
20
+ Product,
17
21
  ProductSearchResult,
18
22
  Suggestion,
19
23
  } from './types/ProductSearchResult'
20
24
 
21
- export type Sort =
22
- | 'price:desc'
23
- | 'price:asc'
24
- | 'orders:desc'
25
- | 'name:desc'
26
- | 'name:asc'
27
- | 'release:desc'
28
- | 'discount:desc'
29
- | ''
25
+ export type {
26
+ ProductIdentifierField,
27
+ Sort,
28
+ } from '../../utils/intelligentSearchRequest'
29
+
30
+ // Bounds simultaneous IS v1 /products calls; values cardinality is capped
31
+ // upstream by DataLoader maxBatchSize (99) and cross-sell/products `first`.
32
+ const PRODUCTS_BY_IDENTIFIER_CONCURRENCY = 10
30
33
 
31
34
  export interface SearchArgs {
32
35
  query?: string
@@ -48,41 +51,37 @@ export interface ProductLocator {
48
51
  value: string
49
52
  }
50
53
 
51
- const POLICY_KEY = 'trade-policy'
52
- const REGION_KEY = 'region-id'
53
- const FUZZY_KEY = 'fuzzy'
54
- const OPERATOR_KEY = 'operator'
55
- const PICKUP_POINT_KEY = 'pickupPoint'
56
- const SHIPPING_KEY = 'shipping'
57
- const DELIVERY_OPTIONS_KEY = 'delivery-options'
58
- const IN_STOCK_KEY = 'in-stock'
59
-
60
- const EXTRA_FACETS_KEYS = new Set([
61
- POLICY_KEY,
62
- REGION_KEY,
63
- FUZZY_KEY,
64
- OPERATOR_KEY,
65
- PICKUP_POINT_KEY,
66
- SHIPPING_KEY,
67
- DELIVERY_OPTIONS_KEY,
68
- IN_STOCK_KEY,
69
- ])
54
+ export interface FetchProductArgs {
55
+ field: ProductIdentifierField
56
+ value: string
57
+ showInvisibleItems?: boolean
58
+ hideUnavailableItems?: boolean
59
+ }
60
+
61
+ export interface ProductsByIdentifierArgs {
62
+ field: ProductIdentifierField
63
+ values: string[]
64
+ showInvisibleItems?: boolean
65
+ hideUnavailableItems?: boolean
66
+ }
70
67
 
71
68
  export const isFacetBoolean = (
72
69
  facet: Facet
73
70
  ): facet is Facet<FacetValueBoolean> => facet.type === 'TEXT'
74
71
 
75
- const isFuzzyFacet = (facet: SelectedFacet): facet is FuzzyFacet => {
76
- return (
77
- facet.key === 'fuzzy' &&
78
- (facet.value === '0' || facet.value === '1' || facet.value === 'auto')
79
- )
72
+ function getRegionIdFromContext(ctx: GraphqlContext): string | undefined {
73
+ const { regionId, seller } = ctx.storage.channel
74
+ const sellerRegionId = seller
75
+ ? Buffer.from(`SW#${seller}`).toString('base64')
76
+ : undefined
77
+
78
+ return sellerRegionId ?? (regionId || undefined)
80
79
  }
81
80
 
82
- const isOperatorFacet = (facet: SelectedFacet): facet is OperatorFacet => {
83
- return (
84
- facet.key === 'operator' && (facet.value === 'and' || facet.value === 'or')
85
- )
81
+ function getSegmentLocale(ctx: GraphqlContext): string {
82
+ const segment = parseSegmentCookie(ctx.headers?.cookie)
83
+
84
+ return (segment.cultureInfo as string | undefined) ?? ctx.storage.locale
86
85
  }
87
86
 
88
87
  export const IntelligentSearch = (
@@ -96,8 +95,18 @@ export const IntelligentSearch = (
96
95
  }: Options,
97
96
  ctx: GraphqlContext
98
97
  ) => {
99
- const base = `https://${account}.${environment}.com.br/api/io`
98
+ const base = `https://${account}.${environment}.com.br`
100
99
  const withCookie = getWithCookie(ctx)
100
+ const segment = parseSegmentCookie(ctx.headers?.cookie)
101
+
102
+ const requestDefaults = () => ({
103
+ salesChannel: ctx.storage.channel.salesChannel,
104
+ regionId: getRegionIdFromContext(ctx),
105
+ locale: getSegmentLocale(ctx),
106
+ hideUnavailableItems,
107
+ simulationBehavior,
108
+ showSponsored,
109
+ })
101
110
 
102
111
  const host =
103
112
  new Headers(ctx.headers).get('x-forwarded-host') ?? ctx.headers?.host ?? ''
@@ -115,188 +124,103 @@ export const IntelligentSearch = (
115
124
  'X-FORWARDED-HOST': forwardedHost,
116
125
  })
117
126
 
118
- const getPolicyFacet = (): IStoreSelectedFacet | null => {
119
- const { salesChannel } = ctx.storage.channel
120
-
121
- if (!salesChannel) {
122
- return null
123
- }
124
-
125
- return {
126
- key: POLICY_KEY,
127
- value: salesChannel,
128
- }
129
- }
130
-
131
- const getRegionFacet = (): IStoreSelectedFacet | null => {
132
- const { regionId, seller } = ctx.storage.channel
133
- const sellerRegionId = seller
134
- ? Buffer.from(`SW#${seller}`).toString('base64')
135
- : null
136
- const facet = sellerRegionId ?? regionId
137
-
138
- if (!facet) {
139
- return null
140
- }
141
-
142
- return {
143
- key: REGION_KEY,
144
- value: facet,
145
- }
146
- }
127
+ const search = <T>({ type, ...args }: SearchArgs): Promise<T> => {
128
+ const endpoint = type === 'facets' ? 'facets' : 'product-search'
129
+ const request = buildIntelligentSearchRequest({
130
+ endpoint,
131
+ segment,
132
+ defaults: requestDefaults(),
133
+ args,
134
+ })
147
135
 
148
- const addDefaultFacets = (facets: SelectedFacet[]) => {
149
- const withDefaultFacets = facets.filter(
150
- ({ key }) => !EXTRA_FACETS_KEYS.has(key)
136
+ return fetchAPI(
137
+ `${base}/api/intelligent-search/v1/${endpoint}/${request.path}?${request.params.toString()}`,
138
+ { headers }
151
139
  )
152
-
153
- const shippingFacet =
154
- facets.find(
155
- ({ key, value }) =>
156
- key === SHIPPING_KEY && value !== 'all-delivery-methods'
157
- ) ?? null
158
-
159
- const deliveryOptionsFacet =
160
- facets.find(
161
- ({ key, value }) =>
162
- key === DELIVERY_OPTIONS_KEY && value !== 'all-delivery-options'
163
- ) ?? null
164
-
165
- const policyFacet =
166
- facets.find(({ key }) => key === POLICY_KEY) ?? getPolicyFacet()
167
-
168
- const regionFacet =
169
- facets.find(({ key }) => key === REGION_KEY) ?? getRegionFacet()
170
-
171
- if (shippingFacet !== null) {
172
- withDefaultFacets.push(shippingFacet)
173
- }
174
-
175
- if (deliveryOptionsFacet !== null) {
176
- withDefaultFacets.push(deliveryOptionsFacet)
177
- }
178
-
179
- if (policyFacet !== null) {
180
- withDefaultFacets.push(policyFacet)
181
- }
182
-
183
- if (regionFacet !== null) {
184
- withDefaultFacets.push(regionFacet)
185
- }
186
-
187
- return withDefaultFacets
188
140
  }
189
141
 
190
- const addSearchParamsFacets = (
191
- facets: SelectedFacet[],
192
- params: URLSearchParams
193
- ) => {
194
- const fuzzyFacet = facets.find(({ key }) => key === FUZZY_KEY) ?? null
195
- const operatorFacet = facets.find(({ key }) => key === OPERATOR_KEY) ?? null
196
- const pickupPointFacet =
197
- facets.find(({ key }) => key === PICKUP_POINT_KEY) ?? null
198
-
199
- if (fuzzyFacet && isFuzzyFacet(fuzzyFacet)) {
200
- params.append(FUZZY_KEY, fuzzyFacet.value)
201
- }
202
-
203
- if (operatorFacet && isOperatorFacet(operatorFacet)) {
204
- params.append(OPERATOR_KEY, operatorFacet.value)
205
- }
206
-
207
- if (pickupPointFacet) {
208
- params.append(PICKUP_POINT_KEY, pickupPointFacet.value)
209
- }
210
- }
142
+ const products = (args: Omit<SearchArgs, 'type'>) =>
143
+ search<ProductSearchResult>({ ...args, type: 'product_search' })
211
144
 
212
- const search = <T>({
213
- query = '',
214
- page,
215
- count,
216
- sort = '',
217
- selectedFacets = [],
218
- type,
145
+ const fetchProduct = ({
146
+ field,
147
+ value,
148
+ hideUnavailableItems: hideUnavailable,
219
149
  showInvisibleItems,
220
- sponsoredCount,
221
- hideUnavailableItems: searchHideUnavailableItems,
222
- allowRedirect = false,
223
- }: SearchArgs): Promise<T> => {
224
- const params = new URLSearchParams({
225
- page: (page + 1).toString(),
226
- count: count !== 0 ? count.toString() : '1',
227
- query,
228
- sort,
229
- locale: ctx.storage.locale,
150
+ }: FetchProductArgs): Promise<Product> => {
151
+ const request = buildIntelligentSearchRequest({
152
+ endpoint: 'products',
153
+ segment,
154
+ defaults: requestDefaults(),
155
+ args: {
156
+ field,
157
+ value,
158
+ hideUnavailableItems: hideUnavailable,
159
+ showInvisibleItems,
160
+ },
230
161
  })
231
162
 
232
- addSearchParamsFacets(selectedFacets, params)
233
-
234
- if (showInvisibleItems) {
235
- params.append('show-invisible-items', 'true')
236
- }
237
-
238
- if (hideUnavailableItems !== undefined) {
239
- const inStockFacet = selectedFacets.find(
240
- ({ key }) => key === IN_STOCK_KEY
241
- )
242
- const shouldHideUnavailableItems = inStockFacet
243
- ? inStockFacet.value
244
- : (searchHideUnavailableItems?.toString() ??
245
- hideUnavailableItems.toString())
246
-
247
- params.append('hideUnavailableItems', shouldHideUnavailableItems)
248
- }
249
-
250
- if (simulationBehavior !== undefined) {
251
- params.append('simulationBehavior', simulationBehavior.toString())
252
- }
253
-
254
- if (showSponsored !== undefined) {
255
- params.append('showSponsored', showSponsored.toString())
256
- }
257
-
258
- if (sponsoredCount !== undefined) {
259
- params.append('sponsoredCount', sponsoredCount.toString())
260
- }
261
-
262
- if (allowRedirect !== undefined) {
263
- params.append('allowRedirect', allowRedirect.toString())
264
- }
265
-
266
- const pathname = addDefaultFacets(selectedFacets)
267
- .map(({ key, value }) => `${key}/${value}`)
268
- .join('/')
269
-
270
163
  return fetchAPI(
271
- `${base}/_v/api/intelligent-search/${type}/${pathname}?${params.toString()}`,
164
+ `${base}/api/intelligent-search/v1/products?${request.params.toString()}`,
272
165
  { headers }
273
166
  )
274
167
  }
275
168
 
276
- const products = (args: Omit<SearchArgs, 'type'>) =>
277
- search<ProductSearchResult>({ ...args, type: 'product_search' })
169
+ const productsByIdentifier = async ({
170
+ field,
171
+ values,
172
+ showInvisibleItems,
173
+ hideUnavailableItems: hideUnavailable,
174
+ }: ProductsByIdentifierArgs): Promise<Product[]> => {
175
+ const limit = pLimit(PRODUCTS_BY_IDENTIFIER_CONCURRENCY)
176
+
177
+ const productsResult = await Promise.all(
178
+ values.map((value) =>
179
+ limit(async () => {
180
+ try {
181
+ return await fetchProduct({
182
+ field,
183
+ value,
184
+ hideUnavailableItems: hideUnavailable,
185
+ showInvisibleItems,
186
+ })
187
+ } catch {
188
+ return null
189
+ }
190
+ })
191
+ )
192
+ )
193
+
194
+ return productsResult.filter(
195
+ (product): product is Product => product !== null
196
+ )
197
+ }
278
198
 
279
199
  const suggestedTerms = (
280
200
  args: Omit<SearchArgs, 'type'>
281
201
  ): Promise<Suggestion> => {
282
- const params = new URLSearchParams({
283
- query: args.query?.toString() ?? '',
284
- locale: ctx.storage.locale,
202
+ const request = buildIntelligentSearchRequest({
203
+ endpoint: 'search-suggestions',
204
+ segment,
205
+ defaults: requestDefaults(),
206
+ args: { query: args.query },
285
207
  })
286
208
 
287
209
  return fetchAPI(
288
- `${base}/_v/api/intelligent-search/search_suggestions?${params.toString()}`,
210
+ `${base}/api/intelligent-search/v1/search-suggestions?${request.params.toString()}`,
289
211
  { headers }
290
212
  )
291
213
  }
292
214
 
293
215
  const topSearches = (): Promise<Suggestion> => {
294
- const params = new URLSearchParams({
295
- locale: ctx.storage.locale,
216
+ const request = buildIntelligentSearchRequest({
217
+ endpoint: 'top-searches',
218
+ segment,
219
+ defaults: requestDefaults(),
296
220
  })
297
221
 
298
222
  return fetchAPI(
299
- `${base}/_v/api/intelligent-search/top_searches?${params.toString()}`,
223
+ `${base}/api/intelligent-search/v1/top-searches?${request.params.toString()}`,
300
224
  { headers }
301
225
  )
302
226
  }
@@ -305,16 +229,17 @@ export const IntelligentSearch = (
305
229
  search<FacetSearchResult>({ ...args, type: 'facets' })
306
230
 
307
231
  const productCount = (
308
- args: Pick<SearchArgs, 'query'>
232
+ args: Omit<SearchArgs, 'type' | 'page' | 'count' | 'sort'>
309
233
  ): Promise<ProductCountResult> => {
310
- const params = new URLSearchParams()
311
-
312
- if (args?.query) {
313
- params.append('query', args.query.toString())
314
- }
234
+ const request = buildIntelligentSearchRequest({
235
+ endpoint: 'catalog-count',
236
+ segment,
237
+ defaults: requestDefaults(),
238
+ args,
239
+ })
315
240
 
316
241
  return fetchAPI(
317
- `${base}/_v/api/intelligent-search/catalog_count?${params.toString()}`,
242
+ `${base}/api/intelligent-search/v1/catalog-count/${request.path}?${request.params.toString()}`,
318
243
  { headers }
319
244
  )
320
245
  }
@@ -322,6 +247,8 @@ export const IntelligentSearch = (
322
247
  return {
323
248
  facets,
324
249
  products,
250
+ fetchProduct,
251
+ productsByIdentifier,
325
252
  suggestedTerms,
326
253
  topSearches,
327
254
  productCount,
@@ -12,10 +12,9 @@ export const getSkuLoader = ({ flags }: Options, clients: Clients) => {
12
12
  (key) => key.split('-')[1] === 'invisibleItems'
13
13
  )
14
14
 
15
- const { products } = await clients.search.products({
16
- query: `sku:${skuIds.join(';')}`,
17
- page: 0,
18
- count: skuIds.length,
15
+ const products = await clients.search.productsByIdentifier({
16
+ field: 'sku',
17
+ values: skuIds,
19
18
  showInvisibleItems,
20
19
  ...(flags?.enableUnavailableItemsOnCart && {
21
20
  hideUnavailableItems: false,