@snabcentr/client-core 2.55.0 → 2.56.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.
@@ -2,3 +2,4 @@ export * from './sc-i-login';
2
2
  export * from './sc-i-phone-login';
3
3
  export * from './sc-i-token';
4
4
  export * from './sc-i-auth-token';
5
+ export * from './sc-i-api-error-response';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Данные об ошибках валидации API запросов.
3
+ */
4
+ export interface ScIApiErrorResponse {
5
+ /**
6
+ * Обобщённое сообщение об ошибке.
7
+ */
8
+ message: string;
9
+ /**
10
+ * Подробное описание каждой ошибки. Содержит список полей с детальным описанием ошибок валидации для каждого поля.
11
+ */
12
+ errors?: Record<string, string[]>;
13
+ }
@@ -2,4 +2,5 @@ export * from './sc-i-login';
2
2
  export * from './sc-i-phone-login';
3
3
  export * from './sc-i-token';
4
4
  export * from './sc-i-auth-token';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2F1dGgvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NjLWktbG9naW4nO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1pLXBob25lLWxvZ2luJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS10b2tlbic7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktYXV0aC10b2tlbic7XG4iXX0=
5
+ export * from './sc-i-api-error-response';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2F1dGgvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYywyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc2MtaS1sb2dpbic7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktcGhvbmUtbG9naW4nO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1pLXRva2VuJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1hdXRoLXRva2VuJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1hcGktZXJyb3ItcmVzcG9uc2UnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtaS1hcGktZXJyb3ItcmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2F1dGgvaW50ZXJmYWNlcy9zYy1pLWFwaS1lcnJvci1yZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDQlNCw0L3QvdGL0LUg0L7QsSDQvtGI0LjQsdC60LDRhSDQstCw0LvQuNC00LDRhtC40LggQVBJINC30LDQv9GA0L7RgdC+0LIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NJQXBpRXJyb3JSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICog0J7QsdC+0LHRidGR0L3QvdC+0LUg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1LlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCf0L7QtNGA0L7QsdC90L7QtSDQvtC/0LjRgdCw0L3QuNC1INC60LDQttC00L7QuSDQvtGI0LjQsdC60LguINCh0L7QtNC10YDQttC40YIg0YHQv9C40YHQvtC6INC/0L7Qu9C10Lkg0YEg0LTQtdGC0LDQu9GM0L3Ri9C8INC+0L/QuNGB0LDQvdC40LXQvCDQvtGI0LjQsdC+0Log0LLQsNC70LjQtNCw0YbQuNC4INC00LvRjyDQutCw0LbQtNC+0LPQviDQv9C+0LvRjy5cbiAgICAgKi9cbiAgICBlcnJvcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG59XG4iXX0=
@@ -6,4 +6,5 @@ export * from './sc-convert.interceptor';
6
6
  export * from './sc-errors.interceptor';
7
7
  export * from './sc-options.interceptor';
8
8
  export * from './sc-guest.interceptor';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2h0dHBJbnRlcmNlcHRvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NsYXNzZXMnO1xuZXhwb3J0ICogZnJvbSAnLi90b2tlbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1hdXRoLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtY2FjaGUuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1jb252ZXJ0LmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtZXJyb3JzLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc2Mtb3B0aW9ucy5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3NjLWd1ZXN0LmludGVyY2VwdG9yJztcbiJdfQ==
