oneentry 1.0.171 → 1.0.172

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.
Files changed (72) hide show
  1. package/changelog.md +28 -0
  2. package/dist/admins/adminsApi.d.ts +3 -3
  3. package/dist/admins/adminsApi.js +1 -1
  4. package/dist/admins/adminsInterfaces.d.ts +3 -3
  5. package/dist/base/asyncModules.d.ts +6 -1
  6. package/dist/base/asyncModules.js +9 -1
  7. package/dist/base/utils.d.ts +11 -1
  8. package/dist/blocks/blocksApi.d.ts +1 -1
  9. package/dist/blocks/blocksApi.js +1 -1
  10. package/dist/blocks/blocksInterfaces.d.ts +4 -2
  11. package/dist/discounts/discountsApi.d.ts +3 -3
  12. package/dist/discounts/discountsApi.js +1 -1
  13. package/dist/discounts/discountsInterfaces.d.ts +3 -3
  14. package/dist/events/eventsApi.d.ts +1 -1
  15. package/dist/events/eventsApi.js +1 -2
  16. package/dist/file-uploading/fileUploadingApi.d.ts +1 -1
  17. package/dist/file-uploading/fileUploadingApi.js +4 -3
  18. package/dist/file-uploading/fileUploadingInterfaces.d.ts +1 -1
  19. package/dist/forms-data/formsDataApi.d.ts +4 -4
  20. package/dist/forms-data/formsDataApi.js +24 -17
  21. package/dist/forms-data/formsDataInterfaces.d.ts +3 -3
  22. package/dist/general-types/generalTypesSchemas.d.ts +0 -2
  23. package/dist/general-types/generalTypesSchemas.js +0 -1
  24. package/dist/orders/ordersApi.d.ts +16 -3
  25. package/dist/orders/ordersApi.js +25 -15
  26. package/dist/orders/ordersInterfaces.d.ts +3 -3
  27. package/dist/pages/pagesApi.d.ts +4 -4
  28. package/dist/pages/pagesApi.js +9 -13
  29. package/dist/pages/pagesInterfaces.d.ts +3 -3
  30. package/dist/products/productsApi.d.ts +7 -6
  31. package/dist/products/productsApi.js +6 -3
  32. package/dist/products/productsInterfaces.d.ts +14 -9
  33. package/dist/user-activity/userActivityApi.js +4 -7
  34. package/dist/users/usersApi.d.ts +3 -3
  35. package/dist/users/usersApi.js +1 -1
  36. package/dist/users/usersInterfaces.d.ts +3 -3
  37. package/esm/admins/adminsApi.d.ts +3 -3
  38. package/esm/admins/adminsApi.js +1 -1
  39. package/esm/admins/adminsInterfaces.d.ts +3 -3
  40. package/esm/base/asyncModules.d.ts +6 -1
  41. package/esm/base/asyncModules.js +9 -1
  42. package/esm/base/utils.d.ts +11 -1
  43. package/esm/blocks/blocksApi.d.ts +1 -1
  44. package/esm/blocks/blocksApi.js +1 -1
  45. package/esm/blocks/blocksInterfaces.d.ts +4 -2
  46. package/esm/discounts/discountsApi.d.ts +3 -3
  47. package/esm/discounts/discountsApi.js +1 -1
  48. package/esm/discounts/discountsInterfaces.d.ts +3 -3
  49. package/esm/events/eventsApi.d.ts +1 -1
  50. package/esm/events/eventsApi.js +1 -2
  51. package/esm/file-uploading/fileUploadingApi.d.ts +1 -1
  52. package/esm/file-uploading/fileUploadingApi.js +4 -3
  53. package/esm/file-uploading/fileUploadingInterfaces.d.ts +1 -1
  54. package/esm/forms-data/formsDataApi.d.ts +4 -4
  55. package/esm/forms-data/formsDataApi.js +24 -17
  56. package/esm/forms-data/formsDataInterfaces.d.ts +3 -3
  57. package/esm/general-types/generalTypesSchemas.d.ts +0 -2
  58. package/esm/general-types/generalTypesSchemas.js +0 -1
  59. package/esm/orders/ordersApi.d.ts +16 -3
  60. package/esm/orders/ordersApi.js +25 -15
  61. package/esm/orders/ordersInterfaces.d.ts +3 -3
  62. package/esm/pages/pagesApi.d.ts +4 -4
  63. package/esm/pages/pagesApi.js +9 -13
  64. package/esm/pages/pagesInterfaces.d.ts +3 -3
  65. package/esm/products/productsApi.d.ts +7 -6
  66. package/esm/products/productsApi.js +6 -3
  67. package/esm/products/productsInterfaces.d.ts +14 -9
  68. package/esm/user-activity/userActivityApi.js +4 -7
  69. package/esm/users/usersApi.d.ts +3 -3
  70. package/esm/users/usersApi.js +1 -1
  71. package/esm/users/usersInterfaces.d.ts +3 -3
  72. package/package.json +2 -2
