bx-rest 0.21.1 → 0.21.2
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 +35 -4
- package/esm2022/functions/errors.mjs +17 -0
- package/esm2022/public-api.mjs +2 -1
- package/esm2022/services/navvy/extends/navvy-pag-base.mjs +14 -5
- package/fesm2022/bx-rest.mjs +30 -5
- package/fesm2022/bx-rest.mjs.map +1 -1
- package/functions/errors.d.ts +13 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/services/navvy/extends/navvy-pag-base.d.ts +13 -2
package/README.md
CHANGED
|
@@ -86,11 +86,17 @@ REST calls are lazy: the request starts when the returned `Observable` is subscr
|
|
|
86
86
|
|
|
87
87
|
| Method | Result |
|
|
88
88
|
| --- | --- |
|
|
89
|
-
| `.res()` | Unwraps the Bitrix response and applies the configured mapper. For paginated methods it returns the current page. |
|
|
89
|
+
| `.res(options?)` | Unwraps the Bitrix response and applies the configured mapper. For paginated methods it returns the current page. |
|
|
90
90
|
| `.resAll()` | Loads and combines every page. Available on paginated Navvy helpers. |
|
|
91
91
|
| `.resVanilla()` | Returns the raw Bitrix response, including fields such as `result`, `total` and `next`. |
|
|
92
92
|
| `.mapForVanilla()` | Keeps the raw response envelope but applies the mapper to its `result`. |
|
|
93
93
|
|
|
94
|
+
`.res()` accepts an optional options object:
|
|
95
|
+
|
|
96
|
+
| Option | Default | Effect |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `throwOnApiError` | `false` | When `true`, a Bitrix-level API error makes the returned `Observable` error out with a `BXRestApiError` instead of resolving with `undefined`. See [Error handling](#error-handling). |
|
|
99
|
+
|
|
94
100
|
## Authentication and OAuth2
|
|
95
101
|
|
|
96
102
|
`auth.source` controls where credentials are read from. `auth.key` controls the request parameter name, except for the special `OAuth2` cookie-credentials mode.
|
|
@@ -129,9 +135,34 @@ BXRestSettings.update({
|
|
|
129
135
|
| Failure | When it happens | How it surfaces on `.res()` |
|
|
130
136
|
| --- | --- | --- |
|
|
131
137
|
| Transport / configuration errors — network failure, missing auth, missing base URL | Before or during the HTTP call | The returned `Observable` errors. Handle it with RxJS `catchError` or the `error` callback of `subscribe()`. |
|
|
132
|
-
| Bitrix API errors — `{ error, error_description }`, e.g. `INSUFFICIENT_SCOPE`, `expired_token` | HTTP 200 response whose body is not a success payload | `.res()` resolves normally with `undefined
|
|
138
|
+
| Bitrix API errors — `{ error, error_description }`, e.g. `INSUFFICIENT_SCOPE`, `expired_token` | HTTP 200 response whose body is not a success payload | By default, `.res()` resolves normally with `undefined` — **it does not throw**. Pass `{ throwOnApiError: true }` to make it throw a `BXRestApiError` instead. |
|
|
139
|
+
|
|
140
|
+
Because a Bitrix-level error resolves as `undefined` rather than as an `Observable` error by default, don't rely on plain `.res()` alone to tell "no records" apart from "the call failed". You have two options.
|
|
141
|
+
|
|
142
|
+
**Option 1 — opt in to throwing with `.res({ throwOnApiError: true })`.** The `Observable` errors with a `BXRestApiError`, exposing `error` and `error_description`, so it can be handled alongside transport errors in a single `catchError`/`error` callback:
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { BXRestNavvy, BXRestApiError } from 'bx-rest'
|
|
146
|
+
|
|
147
|
+
const bxRest = new BXRestNavvy()
|
|
148
|
+
|
|
149
|
+
bxRest.crm.deal.list({
|
|
150
|
+
select: ['ID', 'TITLE'],
|
|
151
|
+
filter: {},
|
|
152
|
+
start: 0
|
|
153
|
+
}).res({ throwOnApiError: true }).subscribe({
|
|
154
|
+
next: deals => console.log(deals),
|
|
155
|
+
error: err => {
|
|
156
|
+
if (err instanceof BXRestApiError) {
|
|
157
|
+
console.error('Bitrix API error:', err.error, err.error_description)
|
|
158
|
+
} else {
|
|
159
|
+
console.error('Request failed:', err.message)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
```
|
|
133
164
|
|
|
134
|
-
|
|
165
|
+
**Option 2 — keep the default and check the raw response.** Call `.resVanilla()` instead and check the response with the exported `isBXRestAnswerSuccess()` type guard:
|
|
135
166
|
|
|
136
167
|
```typescript
|
|
137
168
|
import { firstValueFrom } from 'rxjs'
|
|
@@ -154,7 +185,7 @@ if (!answer || !isBXRestAnswerSuccess(answer)) {
|
|
|
154
185
|
}
|
|
155
186
|
```
|
|
156
187
|
|
|
157
|
-
|
|
188
|
+
Regardless of `throwOnApiError`, transport-level failures always propagate as `Observable` errors and can be caught the usual RxJS way:
|
|
158
189
|
|
|
159
190
|
```typescript
|
|
160
191
|
bxRest.crm.deal.list({
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown by `.res()` when called with `{ throwOnApiError: true }` and the
|
|
3
|
+
* Bitrix REST call resolves as a Bitrix-level API error, e.g.
|
|
4
|
+
* `INSUFFICIENT_SCOPE` or `expired_token`.
|
|
5
|
+
*
|
|
6
|
+
* By default `.res()` resolves such responses as `undefined` instead of
|
|
7
|
+
* throwing — see the "Error handling" section of the README.
|
|
8
|
+
*/
|
|
9
|
+
export class BXRestApiError extends Error {
|
|
10
|
+
constructor(error, error_description) {
|
|
11
|
+
super(error_description || error || 'Bitrix API error');
|
|
12
|
+
this.error = error;
|
|
13
|
+
this.error_description = error_description;
|
|
14
|
+
this.name = 'BXRestApiError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvZnVuY3Rpb25zL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBQ3ZDLFlBQ1MsS0FBeUIsRUFDekIsaUJBQXFDO1FBRTVDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLElBQUksa0JBQWtCLENBQUMsQ0FBQTtRQUhoRCxVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW9CO1FBRzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUE7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaHJvd24gYnkgYC5yZXMoKWAgd2hlbiBjYWxsZWQgd2l0aCBgeyB0aHJvd09uQXBpRXJyb3I6IHRydWUgfWAgYW5kIHRoZVxuICogQml0cml4IFJFU1QgY2FsbCByZXNvbHZlcyBhcyBhIEJpdHJpeC1sZXZlbCBBUEkgZXJyb3IsIGUuZy5cbiAqIGBJTlNVRkZJQ0lFTlRfU0NPUEVgIG9yIGBleHBpcmVkX3Rva2VuYC5cbiAqXG4gKiBCeSBkZWZhdWx0IGAucmVzKClgIHJlc29sdmVzIHN1Y2ggcmVzcG9uc2VzIGFzIGB1bmRlZmluZWRgIGluc3RlYWQgb2ZcbiAqIHRocm93aW5nIOKAlCBzZWUgdGhlIFwiRXJyb3IgaGFuZGxpbmdcIiBzZWN0aW9uIG9mIHRoZSBSRUFETUUuXG4gKi9cbmV4cG9ydCBjbGFzcyBCWFJlc3RBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIGVycm9yX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IgfHwgJ0JpdHJpeCBBUEkgZXJyb3InKVxuICAgIHRoaXMubmFtZSA9ICdCWFJlc3RBcGlFcnJvcidcbiAgfVxufVxuIl19
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -9,7 +9,8 @@ export { Navvy } from './services/navvy';
|
|
|
9
9
|
export { HttpBXServices as BXRestRequest } from './services/http/HttpBX';
|
|
10
10
|
export { SessionKeyServices, SessionKeyError } from './services/http/sessionKey';
|
|
11
11
|
export { instanceOfiBXRestAnswerSuccess as isBXRestAnswerSuccess } from './functions/mapResult';
|
|
12
|
+
export { BXRestApiError } from './functions/errors';
|
|
12
13
|
export { HttpNavvyServices } from './services/http/httpNavvy';
|
|
13
14
|
export * as partNameMethods from './consts/part-name-methods';
|
|
14
15
|
export * as BXBaseServices from './services/base';
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLElBQUksYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ2hGLE9BQU8sRUFBRSw4QkFBOEIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQy9GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUVuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUM3RCxPQUFPLEtBQUssZUFBZSxNQUFNLDRCQUE0QixDQUFBO0FBQzdELE9BQU8sS0FBSyxjQUFjLE1BQU0saUJBQWlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGJ4LXJlc3RcclxuICovXHJcbmV4cG9ydCB7IEJYUmVzdFNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncydcclxuZXhwb3J0IHsgQlhSZXN0TWFwUmVzdWx0IH0gZnJvbSAnLi9mdW5jdGlvbnMvbWFwUmVzdWx0J1xyXG5leHBvcnQgeyBCWFJlc3ROYXZ2eSB9IGZyb20gJy4vcmVzdC9uYXZ2eSdcclxuZXhwb3J0IHsgQlhSZXN0TWFwIH0gZnJvbSAnLi9yZXN0L21hcCdcclxuZXhwb3J0IHsgTmF2dnkgfSBmcm9tICcuL3NlcnZpY2VzL25hdnZ5J1xyXG5leHBvcnQgeyBIdHRwQlhTZXJ2aWNlcyBhcyBCWFJlc3RSZXF1ZXN0IH0gZnJvbSAnLi9zZXJ2aWNlcy9odHRwL0h0dHBCWCdcclxuZXhwb3J0IHsgU2Vzc2lvbktleVNlcnZpY2VzLCBTZXNzaW9uS2V5RXJyb3IgfSBmcm9tICcuL3NlcnZpY2VzL2h0dHAvc2Vzc2lvbktleSdcclxuZXhwb3J0IHsgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzIGFzIGlzQlhSZXN0QW5zd2VyU3VjY2VzcyB9IGZyb20gJy4vZnVuY3Rpb25zL21hcFJlc3VsdCdcclxuZXhwb3J0IHsgQlhSZXN0QXBpRXJyb3IgfSBmcm9tICcuL2Z1bmN0aW9ucy9lcnJvcnMnXHJcbmV4cG9ydCB7IEJYUmVzdFJlc09wdGlvbnMgfSBmcm9tICcuL3NlcnZpY2VzL25hdnZ5L2V4dGVuZHMvbmF2dnktcGFnLWJhc2UnXHJcbmV4cG9ydCB7IEh0dHBOYXZ2eVNlcnZpY2VzIH0gZnJvbSAnLi9zZXJ2aWNlcy9odHRwL2h0dHBOYXZ2eSdcclxuZXhwb3J0ICogYXMgcGFydE5hbWVNZXRob2RzIGZyb20gJy4vY29uc3RzL3BhcnQtbmFtZS1tZXRob2RzJ1xyXG5leHBvcnQgKiBhcyBCWEJhc2VTZXJ2aWNlcyBmcm9tICcuL3NlcnZpY2VzL2Jhc2UnXHJcbiJdfQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { catchError, map } from 'rxjs/operators';
|
|
2
2
|
import { BXRestMapResult, instanceOfiBXRestAnswerSuccess } from '../../../functions/mapResult';
|
|
3
3
|
import { HttpBXServices } from '../../http/HttpBX';
|
|
4
|
+
import { BXRestApiError } from '../../../functions/errors';
|
|
4
5
|
export class NavvyPagBase {
|
|
5
6
|
constructor(url, param, map = undefined, restApi = false) {
|
|
6
7
|
this.url = url;
|
|
@@ -24,16 +25,24 @@ export class NavvyPagBase {
|
|
|
24
25
|
return v;
|
|
25
26
|
}));
|
|
26
27
|
}
|
|
27
|
-
res() {
|
|
28
|
-
return this.mapAndError(this.resVanilla()).pipe(map(v => (v && this.map)
|
|
28
|
+
res(options) {
|
|
29
|
+
return this.mapAndError(this.resVanilla(), options).pipe(map(v => (v && this.map)
|
|
29
30
|
? this.map(v)
|
|
30
31
|
: v));
|
|
31
32
|
}
|
|
32
|
-
mapAndError(request) {
|
|
33
|
-
return request.pipe(map(v =>
|
|
33
|
+
mapAndError(request, options) {
|
|
34
|
+
return request.pipe(map(v => {
|
|
35
|
+
if (options?.throwOnApiError && v && !instanceOfiBXRestAnswerSuccess(v)) {
|
|
36
|
+
throw new BXRestApiError(v.error, v.error_description);
|
|
37
|
+
}
|
|
38
|
+
return BXRestMapResult(v);
|
|
39
|
+
}), catchError((err) => {
|
|
34
40
|
console.error(err);
|
|
41
|
+
if (err instanceof BXRestApiError) {
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
35
44
|
throw new Error((err.error) ? err.error : err);
|
|
36
45
|
}));
|
|
37
46
|
}
|
|
38
47
|
}
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2dnktcGFnLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ieC1yZXN0L3NyYy9zZXJ2aWNlcy9uYXZ2eS9leHRlbmRzL25hdnZ5LXBhZy1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDhCQUE4QixDQUFBO0FBQzlGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFjMUQsTUFBTSxPQUFnQixZQUFZO0lBS2hDLFlBQ1ksR0FBYSxFQUNiLEtBQVEsRUFDUixNQUE0RCxTQUFTLEVBQ3JFLFVBQVUsS0FBSztRQUhmLFFBQUcsR0FBSCxHQUFHLENBQVU7UUFDYixVQUFLLEdBQUwsS0FBSyxDQUFHO1FBQ1IsUUFBRyxHQUFILEdBQUcsQ0FBa0U7UUFDckUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQU4zQixhQUFRLEdBQUcsRUFBRSxDQUFBLENBQUMsOEJBQThCO1FBUTFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRTthQUNyQixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ04sSUFBSSxDQUFDLElBQUksOEJBQThCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN2RCxvREFBb0Q7Z0JBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQVcsQ0FBMEIsQ0FBQTtnQkFDL0QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLEVBQTBDLENBQUE7WUFDOUUsQ0FBQztZQUNELE9BQU8sQ0FBcUQsQ0FBQTtRQUM5RCxDQUFDLENBQUMsQ0FDSCxDQUFBO0lBQ0wsQ0FBQztJQUVELEdBQUcsQ0FBQyxPQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDdEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDYixDQUFDLENBQUMsQ0FBQyxDQUNKLENBQytDLENBQUE7SUFDcEQsQ0FBQztJQUVELFdBQVcsQ0FDVCxPQUFpRCxFQUNqRCxPQUEwQjtRQUUxQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNOLElBQUksT0FBTyxFQUFFLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RSxNQUFNLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDeEQsQ0FBQztZQUNELE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNCLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbEIsSUFBSSxHQUFHLFlBQVksY0FBYyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sR0FBRyxDQUFBO1lBQ1gsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hELENBQUMsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgaUJYUmVzdEFuc3dlciB9IGZyb20gJy4uLy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2Jhc2UvYW5zd2VyJ1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuaW1wb3J0IHsgQlhSZXN0TWFwUmVzdWx0LCBpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMvbWFwUmVzdWx0J1xyXG5pbXBvcnQgeyBIdHRwQlhTZXJ2aWNlcyB9IGZyb20gJy4uLy4uL2h0dHAvSHR0cEJYJ1xyXG5pbXBvcnQgeyBSZXR1cm5UeXBlTmF2dnkgfSBmcm9tICcuLi9uYXZ2eS1zdXBwb3J0J1xyXG5pbXBvcnQgeyBCWFJlc3RBcGlFcnJvciB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucy9lcnJvcnMnXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJYUmVzdFJlc09wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIFdoZW4gYHRydWVgLCBhIEJpdHJpeC1sZXZlbCBBUEkgZXJyb3IgKGB7IGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbiB9YCxcclxuICAgKiBlLmcuIGBJTlNVRkZJQ0lFTlRfU0NPUEVgLCBgZXhwaXJlZF90b2tlbmApIG1ha2VzIHRoZSBgT2JzZXJ2YWJsZWBcclxuICAgKiByZXR1cm5lZCBieSBgLnJlcygpYCBlcnJvciBvdXQgd2l0aCBhIGBCWFJlc3RBcGlFcnJvcmAgaW5zdGVhZCBvZlxyXG4gICAqIHJlc29sdmluZyB3aXRoIGB1bmRlZmluZWRgLlxyXG4gICAqXHJcbiAgICogRGVmYXVsdDogYGZhbHNlYCAocHJlc2VydmVzIHRoZSBoaXN0b3JpY2FsIGAucmVzKClgIGJlaGF2aW91cikuXHJcbiAgICovXHJcbiAgdGhyb3dPbkFwaUVycm9yPzogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmF2dnlQYWdCYXNlPFQsIFIsIFA+IHtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGh0dHA6IEh0dHBCWFNlcnZpY2VzXHJcbiAgcGFnZVNpemUgPSA1MCAvLyDRgdGC0LDQvdC00LDRgNGC0L3Ri9C5INGA0LDQt9C80LXRgCDRgdGC0YDQsNC90LjRhtGLXHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCB1cmw6IHN0cmluZ1tdLFxyXG4gICAgcHJvdGVjdGVkIHBhcmFtOiBQLFxyXG4gICAgcHJvdGVjdGVkIG1hcDogKChwYXJhbTogVHwgdW5kZWZpbmVkKSA9PiBSIHwgdW5kZWZpbmVkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcclxuICAgIHByb3RlY3RlZCByZXN0QXBpID0gZmFsc2VcclxuICApIHtcclxuICAgIHRoaXMuaHR0cCA9IG5ldyBIdHRwQlhTZXJ2aWNlcygpXHJcbiAgfVxyXG5cclxuICByZXNWYW5pbGxhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFQ+KHRoaXMudXJsLCB0aGlzLnBhcmFtLCB0aGlzLnJlc3RBcGkpXHJcbiAgfVxyXG5cclxuICBtYXBGb3JWYW5pbGxhKCk6IE9ic2VydmFibGU8aUJYUmVzdEFuc3dlcjxSZXR1cm5UeXBlTmF2dnk8VCwgUj4+IHwgdW5kZWZpbmVkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNWYW5pbGxhKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4ge1xyXG4gICAgICAgICAgaWYgKHYgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKHYpICYmIHRoaXMubWFwKSB7XHJcbiAgICAgICAgICAgIC8vINCf0YDQuNC80LXQvdGP0LXQvCB0aGlzLm1hcCDQuCDRj9Cy0L3QviDQv9GA0LjQstC+0LTQuNC8INGC0LjQvyDRgNC10LfRg9C70YzRgtCw0YLQsFxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1hcCh2LnJlc3VsdCBhcyBUKSBhcyBSZXR1cm5UeXBlTmF2dnk8VCwgUj5cclxuICAgICAgICAgICAgcmV0dXJuIHsgLi4udiwgLi4ue3Jlc3VsdDogcmVzdWx0fSB9IGFzIGlCWFJlc3RBbnN3ZXI8UmV0dXJuVHlwZU5hdnZ5PFQsIFI+PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHYgYXMgaUJYUmVzdEFuc3dlcjxSZXR1cm5UeXBlTmF2dnk8VCwgUj4+IHwgdW5kZWZpbmVkXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIH1cclxuXHJcbiAgcmVzKG9wdGlvbnM/OiBCWFJlc3RSZXNPcHRpb25zKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXBBbmRFcnJvcih0aGlzLnJlc1ZhbmlsbGEoKSwgb3B0aW9ucykucGlwZShcclxuICAgICAgbWFwKHYgPT4gKHYgJiYgdGhpcy5tYXApXHJcbiAgICAgICAgPyB0aGlzLm1hcCh2KVxyXG4gICAgICAgIDogdlxyXG4gICAgICApXHJcbiAgICApIGFzIE9ic2VydmFibGU8UmV0dXJuVHlwZU5hdnZ5PFQsIFI+IHwgdW5kZWZpbmVkPlxyXG4gIH1cclxuXHJcbiAgbWFwQW5kRXJyb3I8VD4oXHJcbiAgICByZXF1ZXN0OiBPYnNlcnZhYmxlPGlCWFJlc3RBbnN3ZXI8VD4gfCB1bmRlZmluZWQ+LFxyXG4gICAgb3B0aW9ucz86IEJYUmVzdFJlc09wdGlvbnNcclxuICApIHtcclxuICAgIHJldHVybiByZXF1ZXN0LnBpcGUoXHJcbiAgICAgIG1hcCh2ID0+IHtcclxuICAgICAgICBpZiAob3B0aW9ucz8udGhyb3dPbkFwaUVycm9yICYmIHYgJiYgIWluc3RhbmNlT2ZpQlhSZXN0QW5zd2VyU3VjY2Vzcyh2KSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEJYUmVzdEFwaUVycm9yKHYuZXJyb3IsIHYuZXJyb3JfZGVzY3JpcHRpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBCWFJlc3RNYXBSZXN1bHQodilcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEJYUmVzdEFwaUVycm9yKSB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKChlcnIuZXJyb3IpID8gZXJyLmVycm9yIDogZXJyKVxyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbn1cclxuIl19
|
package/fesm2022/bx-rest.mjs
CHANGED
|
@@ -832,6 +832,23 @@ class HttpBXServices extends HttpServices {
|
|
|
832
832
|
}
|
|
833
833
|
}
|
|
834
834
|
|
|
835
|
+
/**
|
|
836
|
+
* Thrown by `.res()` when called with `{ throwOnApiError: true }` and the
|
|
837
|
+
* Bitrix REST call resolves as a Bitrix-level API error, e.g.
|
|
838
|
+
* `INSUFFICIENT_SCOPE` or `expired_token`.
|
|
839
|
+
*
|
|
840
|
+
* By default `.res()` resolves such responses as `undefined` instead of
|
|
841
|
+
* throwing — see the "Error handling" section of the README.
|
|
842
|
+
*/
|
|
843
|
+
class BXRestApiError extends Error {
|
|
844
|
+
constructor(error, error_description) {
|
|
845
|
+
super(error_description || error || 'Bitrix API error');
|
|
846
|
+
this.error = error;
|
|
847
|
+
this.error_description = error_description;
|
|
848
|
+
this.name = 'BXRestApiError';
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
835
852
|
class NavvyPagBase {
|
|
836
853
|
constructor(url, param, map = undefined, restApi = false) {
|
|
837
854
|
this.url = url;
|
|
@@ -855,14 +872,22 @@ class NavvyPagBase {
|
|
|
855
872
|
return v;
|
|
856
873
|
}));
|
|
857
874
|
}
|
|
858
|
-
res() {
|
|
859
|
-
return this.mapAndError(this.resVanilla()).pipe(map(v => (v && this.map)
|
|
875
|
+
res(options) {
|
|
876
|
+
return this.mapAndError(this.resVanilla(), options).pipe(map(v => (v && this.map)
|
|
860
877
|
? this.map(v)
|
|
861
878
|
: v));
|
|
862
879
|
}
|
|
863
|
-
mapAndError(request) {
|
|
864
|
-
return request.pipe(map(v =>
|
|
880
|
+
mapAndError(request, options) {
|
|
881
|
+
return request.pipe(map(v => {
|
|
882
|
+
if (options?.throwOnApiError && v && !instanceOfiBXRestAnswerSuccess(v)) {
|
|
883
|
+
throw new BXRestApiError(v.error, v.error_description);
|
|
884
|
+
}
|
|
885
|
+
return BXRestMapResult(v);
|
|
886
|
+
}), catchError((err) => {
|
|
865
887
|
console.error(err);
|
|
888
|
+
if (err instanceof BXRestApiError) {
|
|
889
|
+
throw err;
|
|
890
|
+
}
|
|
866
891
|
throw new Error((err.error) ? err.error : err);
|
|
867
892
|
}));
|
|
868
893
|
}
|
|
@@ -15475,5 +15500,5 @@ class BXRestMap {
|
|
|
15475
15500
|
* Generated bundle index. Do not edit.
|
|
15476
15501
|
*/
|
|
15477
15502
|
|
|
15478
|
-
export { base as BXBaseServices, BXRestMap, BXRestMapResult, BXRestNavvy, HttpBXServices as BXRestRequest, BXRestSettings, HttpNavvyServices, Navvy, SessionKeyError, SessionKeyServices, instanceOfiBXRestAnswerSuccess as isBXRestAnswerSuccess, partNameMethods$1 as partNameMethods };
|
|
15503
|
+
export { base as BXBaseServices, BXRestApiError, BXRestMap, BXRestMapResult, BXRestNavvy, HttpBXServices as BXRestRequest, BXRestSettings, HttpNavvyServices, Navvy, SessionKeyError, SessionKeyServices, instanceOfiBXRestAnswerSuccess as isBXRestAnswerSuccess, partNameMethods$1 as partNameMethods };
|
|
15479
15504
|
//# sourceMappingURL=bx-rest.mjs.map
|