9
+ export * from './sc-date-format.interceptor';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2h0dHBJbnRlcmNlcHRvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2xhc3Nlcyc7XG5leHBvcnQgKiBmcm9tICcuL3Rva2Vucyc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWF1dGguaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1jYWNoZS5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3NjLWNvbnZlcnQuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1lcnJvcnMuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1vcHRpb25zLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtZ3Vlc3QuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1kYXRlLWZvcm1hdC5pbnRlcmNlcHRvcic7XG4iXX0=
@@ -0,0 +1,80 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { format, isValid, parse } from 'date-fns';
3
+ import { isArray, isString } from 'lodash-es';
4
+ import { catchError, throwError } from 'rxjs';
5
+ import { SC_DATE_FORMAT } from '../tokens/sc-date-format';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Перехватчик для форматирования дат в ошибках запросов к API.
9
+ */
10
+ export class ScDateFormatInterceptor {
11
+ constructor() {
12
+ /**
13
+ * Формат дат.
14
+ */
15
+ this.dateFormats = inject(SC_DATE_FORMAT);
16
+ }
17
+ /** @inheritDoc */
18
+ intercept(request, next) {
19
+ return next.handle(request).pipe(catchError((error) => {
20
+ const errorData = error.error;
21
+ this.formatDatesInErrors(errorData);
22
+ return throwError(() => error);
23
+ }));
24
+ }
25
+ /**
26
+ * Форматирует даты в ошибках запросов к API.
27
+ *
28
+ * @param error Объект с ошибками API.
29
+ */
30
+ formatDatesInErrors(error) {
31
+ const { errors, message } = error;
32
+ // Форматируем основное сообщение об ошибке
33
+ if (message) {
34
+ // eslint-disable-next-line no-param-reassign
35
+ error.message = this.formatDateInString(message);
36
+ }
37
+ // eslint-disable-next-line no-restricted-syntax
38
+ for (const key in errors) {
39
+ if (Object.prototype.hasOwnProperty.call(errors, key)) {
40
+ // eslint-disable-next-line security/detect-object-injection
41
+ const fieldErrors = errors[key];
42
+ if (isArray(fieldErrors)) {
43
+ fieldErrors.forEach((errorMessage, index) => {
44
+ if (isString(errorMessage)) {
45
+ // eslint-disable-next-line security/detect-object-injection
46
+ fieldErrors[index] = this.formatDateInString(errorMessage);
47
+ }
48
+ });
49
+ }
50
+ }
51
+ }
52
+ }
53
+ /**
54
+ * Форматирует даты в строке.
55
+ *
56
+ * @param text Исходная строка.
57
+ */
58
+ formatDateInString(text) {
59
+ // Ищем даты в формате yyyy-MM-dd HH:mm:ss.
60
+ const dateRegex = /(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/g;
61
+ return text.replaceAll(dateRegex, (match) => {
62
+ try {
63
+ const parsedDate = parse(match, this.dateFormats.api, new Date());
64
+ if (isValid(parsedDate)) {
65
+ return format(parsedDate, this.dateFormats.uiDate);
66
+ }
67
+ }
68
+ catch {
69
+ // Если не удалось распарсить дату, ничего не делаем.
70
+ }
71
+ return match;
72
+ });
73
+ }
74
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScDateFormatInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
75
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScDateFormatInterceptor }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScDateFormatInterceptor, decorators: [{
78
+ type: Injectable
79
+ }] });
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtZGF0ZS1mb3JtYXQuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2h0dHBJbnRlcmNlcHRvcnMvc2MtZGF0ZS1mb3JtYXQuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFFMUQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sdUJBQXVCO0lBRHBDO1FBRUk7O1dBRUc7UUFDYyxnQkFBVyxHQUFrQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FrRXhFO0lBaEVHLGtCQUFrQjtJQUNYLFNBQVMsQ0FBQyxPQUE2QixFQUFFLElBQWlCO1FBQzdELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzVCLFVBQVUsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUNwQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBNEIsQ0FBQztZQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEMsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsS0FBMEI7UUFDbEQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFbEMsMkNBQTJDO1FBQzNDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDViw2Q0FBNkM7WUFDN0MsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwRCw0REFBNEQ7Z0JBQzVELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFaEMsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRTt3QkFDeEMsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQzs0QkFDekIsNERBQTREOzRCQUM1RCxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUMvRCxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsSUFBWTtRQUNuQywyQ0FBMkM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsd0NBQXdDLENBQUM7UUFFM0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQztnQkFDRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7WUFDTCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNMLHFEQUFxRDtZQUN6RCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQXJFUSx1QkFBdUI7bUhBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXQsIGlzVmFsaWQsIHBhcnNlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNTdHJpbmcgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY0lBcGlFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vYXV0aC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNjSURhdGVGb3JtYXQgfSBmcm9tICcuLi9jb25maWcvc2MtaS1kYXRlLWZvcm1hdCc7XG5pbXBvcnQgeyBTQ19EQVRFX0ZPUk1BVCB9IGZyb20gJy4uL3Rva2Vucy9zYy1kYXRlLWZvcm1hdCc7XG5cbi8qKlxuICog0J/QtdGA0LXRhdCy0LDRgtGH0LjQuiDQtNC70Y8g0YTQvtGA0LzQsNGC0LjRgNC+0LLQsNC90LjRjyDQtNCw0YIg0LIg0L7RiNC40LHQutCw0YUg0LfQsNC/0YDQvtGB0L7QsiDQuiBBUEkuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTY0RhdGVGb3JtYXRJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgLyoqXG4gICAgICog0KTQvtGA0LzQsNGCINC00LDRgi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVGb3JtYXRzOiBTY0lEYXRlRm9ybWF0ID0gaW5qZWN0KFNDX0RBVEVfRk9STUFUKTtcblxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIHB1YmxpYyBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvckRhdGEgPSBlcnJvci5lcnJvciBhcyBTY0lBcGlFcnJvclJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0RGF0ZXNJbkVycm9ycyhlcnJvckRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KTQvtGA0LzQsNGC0LjRgNGD0LXRgiDQtNCw0YLRiyDQsiDQvtGI0LjQsdC60LDRhSDQt9Cw0L/RgNC+0YHQvtCyINC6IEFQSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvciDQntCx0YrQtdC60YIg0YEg0L7RiNC40LHQutCw0LzQuCBBUEkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXREYXRlc0luRXJyb3JzKGVycm9yOiBTY0lBcGlFcnJvclJlc3BvbnNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXJyb3JzLCBtZXNzYWdlIH0gPSBlcnJvcjtcblxuICAgICAgICAvLyDQpNC+0YDQvNCw0YLQuNGA0YPQtdC8INC+0YHQvdC+0LLQvdC+0LUg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1XG4gICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSB0aGlzLmZvcm1hdERhdGVJblN0cmluZyhtZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlcnJvcnMpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3JzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSBlcnJvcnNba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KGZpZWxkRXJyb3JzKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5mb3JFYWNoKChlcnJvck1lc3NhZ2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcoZXJyb3JNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW2luZGV4XSA9IHRoaXMuZm9ybWF0RGF0ZUluU3RyaW5nKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LDRgtC40YDRg9C10YIg0LTQsNGC0Ysg0LIg0YHRgtGA0L7QutC1LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQg0JjRgdGF0L7QtNC90LDRjyDRgdGC0YDQvtC60LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXREYXRlSW5TdHJpbmcodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8g0JjRidC10Lwg0LTQsNGC0Ysg0LIg0YTQvtGA0LzQsNGC0LUgeXl5eS1NTS1kZCBISDptbTpzcy5cbiAgICAgICAgY29uc3QgZGF0ZVJlZ2V4ID0gLyhcXGR7NH0tXFxkezJ9LVxcZHsyfSBcXGR7Mn06XFxkezJ9OlxcZHsyfSkvZztcblxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKGRhdGVSZWdleCwgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBwYXJzZShtYXRjaCwgdGhpcy5kYXRlRm9ybWF0cy5hcGksIG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKHBhcnNlZERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQocGFyc2VkRGF0ZSwgdGhpcy5kYXRlRm9ybWF0cy51aURhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vINCV0YHQu9C4INC90LUg0YPQtNCw0LvQvtGB0Ywg0YDQsNGB0L/QsNGA0YHQuNGC0Ywg0LTQsNGC0YMsINC90LjRh9C10LPQviDQvdC1INC00LXQu9Cw0LXQvC5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -12,10 +12,10 @@ import { tuiCleanObject } from '@taiga-ui/addon-doc/utils';
12
12
  import { __decorate } from 'tslib';
