@uengage.io/platform-sdk 0.9.1 → 0.14.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.
@@ -0,0 +1,65 @@
1
+ import { type PlatformAuth, type PlatformAuthInput, type PlatformConfigInput } from '../config';
2
+ import type { CreditInput, Currency, DebitInput, GetWalletOptions, ListTransactionsFilter, TransactionPage, TransactionResult, WalletBalance, WalletInstance, WalletTransaction } from './schema';
3
+ /**
4
+ * A handle to one business wallet. Cheap to create — `getWallet(...)`
5
+ * does no I/O. The wallet is resolved server-side on the first
6
+ * operation, so `UnresolvableWalletError` / `WalletNotFoundError`
7
+ * surface from the operation, not from `getWallet()`.
8
+ */
9
+ export interface Wallet {
10
+ /** GET /v1/wallet/balance — resolves the wallet and returns its balance + currency. */
11
+ getBalance(): Promise<WalletBalance>;
12
+ /** GET /v1/wallet/instance — wallet identity + currency, without the balance. */
13
+ getInstance(): Promise<WalletInstance>;
14
+ /** The wallet's currency `{code, symbol}` (a slice of getInstance()). */
15
+ getCurrency(): Promise<Currency>;
16
+ /** POST /v1/wallet/transactions (type=debit). Idempotent on `referenceId`. */
17
+ debit(input: DebitInput): Promise<TransactionResult>;
18
+ /** POST /v1/wallet/transactions (type=credit). Pass `reversalOf` for a refund. */
19
+ credit(input: CreditInput): Promise<TransactionResult>;
20
+ /** GET /v1/wallet/transactions — newest-first, keyset-paginated. */
21
+ listTransactions(filter?: ListTransactionsFilter): Promise<TransactionPage>;
22
+ /** GET /v1/wallet/transactions/:id — scoped to this wallet. */
23
+ getTransaction(id: string): Promise<WalletTransaction>;
24
+ }
25
+ export interface WalletClient {
26
+ config(input: PlatformConfigInput): WalletClient;
27
+ auth(input: PlatformAuthInput | PlatformAuth): WalletClient;
28
+ /**
29
+ * Build a handle to a business wallet. Synchronous and I/O-free — it
30
+ * only parses `id`. Requires a service token carrying the relevant
31
+ * `wallet.*` scope for the operations on the returned handle.
32
+ */
33
+ getWallet(opts: GetWalletOptions): Wallet;
34
+ }
35
+ export declare class WalletApiError extends Error {
36
+ readonly status: number;
37
+ readonly body: string;
38
+ constructor(status: number, body: string);
39
+ }
40
+ /** A debit would overdraw the wallet; nothing was moved (HTTP 409). */
41
+ export declare class InsufficientBalanceError extends WalletApiError {
42
+ readonly balanceMinor: number;
43
+ constructor(balanceMinor: number, body: string);
44
+ }
45
+ /** A refund would push total reversals past the original debit (HTTP 409). */
46
+ export declare class OverRefundError extends WalletApiError {
47
+ constructor(body: string);
48
+ }
49
+ /** `reversalOf` doesn't reference a valid debit on this wallet (HTTP 422). */
50
+ export declare class InvalidReversalError extends WalletApiError {
51
+ constructor(body: string);
52
+ }
53
+ /** A `referenceId` was reused with a different amount/type/service (HTTP 409). */
54
+ export declare class IdempotencyConflictError extends WalletApiError {
55
+ constructor(body: string);
56
+ }
57
+ /** The business, or the business its `bId_deduction` points to, does not exist (HTTP 422). */
58
+ export declare class UnresolvableWalletError extends WalletApiError {
59
+ constructor(body: string);
60
+ }
61
+ /** No wallet document, or no such transaction on this wallet (HTTP 404). */
62
+ export declare class WalletNotFoundError extends WalletApiError {
63
+ constructor(body: string);
64
+ }
65
+ export declare function createWalletClient(input?: PlatformConfigInput): WalletClient;
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = void 0;
4
+ exports.createWalletClient = createWalletClient;
5
+ const config_1 = require("../config");
6
+ const http_1 = require("../http");
7
+ class WalletApiError extends Error {
8
+ status;
9
+ body;
10
+ constructor(status, body) {
11
+ super(`wallet API ${status}: ${body}`);
12
+ this.name = 'WalletApiError';
13
+ this.status = status;
14
+ this.body = body;
15
+ }
16
+ }
17
+ exports.WalletApiError = WalletApiError;
18
+ /** A debit would overdraw the wallet; nothing was moved (HTTP 409). */
19
+ class InsufficientBalanceError extends WalletApiError {
20
+ balanceMinor;
21
+ constructor(balanceMinor, body) {
22
+ super(409, body);
23
+ this.name = 'InsufficientBalanceError';
24
+ this.balanceMinor = balanceMinor;
25
+ }
26
+ }
27
+ exports.InsufficientBalanceError = InsufficientBalanceError;
28
+ /** A refund would push total reversals past the original debit (HTTP 409). */
29
+ class OverRefundError extends WalletApiError {
30
+ constructor(body) {
31
+ super(409, body);
32
+ this.name = 'OverRefundError';
33
+ }
34
+ }
35
+ exports.OverRefundError = OverRefundError;
36
+ /** `reversalOf` doesn't reference a valid debit on this wallet (HTTP 422). */
37
+ class InvalidReversalError extends WalletApiError {
38
+ constructor(body) {
39
+ super(422, body);
40
+ this.name = 'InvalidReversalError';
41
+ }
42
+ }
43
+ exports.InvalidReversalError = InvalidReversalError;
44
+ /** A `referenceId` was reused with a different amount/type/service (HTTP 409). */
45
+ class IdempotencyConflictError extends WalletApiError {
46
+ constructor(body) {
47
+ super(409, body);
48
+ this.name = 'IdempotencyConflictError';
49
+ }
50
+ }
51
+ exports.IdempotencyConflictError = IdempotencyConflictError;
52
+ /** The business, or the business its `bId_deduction` points to, does not exist (HTTP 422). */
53
+ class UnresolvableWalletError extends WalletApiError {
54
+ constructor(body) {
55
+ super(422, body);
56
+ this.name = 'UnresolvableWalletError';
57
+ }
58
+ }
59
+ exports.UnresolvableWalletError = UnresolvableWalletError;
60
+ /** No wallet document, or no such transaction on this wallet (HTTP 404). */
61
+ class WalletNotFoundError extends WalletApiError {
62
+ constructor(body) {
63
+ super(404, body);
64
+ this.name = 'WalletNotFoundError';
65
+ }
66
+ }
67
+ exports.WalletNotFoundError = WalletNotFoundError;
68
+ const BUSINESS_ID_RE = /^business:(\d+)$/;
69
+ /** Parse a typed wallet id (`"business:8841"`) into the numeric business id. */
70
+ function parseBusinessId(id) {
71
+ const match = BUSINESS_ID_RE.exec(id);
72
+ if (!match) {
73
+ throw new Error(`wallet.getWallet: id must look like "business:<positive integer>" (got "${id}")`);
74
+ }
75
+ return Number.parseInt(match[1], 10);
76
+ }
77
+ /** Map a non-2xx wallet response to the most specific typed error. */
78
+ function walletError(status, body) {
79
+ let code;
80
+ let balanceMinor;
81
+ try {
82
+ const parsed = JSON.parse(body);
83
+ code = parsed.error;
84
+ balanceMinor = parsed.balanceMinor;
85
+ }
86
+ catch {
87
+ // non-JSON body — fall through to a generic error
88
+ }
89
+ if (status === 409 && code === 'insufficient_balance') {
90
+ return new InsufficientBalanceError(balanceMinor ?? 0, body);
91
+ }
92
+ if (status === 409 && code === 'over_refund')
93
+ return new OverRefundError(body);
94
+ if (status === 409 && code === 'idempotency_conflict')
95
+ return new IdempotencyConflictError(body);
96
+ if (status === 422 && code === 'invalid_reversal')
97
+ return new InvalidReversalError(body);
98
+ if (status === 422 && code === 'unresolvable_wallet')
99
+ return new UnresolvableWalletError(body);
100
+ if (status === 404)
101
+ return new WalletNotFoundError(body);
102
+ return new WalletApiError(status, body);
103
+ }
104
+ function createWalletClient(input = {}) {
105
+ const state = new config_1.ConfigState();
106
+ state.apply(input);
107
+ const client = {
108
+ config(opts) {
109
+ state.apply(opts);
110
+ return client;
111
+ },
112
+ auth(opts) {
113
+ state.setAuth(opts);
114
+ return client;
115
+ },
116
+ getWallet(opts) {
117
+ // Parse eagerly so a malformed id fails fast at the call site,
118
+ // but do NOT resolve the wallet here — that happens on the first
119
+ // operation against the handle.
120
+ const businessId = parseBusinessId(opts.id);
121
+ const forceChildWallet = opts.forceChildWallet === true;
122
+ const baseParams = () => {
123
+ const p = new URLSearchParams({ businessId: String(businessId) });
124
+ if (forceChildWallet)
125
+ p.set('forceChildWallet', 'true');
126
+ return p;
127
+ };
128
+ const postTransaction = async (type, body) => {
129
+ const path = '/v1/wallet/transactions';
130
+ const payload = JSON.stringify({ businessId, forceChildWallet, type, ...body });
131
+ const config = state.resolve();
132
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
133
+ method: 'POST',
134
+ path,
135
+ url: `${config.baseUrl}${path}`,
136
+ body: payload,
137
+ });
138
+ if (!res.ok)
139
+ throw walletError(res.status, await res.text());
140
+ return (await res.json());
141
+ };
142
+ const wallet = {
143
+ async getBalance() {
144
+ const path = '/v1/wallet/balance';
145
+ const config = state.resolve();
146
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
147
+ method: 'GET',
148
+ path,
149
+ url: `${config.baseUrl}${path}?${baseParams().toString()}`,
150
+ });
151
+ if (!res.ok)
152
+ throw walletError(res.status, await res.text());
153
+ return (await res.json());
154
+ },
155
+ async getInstance() {
156
+ const path = '/v1/wallet/instance';
157
+ const config = state.resolve();
158
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
159
+ method: 'GET',
160
+ path,
161
+ url: `${config.baseUrl}${path}?${baseParams().toString()}`,
162
+ });
163
+ if (!res.ok)
164
+ throw walletError(res.status, await res.text());
165
+ return (await res.json());
166
+ },
167
+ async getCurrency() {
168
+ return (await wallet.getInstance()).currency;
169
+ },
170
+ debit(body) {
171
+ return postTransaction('debit', body);
172
+ },
173
+ credit(body) {
174
+ return postTransaction('credit', body);
175
+ },
176
+ async listTransactions(filter = {}) {
177
+ const p = baseParams();
178
+ if (filter.type)
179
+ p.set('type', filter.type);
180
+ if (filter.from)
181
+ p.set('from', filter.from);
182
+ if (filter.to)
183
+ p.set('to', filter.to);
184
+ if (filter.service !== undefined)
185
+ p.set('service', String(filter.service));
186
+ if (filter.referenceId)
187
+ p.set('referenceId', filter.referenceId);
188
+ if (filter.tag)
189
+ p.set('tag', filter.tag);
190
+ if (filter.cursor)
191
+ p.set('cursor', filter.cursor);
192
+ if (filter.limit !== undefined)
193
+ p.set('limit', String(filter.limit));
194
+ const path = '/v1/wallet/transactions';
195
+ const config = state.resolve();
196
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
197
+ method: 'GET',
198
+ path,
199
+ url: `${config.baseUrl}${path}?${p.toString()}`,
200
+ });
201
+ if (!res.ok)
202
+ throw walletError(res.status, await res.text());
203
+ return (await res.json());
204
+ },
205
+ async getTransaction(id) {
206
+ const path = `/v1/wallet/transactions/${id}`;
207
+ const config = state.resolve();
208
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
209
+ method: 'GET',
210
+ path,
211
+ url: `${config.baseUrl}${path}?${baseParams().toString()}`,
212
+ });
213
+ if (!res.ok)
214
+ throw walletError(res.status, await res.text());
215
+ return (await res.json());
216
+ },
217
+ };
218
+ return wallet;
219
+ },
220
+ };
221
+ return client;
222
+ }
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUpBLGdEQWdIQztBQXZRRCxzQ0FLbUI7QUFDbkIsa0NBQTRDO0FBZ0Q1QyxNQUFhLGNBQWUsU0FBUSxLQUFLO0lBQzlCLE1BQU0sQ0FBUztJQUNmLElBQUksQ0FBUztJQUV0QixZQUFZLE1BQWMsRUFBRSxJQUFZO1FBQ3RDLEtBQUssQ0FBQyxjQUFjLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsd0NBVUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBYSx3QkFBeUIsU0FBUSxjQUFjO0lBQ2pELFlBQVksQ0FBUztJQUM5QixZQUFZLFlBQW9CLEVBQUUsSUFBWTtRQUM1QyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBUEQsNERBT0M7QUFFRCw4RUFBOEU7QUFDOUUsTUFBYSxlQUFnQixTQUFRLGNBQWM7SUFDakQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELDhFQUE4RTtBQUM5RSxNQUFhLG9CQUFxQixTQUFRLGNBQWM7SUFDdEQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxD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LE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDN0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFvQixDQUFDO2dCQUMvQyxDQUFDO2dCQUNELEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDckIsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLEVBQUUsRUFBRSxDQUFDO29CQUM3QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSx3QkFBaUIsRUFBQyxNQUFNLEVBQUU7d0JBQzFDLE1BQU0sRUFBRSxLQUFLO3dCQUNiLElBQUk7d0JBQ0osR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7cUJBQzNELENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQUUsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUM3RCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQXNCLENBQUM7Z0JBQ2pELENBQUM7YUFDRixDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlnU3RhdGUsXG4gIHR5cGUgUGxhdGZvcm1BdXRoLFxuICB0eXBlIFBsYXRmb3JtQXV0aElucHV0LFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnSW5wdXQsXG59IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBzZW5kV2l0aEF1dGhSZXRyeSB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHR5cGUge1xuICBDcmVkaXRJbnB1dCxcbiAgQ3VycmVuY3ksXG4gIERlYml0SW5wdXQsXG4gIEdldFdhbGxldE9wdGlvbnMsXG4gIExpc3RUcmFuc2FjdGlvbnNGaWx0ZXIsXG4gIFRyYW5zYWN0aW9uUGFnZSxcbiAgVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFdhbGxldEJhbGFuY2UsXG4gIFdhbGxldEluc3RhbmNlLFxuICBXYWxsZXRUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi9zY2hlbWEnO1xuXG4vKipcbiAqIEEgaGFuZGxlIHRvIG9uZSBidXNpbmVzcyB3YWxsZXQuIENoZWFwIHRvIGNyZWF0ZSDigJQgYGdldFdhbGxldCguLi4pYFxuICogZG9lcyBubyBJL08uIFRoZSB3YWxsZXQgaXMgcmVzb2x2ZWQgc2VydmVyLXNpZGUgb24gdGhlIGZpcnN0XG4gKiBvcGVyYXRpb24sIHNvIGBVbnJlc29sdmFibGVXYWxsZXRFcnJvcmAgLyBgV2FsbGV0Tm90Rm91bmRFcnJvcmBcbiAqIHN1cmZhY2UgZnJvbSB0aGUgb3BlcmF0aW9uLCBub3QgZnJvbSBgZ2V0V2FsbGV0KClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldCB7XG4gIC8qKiBHRVQgL3YxL3dhbGxldC9iYWxhbmNlIOKAlCByZXNvbHZlcyB0aGUgd2FsbGV0IGFuZCByZXR1cm5zIGl0cyBiYWxhbmNlICsgY3VycmVuY3kuICovXG4gIGdldEJhbGFuY2UoKTogUHJvbWlzZTxXYWxsZXRCYWxhbmNlPjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L2luc3RhbmNlIOKAlCB3YWxsZXQgaWRlbnRpdHkgKyBjdXJyZW5jeSwgd2l0aG91dCB0aGUgYmFsYW5jZS4gKi9cbiAgZ2V0SW5zdGFuY2UoKTogUHJvbWlzZTxXYWxsZXRJbnN0YW5jZT47XG4gIC8qKiBUaGUgd2FsbGV0J3MgY3VycmVuY3kgYHtjb2RlLCBzeW1ib2x9YCAoYSBzbGljZSBvZiBnZXRJbnN0YW5jZSgpKS4gKi9cbiAgZ2V0Q3VycmVuY3koKTogUHJvbWlzZTxDdXJyZW5jeT47XG4gIC8qKiBQT1NUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zICh0eXBlPWRlYml0KS4gSWRlbXBvdGVudCBvbiBgcmVmZXJlbmNlSWRgLiAqL1xuICBkZWJpdChpbnB1dDogRGViaXRJbnB1dCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+O1xuICAvKiogUE9TVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyAodHlwZT1jcmVkaXQpLiBQYXNzIGByZXZlcnNhbE9mYCBmb3IgYSByZWZ1bmQuICovXG4gIGNyZWRpdChpbnB1dDogQ3JlZGl0SW5wdXQpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyDigJQgbmV3ZXN0LWZpcnN0LCBrZXlzZXQtcGFnaW5hdGVkLiAqL1xuICBsaXN0VHJhbnNhY3Rpb25zKGZpbHRlcj86IExpc3RUcmFuc2FjdGlvbnNGaWx0ZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uUGFnZT47XG4gIC8qKiBHRVQgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMvOmlkIOKAlCBzY29wZWQgdG8gdGhpcyB3YWxsZXQuICovXG4gIGdldFRyYW5zYWN0aW9uKGlkOiBzdHJpbmcpOiBQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDbGllbnQge1xuICBjb25maWcoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiBXYWxsZXRDbGllbnQ7XG4gIGF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogV2FsbGV0Q2xpZW50O1xuICAvKipcbiAgICogQnVpbGQgYSBoYW5kbGUgdG8gYSBidXNpbmVzcyB3YWxsZXQuIFN5bmNocm9ub3VzIGFuZCBJL08tZnJlZSDigJQgaXRcbiAgICogb25seSBwYXJzZXMgYGlkYC4gUmVxdWlyZXMgYSBzZXJ2aWNlIHRva2VuIGNhcnJ5aW5nIHRoZSByZWxldmFudFxuICAgKiBgd2FsbGV0LipgIHNjb3BlIGZvciB0aGUgb3BlcmF0aW9ucyBvbiB0aGUgcmV0dXJuZWQgaGFuZGxlLlxuICAgKi9cbiAgZ2V0V2FsbGV0KG9wdHM6IEdldFdhbGxldE9wdGlvbnMpOiBXYWxsZXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBXYWxsZXRBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYHdhbGxldCBBUEkgJHtzdGF0dXN9OiAke2JvZHl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1dhbGxldEFwaUVycm9yJztcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuICB9XG59XG5cbi8qKiBBIGRlYml0IHdvdWxkIG92ZXJkcmF3IHRoZSB3YWxsZXQ7IG5vdGhpbmcgd2FzIG1vdmVkIChIVFRQIDQwOSkuICovXG5leHBvcnQgY2xhc3MgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICByZWFkb25seSBiYWxhbmNlTWlub3I6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoYmFsYW5jZU1pbm9yOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0luc3VmZmljaWVudEJhbGFuY2VFcnJvcic7XG4gICAgdGhpcy5iYWxhbmNlTWlub3IgPSBiYWxhbmNlTWlub3I7XG4gIH1cbn1cblxuLyoqIEEgcmVmdW5kIHdvdWxkIHB1c2ggdG90YWwgcmV2ZXJzYWxzIHBhc3QgdGhlIG9yaWdpbmFsIGRlYml0IChIVFRQIDQwOSkuICovXG5leHBvcnQgY2xhc3MgT3ZlclJlZnVuZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdPdmVyUmVmdW5kRXJyb3InO1xuICB9XG59XG5cbi8qKiBgcmV2ZXJzYWxPZmAgZG9lc24ndCByZWZlcmVuY2UgYSB2YWxpZCBkZWJpdCBvbiB0aGlzIHdhbGxldCAoSFRUUCA0MjIpLiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRSZXZlcnNhbEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MjIsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkUmV2ZXJzYWxFcnJvcic7XG4gIH1cbn1cblxuLyoqIEEgYHJlZmVyZW5jZUlkYCB3YXMgcmV1c2VkIHdpdGggYSBkaWZmZXJlbnQgYW1vdW50L3R5cGUvc2VydmljZSAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnSWRlbXBvdGVuY3lDb25mbGljdEVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGJ1c2luZXNzLCBvciB0aGUgYnVzaW5lc3MgaXRzIGBiSWRfZGVkdWN0aW9uYCBwb2ludHMgdG8sIGRvZXMgbm90IGV4aXN0IChIVFRQIDQyMikuICovXG5leHBvcnQgY2xhc3MgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQyMiwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ1VucmVzb2x2YWJsZVdhbGxldEVycm9yJztcbiAgfVxufVxuXG4vKiogTm8gd2FsbGV0IGRvY3VtZW50LCBvciBubyBzdWNoIHRyYW5zYWN0aW9uIG9uIHRoaXMgd2FsbGV0IChIVFRQIDQwNCkuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0Tm90Rm91bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA0LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuY29uc3QgQlVTSU5FU1NfSURfUkUgPSAvXmJ1c2luZXNzOihcXGQrKSQvO1xuXG4vKiogUGFyc2UgYSB0eXBlZCB3YWxsZXQgaWQgKGBcImJ1c2luZXNzOjg4NDFcImApIGludG8gdGhlIG51bWVyaWMgYnVzaW5lc3MgaWQuICovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSWQoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG1hdGNoID0gQlVTSU5FU1NfSURfUkUuZXhlYyhpZCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgd2FsbGV0LmdldFdhbGxldDogaWQgbXVzdCBsb29rIGxpa2UgXCJidXNpbmVzczo8cG9zaXRpdmUgaW50ZWdlcj5cIiAoZ290IFwiJHtpZH1cIilgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xufVxuXG4vKiogTWFwIGEgbm9uLTJ4eCB3YWxsZXQgcmVzcG9uc2UgdG8gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZWQgZXJyb3IuICovXG5mdW5jdGlvbiB3YWxsZXRFcnJvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKTogV2FsbGV0QXBpRXJyb3Ige1xuICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgYmFsYW5jZU1pbm9yOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShib2R5KSBhcyB7IGVycm9yPzogc3RyaW5nOyBiYWxhbmNlTWlub3I/OiBudW1iZXIgfTtcbiAgICBjb2RlID0gcGFyc2VkLmVycm9yO1xuICAgIGJhbGFuY2VNaW5vciA9IHBhcnNlZC5iYWxhbmNlTWlub3I7XG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vbi1KU09OIGJvZHkg4oCUIGZhbGwgdGhyb3VnaCB0byBhIGdlbmVyaWMgZXJyb3JcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ2luc3VmZmljaWVudF9iYWxhbmNlJykge1xuICAgIHJldHVybiBuZXcgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yKGJhbGFuY2VNaW5vciA/PyAwLCBib2R5KTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ292ZXJfcmVmdW5kJykgcmV0dXJuIG5ldyBPdmVyUmVmdW5kRXJyb3IoYm9keSk7XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnaWRlbXBvdGVuY3lfY29uZmxpY3QnKSByZXR1cm4gbmV3IElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICdpbnZhbGlkX3JldmVyc2FsJykgcmV0dXJuIG5ldyBJbnZhbGlkUmV2ZXJzYWxFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICd1bnJlc29sdmFibGVfd2FsbGV0JykgcmV0dXJuIG5ldyBVbnJlc29sdmFibGVXYWxsZXRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbmV3IFdhbGxldE5vdEZvdW5kRXJyb3IoYm9keSk7XG4gIHJldHVybiBuZXcgV2FsbGV0QXBpRXJyb3Ioc3RhdHVzLCBib2R5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhbGxldENsaWVudChpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9KTogV2FsbGV0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgc3RhdGUuYXBwbHkoaW5wdXQpO1xuXG4gIGNvbnN0IGNsaWVudDogV2FsbGV0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgZ2V0V2FsbGV0KG9wdHMpIHtcbiAgICAgIC8vIFBhcnNlIGVhZ2VybHkgc28gYSBtYWxmb3JtZWQgaWQgZmFpbHMgZmFzdCBhdCB0aGUgY2FsbCBzaXRlLFxuICAgICAgLy8gYnV0IGRvIE5PVCByZXNvbHZlIHRoZSB3YWxsZXQgaGVyZSDigJQgdGhhdCBoYXBwZW5zIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gb3BlcmF0aW9uIGFnYWluc3QgdGhlIGhhbmRsZS5cbiAgICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBwYXJzZUJ1c2luZXNzSWQob3B0cy5pZCk7XG4gICAgICBjb25zdCBmb3JjZUNoaWxkV2FsbGV0ID0gb3B0cy5mb3JjZUNoaWxkV2FsbGV0ID09PSB0cnVlO1xuXG4gICAgICBjb25zdCBiYXNlUGFyYW1zID0gKCk6IFVSTFNlYXJjaFBhcmFtcyA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYnVzaW5lc3NJZDogU3RyaW5nKGJ1c2luZXNzSWQpIH0pO1xuICAgICAgICBpZiAoZm9yY2VDaGlsZFdhbGxldCkgcC5zZXQoJ2ZvcmNlQ2hpbGRXYWxsZXQnLCAndHJ1ZScpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBvc3RUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogJ2RlYml0JyB8ICdjcmVkaXQnLFxuICAgICAgICBib2R5OiBEZWJpdElucHV0IHwgQ3JlZGl0SW5wdXQsXG4gICAgICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC90cmFuc2FjdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoeyBidXNpbmVzc0lkLCBmb3JjZUNoaWxkV2FsbGV0LCB0eXBlLCAuLi5ib2R5IH0pO1xuICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9YCxcbiAgICAgICAgICBib2R5OiBwYXlsb2FkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFRyYW5zYWN0aW9uUmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgd2FsbGV0OiBXYWxsZXQgPSB7XG4gICAgICAgIGFzeW5jIGdldEJhbGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L2JhbGFuY2UnO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9PyR7YmFzZVBhcmFtcygpLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBXYWxsZXRCYWxhbmNlO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gJy92MS93YWxsZXQvaW5zdGFuY2UnO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9PyR7YmFzZVBhcmFtcygpLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBXYWxsZXRJbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0Q3VycmVuY3koKSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCB3YWxsZXQuZ2V0SW5zdGFuY2UoKSkuY3VycmVuY3k7XG4gICAgICAgIH0sXG4gICAgICAgIGRlYml0KGJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFRyYW5zYWN0aW9uKCdkZWJpdCcsIGJvZHkpO1xuICAgICAgICB9LFxuICAgICAgICBjcmVkaXQoYm9keSkge1xuICAgICAgICAgIHJldHVybiBwb3N0VHJhbnNhY3Rpb24oJ2NyZWRpdCcsIGJvZHkpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKGZpbHRlciA9IHt9KSB7XG4gICAgICAgICAgY29uc3QgcCA9IGJhc2VQYXJhbXMoKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnR5cGUpIHAuc2V0KCd0eXBlJywgZmlsdGVyLnR5cGUpO1xuICAgICAgICAgIGlmIChmaWx0ZXIuZnJvbSkgcC5zZXQoJ2Zyb20nLCBmaWx0ZXIuZnJvbSk7XG4gICAgICAgICAgaWYgKGZpbHRlci50bykgcC5zZXQoJ3RvJywgZmlsdGVyLnRvKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnNlcnZpY2UgIT09IHVuZGVmaW5lZCkgcC5zZXQoJ3NlcnZpY2UnLCBTdHJpbmcoZmlsdGVyLnNlcnZpY2UpKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnJlZmVyZW5jZUlkKSBwLnNldCgncmVmZXJlbmNlSWQnLCBmaWx0ZXIucmVmZXJlbmNlSWQpO1xuICAgICAgICAgIGlmIChmaWx0ZXIudGFnKSBwLnNldCgndGFnJywgZmlsdGVyLnRhZyk7XG4gICAgICAgICAgaWYgKGZpbHRlci5jdXJzb3IpIHAuc2V0KCdjdXJzb3InLCBmaWx0ZXIuY3Vyc29yKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmxpbWl0ICE9PSB1bmRlZmluZWQpIHAuc2V0KCdsaW1pdCcsIFN0cmluZyhmaWx0ZXIubGltaXQpKTtcbiAgICAgICAgICBjb25zdCBwYXRoID0gJy92MS93YWxsZXQvdHJhbnNhY3Rpb25zJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke3AudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFRyYW5zYWN0aW9uUGFnZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24oaWQpIHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gYC92MS93YWxsZXQvdHJhbnNhY3Rpb25zLyR7aWR9YDtcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0VHJhbnNhY3Rpb247XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHdhbGxldDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export type { WalletRef, WalletBalance, WalletInstance, Currency, Amount, Balance, ServiceRef, GetWalletOptions, Breakup, WalletTags, DebitInput, CreditInput, TransactionResult, WalletTransaction, ListTransactionsFilter, TransactionPage, } from './schema';
2
+ export { Services, type Service } from './services';
3
+ export { createWalletClient, WalletApiError, InsufficientBalanceError, OverRefundError, InvalidReversalError, IdempotencyConflictError, UnresolvableWalletError, WalletNotFoundError, type WalletClient, type Wallet, } from './client';
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = exports.createWalletClient = exports.Services = void 0;
4
+ var services_1 = require("./services");
5
+ Object.defineProperty(exports, "Services", { enumerable: true, get: function () { return services_1.Services; } });
6
+ var client_1 = require("./client");
7
+ Object.defineProperty(exports, "createWalletClient", { enumerable: true, get: function () { return client_1.createWalletClient; } });
8
+ Object.defineProperty(exports, "WalletApiError", { enumerable: true, get: function () { return client_1.WalletApiError; } });
9
+ Object.defineProperty(exports, "InsufficientBalanceError", { enumerable: true, get: function () { return client_1.InsufficientBalanceError; } });
10
+ Object.defineProperty(exports, "OverRefundError", { enumerable: true, get: function () { return client_1.OverRefundError; } });
11
+ Object.defineProperty(exports, "InvalidReversalError", { enumerable: true, get: function () { return client_1.InvalidReversalError; } });
12
+ Object.defineProperty(exports, "IdempotencyConflictError", { enumerable: true, get: function () { return client_1.IdempotencyConflictError; } });
13
+ Object.defineProperty(exports, "UnresolvableWalletError", { enumerable: true, get: function () { return client_1.UnresolvableWalletError; } });
14
+ Object.defineProperty(exports, "WalletNotFoundError", { enumerable: true, get: function () { return client_1.WalletNotFoundError; } });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FsbGV0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWtCQSx1Q0FBb0Q7QUFBM0Msb0dBQUEsUUFBUSxPQUFBO0FBQ2pCLG1DQVdrQjtBQVZoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix3R0FBQSxjQUFjLE9BQUE7QUFDZCxrSEFBQSx3QkFBd0IsT0FBQTtBQUN4Qix5R0FBQSxlQUFlLE9BQUE7QUFDZiw4R0FBQSxvQkFBb0IsT0FBQTtBQUNwQixrSEFBQSx3QkFBd0IsT0FBQTtBQUN4QixpSEFBQSx1QkFBdUIsT0FBQTtBQUN2Qiw2R0FBQSxtQkFBbUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHtcbiAgV2FsbGV0UmVmLFxuICBXYWxsZXRCYWxhbmNlLFxuICBXYWxsZXRJbnN0YW5jZSxcbiAgQ3VycmVuY3ksXG4gIEFtb3VudCxcbiAgQmFsYW5jZSxcbiAgU2VydmljZVJlZixcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgQnJlYWt1cCxcbiAgV2FsbGV0VGFncyxcbiAgRGViaXRJbnB1dCxcbiAgQ3JlZGl0SW5wdXQsXG4gIFRyYW5zYWN0aW9uUmVzdWx0LFxuICBXYWxsZXRUcmFuc2FjdGlvbixcbiAgTGlzdFRyYW5zYWN0aW9uc0ZpbHRlcixcbiAgVHJhbnNhY3Rpb25QYWdlLFxufSBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQgeyBTZXJ2aWNlcywgdHlwZSBTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5leHBvcnQge1xuICBjcmVhdGVXYWxsZXRDbGllbnQsXG4gIFdhbGxldEFwaUVycm9yLFxuICBJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3IsXG4gIE92ZXJSZWZ1bmRFcnJvcixcbiAgSW52YWxpZFJldmVyc2FsRXJyb3IsXG4gIElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcixcbiAgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IsXG4gIFdhbGxldE5vdEZvdW5kRXJyb3IsXG4gIHR5cGUgV2FsbGV0Q2xpZW50LFxuICB0eXBlIFdhbGxldCxcbn0gZnJvbSAnLi9jbGllbnQnO1xuIl19
@@ -0,0 +1,132 @@
1
+ import type { Service } from './services';
2
+ /**
3
+ * Wallet identity inside the platform wallet service. `childBusinessId`
4
+ * is `"0"` when the parent business's own wallet answered (parent-chain
5
+ * billing resolved on the outlet's behalf).
6
+ */
7
+ export interface WalletRef {
8
+ parentBusinessId: string;
9
+ childBusinessId: string;
10
+ }
11
+ /** Currency descriptor for a wallet. */
12
+ export interface Currency {
13
+ /** ISO code, e.g. `"INR"`. */
14
+ code: string;
15
+ /** Display symbol, e.g. `"₹"`. */
16
+ symbol: string;
17
+ }
18
+ /** A transaction amount in major + integer minor units. */
19
+ export interface Amount {
20
+ amount: number;
21
+ amountMinor: number;
22
+ }
23
+ /** A balance in major + integer minor units. */
24
+ export interface Balance {
25
+ balance: number;
26
+ balanceMinor: number;
27
+ }
28
+ /** A chargeable service, as returned on a transaction. */
29
+ export interface ServiceRef {
30
+ id: number;
31
+ name: string;
32
+ }
33
+ export interface WalletBalance {
34
+ /** Balance in major units. */
35
+ balance: number;
36
+ /** Balance in integer minor units, per the wallet's currency. */
37
+ balanceMinor: number;
38
+ currency: Currency;
39
+ }
40
+ /** Wallet details (identity + currency), without the balance. */
41
+ export interface WalletInstance {
42
+ wallet: WalletRef;
43
+ currency: Currency;
44
+ }
45
+ /**
46
+ * Options for `wallet.getWallet(...)`.
47
+ *
48
+ * `id` is a typed entity reference, e.g. `"business:8841"` (same
49
+ * prefixed shape the platform uses for JWT subjects). Today only the
50
+ * `business:` prefix is supported.
51
+ */
52
+ export interface GetWalletOptions {
53
+ id: string;
54
+ /**
55
+ * Force the business's own (child) wallet, bypassing parent-funding
56
+ * routing (`flash_configuration.bId_deduction`). Default `false` — the
57
+ * service resolves child-vs-parent automatically. No effect for a root
58
+ * business, which only has its own wallet.
59
+ */
60
+ forceChildWallet?: boolean;
61
+ }
62
+ /** The GST split on a charge. Recorded on the ledger; the service does not compute GST. */
63
+ export interface Breakup {
64
+ subTotalMinor: number;
65
+ gstMinor: number;
66
+ gstRate: number;
67
+ }
68
+ /** Searchable key/value metadata attached to a transaction. */
69
+ export type WalletTags = Record<string, string>;
70
+ /** Fields common to a debit and a credit. */
71
+ interface TransactionInputBase {
72
+ /** Deterministic id of the business event — the idempotency key. */
73
+ referenceId: string;
74
+ /** Amount in integer minor units of the wallet's currency. */
75
+ amountMinor: number;
76
+ service: Service;
77
+ description: string;
78
+ breakup?: Breakup;
79
+ tags?: WalletTags;
80
+ }
81
+ export interface DebitInput extends TransactionInputBase {
82
+ /** Allow the balance to go negative (flash migration only — needs sign-off). */
83
+ allowNegative?: boolean;
84
+ }
85
+ export interface CreditInput extends TransactionInputBase {
86
+ /** Link a refund to the original debit's `id`; subject to the over-refund guard. */
87
+ reversalOf?: string;
88
+ }
89
+ /** What `debit()` / `credit()` return. */
90
+ export interface TransactionResult {
91
+ /** The wallet_transactions record id. Persist this; use as `reversalOf` for a refund. */
92
+ id: string;
93
+ /** `true` = a replay of an earlier identical referenceId; no money moved now. */
94
+ idempotent: boolean;
95
+ type: 'debit' | 'credit';
96
+ amount: Amount;
97
+ balanceBefore: Balance;
98
+ balanceAfter: Balance;
99
+ currency: Currency;
100
+ wallet: WalletRef;
101
+ }
102
+ /** A transaction as returned by `listTransactions()` / `getTransaction()`. */
103
+ export interface WalletTransaction {
104
+ id: string;
105
+ type: string;
106
+ amount: Amount;
107
+ service: ServiceRef;
108
+ description: string;
109
+ tags?: WalletTags;
110
+ reversalOf?: string;
111
+ balanceBefore: Balance;
112
+ balanceAfter: Balance;
113
+ timestamp: string;
114
+ currency: Currency;
115
+ wallet: WalletRef;
116
+ }
117
+ export interface ListTransactionsFilter {
118
+ type?: 'debit' | 'credit' | 'all';
119
+ from?: string;
120
+ to?: string;
121
+ service?: Service;
122
+ referenceId?: string;
123
+ /** Single tag filter as `key:value`. */
124
+ tag?: string;
125
+ cursor?: string;
126
+ limit?: number;
127
+ }
128
+ export interface TransactionPage {
129
+ transactions: WalletTransaction[];
130
+ nextCursor?: string;
131
+ }
132
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMnO1xuXG4vKipcbiAqIFdhbGxldCBpZGVudGl0eSBpbnNpZGUgdGhlIHBsYXRmb3JtIHdhbGxldCBzZXJ2aWNlLiBgY2hpbGRCdXNpbmVzc0lkYFxuICogaXMgYFwiMFwiYCB3aGVuIHRoZSBwYXJlbnQgYnVzaW5lc3MncyBvd24gd2FsbGV0IGFuc3dlcmVkIChwYXJlbnQtY2hhaW5cbiAqIGJpbGxpbmcgcmVzb2x2ZWQgb24gdGhlIG91dGxldCdzIGJlaGFsZikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0UmVmIHtcbiAgcGFyZW50QnVzaW5lc3NJZDogc3RyaW5nO1xuICBjaGlsZEJ1c2luZXNzSWQ6IHN0cmluZztcbn1cblxuLyoqIEN1cnJlbmN5IGRlc2NyaXB0b3IgZm9yIGEgd2FsbGV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXJyZW5jeSB7XG4gIC8qKiBJU08gY29kZSwgZS5nLiBgXCJJTlJcImAuICovXG4gIGNvZGU6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgc3ltYm9sLCBlLmcuIGBcIuKCuVwiYC4gKi9cbiAgc3ltYm9sOiBzdHJpbmc7XG59XG5cbi8qKiBBIHRyYW5zYWN0aW9uIGFtb3VudCBpbiBtYWpvciArIGludGVnZXIgbWlub3IgdW5pdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEFtb3VudCB7XG4gIGFtb3VudDogbnVtYmVyO1xuICBhbW91bnRNaW5vcjogbnVtYmVyO1xufVxuXG4vKiogQSBiYWxhbmNlIGluIG1ham9yICsgaW50ZWdlciBtaW5vciB1bml0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFsYW5jZSB7XG4gIGJhbGFuY2U6IG51bWJlcjtcbiAgYmFsYW5jZU1pbm9yOiBudW1iZXI7XG59XG5cbi8qKiBBIGNoYXJnZWFibGUgc2VydmljZSwgYXMgcmV0dXJuZWQgb24gYSB0cmFuc2FjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVJlZiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRCYWxhbmNlIHtcbiAgLyoqIEJhbGFuY2UgaW4gbWFqb3IgdW5pdHMuICovXG4gIGJhbGFuY2U6IG51bWJlcjtcbiAgLyoqIEJhbGFuY2UgaW4gaW50ZWdlciBtaW5vciB1bml0cywgcGVyIHRoZSB3YWxsZXQncyBjdXJyZW5jeS4gKi9cbiAgYmFsYW5jZU1pbm9yOiBudW1iZXI7XG4gIGN1cnJlbmN5OiBDdXJyZW5jeTtcbn1cblxuLyoqIFdhbGxldCBkZXRhaWxzIChpZGVudGl0eSArIGN1cnJlbmN5KSwgd2l0aG91dCB0aGUgYmFsYW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0SW5zdGFuY2Uge1xuICB3YWxsZXQ6IFdhbGxldFJlZjtcbiAgY3VycmVuY3k6IEN1cnJlbmN5O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGB3YWxsZXQuZ2V0V2FsbGV0KC4uLilgLlxuICpcbiAqIGBpZGAgaXMgYSB0eXBlZCBlbnRpdHkgcmVmZXJlbmNlLCBlLmcuIGBcImJ1c2luZXNzOjg4NDFcImAgKHNhbWVcbiAqIHByZWZpeGVkIHNoYXBlIHRoZSBwbGF0Zm9ybSB1c2VzIGZvciBKV1Qgc3ViamVjdHMpLiBUb2RheSBvbmx5IHRoZVxuICogYGJ1c2luZXNzOmAgcHJlZml4IGlzIHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRXYWxsZXRPcHRpb25zIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBidXNpbmVzcydzIG93biAoY2hpbGQpIHdhbGxldCwgYnlwYXNzaW5nIHBhcmVudC1mdW5kaW5nXG4gICAqIHJvdXRpbmcgKGBmbGFzaF9jb25maWd1cmF0aW9uLmJJZF9kZWR1Y3Rpb25gKS4gRGVmYXVsdCBgZmFsc2VgIOKAlCB0aGVcbiAgICogc2VydmljZSByZXNvbHZlcyBjaGlsZC12cy1wYXJlbnQgYXV0b21hdGljYWxseS4gTm8gZWZmZWN0IGZvciBhIHJvb3RcbiAgICogYnVzaW5lc3MsIHdoaWNoIG9ubHkgaGFzIGl0cyBvd24gd2FsbGV0LlxuICAgKi9cbiAgZm9yY2VDaGlsZFdhbGxldD86IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgR1NUIHNwbGl0IG9uIGEgY2hhcmdlLiBSZWNvcmRlZCBvbiB0aGUgbGVkZ2VyOyB0aGUgc2VydmljZSBkb2VzIG5vdCBjb21wdXRlIEdTVC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWt1cCB7XG4gIHN1YlRvdGFsTWlub3I6IG51bWJlcjtcbiAgZ3N0TWlub3I6IG51bWJlcjtcbiAgZ3N0UmF0ZTogbnVtYmVyO1xufVxuXG4vKiogU2VhcmNoYWJsZSBrZXkvdmFsdWUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gYSB0cmFuc2FjdGlvbi4gKi9cbmV4cG9ydCB0eXBlIFdhbGxldFRhZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4vKiogRmllbGRzIGNvbW1vbiB0byBhIGRlYml0IGFuZCBhIGNyZWRpdC4gKi9cbmludGVyZmFjZSBUcmFuc2FjdGlvbklucHV0QmFzZSB7XG4gIC8qKiBEZXRlcm1pbmlzdGljIGlkIG9mIHRoZSBidXNpbmVzcyBldmVudCDigJQgdGhlIGlkZW1wb3RlbmN5IGtleS4gKi9cbiAgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgLyoqIEFtb3VudCBpbiBpbnRlZ2VyIG1pbm9yIHVuaXRzIG9mIHRoZSB3YWxsZXQncyBjdXJyZW5jeS4gKi9cbiAgYW1vdW50TWlub3I6IG51bWJlcjtcbiAgc2VydmljZTogU2VydmljZTtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgYnJlYWt1cD86IEJyZWFrdXA7XG4gIHRhZ3M/OiBXYWxsZXRUYWdzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlYml0SW5wdXQgZXh0ZW5kcyBUcmFuc2FjdGlvbklucHV0QmFzZSB7XG4gIC8qKiBBbGxvdyB0aGUgYmFsYW5jZSB0byBnbyBuZWdhdGl2ZSAoZmxhc2ggbWlncmF0aW9uIG9ubHkg4oCUIG5lZWRzIHNpZ24tb2ZmKS4gKi9cbiAgYWxsb3dOZWdhdGl2ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0SW5wdXQgZXh0ZW5kcyBUcmFuc2FjdGlvbklucHV0QmFzZSB7XG4gIC8qKiBMaW5rIGEgcmVmdW5kIHRvIHRoZSBvcmlnaW5hbCBkZWJpdCdzIGBpZGA7IHN1YmplY3QgdG8gdGhlIG92ZXItcmVmdW5kIGd1YXJkLiAqL1xuICByZXZlcnNhbE9mPzogc3RyaW5nO1xufVxuXG4vKiogV2hhdCBgZGViaXQoKWAgLyBgY3JlZGl0KClgIHJldHVybi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25SZXN1bHQge1xuICAvKiogVGhlIHdhbGxldF90cmFuc2FjdGlvbnMgcmVjb3JkIGlkLiBQZXJzaXN0IHRoaXM7IHVzZSBhcyBgcmV2ZXJzYWxPZmAgZm9yIGEgcmVmdW5kLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogYHRydWVgID0gYSByZXBsYXkgb2YgYW4gZWFybGllciBpZGVudGljYWwgcmVmZXJlbmNlSWQ7IG5vIG1vbmV5IG1vdmVkIG5vdy4gKi9cbiAgaWRlbXBvdGVudDogYm9vbGVhbjtcbiAgdHlwZTogJ2RlYml0JyB8ICdjcmVkaXQnO1xuICBhbW91bnQ6IEFtb3VudDtcbiAgYmFsYW5jZUJlZm9yZTogQmFsYW5jZTtcbiAgYmFsYW5jZUFmdGVyOiBCYWxhbmNlO1xuICBjdXJyZW5jeTogQ3VycmVuY3k7XG4gIHdhbGxldDogV2FsbGV0UmVmO1xufVxuXG4vKiogQSB0cmFuc2FjdGlvbiBhcyByZXR1cm5lZCBieSBgbGlzdFRyYW5zYWN0aW9ucygpYCAvIGBnZXRUcmFuc2FjdGlvbigpYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb24ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGFtb3VudDogQW1vdW50O1xuICBzZXJ2aWNlOiBTZXJ2aWNlUmVmO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0YWdzPzogV2FsbGV0VGFncztcbiAgcmV2ZXJzYWxPZj86IHN0cmluZztcbiAgYmFsYW5jZUJlZm9yZTogQmFsYW5jZTtcbiAgYmFsYW5jZUFmdGVyOiBCYWxhbmNlO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgY3VycmVuY3k6IEN1cnJlbmN5O1xuICB3YWxsZXQ6IFdhbGxldFJlZjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0VHJhbnNhY3Rpb25zRmlsdGVyIHtcbiAgdHlwZT86ICdkZWJpdCcgfCAnY3JlZGl0JyB8ICdhbGwnO1xuICBmcm9tPzogc3RyaW5nO1xuICB0bz86IHN0cmluZztcbiAgc2VydmljZT86IFNlcnZpY2U7XG4gIHJlZmVyZW5jZUlkPzogc3RyaW5nO1xuICAvKiogU2luZ2xlIHRhZyBmaWx0ZXIgYXMgYGtleTp2YWx1ZWAuICovXG4gIHRhZz86IHN0cmluZztcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblBhZ2Uge1xuICB0cmFuc2FjdGlvbnM6IFdhbGxldFRyYW5zYWN0aW9uW107XG4gIG5leHRDdXJzb3I/OiBzdHJpbmc7XG59XG4iXX0=
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Chargeable services. The value is the legacy `service_id` stored on
3
+ * every ledger entry (so existing reports/invoicing keep working);
4
+ * callers reference the named constant instead of hardcoding the
5
+ * number. Extend as new chargeable services are added.
6
+ */
7
+ export declare const Services: {
8
+ readonly RECHARGE: 0;
9
+ readonly SMS: 1;
10
+ readonly WHATSAPP: 4;
11
+ readonly FLASH_DELIVERY: 5;
12
+ readonly EMAIL: 10;
13
+ readonly ALERT: 40;
14
+ };
15
+ export type Service = (typeof Services)[keyof typeof Services];
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Services = void 0;
4
+ /**
5
+ * Chargeable services. The value is the legacy `service_id` stored on
6
+ * every ledger entry (so existing reports/invoicing keep working);
7
+ * callers reference the named constant instead of hardcoding the
8
+ * number. Extend as new chargeable services are added.
9
+ */
10
+ exports.Services = {
11
+ RECHARGE: 0,
12
+ SMS: 1,
13
+ WHATSAPP: 4,
14
+ FLASH_DELIVERY: 5,
15
+ EMAIL: 10,
16
+ ALERT: 40,
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FsbGV0L3NlcnZpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ1UsUUFBQSxRQUFRLEdBQUc7SUFDdEIsUUFBUSxFQUFFLENBQUM7SUFDWCxHQUFHLEVBQUUsQ0FBQztJQUNOLFFBQVEsRUFBRSxDQUFDO0lBQ1gsY0FBYyxFQUFFLENBQUM7SUFDakIsS0FBSyxFQUFFLEVBQUU7SUFDVCxLQUFLLEVBQUUsRUFBRTtDQUNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYXJnZWFibGUgc2VydmljZXMuIFRoZSB2YWx1ZSBpcyB0aGUgbGVnYWN5IGBzZXJ2aWNlX2lkYCBzdG9yZWQgb25cbiAqIGV2ZXJ5IGxlZGdlciBlbnRyeSAoc28gZXhpc3RpbmcgcmVwb3J0cy9pbnZvaWNpbmcga2VlcCB3b3JraW5nKTtcbiAqIGNhbGxlcnMgcmVmZXJlbmNlIHRoZSBuYW1lZCBjb25zdGFudCBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdGhlXG4gKiBudW1iZXIuIEV4dGVuZCBhcyBuZXcgY2hhcmdlYWJsZSBzZXJ2aWNlcyBhcmUgYWRkZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTZXJ2aWNlcyA9IHtcbiAgUkVDSEFSR0U6IDAsXG4gIFNNUzogMSxcbiAgV0hBVFNBUFA6IDQsXG4gIEZMQVNIX0RFTElWRVJZOiA1LFxuICBFTUFJTDogMTAsXG4gIEFMRVJUOiA0MCxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNlcnZpY2UgPSAodHlwZW9mIFNlcnZpY2VzKVtrZXlvZiB0eXBlb2YgU2VydmljZXNdO1xuIl19
@@ -0,0 +1,51 @@
1
+ import { type PlatformAuth, type PlatformAuthInput, type PlatformConfigInput } from '../config';
2
+ import type { ContainingInput, Zone, ZoneCreateInput, ZoneCreateResult, ZoneListOptions, ZoneListPage, ZonePatchInput, ZoneReplaceInput, ZoneSummary } from './schema';
3
+ export interface ZonesClient {
4
+ config(input: PlatformConfigInput): ZonesClient;
5
+ auth(input: PlatformAuthInput | PlatformAuth): ZonesClient;
6
+ /** POST /v1/zones - create a single zone. */
7
+ create(input: ZoneCreateInput): Promise<ZoneCreateResult>;
8
+ /** GET /v1/zones/{zid} - returns the full zone or throws ZonesApiError(404). */
9
+ get(zid: string): Promise<Zone>;
10
+ /** PATCH /v1/zones/{zid} - shallow tag merge; null deletes a key. */
11
+ update(zid: string, input: ZonePatchInput): Promise<Zone>;
12
+ /** PUT /v1/zones/{zid} - full replace of geometry + tags. */
13
+ replace(zid: string, input: ZoneReplaceInput): Promise<Zone>;
14
+ /** DELETE /v1/zones/{zid} - 404 if not present. */
15
+ delete(zid: string): Promise<void>;
16
+ /** GET /v1/zones?tags=... - tag-filtered, keyset-paginated listing. */
17
+ list(opts?: ZoneListOptions): Promise<ZoneListPage>;
18
+ /** POST /v1/zones/batch/create - bounded array; returned in input order. */
19
+ createMany(zones: readonly ZoneCreateInput[]): Promise<{
20
+ zones: Array<{
21
+ zid: string;
22
+ }>;
23
+ }>;
24
+ /** POST /v1/zones/batch/delete - returns the count actually deleted. */
25
+ deleteMany(zids: readonly string[]): Promise<{
26
+ deleted: number;
27
+ }>;
28
+ /** POST /v1/zones/containing - the spatial primitive. */
29
+ containing(input: ContainingInput): Promise<ZoneSummary[]>;
30
+ /** Sugar over containing({ point, ids: [zid] }). True iff the zone contains the point. */
31
+ contains(zid: string, point: ContainingInput['point']): Promise<boolean>;
32
+ }
33
+ export declare class ZonesApiError extends Error {
34
+ readonly status: number;
35
+ readonly body: string;
36
+ constructor(status: number, body: string);
37
+ }
38
+ /**
39
+ * Build the `zones` namespace.
40
+ *
41
+ * Shape and contract mirror {@link createBusinessClient} - lazy config
42
+ * resolution via {@link ConfigState}, shared 401-retry via
43
+ * {@link sendWithAuthRetry}, immutable per-call config; no globals.
44
+ *
45
+ * Writes (`create`, `update`, `replace`, `delete`, batch ops) require a
46
+ * service-actor token. Reads (`get`, `list`, `containing`, `contains`)
47
+ * accept either a service-actor or a user-actor token. The SDK does not
48
+ * enforce this - the server returns 401/403 and we surface it as
49
+ * {@link ZonesApiError}.
50
+ */
51
+ export declare function createZonesClient(input?: PlatformConfigInput): ZonesClient;