@@ -78,14 +78,15 @@ export default class FileUploadingApi extends AsyncModules {
78
78
  * @param {string} [fileQuery.entity] - Entity name from which the file is uploaded, determines the folder name in the storage. Example: "editor".
79
79
  * @param {number} [fileQuery.id] - Identifier of the object from which the file is uploaded, determines the folder name in the storage. Example: 3787.
80
80
  * @param {number} [fileQuery.template] - preview template identifier. Example: 1.
81
- * @returns {Promise<boolean | IError>} Returns a promise that resolves to the result of the deletion operation or an error object if there was an issue.
81
+ * @returns {Promise<boolean | IError>} Returns a promise that resolves to true when the file was deleted or an error object if there was an issue.
82
82
  * @throws {IError} When isShell=false and an error occurs during the fetch
83
83
  * @see {@link https://js-sdk.oneentry.cloud/docs/file-uploading/delete delete} documentation.
84
84
  */
85
85
  async delete(filename, fileQuery) {
86
86
  const query = { ...this._defaultQuery, ...fileQuery };
87
- const result = await this._fetchDelete(`?filename=${filename}&` + this._queryParamsToString(query));
88
- return result;
87
+ // The endpoint answers 200 with an empty body, which _parseJson reads as `{}`;
88
+ // _fetchBoolean turns that into the declared `true` (CMS-1072)
89
+ return this._fetchBoolean(() => this._fetchDelete(`?filename=${filename}&` + this._queryParamsToString(query)));
89
90
  }
90
91
  /**
91
92
  * Public search across the content of files attached to records.
@@ -55,7 +55,7 @@ interface IFileUploading {
55
55
  * @param {string} [fileQuery.entity] - Entity name from which the file is uploaded, determines the folder name in the storage. Example: "editor".
56
56
  * @param {number} [fileQuery.id] - Identifier of the object from which the file is uploaded, determines the folder name in the storage. Example: 3787.
57
57
  * @param {number} [fileQuery.template] - preview template identifier. Example: 1.
58
- * @returns {boolean | IError} Returns a promise that resolves to the result of the deletion operation or an error object if there was an issue.
58
+ * @returns {boolean | IError} Returns a promise that resolves to true when the file was deleted or an error object if there was an issue.
59
59
  * @throws {IError} - If there is an error during the fetch operation, it will return an error object.
60
60
  */
61
61
  delete(filename: string, fileQuery?: IUploadingQuery): Promise<boolean | IError>;
@@ -1,6 +1,6 @@
1
1
  import AsyncModules from '../base/asyncModules.js';
2
2
  import type StateModule from '../base/stateModule.js';
3
- import type { IError } from '../base/utils.js';
3
+ import type { IError, IVectorSearchResponse } from '../base/utils.js';
4
4
  import type { IBodyPostFormData, IFormsByMarkerDataEntity, IFormsData, IFormsDataFilter, IFormsDataSearchResponse, IFormsDataVectorSearch, IPostFormResponse, IUpdateFormsData } from './formsDataInterfaces.js';
5
5
  /**
6
6
  * Controllers for working with form data
@@ -76,7 +76,7 @@ export default class FormsDataApi extends AsyncModules implements IFormsData {
76
76
  /**
77
77
  * Removes `contentType` from a file value, which the endpoint does not accept.
78
78
  * @param {T} value - Value of a `file` / `image` / `groupOfImages` field, after the uploads.
79
- * @returns {T} The same value, without `contentType`.
79
+ * @returns {T} The value without `contentType`; entries that carried it are copies, the caller's objects are not modified.
80
80
  * @description `FileUploading.upload` returns `contentType` and form data rejects it,
81
81
  * so it is stripped from an array of values and from a lone value object alike. A value
82
82
  * of any other shape is returned untouched and the endpoint names the field it cannot
@@ -166,10 +166,10 @@ export default class FormsDataApi extends AsyncModules implements IFormsData {
166
166
  * @param {string} [langCode] - Language code. Default: "en_US".
167
167
  * @param {number} [offset] - Parameter for pagination. Default: 0.
168
168
  * @param {number} [limit] - Parameter for pagination. Default: 30.
169
- * @returns {Promise<IFormsDataSearchResponse | IError>} Returns an object with an array of found form data records and total count.
169
+ * @returns {Promise<IVectorSearchResponse<IFormsDataSearchResponse> | IError>} Returns an object with an array of found form data records and total count.
170
170
  * @throws {IError} When isShell=false and an error occurs during the fetch
171
171
  * @description This method performs a semantic (vector) search for form data.
172
172
  * @see {@link https://js-sdk.oneentry.cloud/docs/forms-data/getFormsDataByVectorSearch getFormsDataByVectorSearch} documentation.
173
173
  */
174
- getFormsDataByVectorSearch(body: IFormsDataVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IFormsDataSearchResponse | IError>;
174
+ getFormsDataByVectorSearch(body: IFormsDataVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IFormsDataSearchResponse> | IError>;
175
175
  }
@@ -79,9 +79,12 @@ export default class FormsDataApi extends AsyncModules {
79
79
  // Create an instance of FileUploadingApi with the current state
80
80
  const fileUploader = new FileUploadingApi(this.state);
81
81
  // Process each element in formData[langCode] asynchronously
82
- formData[langCode] = await Promise.all(formData[langCode].map(async (fd) => {
82
+ formData[langCode] = await Promise.all(formData[langCode].map(async (field) => {
83
83
  // Check if the type is one of the specified types
84
- if (['file', 'image', 'groupOfImages'].includes(fd.type)) {
84
+ if (['file', 'image', 'groupOfImages'].includes(field.type)) {
85
+ // Work on a copy: the caller's field keeps its File and its fileQuery,
86
+ // so a reused body sends the same form again (CMS-1071)
87
+ const fd = { ...field };
85
88
  // If fileQuery does not exist, we create it and assign it to an object with the following properties:
86
89
  if (!fd.fileQuery) {
87
90
  const fileQuery = {
@@ -119,13 +122,15 @@ export default class FormsDataApi extends AsyncModules {
119
122
  delete fd.fileQuery;
120
123
  // Remove the 'contentType' property from the file object because it is not needed and not valid
121
124
  fd.value = this._stripContentType(fd.value);
125
+ return fd;
122
126
  }
123
- // Return the processed form data element
124
- return fd;
127
+ // Return the form data element untouched
128
+ return field;
125
129
  }));
126
130
  }
127
- body.formData = formData;
128
- const result = await this._fetchPost(``, body);
131
+ // The wrapped formData goes into a new body: written back into the caller's
132
+ // object, a second call with it wrapped the wrapper and answered `400` (CMS-1071)
133
+ const result = await this._fetchPost(``, { ...body, formData });
129
134
  // Validate response if validation is enabled
130
135
  const validated = await this._validateResponse(result, schema('PostFormResponseSchema'));
131
136
  return this._normalizeData(validated);
@@ -145,7 +150,7 @@ export default class FormsDataApi extends AsyncModules {
145
150
  /**
146
151
  * Removes `contentType` from a file value, which the endpoint does not accept.
147
152
  * @param {T} value - Value of a `file` / `image` / `groupOfImages` field, after the uploads.
148
- * @returns {T} The same value, without `contentType`.
153
+ * @returns {T} The value without `contentType`; entries that carried it are copies, the caller's objects are not modified.
149
154
  * @description `FileUploading.upload` returns `contentType` and form data rejects it,
150
155
  * so it is stripped from an array of values and from a lone value object alike. A value
151
156
  * of any other shape is returned untouched and the endpoint names the field it cannot
@@ -153,18 +158,20 @@ export default class FormsDataApi extends AsyncModules {
153
158
  * request is made (CMS-990).
154
159
  */
155
160
  _stripContentType(value) {
161
+ // An entry carrying `contentType` is copied without it rather than edited:
162
+ // a descriptor passed through untouched belongs to the caller (CMS-1071)
156
163
  const strip = (item) => {
157
- if (item && typeof item === 'object' && !Array.isArray(item)) {
158
- delete item.contentType;
164
+ if (item &&
165
+ typeof item === 'object' &&
166
+ !Array.isArray(item) &&
167
+ 'contentType' in item) {
168
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
169
+ const { contentType, ...rest } = item;
170
+ return rest;
159
171
  }
172
+ return item;
160
173
  };
161
- if (Array.isArray(value)) {
162
- value.forEach(strip);
163
- }
164
- else {
165
- strip(value);
166
- }
167
- return value;
174
+ return (Array.isArray(value) ? value.map(strip) : strip(value));
168
175
  }
169
176
  /**
170
177
  * Drops the date bounds the endpoint refuses to parse.
@@ -271,7 +278,7 @@ export default class FormsDataApi extends AsyncModules {
271
278
  * @param {string} [langCode] - Language code. Default: "en_US".
272
279
  * @param {number} [offset] - Parameter for pagination. Default: 0.
273
280
  * @param {number} [limit] - Parameter for pagination. Default: 30.
274
- * @returns {Promise<IFormsDataSearchResponse | IError>} Returns an object with an array of found form data records and total count.
281
+ * @returns {Promise<IVectorSearchResponse<IFormsDataSearchResponse> | IError>} Returns an object with an array of found form data records and total count.
275
282
  * @throws {IError} When isShell=false and an error occurs during the fetch
276
283
  * @description This method performs a semantic (vector) search for form data.
277
284
  * @see {@link https://js-sdk.oneentry.cloud/docs/forms-data/getFormsDataByVectorSearch getFormsDataByVectorSearch} documentation.
@@ -1,4 +1,4 @@
1
- import type { IError } from '../base/utils.js';
1
+ import type { IError, IVectorSearchResponse } from '../base/utils.js';
2
2
  import type { IUploadingQuery, IUploadingReturn } from '../file-uploading/fileUploadingInterfaces.js';
3
3
  /**
4
4
  * Interface for retrieving and posting form data in the system.
@@ -77,10 +77,10 @@ interface IFormsData {
77
77
  * @param {string} [langCode] - Language code. Default: "en_US".
78
78
  * @param {number} [offset] - Parameter for pagination. Default: 0.
79
79
  * @param {number} [limit] - Parameter for pagination. Default: 30.
80
- * @returns {Promise<IFormsDataSearchResponse | IError>} Returns an object with an array of found form data records and total count.
80
+ * @returns {Promise<IVectorSearchResponse<IFormsDataSearchResponse> | IError>} Returns an object with an array of found form data records and total count.
81
81
  * @throws {IError} When isShell=false and an error occurs during the fetch
82
82
  */
83
- getFormsDataByVectorSearch(body: IFormsDataVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IFormsDataSearchResponse | IError>;
83
+ getFormsDataByVectorSearch(body: IFormsDataVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IFormsDataSearchResponse> | IError>;
84
84
  }
85
85
  /**
86
86
  * Body for semantic (vector) form data search.
@@ -10,7 +10,6 @@ import { z } from 'zod';
10
10
  export declare const GeneralTypeEntitySchema: z.ZodObject<{
11
11
  id: z.ZodNumber;
12
12
  type: z.ZodEnum<{
13
- none: "none";
14
13
  product: "product";
15
14
  order: "order";
16
15
  form: "form";
@@ -41,7 +40,6 @@ export declare const GeneralTypeEntitySchema: z.ZodObject<{
41
40
  export declare const GeneralTypesResponseSchema: z.ZodArray<z.ZodObject<{
42
41
  id: z.ZodNumber;
43
42
  type: z.ZodEnum<{
44
- none: "none";
45
43
  product: "product";
46
44
  order: "order";
47
45
  form: "form";
@@ -33,7 +33,6 @@ export const GeneralTypeEntitySchema = z.object({
33
33
  'service',
34
34
  'external_page',
35
35
  'discount',
36
- 'none',
37
36
  ]),
38
37
  });
39
38
  /**
@@ -1,6 +1,6 @@
1
1
  import AsyncModules from '../base/asyncModules.js';
2
2
  import type StateModule from '../base/stateModule.js';
3
- import type { IError } from '../base/utils.js';
3
+ import type { IError, IVectorSearchResponse } from '../base/utils.js';
4
4
  import type { IBaseOrdersEntity, ICreateOrderPreview, ICreateRefundRequest, IOrderByMarkerEntity, IOrderData, IOrderPreviewResponse, IOrdersApi, IOrdersByMarkerEntity, IOrdersEntity, IOrderStatus, IOrdersVectorSearch, IRefundRequest } from './ordersInterfaces.js';
5
5
  /**
6
6
  * Controllers for working with orders.
@@ -204,13 +204,13 @@ export default class OrdersApi extends AsyncModules implements IOrdersApi {
204
204
  * @param {string} [langCode] - Language code. Default: "en_US".
205
205
  * @param {number} [offset] - Parameter for pagination. Default: 0.
206
206
  * @param {number} [limit] - Parameter for pagination. Default: 30.
207
- * @returns {Promise<IOrdersByMarkerEntity | IError>} Returns an object with an array of found orders and total count.
207
+ * @returns {Promise<IVectorSearchResponse<IOrdersByMarkerEntity> | IError>} Returns an object with an array of found orders and total count.
208
208
  * @throws {IError} When isShell=false and an error occurs during the fetch
209
209
  * @description This method performs a semantic (vector) search over the orders of the authorized user. It requires user authorization.
210
210
  * @see For more information about configuring the {@link https://js-sdk.oneentry.cloud/docs/category/authprovider authorization module}, see the documentation in the {@link https://js-sdk.oneentry.cloud/docs/category/authprovider configuration settings section of the SDK}.
211
211
  * @see {@link https://js-sdk.oneentry.cloud/docs/orders/getOrdersByVectorSearch getOrdersByVectorSearch} documentation.
212
212
  */
213
- getOrdersByVectorSearch(body: IOrdersVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IOrdersByMarkerEntity | IError>;
213
+ getOrdersByVectorSearch(body: IOrdersVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IOrdersByMarkerEntity> | IError>;
214
214
  /**
215
215
  * Runs a fetch against the `/orders` base URL instead of the default
216
216
  * `/orders-storage`, then restores the original URL.
@@ -224,4 +224,17 @@ export default class OrdersApi extends AsyncModules implements IOrdersApi {
224
224
  * @template T
225
225
  */
226
226
  private _withOrdersUrl;
227
+ /**
228
+ * Builds the order body the API expects: `formData` wrapped in a map keyed by locale.
229
+ *
230
+ * The wrapping is done on a copy. Writing it back into the caller's object made
231
+ * a reused body — a retry, a shared template — arrive wrapped twice: `createOrder`
232
+ * answered `400 formData's marker '#0' marker is required`, and
233
+ * `updateOrderByMarkerAndId` answered `200` and stored the broken `formData` in
234
+ * the order (CMS-1063).
235
+ * @param {IOrderData} body - Order body as the caller passed it. Left unchanged.
236
+ * @param {string} langCode - Locale key to wrap `formData` into.
237
+ * @returns {object} A new body with `formData` as `{ [langCode]: [...] }`.
238
+ */
239
+ private _wrapOrderFormData;
227
240
  }
@@ -149,13 +149,7 @@ export default class OrdersApi extends AsyncModules {
149
149
  * @see {@link https://js-sdk.oneentry.cloud/docs/orders/createOrder createOrder} documentation.
150
150
  */
151
151
  async createOrder(marker, body, langCode = this.state.lang) {
152
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
- const formData = {};
154
- formData[langCode] = Array.isArray(body.formData)
155
- ? body.formData
156
- : [body.formData];
157
- body.formData = formData;
158
- const result = await this._fetchPost(`/marker/${marker}/orders`, body);
152
+ const result = await this._fetchPost(`/marker/${marker}/orders`, this._wrapOrderFormData(body, langCode));
159
153
  // Validate response if validation is enabled
160
154
  const validated = await this._validateResponse(result, schema('CreateOrderResponseSchema'));
161
155
  return this._normalizeData(validated);
@@ -191,13 +185,7 @@ export default class OrdersApi extends AsyncModules {
191
185
  * @see {@link https://js-sdk.oneentry.cloud/docs/orders/updateOrderByMarkerAndId updateOrderByMarkerAndId} documentation.
192
186
  */
193
187
  async updateOrderByMarkerAndId(marker, id, body, langCode = this.state.lang) {
194
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
195
- const formData = {};
196
- formData[langCode] = Array.isArray(body.formData)
197
- ? body.formData
198
- : [body.formData];
199
- body.formData = formData;
200
- const result = await this._fetchPut(`/marker/${marker}/orders/${id}?langCode=${langCode}`, body);
188
+ const result = await this._fetchPut(`/marker/${marker}/orders/${id}?langCode=${langCode}`, this._wrapOrderFormData(body, langCode));
201
189
  // Validate response if validation is enabled
202
190
  const validated = await this._validateResponse(result, schema('UpdateOrderResponseSchema'));
203
191
  return this._normalizeData(validated);
@@ -267,7 +255,7 @@ export default class OrdersApi extends AsyncModules {
267
255
  * @param {string} [langCode] - Language code. Default: "en_US".
268
256
  * @param {number} [offset] - Parameter for pagination. Default: 0.
269
257
  * @param {number} [limit] - Parameter for pagination. Default: 30.
270
- * @returns {Promise<IOrdersByMarkerEntity | IError>} Returns an object with an array of found orders and total count.
258
+ * @returns {Promise<IVectorSearchResponse<IOrdersByMarkerEntity> | IError>} Returns an object with an array of found orders and total count.
271
259
  * @throws {IError} When isShell=false and an error occurs during the fetch
272
260
  * @description This method performs a semantic (vector) search over the orders of the authorized user. It requires user authorization.
273
261
  * @see For more information about configuring the {@link https://js-sdk.oneentry.cloud/docs/category/authprovider authorization module}, see the documentation in the {@link https://js-sdk.oneentry.cloud/docs/category/authprovider configuration settings section of the SDK}.
@@ -304,4 +292,26 @@ export default class OrdersApi extends AsyncModules {
304
292
  this._url = savedUrl;
305
293
  }
306
294
  }
295
+ /**
296
+ * Builds the order body the API expects: `formData` wrapped in a map keyed by locale.
297
+ *
298
+ * The wrapping is done on a copy. Writing it back into the caller's object made
299
+ * a reused body — a retry, a shared template — arrive wrapped twice: `createOrder`
300
+ * answered `400 formData's marker '#0' marker is required`, and
301
+ * `updateOrderByMarkerAndId` answered `200` and stored the broken `formData` in
302
+ * the order (CMS-1063).
303
+ * @param {IOrderData} body - Order body as the caller passed it. Left unchanged.
304
+ * @param {string} langCode - Locale key to wrap `formData` into.
305
+ * @returns {object} A new body with `formData` as `{ [langCode]: [...] }`.
306
+ */
307
+ _wrapOrderFormData(body, langCode) {
308
+ return {
309
+ ...body,
310
+ formData: {
311
+ [langCode]: Array.isArray(body.formData)
312
+ ? body.formData
313
+ : [body.formData],
314
+ },
315
+ };
316
+ }
307
317
  }
@@ -1,4 +1,4 @@
1
- import type { IError, ILocalizeInfo } from '../base/utils.js';
1
+ import type { IError, ILocalizeInfo, IVectorSearchResponse } from '../base/utils.js';
2
2
  /**
3
3
  * @interface IOrdersApi
4
4
  * @description Represents the API for managing orders in the order storage.
@@ -176,10 +176,10 @@ interface IOrdersApi {
176
176
  * @param {string} [langCode] - Language code. Default: "en_US".
177
177
  * @param {number} [offset] - Parameter for pagination. Default: 0.
178
178
  * @param {number} [limit] - Parameter for pagination. Default: 30.
179
- * @returns {Promise<IOrdersByMarkerEntity | IError>} Returns an object with an array of found orders and total count.
179
+ * @returns {Promise<IVectorSearchResponse<IOrdersByMarkerEntity> | IError>} Returns an object with an array of found orders and total count.
180
180
  * @throws {IError} When isShell=false and an error occurs during the fetch
181
181
  */
182
- getOrdersByVectorSearch(body: IOrdersVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IOrdersByMarkerEntity | IError>;
182
+ getOrdersByVectorSearch(body: IOrdersVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IOrdersByMarkerEntity> | IError>;
183
183
  }
184
184
  /**
185
185
  * Body for semantic (vector) order search.
@@ -1,6 +1,6 @@
1
1
  import AsyncModules from '../base/asyncModules.js';
2
2
  import type StateModule from '../base/stateModule.js';
3
- import type { IError } from '../base/utils.js';
3
+ import type { IError, IVectorSearchResponse } from '../base/utils.js';
4
4
  import type { IPagesApi, IPageSearchResult, IPagesEntity, IPagesResponse, IPagesVectorSearch, IPositionBlock } from './pagesInterfaces.js';
5
5
  /**
6
6
  * Controllers for working with page objects, including catalog pages
@@ -88,7 +88,7 @@ export default class PagesApi extends AsyncModules implements IPagesApi {
88
88
  * @param {string} [langCode] - Language code. Default: "en_US".
89
89
  * @returns {Promise<IPagesEntity[] | IPageSearchResult[] | IError>} Returns found pages as an array of PageEntity objects, an array of short PageSearchResult cards when the traficLimit config option is enabled, or an empty array [] (if there is no data)
90
90
  * @throws {IError} When isShell=false and an error occurs during the fetch
91
- * @description Quick search for page objects with limited output. The quick search endpoint returns short cards ({ id, title }); with traficLimit enabled they are returned as is, otherwise full page entities are fetched for the found ids.
91
+ * @description Quick search for page objects with limited output. The quick search endpoint returns short cards ({ id, title }); with traficLimit enabled they are returned as is, otherwise full page entities are fetched for the found ids. The search runs in `langCode`, and a found page that cannot be loaded in that language is left out of the result.
92
92
  * @see {@link https://js-sdk.oneentry.cloud/docs/pages/searchPage searchPage} documentation.
93
93
  */
94
94
  searchPage(name: string, url?: string, langCode?: string): Promise<IPagesEntity[] | IPageSearchResult[] | IError>;
@@ -99,12 +99,12 @@ export default class PagesApi extends AsyncModules implements IPagesApi {
99
99
  * @param {string} [langCode] - Language code. Default: "en_US".
100
100
  * @param {number} [offset] - Parameter for pagination. Default: 0.
101
101
  * @param {number} [limit] - Parameter for pagination. Default: 30.
102
- * @returns {Promise<IPagesResponse | IError>} Returns an object with an array of found pages and total count.
102
+ * @returns {Promise<IVectorSearchResponse<IPagesResponse> | IError>} Returns an object with an array of found pages and total count.
103
103
  * @throws {IError} When isShell=false and an error occurs during the fetch
104
104
  * @description This method performs a semantic (vector) search for pages.
105
105
  * @see {@link https://js-sdk.oneentry.cloud/docs/pages/getPagesByVectorSearch getPagesByVectorSearch} documentation.
106
106
  */
107
- getPagesByVectorSearch(body: IPagesVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IPagesResponse | IError>;
107
+ getPagesByVectorSearch(body: IPagesVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IPagesResponse> | IError>;
108
108
  /**
109
109
  * Add template data to pages
110
110
  * @handleName addTemplateToPages
@@ -182,27 +182,23 @@ export default class PagesApi extends AsyncModules {
182
182
  * @param {string} [langCode] - Language code. Default: "en_US".
183
183
  * @returns {Promise<IPagesEntity[] | IPageSearchResult[] | IError>} Returns found pages as an array of PageEntity objects, an array of short PageSearchResult cards when the traficLimit config option is enabled, or an empty array [] (if there is no data)
184
184
  * @throws {IError} When isShell=false and an error occurs during the fetch
185
- * @description Quick search for page objects with limited output. The quick search endpoint returns short cards ({ id, title }); with traficLimit enabled they are returned as is, otherwise full page entities are fetched for the found ids.
185
+ * @description Quick search for page objects with limited output. The quick search endpoint returns short cards ({ id, title }); with traficLimit enabled they are returned as is, otherwise full page entities are fetched for the found ids. The search runs in `langCode`, and a found page that cannot be loaded in that language is left out of the result.
186
186
  * @see {@link https://js-sdk.oneentry.cloud/docs/pages/searchPage searchPage} documentation.
187
187
  */
188
188
  async searchPage(name, url, langCode = this.state.lang) {
189
189
  // Fetch data from the server using a GET request to perform a quick search by page name and language code
190
190
  const urlPart = url ? `url=${encodeURIComponent(url)}&` : '';
191
- const searchPages = await this._fetchGet(`/quick/search?${urlPart}lang=${encodeURIComponent(langCode)}&name=${encodeURIComponent(name)}`);
192
- // /quick/search?url=catalog&langCode=en_US&name=cat
191
+ const searchPages = await this._fetchGet(`/quick/search?${urlPart}langCode=${encodeURIComponent(langCode)}&name=${encodeURIComponent(name)}`);
193
192
  // Validate response if validation is enabled
194
193
  const data = (await this._validateResponse(searchPages, schema('PageSearchResponseSchema')));
195
194
  // Check if there is no traffic limit set in the state
196
195
  if (!this.state.traficLimit && Array.isArray(data)) {
197
- // Initialize an empty array to store detailed page information
198
- const pageList = [];
199
- // Use Promise.all to fetch detailed information for each page concurrently
200
- await Promise.all(data.map(async (page) => {
201
- // Fetch detailed page information by page ID and push it to pageList
202
- await this.getPageById(page.id, langCode).then((result) => {
203
- pageList.push(result);
204
- });
205
- }));
196
+ // Fetch detailed information for each page concurrently, keeping the search order
197
+ const fetched = await Promise.all(data.map((page) => this.getPageById(page.id, langCode)));
198
+ // A page the quick search found but getPageById could not load (404 in this
199
+ // language, closed route) is left out: an IError has no place in IPagesEntity[]
200
+ // and broke `page.localizeInfos.title` on the caller's side (CMS-1068)
201
+ const pageList = fetched.filter((page) => !this._isErrorResponse(page));
206
202
  // Add templates to the fetched pages
207
203
  const withTemplate = await this.addTemplateToPages(pageList);
208
204
  // Normalize the data and return it; ensures consistent structure or handles errors
@@ -219,7 +215,7 @@ export default class PagesApi extends AsyncModules {
219
215
  * @param {string} [langCode] - Language code. Default: "en_US".
220
216
  * @param {number} [offset] - Parameter for pagination. Default: 0.
221
217
  * @param {number} [limit] - Parameter for pagination. Default: 30.
222
- * @returns {Promise<IPagesResponse | IError>} Returns an object with an array of found pages and total count.
218
+ * @returns {Promise<IVectorSearchResponse<IPagesResponse> | IError>} Returns an object with an array of found pages and total count.
223
219
  * @throws {IError} When isShell=false and an error occurs during the fetch
224
220
  * @description This method performs a semantic (vector) search for pages.
225
221
  * @see {@link https://js-sdk.oneentry.cloud/docs/pages/getPagesByVectorSearch getPagesByVectorSearch} documentation.
@@ -1,4 +1,4 @@
1
- import type { IAttributes, IAttributeValues, IError, ILocalizeInfo, IRating, LangType } from '../base/utils.js';
1
+ import type { IAttributes, IAttributeValues, IError, ILocalizeInfo, IRating, IVectorSearchResponse, LangType } from '../base/utils.js';
2
2
  import type { BlockType, IBlockEntity } from '../blocks/blocksInterfaces.js';
3
3
  import type { IFormConfig } from '../forms/formsInterfaces.js';
4
4
  import type { IProductsEntity, IProductsResponse } from '../products/productsInterfaces.js';
@@ -84,11 +84,11 @@ interface IPagesApi {
84
84
  * @param {string} [langCode] - Language code. Default: "en_US".
85
85
  * @param {number} [offset] - Parameter for pagination. Default: 0.
86
86
  * @param {number} [limit] - Parameter for pagination. Default: 30.
87
- * @returns {IPagesResponse} A promise that resolves to a pages response (items + total) or an error.
87
+ * @returns {IVectorSearchResponse<IPagesResponse>} A promise that resolves to a pages response (items + total + indexReady) or an error.
88
88
  * @throws {IError} - If there is an error during the fetch operation, it will return an error object.
89
89
  * @description This method performs a semantic (vector) search for pages.
90
90
  */
91
- getPagesByVectorSearch(body: IPagesVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IPagesResponse | IError>;
91
+ getPagesByVectorSearch(body: IPagesVectorSearch, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IPagesResponse> | IError>;
92
92
  }
93
93
  /**
94
94
  * Body for semantic (vector) page search.
@@ -1,7 +1,7 @@
1
1
  import AsyncModules from '../base/asyncModules.js';
2
2
  import type StateModule from '../base/stateModule.js';
3
- import type { IError } from '../base/utils.js';
4
- import type { IAggregatedProductGroup, IFilterParams, IProductBlock, IProductsApi, IProductsByIdsQuery, IProductsCount, IProductSearchResult, IProductsEntity, IProductsInfo, IProductsPriceQuery, IProductsQueryBase, IProductsRelatedQuery, IProductsResponse, IVectorSearchProducts } from './productsInterfaces.js';
3
+ import type { IError, IVectorSearchResponse } from '../base/utils.js';
4
+ import type { IFilterParams, IProductBlock, IProductsApi, IProductsByIdsQuery, IProductsCount, IProductSearchResult, IProductsEntity, IProductsInfo, IProductsPriceQuery, IProductsQueryBase, IProductsRelatedQuery, IProductsResponse, IVectorSearchProducts } from './productsInterfaces.js';
5
5
  /**
6
6
  * Controllers for working with product pages
7
7
  * @handle /api/content/products
@@ -77,12 +77,12 @@ export default class ProductsApi extends AsyncModules implements IProductsApi {
77
77
  "sortKey": "id",
78
78
  "signPrice": "orders"
79
79
  }
80
- * @returns {Promise<IAggregatedProductGroup[] | IError>} Array with AggregatedProductGroup objects.
80
+ * @returns {Promise<IProductsResponse | IError>} Products without a category: `{ items, total }`, the same container as getProducts.
81
81
  * @throws {IError} When isShell=false and an error occurs during the fetch
82
82
  * @description Search for all product page objects with pagination (and aggregation) that do not have a category.
83
83
  * @see {@link https://js-sdk.oneentry.cloud/docs/products/getProductsEmptyPage getProductsEmptyPage} documentation.
84
84
  */
85
- getProductsEmptyPage(body?: object, langCode?: string, userQuery?: IProductsQueryBase): Promise<IAggregatedProductGroup[] | IError>;
85
+ getProductsEmptyPage(body?: object, langCode?: string, userQuery?: IProductsQueryBase): Promise<IProductsResponse | IError>;
86
86
  /**
87
87
  * Search for all products with pagination for the selected category.
88
88
  * @handleName getProductsByPageId
@@ -213,6 +213,7 @@ export default class ProductsApi extends AsyncModules implements IProductsApi {
213
213
  * @param {number} [userQuery.offset] - Optional parameter for pagination. Default: 0.
214
214
  * @param {string} [userQuery.sortOrder] - Optional sorting order "DESC" | "ASC". Example: "DESC".
215
215
  * @param {string} [userQuery.sortKey] - Optional field to sort by ("id", "title", "date", "price", "position", "status"). Example: "id".
216
+ * @param {string} [userQuery.relationMode] - How relations are computed: "global" (default) or "local", which also requires the product `id` itself to satisfy the template condition. Example: "local".
216
217
  * @returns {Promise<IProductsResponse | IError>} Array with ProductEntity objects
217
218
  * @throws {IError} When isShell=false and an error occurs during the fetch
218
219
  * @description Find all related product page objects.
@@ -350,12 +351,12 @@ export default class ProductsApi extends AsyncModules implements IProductsApi {
350
351
  * @param {string} [langCode] - Language code. Default: "en_US".
351
352
  * @param {number} [offset] - Parameter for pagination. Default: 0.
352
353
  * @param {number} [limit] - Parameter for pagination. Default: 30.
353
- * @returns {Promise<IProductsResponse | IError>} Returns an object with an array of found products and total count.
354
+ * @returns {Promise<IVectorSearchResponse<IProductsResponse> | IError>} Returns an object with an array of found products and total count.
354
355
  * @throws {IError} When isShell=false and an error occurs during the fetch
355
356
  * @description This method performs a semantic (vector) search for products.
356
357
  * @see {@link https://js-sdk.oneentry.cloud/docs/products/getProductsByVectorSearch getProductsByVectorSearch} documentation.
357
358
  */
358
- getProductsByVectorSearch(body: IVectorSearchProducts, langCode?: string, offset?: number, limit?: number): Promise<IProductsResponse | IError>;
359
+ getProductsByVectorSearch(body: IVectorSearchProducts, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IProductsResponse> | IError>;
359
360
  /**
360
361
  * Get products by page url.
361
362
  * @param {string} url - Page url.
@@ -87,7 +87,7 @@ export default class ProductsApi extends AsyncModules {
87
87
  "sortKey": "id",
88
88
  "signPrice": "orders"
89
89
  }
90
- * @returns {Promise<IAggregatedProductGroup[] | IError>} Array with AggregatedProductGroup objects.
90
+ * @returns {Promise<IProductsResponse | IError>} Products without a category: `{ items, total }`, the same container as getProducts.
91
91
  * @throws {IError} When isShell=false and an error occurs during the fetch
92
92
  * @description Search for all product page objects with pagination (and aggregation) that do not have a category.
93
93
  * @see {@link https://js-sdk.oneentry.cloud/docs/products/getProductsEmptyPage getProductsEmptyPage} documentation.
@@ -95,7 +95,9 @@ export default class ProductsApi extends AsyncModules {
95
95
  async getProductsEmptyPage(body = {}, langCode = this.state.lang, userQuery) {
96
96
  const query = { ...userQuery, langCode };
97
97
  const result = await this._fetchPost(`/empty-page?` + this._queryParamsToString(query), body);
98
- return this._normalizeData(result);
98
+ // Validate response if validation is enabled
99
+ const validated = await this._validateResponse(result, schema('ProductsResponseSchema'));
100
+ return this._normalizeData(validated, langCode);
99
101
  }
100
102
  /**
101
103
  * Search for all products with pagination for the selected category.
@@ -247,6 +249,7 @@ export default class ProductsApi extends AsyncModules {
247
249
  * @param {number} [userQuery.offset] - Optional parameter for pagination. Default: 0.
248
250
  * @param {string} [userQuery.sortOrder] - Optional sorting order "DESC" | "ASC". Example: "DESC".
249
251
  * @param {string} [userQuery.sortKey] - Optional field to sort by ("id", "title", "date", "price", "position", "status"). Example: "id".
252
+ * @param {string} [userQuery.relationMode] - How relations are computed: "global" (default) or "local", which also requires the product `id` itself to satisfy the template condition. Example: "local".
250
253
  * @returns {Promise<IProductsResponse | IError>} Array with ProductEntity objects
251
254
  * @throws {IError} When isShell=false and an error occurs during the fetch
252
255
  * @description Find all related product page objects.
@@ -439,7 +442,7 @@ export default class ProductsApi extends AsyncModules {
439
442
  * @param {string} [langCode] - Language code. Default: "en_US".
440
443
  * @param {number} [offset] - Parameter for pagination. Default: 0.
441
444
  * @param {number} [limit] - Parameter for pagination. Default: 30.
442
- * @returns {Promise<IProductsResponse | IError>} Returns an object with an array of found products and total count.
445
+ * @returns {Promise<IVectorSearchResponse<IProductsResponse> | IError>} Returns an object with an array of found products and total count.
443
446
  * @throws {IError} When isShell=false and an error occurs during the fetch
444
447
  * @description This method performs a semantic (vector) search for products.
445
448
  * @see {@link https://js-sdk.oneentry.cloud/docs/products/getProductsByVectorSearch getProductsByVectorSearch} documentation.
@@ -1,4 +1,4 @@
1
- import type { IAttributeValues, IError, ILocalizeInfo, IRating } from '../base/utils.js';
1
+ import type { IAttributeValues, IError, ILocalizeInfo, IRating, IVectorSearchResponse } from '../base/utils.js';
2
2
  import type { BlockType } from '../blocks/blocksInterfaces.js';
3
3
  import type { IFormConfig } from '../forms/formsInterfaces.js';
4
4
  /**
@@ -62,11 +62,11 @@ interface IProductsApi {
62
62
  "sortKey": "id",
63
63
  "signPrice": "orders"
64
64
  }
65
- * @returns {IProductsResponse} Array with ProductEntity objects.
65
+ * @returns {Promise<IProductsResponse | IError>} Products without a category: `{ items, total }`, the same container as getProducts.
66
66
  * @throws {IError} - If there is an error during the fetch operation, it will return an error object.
67
67
  * @description This method searches for all product page objects with pagination that do not have a category.
68
68
  */
69
- getProductsEmptyPage(body?: object, langCode?: string, userQuery?: IProductsQueryBase): Promise<IAggregatedProductGroup[] | IError>;
69
+ getProductsEmptyPage(body?: object, langCode?: string, userQuery?: IProductsQueryBase): Promise<IProductsResponse | IError>;
70
70
  /**
71
71
  * Search for all products with pagination for the selected category.
72
72
  * @handleName getProductsByPageId
@@ -299,18 +299,18 @@ interface IProductsApi {
299
299
  * @param {string} [langCode] - Language code. Default: "en_US".
300
300
  * @param {number} [offset] - Parameter for pagination. Default: 0.
301
301
  * @param {number} [limit] - Parameter for pagination. Default: 30.
302
- * @returns {IProductsResponse} A promise that resolves to a products response (items + total) or an error.
302
+ * @returns {IVectorSearchResponse<IProductsResponse>} A promise that resolves to a products response (items + total + indexReady) or an error.
303
303
  * @throws {IError} - If there is an error during the fetch operation, it will return an error object.
304
304
  * @description This method performs a semantic (vector) search for products.
305
305
  */
306
- getProductsByVectorSearch(body: IVectorSearchProducts, langCode?: string, offset?: number, limit?: number): Promise<IProductsResponse | IError>;
306
+ getProductsByVectorSearch(body: IVectorSearchProducts, langCode?: string, offset?: number, limit?: number): Promise<IVectorSearchResponse<IProductsResponse> | IError>;
307
307
  }
308
308
  /**
309
309
  * @interface IProductsQueryBase
310
310
  * @property {number} offset - Parameter for pagination. Default: 0.
311
311
  * @property {number} limit - Parameter for pagination. Default: 30.
312
312
  * @property {string} sortOrder - Sort order "DESC" | "ASC". Default: "DESC".
313
- * @property {string} sortKey - Field for sorting (default - null). Possible values: "id", "position", "title", "date", "price". Default: null.
313
+ * @property {string} sortKey - Field for sorting (default - null). Possible values: "id", "position", "title", "date", "price", "status". Default: null.
314
314
  * @property {string} [signPrice] - Order storage marker for price fixing. If the parameter is set, the price is fixed for a certain time.
315
315
  * @see {@link https://js-sdk.oneentry.cloud/docs/products/#Fixing-the-price-signPrice Fixing the price} documentation.
316
316
  * @description Base query parameters shared by the product listing endpoints (getProducts, getProductsEmptyPage, getProductsByPageId, getProductsByPageUrl): pagination, sorting and price fixing.
@@ -319,7 +319,7 @@ interface IProductsQueryBase {
319
319
  offset?: number;
320
320
  limit?: number;
321
321
  sortOrder?: 'DESC' | 'ASC' | null;
322
- sortKey?: 'id' | 'position' | 'title' | 'date' | 'price' | null;
322
+ sortKey?: 'id' | 'position' | 'title' | 'date' | 'price' | 'status' | null;
323
323
  signPrice?: string;
324
324
  }
325
325
  /**
@@ -327,11 +327,13 @@ interface IProductsQueryBase {
327
327
  * @augments IProductsQueryBase
328
328
  * @property {string | null} [statusMarker] - Product page status marker, default null. Example: "in_stock".
329
329
  * @property {string | null} [templateMarker] - Product page template marker, default null. Example: "template_12345".
330
- * @description Query parameters for getRelatedProductsById: the base query plus product page status and template markers.
330
+ * @property {string} [relationMode] - How relations are computed: "global" (the default) runs the template's chain of conditions as is; "local" additionally requires the attribute value of the product `id` to satisfy the template condition (same operator, same stored operand) before the products of that step are kept. Example: "local".
331
+ * @description Query parameters for getRelatedProductsById: the base query plus product page status and template markers and the relation mode.
331
332
  */
332
333
  interface IProductsRelatedQuery extends IProductsQueryBase {
333
334
  statusMarker?: string | null;
334
335
  templateMarker?: string | null;
336
+ relationMode?: 'global' | 'local';
335
337
  }
336
338
  /**
337
339
  * Query parameters for getProductsPriceByPageUrl: the base query without
@@ -366,7 +368,7 @@ type IProductsQuery = IProductsQueryBase;
366
368
  /**
367
369
  * @interface IFilterParams
368
370
  * @property {string | null} attributeMarker - The text identifier of the indexed attribute by which values are filtered. Default: null. Example: "color".
369
- * @property {string | null} [conditionMarker] - Id of the filter condition by which the values are filtered. Default: null. Example: "equals".
371
+ * @property {string | null} [conditionMarker] - Id of the filter condition by which the values are filtered. Default: null. Example: "eq".
370
372
  * @property {number | string | null} conditionValue - The value that is being searched for, default null. Example: "new".
371
373
  * @property {string | null} [pageUrl] - Url of the category page object. Example: ["23-laminat-floorwood-maxima"].
372
374
  * @property {string[] | null} [pageUrls] - Url of the category page object. Example: ["23-laminat-floorwood-maxima"].
@@ -694,6 +696,9 @@ interface IProductBlock {
694
696
  }
695
697
  /**
696
698
  * @interface IAggregatedProductGroup
699
+ * @deprecated No method returns this shape: getProductsEmptyPage was declared with it,
700
+ * but the endpoint answers `{ items, total }` — see IProductsResponse (CMS-1065).
701
+ * Kept so that existing imports still compile.
697
702
  * @property {string} attrValue - Attribute value.
698
703
  * @property {IProductsEntity[]} items - Array of product entities.
699
704
  * @property {string[]} productIds - Array of product ids.
@@ -26,12 +26,9 @@ export default class UserActivityApi extends AsyncModules {
26
26
  * @see {@link https://js-sdk.oneentry.cloud/docs/user-activity/trackUserActivity trackUserActivity} documentation.
27
27
  */
28
28
  async trackUserActivity(body) {
29
- try {
30
- await this._fetchPost(`/track`, body);
31
- return true;
32
- }
33
- catch (e) {
34
- return e;
35
- }
29
+ // The endpoint answers 204: success is the absence of an error. Through
30
+ // _fetchBoolean a 400 comes back as IError instead of `true`, and with
31
+ // isShell=false it is thrown as documented (CMS-1064)
32
+ return this._fetchBoolean(() => this._fetchPost(`/track`, body));
36
33
  }
37
34
  }