13
13
  import * as i2 from '@angular/router';
14
14
  import { ActivatedRoute, Router, NavigationEnd } from '@angular/router';
15
- import { isString, isMatch } from 'lodash-es';
15
+ import { isString, isMatch, isArray } from 'lodash-es';
16
16
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
17
17
  import { objectToSnake, objectToCamel, toSnake } from 'ts-case-convert';
18
- import { format, parse } from 'date-fns';
18
+ import { parse, isValid, format } from 'date-fns';
19
19
  import * as i1$2 from '@angular/platform-browser';
20
20
  import { Meta, Title } from '@angular/platform-browser';
21
21
 
@@ -5231,6 +5231,80 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
5231
5231
  type: Injectable
5232
5232
  }] });
5233
5233
 
5234
+ /**
5235
+ * Перехватчик для форматирования дат в ошибках запросов к API.
5236
+ */
5237
+ class ScDateFormatInterceptor {
5238
+ constructor() {
5239
+ /**
5240
+ * Формат дат.
5241
+ */
5242
+ this.dateFormats = inject(SC_DATE_FORMAT);
5243
+ }
5244
+ /** @inheritDoc */
5245
+ intercept(request, next) {
5246
+ return next.handle(request).pipe(catchError((error) => {
5247
+ const errorData = error.error;
5248
+ this.formatDatesInErrors(errorData);
5249
+ return throwError(() => error);
5250
+ }));
5251
+ }
5252
+ /**
5253
+ * Форматирует даты в ошибках запросов к API.
5254
+ *
5255
+ * @param error Объект с ошибками API.
5256
+ */
5257
+ formatDatesInErrors(error) {
5258
+ const { errors, message } = error;
5259
+ // Форматируем основное сообщение об ошибке
5260
+ if (message) {
5261
+ // eslint-disable-next-line no-param-reassign
5262
+ error.message = this.formatDateInString(message);
5263
+ }
5264
+ // eslint-disable-next-line no-restricted-syntax
5265
+ for (const key in errors) {
5266
+ if (Object.prototype.hasOwnProperty.call(errors, key)) {
5267
+ // eslint-disable-next-line security/detect-object-injection
5268
+ const fieldErrors = errors[key];
5269
+ if (isArray(fieldErrors)) {
5270
+ fieldErrors.forEach((errorMessage, index) => {
5271
+ if (isString(errorMessage)) {
5272
+ // eslint-disable-next-line security/detect-object-injection
5273
+ fieldErrors[index] = this.formatDateInString(errorMessage);
5274
+ }
5275
+ });
5276
+ }
5277
+ }
5278
+ }
5279
+ }
5280
+ /**
5281
+ * Форматирует даты в строке.
5282
+ *
5283
+ * @param text Исходная строка.
5284
+ */
5285
+ formatDateInString(text) {
5286
+ // Ищем даты в формате yyyy-MM-dd HH:mm:ss.
5287
+ const dateRegex = /(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/g;
5288
+ return text.replaceAll(dateRegex, (match) => {
5289
+ try {
5290
+ const parsedDate = parse(match, this.dateFormats.api, new Date());
5291
+ if (isValid(parsedDate)) {
5292
+ return format(parsedDate, this.dateFormats.uiDate);
5293
+ }
5294
+ }
5295
+ catch {
5296
+ // Если не удалось распарсить дату, ничего не делаем.
5297
+ }
5298
+ return match;
5299
+ });
5300
+ }
5301
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScDateFormatInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5302
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScDateFormatInterceptor }); }
5303
+ }
5304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScDateFormatInterceptor, decorators: [{
5305
+ type: Injectable
5306
+ }] });
5307
+
5234
5308
  /**
5235
5309
  * Перечисление организационно-правовых форм.
5236
5310
  */
