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 CHANGED
@@ -1,3 +1,24 @@
1
- # Temporary Holding Version
1
+ # ToolUtilities
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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":"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"}
@@ -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,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="tool-utilities-ang15" />
5
+ export * from './public-api';
@@ -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.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
  }
@@ -0,0 +1 @@
1
+ export * from './lib/await-try-catch.service';