@uengage.io/platform-sdk 0.8.0 → 0.12.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/README.md +94 -44
- package/dist/auth/index.d.ts +13 -3
- package/dist/auth/index.js +18 -5
- package/dist/auth/login.d.ts +30 -0
- package/dist/auth/login.js +36 -0
- package/dist/auth/otp.d.ts +43 -0
- package/dist/auth/otp.js +71 -0
- package/dist/business/client.js +3 -36
- package/dist/business/index.d.ts +1 -1
- package/dist/business/index.js +1 -1
- package/dist/business/schema.d.ts +161 -4
- package/dist/business/schema.js +17 -2
- package/dist/client.d.ts +77 -51
- package/dist/client.js +177 -142
- package/dist/http.d.ts +22 -0
- package/dist/http.js +39 -1
- package/dist/index.d.ts +2 -18
- package/dist/index.js +3 -23
- package/dist/token-source.d.ts +24 -0
- package/dist/token-source.js +65 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/zones/client.d.ts +51 -0
- package/dist/zones/client.js +156 -0
- package/dist/zones/index.d.ts +2 -0
- package/dist/zones/index.js +7 -0
- package/dist/zones/schema.d.ts +104 -0
- package/dist/zones/schema.js +16 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
# @uengage.io/platform-sdk
|
|
2
2
|
|
|
3
|
-
Client SDK for uEngage platform services.
|
|
4
|
-
service domain, configured by environment variables out of the box.
|
|
3
|
+
Client SDK for uEngage platform services. One factory (`createClient`) returns a `PlatformClient` exposing `business`, `audit`, and `auth`. No singletons, no module-level state — each consumer constructs its own client with explicit config.
|
|
5
4
|
|
|
6
5
|
CDK constructs live in a separate package: `@uengage/platform-constructs`.
|
|
7
6
|
|
|
8
7
|
## Quick start
|
|
9
8
|
|
|
10
9
|
```ts
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
//
|
|
10
|
+
import { createClient } from '@uengage.io/platform-sdk';
|
|
11
|
+
|
|
12
|
+
// No args: read everything from UENGAGE_* env vars (baseUrl, service
|
|
13
|
+
// credentials or auth token, etc.). Convenient for Lambdas where the
|
|
14
|
+
// deploy stack already injects the right env.
|
|
15
|
+
const client = createClient();
|
|
16
|
+
|
|
17
|
+
// Or override per call:
|
|
18
|
+
const explicit = createClient({
|
|
19
|
+
baseUrl: 'https://api.platform.uengage.io',
|
|
20
|
+
serviceId: 'my-service',
|
|
21
|
+
serviceSecret: process.env.MY_SERVICE_SECRET!,
|
|
22
|
+
scope: 'business.profile:read business.menu:read',
|
|
23
|
+
actorVia: 'my-service', // stamped into audit events
|
|
24
|
+
});
|
|
15
25
|
|
|
16
|
-
const acme = await business.get(123, { groups: ['profile'
|
|
26
|
+
const acme = await client.business.get(123, { groups: ['profile'] });
|
|
17
27
|
|
|
18
|
-
audit.record({
|
|
28
|
+
client.audit.record({
|
|
19
29
|
event_type: 'business.updated',
|
|
20
30
|
tenant: { id: 'biz_123', parent_id: null },
|
|
21
31
|
actor: { type: 'user', id: 'usr_42' },
|
|
@@ -24,44 +34,58 @@ audit.record({
|
|
|
24
34
|
});
|
|
25
35
|
```
|
|
26
36
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
Both clients read defaults from `process.env`:
|
|
30
|
-
|
|
31
|
-
| Variable | Purpose | Default |
|
|
32
|
-
| ------------------------- | -------------------------------------------- | --------------------------------- |
|
|
33
|
-
| `PLATFORM_BASE_URL` | Platform API base URL | `https://api.platform.uengage.io` |
|
|
34
|
-
| `PLATFORM_SIGNING_SECRET` | Hex HMAC secret for service-to-service calls | none |
|
|
35
|
-
| `PLATFORM_SERVICE_ID` | Caller service id for HMAC | none |
|
|
36
|
-
| `PLATFORM_AUTH_TOKEN` | Bearer token (overrides HMAC if set) | none |
|
|
37
|
+
### Auth modes
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
`createClient` takes exactly one of three auth modes (or none, for fully-public calls). Passing more than one throws `ConfigError`.
|
|
39
40
|
|
|
40
41
|
```ts
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
// Service-to-service (OAuth2 client_credentials)
|
|
43
|
+
createClient({ serviceId: 'svc', serviceSecret: 'sup', scope: '...' });
|
|
44
|
+
|
|
45
|
+
// Static Bearer (caller already minted the token, e.g. a BFF that has
|
|
46
|
+
// the end user's access_token from cookie / session)
|
|
47
|
+
createClient({ authToken: req.headers.authorization!.slice(7) });
|
|
45
48
|
|
|
46
|
-
//
|
|
47
|
-
|
|
49
|
+
// Customer surface: legacy session_token → JWT (transparent rotation)
|
|
50
|
+
createClient({ sessionToken: req.cookies.uengage_session });
|
|
48
51
|
```
|
|
49
52
|
|
|
50
|
-
|
|
53
|
+
Each call returns a fresh, isolated client. Per-request scopes — say a BFF binding to the calling user's token — just call `createClient` again at the start of the handler.
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
import { createBusinessClient, createAuditClient } from '@uengage.io/platform-sdk';
|
|
55
|
+
## Why no singleton?
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
Earlier versions of the SDK exported `platform`, `audit`, and `business` as module-level singletons that read configuration from `process.env`. That shape created problems in Node:
|
|
58
|
+
|
|
59
|
+
- **Module-load side effects.** Importing the SDK eagerly constructed clients even when the caller didn't use them.
|
|
60
|
+
- **Cross-invocation state in Lambda.** A singleton's token cache, JWKS cache, and fetch handle survived across invocations and could leak between tenants.
|
|
61
|
+
- **No multi-tenant story.** A single Node process couldn't act as multiple identities; only one set of `UENGAGE_*` env vars was readable.
|
|
62
|
+
- **First-access config locking.** `process.env` mutated after the first call was a no-op.
|
|
63
|
+
- **Tests needed a `_resetPlatformSingleton()` escape hatch.**
|
|
64
|
+
|
|
65
|
+
Forcing every consumer to call `createClient(...)` removes all of that. Each instance is isolated, configuration is explicit, and the only state is what the caller chose to keep.
|
|
66
|
+
|
|
67
|
+
## Configuration
|
|
68
|
+
|
|
69
|
+
| Field | Env override | Default |
|
|
70
|
+
| --------------------- | -------------------------------- | --------------------------------- |
|
|
71
|
+
| `baseUrl` | `UENGAGE_BASE_URL` | `https://api.platform.uengage.io` |
|
|
72
|
+
| `authBaseUrl` | `UENGAGE_AUTH_BASE_URL` | `${baseUrl}/auth/business` |
|
|
73
|
+
| `customerAuthBaseUrl` | `UENGAGE_CUSTOMER_AUTH_BASE_URL` | `${baseUrl}/auth/customer` |
|
|
74
|
+
| `serviceId` | `UENGAGE_SERVICE_ID` | none |
|
|
75
|
+
| `serviceSecret` | `UENGAGE_SERVICE_SECRET` | none |
|
|
76
|
+
| `scope` | `UENGAGE_SCOPE` | none |
|
|
77
|
+
| `authToken` | `UENGAGE_AUTH_TOKEN` | none |
|
|
78
|
+
| `sessionToken` | `UENGAGE_SESSION_TOKEN` | none |
|
|
79
|
+
| `actorVia` | `UENGAGE_ACTOR_VIA` | falls back to `serviceId` |
|
|
80
|
+
| `expiryBufferMs` | `UENGAGE_EXPIRY_BUFFER_MS` | 30000 |
|
|
81
|
+
| `fetchFn` | (no env override) | `globalThis.fetch` |
|
|
82
|
+
|
|
83
|
+
`createClient()` reads env defaults; explicit fields passed to `createClient(input)` override the matching env value for that one call. Passing **any** auth-mode field explicitly (`authToken`, `sessionToken`, or the `serviceId`/`serviceSecret` pair) suppresses **every** env-derived auth default — so callers never get a silent merge of two different auth modes.
|
|
60
84
|
|
|
61
85
|
## Audit client
|
|
62
86
|
|
|
63
87
|
```ts
|
|
64
|
-
audit.record({
|
|
88
|
+
client.audit.record({
|
|
65
89
|
event_type: 'business.updated',
|
|
66
90
|
tenant: { id: 'biz_123', parent_id: null },
|
|
67
91
|
actor: { type: 'user', id: 'usr_42' },
|
|
@@ -69,31 +93,30 @@ audit.record({
|
|
|
69
93
|
changes: { name: { before: 'Old', after: 'New' } },
|
|
70
94
|
});
|
|
71
95
|
|
|
72
|
-
await audit.flush(); // optional: drain on shutdown
|
|
96
|
+
await client.audit.flush(); // optional: drain on shutdown
|
|
73
97
|
```
|
|
74
98
|
|
|
75
99
|
- `record()` is fire-and-forget. It generates `event_id` (ULID) and
|
|
76
|
-
`occurred_at`, fills `actor.via` with the configured `
|
|
77
|
-
validates the event, and enqueues it. It never throws.
|
|
78
|
-
- Events batch and flush every 5 s (configurable
|
|
79
|
-
or when the batch reaches 50 (`maxBatchSize`).
|
|
80
|
-
- Requests are HMAC-SHA256 signed.
|
|
100
|
+
`occurred_at`, fills `actor.via` with the configured `actorVia` (or
|
|
101
|
+
`serviceId`), validates the event, and enqueues it. It never throws.
|
|
102
|
+
- Events batch and flush every 5 s (configurable) or when the batch reaches 50.
|
|
81
103
|
- Failed batches retry up to 3 times with exponential backoff
|
|
82
104
|
(500 ms / 2 s / 8 s); on final failure the full batch is logged.
|
|
83
105
|
- Queue overflow (default 1000) drops new events with a warning log.
|
|
84
106
|
- `flush()` resolves when the queue is empty or retries are exhausted.
|
|
107
|
+
- If `actorVia` is unset, `record()` logs an error and drops the event.
|
|
85
108
|
|
|
86
109
|
## Business client
|
|
87
110
|
|
|
88
111
|
```ts
|
|
89
|
-
const biz = await business.get(123);
|
|
112
|
+
const biz = await client.business.get(123);
|
|
90
113
|
// { id: 123, parent_id: 42, profile: { name: 'Acme' } }
|
|
91
114
|
|
|
92
|
-
const detailed = await business.get(123, {
|
|
115
|
+
const detailed = await client.business.get(123, {
|
|
93
116
|
groups: ['profile', 'gst', 'payment_gateway'],
|
|
94
117
|
});
|
|
95
118
|
|
|
96
|
-
const many = await business.bulk([123, 124], { groups: ['profile'] });
|
|
119
|
+
const many = await client.business.bulk([123, 124], { groups: ['profile'] });
|
|
97
120
|
```
|
|
98
121
|
|
|
99
122
|
- `get()` returns the record or throws `BusinessApiError` (with `.status` and `.body`).
|
|
@@ -101,6 +124,33 @@ const many = await business.bulk([123, 124], { groups: ['profile'] });
|
|
|
101
124
|
- The `profile` group (just `name`) is public; other groups need
|
|
102
125
|
matching `business.<group>:read` capability for the calling service id.
|
|
103
126
|
|
|
127
|
+
## Auth helpers
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
import { auth } from '@uengage.io/platform-sdk';
|
|
131
|
+
// or: client.auth.* — same namespace either way (stateless functions)
|
|
132
|
+
|
|
133
|
+
const pkce = auth.generatePKCE();
|
|
134
|
+
const url = auth.createAuthorizeUrl({
|
|
135
|
+
authBaseUrl: 'https://api.platform.uengage.io/auth/business',
|
|
136
|
+
clientId: 'my-app',
|
|
137
|
+
redirectUri: 'https://my-app.example/cb',
|
|
138
|
+
tenant: 'demo-tenant',
|
|
139
|
+
codeChallenge: pkce.code_challenge,
|
|
140
|
+
state: 'csrf-state',
|
|
141
|
+
});
|
|
142
|
+
// browser navigates to `url`; on callback, exchange the code:
|
|
143
|
+
const tokens = await auth.exchangeCode({
|
|
144
|
+
authBaseUrl: 'https://api.platform.uengage.io/auth/business',
|
|
145
|
+
code: 'returned-code',
|
|
146
|
+
codeVerifier: pkce.code_verifier,
|
|
147
|
+
clientId: 'my-app',
|
|
148
|
+
redirectUri: 'https://my-app.example/cb',
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`auth` exports stateless helpers; you can import the namespace directly or reach it via any client (`client.auth`). The same object is reused across clients because there's no state to isolate.
|
|
153
|
+
|
|
104
154
|
## Build / test
|
|
105
155
|
|
|
106
156
|
```bash
|
|
@@ -114,5 +164,5 @@ The package publishes on a `platform-sdk-vX.Y.Z` tag push. To cut a release:
|
|
|
114
164
|
|
|
115
165
|
1. Bump `version` in `package.json`.
|
|
116
166
|
2. Open a PR; merge.
|
|
117
|
-
3. Tag `platform-sdk-vX.Y.Z` on `main` and push
|
|
167
|
+
3. Tag `platform-sdk-vX.Y.Z` on `main` and push — the publish workflow runs
|
|
118
168
|
`pnpm publish --filter @uengage.io/platform-sdk --access public`.
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -10,16 +10,23 @@ export { exchangeCode, parseTokenResponse, type ExchangeCodeInput, type TokenPai
|
|
|
10
10
|
export { refresh, type RefreshInput } from './refresh';
|
|
11
11
|
export { verifyAccessToken } from './verify';
|
|
12
12
|
export { getIssuer, getExpiry } from './issuer';
|
|
13
|
+
export { loginWithPassword, type LoginWithPasswordInput } from './login';
|
|
14
|
+
export { requestOtp, verifyOtp, type RequestOtpInput, type RequestOtpResult, type VerifyOtpInput, } from './otp';
|
|
13
15
|
import { generatePKCE } from './pkce';
|
|
14
16
|
import { createAuthorizeUrl } from './authorize-url';
|
|
15
17
|
import { exchangeCode } from './exchange-code';
|
|
16
18
|
import { refresh } from './refresh';
|
|
17
19
|
import { verifyAccessToken } from './verify';
|
|
18
20
|
import { getIssuer, getExpiry } from './issuer';
|
|
21
|
+
import { loginWithPassword } from './login';
|
|
22
|
+
import { requestOtp, verifyOtp } from './otp';
|
|
19
23
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
24
|
+
* Convenience namespace: stateless helpers grouped under one symbol.
|
|
25
|
+
* Identical to the named exports above; importing the namespace lets
|
|
26
|
+
* callers write `client.auth.refresh(...)` (it's exposed on the
|
|
27
|
+
* `PlatformClient` instance returned by `createClient(...)`) or
|
|
28
|
+
* `auth.generatePKCE()` from a top-level import. No mutable state, so
|
|
29
|
+
* sharing this object across clients is safe.
|
|
23
30
|
*/
|
|
24
31
|
export declare const auth: {
|
|
25
32
|
generatePKCE: typeof generatePKCE;
|
|
@@ -29,4 +36,7 @@ export declare const auth: {
|
|
|
29
36
|
verifyAccessToken: typeof verifyAccessToken;
|
|
30
37
|
getIssuer: typeof getIssuer;
|
|
31
38
|
getExpiry: typeof getExpiry;
|
|
39
|
+
loginWithPassword: typeof loginWithPassword;
|
|
40
|
+
requestOtp: typeof requestOtp;
|
|
41
|
+
verifyOtp: typeof verifyOtp;
|
|
32
42
|
};
|
package/dist/auth/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.auth = exports.getExpiry = exports.getIssuer = exports.verifyAccessToken = exports.refresh = exports.parseTokenResponse = exports.exchangeCode = exports.createAuthorizeUrl = exports.generatePKCE = void 0;
|
|
3
|
+
exports.auth = exports.verifyOtp = exports.requestOtp = exports.loginWithPassword = exports.getExpiry = exports.getIssuer = exports.verifyAccessToken = exports.refresh = exports.parseTokenResponse = exports.exchangeCode = exports.createAuthorizeUrl = exports.generatePKCE = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Auth namespace: helpers for OAuth2 flows against the platform's
|
|
6
6
|
* `/auth/business/*` surface. Consumers don't bake a `client_id` into
|
|
@@ -21,16 +21,26 @@ Object.defineProperty(exports, "verifyAccessToken", { enumerable: true, get: fun
|
|
|
21
21
|
var issuer_1 = require("./issuer");
|
|
22
22
|
Object.defineProperty(exports, "getIssuer", { enumerable: true, get: function () { return issuer_1.getIssuer; } });
|
|
23
23
|
Object.defineProperty(exports, "getExpiry", { enumerable: true, get: function () { return issuer_1.getExpiry; } });
|
|
24
|
+
var login_1 = require("./login");
|
|
25
|
+
Object.defineProperty(exports, "loginWithPassword", { enumerable: true, get: function () { return login_1.loginWithPassword; } });
|
|
26
|
+
var otp_1 = require("./otp");
|
|
27
|
+
Object.defineProperty(exports, "requestOtp", { enumerable: true, get: function () { return otp_1.requestOtp; } });
|
|
28
|
+
Object.defineProperty(exports, "verifyOtp", { enumerable: true, get: function () { return otp_1.verifyOtp; } });
|
|
24
29
|
const pkce_2 = require("./pkce");
|
|
25
30
|
const authorize_url_2 = require("./authorize-url");
|
|
26
31
|
const exchange_code_2 = require("./exchange-code");
|
|
27
32
|
const refresh_2 = require("./refresh");
|
|
28
33
|
const verify_2 = require("./verify");
|
|
29
34
|
const issuer_2 = require("./issuer");
|
|
35
|
+
const login_2 = require("./login");
|
|
36
|
+
const otp_2 = require("./otp");
|
|
30
37
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
38
|
+
* Convenience namespace: stateless helpers grouped under one symbol.
|
|
39
|
+
* Identical to the named exports above; importing the namespace lets
|
|
40
|
+
* callers write `client.auth.refresh(...)` (it's exposed on the
|
|
41
|
+
* `PlatformClient` instance returned by `createClient(...)`) or
|
|
42
|
+
* `auth.generatePKCE()` from a top-level import. No mutable state, so
|
|
43
|
+
* sharing this object across clients is safe.
|
|
34
44
|
*/
|
|
35
45
|
exports.auth = {
|
|
36
46
|
generatePKCE: pkce_2.generatePKCE,
|
|
@@ -40,5 +50,8 @@ exports.auth = {
|
|
|
40
50
|
verifyAccessToken: verify_2.verifyAccessToken,
|
|
41
51
|
getIssuer: issuer_2.getIssuer,
|
|
42
52
|
getExpiry: issuer_2.getExpiry,
|
|
53
|
+
loginWithPassword: login_2.loginWithPassword,
|
|
54
|
+
requestOtp: otp_2.requestOtp,
|
|
55
|
+
verifyOtp: otp_2.verifyOtp,
|
|
43
56
|
};
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7R0FLRztBQUNILCtCQUFxRDtBQUE1QyxvR0FBQSxZQUFZLE9BQUE7QUFDckIsaURBQTZFO0FBQXBFLG1IQUFBLGtCQUFrQixPQUFBO0FBQzNCLGlEQUt5QjtBQUp2Qiw2R0FBQSxZQUFZLE9BQUE7QUFDWixtSEFBQSxrQkFBa0IsT0FBQTtBQUlwQixxQ0FBdUQ7QUFBOUMsa0dBQUEsT0FBTyxPQUFBO0FBQ2hCLG1DQUE2QztBQUFwQywyR0FBQSxpQkFBaUIsT0FBQTtBQUMxQixtQ0FBZ0Q7QUFBdkMsbUdBQUEsU0FBUyxPQUFBO0FBQUUsbUdBQUEsU0FBUyxPQUFBO0FBQzdCLGlDQUF5RTtBQUFoRSwwR0FBQSxpQkFBaUIsT0FBQTtBQUMxQiw2QkFNZTtBQUxiLGlHQUFBLFVBQVUsT0FBQTtBQUNWLGdHQUFBLFNBQVMsT0FBQTtBQU1YLGlDQUFzQztBQUN0QyxtREFBcUQ7QUFDckQsbURBQStDO0FBQy9DLHVDQUFvQztBQUNwQyxxQ0FBNkM7QUFDN0MscUNBQWdEO0FBQ2hELG1DQUE0QztBQUM1QywrQkFBOEM7QUFFOUM7Ozs7Ozs7R0FPRztBQUNVLFFBQUEsSUFBSSxHQUFHO0lBQ2xCLFlBQVksRUFBWixtQkFBWTtJQUNaLGtCQUFrQixFQUFsQixrQ0FBa0I7SUFDbEIsWUFBWSxFQUFaLDRCQUFZO0lBQ1osT0FBTyxFQUFQLGlCQUFPO0lBQ1AsaUJBQWlCLEVBQWpCLDBCQUFpQjtJQUNqQixTQUFTLEVBQVQsa0JBQVM7SUFDVCxTQUFTLEVBQVQsa0JBQVM7SUFDVCxpQkFBaUIsRUFBakIseUJBQWlCO0lBQ2pCLFVBQVUsRUFBVixnQkFBVTtJQUNWLFNBQVMsRUFBVCxlQUFTO0NBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aCBuYW1lc3BhY2U6IGhlbHBlcnMgZm9yIE9BdXRoMiBmbG93cyBhZ2FpbnN0IHRoZSBwbGF0Zm9ybSdzXG4gKiBgL2F1dGgvYnVzaW5lc3MvKmAgc3VyZmFjZS4gQ29uc3VtZXJzIGRvbid0IGJha2UgYSBgY2xpZW50X2lkYCBpbnRvXG4gKiB0aGUgU0RLIGl0c2VsZiDigJQgZXZlcnkgaGVscGVyIHRha2VzIHBhcmFtZXRlcnMgZXhwbGljaXRseSBzbyBtdWx0aXBsZVxuICogT0F1dGggY2xpZW50cyAoZGFzaGJvYXJkLCBtb2JpbGUsIEJGRnMpIGNhbiBzaGFyZSBvbmUgU0RLIGluc3RhbGwuXG4gKi9cbmV4cG9ydCB7IGdlbmVyYXRlUEtDRSwgdHlwZSBQa2NlUGFpciB9IGZyb20gJy4vcGtjZSc7XG5leHBvcnQgeyBjcmVhdGVBdXRob3JpemVVcmwsIHR5cGUgQXV0aG9yaXplVXJsSW5wdXQgfSBmcm9tICcuL2F1dGhvcml6ZS11cmwnO1xuZXhwb3J0IHtcbiAgZXhjaGFuZ2VDb2RlLFxuICBwYXJzZVRva2VuUmVzcG9uc2UsXG4gIHR5cGUgRXhjaGFuZ2VDb2RlSW5wdXQsXG4gIHR5cGUgVG9rZW5QYWlyLFxufSBmcm9tICcuL2V4Y2hhbmdlLWNvZGUnO1xuZXhwb3J0IHsgcmVmcmVzaCwgdHlwZSBSZWZyZXNoSW5wdXQgfSBmcm9tICcuL3JlZnJlc2gnO1xuZXhwb3J0IHsgdmVyaWZ5QWNjZXNzVG9rZW4gfSBmcm9tICcuL3ZlcmlmeSc7XG5leHBvcnQgeyBnZXRJc3N1ZXIsIGdldEV4cGlyeSB9IGZyb20gJy4vaXNzdWVyJztcbmV4cG9ydCB7IGxvZ2luV2l0aFBhc3N3b3JkLCB0eXBlIExvZ2luV2l0aFBhc3N3b3JkSW5wdXQgfSBmcm9tICcuL2xvZ2luJztcbmV4cG9ydCB7XG4gIHJlcXVlc3RPdHAsXG4gIHZlcmlmeU90cCxcbiAgdHlwZSBSZXF1ZXN0T3RwSW5wdXQsXG4gIHR5cGUgUmVxdWVzdE90cFJlc3VsdCxcbiAgdHlwZSBWZXJpZnlPdHBJbnB1dCxcbn0gZnJvbSAnLi9vdHAnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVBLQ0UgfSBmcm9tICcuL3BrY2UnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aG9yaXplVXJsIH0gZnJvbSAnLi9hdXRob3JpemUtdXJsJztcbmltcG9ydCB7IGV4Y2hhbmdlQ29kZSB9IGZyb20gJy4vZXhjaGFuZ2UtY29kZSc7XG5pbXBvcnQgeyByZWZyZXNoIH0gZnJvbSAnLi9yZWZyZXNoJztcbmltcG9ydCB7IHZlcmlmeUFjY2Vzc1Rva2VuIH0gZnJvbSAnLi92ZXJpZnknO1xuaW1wb3J0IHsgZ2V0SXNzdWVyLCBnZXRFeHBpcnkgfSBmcm9tICcuL2lzc3Vlcic7XG5pbXBvcnQgeyBsb2dpbldpdGhQYXNzd29yZCB9IGZyb20gJy4vbG9naW4nO1xuaW1wb3J0IHsgcmVxdWVzdE90cCwgdmVyaWZ5T3RwIH0gZnJvbSAnLi9vdHAnO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIG5hbWVzcGFjZTogc3RhdGVsZXNzIGhlbHBlcnMgZ3JvdXBlZCB1bmRlciBvbmUgc3ltYm9sLlxuICogSWRlbnRpY2FsIHRvIHRoZSBuYW1lZCBleHBvcnRzIGFib3ZlOyBpbXBvcnRpbmcgdGhlIG5hbWVzcGFjZSBsZXRzXG4gKiBjYWxsZXJzIHdyaXRlIGBjbGllbnQuYXV0aC5yZWZyZXNoKC4uLilgIChpdCdzIGV4cG9zZWQgb24gdGhlXG4gKiBgUGxhdGZvcm1DbGllbnRgIGluc3RhbmNlIHJldHVybmVkIGJ5IGBjcmVhdGVDbGllbnQoLi4uKWApIG9yXG4gKiBgYXV0aC5nZW5lcmF0ZVBLQ0UoKWAgZnJvbSBhIHRvcC1sZXZlbCBpbXBvcnQuIE5vIG11dGFibGUgc3RhdGUsIHNvXG4gKiBzaGFyaW5nIHRoaXMgb2JqZWN0IGFjcm9zcyBjbGllbnRzIGlzIHNhZmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhdXRoID0ge1xuICBnZW5lcmF0ZVBLQ0UsXG4gIGNyZWF0ZUF1dGhvcml6ZVVybCxcbiAgZXhjaGFuZ2VDb2RlLFxuICByZWZyZXNoLFxuICB2ZXJpZnlBY2Nlc3NUb2tlbixcbiAgZ2V0SXNzdWVyLFxuICBnZXRFeHBpcnksXG4gIGxvZ2luV2l0aFBhc3N3b3JkLFxuICByZXF1ZXN0T3RwLFxuICB2ZXJpZnlPdHAsXG59O1xuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type TokenPair } from './exchange-code';
|
|
2
|
+
export interface LoginWithPasswordInput {
|
|
3
|
+
/** Defaults to `https://api.platform.uengage.io/auth/business`. */
|
|
4
|
+
authBaseUrl?: string;
|
|
5
|
+
email: string;
|
|
6
|
+
password: string;
|
|
7
|
+
/** OAuth client_id. Must be a `firstParty: true` registry entry. */
|
|
8
|
+
clientId: string;
|
|
9
|
+
/**
|
|
10
|
+
* Optional client_secret. Public clients (SPA / mobile) can omit it;
|
|
11
|
+
* the `firstParty` flag in the auth registry is the gate. Backend
|
|
12
|
+
* services that hold a secret should pass it for defense-in-depth.
|
|
13
|
+
*/
|
|
14
|
+
clientSecret?: string;
|
|
15
|
+
/** Space-separated scope list; intersected with the client's allowed scopes. */
|
|
16
|
+
scope?: string;
|
|
17
|
+
fetchFn?: typeof fetch;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Direct email + password login (OAuth2 Resource Owner Password
|
|
21
|
+
* Credentials grant). Returns the standard `TokenPair`; pass
|
|
22
|
+
* `tokens.accessToken` to `createClient({ authToken })` to get a
|
|
23
|
+
* client bound to the user, or hand the refresh token to the caller's
|
|
24
|
+
* own session-store and use `auth.refresh(...)` later.
|
|
25
|
+
*
|
|
26
|
+
* Restricted server-side to first-party clients — partner integrations
|
|
27
|
+
* must use `authorization_code` + PKCE and route the user through the
|
|
28
|
+
* platform's own login UI.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loginWithPassword(input: LoginWithPasswordInput): Promise<TokenPair>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loginWithPassword = loginWithPassword;
|
|
4
|
+
const exchange_code_1 = require("./exchange-code");
|
|
5
|
+
const DEFAULT_AUTH_BASE_URL = 'https://api.platform.uengage.io/auth/business';
|
|
6
|
+
/**
|
|
7
|
+
* Direct email + password login (OAuth2 Resource Owner Password
|
|
8
|
+
* Credentials grant). Returns the standard `TokenPair`; pass
|
|
9
|
+
* `tokens.accessToken` to `createClient({ authToken })` to get a
|
|
10
|
+
* client bound to the user, or hand the refresh token to the caller's
|
|
11
|
+
* own session-store and use `auth.refresh(...)` later.
|
|
12
|
+
*
|
|
13
|
+
* Restricted server-side to first-party clients — partner integrations
|
|
14
|
+
* must use `authorization_code` + PKCE and route the user through the
|
|
15
|
+
* platform's own login UI.
|
|
16
|
+
*/
|
|
17
|
+
async function loginWithPassword(input) {
|
|
18
|
+
const body = new URLSearchParams({
|
|
19
|
+
grant_type: 'password',
|
|
20
|
+
username: input.email,
|
|
21
|
+
password: input.password,
|
|
22
|
+
client_id: input.clientId,
|
|
23
|
+
});
|
|
24
|
+
if (input.clientSecret)
|
|
25
|
+
body.set('client_secret', input.clientSecret);
|
|
26
|
+
if (input.scope)
|
|
27
|
+
body.set('scope', input.scope);
|
|
28
|
+
const fetchFn = input.fetchFn ?? globalThis.fetch;
|
|
29
|
+
const res = await fetchFn(`${input.authBaseUrl ?? DEFAULT_AUTH_BASE_URL}/oauth/token`, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
32
|
+
body: body.toString(),
|
|
33
|
+
});
|
|
34
|
+
return (0, exchange_code_1.parseTokenResponse)(res);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9sb2dpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWlDQSw4Q0FpQkM7QUFsREQsbURBQXFFO0FBb0JyRSxNQUFNLHFCQUFxQixHQUFHLCtDQUErQyxDQUFDO0FBRTlFOzs7Ozs7Ozs7O0dBVUc7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsS0FBNkI7SUFDbkUsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUM7UUFDL0IsVUFBVSxFQUFFLFVBQVU7UUFDdEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ3JCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxLQUFLLENBQUMsWUFBWTtRQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0RSxJQUFJLEtBQUssQ0FBQyxLQUFLO1FBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWhELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUssVUFBVSxDQUFDLEtBQXNCLENBQUM7SUFDcEUsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLHFCQUFxQixjQUFjLEVBQUU7UUFDckYsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsbUNBQW1DLEVBQUU7UUFDaEUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFBLGtDQUFrQixFQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJzZVRva2VuUmVzcG9uc2UsIHR5cGUgVG9rZW5QYWlyIH0gZnJvbSAnLi9leGNoYW5nZS1jb2RlJztcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpbldpdGhQYXNzd29yZElucHV0IHtcbiAgLyoqIERlZmF1bHRzIHRvIGBodHRwczovL2FwaS5wbGF0Zm9ybS51ZW5nYWdlLmlvL2F1dGgvYnVzaW5lc3NgLiAqL1xuICBhdXRoQmFzZVVybD86IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgLyoqIE9BdXRoIGNsaWVudF9pZC4gTXVzdCBiZSBhIGBmaXJzdFBhcnR5OiB0cnVlYCByZWdpc3RyeSBlbnRyeS4gKi9cbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNsaWVudF9zZWNyZXQuIFB1YmxpYyBjbGllbnRzIChTUEEgLyBtb2JpbGUpIGNhbiBvbWl0IGl0O1xuICAgKiB0aGUgYGZpcnN0UGFydHlgIGZsYWcgaW4gdGhlIGF1dGggcmVnaXN0cnkgaXMgdGhlIGdhdGUuIEJhY2tlbmRcbiAgICogc2VydmljZXMgdGhhdCBob2xkIGEgc2VjcmV0IHNob3VsZCBwYXNzIGl0IGZvciBkZWZlbnNlLWluLWRlcHRoLlxuICAgKi9cbiAgY2xpZW50U2VjcmV0Pzogc3RyaW5nO1xuICAvKiogU3BhY2Utc2VwYXJhdGVkIHNjb3BlIGxpc3Q7IGludGVyc2VjdGVkIHdpdGggdGhlIGNsaWVudCdzIGFsbG93ZWQgc2NvcGVzLiAqL1xuICBzY29wZT86IHN0cmluZztcbiAgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaDtcbn1cblxuY29uc3QgREVGQVVMVF9BVVRIX0JBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW8vYXV0aC9idXNpbmVzcyc7XG5cbi8qKlxuICogRGlyZWN0IGVtYWlsICsgcGFzc3dvcmQgbG9naW4gKE9BdXRoMiBSZXNvdXJjZSBPd25lciBQYXNzd29yZFxuICogQ3JlZGVudGlhbHMgZ3JhbnQpLiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBgVG9rZW5QYWlyYDsgcGFzc1xuICogYHRva2Vucy5hY2Nlc3NUb2tlbmAgdG8gYGNyZWF0ZUNsaWVudCh7IGF1dGhUb2tlbiB9KWAgdG8gZ2V0IGFcbiAqIGNsaWVudCBib3VuZCB0byB0aGUgdXNlciwgb3IgaGFuZCB0aGUgcmVmcmVzaCB0b2tlbiB0byB0aGUgY2FsbGVyJ3NcbiAqIG93biBzZXNzaW9uLXN0b3JlIGFuZCB1c2UgYGF1dGgucmVmcmVzaCguLi4pYCBsYXRlci5cbiAqXG4gKiBSZXN0cmljdGVkIHNlcnZlci1zaWRlIHRvIGZpcnN0LXBhcnR5IGNsaWVudHMg4oCUIHBhcnRuZXIgaW50ZWdyYXRpb25zXG4gKiBtdXN0IHVzZSBgYXV0aG9yaXphdGlvbl9jb2RlYCArIFBLQ0UgYW5kIHJvdXRlIHRoZSB1c2VyIHRocm91Z2ggdGhlXG4gKiBwbGF0Zm9ybSdzIG93biBsb2dpbiBVSS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ2luV2l0aFBhc3N3b3JkKGlucHV0OiBMb2dpbldpdGhQYXNzd29yZElucHV0KTogUHJvbWlzZTxUb2tlblBhaXI+IHtcbiAgY29uc3QgYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXG4gICAgdXNlcm5hbWU6IGlucHV0LmVtYWlsLFxuICAgIHBhc3N3b3JkOiBpbnB1dC5wYXNzd29yZCxcbiAgICBjbGllbnRfaWQ6IGlucHV0LmNsaWVudElkLFxuICB9KTtcbiAgaWYgKGlucHV0LmNsaWVudFNlY3JldCkgYm9keS5zZXQoJ2NsaWVudF9zZWNyZXQnLCBpbnB1dC5jbGllbnRTZWNyZXQpO1xuICBpZiAoaW5wdXQuc2NvcGUpIGJvZHkuc2V0KCdzY29wZScsIGlucHV0LnNjb3BlKTtcblxuICBjb25zdCBmZXRjaEZuID0gaW5wdXQuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpO1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaEZuKGAke2lucHV0LmF1dGhCYXNlVXJsID8/IERFRkFVTFRfQVVUSF9CQVNFX1VSTH0vb2F1dGgvdG9rZW5gLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gIH0pO1xuICByZXR1cm4gcGFyc2VUb2tlblJlc3BvbnNlKHJlcyk7XG59XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type TokenPair } from './exchange-code';
|
|
2
|
+
export interface RequestOtpInput {
|
|
3
|
+
/** Defaults to `https://api.platform.uengage.io/auth/customer`. */
|
|
4
|
+
customerAuthBaseUrl?: string;
|
|
5
|
+
phone: string;
|
|
6
|
+
/** uEngage business id; the OTP is bound to this (phone, businessId) pair. */
|
|
7
|
+
businessId: number;
|
|
8
|
+
fetchFn?: typeof fetch;
|
|
9
|
+
}
|
|
10
|
+
export interface RequestOtpResult {
|
|
11
|
+
requestId: string;
|
|
12
|
+
/** Seconds until the OTP expires server-side. Typically 300 (5 min). */
|
|
13
|
+
expiresIn: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Step 1 of the customer OTP login. Asks the auth surface to mint an
|
|
17
|
+
* OTP, persist it bound to (phone, businessId), and emit it for SMS
|
|
18
|
+
* delivery via the SMS-team subscriber. The plaintext OTP never
|
|
19
|
+
* appears in the response — the SMS team is the side channel.
|
|
20
|
+
*
|
|
21
|
+
* Throws on rate-limit (429), unknown phone-business pair (400), and
|
|
22
|
+
* other non-200 responses.
|
|
23
|
+
*/
|
|
24
|
+
export declare function requestOtp(input: RequestOtpInput): Promise<RequestOtpResult>;
|
|
25
|
+
export interface VerifyOtpInput {
|
|
26
|
+
/** Defaults to `https://api.platform.uengage.io/auth/customer`. */
|
|
27
|
+
customerAuthBaseUrl?: string;
|
|
28
|
+
phone: string;
|
|
29
|
+
otp: string;
|
|
30
|
+
/** Returned by `requestOtp(...)`. */
|
|
31
|
+
requestId: string;
|
|
32
|
+
fetchFn?: typeof fetch;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Step 2 of the customer OTP login. Exchanges the (phone, otp,
|
|
36
|
+
* requestId) triple for an access + refresh pair. Returns the same
|
|
37
|
+
* `TokenPair` shape as the other login flows; pass
|
|
38
|
+
* `tokens.accessToken` into `createClient({ authToken })`.
|
|
39
|
+
*
|
|
40
|
+
* Throws `AuthenticationError` on `invalid_grant` (wrong OTP, expired,
|
|
41
|
+
* locked after too many attempts, or already consumed).
|
|
42
|
+
*/
|
|
43
|
+
export declare function verifyOtp(input: VerifyOtpInput): Promise<TokenPair>;
|
package/dist/auth/otp.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requestOtp = requestOtp;
|
|
4
|
+
exports.verifyOtp = verifyOtp;
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
const exchange_code_1 = require("./exchange-code");
|
|
7
|
+
const DEFAULT_CUSTOMER_AUTH_BASE_URL = 'https://api.platform.uengage.io/auth/customer';
|
|
8
|
+
/**
|
|
9
|
+
* Step 1 of the customer OTP login. Asks the auth surface to mint an
|
|
10
|
+
* OTP, persist it bound to (phone, businessId), and emit it for SMS
|
|
11
|
+
* delivery via the SMS-team subscriber. The plaintext OTP never
|
|
12
|
+
* appears in the response — the SMS team is the side channel.
|
|
13
|
+
*
|
|
14
|
+
* Throws on rate-limit (429), unknown phone-business pair (400), and
|
|
15
|
+
* other non-200 responses.
|
|
16
|
+
*/
|
|
17
|
+
async function requestOtp(input) {
|
|
18
|
+
const fetchFn = input.fetchFn ?? globalThis.fetch;
|
|
19
|
+
const res = await fetchFn(`${input.customerAuthBaseUrl ?? DEFAULT_CUSTOMER_AUTH_BASE_URL}/otp/request`, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: { 'content-type': 'application/json' },
|
|
22
|
+
body: JSON.stringify({ phone: input.phone, businessId: input.businessId }),
|
|
23
|
+
});
|
|
24
|
+
let body;
|
|
25
|
+
try {
|
|
26
|
+
body = (await res.json());
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
throw new errors_1.PlatformError(`auth server returned non-JSON: HTTP ${res.status}`, {
|
|
30
|
+
status: res.status,
|
|
31
|
+
cause: err,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
const error = typeof body.error === 'string' ? body.error : 'otp_request_failed';
|
|
36
|
+
const description = typeof body.error_description === 'string' ? body.error_description : undefined;
|
|
37
|
+
if (res.status === 401) {
|
|
38
|
+
throw new errors_1.AuthenticationError(description ?? error, { cause: body });
|
|
39
|
+
}
|
|
40
|
+
throw new errors_1.PlatformError(description ?? error, { status: res.status, cause: body });
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
requestId: String(body.requestId ?? ''),
|
|
44
|
+
expiresIn: Number(body.expiresIn ?? 0),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Step 2 of the customer OTP login. Exchanges the (phone, otp,
|
|
49
|
+
* requestId) triple for an access + refresh pair. Returns the same
|
|
50
|
+
* `TokenPair` shape as the other login flows; pass
|
|
51
|
+
* `tokens.accessToken` into `createClient({ authToken })`.
|
|
52
|
+
*
|
|
53
|
+
* Throws `AuthenticationError` on `invalid_grant` (wrong OTP, expired,
|
|
54
|
+
* locked after too many attempts, or already consumed).
|
|
55
|
+
*/
|
|
56
|
+
async function verifyOtp(input) {
|
|
57
|
+
const body = new URLSearchParams({
|
|
58
|
+
grant_type: 'otp',
|
|
59
|
+
request_id: input.requestId,
|
|
60
|
+
otp: input.otp,
|
|
61
|
+
phone: input.phone,
|
|
62
|
+
});
|
|
63
|
+
const fetchFn = input.fetchFn ?? globalThis.fetch;
|
|
64
|
+
const res = await fetchFn(`${input.customerAuthBaseUrl ?? DEFAULT_CUSTOMER_AUTH_BASE_URL}/oauth/token`, {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
67
|
+
body: body.toString(),
|
|
68
|
+
});
|
|
69
|
+
return (0, exchange_code_1.parseTokenResponse)(res);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvb3RwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkJBLGdDQWlDQztBQXFCRCw4QkFpQkM7QUFwR0Qsc0NBQStEO0FBQy9ELG1EQUFxRTtBQUVyRSxNQUFNLDhCQUE4QixHQUFHLCtDQUErQyxDQUFDO0FBaUJ2Rjs7Ozs7Ozs7R0FRRztBQUNJLEtBQUssVUFBVSxVQUFVLENBQUMsS0FBc0I7SUFDckQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSyxVQUFVLENBQUMsS0FBc0IsQ0FBQztJQUNwRSxNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FDdkIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLElBQUksOEJBQThCLGNBQWMsRUFDNUU7UUFDRSxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDM0UsQ0FDRixDQUFDO0lBRUYsSUFBSSxJQUE2QixDQUFDO0lBQ2xDLElBQUksQ0FBQztRQUNILElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUE0QixDQUFDO0lBQ3ZELENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLHNCQUFhLENBQUMsdUNBQXVDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMzRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDbEIsS0FBSyxFQUFFLEdBQUc7U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNaLE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO1FBQ2pGLE1BQU0sV0FBVyxHQUNmLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbEYsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSw0QkFBbUIsQ0FBQyxXQUFXLElBQUksS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE1BQU0sSUFBSSxzQkFBYSxDQUFDLFdBQVcsSUFBSSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0QsT0FBTztRQUNMLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDdkMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztLQUN2QyxDQUFDO0FBQ0osQ0FBQztBQVlEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxLQUFxQjtJQUNuRCxNQUFNLElBQUksR0FBRyxJQUFJLGVBQWUsQ0FBQztRQUMvQixVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDM0IsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO0tBQ25CLENBQUMsQ0FBQztJQUNILE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUssVUFBVSxDQUFDLEtBQXNCLENBQUM7SUFDcEUsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQ3ZCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixJQUFJLDhCQUE4QixjQUFjLEVBQzVFO1FBQ0UsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsbUNBQW1DLEVBQUU7UUFDaEUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7S0FDdEIsQ0FDRixDQUFDO0lBQ0YsT0FBTyxJQUFBLGtDQUFrQixFQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGlvbkVycm9yLCBQbGF0Zm9ybUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlVG9rZW5SZXNwb25zZSwgdHlwZSBUb2tlblBhaXIgfSBmcm9tICcuL2V4Y2hhbmdlLWNvZGUnO1xuXG5jb25zdCBERUZBVUxUX0NVU1RPTUVSX0FVVEhfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pby9hdXRoL2N1c3RvbWVyJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3RwSW5wdXQge1xuICAvKiogRGVmYXVsdHMgdG8gYGh0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW8vYXV0aC9jdXN0b21lcmAuICovXG4gIGN1c3RvbWVyQXV0aEJhc2VVcmw/OiBzdHJpbmc7XG4gIHBob25lOiBzdHJpbmc7XG4gIC8qKiB1RW5nYWdlIGJ1c2luZXNzIGlkOyB0aGUgT1RQIGlzIGJvdW5kIHRvIHRoaXMgKHBob25lLCBidXNpbmVzc0lkKSBwYWlyLiAqL1xuICBidXNpbmVzc0lkOiBudW1iZXI7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE90cFJlc3VsdCB7XG4gIHJlcXVlc3RJZDogc3RyaW5nO1xuICAvKiogU2Vjb25kcyB1bnRpbCB0aGUgT1RQIGV4cGlyZXMgc2VydmVyLXNpZGUuIFR5cGljYWxseSAzMDAgKDUgbWluKS4gKi9cbiAgZXhwaXJlc0luOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RlcCAxIG9mIHRoZSBjdXN0b21lciBPVFAgbG9naW4uIEFza3MgdGhlIGF1dGggc3VyZmFjZSB0byBtaW50IGFuXG4gKiBPVFAsIHBlcnNpc3QgaXQgYm91bmQgdG8gKHBob25lLCBidXNpbmVzc0lkKSwgYW5kIGVtaXQgaXQgZm9yIFNNU1xuICogZGVsaXZlcnkgdmlhIHRoZSBTTVMtdGVhbSBzdWJzY3JpYmVyLiBUaGUgcGxhaW50ZXh0IE9UUCBuZXZlclxuICogYXBwZWFycyBpbiB0aGUgcmVzcG9uc2Ug4oCUIHRoZSBTTVMgdGVhbSBpcyB0aGUgc2lkZSBjaGFubmVsLlxuICpcbiAqIFRocm93cyBvbiByYXRlLWxpbWl0ICg0MjkpLCB1bmtub3duIHBob25lLWJ1c2luZXNzIHBhaXIgKDQwMCksIGFuZFxuICogb3RoZXIgbm9uLTIwMCByZXNwb25zZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0T3RwKGlucHV0OiBSZXF1ZXN0T3RwSW5wdXQpOiBQcm9taXNlPFJlcXVlc3RPdHBSZXN1bHQ+IHtcbiAgY29uc3QgZmV0Y2hGbiA9IGlucHV0LmZldGNoRm4gPz8gKGdsb2JhbFRoaXMuZmV0Y2ggYXMgdHlwZW9mIGZldGNoKTtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hGbihcbiAgICBgJHtpbnB1dC5jdXN0b21lckF1dGhCYXNlVXJsID8/IERFRkFVTFRfQ1VTVE9NRVJfQVVUSF9CQVNFX1VSTH0vb3RwL3JlcXVlc3RgLFxuICAgIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBob25lOiBpbnB1dC5waG9uZSwgYnVzaW5lc3NJZDogaW5wdXQuYnVzaW5lc3NJZCB9KSxcbiAgICB9LFxuICApO1xuXG4gIGxldCBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdHJ5IHtcbiAgICBib2R5ID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgUGxhdGZvcm1FcnJvcihgYXV0aCBzZXJ2ZXIgcmV0dXJuZWQgbm9uLUpTT046IEhUVFAgJHtyZXMuc3RhdHVzfWAsIHtcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIGNhdXNlOiBlcnIsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCBlcnJvciA9IHR5cGVvZiBib2R5LmVycm9yID09PSAnc3RyaW5nJyA/IGJvZHkuZXJyb3IgOiAnb3RwX3JlcXVlc3RfZmFpbGVkJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9XG4gICAgICB0eXBlb2YgYm9keS5lcnJvcl9kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgPyBib2R5LmVycm9yX2Rlc2NyaXB0aW9uIDogdW5kZWZpbmVkO1xuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKGRlc2NyaXB0aW9uID8/IGVycm9yLCB7IGNhdXNlOiBib2R5IH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGxhdGZvcm1FcnJvcihkZXNjcmlwdGlvbiA/PyBlcnJvciwgeyBzdGF0dXM6IHJlcy5zdGF0dXMsIGNhdXNlOiBib2R5IH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdElkOiBTdHJpbmcoYm9keS5yZXF1ZXN0SWQgPz8gJycpLFxuICAgIGV4cGlyZXNJbjogTnVtYmVyKGJvZHkuZXhwaXJlc0luID8/IDApLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeU90cElucHV0IHtcbiAgLyoqIERlZmF1bHRzIHRvIGBodHRwczovL2FwaS5wbGF0Zm9ybS51ZW5nYWdlLmlvL2F1dGgvY3VzdG9tZXJgLiAqL1xuICBjdXN0b21lckF1dGhCYXNlVXJsPzogc3RyaW5nO1xuICBwaG9uZTogc3RyaW5nO1xuICBvdHA6IHN0cmluZztcbiAgLyoqIFJldHVybmVkIGJ5IGByZXF1ZXN0T3RwKC4uLilgLiAqL1xuICByZXF1ZXN0SWQ6IHN0cmluZztcbiAgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaDtcbn1cblxuLyoqXG4gKiBTdGVwIDIgb2YgdGhlIGN1c3RvbWVyIE9UUCBsb2dpbi4gRXhjaGFuZ2VzIHRoZSAocGhvbmUsIG90cCxcbiAqIHJlcXVlc3RJZCkgdHJpcGxlIGZvciBhbiBhY2Nlc3MgKyByZWZyZXNoIHBhaXIuIFJldHVybnMgdGhlIHNhbWVcbiAqIGBUb2tlblBhaXJgIHNoYXBlIGFzIHRoZSBvdGhlciBsb2dpbiBmbG93czsgcGFzc1xuICogYHRva2Vucy5hY2Nlc3NUb2tlbmAgaW50byBgY3JlYXRlQ2xpZW50KHsgYXV0aFRva2VuIH0pYC5cbiAqXG4gKiBUaHJvd3MgYEF1dGhlbnRpY2F0aW9uRXJyb3JgIG9uIGBpbnZhbGlkX2dyYW50YCAod3JvbmcgT1RQLCBleHBpcmVkLFxuICogbG9ja2VkIGFmdGVyIHRvbyBtYW55IGF0dGVtcHRzLCBvciBhbHJlYWR5IGNvbnN1bWVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeU90cChpbnB1dDogVmVyaWZ5T3RwSW5wdXQpOiBQcm9taXNlPFRva2VuUGFpcj4ge1xuICBjb25zdCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgZ3JhbnRfdHlwZTogJ290cCcsXG4gICAgcmVxdWVzdF9pZDogaW5wdXQucmVxdWVzdElkLFxuICAgIG90cDogaW5wdXQub3RwLFxuICAgIHBob25lOiBpbnB1dC5waG9uZSxcbiAgfSk7XG4gIGNvbnN0IGZldGNoRm4gPSBpbnB1dC5mZXRjaEZuID8/IChnbG9iYWxUaGlzLmZldGNoIGFzIHR5cGVvZiBmZXRjaCk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoRm4oXG4gICAgYCR7aW5wdXQuY3VzdG9tZXJBdXRoQmFzZVVybCA/PyBERUZBVUxUX0NVU1RPTUVSX0FVVEhfQkFTRV9VUkx9L29hdXRoL3Rva2VuYCxcbiAgICB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlVG9rZW5SZXNwb25zZShyZXMpO1xufVxuIl19
|
package/dist/business/client.js
CHANGED
|
@@ -4,7 +4,6 @@ exports.BusinessApiError = void 0;
|
|
|
4
4
|
exports.createBusinessClient = createBusinessClient;
|
|
5
5
|
const config_1 = require("../config");
|
|
6
6
|
const http_1 = require("../http");
|
|
7
|
-
const token_source_1 = require("../token-source");
|
|
8
7
|
class BusinessApiError extends Error {
|
|
9
8
|
status;
|
|
10
9
|
body;
|
|
@@ -35,7 +34,7 @@ function createBusinessClient(input = {}) {
|
|
|
35
34
|
const path = `/v1/businesses/${id}`;
|
|
36
35
|
const query = opts.groups?.length ? `?groups=${opts.groups.join(',')}` : '';
|
|
37
36
|
const config = state.resolve();
|
|
38
|
-
const res = await sendWithAuthRetry(config, {
|
|
37
|
+
const res = await (0, http_1.sendWithAuthRetry)(config, {
|
|
39
38
|
method: 'GET',
|
|
40
39
|
path,
|
|
41
40
|
url: `${config.baseUrl}${path}${query}`,
|
|
@@ -59,7 +58,7 @@ function createBusinessClient(input = {}) {
|
|
|
59
58
|
if (opts.groups?.length)
|
|
60
59
|
params.set('groups', opts.groups.join(','));
|
|
61
60
|
const config = state.resolve();
|
|
62
|
-
const res = await sendWithAuthRetry(config, {
|
|
61
|
+
const res = await (0, http_1.sendWithAuthRetry)(config, {
|
|
63
62
|
method: 'GET',
|
|
64
63
|
path,
|
|
65
64
|
url: `${config.baseUrl}${path}?${params.toString()}`,
|
|
@@ -72,36 +71,4 @@ function createBusinessClient(input = {}) {
|
|
|
72
71
|
};
|
|
73
72
|
return client;
|
|
74
73
|
}
|
|
75
|
-
|
|
76
|
-
* Send a request with the SDK's standard 401-retry-once behaviour.
|
|
77
|
-
* Only retries when auth is `token-source`, since that's the case
|
|
78
|
-
* where the cached token may have expired server-side; HMAC and
|
|
79
|
-
* static bearer 401s mean the auth is misconfigured and a retry
|
|
80
|
-
* would just fail again.
|
|
81
|
-
*/
|
|
82
|
-
async function sendWithAuthRetry(config, params) {
|
|
83
|
-
const headers = await (0, http_1.buildHeaders)(config, {
|
|
84
|
-
method: params.method,
|
|
85
|
-
path: params.path,
|
|
86
|
-
body: params.body,
|
|
87
|
-
});
|
|
88
|
-
const res = await config.fetchFn(params.url, {
|
|
89
|
-
method: params.method,
|
|
90
|
-
headers,
|
|
91
|
-
body: params.body,
|
|
92
|
-
});
|
|
93
|
-
if (res.status !== 401 || config.auth?.type !== 'token-source')
|
|
94
|
-
return res;
|
|
95
|
-
(0, token_source_1.invalidateToken)(config.auth.state);
|
|
96
|
-
const retryHeaders = await (0, http_1.buildHeaders)(config, {
|
|
97
|
-
method: params.method,
|
|
98
|
-
path: params.path,
|
|
99
|
-
body: params.body,
|
|
100
|
-
});
|
|
101
|
-
return config.fetchFn(params.url, {
|
|
102
|
-
method: params.method,
|
|
103
|
-
headers: retryHeaders,
|
|
104
|
-
body: params.body,
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1c2luZXNzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvQ0Esb0RBd0RDO0FBNUZELHNDQU1tQjtBQUNuQixrQ0FBdUM7QUFDdkMsa0RBQWtEO0FBZ0JsRCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFDaEMsTUFBTSxDQUFTO0lBQ2YsSUFBSSxDQUFTO0lBRXRCLFlBQVksTUFBYyxFQUFFLElBQVk7UUFDdEMsS0FBSyxDQUFDLGdCQUFnQixNQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQVZELDRDQVVDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsUUFBNkIsRUFBRTtJQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFXLEVBQUUsQ0FBQztJQUNoQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRW5CLE1BQU0sTUFBTSxHQUFtQjtRQUM3QixNQUFNLENBQUMsSUFBSTtZQUNULEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJO1lBQ1AsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtnQkFDMUMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsSUFBSTtnQkFDSixHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUU7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQW1CLENBQUM7UUFDOUMsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ3ZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25GLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU07Z0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNyRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFDLE1BQU0sRUFBRSxLQUFLO2dCQUNiLElBQUk7Z0JBQ0osR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO2FBQ3JELENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFxQixDQUFDO1FBQ2hELENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FDOUIsTUFBc0IsRUFDdEIsTUFBb0U7SUFFcEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLG1CQUFZLEVBQUMsTUFBTSxFQUFFO1FBQ3pDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2xCLENBQUMsQ0FBQztJQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1FBQzNDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixPQUFPO1FBQ1AsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2xCLENBQUMsQ0FBQztJQUNILElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssY0FBYztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzNFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRTtRQUM5QyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTyxFQUFFLFlBQVk7UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWcsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IGJ1aWxkSGVhZGVycyB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVRva2VuIH0gZnJvbSAnLi4vdG9rZW4tc291cmNlJztcbmltcG9ydCB0eXBlIHsgQnVzaW5lc3NHcm91cE5hbWUsIEJ1c2luZXNzUmVjb3JkIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzR2V0T3B0aW9ucyB7XG4gIGdyb3Vwcz86IHJlYWRvbmx5IEJ1c2luZXNzR3JvdXBOYW1lW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NDbGllbnQge1xuICBjb25maWcoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiBCdXNpbmVzc0NsaWVudDtcbiAgYXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiBCdXNpbmVzc0NsaWVudDtcbiAgLyoqIEdFVCAvdjEvYnVzaW5lc3Nlcy86aWQgLSByZXR1cm5zIHRoZSByZWNvcmQgb3IgdGhyb3dzIEJ1c2luZXNzQXBpRXJyb3IuICovXG4gIGdldChpZDogbnVtYmVyLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZD47XG4gIC8qKiBHRVQgL3YxL2J1c2luZXNzZXM/aWRzPSAtIHJldHVybnMgbWF0Y2hlZCByZWNvcmRzIChtaXNzaW5nIGlkcyBkcm9wcGVkKS4gKi9cbiAgYnVsayhpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZFtdPjtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1c2luZXNzQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGBidXNpbmVzcyBBUEkgJHtzdGF0dXN9OiAke2JvZHl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0J1c2luZXNzQXBpRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1c2luZXNzQ2xpZW50KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge30pOiBCdXNpbmVzc0NsaWVudCB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IENvbmZpZ1N0YXRlKCk7XG4gIHN0YXRlLmFwcGx5KGlucHV0KTtcblxuICBjb25zdCBjbGllbnQ6IEJ1c2luZXNzQ2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0KGlkLCBvcHRzID0ge30pIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkgfHwgaWQgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1c2luZXNzLmdldDogaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke2lkfSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGggPSBgL3YxL2J1c2luZXNzZXMvJHtpZH1gO1xuICAgICAgY29uc3QgcXVlcnkgPSBvcHRzLmdyb3Vwcz8ubGVuZ3RoID8gYD9ncm91cHM9JHtvcHRzLmdyb3Vwcy5qb2luKCcsJyl9YCA6ICcnO1xuICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofSR7cXVlcnl9YCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1c2luZXNzQXBpRXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIEJ1c2luZXNzUmVjb3JkO1xuICAgIH0sXG4gICAgYXN5bmMgYnVsayhpZHMsIG9wdHMgPSB7fSkge1xuICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidXNpbmVzcy5idWxrOiBpZHMgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbiBvZiBpZHMpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IG4gPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnVzaW5lc3MuYnVsazogZXZlcnkgaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke259KWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gJy92MS9idXNpbmVzc2VzJztcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBpZHM6IGlkcy5qb2luKCcsJykgfSk7XG4gICAgICBpZiAob3B0cy5ncm91cHM/Lmxlbmd0aCkgcGFyYW1zLnNldCgnZ3JvdXBzJywgb3B0cy5ncm91cHMuam9pbignLCcpKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBwYXRoLFxuICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgQnVzaW5lc3NBcGlFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgQnVzaW5lc3NSZWNvcmRbXTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogU2VuZCBhIHJlcXVlc3Qgd2l0aCB0aGUgU0RLJ3Mgc3RhbmRhcmQgNDAxLXJldHJ5LW9uY2UgYmVoYXZpb3VyLlxuICogT25seSByZXRyaWVzIHdoZW4gYXV0aCBpcyBgdG9rZW4tc291cmNlYCwgc2luY2UgdGhhdCdzIHRoZSBjYXNlXG4gKiB3aGVyZSB0aGUgY2FjaGVkIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgc2VydmVyLXNpZGU7IEhNQUMgYW5kXG4gKiBzdGF0aWMgYmVhcmVyIDQwMXMgbWVhbiB0aGUgYXV0aCBpcyBtaXNjb25maWd1cmVkIGFuZCBhIHJldHJ5XG4gKiB3b3VsZCBqdXN0IGZhaWwgYWdhaW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRXaXRoQXV0aFJldHJ5KFxuICBjb25maWc6IFBsYXRmb3JtQ29uZmlnLFxuICBwYXJhbXM6IHsgbWV0aG9kOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgdXJsOiBzdHJpbmc7IGJvZHk/OiBzdHJpbmcgfSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGJ1aWxkSGVhZGVycyhjb25maWcsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICBjb25zdCByZXMgPSBhd2FpdCBjb25maWcuZmV0Y2hGbihwYXJhbXMudXJsLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICBpZiAocmVzLnN0YXR1cyAhPT0gNDAxIHx8IGNvbmZpZy5hdXRoPy50eXBlICE9PSAndG9rZW4tc291cmNlJykgcmV0dXJuIHJlcztcbiAgaW52YWxpZGF0ZVRva2VuKGNvbmZpZy5hdXRoLnN0YXRlKTtcbiAgY29uc3QgcmV0cnlIZWFkZXJzID0gYXdhaXQgYnVpbGRIZWFkZXJzKGNvbmZpZywge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgfSk7XG4gIHJldHVybiBjb25maWcuZmV0Y2hGbihwYXJhbXMudXJsLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIGhlYWRlcnM6IHJldHJ5SGVhZGVycyxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgfSk7XG59XG4iXX0=
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1c2luZXNzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQ0Esb0RBd0RDO0FBMUZELHNDQUttQjtBQUNuQixrQ0FBNEM7QUFnQjVDLE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztJQUNoQyxNQUFNLENBQVM7SUFDZixJQUFJLENBQVM7SUFFdEIsWUFBWSxNQUFjLEVBQUUsSUFBWTtRQUN0QyxLQUFLLENBQUMsZ0JBQWdCLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsNENBVUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxRQUE2QixFQUFFO0lBQ2xFLE1BQU0sS0FBSyxHQUFHLElBQUksb0JBQVcsRUFBRSxDQUFDO0lBQ2hDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbkIsTUFBTSxNQUFNLEdBQW1CO1FBQzdCLE1BQU0sQ0FBQyxJQUFJO1lBQ1QsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUk7WUFDUCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSx3QkFBaUIsRUFBQyxNQUFNLEVBQUU7Z0JBQzFDLE1BQU0sRUFBRSxLQUFLO2dCQUNiLElBQUk7Z0JBQ0osR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFO2FBQ3hDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFtQixDQUFDO1FBQzlDLENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUN2QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRixDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDO1lBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSx3QkFBaUIsRUFBQyxNQUFNLEVBQUU7Z0JBQzFDLE1BQU0sRUFBRSxLQUFLO2dCQUNiLElBQUk7Z0JBQ0osR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO2FBQ3JELENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFxQixDQUFDO1FBQ2hELENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbmZpZ1N0YXRlLFxuICB0eXBlIFBsYXRmb3JtQXV0aCxcbiAgdHlwZSBQbGF0Zm9ybUF1dGhJbnB1dCxcbiAgdHlwZSBQbGF0Zm9ybUNvbmZpZ0lucHV0LFxufSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgc2VuZFdpdGhBdXRoUmV0cnkgfSBmcm9tICcuLi9odHRwJztcbmltcG9ydCB0eXBlIHsgQnVzaW5lc3NHcm91cE5hbWUsIEJ1c2luZXNzUmVjb3JkIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzR2V0T3B0aW9ucyB7XG4gIGdyb3Vwcz86IHJlYWRvbmx5IEJ1c2luZXNzR3JvdXBOYW1lW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NDbGllbnQge1xuICBjb25maWcoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiBCdXNpbmVzc0NsaWVudDtcbiAgYXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiBCdXNpbmVzc0NsaWVudDtcbiAgLyoqIEdFVCAvdjEvYnVzaW5lc3Nlcy86aWQgLSByZXR1cm5zIHRoZSByZWNvcmQgb3IgdGhyb3dzIEJ1c2luZXNzQXBpRXJyb3IuICovXG4gIGdldChpZDogbnVtYmVyLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZD47XG4gIC8qKiBHRVQgL3YxL2J1c2luZXNzZXM/aWRzPSAtIHJldHVybnMgbWF0Y2hlZCByZWNvcmRzIChtaXNzaW5nIGlkcyBkcm9wcGVkKS4gKi9cbiAgYnVsayhpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZFtdPjtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1c2luZXNzQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGBidXNpbmVzcyBBUEkgJHtzdGF0dXN9OiAke2JvZHl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0J1c2luZXNzQXBpRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1c2luZXNzQ2xpZW50KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge30pOiBCdXNpbmVzc0NsaWVudCB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IENvbmZpZ1N0YXRlKCk7XG4gIHN0YXRlLmFwcGx5KGlucHV0KTtcblxuICBjb25zdCBjbGllbnQ6IEJ1c2luZXNzQ2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0KGlkLCBvcHRzID0ge30pIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkgfHwgaWQgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1c2luZXNzLmdldDogaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke2lkfSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGggPSBgL3YxL2J1c2luZXNzZXMvJHtpZH1gO1xuICAgICAgY29uc3QgcXVlcnkgPSBvcHRzLmdyb3Vwcz8ubGVuZ3RoID8gYD9ncm91cHM9JHtvcHRzLmdyb3Vwcy5qb2luKCcsJyl9YCA6ICcnO1xuICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofSR7cXVlcnl9YCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1c2luZXNzQXBpRXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIEJ1c2luZXNzUmVjb3JkO1xuICAgIH0sXG4gICAgYXN5bmMgYnVsayhpZHMsIG9wdHMgPSB7fSkge1xuICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidXNpbmVzcy5idWxrOiBpZHMgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbiBvZiBpZHMpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IG4gPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnVzaW5lc3MuYnVsazogZXZlcnkgaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke259KWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gJy92MS9idXNpbmVzc2VzJztcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBpZHM6IGlkcy5qb2luKCcsJykgfSk7XG4gICAgICBpZiAob3B0cy5ncm91cHM/Lmxlbmd0aCkgcGFyYW1zLnNldCgnZ3JvdXBzJywgb3B0cy5ncm91cHMuam9pbignLCcpKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBwYXRoLFxuICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgQnVzaW5lc3NBcGlFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgQnVzaW5lc3NSZWNvcmRbXTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG4iXX0=
|
package/dist/business/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { BUSINESS_GROUPS, type BusinessGroupName, type BusinessRecord, type BusinessParent, type BusinessProfile, type
|
|
1
|
+
export { BUSINESS_GROUPS, type BusinessGroupName, type BusinessRecord, type BusinessParent, type BusinessProfile, type BusinessBranding, type BusinessCompliance, type BusinessAddress, type BusinessContact, type BusinessHours, type BusinessSlots, type BusinessOrderTypes, type BusinessDelivery, type BusinessCharges, type BusinessAttributes, type BusinessAppConfig, type BusinessPaymentGateway, type BusinessBank, type TimeOfDay, } from './schema';
|
|
2
2
|
export { createBusinessClient, BusinessApiError, type BusinessClient, type BusinessGetOptions, } from './client';
|
package/dist/business/index.js
CHANGED
|
@@ -6,4 +6,4 @@ Object.defineProperty(exports, "BUSINESS_GROUPS", { enumerable: true, get: funct
|
|
|
6
6
|
var client_1 = require("./client");
|
|
7
7
|
Object.defineProperty(exports, "createBusinessClient", { enumerable: true, get: function () { return client_1.createBusinessClient; } });
|
|
8
8
|
Object.defineProperty(exports, "BusinessApiError", { enumerable: true, get: function () { return client_1.BusinessApiError; } });
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVzaW5lc3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBb0JrQjtBQW5CaEIseUdBQUEsZUFBZSxPQUFBO0FBb0JqQixtQ0FLa0I7QUFKaEIsOEdBQUEsb0JBQW9CLE9BQUE7QUFDcEIsMEdBQUEsZ0JBQWdCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBCVVNJTkVTU19HUk9VUFMsXG4gIHR5cGUgQnVzaW5lc3NHcm91cE5hbWUsXG4gIHR5cGUgQnVzaW5lc3NSZWNvcmQsXG4gIHR5cGUgQnVzaW5lc3NQYXJlbnQsXG4gIHR5cGUgQnVzaW5lc3NQcm9maWxlLFxuICB0eXBlIEJ1c2luZXNzQnJhbmRpbmcsXG4gIHR5cGUgQnVzaW5lc3NDb21wbGlhbmNlLFxuICB0eXBlIEJ1c2luZXNzQWRkcmVzcyxcbiAgdHlwZSBCdXNpbmVzc0NvbnRhY3QsXG4gIHR5cGUgQnVzaW5lc3NIb3VycyxcbiAgdHlwZSBCdXNpbmVzc1Nsb3RzLFxuICB0eXBlIEJ1c2luZXNzT3JkZXJUeXBlcyxcbiAgdHlwZSBCdXNpbmVzc0RlbGl2ZXJ5LFxuICB0eXBlIEJ1c2luZXNzQ2hhcmdlcyxcbiAgdHlwZSBCdXNpbmVzc0F0dHJpYnV0ZXMsXG4gIHR5cGUgQnVzaW5lc3NBcHBDb25maWcsXG4gIHR5cGUgQnVzaW5lc3NQYXltZW50R2F0ZXdheSxcbiAgdHlwZSBCdXNpbmVzc0JhbmssXG4gIHR5cGUgVGltZU9mRGF5LFxufSBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQge1xuICBjcmVhdGVCdXNpbmVzc0NsaWVudCxcbiAgQnVzaW5lc3NBcGlFcnJvcixcbiAgdHlwZSBCdXNpbmVzc0NsaWVudCxcbiAgdHlwZSBCdXNpbmVzc0dldE9wdGlvbnMsXG59IGZyb20gJy4vY2xpZW50JztcbiJdfQ==
|