@@ -7239,5 +7313,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
7239
7313
  * Generated bundle index. Do not edit.
7240
7314
  */
7241
7315
 
7242
- export { EMPTY_CART, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, RESPONSE, 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_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_PATH_IMAGE_NOT_FOUND, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_UPDATE_INTERVAL, SC_URLS, 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, ScCartItem, ScCartService, ScCatalogFormat, ScCatalogService, ScCategory, ScClientType, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDeliveryAddressService, ScDeliveryCost, ScDeliveryType, ScDocumentInfoNode, ScDocumentInfoTypesEnum, ScErrorsInterceptor, ScFavoriteService, ScFeedbackForms, ScFeedbackService, ScFilesService, ScFrequentlyAskedQuestionsService, ScGuestInterceptor, ScISalesDirectionCart, ScISuggestionType, ScIconTypesEnum, ScIdOrSlugGuard, ScIdOrSlugPipe, ScImage, ScImageHelper, ScJsonLdComponent, ScJsonLdModule, ScLocationsService, ScMediaImageTransformerPipe, ScMimeTypes, ScNews, ScNewsService, ScNotificationActionTypes, ScNotificationLevelNames, ScNotificationsService, ScOpfList, ScOptionsInterceptor, ScOrder, ScOrderShort, ScOrderStateStatus, ScOrdersService, ScPaginationService, ScPaymentStatus, ScPaymentType, ScPhoneService, ScProduct, ScProductTileType, ScQuestionnaireService, ScQuestionnaireStatusEnum, ScReclamationService, ScReclamationStatus, ScRecommendationService, ScReferenceName, ScReferencesService, ScRequisitesService, ScSearchService, ScSeoResource, ScSeoService, ScSocialType, ScSuggestionService, ScSum, ScTokenService, ScUIService, ScUTMService, ScUnitsHelper, ScUploadedFile, ScUser, ScUserMetadata, ScUserMetrikaGoalsEnum, ScUserMetrikaService, ScUserService, ScUserType, ScVCardService, ScVacanciesList, ScVacanciesService, ScVacancy, ScVerificationService, ScVirtualCategory, ScWarehouseService, TERMINAL_PROVIDERS, USER_AGENT_TERMINAL, filterChangedByKey, runningOnTerminalFactory, searchTermFactory };
7316
+ export { EMPTY_CART, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, RESPONSE, 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_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_PATH_IMAGE_NOT_FOUND, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_UPDATE_INTERVAL, SC_URLS, 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, ScCartItem, ScCartService, ScCatalogFormat, ScCatalogService, ScCategory, ScClientType, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDateFormatInterceptor, ScDeliveryAddressService, ScDeliveryCost, ScDeliveryType, ScDocumentInfoNode, ScDocumentInfoTypesEnum, ScErrorsInterceptor, ScFavoriteService, ScFeedbackForms, ScFeedbackService, ScFilesService, ScFrequentlyAskedQuestionsService, ScGuestInterceptor, ScISalesDirectionCart, ScISuggestionType, ScIconTypesEnum, ScIdOrSlugGuard, ScIdOrSlugPipe, ScImage, ScImageHelper, ScJsonLdComponent, ScJsonLdModule, ScLocationsService, ScMediaImageTransformerPipe, ScMimeTypes, ScNews, ScNewsService, ScNotificationActionTypes, ScNotificationLevelNames, ScNotificationsService, ScOpfList, ScOptionsInterceptor, ScOrder, ScOrderShort, ScOrderStateStatus, ScOrdersService, ScPaginationService, ScPaymentStatus, ScPaymentType, ScPhoneService, ScProduct, ScProductTileType, ScQuestionnaireService, ScQuestionnaireStatusEnum, ScReclamationService, ScReclamationStatus, ScRecommendationService, ScReferenceName, ScReferencesService, ScRequisitesService, ScSearchService, ScSeoResource, ScSeoService, ScSocialType, ScSuggestionService, ScSum, ScTokenService, ScUIService, ScUTMService, ScUnitsHelper, ScUploadedFile, ScUser, ScUserMetadata, ScUserMetrikaGoalsEnum, ScUserMetrikaService, ScUserService, ScUserType, ScVCardService, ScVacanciesList, ScVacanciesService, ScVacancy, ScVerificationService, ScVirtualCategory, ScWarehouseService, TERMINAL_PROVIDERS, USER_AGENT_TERMINAL, filterChangedByKey, runningOnTerminalFactory, searchTermFactory };
7243
7317
  //# sourceMappingURL=snabcentr-client-core.mjs.map