@snabcentr/client-core 4.16.3 → 4.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import * as i1 from 'rxjs';
|
|
2
|
-
import { of, startWith as startWith$1, Subject, ReplaySubject, partition, combineLatest, map as map$1, debounceTime, switchMap, tap, filter, shareReplay, distinctUntilChanged, BehaviorSubject, materialize, dematerialize, merge, distinctUntilKeyChanged, skip, first, catchError as catchError$1, throwError, expand, takeWhile, toArray, EMPTY, take, defaultIfEmpty, concatMap, finalize, takeUntil, timeout, interval, share, scan } from 'rxjs';
|
|
2
|
+
import { of, startWith as startWith$1, Subject, ReplaySubject, partition, combineLatest, map as map$1, debounceTime, switchMap, tap, filter, shareReplay, distinctUntilChanged, BehaviorSubject, materialize, dematerialize, merge, distinctUntilKeyChanged, skip, first, catchError as catchError$1, throwError, expand, takeWhile, toArray, EMPTY, take, defaultIfEmpty, concatMap, finalize, takeUntil, timeout, interval, share, scan, defer, from, lastValueFrom, TimeoutError } from 'rxjs';
|
|
3
3
|
import { map, startWith, catchError } from 'rxjs/operators';
|
|
4
4
|
import { parseISO, parse, isValid, format } from 'date-fns';
|
|
5
5
|
import { isString, constant, isNil, isObject, isDate, isMatch, isArray, omit, get, isNumber, isBoolean } from 'lodash-es';
|
|
6
6
|
import * as i0 from '@angular/core';
|
|
7
|
-
import { InjectionToken, inject, PLATFORM_ID, Inject, Optional, Injectable, EventEmitter, DestroyRef, LOCALE_ID, Pipe, RESPONSE_INIT, assertInInjectionContext, RendererFactory2 } from '@angular/core';
|
|
7
|
+
import { InjectionToken, inject, PLATFORM_ID, Inject, Optional, Injectable, EventEmitter, DestroyRef, LOCALE_ID, Pipe, RESPONSE_INIT, assertInInjectionContext, RendererFactory2, makeEnvironmentProviders } from '@angular/core';
|
|
8
8
|
import { WA_LOCAL_STORAGE, WA_USER_AGENT, WA_WINDOW } from '@ng-web-apis/common';
|
|
9
9
|
import { filterByKey, toValue, WA_STORAGE_EVENT, WaStorageService } from '@ng-web-apis/storage';
|
|
10
10
|
import { isPlatformBrowser, isPlatformServer, DOCUMENT, formatDate } from '@angular/common';
|
|
11
11
|
import * as i1$1 from '@angular/common/http';
|
|
12
|
-
import { HttpContextToken, HttpContext, HttpHeaders, HttpClient, HttpParams, HttpErrorResponse, HttpResponse } from '@angular/common/http';
|
|
12
|
+
import { HttpContextToken, HttpContext, HttpHeaders, HttpClient, HttpParams, HttpErrorResponse, HttpResponse, FetchBackend, HttpXhrBackend, HttpStatusCode, HttpBackend } from '@angular/common/http';
|
|
13
13
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
14
14
|
import { tuiIsPresent, TuiDay, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
15
15
|
import { tuiCleanObject } from '@taiga-ui/addon-doc/utils';
|
|
@@ -18,6 +18,21 @@ import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
|
|
|
18
18
|
import { toSnake, objectToSnake, objectToCamel } from 'ts-case-convert';
|
|
19
19
|
import { Meta, Title } from '@angular/platform-browser';
|
|
20
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Статусы HTTP-редиректа, отдаваемые при рендере на сервере (SSR).
|
|
23
|
+
*/
|
|
24
|
+
var ScRedirectStatusEnum;
|
|
25
|
+
(function (ScRedirectStatusEnum) {
|
|
26
|
+
/**
|
|
27
|
+
* Постоянный редирект: адрес изменился навсегда, страница заменяется в индексе поисковых систем.
|
|
28
|
+
*/
|
|
29
|
+
ScRedirectStatusEnum[ScRedirectStatusEnum["Permanent"] = 301] = "Permanent";
|
|
30
|
+
/**
|
|
31
|
+
* Временный редирект: исходный адрес может снова стать доступным, поэтому остаётся в индексе поисковых систем.
|
|
32
|
+
*/
|
|
33
|
+
ScRedirectStatusEnum[ScRedirectStatusEnum["Temporary"] = 302] = "Temporary";
|
|
34
|
+
})(ScRedirectStatusEnum || (ScRedirectStatusEnum = {}));
|
|
35
|
+
|
|
21
36
|
/**
|
|
22
37
|
* Статусы состояния запроса.
|
|
23
38
|
*/
|
|
@@ -461,6 +476,15 @@ const SC_AUTH_AS_CLIENT_OPTIONS = new InjectionToken('SC_AUTH_AS_CLIENT_OPTIONS'
|
|
|
461
476
|
*/
|
|
462
477
|
const SC_CACHE_LIFETIME = new InjectionToken('ICacheLifetime');
|
|
463
478
|
|
|
479
|
+
/**
|
|
480
|
+
* Токен, определяющий, что включён постоянный (301) редирект на канонический адрес товара или категории.
|
|
481
|
+
*
|
|
482
|
+
* Если механизм выключен, редирект выполняется навигацией внутри приложения, и SSR отвечает кодом 200.
|
|
483
|
+
*/
|
|
484
|
+
const SC_CANONICAL_REDIRECT_ENABLED = new InjectionToken('SC_CANONICAL_REDIRECT_ENABLED', {
|
|
485
|
+
factory: () => true,
|
|
486
|
+
});
|
|
487
|
+
|
|
464
488
|
/**
|
|
465
489
|
* Токен для получения полной информации о компании.
|
|
466
490
|
*/
|
|
@@ -1044,7 +1068,8 @@ class ScAuthService {
|
|
|
1044
1068
|
this.tokenService.removeGuestToken();
|
|
1045
1069
|
return of(null);
|
|
1046
1070
|
}
|
|
1047
|
-
|
|
1071
|
+
// На сервере ключ Гостя некуда сохранить, поэтому запрос не выполняется.
|
|
1072
|
+
return this.isServer ? of(null) : this.getGuestToken$();
|
|
1048
1073
|
}), takeUntilDestroyed(this.destroyRef))
|
|
1049
1074
|
.subscribe();
|
|
1050
1075
|
if (this.isServer) {
|
|
@@ -1462,7 +1487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
1462
1487
|
}]
|
|
1463
1488
|
}] });
|
|
1464
1489
|
|
|
1465
|
-
const EMPTY_CART = { items: [], result_sum: { rub: 0 }
|
|
1490
|
+
const EMPTY_CART = { items: [], result_sum: { rub: 0 } };
|
|
1466
1491
|
|
|
1467
1492
|
/**
|
|
1468
1493
|
* Данные об итоговой сумме.
|
|
@@ -1854,7 +1879,6 @@ class ScOrderItem {
|
|
|
1854
1879
|
this.length = data.length;
|
|
1855
1880
|
this.width = data.width;
|
|
1856
1881
|
this.logicGroupId = data.logicGroupId;
|
|
1857
|
-
this.salesDirection = data.salesDirection;
|
|
1858
1882
|
this.specificationImgUrl = data.specificationImgUrl;
|
|
1859
1883
|
this.configurator = data.configurator;
|
|
1860
1884
|
this.configuratorParams = data.configuratorParams;
|
|
@@ -1901,10 +1925,9 @@ class ScCart {
|
|
|
1901
1925
|
* @param data Данные для первоначальной инициализации.
|
|
1902
1926
|
*/
|
|
1903
1927
|
// eslint-disable-next-line unicorn/no-object-as-default-parameter
|
|
1904
|
-
constructor(data = { items: [], resultSum: { rub: 0 }
|
|
1928
|
+
constructor(data = { items: [], resultSum: { rub: 0 } }) {
|
|
1905
1929
|
this.items = data.items.map((item) => new ScOrderItem(item));
|
|
1906
1930
|
this.resultSum = data.resultSum;
|
|
1907
|
-
this.directionsSum = data.directionsSum;
|
|
1908
1931
|
}
|
|
1909
1932
|
}
|
|
1910
1933
|
|
|
@@ -2045,15 +2068,14 @@ class ScUserMetadata {
|
|
|
2045
2068
|
* Вид отображения плиток товаров.
|
|
2046
2069
|
*/
|
|
2047
2070
|
this.productTileType = ScProductTileType.grid;
|
|
2048
|
-
/**
|
|
2049
|
-
* Метаданные не оформленных заказов.
|
|
2050
|
-
*/
|
|
2051
|
-
this.newOrdersMetadata = [];
|
|
2052
2071
|
/**
|
|
2053
2072
|
* Формат отображения каталога.
|
|
2054
2073
|
*/
|
|
2055
2074
|
this.catalogFormat = ScCatalogFormat.normal;
|
|
2056
|
-
|
|
2075
|
+
const metadata = { ...data };
|
|
2076
|
+
// Устаревший ключ черновика заказа по направлениям, не переносится в актуальные метаданные.
|
|
2077
|
+
delete metadata['newOrdersMetadata'];
|
|
2078
|
+
Object.assign(this, metadata);
|
|
2057
2079
|
}
|
|
2058
2080
|
}
|
|
2059
2081
|
|
|
@@ -2161,54 +2183,28 @@ class ScUIService {
|
|
|
2161
2183
|
this.setMetadataByKey('paginatePageSize', paginatePageSize);
|
|
2162
2184
|
}
|
|
2163
2185
|
/**
|
|
2164
|
-
* Возвращает {@link Observable} метаданных неоформленного
|
|
2165
|
-
*
|
|
2166
|
-
* @param directionsId Идентификатор направления продаж.
|
|
2186
|
+
* Возвращает {@link Observable} метаданных неоформленного заказа.
|
|
2167
2187
|
*/
|
|
2168
|
-
getNewOrderMetadata$(
|
|
2169
|
-
|
|
2170
|
-
return this.userMetadataSubject.pipe(map$1((metadata) => metadata.newOrdersMetadata), distinctUntilChanged(), map$1((ordersMetadata) => ordersMetadata[directionsId]), distinctUntilChanged());
|
|
2188
|
+
getNewOrderMetadata$() {
|
|
2189
|
+
return this.getMetadataChangeByKey$('newOrderMetadata');
|
|
2171
2190
|
}
|
|
2172
2191
|
/**
|
|
2173
|
-
* Устанавливает метаданные неоформленного
|
|
2192
|
+
* Устанавливает метаданные неоформленного заказа.
|
|
2174
2193
|
*
|
|
2175
|
-
* @param directionsId Идентификатор направления продаж.
|
|
2176
2194
|
* @param newOrderMetadata Данные нового неоформленного заказа.
|
|
2177
2195
|
*/
|
|
2178
|
-
setNewOrderMetadata(
|
|
2196
|
+
setNewOrderMetadata(newOrderMetadata) {
|
|
2179
2197
|
// При сохранении изображения выдаёт ошибку 500 'Произошла ошибка при работе с базой данных'.
|
|
2180
2198
|
// TODO: TASK[#6370]: Доработать после решения задачи.
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
}
|
|
2185
|
-
this.getMetadataChangeByKey$('newOrdersMetadata')
|
|
2186
|
-
.pipe(first())
|
|
2187
|
-
.subscribe((ordersMetadata) => {
|
|
2188
|
-
// eslint-disable-next-line no-param-reassign
|
|
2189
|
-
ordersMetadata[directionsId] = newOrderMetadata;
|
|
2190
|
-
this.setMetadataByKey('newOrdersMetadata', structuredClone(ordersMetadata));
|
|
2191
|
-
});
|
|
2192
|
-
}
|
|
2193
|
-
/**
|
|
2194
|
-
* Удаляет метаданные неоформленного заказа по направлению продаж.
|
|
2195
|
-
*
|
|
2196
|
-
* @param directionsId Идентификатор направления продаж.
|
|
2197
|
-
*/
|
|
2198
|
-
removeNewOrderMetadata(directionsId) {
|
|
2199
|
-
this.getMetadataChangeByKey$('newOrdersMetadata')
|
|
2200
|
-
.pipe(first())
|
|
2201
|
-
.subscribe((ordersMetadata) => {
|
|
2202
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete,no-param-reassign
|
|
2203
|
-
delete ordersMetadata[directionsId];
|
|
2204
|
-
this.setMetadataByKey('newOrdersMetadata', structuredClone(ordersMetadata));
|
|
2205
|
-
});
|
|
2199
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2200
|
+
const { image, ...newOrderMetadataWithoutImage } = newOrderMetadata;
|
|
2201
|
+
this.setMetadataByKey('newOrderMetadata', newOrderMetadataWithoutImage);
|
|
2206
2202
|
}
|
|
2207
2203
|
/**
|
|
2208
|
-
* Удаляет метаданные
|
|
2204
|
+
* Удаляет метаданные неоформленного заказа.
|
|
2209
2205
|
*/
|
|
2210
|
-
|
|
2211
|
-
this.setMetadataByKey('
|
|
2206
|
+
removeNewOrderMetadata() {
|
|
2207
|
+
this.setMetadataByKey('newOrderMetadata', undefined);
|
|
2212
2208
|
}
|
|
2213
2209
|
/**
|
|
2214
2210
|
* Возвращает дату последнего открытия опросников.
|
|
@@ -2933,7 +2929,7 @@ class ScCartService {
|
|
|
2933
2929
|
target: ScUserMetrikaGoalsEnum.cartCleared,
|
|
2934
2930
|
});
|
|
2935
2931
|
}), tap(() => {
|
|
2936
|
-
this.uiService.
|
|
2932
|
+
this.uiService.removeNewOrderMetadata();
|
|
2937
2933
|
this.cartCachedItem$.setValue(new ScCart());
|
|
2938
2934
|
}));
|
|
2939
2935
|
}
|
|
@@ -2951,19 +2947,6 @@ class ScCartService {
|
|
|
2951
2947
|
getNullCartItems$() {
|
|
2952
2948
|
return this.get$().pipe(map$1((cart) => (cart === loadingPlaceholder ? loadingPlaceholder : cart.items.filter((item) => item.product.isNull || item.product.isHidden))));
|
|
2953
2949
|
}
|
|
2954
|
-
/**
|
|
2955
|
-
* Возвращает объект {@link ScCart} корзины, созданный из объекта заказа.
|
|
2956
|
-
*
|
|
2957
|
-
* @param order Данные о заказе.
|
|
2958
|
-
*/
|
|
2959
|
-
// eslint-disable-next-line class-methods-use-this
|
|
2960
|
-
getCartByOrder(order) {
|
|
2961
|
-
return {
|
|
2962
|
-
items: order.products,
|
|
2963
|
-
resultSum: { rub: order.sum },
|
|
2964
|
-
directionsSum: { [order.salesDirection.id]: new ScSum(order.sum) },
|
|
2965
|
-
};
|
|
2966
|
-
}
|
|
2967
2950
|
/**
|
|
2968
2951
|
* Возвращает пример CSV файла для добавления продуктов в корзину.
|
|
2969
2952
|
*/
|
|
@@ -3599,7 +3582,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
3599
3582
|
}] }, { type: ScUserMetrikaService }] });
|
|
3600
3583
|
|
|
3601
3584
|
/**
|
|
3602
|
-
* Сервис
|
|
3585
|
+
* Сервис редиректов каталога: на родительскую категорию при недоступности (HTTP 404) товара или категории
|
|
3586
|
+
* и на канонический адрес товара или категории (см. {@link redirectToCanonicalUrl}).
|
|
3587
|
+
*
|
|
3588
|
+
* Редирект на родительскую категорию.
|
|
3603
3589
|
*
|
|
3604
3590
|
* Запрашивает у бэкенда родительскую категорию недоступной сущности и выполняет редирект:
|
|
3605
3591
|
* - на сервере (SSR, RenderMode.Server) при доступном `RESPONSE_INIT` — выставляет HTTP-статус 302 и заголовок `Location` для корректного редиректа поисковых ботов;
|
|
@@ -3623,6 +3609,10 @@ class ScCatalogRedirectService {
|
|
|
3623
3609
|
* Признак использования идентификатора или slug в маршрутах товаров и категорий.
|
|
3624
3610
|
*/
|
|
3625
3611
|
this.idOrSlug = inject(SC_ID_OR_SLUG_IN_ROUTE);
|
|
3612
|
+
/**
|
|
3613
|
+
* Признак, что включён постоянный редирект на канонический адрес товара или категории.
|
|
3614
|
+
*/
|
|
3615
|
+
this.isCanonicalRedirectEnabled = inject(SC_CANONICAL_REDIRECT_ENABLED);
|
|
3626
3616
|
/**
|
|
3627
3617
|
* Признак, что текущий скрипт исполняется на сервере.
|
|
3628
3618
|
*/
|
|
@@ -3639,6 +3629,40 @@ class ScCatalogRedirectService {
|
|
|
3639
3629
|
*/
|
|
3640
3630
|
this.document = inject(DOCUMENT);
|
|
3641
3631
|
}
|
|
3632
|
+
/**
|
|
3633
|
+
* Возвращает результат стража маршрута для перехода на канонический адрес товара или категории
|
|
3634
|
+
* (адрес со slug либо с идентификатором — в зависимости от настроек окружения).
|
|
3635
|
+
*
|
|
3636
|
+
* @param commands Сегменты канонического маршрута.
|
|
3637
|
+
* @param status Статус редиректа: вид адреса задаётся настройками окружения и может быть изменён, поэтому по умолчанию временный.
|
|
3638
|
+
* @returns Дерево канонического маршрута для навигации либо `false`, если редирект выполнен ответом сервера.
|
|
3639
|
+
*/
|
|
3640
|
+
// eslint-disable-next-line sonarjs/function-return-type
|
|
3641
|
+
redirectToCanonicalUrl(commands, status = ScRedirectStatusEnum.Temporary) {
|
|
3642
|
+
const urlTree = this.router.createUrlTree(commands);
|
|
3643
|
+
if (this.isCanonicalRedirectEnabled && this.isServer && this.setServerRedirect(this.router.serializeUrl(urlTree), status)) {
|
|
3644
|
+
return false;
|
|
3645
|
+
}
|
|
3646
|
+
return urlTree;
|
|
3647
|
+
}
|
|
3648
|
+
/**
|
|
3649
|
+
* Выставляет редирект в ответе сервера (SSR).
|
|
3650
|
+
*
|
|
3651
|
+
* @param targetUrl Адрес, на который выполняется редирект.
|
|
3652
|
+
* @param status Статус редиректа.
|
|
3653
|
+
* @returns Признак, что редирект выставлен; `false`, если инициализатор ответа недоступен (Client/Prerender).
|
|
3654
|
+
*/
|
|
3655
|
+
setServerRedirect(targetUrl, status) {
|
|
3656
|
+
if (!this.responseInit) {
|
|
3657
|
+
return false;
|
|
3658
|
+
}
|
|
3659
|
+
this.responseInit.status = status;
|
|
3660
|
+
// responseInit.headers — инстанс Headers, заголовок ставим через .set().
|
|
3661
|
+
const headers = this.responseInit.headers instanceof Headers ? this.responseInit.headers : new Headers(this.responseInit.headers);
|
|
3662
|
+
headers.set('Location', targetUrl);
|
|
3663
|
+
this.responseInit.headers = headers;
|
|
3664
|
+
return true;
|
|
3665
|
+
}
|
|
3642
3666
|
/**
|
|
3643
3667
|
* Выполняет редирект на родительскую категорию недоступной категории.
|
|
3644
3668
|
*
|
|
@@ -3720,13 +3744,8 @@ class ScCatalogRedirectService {
|
|
|
3720
3744
|
const urlTree = this.router.createUrlTree(['/catalog', target]);
|
|
3721
3745
|
const targetUrl = this.router.serializeUrl(urlTree);
|
|
3722
3746
|
if (this.isServer) {
|
|
3723
|
-
//
|
|
3724
|
-
|
|
3725
|
-
if (this.responseInit) {
|
|
3726
|
-
this.responseInit.status = 302;
|
|
3727
|
-
const headers = this.responseInit.headers instanceof Headers ? this.responseInit.headers : new Headers(this.responseInit.headers);
|
|
3728
|
-
headers.set('Location', targetUrl);
|
|
3729
|
-
this.responseInit.headers = headers;
|
|
3747
|
+
// Скрытые категория или товар могут снова стать доступными, поэтому редирект на родителя временный.
|
|
3748
|
+
if (this.setServerRedirect(targetUrl, ScRedirectStatusEnum.Temporary)) {
|
|
3730
3749
|
return EMPTY;
|
|
3731
3750
|
}
|
|
3732
3751
|
// SSR в режиме Client/Prerender (RESPONSE_INIT отсутствует): серверный редирект невозможен —
|
|
@@ -5688,6 +5707,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
5688
5707
|
/**
|
|
5689
5708
|
* Страж выполняющий проверку маршрута товара и категории, и редиректа в зависимости от настроек окружения.
|
|
5690
5709
|
*
|
|
5710
|
+
* Редирект выполняет {@link ScCatalogRedirectService.redirectToCanonicalUrl}: на сервере (SSR) это постоянный
|
|
5711
|
+
* редирект (HTTP 301), в браузере — навигация внутри приложения.
|
|
5712
|
+
*
|
|
5691
5713
|
* @param route Сервис предоставляющий доступ к данным о маршруте.
|
|
5692
5714
|
*/
|
|
5693
5715
|
// eslint-disable-next-line sonarjs/function-return-type
|
|
@@ -5696,20 +5718,20 @@ const ScIdOrSlugGuard = (route) => {
|
|
|
5696
5718
|
const categoryIdOrSlug = paramMap.get('categoryIdOrSlug');
|
|
5697
5719
|
const productIdOrSlug = paramMap.get('productIdOrSlug');
|
|
5698
5720
|
const idOrSlug = inject(SC_ID_OR_SLUG_IN_ROUTE);
|
|
5699
|
-
const
|
|
5721
|
+
const catalogRedirectService = inject(ScCatalogRedirectService);
|
|
5700
5722
|
if (categoryIdOrSlug && /^\d+$/.test(categoryIdOrSlug) !== (idOrSlug === 'id')) {
|
|
5701
5723
|
return inject(ScCatalogService)
|
|
5702
5724
|
.getCategoryCached$(categoryIdOrSlug)
|
|
5703
5725
|
.pipe(filter(tuiIsPresent),
|
|
5704
5726
|
// eslint-disable-next-line security/detect-object-injection
|
|
5705
|
-
map$1((category) =>
|
|
5727
|
+
map$1((category) => catalogRedirectService.redirectToCanonicalUrl(['/catalog', category[idOrSlug]])), catchError$1(() => of(TUI_TRUE_HANDLER())));
|
|
5706
5728
|
}
|
|
5707
5729
|
if (productIdOrSlug && /^\d+$/.test(productIdOrSlug) !== (idOrSlug === 'id')) {
|
|
5708
5730
|
return inject(ScCatalogService)
|
|
5709
5731
|
.getProductData$(productIdOrSlug)
|
|
5710
5732
|
.pipe(filter(tuiIsPresent),
|
|
5711
5733
|
// eslint-disable-next-line security/detect-object-injection
|
|
5712
|
-
map$1((product) =>
|
|
5734
|
+
map$1((product) => catalogRedirectService.redirectToCanonicalUrl(['/catalog', 'product', product[idOrSlug]])), catchError$1(() => of(TUI_TRUE_HANDLER())));
|
|
5713
5735
|
}
|
|
5714
5736
|
return true;
|
|
5715
5737
|
};
|
|
@@ -7245,13 +7267,12 @@ class ScOrdersService {
|
|
|
7245
7267
|
});
|
|
7246
7268
|
}
|
|
7247
7269
|
/**
|
|
7248
|
-
* Создаёт
|
|
7270
|
+
* Создаёт заказы из выбранных позиций корзины.
|
|
7249
7271
|
*
|
|
7250
|
-
* @param directionId Идентификатор направления продаж.
|
|
7251
7272
|
* @param newOrder Данные нового заказа.
|
|
7252
7273
|
*/
|
|
7253
|
-
createOrder$(
|
|
7254
|
-
return this.http.post(`${this.urls.apiUrl}/orders
|
|
7274
|
+
createOrder$(newOrder) {
|
|
7275
|
+
return this.http.post(`${this.urls.apiUrl}/orders/from-cart`, newOrder).pipe(map$1((orders) => orders.map((item) => new ScOrderShort(item))), tap((orders) => {
|
|
7255
7276
|
orders.forEach((order) => {
|
|
7256
7277
|
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7257
7278
|
target: ScUserMetrikaGoalsEnum.orderCreated,
|
|
@@ -7259,7 +7280,7 @@ class ScOrdersService {
|
|
|
7259
7280
|
});
|
|
7260
7281
|
});
|
|
7261
7282
|
}), tap(() => {
|
|
7262
|
-
this.uiService.removeNewOrderMetadata(
|
|
7283
|
+
this.uiService.removeNewOrderMetadata();
|
|
7263
7284
|
}));
|
|
7264
7285
|
}
|
|
7265
7286
|
/**
|
|
@@ -8623,6 +8644,220 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
8623
8644
|
}]
|
|
8624
8645
|
}] });
|
|
8625
8646
|
|
|
8647
|
+
/**
|
|
8648
|
+
* Кэш ответов API, один на процесс: переживает пересоздание инжектора между SSR-рендерами.
|
|
8649
|
+
* Одинаковые одновременные запросы склеиваются, при переполнении вытесняется самая давняя запись.
|
|
8650
|
+
*/
|
|
8651
|
+
class ScSsrResponseCache {
|
|
8652
|
+
/**
|
|
8653
|
+
* Инициализирует экземпляр класса {@link ScSsrResponseCache}.
|
|
8654
|
+
*
|
|
8655
|
+
* @param maxEntries Максимальное количество записей в кэше.
|
|
8656
|
+
*/
|
|
8657
|
+
constructor(maxEntries = 100) {
|
|
8658
|
+
/**
|
|
8659
|
+
* Закэшированные ответы по ключу запроса.
|
|
8660
|
+
*/
|
|
8661
|
+
this.entries = new Map();
|
|
8662
|
+
/**
|
|
8663
|
+
* Выполняемые запросы по ключу запроса.
|
|
8664
|
+
*/
|
|
8665
|
+
this.pending = new Map();
|
|
8666
|
+
/**
|
|
8667
|
+
* Количество запросов, отданных без обращения к API.
|
|
8668
|
+
*/
|
|
8669
|
+
this.hits = 0;
|
|
8670
|
+
/**
|
|
8671
|
+
* Количество запросов, выполненных к API.
|
|
8672
|
+
*/
|
|
8673
|
+
this.misses = 0;
|
|
8674
|
+
this.maxEntries = Number.isFinite(maxEntries) ? Math.max(1, maxEntries) : 100;
|
|
8675
|
+
}
|
|
8676
|
+
/**
|
|
8677
|
+
* Возвращает ответ из кэша, при отсутствии или устаревании загружает и кэширует. Ошибка загрузки не кэшируется.
|
|
8678
|
+
*
|
|
8679
|
+
* @param key Ключ запроса.
|
|
8680
|
+
* @param lifeTime Время жизни ответа (мс).
|
|
8681
|
+
* @param loader Функция загрузки ответа.
|
|
8682
|
+
*/
|
|
8683
|
+
getOrLoad(key, lifeTime, loader) {
|
|
8684
|
+
const cached = this.get(key);
|
|
8685
|
+
if (cached) {
|
|
8686
|
+
this.hits += 1;
|
|
8687
|
+
return Promise.resolve(cached.response);
|
|
8688
|
+
}
|
|
8689
|
+
const pending = this.pending.get(key);
|
|
8690
|
+
if (pending) {
|
|
8691
|
+
this.hits += 1;
|
|
8692
|
+
return pending;
|
|
8693
|
+
}
|
|
8694
|
+
this.misses += 1;
|
|
8695
|
+
const loading = loader()
|
|
8696
|
+
.then((response) => {
|
|
8697
|
+
this.set(key, { response, expiresAt: Date.now() + lifeTime });
|
|
8698
|
+
return response;
|
|
8699
|
+
})
|
|
8700
|
+
.finally(() => {
|
|
8701
|
+
this.pending.delete(key);
|
|
8702
|
+
});
|
|
8703
|
+
this.pending.set(key, loading);
|
|
8704
|
+
return loading;
|
|
8705
|
+
}
|
|
8706
|
+
/**
|
|
8707
|
+
* Возвращает статистику работы кэша.
|
|
8708
|
+
*/
|
|
8709
|
+
getStats() {
|
|
8710
|
+
return { size: this.entries.size, hits: this.hits, misses: this.misses };
|
|
8711
|
+
}
|
|
8712
|
+
/**
|
|
8713
|
+
* Возвращает актуальную запись или `null`.
|
|
8714
|
+
*
|
|
8715
|
+
* @param key Ключ запроса.
|
|
8716
|
+
*/
|
|
8717
|
+
get(key) {
|
|
8718
|
+
const entry = this.entries.get(key);
|
|
8719
|
+
if (!entry) {
|
|
8720
|
+
return null;
|
|
8721
|
+
}
|
|
8722
|
+
if (entry.expiresAt <= Date.now()) {
|
|
8723
|
+
this.entries.delete(key);
|
|
8724
|
+
return null;
|
|
8725
|
+
}
|
|
8726
|
+
// Перестановка в конец помечает запись как недавно использованную.
|
|
8727
|
+
this.entries.delete(key);
|
|
8728
|
+
this.entries.set(key, entry);
|
|
8729
|
+
return entry;
|
|
8730
|
+
}
|
|
8731
|
+
/**
|
|
8732
|
+
* Сохраняет запись, при переполнении вытесняя самую давнюю.
|
|
8733
|
+
*
|
|
8734
|
+
* @param key Ключ запроса.
|
|
8735
|
+
* @param entry Запись кэша.
|
|
8736
|
+
*/
|
|
8737
|
+
set(key, entry) {
|
|
8738
|
+
this.entries.delete(key);
|
|
8739
|
+
if (this.entries.size >= this.maxEntries) {
|
|
8740
|
+
const [oldestKey] = this.entries.keys();
|
|
8741
|
+
this.entries.delete(oldestKey);
|
|
8742
|
+
}
|
|
8743
|
+
this.entries.set(key, entry);
|
|
8744
|
+
}
|
|
8745
|
+
}
|
|
8746
|
+
|
|
8747
|
+
/**
|
|
8748
|
+
* Кэш по умолчанию, один на процесс.
|
|
8749
|
+
*/
|
|
8750
|
+
const defaultSsrResponseCache = new ScSsrResponseCache();
|
|
8751
|
+
/**
|
|
8752
|
+
* Токен кэша ответов API между SSR-рендерами. По умолчанию один экземпляр на процесс, можно переопределить провайдером.
|
|
8753
|
+
*/
|
|
8754
|
+
const SC_SSR_RESPONSE_CACHE = new InjectionToken('SC_SSR_RESPONSE_CACHE', {
|
|
8755
|
+
factory: () => defaultSsrResponseCache,
|
|
8756
|
+
});
|
|
8757
|
+
|
|
8758
|
+
/**
|
|
8759
|
+
* Токен настроек кэша ответов API между SSR-рендерами. По умолчанию кэш выключен.
|
|
8760
|
+
*/
|
|
8761
|
+
const SC_SSR_RESPONSE_CACHE_SETTINGS = new InjectionToken('SC_SSR_RESPONSE_CACHE_SETTINGS', {
|
|
8762
|
+
factory: () => ({ endpoints: [], lifeTime: 0, loadTimeout: 0 }),
|
|
8763
|
+
});
|
|
8764
|
+
|
|
8765
|
+
/**
|
|
8766
|
+
* Возвращает признак, что ответ можно кэшировать между SSR-рендерами: GET за JSON без ключей доступа по адресам из настроек.
|
|
8767
|
+
*
|
|
8768
|
+
* @param request Данные запроса.
|
|
8769
|
+
* @param settings Настройки кэша.
|
|
8770
|
+
* @param apiUrl Адрес API.
|
|
8771
|
+
* @param apiKeys Названия заголовков ключей доступа к API.
|
|
8772
|
+
*
|
|
8773
|
+
* @internal
|
|
8774
|
+
*/
|
|
8775
|
+
function isSsrResponseCacheable(request, settings, apiUrl, apiKeys) {
|
|
8776
|
+
if (!Number.isFinite(settings.lifeTime) || settings.lifeTime <= 0 || request.method !== 'GET' || request.responseType !== 'json') {
|
|
8777
|
+
return false;
|
|
8778
|
+
}
|
|
8779
|
+
if (request.headers.has(apiKeys.keyName) || request.headers.has(apiKeys.guestKeyName)) {
|
|
8780
|
+
return false;
|
|
8781
|
+
}
|
|
8782
|
+
const [url] = request.url.split('?');
|
|
8783
|
+
if (!url.startsWith(apiUrl)) {
|
|
8784
|
+
return false;
|
|
8785
|
+
}
|
|
8786
|
+
const path = url.slice(apiUrl.length);
|
|
8787
|
+
return settings.endpoints.some((endpoint) => (endpoint.endsWith('*') ? path.startsWith(endpoint.slice(0, -1)) : path === endpoint));
|
|
8788
|
+
}
|
|
8789
|
+
|
|
8790
|
+
/**
|
|
8791
|
+
* Обработчик запросов с кэшем ответов API между SSR-рендерами.
|
|
8792
|
+
*
|
|
8793
|
+
* Стоит на уровне {@link HttpBackend}, ниже перехватчиков: ответ из кэша проходит через перенос в браузер,
|
|
8794
|
+
* а проверка ключей доступа видит итоговые заголовки. Отдаёт только итоговый {@link HttpResponse};
|
|
8795
|
+
* запрос не отменяется при отписке рендера, а ограничен `loadTimeout` из настроек.
|
|
8796
|
+
*/
|
|
8797
|
+
class ScSsrResponseCacheBackend {
|
|
8798
|
+
constructor() {
|
|
8799
|
+
/**
|
|
8800
|
+
* Штатный обработчик, выполняющий запросы к API.
|
|
8801
|
+
*/
|
|
8802
|
+
// TODO: Angular 21: проверить, какой backend регистрирует provideHttpClient.
|
|
8803
|
+
this.backend = inject(FetchBackend, { optional: true }) ?? inject(HttpXhrBackend);
|
|
8804
|
+
/**
|
|
8805
|
+
* Кэш ответов API.
|
|
8806
|
+
*/
|
|
8807
|
+
this.cache = inject(SC_SSR_RESPONSE_CACHE);
|
|
8808
|
+
/**
|
|
8809
|
+
* Настройки кэша.
|
|
8810
|
+
*/
|
|
8811
|
+
this.settings = inject(SC_SSR_RESPONSE_CACHE_SETTINGS);
|
|
8812
|
+
/**
|
|
8813
|
+
* Адрес API.
|
|
8814
|
+
*/
|
|
8815
|
+
this.apiUrl = inject(SC_URLS).apiUrl;
|
|
8816
|
+
/**
|
|
8817
|
+
* Названия заголовков ключей доступа к API.
|
|
8818
|
+
*/
|
|
8819
|
+
this.apiKeys = inject(SC_API_KEYS);
|
|
8820
|
+
}
|
|
8821
|
+
/** @inheritDoc */
|
|
8822
|
+
handle(request) {
|
|
8823
|
+
if (!isSsrResponseCacheable(request, this.settings, this.apiUrl, this.apiKeys)) {
|
|
8824
|
+
return this.backend.handle(request);
|
|
8825
|
+
}
|
|
8826
|
+
return defer(() => from(this.cache.getOrLoad(request.urlWithParams, this.settings.lifeTime, () => this.load(request)))).pipe(
|
|
8827
|
+
// Копия тела на каждый рендер, чтобы изменения не утекали между рендерами.
|
|
8828
|
+
map$1((response) => response.clone({ body: structuredClone(response.body) })));
|
|
8829
|
+
}
|
|
8830
|
+
/**
|
|
8831
|
+
* Выполняет запрос к API и возвращает его ответ.
|
|
8832
|
+
*
|
|
8833
|
+
* @param request Данные запроса.
|
|
8834
|
+
*/
|
|
8835
|
+
load(request) {
|
|
8836
|
+
const response$ = this.backend.handle(request).pipe(filter((event) => event instanceof HttpResponse));
|
|
8837
|
+
if (this.settings.loadTimeout <= 0) {
|
|
8838
|
+
return lastValueFrom(response$);
|
|
8839
|
+
}
|
|
8840
|
+
// По таймауту запрос отменяется, ошибка отдаётся как HttpErrorResponse, как и остальные ошибки запросов.
|
|
8841
|
+
return lastValueFrom(response$.pipe(timeout(this.settings.loadTimeout), catchError$1((error) => throwError(() => error instanceof TimeoutError
|
|
8842
|
+
? new HttpErrorResponse({ status: HttpStatusCode.GatewayTimeout, statusText: 'Gateway Timeout', url: request.url, error })
|
|
8843
|
+
: error))));
|
|
8844
|
+
}
|
|
8845
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScSsrResponseCacheBackend, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
8846
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScSsrResponseCacheBackend }); }
|
|
8847
|
+
}
|
|
8848
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScSsrResponseCacheBackend, decorators: [{
|
|
8849
|
+
type: Injectable
|
|
8850
|
+
}] });
|
|
8851
|
+
|
|
8852
|
+
/**
|
|
8853
|
+
* Возвращает провайдеры кэша ответов API между SSR-рендерами.
|
|
8854
|
+
* Подключать только в серверной конфигурации после `provideHttpClient()`: подменяют {@link HttpBackend}.
|
|
8855
|
+
*/
|
|
8856
|
+
// TODO: Angular 21: проверить, что подмена HttpBackend остаётся последней после provideServerRendering(withRoutes()).
|
|
8857
|
+
function provideSsrResponseCache() {
|
|
8858
|
+
return makeEnvironmentProviders([{ provide: HttpBackend, useClass: ScSsrResponseCacheBackend }]);
|
|
8859
|
+
}
|
|
8860
|
+
|
|
8626
8861
|
/**
|
|
8627
8862
|
* Перечисление типов подсказок запросов.
|
|
8628
8863
|
*/
|
|
@@ -9002,5 +9237,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
9002
9237
|
* Generated bundle index. Do not edit.
|
|
9003
9238
|
*/
|
|
9004
9239
|
|
|
9005
|
-
export { CATEGORY_PROVIDERS, EMPTY_CART, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, SC_ACCESS_AUTH_TOKEN_STORAGE_KEY, SC_API_KEYS, SC_AUTH_ADD_HEADER_REQUIRED, SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS, SC_AUTH_AS_CLIENT_OPTIONS, SC_CACHE_LIFETIME, SC_CACHE_SETTINGS, SC_CATALOG_ITEM_PAGE_META, SC_CATALOG_ROOT_PAGE_META, SC_CATEGORY_INFO, SC_CATEGORY_STATE, SC_COMPANY_INFO, SC_COMPANY_NAME, SC_CONFIGURATOR_COMPONENTS, SC_CONFIGURATOR_SETTINGS, SC_COUNT_FIRST_DISCOUNTED_PRODUCTS, SC_COUNT_LAST_NEWS, SC_DATE_FORMAT, SC_DEFAULT_PAGE_META, SC_FEEDBACK_API, SC_GUEST_ENDPOINTS_TOKEN, SC_GUEST_PARAMETER_NAME_TOKEN, SC_GUEST_TOKEN_STORAGE_KEY, SC_ID_OR_SLUG_IN_ROUTE, SC_IS_HEADER_REQUIRED, SC_IS_HIDDEN_ERROR_ALERT, SC_IS_HIDDEN_ERROR_ALERT_HTTP_CONTEXT, SC_IS_LOGOUT_REQUEST, SC_IS_REFRESH_REQUIRED, SC_LINEAR_VALUES, SC_LINEAR_VALUES_TOKEN, SC_MAX_LENGTH_SEARCH_TERM, SC_MIN_LENGTH_SEARCH_TERM, SC_NEXT_PAGE_PAGINATION_CLICK, SC_ORDER_LOADER, SC_ORDER_LOADING, SC_PAGE_QUERY_PARAM, SC_PATH_IMAGE_NOT_FOUND, SC_PRODUCTS_PAGINATION_LOADER, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_SSR_HTTP_TIMEOUT, SC_UPDATE_INTERVAL, SC_URLS, SC_USER_INFO, SC_VACANCIES_DATA_SOURCE, SC_VIRTUAL_CATEGORY_INFO, SC_VIRTUAL_CATEGORY_PROVIDERS, SEARCH_TERM, SEARCH_TERM_PROVIDERS, ScAuthAsClientGuard, ScAuthInterceptor, ScAuthService, ScBanner, ScBannerService, ScCacheInterceptor, ScCacheSettings, ScCachedData, ScCachedItem, ScCart, ScCartService, ScCatalogFilterService, ScCatalogFormat, ScCatalogItem, ScCatalogRedirectService, ScCatalogService, ScCatalogableItem, ScCategory, ScClientType, ScCodedIdentity, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDateFormatInterceptor, ScDeletableNamedIdentity, ScDeliveryAddressService, ScDeliveryCost, ScDeliveryType, ScDocumentInfoNode, ScDocumentInfoTypesEnum, ScErrorRequestState, ScErrorsInterceptor, ScFavoriteService, ScFeedbackForms, ScFeedbackService, ScFilesService, ScFrequentlyAskedQuestionsService, ScGuestInterceptor, ScHiddenCatalogableItem, ScIBreadcrumbItem, ScISuggestionType, ScIconTypesEnum, ScIdOrSlugGuard, ScIdOrSlugPipe, ScIdentity, ScImage, ScImageHelper, ScLoadingRequestState, ScLocationsService, ScMediaImageTransformerPipe, ScMimeTypes, ScNamedIdentity, ScNews, ScNewsService, ScNotificationActionTypes, ScNotificationLevelNames, ScNotificationsService, ScOpfList, ScOptionsInterceptor, ScOrder, ScOrderBase, ScOrderDraft, ScOrderDraftShort, ScOrderDraftType, ScOrderDraftsService, ScOrderItem, ScOrderShort, ScOrderStateStatus, ScOrdersService, ScPaginationPageQueryParamService, ScPaginationService, ScPaymentStatus, ScPaymentType, ScPhoneService, ScPrimaryCatalogableItem, ScProduct, ScProductTileType, ScQuestionnaireService, ScQuestionnaireStatusEnum, ScReclamationService, ScReclamationStatus, ScRecommendationService, ScReference, ScReferenceName, ScReferencesService, ScRequestStateStatusEnum, ScRequisitesService, ScRouteKeys, ScSearchService, ScSeoService, ScSocialType, ScSsrTimeoutInterceptor, ScSuccessRequestState, ScSuggestionService, ScSum, ScTokenService, ScUIService, ScUTMService, ScUnitsHelper, ScUpdatableNamedIdentity, ScUploadedFile, ScUser, ScUserMetadata, ScUserMetrikaGoalsEnum, ScUserMetrikaService, ScUserService, ScUserType, ScVCardService, ScVacanciesList, ScVacanciesService, ScVacancy, ScVerificationService, ScVirtualCategory, ScWarehouseService, SchemaOrgFactory, TERMINAL_PROVIDERS, USER_AGENT_TERMINAL, filterChangedByKey, loadingPlaceholder, mapRequestStateToDataOrNull, mapToRequestState, runningOnTerminalFactory, scGetCurrentRoute, scGetPageQueryParamChanges, scOrderIsLoaded, scParsePageQueryParam, searchTermFactory };
|
|
9240
|
+
export { CATEGORY_PROVIDERS, EMPTY_CART, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, SC_ACCESS_AUTH_TOKEN_STORAGE_KEY, SC_API_KEYS, SC_AUTH_ADD_HEADER_REQUIRED, SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS, SC_AUTH_AS_CLIENT_OPTIONS, SC_CACHE_LIFETIME, SC_CACHE_SETTINGS, SC_CANONICAL_REDIRECT_ENABLED, SC_CATALOG_ITEM_PAGE_META, SC_CATALOG_ROOT_PAGE_META, SC_CATEGORY_INFO, SC_CATEGORY_STATE, SC_COMPANY_INFO, SC_COMPANY_NAME, SC_CONFIGURATOR_COMPONENTS, SC_CONFIGURATOR_SETTINGS, SC_COUNT_FIRST_DISCOUNTED_PRODUCTS, SC_COUNT_LAST_NEWS, SC_DATE_FORMAT, SC_DEFAULT_PAGE_META, SC_FEEDBACK_API, SC_GUEST_ENDPOINTS_TOKEN, SC_GUEST_PARAMETER_NAME_TOKEN, SC_GUEST_TOKEN_STORAGE_KEY, SC_ID_OR_SLUG_IN_ROUTE, SC_IS_HEADER_REQUIRED, SC_IS_HIDDEN_ERROR_ALERT, SC_IS_HIDDEN_ERROR_ALERT_HTTP_CONTEXT, SC_IS_LOGOUT_REQUEST, SC_IS_REFRESH_REQUIRED, SC_LINEAR_VALUES, SC_LINEAR_VALUES_TOKEN, SC_MAX_LENGTH_SEARCH_TERM, SC_MIN_LENGTH_SEARCH_TERM, SC_NEXT_PAGE_PAGINATION_CLICK, SC_ORDER_LOADER, SC_ORDER_LOADING, SC_PAGE_QUERY_PARAM, SC_PATH_IMAGE_NOT_FOUND, SC_PRODUCTS_PAGINATION_LOADER, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_SSR_HTTP_TIMEOUT, SC_SSR_RESPONSE_CACHE, SC_SSR_RESPONSE_CACHE_SETTINGS, SC_UPDATE_INTERVAL, SC_URLS, SC_USER_INFO, SC_VACANCIES_DATA_SOURCE, SC_VIRTUAL_CATEGORY_INFO, SC_VIRTUAL_CATEGORY_PROVIDERS, SEARCH_TERM, SEARCH_TERM_PROVIDERS, ScAuthAsClientGuard, ScAuthInterceptor, ScAuthService, ScBanner, ScBannerService, ScCacheInterceptor, ScCacheSettings, ScCachedData, ScCachedItem, ScCart, ScCartService, ScCatalogFilterService, ScCatalogFormat, ScCatalogItem, ScCatalogRedirectService, ScCatalogService, ScCatalogableItem, ScCategory, ScClientType, ScCodedIdentity, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDateFormatInterceptor, ScDeletableNamedIdentity, ScDeliveryAddressService, ScDeliveryCost, ScDeliveryType, ScDocumentInfoNode, ScDocumentInfoTypesEnum, ScErrorRequestState, ScErrorsInterceptor, ScFavoriteService, ScFeedbackForms, ScFeedbackService, ScFilesService, ScFrequentlyAskedQuestionsService, ScGuestInterceptor, ScHiddenCatalogableItem, ScIBreadcrumbItem, ScISuggestionType, ScIconTypesEnum, ScIdOrSlugGuard, ScIdOrSlugPipe, ScIdentity, ScImage, ScImageHelper, ScLoadingRequestState, ScLocationsService, ScMediaImageTransformerPipe, ScMimeTypes, ScNamedIdentity, ScNews, ScNewsService, ScNotificationActionTypes, ScNotificationLevelNames, ScNotificationsService, ScOpfList, ScOptionsInterceptor, ScOrder, ScOrderBase, ScOrderDraft, ScOrderDraftShort, ScOrderDraftType, ScOrderDraftsService, ScOrderItem, ScOrderShort, ScOrderStateStatus, ScOrdersService, ScPaginationPageQueryParamService, ScPaginationService, ScPaymentStatus, ScPaymentType, ScPhoneService, ScPrimaryCatalogableItem, ScProduct, ScProductTileType, ScQuestionnaireService, ScQuestionnaireStatusEnum, ScReclamationService, ScReclamationStatus, ScRecommendationService, ScRedirectStatusEnum, ScReference, ScReferenceName, ScReferencesService, ScRequestStateStatusEnum, ScRequisitesService, ScRouteKeys, ScSearchService, ScSeoService, ScSocialType, ScSsrResponseCache, ScSsrResponseCacheBackend, ScSsrTimeoutInterceptor, ScSuccessRequestState, ScSuggestionService, ScSum, ScTokenService, ScUIService, ScUTMService, ScUnitsHelper, ScUpdatableNamedIdentity, ScUploadedFile, ScUser, ScUserMetadata, ScUserMetrikaGoalsEnum, ScUserMetrikaService, ScUserService, ScUserType, ScVCardService, ScVacanciesList, ScVacanciesService, ScVacancy, ScVerificationService, ScVirtualCategory, ScWarehouseService, SchemaOrgFactory, TERMINAL_PROVIDERS, USER_AGENT_TERMINAL, filterChangedByKey, loadingPlaceholder, mapRequestStateToDataOrNull, mapToRequestState, provideSsrResponseCache, runningOnTerminalFactory, scGetCurrentRoute, scGetPageQueryParamChanges, scOrderIsLoaded, scParsePageQueryParam, searchTermFactory };
|
|
9006
9241
|
//# sourceMappingURL=snabcentr-client-core.mjs.map
|