@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 CHANGED
@@ -1,21 +1,31 @@
1
1
  # @uengage.io/platform-sdk
2
2
 
3
- Client SDK for uEngage platform services. Exposes namespaced singletons for each
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 { audit, business } from '@uengage.io/platform-sdk';
12
-
13
- // Reads PLATFORM_BASE_URL, PLATFORM_SIGNING_SECRET, PLATFORM_SERVICE_ID
14
- // (or PLATFORM_AUTH_TOKEN) from the environment.
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', 'gst'] });
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
- ## Configuration
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
- Override at runtime per client:
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
- business
42
- .config({ baseUrl: 'https://staging.platform.uengage.io' })
43
- .auth({ secret: process.env.MY_SECRET!, serviceId: 'my-service' })
44
- .get(123);
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
- // Or Bearer token:
47
- business.auth({ token: 'tok-...' }).get(123);
49
+ // Customer surface: legacy session_token → JWT (transparent rotation)
50
+ createClient({ sessionToken: req.cookies.uengage_session });
48
51
  ```
49
52
 
50
- For isolated configuration (tests, multi-tenant code paths), construct your own:
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
- ```ts
53
- import { createBusinessClient, createAuditClient } from '@uengage.io/platform-sdk';
55
+ ## Why no singleton?
54
56
 
