@askdialog/dialog-sdk 2.8.1 → 2.9.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/Dialog.d.ts.map +1 -1
- package/dist/Dialog.js +5 -1
- package/dist/__tests__/dialogSearchAnalytics.spec.js +1 -0
- package/dist/__tests__/searchController.spec.js +25 -0
- package/dist/__tests__/searchControllerAttribution.spec.js +3 -0
- package/dist/__tests__/searchImpressions.spec.js +1 -0
- package/dist/__tests__/searchService.spec.js +14 -0
- package/dist/searchController.d.ts +1 -1
- package/dist/searchController.d.ts.map +1 -1
- package/dist/searchController.js +7 -1
- package/dist/services/search.d.ts.map +1 -1
- package/dist/services/search.js +8 -1
- package/dist/types/search.d.ts +5 -0
- package/dist/types/search.d.ts.map +1 -1
- package/dist/types/searchAnalytics.d.ts +4 -0
- package/dist/types/searchAnalytics.d.ts.map +1 -1
- package/dist/types/searchAnalytics.js +1 -0
- package/dist/types/searchController.d.ts +2 -0
- package/dist/types/searchController.d.ts.map +1 -1
- package/dist/utils/localization.d.ts +1 -0
- package/dist/utils/localization.d.ts.map +1 -1
- package/dist/utils/localization.js +11 -0
- package/dist/utils/searchControllerAnalytics.d.ts.map +1 -1
- package/dist/utils/searchControllerAnalytics.js +2 -0
- package/package.json +1 -1
package/dist/Dialog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../src/Dialog.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EACL,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,cAAc,EAEd,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,qBAAa,MAAM;IACjB,gBAAuB,OAAO,SAAuB;IAErD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAE9B,OAAO,CAAC,UAAU,CAAC,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,wBAAwB,CAAU;IAC1C,OAAO,CAAC,iBAAiB,CAAU;gBAEvB,EACV,MAAM,EACN,MAAM,EACN,WAAW,EACX,SAAS,EACT,KAAK,EACL,MAAM,EACN,uBAAuB,EACvB,gBAAgB,GACjB,EAAE,iBAAiB;IAcpB,IAAW,MAAM,IAAI,MAAM,CAE1B;IACD,IAAW,KAAK,IAAI,KAAK,CAExB;IACD,IAAW,MAAM,IAAI,MAAM,CAE1B;IACD,IAAW,MAAM,IAAI,MAAM,CAE1B;IACD,IAAW,aAAa,IAAI,aAAa,CAExC;IAEM,2BAA2B,IAAI,kBAAkB,GAAG,IAAI;IAI/D,OAAO,CAAC,uBAAuB;IAkBlB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAInE;;;;;;OAMG;IACI,MAAM,CACX,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../src/Dialog.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EACL,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,cAAc,EAEd,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,qBAAa,MAAM;IACjB,gBAAuB,OAAO,SAAuB;IAErD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAE9B,OAAO,CAAC,UAAU,CAAC,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,wBAAwB,CAAU;IAC1C,OAAO,CAAC,iBAAiB,CAAU;gBAEvB,EACV,MAAM,EACN,MAAM,EACN,WAAW,EACX,SAAS,EACT,KAAK,EACL,MAAM,EACN,uBAAuB,EACvB,gBAAgB,GACjB,EAAE,iBAAiB;IAcpB,IAAW,MAAM,IAAI,MAAM,CAE1B;IACD,IAAW,KAAK,IAAI,KAAK,CAExB;IACD,IAAW,MAAM,IAAI,MAAM,CAE1B;IACD,IAAW,MAAM,IAAI,MAAM,CAE1B;IACD,IAAW,aAAa,IAAI,aAAa,CAExC;IAEM,2BAA2B,IAAI,kBAAkB,GAAG,IAAI;IAI/D,OAAO,CAAC,uBAAuB;IAkBlB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAInE;;;;;;OAMG;IACI,MAAM,CACX,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,CAAC;IAanB,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAKjD,cAAc,IAAI,IAAI;IAItB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAIxD,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAOxD,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAIjE,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAInD,UAAU,CACf,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAUhB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5D,OAAO,CAAC,oBAAoB;IAUrB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAcnD,2BAA2B,CAChC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB,GAClD,IAAI;IA0BP;;;;OAIG;IACI,sBAAsB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAUpE;;;OAGG;IACI,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI;IAUtE,OAAO,CAAC,cAAc;CAwCvB"}
|
package/dist/Dialog.js
CHANGED
|
@@ -76,7 +76,11 @@ export class Dialog {
|
|
|
76
76
|
* native AbortError / network error otherwise.
|
|
77
77
|
*/
|
|
78
78
|
search(request, options) {
|
|
79
|
-
return searchProducts(this._apiKey,
|
|
79
|
+
return searchProducts(this._apiKey, {
|
|
80
|
+
...request,
|
|
81
|
+
locale: request.locale ?? this._locale,
|
|
82
|
+
countryCode: request.countryCode ?? this._countryCode,
|
|
83
|
+
}, options);
|
|
80
84
|
}
|
|
81
85
|
// TODO: Not yet implemented on assistant
|
|
82
86
|
openAssistant(params) {
|
|
@@ -87,6 +87,31 @@ describe("createSearchController", () => {
|
|
|
87
87
|
expect(search.mock.calls[0][0]).toMatchObject({ query: "shoes", page: 0 });
|
|
88
88
|
expect(controller.getState().status).toBe(SearchStatus.SUCCESS);
|
|
89
89
|
});
|
|
90
|
+
it("stamps the configured market on every request, and omits it otherwise", async () => {
|
|
91
|
+
const marketController = createSearchController({
|
|
92
|
+
search,
|
|
93
|
+
analytics: {
|
|
94
|
+
surface: "search_page",
|
|
95
|
+
trackViewSearchResults,
|
|
96
|
+
trackSelectSearchResult,
|
|
97
|
+
},
|
|
98
|
+
locale: "fr",
|
|
99
|
+
countryCode: "CA",
|
|
100
|
+
});
|
|
101
|
+
search.mockResolvedValue(response({ query: "shoes" }));
|
|
102
|
+
marketController.submit("shoes");
|
|
103
|
+
await settle();
|
|
104
|
+
expect(search.mock.calls[0][0]).toMatchObject({
|
|
105
|
+
locale: "fr",
|
|
106
|
+
countryCode: "CA",
|
|
107
|
+
});
|
|
108
|
+
marketController.dispose();
|
|
109
|
+
const bareController = createController();
|
|
110
|
+
bareController.submit("shoes");
|
|
111
|
+
await settle();
|
|
112
|
+
expect(search.mock.calls[1][0]).not.toHaveProperty("locale");
|
|
113
|
+
expect(search.mock.calls[1][0]).not.toHaveProperty("countryCode");
|
|
114
|
+
});
|
|
90
115
|
it("submits immediately without waiting for the debounce", async () => {
|
|
91
116
|
const controller = createController();
|
|
92
117
|
search.mockResolvedValue(response());
|
|
@@ -76,6 +76,7 @@ describe("search controller attribution", () => {
|
|
|
76
76
|
expect(tracker.setContext).toHaveBeenCalledWith({
|
|
77
77
|
query_id: "qid-1",
|
|
78
78
|
surface: "search_page",
|
|
79
|
+
search_type: "lexical",
|
|
79
80
|
page: 2,
|
|
80
81
|
total_hits: 30,
|
|
81
82
|
query_length: 5,
|
|
@@ -104,6 +105,7 @@ describe("search controller attribution", () => {
|
|
|
104
105
|
expect(trackViewSearchResults).toHaveBeenCalledWith({
|
|
105
106
|
query_id: "qid-1",
|
|
106
107
|
surface: "search_page",
|
|
108
|
+
search_type: "lexical",
|
|
107
109
|
page: 1,
|
|
108
110
|
total_hits: 0,
|
|
109
111
|
query_length: 7,
|
|
@@ -148,6 +150,7 @@ describe("search controller attribution", () => {
|
|
|
148
150
|
expect(trackSelectSearchResult).toHaveBeenCalledWith({
|
|
149
151
|
query_id: "qid-1",
|
|
150
152
|
surface: "search_page",
|
|
153
|
+
search_type: "lexical",
|
|
151
154
|
page: 1,
|
|
152
155
|
total_hits: 30,
|
|
153
156
|
query_length: 5,
|
|
@@ -48,6 +48,20 @@ describe("searchProducts", () => {
|
|
|
48
48
|
queryId: "0198c3f2-0000-7000-8000-000000000000",
|
|
49
49
|
});
|
|
50
50
|
});
|
|
51
|
+
it.each([
|
|
52
|
+
["fr-FR", "fr"],
|
|
53
|
+
["pt-BR", "pt"],
|
|
54
|
+
["fr", "fr"],
|
|
55
|
+
["not a locale", "not a locale"],
|
|
56
|
+
])("sends the locale %s as its bare ISO 639-1 language %s", async (locale, expected) => {
|
|
57
|
+
fetchMock.mockResolvedValue(jsonResponse(emptyResponse));
|
|
58
|
+
await searchProducts(API_KEY, { query: "running shoes", locale });
|
|
59
|
+
const [, init] = fetchMock.mock.calls[0];
|
|
60
|
+
expect(JSON.parse(init.body)).toEqual({
|
|
61
|
+
query: "running shoes",
|
|
62
|
+
locale: expected,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
51
65
|
it("omits pagination fields and queryId the caller did not provide", async () => {
|
|
52
66
|
fetchMock.mockResolvedValue(jsonResponse(emptyResponse));
|
|
53
67
|
await searchProducts(API_KEY, { query: "running shoes" });
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { SearchController, SearchControllerOptions } from "./types/searchController";
|
|
2
|
-
export declare function createSearchController({ search, analytics, navigate, debounceMs, hitsPerPage, }: SearchControllerOptions): SearchController;
|
|
2
|
+
export declare function createSearchController({ search, analytics, navigate, debounceMs, hitsPerPage, locale, countryCode, }: SearchControllerOptions): SearchController;
|
|
3
3
|
//# sourceMappingURL=searchController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../src/searchController.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EAGxB,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,SAAS,EACT,QAAQ,EACR,UAAgC,EAChC,WAAmC,
|
|
1
|
+
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../src/searchController.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EAGxB,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,SAAS,EACT,QAAQ,EACR,UAAgC,EAChC,WAAmC,EACnC,MAAM,EACN,WAAW,GACZ,EAAE,uBAAuB,GAAG,gBAAgB,CAsL5C"}
|
package/dist/searchController.js
CHANGED
|
@@ -11,7 +11,7 @@ const INITIAL_STATE = {
|
|
|
11
11
|
response: undefined,
|
|
12
12
|
error: undefined,
|
|
13
13
|
};
|
|
14
|
-
export function createSearchController({ search, analytics, navigate, debounceMs = DEFAULT_DEBOUNCE_MS, hitsPerPage = DEFAULT_HITS_PER_PAGE, }) {
|
|
14
|
+
export function createSearchController({ search, analytics, navigate, debounceMs = DEFAULT_DEBOUNCE_MS, hitsPerPage = DEFAULT_HITS_PER_PAGE, locale, countryCode, }) {
|
|
15
15
|
let state = INITIAL_STATE;
|
|
16
16
|
const listeners = new Set();
|
|
17
17
|
const controllerAnalytics = createControllerAnalytics(analytics);
|
|
@@ -36,6 +36,12 @@ export function createSearchController({ search, analytics, navigate, debounceMs
|
|
|
36
36
|
};
|
|
37
37
|
const buildRequest = (query, page) => {
|
|
38
38
|
const request = { query, page, hitsPerPage };
|
|
39
|
+
if (locale !== undefined) {
|
|
40
|
+
request.locale = locale;
|
|
41
|
+
}
|
|
42
|
+
if (countryCode !== undefined) {
|
|
43
|
+
request.countryCode = countryCode;
|
|
44
|
+
}
|
|
39
45
|
// Query unchanged since the last response: resend its queryId; a new
|
|
40
46
|
// query gets a fresh engine-generated one.
|
|
41
47
|
const previous = state.response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/services/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/services/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAgC/E;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,QAAQ,MAAM,EACd,SAAS,aAAa,EACtB,UAAU,aAAa,KACtB,OAAO,CAAC,cAAc,CAgBxB,CAAC"}
|
package/dist/services/search.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { config } from "../config";
|
|
2
2
|
import { DialogSearchError } from "../DialogSearchError";
|
|
3
|
+
import { toIso639LanguageCode } from "../utils/localization";
|
|
3
4
|
const SEARCH_PATH = "/public/search";
|
|
4
5
|
const API_KEY_HEADER = "x-dialog-api-key";
|
|
5
6
|
const toSearchError = async (response) => {
|
|
@@ -16,6 +17,12 @@ const toSearchError = async (response) => {
|
|
|
16
17
|
: response.statusText;
|
|
17
18
|
return new DialogSearchError({ status: response.status, code, message });
|
|
18
19
|
};
|
|
20
|
+
// Every search path (Dialog instance, search controller, direct transport)
|
|
21
|
+
// funnels through here, so the locale reaches the wire as the bare ISO 639-1
|
|
22
|
+
// language whatever tag the caller holds.
|
|
23
|
+
const withNormalizedLocale = (request) => request.locale === undefined
|
|
24
|
+
? request
|
|
25
|
+
: { ...request, locale: toIso639LanguageCode(request.locale) };
|
|
19
26
|
/**
|
|
20
27
|
* One POST per invocation — no debounce, cache, retry or request state; the
|
|
21
28
|
* caller owns cancellation through `options.signal`.
|
|
@@ -27,7 +34,7 @@ export const searchProducts = async (apiKey, request, options) => {
|
|
|
27
34
|
"Content-Type": "application/json",
|
|
28
35
|
[API_KEY_HEADER]: apiKey,
|
|
29
36
|
},
|
|
30
|
-
body: JSON.stringify(request),
|
|
37
|
+
body: JSON.stringify(withNormalizedLocale(request)),
|
|
31
38
|
signal: options?.signal,
|
|
32
39
|
});
|
|
33
40
|
if (!response.ok) {
|
package/dist/types/search.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface SearchRequest {
|
|
|
7
7
|
hitsPerPage?: number;
|
|
8
8
|
/** Previous response's queryId while the query is unchanged; omit for a new query. */
|
|
9
9
|
queryId?: string;
|
|
10
|
+
locale?: string;
|
|
11
|
+
countryCode?: string;
|
|
10
12
|
}
|
|
11
13
|
export interface SearchOptions {
|
|
12
14
|
/** Forwarded to fetch untouched: aborting rejects with the native AbortError. */
|
|
@@ -29,8 +31,11 @@ export interface SearchProduct {
|
|
|
29
31
|
id: string;
|
|
30
32
|
title?: string;
|
|
31
33
|
url?: string;
|
|
34
|
+
/** Shopify URL handle, lets the storefront build `/products/{handle}` when `url` is absent (DEC-2543). */
|
|
35
|
+
handle?: string;
|
|
32
36
|
imageUrl?: string;
|
|
33
37
|
priceRange?: SearchPriceRange;
|
|
38
|
+
compareAtPriceRange?: SearchPriceRange;
|
|
34
39
|
inStock?: boolean;
|
|
35
40
|
}
|
|
36
41
|
export interface SearchHit {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/types/search.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/types/search.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,WAAW,CAAC;IACjB,GAAG,EAAE,WAAW,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0GAA0G;IAC1G,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export declare const SEARCH_SURFACES: readonly ["autocomplete", "search_page", "smart_discovery", "ai_bar"];
|
|
2
2
|
export type SearchSurface = (typeof SEARCH_SURFACES)[number];
|
|
3
|
+
export declare const SEARCH_TYPES: readonly ["lexical"];
|
|
4
|
+
export type SearchType = (typeof SEARCH_TYPES)[number];
|
|
3
5
|
export interface SearchAnalyticsEnvelope {
|
|
4
6
|
query_id: string;
|
|
5
7
|
/** Where results are displayed — not the integration technology. */
|
|
6
8
|
surface: SearchSurface;
|
|
9
|
+
/** Retrieval mode that produced the results. */
|
|
10
|
+
search_type: SearchType;
|
|
7
11
|
/** 1-based results page. */
|
|
8
12
|
page: number;
|
|
9
13
|
/** Total results for the query, not for the page. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchAnalytics.d.ts","sourceRoot":"","sources":["../../src/types/searchAnalytics.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,uEAKlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"searchAnalytics.d.ts","sourceRoot":"","sources":["../../src/types/searchAnalytics.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,uEAKlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,YAAY,sBAAuB,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAQvD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,OAAO,EAAE,aAAa,CAAC;IACvB,gDAAgD;IAChD,WAAW,EAAE,UAAU,CAAC;IACxB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAGD,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,KAAK,EAAE,CAAC,gBAAgB,CAAC,CAAC;CAC3B;AAKD,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BACf,SAAQ,wBAAwB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -44,6 +44,8 @@ export interface SearchControllerOptions {
|
|
|
44
44
|
navigate?: (url: string, hit: SearchHit) => void;
|
|
45
45
|
debounceMs?: number;
|
|
46
46
|
hitsPerPage?: number;
|
|
47
|
+
locale?: string;
|
|
48
|
+
countryCode?: string;
|
|
47
49
|
}
|
|
48
50
|
/**
|
|
49
51
|
* Framework-agnostic stateful search behavior around the stateless
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../../src/types/searchController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,YAAY;;;;IAIvB,yGAAyG;;;CAGjG,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,aAAa,KACpB,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,aAAa,CAAC;IACvB,sBAAsB,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAClE,uBAAuB,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,yBAAyB,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oEAAoE;IACpE,KAAK,IAAI,IAAI,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;IACvE,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,QAAQ,IAAI,qBAAqB,CAAC;IAClC,kEAAkE;IAClE,OAAO,IAAI,IAAI,CAAC;CACjB"}
|
|
1
|
+
{"version":3,"file":"searchController.d.ts","sourceRoot":"","sources":["../../src/types/searchController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,YAAY;;;;IAIvB,yGAAyG;;;CAGjG,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,aAAa,KACpB,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,aAAa,CAAC;IACvB,sBAAsB,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAClE,uBAAuB,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,yBAAyB,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oEAAoE;IACpE,KAAK,IAAI,IAAI,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;IACvE,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,QAAQ,IAAI,qBAAqB,CAAC;IAClC,kEAAkE;IAClE,OAAO,IAAI,IAAI,CAAC;CACjB"}
|
|
@@ -23,4 +23,5 @@ export declare const resolveTextDirection: (code?: string) => TextDirection;
|
|
|
23
23
|
* therefore keeps a generic language name ("French", not "French (France)").
|
|
24
24
|
*/
|
|
25
25
|
export declare const getDetailedLocaleInfo: (locale: string, countryCodeOverride?: string) => DetailedLocaleInfo | null;
|
|
26
|
+
export declare const toIso639LanguageCode: (locale: string) => string;
|
|
26
27
|
//# sourceMappingURL=localization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localization.d.ts","sourceRoot":"","sources":["../../src/utils/localization.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,GAC7B,aAAa,MAAM,GAAG,SAAS,KAC9B,WAAW,IAAI,MAC8C,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,CAAC;AAQ1C,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,OAEa,CAAC;AAEhE,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,KAAG,aACZ,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,MAAM,EACd,sBAAsB,MAAM,KAC3B,kBAAkB,GAAG,IAoCvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"localization.d.ts","sourceRoot":"","sources":["../../src/utils/localization.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,GAC7B,aAAa,MAAM,GAAG,SAAS,KAC9B,WAAW,IAAI,MAC8C,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,CAAC;AAQ1C,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,OAEa,CAAC;AAEhE,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,KAAG,aACZ,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,MAAM,EACd,sBAAsB,MAAM,KAC3B,kBAAkB,GAAG,IAoCvB,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,MAMrD,CAAC"}
|
|
@@ -52,3 +52,14 @@ export const getDetailedLocaleInfo = (locale, countryCodeOverride) => {
|
|
|
52
52
|
return null;
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
|
+
// The search backend keys its indexes on the bare ISO 639-1 language, while
|
|
56
|
+
// storefronts usually hold full BCP-47 tags ("fr-FR", "pt-BR"). An unparsable
|
|
57
|
+
// value is returned as-is so a search is never dropped over its locale.
|
|
58
|
+
export const toIso639LanguageCode = (locale) => {
|
|
59
|
+
try {
|
|
60
|
+
return new Intl.Locale(locale).language;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return locale;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchControllerAnalytics.d.ts","sourceRoot":"","sources":["../../src/utils/searchControllerAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAMtE;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAC3C,aAAa,CACX,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,GACZ,IAAI,CAAC;IACR,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,OAAO,IAAI,IAAI,CAAC;CACjB;AAWD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,yBAAyB,GACnC,0BAA0B,
|
|
1
|
+
{"version":3,"file":"searchControllerAnalytics.d.ts","sourceRoot":"","sources":["../../src/utils/searchControllerAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAMtE;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAC3C,aAAa,CACX,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,GACZ,IAAI,CAAC;IACR,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,OAAO,IAAI,IAAI,CAAC;CACjB;AAWD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,yBAAyB,GACnC,0BAA0B,CAoD5B"}
|
|
@@ -23,6 +23,8 @@ export function createControllerAnalytics(analytics) {
|
|
|
23
23
|
// across pagination and rotates with the query.
|
|
24
24
|
query_id: response.queryId,
|
|
25
25
|
surface: analytics.surface,
|
|
26
|
+
// The storefront search API is lexical-only today.
|
|
27
|
+
search_type: "lexical",
|
|
26
28
|
// Analytics pages are 1-based; the wire response is 0-based.
|
|
27
29
|
page: response.page + 1,
|
|
28
30
|
total_hits: response.nbHits,
|