@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.
- package/auth/interfaces/index.d.ts +1 -0
- package/auth/interfaces/sc-i-api-error-response.d.ts +13 -0
- package/esm2022/auth/interfaces/index.mjs +2 -1
- package/esm2022/auth/interfaces/sc-i-api-error-response.mjs +2 -0
- package/esm2022/httpInterceptors/index.mjs +2 -1
- package/esm2022/httpInterceptors/sc-date-format.interceptor.mjs +80 -0
- package/fesm2022/snabcentr-client-core.mjs +77 -3
- package/fesm2022/snabcentr-client-core.mjs.map +1 -1
- package/httpInterceptors/index.d.ts +1 -0
- package/httpInterceptors/sc-date-format.interceptor.d.ts +28 -0
- package/package.json +1 -1
- package/release_notes.tmp +2 -2
|
@@ -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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|