55
- const customBusiness = createBusinessClient({
56
- baseUrl: 'https://staging.platform.uengage.io',
57
- auth: { secret: '...', serviceId: 'my-service' },
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 `serviceId`,
77
- validates the event, and enqueues it. It never throws.
78
- - Events batch and flush every 5 s (configurable via `flushIntervalMs`)
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 - the publish workflow runs
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`.
@@ -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
- * Default singleton namespace for callers using the package singleton.
21
- * import { auth } from '@uengage.io/platform-sdk';
22
- * const pkce = auth.generatePKCE();
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
  };
@@ -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
- * Default singleton namespace for callers using the package singleton.
32
- * import { auth } from '@uengage.io/platform-sdk';
33
- * const pkce = auth.generatePKCE();
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7R0FLRztBQUNILCtCQUFxRDtBQUE1QyxvR0FBQSxZQUFZLE9BQUE7QUFDckIsaURBQTZFO0FBQXBFLG1IQUFBLGtCQUFrQixPQUFBO0FBQzNCLGlEQUt5QjtBQUp2Qiw2R0FBQSxZQUFZLE9BQUE7QUFDWixtSEFBQSxrQkFBa0IsT0FBQTtBQUlwQixxQ0FBdUQ7QUFBOUMsa0dBQUEsT0FBTyxPQUFBO0FBQ2hCLG1DQUE2QztBQUFwQywyR0FBQSxpQkFBaUIsT0FBQTtBQUMxQixtQ0FBZ0Q7QUFBdkMsbUdBQUEsU0FBUyxPQUFBO0FBQUUsbUdBQUEsU0FBUyxPQUFBO0FBRTdCLGlDQUFzQztBQUN0QyxtREFBcUQ7QUFDckQsbURBQStDO0FBQy9DLHVDQUFvQztBQUNwQyxxQ0FBNkM7QUFDN0MscUNBQWdEO0FBRWhEOzs7O0dBSUc7QUFDVSxRQUFBLElBQUksR0FBRztJQUNsQixZQUFZLEVBQVosbUJBQVk7SUFDWixrQkFBa0IsRUFBbEIsa0NBQWtCO0lBQ2xCLFlBQVksRUFBWiw0QkFBWTtJQUNaLE9BQU8sRUFBUCxpQkFBTztJQUNQLGlCQUFpQixFQUFqQiwwQkFBaUI7SUFDakIsU0FBUyxFQUFULGtCQUFTO0lBQ1QsU0FBUyxFQUFULGtCQUFTO0NBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aCBuYW1lc3BhY2U6IGhlbHBlcnMgZm9yIE9BdXRoMiBmbG93cyBhZ2FpbnN0IHRoZSBwbGF0Zm9ybSdzXG4gKiBgL2F1dGgvYnVzaW5lc3MvKmAgc3VyZmFjZS4gQ29uc3VtZXJzIGRvbid0IGJha2UgYSBgY2xpZW50X2lkYCBpbnRvXG4gKiB0aGUgU0RLIGl0c2VsZiDigJQgZXZlcnkgaGVscGVyIHRha2VzIHBhcmFtZXRlcnMgZXhwbGljaXRseSBzbyBtdWx0aXBsZVxuICogT0F1dGggY2xpZW50cyAoZGFzaGJvYXJkLCBtb2JpbGUsIEJGRnMpIGNhbiBzaGFyZSBvbmUgU0RLIGluc3RhbGwuXG4gKi9cbmV4cG9ydCB7IGdlbmVyYXRlUEtDRSwgdHlwZSBQa2NlUGFpciB9IGZyb20gJy4vcGtjZSc7XG5leHBvcnQgeyBjcmVhdGVBdXRob3JpemVVcmwsIHR5cGUgQXV0aG9yaXplVXJsSW5wdXQgfSBmcm9tICcuL2F1dGhvcml6ZS11cmwnO1xuZXhwb3J0IHtcbiAgZXhjaGFuZ2VDb2RlLFxuICBwYXJzZVRva2VuUmVzcG9uc2UsXG4gIHR5cGUgRXhjaGFuZ2VDb2RlSW5wdXQsXG4gIHR5cGUgVG9rZW5QYWlyLFxufSBmcm9tICcuL2V4Y2hhbmdlLWNvZGUnO1xuZXhwb3J0IHsgcmVmcmVzaCwgdHlwZSBSZWZyZXNoSW5wdXQgfSBmcm9tICcuL3JlZnJlc2gnO1xuZXhwb3J0IHsgdmVyaWZ5QWNjZXNzVG9rZW4gfSBmcm9tICcuL3ZlcmlmeSc7XG5leHBvcnQgeyBnZXRJc3N1ZXIsIGdldEV4cGlyeSB9IGZyb20gJy4vaXNzdWVyJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQS0NFIH0gZnJvbSAnLi9wa2NlJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhvcml6ZVVybCB9IGZyb20gJy4vYXV0aG9yaXplLXVybCc7XG5pbXBvcnQgeyBleGNoYW5nZUNvZGUgfSBmcm9tICcuL2V4Y2hhbmdlLWNvZGUnO1xuaW1wb3J0IHsgcmVmcmVzaCB9IGZyb20gJy4vcmVmcmVzaCc7XG5pbXBvcnQgeyB2ZXJpZnlBY2Nlc3NUb2tlbiB9IGZyb20gJy4vdmVyaWZ5JztcbmltcG9ydCB7IGdldElzc3VlciwgZ2V0RXhwaXJ5IH0gZnJvbSAnLi9pc3N1ZXInO1xuXG4vKipcbiAqIERlZmF1bHQgc2luZ2xldG9uIG5hbWVzcGFjZSBmb3IgY2FsbGVycyB1c2luZyB0aGUgcGFja2FnZSBzaW5nbGV0b24uXG4gKiAgIGltcG9ydCB7IGF1dGggfSBmcm9tICdAdWVuZ2FnZS5pby9wbGF0Zm9ybS1zZGsnO1xuICogICBjb25zdCBwa2NlID0gYXV0aC5nZW5lcmF0ZVBLQ0UoKTtcbiAqL1xuZXhwb3J0IGNvbnN0IGF1dGggPSB7XG4gIGdlbmVyYXRlUEtDRSxcbiAgY3JlYXRlQXV0aG9yaXplVXJsLFxuICBleGNoYW5nZUNvZGUsXG4gIHJlZnJlc2gsXG4gIHZlcmlmeUFjY2Vzc1Rva2VuLFxuICBnZXRJc3N1ZXIsXG4gIGdldEV4cGlyeSxcbn07XG4iXX0=
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>;
@@ -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
@@ -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=
@@ -1,2 +1,2 @@
1
- export { BUSINESS_GROUPS, type BusinessGroupName, type BusinessRecord, type BusinessParent, type BusinessProfile, type BusinessGst, type BusinessPaymentGateway, } from './schema';
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';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVzaW5lc3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBUWtCO0FBUGhCLHlHQUFBLGVBQWUsT0FBQTtBQVFqQixtQ0FLa0I7QUFKaEIsOEdBQUEsb0JBQW9CLE9BQUE7QUFDcEIsMEdBQUEsZ0JBQWdCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBCVVNJTkVTU19HUk9VUFMsXG4gIHR5cGUgQnVzaW5lc3NHcm91cE5hbWUsXG4gIHR5cGUgQnVzaW5lc3NSZWNvcmQsXG4gIHR5cGUgQnVzaW5lc3NQYXJlbnQsXG4gIHR5cGUgQnVzaW5lc3NQcm9maWxlLFxuICB0eXBlIEJ1c2luZXNzR3N0LFxuICB0eXBlIEJ1c2luZXNzUGF5bWVudEdhdGV3YXksXG59IGZyb20gJy4vc2NoZW1hJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUJ1c2luZXNzQ2xpZW50LFxuICBCdXNpbmVzc0FwaUVycm9yLFxuICB0eXBlIEJ1c2luZXNzQ2xpZW50LFxuICB0eXBlIEJ1c2luZXNzR2V0T3B0aW9ucyxcbn0gZnJvbSAnLi9jbGllbnQnO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVzaW5lc3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBb0JrQjtBQW5CaEIseUdBQUEsZUFBZSxPQUFBO0FBb0JqQixtQ0FLa0I7QUFKaEIsOEdBQUEsb0JBQW9CLE9BQUE7QUFDcEIsMEdBQUEsZ0JBQWdCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBCVVNJTkVTU19HUk9VUFMsXG4gIHR5cGUgQnVzaW5lc3NHcm91cE5hbWUsXG4gIHR5cGUgQnVzaW5lc3NSZWNvcmQsXG4gIHR5cGUgQnVzaW5lc3NQYXJlbnQsXG4gIHR5cGUgQnVzaW5lc3NQcm9maWxlLFxuICB0eXBlIEJ1c2luZXNzQnJhbmRpbmcsXG4gIHR5cGUgQnVzaW5lc3NDb21wbGlhbmNlLFxuICB0eXBlIEJ1c2luZXNzQWRkcmVzcyxcbiAgdHlwZSBCdXNpbmVzc0NvbnRhY3QsXG4gIHR5cGUgQnVzaW5lc3NIb3VycyxcbiAgdHlwZSBCdXNpbmVzc1Nsb3RzLFxuICB0eXBlIEJ1c2luZXNzT3JkZXJUeXBlcyxcbiAgdHlwZSBCdXNpbmVzc0RlbGl2ZXJ5LFxuICB0eXBlIEJ1c2luZXNzQ2hhcmdlcyxcbiAgdHlwZSBCdXNpbmVzc0F0dHJpYnV0ZXMsXG4gIHR5cGUgQnVzaW5lc3NBcHBDb25maWcsXG4gIHR5cGUgQnVzaW5lc3NQYXltZW50R2F0ZXdheSxcbiAgdHlwZSBCdXNpbmVzc0JhbmssXG4gIHR5cGUgVGltZU9mRGF5LFxufSBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQge1xuICBjcmVhdGVCdXNpbmVzc0NsaWVudCxcbiAgQnVzaW5lc3NBcGlFcnJvcixcbiAgdHlwZSBCdXNpbmVzc0NsaWVudCxcbiAgdHlwZSBCdXNpbmVzc0dldE9wdGlvbnMsXG59IGZyb20gJy4vY2xpZW50JztcbiJdfQ==