@faststore/api 4.3.1-dev.0 → 4.4.0-dev.1
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.
- package/dist/cjs/index.js +41 -41
- package/dist/cjs/index.js.map +1 -1
- package/dist/es/index.mjs +1705 -1429
- package/dist/es/index.mjs.map +1 -1
- package/dist/src/platforms/vtex/clients/index.d.ts +3 -1
- package/dist/src/platforms/vtex/clients/index.d.ts.map +1 -1
- package/dist/src/platforms/vtex/clients/search/index.d.ts +18 -3
- package/dist/src/platforms/vtex/clients/search/index.d.ts.map +1 -1
- package/dist/src/platforms/vtex/loaders/sku.d.ts.map +1 -1
- package/dist/src/platforms/vtex/resolvers/query.d.ts +2 -1
- package/dist/src/platforms/vtex/resolvers/query.d.ts.map +1 -1
- package/dist/src/platforms/vtex/utils/intelligentSearchRequest.d.ts +52 -0
- package/dist/src/platforms/vtex/utils/intelligentSearchRequest.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/platforms/vtex/clients/search/index.ts +132 -205
- package/src/platforms/vtex/loaders/sku.ts +3 -4
- package/src/platforms/vtex/resolvers/query.ts +70 -39
- package/src/platforms/vtex/utils/intelligentSearchRequest.ts +642 -0
|
@@ -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:
|
|
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
|
|
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
|
|
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:
|
|
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":"
|
|
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,
|
|
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<
|
|
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;
|
|
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
|
+
"version": "4.4.0-dev.1",
|
|
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.
|
|
61
|
+
"@faststore/diagnostics": "^4.4.0-dev.1"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
64
|
"graphql": "16.11.0",
|
|
65
|
-
"@faststore/diagnostics": "4.
|
|
65
|
+
"@faststore/diagnostics": "4.4.0-dev.1"
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
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
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
|
191
|
-
|
|
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
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
sort = '',
|
|
217
|
-
selectedFacets = [],
|
|
218
|
-
type,
|
|
145
|
+
const fetchProduct = ({
|
|
146
|
+
field,
|
|
147
|
+
value,
|
|
148
|
+
hideUnavailableItems: hideUnavailable,
|
|
219
149
|
showInvisibleItems,
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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}/
|
|
164
|
+
`${base}/api/intelligent-search/v1/products?${request.params.toString()}`,
|
|
272
165
|
{ headers }
|
|
273
166
|
)
|
|
274
167
|
}
|
|
275
168
|
|
|
276
|
-
const
|
|
277
|
-
|
|
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
|
|
283
|
-
|
|
284
|
-
|
|
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}/
|
|
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
|
|
295
|
-
|
|
216
|
+
const request = buildIntelligentSearchRequest({
|
|
217
|
+
endpoint: 'top-searches',
|
|
218
|
+
segment,
|
|
219
|
+
defaults: requestDefaults(),
|
|
296
220
|
})
|
|
297
221
|
|
|
298
222
|
return fetchAPI(
|
|
299
|
-
`${base}/
|
|
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:
|
|
232
|
+
args: Omit<SearchArgs, 'type' | 'page' | 'count' | 'sort'>
|
|
309
233
|
): Promise<ProductCountResult> => {
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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}/
|
|
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
|
|
16
|
-
|
|
17
|
-
|
|
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,
|