@equinor/fusion-framework-module-http 6.2.4 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +182 -17
- package/dist/esm/configurator.js +15 -10
- package/dist/esm/configurator.js.map +1 -1
- package/dist/esm/errors.js +27 -3
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/lib/client/client-msal.js +6 -9
- package/dist/esm/lib/client/client-msal.js.map +1 -1
- package/dist/esm/lib/client/client.js +82 -43
- package/dist/esm/lib/client/client.js.map +1 -1
- package/dist/esm/lib/operators/capitalize-request-method.operator.js +2 -3
- package/dist/esm/lib/operators/capitalize-request-method.operator.js.map +1 -1
- package/dist/esm/lib/operators/fetch-request.schema.js +1 -1
- package/dist/esm/lib/operators/fetch-request.schema.js.map +1 -1
- package/dist/esm/lib/operators/process-operators.js +9 -3
- package/dist/esm/lib/operators/process-operators.js.map +1 -1
- package/dist/esm/lib/operators/request-operator-header.js +1 -1
- package/dist/esm/lib/operators/request-operator-header.js.map +1 -1
- package/dist/esm/lib/operators/request-validation.operator.js +1 -1
- package/dist/esm/lib/operators/request-validation.operator.js.map +1 -1
- package/dist/esm/lib/operators/sse.operator.js +33 -0
- package/dist/esm/lib/operators/sse.operator.js.map +1 -0
- package/dist/esm/lib/selectors/blob-selector.js +9 -15
- package/dist/esm/lib/selectors/blob-selector.js.map +1 -1
- package/dist/esm/lib/selectors/json-selector.js +3 -12
- package/dist/esm/lib/selectors/json-selector.js.map +1 -1
- package/dist/esm/lib/selectors/sse-selector.js +164 -0
- package/dist/esm/lib/selectors/sse-selector.js.map +1 -0
- package/dist/esm/module.js +7 -16
- package/dist/esm/module.js.map +1 -1
- package/dist/esm/provider.js +2 -1
- package/dist/esm/provider.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/errors.d.ts +21 -0
- package/dist/types/lib/client/client.d.ts +24 -0
- package/dist/types/lib/operators/fetch-request.schema.d.ts +7 -7
- package/dist/types/lib/operators/sse.operator.d.ts +32 -0
- package/dist/types/lib/selectors/sse-selector.d.ts +63 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +4 -20
- package/src/errors.ts +27 -0
- package/src/lib/client/client.ts +52 -0
- package/src/lib/operators/sse.operator.ts +44 -0
- package/src/lib/selectors/sse-selector.ts +262 -0
- package/src/version.ts +1 -1
- package/tests/sse.selector.test.ts +150 -0
|
@@ -5,7 +5,7 @@ import { z } from 'zod';
|
|
|
5
5
|
* @link https://www.rfc-editor.org/rfc/rfc7231#section-4.1
|
|
6
6
|
*/
|
|
7
7
|
export const requestMethodCasing = () => {
|
|
8
|
-
return z.custom((value) => value ===
|
|
8
|
+
return z.custom((value) => value === value?.toUpperCase(), (value) => ({
|
|
9
9
|
code: z.ZodIssueCode.custom,
|
|
10
10
|
validation: 'uppercase',
|
|
11
11
|
path: ['method'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-request.schema.js","sourceRoot":"","sources":["../../../../src/lib/operators/fetch-request.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAsB,EAAE;IACzD,OAAO,CAAC,CAAC,MAAM,CACb,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"fetch-request.schema.js","sourceRoot":"","sources":["../../../../src/lib/operators/fetch-request.schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,12 @@ import { last, mergeScan } from 'rxjs/operators';
|
|
|
8
8
|
* @template T The type of data that the process operators work with
|
|
9
9
|
*/
|
|
10
10
|
export class ProcessOperators {
|
|
11
|
+
/**
|
|
12
|
+
* A record of process operators keyed by a string.
|
|
13
|
+
* This property is used to store and manage the collection of process operators
|
|
14
|
+
* that are used by the `ProcessOperators` class.
|
|
15
|
+
*/
|
|
16
|
+
_operators;
|
|
11
17
|
/**
|
|
12
18
|
* Accessor for the collection of process operators.
|
|
13
19
|
* @returns The record of process operators.
|
|
@@ -22,10 +28,10 @@ export class ProcessOperators {
|
|
|
22
28
|
*/
|
|
23
29
|
constructor(operators) {
|
|
24
30
|
if (operators && 'operators' in operators) {
|
|
25
|
-
this._operators =
|
|
31
|
+
this._operators = { ...operators.operators };
|
|
26
32
|
}
|
|
27
33
|
else {
|
|
28
|
-
this._operators = operators
|
|
34
|
+
this._operators = operators ?? {};
|
|
29
35
|
}
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
@@ -81,7 +87,7 @@ export class ProcessOperators {
|
|
|
81
87
|
}
|
|
82
88
|
return from(Object.values(this._operators)).pipe(mergeScan(
|
|
83
89
|
// resolve current operator and return result or previous if void
|
|
84
|
-
(value, operator) => Promise.resolve(operator(value)).then((x) => x
|
|
90
|
+
(value, operator) => Promise.resolve(operator(value)).then((x) => x ?? value),
|
|
85
91
|
// initial value
|
|
86
92
|
request,
|
|
87
93
|
// only allow concurrency of one operator
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-operators.js","sourceRoot":"","sources":["../../../../src/lib/operators/process-operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAEhC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"file":"process-operators.js","sourceRoot":"","sources":["../../../../src/lib/operators/process-operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAEhC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;;;OAIG;IACO,UAAU,CAAqC;IAEzD;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,YAAY,SAAqE;QAC/E,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,GAAW,EAAE,QAA4B;QAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC5C,MAAM,KAAK,CAAC,aAAa,GAAG,mBAAmB,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,GAAW,EAAE,QAA4B;QAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,OAAU;QAChB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,mEAAmE;QACnE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAC9C,SAAS;QACP,iEAAiE;QACjE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;QAC7E,gBAAgB;QAChB,OAAO;QACP,yCAAyC;QACzC,CAAC,CACF;QACD,iCAAiC;QACjC,IAAI,EAAE,CACP,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
export const requestOperatorHeader = (key, value) => (request) => {
|
|
9
9
|
const headers = new Headers(request.headers);
|
|
10
10
|
headers.append(key, value);
|
|
11
|
-
return
|
|
11
|
+
return { ...request, headers };
|
|
12
12
|
};
|
|
13
13
|
export default requestOperatorHeader;
|
|
14
14
|
//# sourceMappingURL=request-operator-header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-operator-header.js","sourceRoot":"","sources":["../../../../src/lib/operators/request-operator-header.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,CAAwC,GAAW,EAAE,KAAa,EAAsB,EAAE,CAC1F,CAAC,OAAO,EAAE,EAAE;IACV,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"request-operator-header.js","sourceRoot":"","sources":["../../../../src/lib/operators/request-operator-header.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,CAAwC,GAAW,EAAE,KAAa,EAAsB,EAAE,CAC1F,CAAC,OAAO,EAAE,EAAE;IACV,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC,CAAC;AAEJ,eAAe,qBAAqB,CAAC"}
|
|
@@ -13,7 +13,7 @@ import { fetchRequestSchema } from './fetch-request.schema';
|
|
|
13
13
|
* @throws Will log an error message if the request validation fails.
|
|
14
14
|
*/
|
|
15
15
|
export const requestValidationOperator = (options) => (request) => {
|
|
16
|
-
const { strict, parse } = options
|
|
16
|
+
const { strict, parse } = options ?? {};
|
|
17
17
|
const schema = strict ? fetchRequestSchema : fetchRequestSchema.passthrough();
|
|
18
18
|
try {
|
|
19
19
|
const result = schema.parse(request);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-validation.operator.js","sourceRoot":"","sources":["../../../../src/lib/operators/request-validation.operator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,CAAyB,OAiBxB,EAAsB,EAAE,CACzB,CAAC,OAAO,EAAE,EAAE;IACV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"request-validation.operator.js","sourceRoot":"","sources":["../../../../src/lib/operators/request-validation.operator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,CAAyB,OAiBxB,EAAsB,EAAE,CACzB,CAAC,OAAO,EAAE,EAAE;IACV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAC1C,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAG,KAAoB,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { switchMap } from 'rxjs/operators';
|
|
2
|
+
import { createSseSelector, } from '../selectors/sse-selector';
|
|
3
|
+
/**
|
|
4
|
+
* An operator function for handling Server-Sent Events (SSE) in an RxJS pipeline.
|
|
5
|
+
*
|
|
6
|
+
* @template R - The type of the parsed data from the SSE.
|
|
7
|
+
* @template T - The type of the input `Response` object, defaults to `Response`.
|
|
8
|
+
*
|
|
9
|
+
* @param options - Configuration options for the SSE selector.
|
|
10
|
+
*
|
|
11
|
+
* @returns An `OperatorFunction` that transforms a stream of `Response` objects
|
|
12
|
+
* into a stream of `ServerSentEvent` objects containing parsed data of type `R`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { sseMap } from '@equinor/fusion-framework-module-http/operators';
|
|
17
|
+
* import { fromFetch } from 'rxjs/fetch';
|
|
18
|
+
*
|
|
19
|
+
* const response$ = fromFetch('https://example.com/sse', {
|
|
20
|
+
* method: 'GET',
|
|
21
|
+
* headers: {
|
|
22
|
+
* 'Accept': 'text/event-stream',
|
|
23
|
+
* },
|
|
24
|
+
* }).pipe(
|
|
25
|
+
* sseMap( { /* SSE selector options *\/ })
|
|
26
|
+
* ).subscribe((event) => {
|
|
27
|
+
* console.log(event.data); // Process the parsed SSE data
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export const sseMap = (options) => (source) => source.pipe(switchMap(createSseSelector(options)));
|
|
32
|
+
export default sseMap;
|
|
33
|
+
//# sourceMappingURL=sse.operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.operator.js","sourceRoot":"","sources":["../../../../src/lib/operators/sse.operator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,MAAM,MAAM,GACjB,CACE,OAA+B,EACU,EAAE,CAC7C,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7D,eAAe,MAAM,CAAC"}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
/**
|
|
11
2
|
* Extracts a blob and filename from a successful HTTP response.
|
|
12
3
|
*
|
|
@@ -14,8 +5,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
14
5
|
* @returns A promise that resolves to an object containing the extracted blob and filename.
|
|
15
6
|
* @throws {Error} If the response is not successful or if there is an error parsing the response.
|
|
16
7
|
*/
|
|
17
|
-
export const blobSelector = (response) =>
|
|
18
|
-
var _a, _b, _c;
|
|
8
|
+
export const blobSelector = async (response) => {
|
|
19
9
|
if (!response.ok) {
|
|
20
10
|
// Throw an error if the network response is not successful
|
|
21
11
|
throw new Error('network response was not OK');
|
|
@@ -25,17 +15,21 @@ export const blobSelector = (response) => __awaiter(void 0, void 0, void 0, func
|
|
|
25
15
|
throw new Error('no content');
|
|
26
16
|
}
|
|
27
17
|
// Extract the filename from the 'content-disposition' header
|
|
28
|
-
const filename =
|
|
29
|
-
.get('content-disposition')
|
|
18
|
+
const filename = response.headers
|
|
19
|
+
.get('content-disposition')
|
|
20
|
+
?.split(';')
|
|
21
|
+
.find((n) => n.includes('filename='))
|
|
22
|
+
?.replace('filename=', '')
|
|
23
|
+
?.trim();
|
|
30
24
|
try {
|
|
31
25
|
// Convert the response to a Blob and return the filename and Blob
|
|
32
|
-
const blob =
|
|
26
|
+
const blob = await response.blob();
|
|
33
27
|
return { filename, blob };
|
|
34
28
|
}
|
|
35
29
|
catch (err) {
|
|
36
30
|
// Throw an error if there's a problem parsing the response
|
|
37
31
|
throw Error('failed to parse response');
|
|
38
32
|
}
|
|
39
|
-
}
|
|
33
|
+
};
|
|
40
34
|
export default blobSelector;
|
|
41
35
|
//# sourceMappingURL=blob-selector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob-selector.js","sourceRoot":"","sources":["../../../../src/lib/selectors/blob-selector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blob-selector.js","sourceRoot":"","sources":["../../../../src/lib/selectors/blob-selector.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAqB,KAAK,EACjD,QAAmB,EACE,EAAE;IACvB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,2DAA2D;QAC3D,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,0DAA0D;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO;SAC9B,GAAG,CAAC,qBAAqB,CAAC;QAC3B,EAAE,KAAK,CAAC,GAAG,CAAC;SACX,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrC,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,EAAE,IAAI,EAAE,CAAC;IAEX,IAAI,CAAC;QACH,kEAAkE;QAClE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2DAA2D;QAC3D,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { HttpJsonResponseError } from '../../errors';
|
|
11
2
|
/**
|
|
12
3
|
* Asynchronously parses the JSON data from a given HTTP response.
|
|
@@ -22,14 +13,14 @@ import { HttpJsonResponseError } from '../../errors';
|
|
|
22
13
|
* @param response - The HTTP response to parse.
|
|
23
14
|
* @returns A promise that resolves with the parsed JSON data, or rejects with an `HttpJsonResponseError`.
|
|
24
15
|
*/
|
|
25
|
-
export const jsonSelector = (response) =>
|
|
16
|
+
export const jsonSelector = async (response) => {
|
|
26
17
|
/** Status code 204 indicates no content in the response */
|
|
27
18
|
if (response.status === 204) {
|
|
28
19
|
return Promise.resolve();
|
|
29
20
|
}
|
|
30
21
|
try {
|
|
31
22
|
// Parse the response JSON data
|
|
32
|
-
const data =
|
|
23
|
+
const data = await response.json();
|
|
33
24
|
// Check if the response was successful
|
|
34
25
|
if (!response.ok) {
|
|
35
26
|
// Throw an error with the response details
|
|
@@ -46,6 +37,6 @@ export const jsonSelector = (response) => __awaiter(void 0, void 0, void 0, func
|
|
|
46
37
|
// Otherwise, throw a new HttpJsonResponseError with the parsing error
|
|
47
38
|
throw new HttpJsonResponseError('failed to parse response', response, { cause });
|
|
48
39
|
}
|
|
49
|
-
}
|
|
40
|
+
};
|
|
50
41
|
export default jsonSelector;
|
|
51
42
|
//# sourceMappingURL=json-selector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-selector.js","sourceRoot":"","sources":["../../../../src/lib/selectors/json-selector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-selector.js","sourceRoot":"","sources":["../../../../src/lib/selectors/json-selector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAqB,KAAK,EAIjD,QAAmB,EACH,EAAE;IAClB,2DAA2D;IAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,OAAO,EAAoB,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,uCAAuC;QACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,2CAA2C;YAC3C,MAAM,IAAI,qBAAqB,CAAC,6BAA6B,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,sEAAsE;QACtE,MAAM,IAAI,qBAAqB,CAAC,0BAA0B,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { EMPTY, from, fromEvent } from 'rxjs';
|
|
2
|
+
import { finalize, takeUntil } from 'rxjs/operators';
|
|
3
|
+
import { ServerSentEventResponseError } from '../../errors.js';
|
|
4
|
+
const defaultDataParser = (data) => {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(data);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return data;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Parses a string containing Server-Sent Events (SSE) data into individual event objects.
|
|
14
|
+
*
|
|
15
|
+
* @template TData - The type of the parsed `data` field in the event.
|
|
16
|
+
* @param text - The raw SSE data as a string, where events are separated by double newlines.
|
|
17
|
+
* @param options - Optional configuration for parsing the events.
|
|
18
|
+
* @param options.dataParser - A custom parser function for the `data` field. Defaults to JSON parsing,
|
|
19
|
+
* falling back to returning the raw string if parsing fails.
|
|
20
|
+
*
|
|
21
|
+
* @returns A generator that yields `ServerSentEvent` objects parsed from the input string.
|
|
22
|
+
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* - Empty lines and events with no fields are ignored.
|
|
25
|
+
* - If the `data` field cannot be parsed as JSON, it is returned as a plain string.
|
|
26
|
+
* - Fields other than `data` are stored as strings in the resulting `ServerSentEvent` object.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const sseData = `
|
|
31
|
+
* id: 1
|
|
32
|
+
* event: message
|
|
33
|
+
* data: {"key":"value"}
|
|
34
|
+
*
|
|
35
|
+
* id: 2
|
|
36
|
+
* event: update
|
|
37
|
+
* data: plain text
|
|
38
|
+
* `;
|
|
39
|
+
*
|
|
40
|
+
* for (const event of parseEvents(sseData)) {
|
|
41
|
+
* console.log(event);
|
|
42
|
+
* }
|
|
43
|
+
* // Output:
|
|
44
|
+
* // { id: "1", event: "message", data: { key: "value" } }
|
|
45
|
+
* // { id: "2", event: "update", data: "plain text" }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
function* parseEvents(text, options) {
|
|
49
|
+
// Split the input string into individual event strings using double newline as separator
|
|
50
|
+
const eventStrings = text.split('\n\n');
|
|
51
|
+
const dataParser = options?.dataParser || defaultDataParser;
|
|
52
|
+
// Iterate through each event string
|
|
53
|
+
for (const eventStr of eventStrings) {
|
|
54
|
+
// Skip empty event strings (after trimming whitespace)
|
|
55
|
+
if (!eventStr.trim())
|
|
56
|
+
continue;
|
|
57
|
+
// Split the event string into lines (fields) using single newline
|
|
58
|
+
const lines = eventStr.split('\n');
|
|
59
|
+
// Use reduce to process each line in the event string
|
|
60
|
+
const event = lines.reduce((event, line) => {
|
|
61
|
+
// Skip empty lines
|
|
62
|
+
if (!line)
|
|
63
|
+
return event;
|
|
64
|
+
// Find the index of the first colon, which separates field name and value
|
|
65
|
+
const colonIndex = line.indexOf(':');
|
|
66
|
+
// Skip lines without a colon (invalid format)
|
|
67
|
+
if (colonIndex === -1)
|
|
68
|
+
return event;
|
|
69
|
+
// Extract the field name (before colon) and trim whitespace
|
|
70
|
+
const field = line.slice(0, colonIndex).trim();
|
|
71
|
+
// Extract the field value (after colon) and trim whitespace
|
|
72
|
+
const value = line.slice(colonIndex + 1).trim();
|
|
73
|
+
// Handle the 'data' field specially, attempting JSON parsing
|
|
74
|
+
if (field === 'data') {
|
|
75
|
+
event.data = dataParser(value);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// For non-data fields, assign the value as a string to the event object
|
|
79
|
+
event[field] = value;
|
|
80
|
+
}
|
|
81
|
+
return event;
|
|
82
|
+
}, {});
|
|
83
|
+
// Only emit the event to the results if it has at least one field
|
|
84
|
+
if (Object.keys(event).length) {
|
|
85
|
+
yield event;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function* readStream(reader, options) {
|
|
90
|
+
const skipHeartbeats = !!options?.skipHeartbeats;
|
|
91
|
+
const eventFilter = options?.eventFilter
|
|
92
|
+
? Array.isArray(options.eventFilter)
|
|
93
|
+
? options.eventFilter
|
|
94
|
+
: [options.eventFilter]
|
|
95
|
+
: null;
|
|
96
|
+
const decoder = new TextDecoder();
|
|
97
|
+
while (true) {
|
|
98
|
+
const { done, value } = await reader.read();
|
|
99
|
+
if (done) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
const text = decoder.decode(value, { stream: true });
|
|
103
|
+
const events = parseEvents(text, { dataParser: options?.dataParser });
|
|
104
|
+
for (const event of events) {
|
|
105
|
+
if (event.retry) {
|
|
106
|
+
await new Promise((resolve) => setTimeout(resolve, Number.parseInt(event.retry ?? '300', 10)));
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (skipHeartbeats) {
|
|
110
|
+
// Skip comment-based heartbeats (no event, data, or id)
|
|
111
|
+
if (!event.event && !event.data && !event.id) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// Skip named heartbeat events (e.g., event: heartbeat or event: ping)
|
|
115
|
+
if (event.event && ['heartbeat', 'ping'].includes(event.event)) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (!eventFilter || (event.event && eventFilter.includes(event.event))) {
|
|
120
|
+
yield event;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Transforms an SSE response into an Observable stream of parsed events.
|
|
127
|
+
* @param response - The HTTP response with Content-Type: text/event-stream.
|
|
128
|
+
* @param options - Optional configuration for event filtering and heartbeat handling.
|
|
129
|
+
* @param options.eventFilter - Filter events by type (single string or array).
|
|
130
|
+
* @param options.skipHeartbeats - Skip empty/heartbeat events if true.
|
|
131
|
+
* @param options.dataParser - Custom parser for the data field.
|
|
132
|
+
* @param options.abortSignal - Abort signal to cancel the stream.
|
|
133
|
+
* @returns An Observable emitting parsed ServerSentEvent objects.
|
|
134
|
+
* @throws ServerSentEventResponseError if response is invalid or stream fails.
|
|
135
|
+
*/
|
|
136
|
+
export const createSseSelector = (options) => {
|
|
137
|
+
return (response) => {
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw new ServerSentEventResponseError(`HTTP error! Status: ${response.status}`, response);
|
|
140
|
+
}
|
|
141
|
+
if (!response.body) {
|
|
142
|
+
throw new ServerSentEventResponseError('Response body is not readable', response);
|
|
143
|
+
}
|
|
144
|
+
if (!response.headers.get('Content-Type')?.includes('text/event-stream')) {
|
|
145
|
+
throw new ServerSentEventResponseError('Response is not a text/event-stream', response);
|
|
146
|
+
}
|
|
147
|
+
const reader = response.body.getReader();
|
|
148
|
+
return from(readStream(reader, {
|
|
149
|
+
dataParser: options?.dataParser,
|
|
150
|
+
skipHeartbeats: options?.skipHeartbeats,
|
|
151
|
+
eventFilter: options?.eventFilter,
|
|
152
|
+
})).pipe(
|
|
153
|
+
// Stop reading if the abort signal is triggered
|
|
154
|
+
takeUntil(options?.abortSignal ? fromEvent(options.abortSignal, 'abort') : EMPTY), finalize(async () => {
|
|
155
|
+
// cancel just in case of a pre-mature exit
|
|
156
|
+
await reader.cancel().catch(() => {
|
|
157
|
+
/** ignore cancellation errors */
|
|
158
|
+
});
|
|
159
|
+
reader.releaseLock();
|
|
160
|
+
}));
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
export default createSseSelector;
|
|
164
|
+
//# sourceMappingURL=sse-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-selector.js","sourceRoot":"","sources":["../../../../src/lib/selectors/sse-selector.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/module.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
11
2
|
import { HttpClientMsal } from './lib/client';
|
|
12
3
|
import { HttpClientConfigurator, } from './configurator';
|
|
@@ -38,27 +29,27 @@ export const module = {
|
|
|
38
29
|
* @param requireInstance - A function to get an instance of a module.
|
|
39
30
|
* @returns A promise that resolves to the HTTP client provider.
|
|
40
31
|
*/
|
|
41
|
-
initialize:
|
|
32
|
+
initialize: async ({ config, hasModule, requireInstance, }) => {
|
|
42
33
|
const httpProvider = new HttpClientProvider(config);
|
|
43
34
|
if (hasModule('auth')) {
|
|
44
|
-
const authProvider =
|
|
45
|
-
httpProvider.defaultHttpRequestHandler.set('MSAL', (request) =>
|
|
35
|
+
const authProvider = await requireInstance('auth');
|
|
36
|
+
httpProvider.defaultHttpRequestHandler.set('MSAL', async (request) => {
|
|
46
37
|
const { scopes = [] } = request;
|
|
47
38
|
if (scopes.length) {
|
|
48
39
|
/** TODO should be try catch, check caller for handling */
|
|
49
|
-
const token =
|
|
40
|
+
const token = await authProvider.acquireToken({
|
|
50
41
|
scopes,
|
|
51
42
|
});
|
|
52
43
|
if (token) {
|
|
53
44
|
const headers = new Headers(request.headers);
|
|
54
45
|
headers.set('Authorization', `Bearer ${token.accessToken}`);
|
|
55
|
-
return
|
|
46
|
+
return { ...request, headers };
|
|
56
47
|
}
|
|
57
48
|
}
|
|
58
|
-
})
|
|
49
|
+
});
|
|
59
50
|
}
|
|
60
51
|
return httpProvider;
|
|
61
|
-
}
|
|
52
|
+
},
|
|
62
53
|
};
|
|
63
54
|
/**
|
|
64
55
|
* Configures the HTTP module with MSAL authentication.
|
package/dist/esm/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAEL,sBAAsB,GAEvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAA4B,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkC1E;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAmB;IACpC,IAAI,EAAE,MAAM;IACZ;;;;;;;;OAQG;IACH,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,cAAc,CAAC;IAE3D;;;;;;;;;;;OAWG;IACH,UAAU,EAAE,KAAK,EAAE,EACjB,MAAM,EACN,SAAS,EACT,eAAe,GAChB,EAA+C,EAAE;QAChD,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;YACnD,YAAY,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACnE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;gBAChC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,0DAA0D;oBAC1D,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;wBAC5C,MAAM;qBACP,CAAC,CAAC;oBACH,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;wBAC5D,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,SAAyE,EAC9B,EAAE,CAAC,CAAC;IAC/C,MAAM;IACN,SAAS;CACV,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,IAAY,EACZ,IAAuC,EACI,EAAE,CAAC,CAAC;IAC/C,MAAM;IACN,SAAS,EAAE,CAAC,MAAwC,EAAE,EAAE;QACtD,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;CACF,CAAC,CAAC;AAWH,eAAe,MAAM,CAAC"}
|
package/dist/esm/provider.js
CHANGED
|
@@ -27,6 +27,7 @@ const isURL = (url) => {
|
|
|
27
27
|
* It provides methods to check if a client is configured, create new client instances, and create custom client instances.
|
|
28
28
|
*/
|
|
29
29
|
export class HttpClientProvider {
|
|
30
|
+
config;
|
|
30
31
|
/**
|
|
31
32
|
* Gets the default HTTP request handler for the HTTP client provider.
|
|
32
33
|
* @returns The default HTTP request handler.
|
|
@@ -71,7 +72,7 @@ export class HttpClientProvider {
|
|
|
71
72
|
const options = { requestHandler };
|
|
72
73
|
const instance = new ctor(baseUri || '', options);
|
|
73
74
|
Object.assign(instance, { defaultScopes });
|
|
74
|
-
onCreate
|
|
75
|
+
onCreate?.(instance);
|
|
75
76
|
return instance;
|
|
76
77
|
}
|
|
77
78
|
/**
|
package/dist/esm/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;CAAG;AAoCrD;;;;GAIG;AACH,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5B,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,mBAAmB,GAAG,WAAW;QAC/B,mDAAmD,GAAG,cAAc;QACpE,6BAA6B,GAAG,qBAAqB;QACrD,iCAAiC,GAAG,gBAAgB;QACpD,0BAA0B,GAAG,eAAe;QAC5C,oBAAoB,EACtB,GAAG,CACJ,CAAC,CAAC,mBAAmB;IACtB,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;CAAG;AAoCrD;;;;GAIG;AACH,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5B,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,mBAAmB,GAAG,WAAW;QAC/B,mDAAmD,GAAG,cAAc;QACpE,6BAA6B,GAAG,qBAAqB;QACrD,iCAAiC,GAAG,gBAAgB;QACpD,0BAA0B,GAAG,eAAe;QAC5C,oBAAoB,EACtB,GAAG,CACJ,CAAC,CAAC,mBAAmB;IACtB,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAWP;IARtB;;;OAGG;IACH,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC;IAC/C,CAAC;IAED,YAAsB,MAAwC;QAAxC,WAAM,GAAN,MAAM,CAAkC;IAAG,CAAC;IAElE;;;;OAIG;IACI,SAAS,CAAC,GAAW;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACI,YAAY,CAAC,WAAgD;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,EACJ,OAAO,EACP,aAAa,GAAG,EAAE,EAClB,QAAQ,EACR,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,EACxC,cAAc,GAAG,IAAI,CAAC,yBAAyB,GAChD,GAAG,MAAoC,CAAC;QACzC,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAY,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC,QAAmB,CAAC,CAAC;QAChC,OAAO,QAAmB,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;;OAWG;IACI,kBAAkB,CAAuB,GAAW;QACzD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAiB,CAAC;IAChD,CAAC;IAED;;;;;;;;OAQG;IACO,cAAc,CACtB,WAAgD;QAEhD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YAClC,CAAC;iBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,IAAI,uBAAuB,CAAC,sCAAsC,WAAW,GAAG,CAAC,CAAC;YAC1F,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,WAAyC,CAAC;IACnD,CAAC;CACF"}
|
package/dist/esm/version.js
CHANGED