tool-utilities-ang15 0.0.0-stage → 0.0.3
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/README.md +23 -2
- package/esm2020/lib/await-try-catch.service.mjs +122 -0
- package/esm2020/public-api.mjs +5 -0
- package/esm2020/tool-utilities-ang15.mjs +5 -0
- package/fesm2015/tool-utilities-ang15.mjs +138 -0
- package/fesm2015/tool-utilities-ang15.mjs.map +1 -0
- package/fesm2020/tool-utilities-ang15.mjs +133 -0
- package/fesm2020/tool-utilities-ang15.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/await-try-catch.service.d.ts +79 -0
- package/package.json +28 -3
- package/public-api.d.ts +1 -0
package/README.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ToolUtilities
|
|
2
2
|
|
|
3
|
-
This
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project tool-utilities` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project tool-utilities`.
|
|
8
|
+
> Note: Don't forget to add `--project tool-utilities` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build tool-utilities` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build tool-utilities`, go to the dist folder `cd dist/tool-utilities` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test tool-utilities` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { green, red } from 'tool-log';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Сервис для безопасного выполнения Promise: перехватывает ошибки,
|
|
6
|
+
* логирует результат и возвращает `false` вместо проброса исключения.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // Обычный промис
|
|
10
|
+
* const user = await this.awaitTryCatch.send(
|
|
11
|
+
* this.fetchUser(1),
|
|
12
|
+
* 'UserComponent.load',
|
|
13
|
+
* 'Не удалось загрузить пользователя'
|
|
14
|
+
* );
|
|
15
|
+
* if (user !== false) { this.user = user; }
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // fetch — Response разберётся автоматически (вернёт JSON или false)
|
|
19
|
+
* const todos = await this.awaitTryCatch.send(
|
|
20
|
+
* fetch('https://jsonplaceholder.typicode.com/todos/1'),
|
|
21
|
+
* 'UserComponent.todos'
|
|
22
|
+
* );
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // Reject: ошибка уйдёт в лог, вернётся false
|
|
26
|
+
* const ok = await this.awaitTryCatch.send(
|
|
27
|
+
* Promise.reject(new Error('boom')),
|
|
28
|
+
* 'UserComponent.reject'
|
|
29
|
+
* );
|
|
30
|
+
*/
|
|
31
|
+
export class AwaitTryCatchService {
|
|
32
|
+
/**
|
|
33
|
+
* Классифицирует ошибку и пишет её в лог с соответствующим префиксом.
|
|
34
|
+
* Нужен, чтобы в консоли было видно тип ошибки (TypeError / ReferenceError / Error / unknown).
|
|
35
|
+
*
|
|
36
|
+
* @param e Перехваченное значение из `catch` (тип заранее неизвестен).
|
|
37
|
+
*/
|
|
38
|
+
_tryCatchErrorInfo(e) {
|
|
39
|
+
if (e instanceof TypeError) {
|
|
40
|
+
red('awaitTryCatch', 'Ошибка типа: ', e.message);
|
|
41
|
+
}
|
|
42
|
+
else if (e instanceof ReferenceError) {
|
|
43
|
+
red('awaitTryCatch', 'Ошибка ссылки: ', e.message);
|
|
44
|
+
}
|
|
45
|
+
else if (e instanceof Error) {
|
|
46
|
+
red('awaitTryCatch', 'Ошибка: ', e.message);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
red('awaitTryCatch', 'Неизвестная ошибка:', { error: e });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Выполняет промис, логирует результат и перехватывает ошибки.
|
|
54
|
+
* Если результатом является `Response` (например, из `fetch`), дополнительно
|
|
55
|
+
* разбирает его через {@link handleResponse}.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* const data = await this.awaitTryCatch.send(
|
|
59
|
+
* fetch('/api/users'),
|
|
60
|
+
* 'UsersService.load'
|
|
61
|
+
* );
|
|
62
|
+
*
|
|
63
|
+
* @param promise Промис для выполнения.
|
|
64
|
+
* @param from Метка источника вызова (для логов).
|
|
65
|
+
* @param errorMessage Текст ошибки для лога при reject.
|
|
66
|
+
* @returns Результат промиса `T`, распарсенные данные `Response` или `false` при ошибке.
|
|
67
|
+
*/
|
|
68
|
+
async send(promise, from = 'Не указано', errorMessage = 'Ошибка при выполнении Promise') {
|
|
69
|
+
try {
|
|
70
|
+
const result = await promise;
|
|
71
|
+
// Обработка Response отдельно - fetch() возвращает не готовые данные, а объект Response
|
|
72
|
+
if (result instanceof Response) {
|
|
73
|
+
return await this.handleResponse(result, from);
|
|
74
|
+
}
|
|
75
|
+
green('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', { result });
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
red('awaitTryCatch', 'Ошибка выполнения send (из ' + from + '/AwaitTryCatchService)', errorMessage);
|
|
80
|
+
this._tryCatchErrorInfo(error);
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Разбирает `Response`: проверяет статус и парсит тело как JSON.
|
|
86
|
+
*
|
|
87
|
+
* @param response Объект `Response` (обычно результат `fetch`).
|
|
88
|
+
* @param from Метка источника вызова (для логов).
|
|
89
|
+
* @returns Распарсенные данные или `false`, если статус не ok либо парсинг упал.
|
|
90
|
+
*/
|
|
91
|
+
async handleResponse(response, from) {
|
|
92
|
+
try {
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
console.error(`HTTP Error: ${response.status} ${response.statusText}`);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const data = await response.json();
|
|
98
|
+
// Чтобы получить данные, нужно вызвать один из методов:
|
|
99
|
+
/*
|
|
100
|
+
const data = await response.json(); // для JSON ответа
|
|
101
|
+
const text = await response.text(); // для текста
|
|
102
|
+
const blob = await response.blob(); // для файлов/изображений
|
|
103
|
+
const formData = await response.formData(); // для form-data
|
|
104
|
+
*/
|
|
105
|
+
green('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', data);
|
|
106
|
+
return data;
|
|
107
|
+
}
|
|
108
|
+
catch (parseError) {
|
|
109
|
+
red('awaitTryCatch', 'Ошибка парсинга ответа: ', { parseError });
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
AwaitTryCatchService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
115
|
+
AwaitTryCatchService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, providedIn: 'root' });
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, decorators: [{
|
|
117
|
+
type: Injectable,
|
|
118
|
+
args: [{
|
|
119
|
+
providedIn: 'root'
|
|
120
|
+
}]
|
|
121
|
+
}] });
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdhaXQtdHJ5LWNhdGNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b29sLXV0aWxpdGllcy1hbmcxNS9zcmMvbGliL2F3YWl0LXRyeS1jYXRjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBa0J0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBRWhDOzs7OztPQUtHO0lBQ0ssa0JBQWtCLENBQUMsQ0FBVTtRQUNwQyxJQUFJLENBQUMsWUFBWSxTQUFTLEVBQUU7WUFDM0IsR0FBRyxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pEO2FBQU0sSUFBSSxDQUFDLFlBQVksY0FBYyxFQUFFO1lBQ3ZDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25EO2FBQU0sSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFO1lBQzlCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ04sR0FBRyxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFEO0lBQ0YsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQ2hCLE9BQW1CLEVBQ25CLE9BQWUsWUFBWSxFQUMzQixlQUF1QiwrQkFBK0I7UUFFdEQsSUFBSTtZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDO1lBRTdCLHdGQUF3RjtZQUN4RixJQUFJLE1BQU0sWUFBWSxRQUFRLEVBQUU7Z0JBQy9CLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQXVCLENBQUM7YUFDckU7WUFFRCxLQUFLLENBQUMsZUFBZSxFQUFFLGdDQUFnQyxHQUFHLElBQUksR0FBRyx3QkFBd0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFdkcsT0FBTyxNQUFNLENBQUM7U0FDZDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2YsR0FBRyxDQUFDLGVBQWUsRUFBRSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsd0JBQXdCLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDcEcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9CLE9BQU8sS0FBSyxDQUFDO1NBQ2I7SUFDRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFrQixFQUFFLElBQVk7UUFDNUQsSUFBSTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO2dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFFdkUsT0FBTyxLQUFLLENBQUM7YUFDYjtZQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLHdEQUF3RDtZQUN4RDs7Ozs7Y0FLRTtZQUVGLEtBQUssQ0FBQyxlQUFlLEVBQUUsZ0NBQWdDLEdBQUcsSUFBSSxHQUFHLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWpHLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFBQyxPQUFPLFVBQVUsRUFBRTtZQUNwQixHQUFHLENBQUMsZUFBZSxFQUFFLDBCQUEwQixFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUVqRSxPQUFPLEtBQUssQ0FBQztTQUNiO0lBQ0YsQ0FBQzs7a0hBM0ZXLG9CQUFvQjtzSEFBcEIsb0JBQW9CLGNBRnBCLE1BQU07NEZBRU4sb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBncmVlbiwgcmVkIH0gZnJvbSAndG9vbC1sb2cnO1xyXG5cclxuLyoqXHJcbiAqINCa0L7QvdGC0YDQsNC60YIg0YHQtdGA0LLQuNGB0LAt0L7QsdGR0YDRgtC60Lgg0LTQu9GPINCx0LXQt9C+0L/QsNGB0L3QvtCz0L4g0LLRi9C/0L7Qu9C90LXQvdC40Y8gUHJvbWlzZS5cclxuICog0JLQvtC30LLRgNCw0YnQsNC10YIg0YDQtdC30YPQu9GM0YLQsNGCINC/0YDQvtC80LjRgdCwINC70LjQsdC+IGBmYWxzZWAg0L/RgNC4INC+0YjQuNCx0LrQtSAo0LHQtdC3INC/0YDQvtCx0YDQvtGB0LAg0LjRgdC60LvRjtGH0LXQvdC40Y8pLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJQXdhaXRUcnlDYXRjaFNlcnZpY2Uge1xyXG5cdC8qKlxyXG5cdCAqINCS0YvQv9C+0LvQvdGP0LXRgiDQv9GA0L7QvNC40YEg0Lgg0L/QtdGA0LXRhdCy0LDRgtGL0LLQsNC10YIg0L7RiNC40LHQutC4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHByb21pc2UgICAgICAg0J/RgNC+0LzQuNGBLCDQutC+0YLQvtGA0YvQuSDQvdGD0LbQvdC+INCy0YvQv9C+0LvQvdC40YLRjC5cclxuXHQgKiBAcGFyYW0gZnJvbSAgICAgICAgICDQnNC10YLQutCwINC40YHRgtC+0YfQvdC40LrQsCDQstGL0LfQvtCy0LAgKNC/0L7Qv9Cw0LTQsNC10YIg0LIg0LvQvtCz0LgpLiDQn9C+INGD0LzQvtC70YfQsNC90LjRjiBgJ9Cd0LUg0YPQutCw0LfQsNC90L4nYC5cclxuXHQgKiBAcGFyYW0gZXJyb3JNZXNzYWdlICDQotC10LrRgdGCINC+0YjQuNCx0LrQuCDQtNC70Y8g0LvQvtCz0LAg0L/RgNC4IHJlamVjdC4g0J/QviDRg9C80L7Qu9GH0LDQvdC40Y4gYCfQntGI0LjQsdC60LAg0L/RgNC4INCy0YvQv9C+0LvQvdC10L3QuNC4IFByb21pc2UnYC5cclxuXHQgKiBAcmV0dXJucyAgICAgICAgICAgICDQoNC10LfRg9C70YzRgtCw0YIg0L/RgNC+0LzQuNGB0LAgYFRgINC70LjQsdC+IGBmYWxzZWAg0L/RgNC4INC+0YjQuNCx0LrQtS5cclxuXHQgKi9cclxuXHRzZW5kPFQgPSBhbnk+KHByb21pc2U6IFByb21pc2U8VD4sIGZyb20/OiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZyk6IFByb21pc2U8VCB8IGZhbHNlPjtcclxufVxyXG5cclxuLyoqXHJcbiAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0LHQtdC30L7Qv9Cw0YHQvdC+0LPQviDQstGL0L/QvtC70L3QtdC90LjRjyBQcm9taXNlOiDQv9C10YDQtdGF0LLQsNGC0YvQstCw0LXRgiDQvtGI0LjQsdC60LgsXHJcbiAqINC70L7Qs9C40YDRg9C10YIg0YDQtdC30YPQu9GM0YLQsNGCINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCIGBmYWxzZWAg0LLQvNC10YHRgtC+INC/0YDQvtCx0YDQvtGB0LAg0LjRgdC60LvRjtGH0LXQvdC40Y8uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vINCe0LHRi9GH0L3Ri9C5INC/0YDQvtC80LjRgVxyXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hd2FpdFRyeUNhdGNoLnNlbmQoXHJcbiAqICAgdGhpcy5mZXRjaFVzZXIoMSksXHJcbiAqICAgJ1VzZXJDb21wb25lbnQubG9hZCcsXHJcbiAqICAgJ9Cd0LUg0YPQtNCw0LvQvtGB0Ywg0LfQsNCz0YDRg9C30LjRgtGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjydcclxuICogKTtcclxuICogaWYgKHVzZXIgIT09IGZhbHNlKSB7IHRoaXMudXNlciA9IHVzZXI7IH1cclxuICpcclxuICogQGV4YW1wbGVcclxuICogLy8gZmV0Y2gg4oCUIFJlc3BvbnNlINGA0LDQt9Cx0LXRgNGR0YLRgdGPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4ICjQstC10YDQvdGR0YIgSlNPTiDQuNC70LggZmFsc2UpXHJcbiAqIGNvbnN0IHRvZG9zID0gYXdhaXQgdGhpcy5hd2FpdFRyeUNhdGNoLnNlbmQoXHJcbiAqICAgZmV0Y2goJ2h0dHBzOi8vanNvbnBsYWNlaG9sZGVyLnR5cGljb2RlLmNvbS90b2Rvcy8xJyksXHJcbiAqICAgJ1VzZXJDb21wb25lbnQudG9kb3MnXHJcbiAqICk7XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vIFJlamVjdDog0L7RiNC40LHQutCwINGD0LnQtNGR0YIg0LIg0LvQvtCzLCDQstC10YDQvdGR0YLRgdGPIGZhbHNlXHJcbiAqIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5hd2FpdFRyeUNhdGNoLnNlbmQoXHJcbiAqICAgUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdib29tJykpLFxyXG4gKiAgICdVc2VyQ29tcG9uZW50LnJlamVjdCdcclxuICogKTtcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEF3YWl0VHJ5Q2F0Y2hTZXJ2aWNlIGltcGxlbWVudHMgSUF3YWl0VHJ5Q2F0Y2hTZXJ2aWNlIHtcclxuXHJcblx0LyoqXHJcblx0ICog0JrQu9Cw0YHRgdC40YTQuNGG0LjRgNGD0LXRgiDQvtGI0LjQsdC60YMg0Lgg0L/QuNGI0LXRgiDQtdGRINCyINC70L7QsyDRgSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidC40Lwg0L/RgNC10YTQuNC60YHQvtC8LlxyXG5cdCAqINCd0YPQttC10L0sINGH0YLQvtCx0Ysg0LIg0LrQvtC90YHQvtC70Lgg0LHRi9C70L4g0LLQuNC00L3QviDRgtC40L8g0L7RiNC40LHQutC4IChUeXBlRXJyb3IgLyBSZWZlcmVuY2VFcnJvciAvIEVycm9yIC8gdW5rbm93bikuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZSAg0J/QtdGA0LXRhdCy0LDRh9C10L3QvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQuNC3IGBjYXRjaGAgKNGC0LjQvyDQt9Cw0YDQsNC90LXQtSDQvdC10LjQt9Cy0LXRgdGC0LXQvSkuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfdHJ5Q2F0Y2hFcnJvckluZm8oZTogdW5rbm93bik6IHZvaWQge1xyXG5cdFx0aWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcclxuXHRcdFx0cmVkKCdhd2FpdFRyeUNhdGNoJywgJ9Ce0YjQuNCx0LrQsCDRgtC40L/QsDogJywgZS5tZXNzYWdlKTtcclxuXHRcdH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKSB7XHJcblx0XHRcdHJlZCgnYXdhaXRUcnlDYXRjaCcsICfQntGI0LjQsdC60LAg0YHRgdGL0LvQutC4OiAnLCBlLm1lc3NhZ2UpO1xyXG5cdFx0fSBlbHNlIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuXHRcdFx0cmVkKCdhd2FpdFRyeUNhdGNoJywgJ9Ce0YjQuNCx0LrQsDogJywgZS5tZXNzYWdlKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJlZCgnYXdhaXRUcnlDYXRjaCcsICfQndC10LjQt9Cy0LXRgdGC0L3QsNGPINC+0YjQuNCx0LrQsDonLCB7IGVycm9yOiBlIH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog0JLRi9C/0L7Qu9C90Y/QtdGCINC/0YDQvtC80LjRgSwg0LvQvtCz0LjRgNGD0LXRgiDRgNC10LfRg9C70YzRgtCw0YIg0Lgg0L/QtdGA0LXRhdCy0LDRgtGL0LLQsNC10YIg0L7RiNC40LHQutC4LlxyXG5cdCAqINCV0YHQu9C4INGA0LXQt9GD0LvRjNGC0LDRgtC+0Lwg0Y/QstC70Y/QtdGC0YHRjyBgUmVzcG9uc2VgICjQvdCw0L/RgNC40LzQtdGALCDQuNC3IGBmZXRjaGApLCDQtNC+0L/QvtC70L3QuNGC0LXQu9GM0L3QvlxyXG5cdCAqINGA0LDQt9Cx0LjRgNCw0LXRgiDQtdCz0L4g0YfQtdGA0LXQtyB7QGxpbmsgaGFuZGxlUmVzcG9uc2V9LlxyXG5cdCAqXHJcblx0ICogQGV4YW1wbGVcclxuXHQgKiBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5hd2FpdFRyeUNhdGNoLnNlbmQoXHJcblx0ICogICBmZXRjaCgnL2FwaS91c2VycycpLFxyXG5cdCAqICAgJ1VzZXJzU2VydmljZS5sb2FkJ1xyXG5cdCAqICk7XHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcHJvbWlzZSAgICAgICDQn9GA0L7QvNC40YEg0LTQu9GPINCy0YvQv9C+0LvQvdC10L3QuNGPLlxyXG5cdCAqIEBwYXJhbSBmcm9tICAgICAgICAgINCc0LXRgtC60LAg0LjRgdGC0L7Rh9C90LjQutCwINCy0YvQt9C+0LLQsCAo0LTQu9GPINC70L7Qs9C+0LIpLlxyXG5cdCAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgINCi0LXQutGB0YIg0L7RiNC40LHQutC4INC00LvRjyDQu9C+0LPQsCDQv9GA0LggcmVqZWN0LlxyXG5cdCAqIEByZXR1cm5zICAgICAgICAgICAgINCg0LXQt9GD0LvRjNGC0LDRgiDQv9GA0L7QvNC40YHQsCBgVGAsINGA0LDRgdC/0LDRgNGB0LXQvdC90YvQtSDQtNCw0L3QvdGL0LUgYFJlc3BvbnNlYCDQuNC70LggYGZhbHNlYCDQv9GA0Lgg0L7RiNC40LHQutC1LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc3luYyBzZW5kPFQgPSBhbnk+KFxyXG5cdFx0cHJvbWlzZTogUHJvbWlzZTxUPixcclxuXHRcdGZyb206IHN0cmluZyA9ICfQndC1INGD0LrQsNC30LDQvdC+JyxcclxuXHRcdGVycm9yTWVzc2FnZTogc3RyaW5nID0gJ9Ce0YjQuNCx0LrQsCDQv9GA0Lgg0LLRi9C/0L7Qu9C90LXQvdC40LggUHJvbWlzZSdcclxuXHQpOiBQcm9taXNlPFQgfCBmYWxzZT4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbWlzZTtcclxuXHJcblx0XHRcdC8vINCe0LHRgNCw0LHQvtGC0LrQsCBSZXNwb25zZSDQvtGC0LTQtdC70YzQvdC+IC0gZmV0Y2goKSDQstC+0LfQstGA0LDRidCw0LXRgiDQvdC1INCz0L7RgtC+0LLRi9C1INC00LDQvdC90YvQtSwg0LAg0L7QsdGK0LXQutGCIFJlc3BvbnNlXHJcblx0XHRcdGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xyXG5cdFx0XHRcdHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3VsdCwgZnJvbSkgYXMgUHJvbWlzZTxUIHwgZmFsc2U+O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRncmVlbignYXdhaXRUcnlDYXRjaCcsICfQoNC10LfRg9C70YzRgtCw0YIg0LLRi9C/0L7Qu9C90LXQvdC40Y8gc2VuZCAo0LjQtyAnICsgZnJvbSArICcvQXdhaXRUcnlDYXRjaFNlcnZpY2UpJywgeyByZXN1bHQgfSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0cmVkKCdhd2FpdFRyeUNhdGNoJywgJ9Ce0YjQuNCx0LrQsCDQstGL0L/QvtC70L3QtdC90LjRjyBzZW5kICjQuNC3ICcgKyBmcm9tICsgJy9Bd2FpdFRyeUNhdGNoU2VydmljZSknLCBlcnJvck1lc3NhZ2UpO1xyXG5cdFx0XHR0aGlzLl90cnlDYXRjaEVycm9ySW5mbyhlcnJvcik7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDQoNCw0LfQsdC40YDQsNC10YIgYFJlc3BvbnNlYDog0L/RgNC+0LLQtdGA0Y/QtdGCINGB0YLQsNGC0YPRgSDQuCDQv9Cw0YDRgdC40YIg0YLQtdC70L4g0LrQsNC6IEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgINCe0LHRitC10LrRgiBgUmVzcG9uc2VgICjQvtCx0YvRh9C90L4g0YDQtdC30YPQu9GM0YLQsNGCIGBmZXRjaGApLlxyXG5cdCAqIEBwYXJhbSBmcm9tICAgICAg0JzQtdGC0LrQsCDQuNGB0YLQvtGH0L3QuNC60LAg0LLRi9C30L7QstCwICjQtNC70Y8g0LvQvtCz0L7QsikuXHJcblx0ICogQHJldHVybnMgICAgICAgICDQoNCw0YHQv9Cw0YDRgdC10L3QvdGL0LUg0LTQsNC90L3Ri9C1INC40LvQuCBgZmFsc2VgLCDQtdGB0LvQuCDRgdGC0LDRgtGD0YEg0L3QtSBvayDQu9C40LHQviDQv9Cw0YDRgdC40L3QsyDRg9C/0LDQuy5cclxuXHQgKi9cclxuXHRwcml2YXRlIGFzeW5jIGhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSwgZnJvbTogc3RyaW5nICk6IFByb21pc2U8YW55IHwgZmFsc2U+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGlmICghcmVzcG9uc2Uub2spIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBIVFRQIEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHRcdFx0Ly8g0KfRgtC+0LHRiyDQv9C+0LvRg9GH0LjRgtGMINC00LDQvdC90YvQtSwg0L3Rg9C20L3QviDQstGL0LfQstCw0YLRjCDQvtC00LjQvSDQuNC3INC80LXRgtC+0LTQvtCyOlxyXG5cdFx0XHQvKlxyXG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOyAgICAvLyDQtNC70Y8gSlNPTiDQvtGC0LLQtdGC0LBcclxuXHRcdFx0Y29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsgICAgLy8g0LTQu9GPINGC0LXQutGB0YLQsFxyXG5cdFx0XHRjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpOyAgICAvLyDQtNC70Y8g0YTQsNC50LvQvtCyL9C40LfQvtCx0YDQsNC20LXQvdC40LlcclxuXHRcdFx0Y29uc3QgZm9ybURhdGEgPSBhd2FpdCByZXNwb25zZS5mb3JtRGF0YSgpOyAvLyDQtNC70Y8gZm9ybS1kYXRhXHJcblx0XHRcdCovXHJcblxyXG5cdFx0XHRncmVlbignYXdhaXRUcnlDYXRjaCcsICfQoNC10LfRg9C70YzRgtCw0YIg0LLRi9C/0L7Qu9C90LXQvdC40Y8gc2VuZCAo0LjQtyAnICsgZnJvbSArICcvQXdhaXRUcnlDYXRjaFNlcnZpY2UpJywgZGF0YSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZGF0YTtcclxuXHRcdH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcclxuXHRcdFx0cmVkKCdhd2FpdFRyeUNhdGNoJywgJ9Ce0YjQuNCx0LrQsCDQv9Cw0YDRgdC40L3Qs9CwINC+0YLQstC10YLQsDogJywgeyBwYXJzZUVycm9yIH0pO1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of tool-utilities
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/await-try-catch.service';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3Rvb2wtdXRpbGl0aWVzLWFuZzE1L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgdG9vbC11dGlsaXRpZXNcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hd2FpdC10cnktY2F0Y2guc2VydmljZSc7XG5cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC11dGlsaXRpZXMtYW5nMTUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy90b29sLXV0aWxpdGllcy1hbmcxNS9zcmMvdG9vbC11dGlsaXRpZXMtYW5nMTUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { __awaiter } from 'tslib';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import { red, green } from 'tool-log';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Сервис для безопасного выполнения Promise: перехватывает ошибки,
|
|
8
|
+
* логирует результат и возвращает `false` вместо проброса исключения.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Обычный промис
|
|
12
|
+
* const user = await this.awaitTryCatch.send(
|
|
13
|
+
* this.fetchUser(1),
|
|
14
|
+
* 'UserComponent.load',
|
|
15
|
+
* 'Не удалось загрузить пользователя'
|
|
16
|
+
* );
|
|
17
|
+
* if (user !== false) { this.user = user; }
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // fetch — Response разберётся автоматически (вернёт JSON или false)
|
|
21
|
+
* const todos = await this.awaitTryCatch.send(
|
|
22
|
+
* fetch('https://jsonplaceholder.typicode.com/todos/1'),
|
|
23
|
+
* 'UserComponent.todos'
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // Reject: ошибка уйдёт в лог, вернётся false
|
|
28
|
+
* const ok = await this.awaitTryCatch.send(
|
|
29
|
+
* Promise.reject(new Error('boom')),
|
|
30
|
+
* 'UserComponent.reject'
|
|
31
|
+
* );
|
|
32
|
+
*/
|
|
33
|
+
class AwaitTryCatchService {
|
|
34
|
+
/**
|
|
35
|
+
* Классифицирует ошибку и пишет её в лог с соответствующим префиксом.
|
|
36
|
+
* Нужен, чтобы в консоли было видно тип ошибки (TypeError / ReferenceError / Error / unknown).
|
|
37
|
+
*
|
|
38
|
+
* @param e Перехваченное значение из `catch` (тип заранее неизвестен).
|
|
39
|
+
*/
|
|
40
|
+
_tryCatchErrorInfo(e) {
|
|
41
|
+
if (e instanceof TypeError) {
|
|
42
|
+
red('awaitTryCatch', 'Ошибка типа: ', e.message);
|
|
43
|
+
}
|
|
44
|
+
else if (e instanceof ReferenceError) {
|
|
45
|
+
red('awaitTryCatch', 'Ошибка ссылки: ', e.message);
|
|
46
|
+
}
|
|
47
|
+
else if (e instanceof Error) {
|
|
48
|
+
red('awaitTryCatch', 'Ошибка: ', e.message);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
red('awaitTryCatch', 'Неизвестная ошибка:', { error: e });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Выполняет промис, логирует результат и перехватывает ошибки.
|
|
56
|
+
* Если результатом является `Response` (например, из `fetch`), дополнительно
|
|
57
|
+
* разбирает его через {@link handleResponse}.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* const data = await this.awaitTryCatch.send(
|
|
61
|
+
* fetch('/api/users'),
|
|
62
|
+
* 'UsersService.load'
|
|
63
|
+
* );
|
|
64
|
+
*
|
|
65
|
+
* @param promise Промис для выполнения.
|
|
66
|
+
* @param from Метка источника вызова (для логов).
|
|
67
|
+
* @param errorMessage Текст ошибки для лога при reject.
|
|
68
|
+
* @returns Результат промиса `T`, распарсенные данные `Response` или `false` при ошибке.
|
|
69
|
+
*/
|
|
70
|
+
send(promise, from = 'Не указано', errorMessage = 'Ошибка при выполнении Promise') {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
try {
|
|
73
|
+
const result = yield promise;
|
|
74
|
+
// Обработка Response отдельно - fetch() возвращает не готовые данные, а объект Response
|
|
75
|
+
if (result instanceof Response) {
|
|
76
|
+
return yield this.handleResponse(result, from);
|
|
77
|
+
}
|
|
78
|
+
green('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', { result });
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
red('awaitTryCatch', 'Ошибка выполнения send (из ' + from + '/AwaitTryCatchService)', errorMessage);
|
|
83
|
+
this._tryCatchErrorInfo(error);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Разбирает `Response`: проверяет статус и парсит тело как JSON.
|
|
90
|
+
*
|
|
91
|
+
* @param response Объект `Response` (обычно результат `fetch`).
|
|
92
|
+
* @param from Метка источника вызова (для логов).
|
|
93
|
+
* @returns Распарсенные данные или `false`, если статус не ok либо парсинг упал.
|
|
94
|
+
*/
|
|
95
|
+
handleResponse(response, from) {
|
|
96
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
try {
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
console.error(`HTTP Error: ${response.status} ${response.statusText}`);
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
const data = yield response.json();
|
|
103
|
+
// Чтобы получить данные, нужно вызвать один из методов:
|
|
104
|
+
/*
|
|
105
|
+
const data = await response.json(); // для JSON ответа
|
|
106
|
+
const text = await response.text(); // для текста
|
|
107
|
+
const blob = await response.blob(); // для файлов/изображений
|
|
108
|
+
const formData = await response.formData(); // для form-data
|
|
109
|
+
*/
|
|
110
|
+
green('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', data);
|
|
111
|
+
return data;
|
|
112
|
+
}
|
|
113
|
+
catch (parseError) {
|
|
114
|
+
red('awaitTryCatch', 'Ошибка парсинга ответа: ', { parseError });
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
AwaitTryCatchService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
121
|
+
AwaitTryCatchService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, providedIn: 'root' });
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, decorators: [{
|
|
123
|
+
type: Injectable,
|
|
124
|
+
args: [{
|
|
125
|
+
providedIn: 'root'
|
|
126
|
+
}]
|
|
127
|
+
}] });
|
|
128
|
+
|
|
129
|
+
/*
|
|
130
|
+
* Public API Surface of tool-utilities
|
|
131
|
+
*/
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Generated bundle index. Do not edit.
|
|
135
|
+
*/
|
|
136
|
+
|
|
137
|
+
export { AwaitTryCatchService };
|
|
138
|
+
//# sourceMappingURL=tool-utilities-ang15.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-utilities-ang15.mjs","sources":["../../../projects/tool-utilities-ang15/src/lib/await-try-catch.service.ts","../../../projects/tool-utilities-ang15/src/public-api.ts","../../../projects/tool-utilities-ang15/src/tool-utilities-ang15.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { green, red } from 'tool-log';\r\n\r\n/**\r\n * Контракт сервиса-обёртки для безопасного выполнения Promise.\r\n * Возвращает результат промиса либо `false` при ошибке (без проброса исключения).\r\n */\r\nexport interface IAwaitTryCatchService {\r\n\t/**\r\n\t * Выполняет промис и перехватывает ошибки.\r\n\t *\r\n\t * @param promise Промис, который нужно выполнить.\r\n\t * @param from Метка источника вызова (попадает в логи). По умолчанию `'Не указано'`.\r\n\t * @param errorMessage Текст ошибки для лога при reject. По умолчанию `'Ошибка при выполнении Promise'`.\r\n\t * @returns Результат промиса `T` либо `false` при ошибке.\r\n\t */\r\n\tsend<T = any>(promise: Promise<T>, from?: string, errorMessage?: string): Promise<T | false>;\r\n}\r\n\r\n/**\r\n * Сервис для безопасного выполнения Promise: перехватывает ошибки,\r\n * логирует результат и возвращает `false` вместо проброса исключения.\r\n *\r\n * @example\r\n * // Обычный промис\r\n * const user = await this.awaitTryCatch.send(\r\n * this.fetchUser(1),\r\n * 'UserComponent.load',\r\n * 'Не удалось загрузить пользователя'\r\n * );\r\n * if (user !== false) { this.user = user; }\r\n *\r\n * @example\r\n * // fetch — Response разберётся автоматически (вернёт JSON или false)\r\n * const todos = await this.awaitTryCatch.send(\r\n * fetch('https://jsonplaceholder.typicode.com/todos/1'),\r\n * 'UserComponent.todos'\r\n * );\r\n *\r\n * @example\r\n * // Reject: ошибка уйдёт в лог, вернётся false\r\n * const ok = await this.awaitTryCatch.send(\r\n * Promise.reject(new Error('boom')),\r\n * 'UserComponent.reject'\r\n * );\r\n */\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class AwaitTryCatchService implements IAwaitTryCatchService {\r\n\r\n\t/**\r\n\t * Классифицирует ошибку и пишет её в лог с соответствующим префиксом.\r\n\t * Нужен, чтобы в консоли было видно тип ошибки (TypeError / ReferenceError / Error / unknown).\r\n\t *\r\n\t * @param e Перехваченное значение из `catch` (тип заранее неизвестен).\r\n\t */\r\n\tprivate _tryCatchErrorInfo(e: unknown): void {\r\n\t\tif (e instanceof TypeError) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка типа: ', e.message);\r\n\t\t} else if (e instanceof ReferenceError) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка ссылки: ', e.message);\r\n\t\t} else if (e instanceof Error) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка: ', e.message);\r\n\t\t} else {\r\n\t\t\tred('awaitTryCatch', 'Неизвестная ошибка:', { error: e });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Выполняет промис, логирует результат и перехватывает ошибки.\r\n\t * Если результатом является `Response` (например, из `fetch`), дополнительно\r\n\t * разбирает его через {@link handleResponse}.\r\n\t *\r\n\t * @example\r\n\t * const data = await this.awaitTryCatch.send(\r\n\t * fetch('/api/users'),\r\n\t * 'UsersService.load'\r\n\t * );\r\n\t *\r\n\t * @param promise Промис для выполнения.\r\n\t * @param from Метка источника вызова (для логов).\r\n\t * @param errorMessage Текст ошибки для лога при reject.\r\n\t * @returns Результат промиса `T`, распарсенные данные `Response` или `false` при ошибке.\r\n\t */\r\n\tpublic async send<T = any>(\r\n\t\tpromise: Promise<T>,\r\n\t\tfrom: string = 'Не указано',\r\n\t\terrorMessage: string = 'Ошибка при выполнении Promise'\r\n\t): Promise<T | false> {\r\n\t\ttry {\r\n\t\t\tconst result = await promise;\r\n\r\n\t\t\t// Обработка Response отдельно - fetch() возвращает не готовые данные, а объект Response\r\n\t\t\tif (result instanceof Response) {\r\n\t\t\t\treturn await this.handleResponse(result, from) as Promise<T | false>;\r\n\t\t\t}\r\n\r\n\t\t\tgreen('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', { result });\r\n\r\n\t\t\treturn result;\r\n\t\t} catch (error) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка выполнения send (из ' + from + '/AwaitTryCatchService)', errorMessage);\r\n\t\t\tthis._tryCatchErrorInfo(error);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Разбирает `Response`: проверяет статус и парсит тело как JSON.\r\n\t *\r\n\t * @param response Объект `Response` (обычно результат `fetch`).\r\n\t * @param from Метка источника вызова (для логов).\r\n\t * @returns Распарсенные данные или `false`, если статус не ok либо парсинг упал.\r\n\t */\r\n\tprivate async handleResponse(response: Response, from: string ): Promise<any | false> {\r\n\t\ttry {\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tconsole.error(`HTTP Error: ${response.status} ${response.statusText}`);\r\n\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tconst data = await response.json();\r\n\t\t\t// Чтобы получить данные, нужно вызвать один из методов:\r\n\t\t\t/*\r\n\t\t\tconst data = await response.json(); // для JSON ответа\r\n\t\t\tconst text = await response.text(); // для текста\r\n\t\t\tconst blob = await response.blob(); // для файлов/изображений\r\n\t\t\tconst formData = await response.formData(); // для form-data\r\n\t\t\t*/\r\n\r\n\t\t\tgreen('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', data);\r\n\r\n\t\t\treturn data;\r\n\t\t} catch (parseError) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка парсинга ответа: ', { parseError });\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n}\r\n","/*\n * Public API Surface of tool-utilities\n */\n\nexport * from './lib/await-try-catch.service';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;MAIU,oBAAoB,CAAA;AAEhC;;;;;AAKG;AACK,IAAA,kBAAkB,CAAC,CAAU,EAAA;QACpC,IAAI,CAAC,YAAY,SAAS,EAAE;YAC3B,GAAG,CAAC,eAAe,EAAE,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AACjD,SAAA;aAAM,IAAI,CAAC,YAAY,cAAc,EAAE;YACvC,GAAG,CAAC,eAAe,EAAE,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AACnD,SAAA;aAAM,IAAI,CAAC,YAAY,KAAK,EAAE;YAC9B,GAAG,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAC5C,SAAA;AAAM,aAAA;YACN,GAAG,CAAC,eAAe,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1D,SAAA;KACD;AAED;;;;;;;;;;;;;;;AAeG;IACU,IAAI,CAChB,OAAmB,EACnB,IAAe,GAAA,YAAY,EAC3B,YAAA,GAAuB,+BAA+B,EAAA;;YAEtD,IAAI;AACH,gBAAA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;;gBAG7B,IAAI,MAAM,YAAY,QAAQ,EAAE;oBAC/B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAuB,CAAC;AACrE,iBAAA;AAED,gBAAA,KAAK,CAAC,eAAe,EAAE,gCAAgC,GAAG,IAAI,GAAG,wBAAwB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAEvG,gBAAA,OAAO,MAAM,CAAC;AACd,aAAA;AAAC,YAAA,OAAO,KAAK,EAAE;gBACf,GAAG,CAAC,eAAe,EAAE,6BAA6B,GAAG,IAAI,GAAG,wBAAwB,EAAE,YAAY,CAAC,CAAC;AACpG,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAE/B,gBAAA,OAAO,KAAK,CAAC;AACb,aAAA;SACD,CAAA,CAAA;AAAA,KAAA;AAED;;;;;;AAMG;IACW,cAAc,CAAC,QAAkB,EAAE,IAAY,EAAA;;YAC5D,IAAI;AACH,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AACjB,oBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,YAAA,EAAe,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC,CAAC;AAEvE,oBAAA,OAAO,KAAK,CAAC;AACb,iBAAA;AACD,gBAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;;AAEnC;;;;;AAKE;gBAEF,KAAK,CAAC,eAAe,EAAE,gCAAgC,GAAG,IAAI,GAAG,wBAAwB,EAAE,IAAI,CAAC,CAAC;AAEjG,gBAAA,OAAO,IAAI,CAAC;AACZ,aAAA;AAAC,YAAA,OAAO,UAAU,EAAE;gBACpB,GAAG,CAAC,eAAe,EAAE,0BAA0B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAEjE,gBAAA,OAAO,KAAK,CAAC;AACb,aAAA;SACD,CAAA,CAAA;AAAA,KAAA;;kHA3FW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFpB,MAAM,EAAA,CAAA,CAAA;4FAEN,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACX,oBAAA,UAAU,EAAE,MAAM;iBAClB,CAAA;;;AChDD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { red, green } from 'tool-log';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Сервис для безопасного выполнения Promise: перехватывает ошибки,
|
|
7
|
+
* логирует результат и возвращает `false` вместо проброса исключения.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Обычный промис
|
|
11
|
+
* const user = await this.awaitTryCatch.send(
|
|
12
|
+
* this.fetchUser(1),
|
|
13
|
+
* 'UserComponent.load',
|
|
14
|
+
* 'Не удалось загрузить пользователя'
|
|
15
|
+
* );
|
|
16
|
+
* if (user !== false) { this.user = user; }
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // fetch — Response разберётся автоматически (вернёт JSON или false)
|
|
20
|
+
* const todos = await this.awaitTryCatch.send(
|
|
21
|
+
* fetch('https://jsonplaceholder.typicode.com/todos/1'),
|
|
22
|
+
* 'UserComponent.todos'
|
|
23
|
+
* );
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Reject: ошибка уйдёт в лог, вернётся false
|
|
27
|
+
* const ok = await this.awaitTryCatch.send(
|
|
28
|
+
* Promise.reject(new Error('boom')),
|
|
29
|
+
* 'UserComponent.reject'
|
|
30
|
+
* );
|
|
31
|
+
*/
|
|
32
|
+
class AwaitTryCatchService {
|
|
33
|
+
/**
|
|
34
|
+
* Классифицирует ошибку и пишет её в лог с соответствующим префиксом.
|
|
35
|
+
* Нужен, чтобы в консоли было видно тип ошибки (TypeError / ReferenceError / Error / unknown).
|
|
36
|
+
*
|
|
37
|
+
* @param e Перехваченное значение из `catch` (тип заранее неизвестен).
|
|
38
|
+
*/
|
|
39
|
+
_tryCatchErrorInfo(e) {
|
|
40
|
+
if (e instanceof TypeError) {
|
|
41
|
+
red('awaitTryCatch', 'Ошибка типа: ', e.message);
|
|
42
|
+
}
|
|
43
|
+
else if (e instanceof ReferenceError) {
|
|
44
|
+
red('awaitTryCatch', 'Ошибка ссылки: ', e.message);
|
|
45
|
+
}
|
|
46
|
+
else if (e instanceof Error) {
|
|
47
|
+
red('awaitTryCatch', 'Ошибка: ', e.message);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
red('awaitTryCatch', 'Неизвестная ошибка:', { error: e });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Выполняет промис, логирует результат и перехватывает ошибки.
|
|
55
|
+
* Если результатом является `Response` (например, из `fetch`), дополнительно
|
|
56
|
+
* разбирает его через {@link handleResponse}.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* const data = await this.awaitTryCatch.send(
|
|
60
|
+
* fetch('/api/users'),
|
|
61
|
+
* 'UsersService.load'
|
|
62
|
+
* );
|
|
63
|
+
*
|
|
64
|
+
* @param promise Промис для выполнения.
|
|
65
|
+
* @param from Метка источника вызова (для логов).
|
|
66
|
+
* @param errorMessage Текст ошибки для лога при reject.
|
|
67
|
+
* @returns Результат промиса `T`, распарсенные данные `Response` или `false` при ошибке.
|
|
68
|
+
*/
|
|
69
|
+
async send(promise, from = 'Не указано', errorMessage = 'Ошибка при выполнении Promise') {
|
|
70
|
+
try {
|
|
71
|
+
const result = await promise;
|
|
72
|
+
// Обработка Response отдельно - fetch() возвращает не готовые данные, а объект Response
|
|
73
|
+
if (result instanceof Response) {
|
|
74
|
+
return await this.handleResponse(result, from);
|
|
75
|
+
}
|
|
76
|
+
green('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', { result });
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
red('awaitTryCatch', 'Ошибка выполнения send (из ' + from + '/AwaitTryCatchService)', errorMessage);
|
|
81
|
+
this._tryCatchErrorInfo(error);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Разбирает `Response`: проверяет статус и парсит тело как JSON.
|
|
87
|
+
*
|
|
88
|
+
* @param response Объект `Response` (обычно результат `fetch`).
|
|
89
|
+
* @param from Метка источника вызова (для логов).
|
|
90
|
+
* @returns Распарсенные данные или `false`, если статус не ok либо парсинг упал.
|
|
91
|
+
*/
|
|
92
|
+
async handleResponse(response, from) {
|
|
93
|
+
try {
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
console.error(`HTTP Error: ${response.status} ${response.statusText}`);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const data = await response.json();
|
|
99
|
+
// Чтобы получить данные, нужно вызвать один из методов:
|
|
100
|
+
/*
|
|
101
|
+
const data = await response.json(); // для JSON ответа
|
|
102
|
+
const text = await response.text(); // для текста
|
|
103
|
+
const blob = await response.blob(); // для файлов/изображений
|
|
104
|
+
const formData = await response.formData(); // для form-data
|
|
105
|
+
*/
|
|
106
|
+
green('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', data);
|
|
107
|
+
return data;
|
|
108
|
+
}
|
|
109
|
+
catch (parseError) {
|
|
110
|
+
red('awaitTryCatch', 'Ошибка парсинга ответа: ', { parseError });
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
AwaitTryCatchService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
116
|
+
AwaitTryCatchService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, providedIn: 'root' });
|
|
117
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AwaitTryCatchService, decorators: [{
|
|
118
|
+
type: Injectable,
|
|
119
|
+
args: [{
|
|
120
|
+
providedIn: 'root'
|
|
121
|
+
}]
|
|
122
|
+
}] });
|
|
123
|
+
|
|
124
|
+
/*
|
|
125
|
+
* Public API Surface of tool-utilities
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Generated bundle index. Do not edit.
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
export { AwaitTryCatchService };
|
|
133
|
+
//# sourceMappingURL=tool-utilities-ang15.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-utilities-ang15.mjs","sources":["../../../projects/tool-utilities-ang15/src/lib/await-try-catch.service.ts","../../../projects/tool-utilities-ang15/src/public-api.ts","../../../projects/tool-utilities-ang15/src/tool-utilities-ang15.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { green, red } from 'tool-log';\r\n\r\n/**\r\n * Контракт сервиса-обёртки для безопасного выполнения Promise.\r\n * Возвращает результат промиса либо `false` при ошибке (без проброса исключения).\r\n */\r\nexport interface IAwaitTryCatchService {\r\n\t/**\r\n\t * Выполняет промис и перехватывает ошибки.\r\n\t *\r\n\t * @param promise Промис, который нужно выполнить.\r\n\t * @param from Метка источника вызова (попадает в логи). По умолчанию `'Не указано'`.\r\n\t * @param errorMessage Текст ошибки для лога при reject. По умолчанию `'Ошибка при выполнении Promise'`.\r\n\t * @returns Результат промиса `T` либо `false` при ошибке.\r\n\t */\r\n\tsend<T = any>(promise: Promise<T>, from?: string, errorMessage?: string): Promise<T | false>;\r\n}\r\n\r\n/**\r\n * Сервис для безопасного выполнения Promise: перехватывает ошибки,\r\n * логирует результат и возвращает `false` вместо проброса исключения.\r\n *\r\n * @example\r\n * // Обычный промис\r\n * const user = await this.awaitTryCatch.send(\r\n * this.fetchUser(1),\r\n * 'UserComponent.load',\r\n * 'Не удалось загрузить пользователя'\r\n * );\r\n * if (user !== false) { this.user = user; }\r\n *\r\n * @example\r\n * // fetch — Response разберётся автоматически (вернёт JSON или false)\r\n * const todos = await this.awaitTryCatch.send(\r\n * fetch('https://jsonplaceholder.typicode.com/todos/1'),\r\n * 'UserComponent.todos'\r\n * );\r\n *\r\n * @example\r\n * // Reject: ошибка уйдёт в лог, вернётся false\r\n * const ok = await this.awaitTryCatch.send(\r\n * Promise.reject(new Error('boom')),\r\n * 'UserComponent.reject'\r\n * );\r\n */\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class AwaitTryCatchService implements IAwaitTryCatchService {\r\n\r\n\t/**\r\n\t * Классифицирует ошибку и пишет её в лог с соответствующим префиксом.\r\n\t * Нужен, чтобы в консоли было видно тип ошибки (TypeError / ReferenceError / Error / unknown).\r\n\t *\r\n\t * @param e Перехваченное значение из `catch` (тип заранее неизвестен).\r\n\t */\r\n\tprivate _tryCatchErrorInfo(e: unknown): void {\r\n\t\tif (e instanceof TypeError) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка типа: ', e.message);\r\n\t\t} else if (e instanceof ReferenceError) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка ссылки: ', e.message);\r\n\t\t} else if (e instanceof Error) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка: ', e.message);\r\n\t\t} else {\r\n\t\t\tred('awaitTryCatch', 'Неизвестная ошибка:', { error: e });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Выполняет промис, логирует результат и перехватывает ошибки.\r\n\t * Если результатом является `Response` (например, из `fetch`), дополнительно\r\n\t * разбирает его через {@link handleResponse}.\r\n\t *\r\n\t * @example\r\n\t * const data = await this.awaitTryCatch.send(\r\n\t * fetch('/api/users'),\r\n\t * 'UsersService.load'\r\n\t * );\r\n\t *\r\n\t * @param promise Промис для выполнения.\r\n\t * @param from Метка источника вызова (для логов).\r\n\t * @param errorMessage Текст ошибки для лога при reject.\r\n\t * @returns Результат промиса `T`, распарсенные данные `Response` или `false` при ошибке.\r\n\t */\r\n\tpublic async send<T = any>(\r\n\t\tpromise: Promise<T>,\r\n\t\tfrom: string = 'Не указано',\r\n\t\terrorMessage: string = 'Ошибка при выполнении Promise'\r\n\t): Promise<T | false> {\r\n\t\ttry {\r\n\t\t\tconst result = await promise;\r\n\r\n\t\t\t// Обработка Response отдельно - fetch() возвращает не готовые данные, а объект Response\r\n\t\t\tif (result instanceof Response) {\r\n\t\t\t\treturn await this.handleResponse(result, from) as Promise<T | false>;\r\n\t\t\t}\r\n\r\n\t\t\tgreen('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', { result });\r\n\r\n\t\t\treturn result;\r\n\t\t} catch (error) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка выполнения send (из ' + from + '/AwaitTryCatchService)', errorMessage);\r\n\t\t\tthis._tryCatchErrorInfo(error);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Разбирает `Response`: проверяет статус и парсит тело как JSON.\r\n\t *\r\n\t * @param response Объект `Response` (обычно результат `fetch`).\r\n\t * @param from Метка источника вызова (для логов).\r\n\t * @returns Распарсенные данные или `false`, если статус не ok либо парсинг упал.\r\n\t */\r\n\tprivate async handleResponse(response: Response, from: string ): Promise<any | false> {\r\n\t\ttry {\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tconsole.error(`HTTP Error: ${response.status} ${response.statusText}`);\r\n\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tconst data = await response.json();\r\n\t\t\t// Чтобы получить данные, нужно вызвать один из методов:\r\n\t\t\t/*\r\n\t\t\tconst data = await response.json(); // для JSON ответа\r\n\t\t\tconst text = await response.text(); // для текста\r\n\t\t\tconst blob = await response.blob(); // для файлов/изображений\r\n\t\t\tconst formData = await response.formData(); // для form-data\r\n\t\t\t*/\r\n\r\n\t\t\tgreen('awaitTryCatch', 'Результат выполнения send (из ' + from + '/AwaitTryCatchService)', data);\r\n\r\n\t\t\treturn data;\r\n\t\t} catch (parseError) {\r\n\t\t\tred('awaitTryCatch', 'Ошибка парсинга ответа: ', { parseError });\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n}\r\n","/*\n * Public API Surface of tool-utilities\n */\n\nexport * from './lib/await-try-catch.service';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
/**
|
|
3
|
+
* Контракт сервиса-обёртки для безопасного выполнения Promise.
|
|
4
|
+
* Возвращает результат промиса либо `false` при ошибке (без проброса исключения).
|
|
5
|
+
*/
|
|
6
|
+
export interface IAwaitTryCatchService {
|
|
7
|
+
/**
|
|
8
|
+
* Выполняет промис и перехватывает ошибки.
|
|
9
|
+
*
|
|
10
|
+
* @param promise Промис, который нужно выполнить.
|
|
11
|
+
* @param from Метка источника вызова (попадает в логи). По умолчанию `'Не указано'`.
|
|
12
|
+
* @param errorMessage Текст ошибки для лога при reject. По умолчанию `'Ошибка при выполнении Promise'`.
|
|
13
|
+
* @returns Результат промиса `T` либо `false` при ошибке.
|
|
14
|
+
*/
|
|
15
|
+
send<T = any>(promise: Promise<T>, from?: string, errorMessage?: string): Promise<T | false>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Сервис для безопасного выполнения Promise: перехватывает ошибки,
|
|
19
|
+
* логирует результат и возвращает `false` вместо проброса исключения.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // Обычный промис
|
|
23
|
+
* const user = await this.awaitTryCatch.send(
|
|
24
|
+
* this.fetchUser(1),
|
|
25
|
+
* 'UserComponent.load',
|
|
26
|
+
* 'Не удалось загрузить пользователя'
|
|
27
|
+
* );
|
|
28
|
+
* if (user !== false) { this.user = user; }
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // fetch — Response разберётся автоматически (вернёт JSON или false)
|
|
32
|
+
* const todos = await this.awaitTryCatch.send(
|
|
33
|
+
* fetch('https://jsonplaceholder.typicode.com/todos/1'),
|
|
34
|
+
* 'UserComponent.todos'
|
|
35
|
+
* );
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* // Reject: ошибка уйдёт в лог, вернётся false
|
|
39
|
+
* const ok = await this.awaitTryCatch.send(
|
|
40
|
+
* Promise.reject(new Error('boom')),
|
|
41
|
+
* 'UserComponent.reject'
|
|
42
|
+
* );
|
|
43
|
+
*/
|
|
44
|
+
export declare class AwaitTryCatchService implements IAwaitTryCatchService {
|
|
45
|
+
/**
|
|
46
|
+
* Классифицирует ошибку и пишет её в лог с соответствующим префиксом.
|
|
47
|
+
* Нужен, чтобы в консоли было видно тип ошибки (TypeError / ReferenceError / Error / unknown).
|
|
48
|
+
*
|
|
49
|
+
* @param e Перехваченное значение из `catch` (тип заранее неизвестен).
|
|
50
|
+
*/
|
|
51
|
+
private _tryCatchErrorInfo;
|
|
52
|
+
/**
|
|
53
|
+
* Выполняет промис, логирует результат и перехватывает ошибки.
|
|
54
|
+
* Если результатом является `Response` (например, из `fetch`), дополнительно
|
|
55
|
+
* разбирает его через {@link handleResponse}.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* const data = await this.awaitTryCatch.send(
|
|
59
|
+
* fetch('/api/users'),
|
|
60
|
+
* 'UsersService.load'
|
|
61
|
+
* );
|
|
62
|
+
*
|
|
63
|
+
* @param promise Промис для выполнения.
|
|
64
|
+
* @param from Метка источника вызова (для логов).
|
|
65
|
+
* @param errorMessage Текст ошибки для лога при reject.
|
|
66
|
+
* @returns Результат промиса `T`, распарсенные данные `Response` или `false` при ошибке.
|
|
67
|
+
*/
|
|
68
|
+
send<T = any>(promise: Promise<T>, from?: string, errorMessage?: string): Promise<T | false>;
|
|
69
|
+
/**
|
|
70
|
+
* Разбирает `Response`: проверяет статус и парсит тело как JSON.
|
|
71
|
+
*
|
|
72
|
+
* @param response Объект `Response` (обычно результат `fetch`).
|
|
73
|
+
* @param from Метка источника вызова (для логов).
|
|
74
|
+
* @returns Распарсенные данные или `false`, если статус не ok либо парсинг упал.
|
|
75
|
+
*/
|
|
76
|
+
private handleResponse;
|
|
77
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AwaitTryCatchService, never>;
|
|
78
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AwaitTryCatchService>;
|
|
79
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tool-utilities-ang15",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^15.2.0",
|
|
6
|
+
"@angular/core": "^15.2.0"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.3.0"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"module": "fesm2015/tool-utilities-ang15.mjs",
|
|
13
|
+
"es2020": "fesm2020/tool-utilities-ang15.mjs",
|
|
14
|
+
"esm2020": "esm2020/tool-utilities-ang15.mjs",
|
|
15
|
+
"fesm2020": "fesm2020/tool-utilities-ang15.mjs",
|
|
16
|
+
"fesm2015": "fesm2015/tool-utilities-ang15.mjs",
|
|
17
|
+
"typings": "index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
"./package.json": {
|
|
20
|
+
"default": "./package.json"
|
|
21
|
+
},
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./index.d.ts",
|
|
24
|
+
"esm2020": "./esm2020/tool-utilities-ang15.mjs",
|
|
25
|
+
"es2020": "./fesm2020/tool-utilities-ang15.mjs",
|
|
26
|
+
"es2015": "./fesm2015/tool-utilities-ang15.mjs",
|
|
27
|
+
"node": "./fesm2015/tool-utilities-ang15.mjs",
|
|
28
|
+
"default": "./fesm2020/tool-utilities-ang15.mjs"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
6
31
|
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/await-try-catch.service';
|