@elyonar/einvoice-mcp 0.1.1
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/LICENSE +21 -0
- package/README.md +133 -0
- package/bin/cli.js +2 -0
- package/dist/client/billing-client.d.ts +19 -0
- package/dist/client/billing-client.d.ts.map +1 -0
- package/dist/client/billing-client.js +62 -0
- package/dist/client/billing-client.js.map +1 -0
- package/dist/client/http-client.d.ts +44 -0
- package/dist/client/http-client.d.ts.map +1 -0
- package/dist/client/http-client.js +117 -0
- package/dist/client/http-client.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +12 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/invoice-client.d.ts +42 -0
- package/dist/client/invoice-client.d.ts.map +1 -0
- package/dist/client/invoice-client.js +107 -0
- package/dist/client/invoice-client.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/billing-tools.d.ts +11 -0
- package/dist/tools/billing-tools.d.ts.map +1 -0
- package/dist/tools/billing-tools.js +209 -0
- package/dist/tools/billing-tools.js.map +1 -0
- package/dist/tools/buyer-tools.d.ts +11 -0
- package/dist/tools/buyer-tools.d.ts.map +1 -0
- package/dist/tools/buyer-tools.js +148 -0
- package/dist/tools/buyer-tools.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/invoice-tools.d.ts +11 -0
- package/dist/tools/invoice-tools.d.ts.map +1 -0
- package/dist/tools/invoice-tools.js +319 -0
- package/dist/tools/invoice-tools.js.map +1 -0
- package/dist/tools/seller-tools.d.ts +11 -0
- package/dist/tools/seller-tools.d.ts.map +1 -0
- package/dist/tools/seller-tools.js +149 -0
- package/dist/tools/seller-tools.js.map +1 -0
- package/dist/types/billing.d.ts +145 -0
- package/dist/types/billing.d.ts.map +1 -0
- package/dist/types/billing.js +4 -0
- package/dist/types/billing.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/invoice.d.ts +197 -0
- package/dist/types/invoice.d.ts.map +1 -0
- package/dist/types/invoice.js +4 -0
- package/dist/types/invoice.js.map +1 -0
- package/dist/utils/format.d.ts +14 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +51 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +59 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Elyonar
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# @einvoice/mcp-server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for the E-Invoice platform. Enables AI agents like Claude to manage invoices, sellers, buyers, and billing through Nigeria's FIRS-compliant e-invoicing system.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Claude Desktop Configuration
|
|
8
|
+
|
|
9
|
+
Add to your `claude_desktop_config.json`:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"einvoice": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "@einvoice/mcp-server"],
|
|
17
|
+
"env": {
|
|
18
|
+
"EINVOICE_API_KEY": "sk_live_your_key_here",
|
|
19
|
+
"EINVOICE_BASE_URL": "https://api.einvoice.ng"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Environment Variables
|
|
27
|
+
|
|
28
|
+
| Variable | Required | Description |
|
|
29
|
+
|----------|----------|-------------|
|
|
30
|
+
| `EINVOICE_API_KEY` | Yes | API key (`sk_live_...` or `sk_test_...`) |
|
|
31
|
+
| `EINVOICE_BASE_URL` | No | API gateway URL (default: `https://api.einvoice.ng`) |
|
|
32
|
+
| `EINVOICE_REQUEST_TIMEOUT` | No | Request timeout in ms (default: `30000`) |
|
|
33
|
+
| `EINVOICE_RETRY_ATTEMPTS` | No | Max retries for failed requests (default: `3`) |
|
|
34
|
+
|
|
35
|
+
## Available Tools (41)
|
|
36
|
+
|
|
37
|
+
### Invoice Tools (15)
|
|
38
|
+
- `create_invoice` — Create a new invoice in draft status
|
|
39
|
+
- `get_invoice` — Get invoice details by ID
|
|
40
|
+
- `list_invoices` — List/filter/search invoices
|
|
41
|
+
- `update_invoice` — Update a draft invoice
|
|
42
|
+
- `delete_invoice` — Delete a draft invoice
|
|
43
|
+
- `submit_invoice` — Submit to FIRS
|
|
44
|
+
- `batch_submit_invoices` — Batch submit multiple invoices
|
|
45
|
+
- `retry_invoice_submission` — Retry a failed submission
|
|
46
|
+
- `cancel_invoice` — Cancel an accepted invoice (creates credit note)
|
|
47
|
+
- `get_invoice_status` — Get status from local DB
|
|
48
|
+
- `query_invoice_status` — Query FIRS for real-time status
|
|
49
|
+
- `validate_invoice` — Validate without creating
|
|
50
|
+
- `download_invoice` — Get PDF/XML download URL
|
|
51
|
+
- `get_invoice_statistics` — Analytics and metrics
|
|
52
|
+
- `get_invoice_setup` — Reference data for invoice creation
|
|
53
|
+
|
|
54
|
+
### Seller Tools (7)
|
|
55
|
+
- `create_seller` — Register a new seller
|
|
56
|
+
- `get_seller` — Get seller details
|
|
57
|
+
- `list_sellers` — List/search sellers
|
|
58
|
+
- `update_seller` — Update seller (TIN immutable)
|
|
59
|
+
- `delete_seller` — Delete seller (no invoices)
|
|
60
|
+
- `verify_seller_tin` — Trigger TIN verification
|
|
61
|
+
- `get_seller_verification_status` — Check TIN status
|
|
62
|
+
|
|
63
|
+
### Buyer Tools (7)
|
|
64
|
+
- `create_buyer` — Register a new buyer
|
|
65
|
+
- `get_buyer` — Get buyer details
|
|
66
|
+
- `list_buyers` — List/search buyers
|
|
67
|
+
- `update_buyer` — Update buyer (TIN immutable)
|
|
68
|
+
- `delete_buyer` — Delete buyer (no invoices)
|
|
69
|
+
- `verify_buyer_tin` — Trigger TIN verification
|
|
70
|
+
- `get_buyer_verification_status` — Check TIN status
|
|
71
|
+
|
|
72
|
+
### Billing Tools (12)
|
|
73
|
+
- `get_billing_account` — Credit balance and account status
|
|
74
|
+
- `check_balance` — Verify sufficient credits before operations
|
|
75
|
+
- `get_billing_setup` — Full billing overview
|
|
76
|
+
- `get_subscription_plans` — Available subscription plans
|
|
77
|
+
- `get_credit_packages` — Available credit packages for purchase
|
|
78
|
+
- `get_active_subscription` — Current subscription details
|
|
79
|
+
- `get_subscription_history` — Past subscriptions
|
|
80
|
+
- `purchase_credits` — Buy a credit package (returns checkout URL)
|
|
81
|
+
- `get_payment_history` — Payment transaction history
|
|
82
|
+
- `get_transaction_history` — Credit ledger (purchases, consumption, refunds)
|
|
83
|
+
- `get_usage_analytics` — Submission counts, credit usage, daily breakdown
|
|
84
|
+
- `get_consumption_breakdown` — Credit usage by API endpoint
|
|
85
|
+
|
|
86
|
+
## Development
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install
|
|
90
|
+
npm run build
|
|
91
|
+
npm test
|
|
92
|
+
npm run dev # run with tsx (hot reload)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Architecture
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
src/
|
|
99
|
+
├── index.ts # MCP server entry point (stdio transport)
|
|
100
|
+
├── client/
|
|
101
|
+
│ ├── http-client.ts # HTTP client with auth, retry, rate limiting
|
|
102
|
+
│ ├── invoice-client.ts # Invoice service API client
|
|
103
|
+
│ └── billing-client.ts # Billing service API client
|
|
104
|
+
├── tools/
|
|
105
|
+
│ ├── invoice-tools.ts # 15 invoice tool definitions + handlers
|
|
106
|
+
│ ├── seller-tools.ts # 7 seller tool definitions + handlers
|
|
107
|
+
│ ├── buyer-tools.ts # 7 buyer tool definitions + handlers
|
|
108
|
+
│ └── billing-tools.ts # 12 billing tool definitions + handlers
|
|
109
|
+
├── types/
|
|
110
|
+
│ ├── invoice.ts # Invoice/seller/buyer types
|
|
111
|
+
│ └── billing.ts # Billing/subscription/payment types
|
|
112
|
+
└── utils/
|
|
113
|
+
└── format.ts # Response formatting utilities
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Versioning
|
|
117
|
+
|
|
118
|
+
This project follows [Semantic Versioning](https://semver.org/) with [Conventional Commits](https://www.conventionalcommits.org/).
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
npm run release # auto-bump based on commits
|
|
122
|
+
npm run release:patch # 0.1.0 → 0.1.1
|
|
123
|
+
npm run release:minor # 0.1.0 → 0.2.0
|
|
124
|
+
npm run release:major # 0.1.0 → 1.0.0
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Contributing
|
|
128
|
+
|
|
129
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for commit conventions, branching strategy, and how to add new tools.
|
|
130
|
+
|
|
131
|
+
## License
|
|
132
|
+
|
|
133
|
+
[MIT](LICENSE)
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { HttpClient } from './http-client.js';
|
|
2
|
+
import type { ApiResponse, BillingAccount, BillingSetup, BalanceCheck, SubscriptionPlan, Subscription, CreditPackage, CreditTransaction, Payment, PurchaseResult, UsageAnalytics } from '../types/index.js';
|
|
3
|
+
export declare class BillingClient {
|
|
4
|
+
private readonly http;
|
|
5
|
+
constructor(http: HttpClient);
|
|
6
|
+
getBillingAccount(): Promise<ApiResponse<BillingAccount>>;
|
|
7
|
+
checkBalance(credits: number): Promise<ApiResponse<BalanceCheck>>;
|
|
8
|
+
getBillingSetup(): Promise<ApiResponse<BillingSetup>>;
|
|
9
|
+
getSubscriptionPlans(query?: Record<string, string | number | undefined>): Promise<ApiResponse<SubscriptionPlan[]>>;
|
|
10
|
+
getCreditPackages(query?: Record<string, string | number | undefined>): Promise<ApiResponse<CreditPackage[]>>;
|
|
11
|
+
getActiveSubscription(): Promise<ApiResponse<Subscription>>;
|
|
12
|
+
getSubscriptionHistory(): Promise<ApiResponse<Subscription[]>>;
|
|
13
|
+
purchaseCredits(data: Record<string, unknown>): Promise<ApiResponse<PurchaseResult>>;
|
|
14
|
+
getPaymentHistory(query?: Record<string, string | number | undefined>): Promise<ApiResponse<Payment[]>>;
|
|
15
|
+
getTransactionHistory(query?: Record<string, string | number | undefined>): Promise<ApiResponse<CreditTransaction[]>>;
|
|
16
|
+
getUsageAnalytics(query?: Record<string, string | number | undefined>): Promise<ApiResponse<UsageAnalytics>>;
|
|
17
|
+
getConsumptionBreakdown(): Promise<ApiResponse<Record<string, unknown>>>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=billing-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing-client.d.ts","sourceRoot":"","sources":["../../src/client/billing-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EACV,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EACvD,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAC7C,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAC3D,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAMvC,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAIzD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAIjE,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAQrD,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAInH,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;IAQ7G,qBAAqB,IAAI,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAI3D,sBAAsB,IAAI,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IAQ9D,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAIpF,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAQvG,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAIrH,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAI5G,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAG/E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BillingClient = void 0;
|
|
4
|
+
class BillingClient {
|
|
5
|
+
http;
|
|
6
|
+
constructor(http) {
|
|
7
|
+
this.http = http;
|
|
8
|
+
}
|
|
9
|
+
// ═══════════════════════════════════════════
|
|
10
|
+
// BILLING ACCOUNT
|
|
11
|
+
// ═══════════════════════════════════════════
|
|
12
|
+
async getBillingAccount() {
|
|
13
|
+
return this.http.request({ method: 'GET', path: '/b/v1/billing-accounts/me' });
|
|
14
|
+
}
|
|
15
|
+
async checkBalance(credits) {
|
|
16
|
+
return this.http.request({ method: 'GET', path: '/b/v1/billing-accounts/me/check-balance', query: { credits } });
|
|
17
|
+
}
|
|
18
|
+
async getBillingSetup() {
|
|
19
|
+
return this.http.request({ method: 'GET', path: '/b/v1/setup' });
|
|
20
|
+
}
|
|
21
|
+
// ═══════════════════════════════════════════
|
|
22
|
+
// PLANS
|
|
23
|
+
// ═══════════════════════════════════════════
|
|
24
|
+
async getSubscriptionPlans(query) {
|
|
25
|
+
return this.http.request({ method: 'GET', path: '/b/v1/plans/subscriptions', query });
|
|
26
|
+
}
|
|
27
|
+
async getCreditPackages(query) {
|
|
28
|
+
return this.http.request({ method: 'GET', path: '/b/v1/plans/packages', query });
|
|
29
|
+
}
|
|
30
|
+
// ═══════════════════════════════════════════
|
|
31
|
+
// SUBSCRIPTIONS
|
|
32
|
+
// ═══════════════════════════════════════════
|
|
33
|
+
async getActiveSubscription() {
|
|
34
|
+
return this.http.request({ method: 'GET', path: '/b/v1/subscriptions/active' });
|
|
35
|
+
}
|
|
36
|
+
async getSubscriptionHistory() {
|
|
37
|
+
return this.http.request({ method: 'GET', path: '/b/v1/subscriptions/history' });
|
|
38
|
+
}
|
|
39
|
+
// ═══════════════════════════════════════════
|
|
40
|
+
// PAYMENTS & CREDITS
|
|
41
|
+
// ═══════════════════════════════════════════
|
|
42
|
+
async purchaseCredits(data) {
|
|
43
|
+
return this.http.request({ method: 'POST', path: '/b/v1/payments/purchase', body: data });
|
|
44
|
+
}
|
|
45
|
+
async getPaymentHistory(query) {
|
|
46
|
+
return this.http.request({ method: 'GET', path: '/b/v1/payments/history', query });
|
|
47
|
+
}
|
|
48
|
+
// ═══════════════════════════════════════════
|
|
49
|
+
// TRANSACTIONS & ANALYTICS
|
|
50
|
+
// ═══════════════════════════════════════════
|
|
51
|
+
async getTransactionHistory(query) {
|
|
52
|
+
return this.http.request({ method: 'GET', path: '/b/v1/transactions', query });
|
|
53
|
+
}
|
|
54
|
+
async getUsageAnalytics(query) {
|
|
55
|
+
return this.http.request({ method: 'GET', path: '/b/v1/transactions/analytics/usage', query });
|
|
56
|
+
}
|
|
57
|
+
async getConsumptionBreakdown() {
|
|
58
|
+
return this.http.request({ method: 'GET', path: '/b/v1/transactions/breakdown/by-endpoint' });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.BillingClient = BillingClient;
|
|
62
|
+
//# sourceMappingURL=billing-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing-client.js","sourceRoot":"","sources":["../../src/client/billing-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ApiResponse } from '../types/index.js';
|
|
2
|
+
export interface HttpClientConfig {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
apiKey: string;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
maxRetries?: number;
|
|
7
|
+
retryBaseDelay?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RequestOptions {
|
|
10
|
+
method: 'GET' | 'POST' | 'PATCH' | 'DELETE';
|
|
11
|
+
path: string;
|
|
12
|
+
body?: unknown;
|
|
13
|
+
query?: Record<string, string | number | undefined>;
|
|
14
|
+
}
|
|
15
|
+
export declare class EInvoiceApiError extends Error {
|
|
16
|
+
readonly statusCode: number;
|
|
17
|
+
readonly errorCode?: string | undefined;
|
|
18
|
+
readonly errors: Array<{
|
|
19
|
+
field?: string;
|
|
20
|
+
message: string;
|
|
21
|
+
}>;
|
|
22
|
+
constructor(message: string, statusCode: number, errorCode?: string | undefined, errors?: Array<{
|
|
23
|
+
field?: string;
|
|
24
|
+
message: string;
|
|
25
|
+
}>);
|
|
26
|
+
}
|
|
27
|
+
export declare class EInvoiceRateLimitError extends EInvoiceApiError {
|
|
28
|
+
readonly retryAfter: number;
|
|
29
|
+
constructor(message: string, retryAfter: number);
|
|
30
|
+
}
|
|
31
|
+
export declare class HttpClient {
|
|
32
|
+
private readonly baseUrl;
|
|
33
|
+
private readonly apiKey;
|
|
34
|
+
private readonly timeout;
|
|
35
|
+
private readonly maxRetries;
|
|
36
|
+
private readonly retryBaseDelay;
|
|
37
|
+
constructor(config: HttpClientConfig);
|
|
38
|
+
request<T>(options: RequestOptions): Promise<ApiResponse<T>>;
|
|
39
|
+
private doFetch;
|
|
40
|
+
private buildUrl;
|
|
41
|
+
private calculateBackoff;
|
|
42
|
+
private sleep;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/client/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;CACrD;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aAGvB,UAAU,EAAE,MAAM;aAClB,SAAS,CAAC,EAAE,MAAM;aAClB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;gBAHlE,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,MAAM,GAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAM;CAK1E;AAED,qBAAa,sBAAuB,SAAQ,gBAAgB;aAGxC,UAAU,EAAE,MAAM;gBADlC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM;CAKrC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,MAAM,EAAE,gBAAgB;IAQ9B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAsDpD,OAAO;IAsBrB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpClient = exports.EInvoiceRateLimitError = exports.EInvoiceApiError = void 0;
|
|
4
|
+
class EInvoiceApiError extends Error {
|
|
5
|
+
statusCode;
|
|
6
|
+
errorCode;
|
|
7
|
+
errors;
|
|
8
|
+
constructor(message, statusCode, errorCode, errors = []) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.statusCode = statusCode;
|
|
11
|
+
this.errorCode = errorCode;
|
|
12
|
+
this.errors = errors;
|
|
13
|
+
this.name = 'EInvoiceApiError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.EInvoiceApiError = EInvoiceApiError;
|
|
17
|
+
class EInvoiceRateLimitError extends EInvoiceApiError {
|
|
18
|
+
retryAfter;
|
|
19
|
+
constructor(message, retryAfter) {
|
|
20
|
+
super(message, 429, 'RATE_LIMIT_EXCEEDED');
|
|
21
|
+
this.retryAfter = retryAfter;
|
|
22
|
+
this.name = 'EInvoiceRateLimitError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.EInvoiceRateLimitError = EInvoiceRateLimitError;
|
|
26
|
+
class HttpClient {
|
|
27
|
+
baseUrl;
|
|
28
|
+
apiKey;
|
|
29
|
+
timeout;
|
|
30
|
+
maxRetries;
|
|
31
|
+
retryBaseDelay;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
34
|
+
this.apiKey = config.apiKey;
|
|
35
|
+
this.timeout = config.timeout ?? 30_000;
|
|
36
|
+
this.maxRetries = config.maxRetries ?? 3;
|
|
37
|
+
this.retryBaseDelay = config.retryBaseDelay ?? 1000;
|
|
38
|
+
}
|
|
39
|
+
async request(options) {
|
|
40
|
+
const url = this.buildUrl(options.path, options.query);
|
|
41
|
+
let lastError;
|
|
42
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
43
|
+
if (attempt > 0) {
|
|
44
|
+
const delay = this.calculateBackoff(attempt);
|
|
45
|
+
await this.sleep(delay);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const response = await this.doFetch(url, options);
|
|
49
|
+
if (response.status === 429) {
|
|
50
|
+
const retryAfter = parseInt(response.headers.get('retry-after') ?? '5', 10);
|
|
51
|
+
if (attempt < this.maxRetries) {
|
|
52
|
+
await this.sleep(retryAfter * 1000);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
throw new EInvoiceRateLimitError('Rate limit exceeded', retryAfter);
|
|
56
|
+
}
|
|
57
|
+
const body = await response.json();
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const meta = body?.meta;
|
|
60
|
+
throw new EInvoiceApiError(meta?.message ?? `HTTP ${response.status}`, response.status, meta?.errors?.[0]?.code, meta?.errors ?? []);
|
|
61
|
+
}
|
|
62
|
+
return body;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
lastError = error;
|
|
66
|
+
if (error instanceof EInvoiceApiError && error.statusCode < 500) {
|
|
67
|
+
throw error; // Don't retry client errors (except 429 handled above)
|
|
68
|
+
}
|
|
69
|
+
if (attempt === this.maxRetries) {
|
|
70
|
+
throw lastError;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
throw lastError ?? new Error('Request failed after retries');
|
|
75
|
+
}
|
|
76
|
+
async doFetch(url, options) {
|
|
77
|
+
const headers = {
|
|
78
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
'Accept': 'application/json',
|
|
81
|
+
};
|
|
82
|
+
const controller = new AbortController();
|
|
83
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
84
|
+
try {
|
|
85
|
+
return await fetch(url, {
|
|
86
|
+
method: options.method,
|
|
87
|
+
headers,
|
|
88
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
89
|
+
signal: controller.signal,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
clearTimeout(timeoutId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
buildUrl(path, query) {
|
|
97
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
98
|
+
if (query) {
|
|
99
|
+
for (const [key, value] of Object.entries(query)) {
|
|
100
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
101
|
+
url.searchParams.set(key, String(value));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return url.toString();
|
|
106
|
+
}
|
|
107
|
+
calculateBackoff(attempt) {
|
|
108
|
+
const base = this.retryBaseDelay * Math.pow(2, attempt - 1);
|
|
109
|
+
const jitter = Math.random() * base * 0.1;
|
|
110
|
+
return base + jitter;
|
|
111
|
+
}
|
|
112
|
+
sleep(ms) {
|
|
113
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.HttpClient = HttpClient;
|
|
117
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/client/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/G,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BillingClient = exports.InvoiceClient = exports.EInvoiceRateLimitError = exports.EInvoiceApiError = exports.HttpClient = void 0;
|
|
4
|
+
var http_client_js_1 = require("./http-client.js");
|
|
5
|
+
Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return http_client_js_1.HttpClient; } });
|
|
6
|
+
Object.defineProperty(exports, "EInvoiceApiError", { enumerable: true, get: function () { return http_client_js_1.EInvoiceApiError; } });
|
|
7
|
+
Object.defineProperty(exports, "EInvoiceRateLimitError", { enumerable: true, get: function () { return http_client_js_1.EInvoiceRateLimitError; } });
|
|
8
|
+
var invoice_client_js_1 = require("./invoice-client.js");
|
|
9
|
+
Object.defineProperty(exports, "InvoiceClient", { enumerable: true, get: function () { return invoice_client_js_1.InvoiceClient; } });
|
|
10
|
+
var billing_client_js_1 = require("./billing-client.js");
|
|
11
|
+
Object.defineProperty(exports, "BillingClient", { enumerable: true, get: function () { return billing_client_js_1.BillingClient; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;AAAA,mDAA+G;AAAtG,4GAAA,UAAU,OAAA;AAAyB,kHAAA,gBAAgB,OAAA;AAAE,wHAAA,sBAAsB,OAAA;AACpF,yDAAoD;AAA3C,kHAAA,aAAa,OAAA;AACtB,yDAAoD;AAA3C,kHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { HttpClient } from './http-client.js';
|
|
2
|
+
import type { ApiResponse, Invoice, Seller, Buyer, SubmitResult, BatchSubmitResult, RetryResult, InvoiceStatusResult, ValidationResult, DownloadResult, InvoiceStatistics, TinVerificationResult } from '../types/index.js';
|
|
3
|
+
export declare class InvoiceClient {
|
|
4
|
+
private readonly http;
|
|
5
|
+
constructor(http: HttpClient);
|
|
6
|
+
createInvoice(data: Record<string, unknown>): Promise<ApiResponse<Invoice>>;
|
|
7
|
+
getInvoice(id: string): Promise<ApiResponse<Invoice>>;
|
|
8
|
+
listInvoices(query?: Record<string, string | number | undefined>): Promise<ApiResponse<Invoice[]>>;
|
|
9
|
+
updateInvoice(id: string, data: Record<string, unknown>): Promise<ApiResponse<Invoice>>;
|
|
10
|
+
deleteInvoice(id: string): Promise<ApiResponse<{
|
|
11
|
+
deleted: boolean;
|
|
12
|
+
}>>;
|
|
13
|
+
submitInvoice(id: string): Promise<ApiResponse<SubmitResult>>;
|
|
14
|
+
batchSubmitInvoices(invoiceIds: string[]): Promise<ApiResponse<BatchSubmitResult>>;
|
|
15
|
+
retryInvoice(id: string): Promise<ApiResponse<RetryResult>>;
|
|
16
|
+
cancelInvoice(id: string, reason: string, notes?: string): Promise<ApiResponse<Invoice>>;
|
|
17
|
+
getInvoiceStatus(id: string): Promise<ApiResponse<InvoiceStatusResult>>;
|
|
18
|
+
queryInvoiceStatus(id: string): Promise<ApiResponse<InvoiceStatusResult>>;
|
|
19
|
+
validateInvoice(data: Record<string, unknown>): Promise<ApiResponse<ValidationResult>>;
|
|
20
|
+
downloadInvoice(id: string, format?: string): Promise<ApiResponse<DownloadResult>>;
|
|
21
|
+
getInvoiceStatistics(query?: Record<string, string | number | undefined>): Promise<ApiResponse<InvoiceStatistics>>;
|
|
22
|
+
getInvoiceSetup(): Promise<ApiResponse<Record<string, unknown>>>;
|
|
23
|
+
createSeller(data: Record<string, unknown>): Promise<ApiResponse<Seller>>;
|
|
24
|
+
getSeller(id: string): Promise<ApiResponse<Seller>>;
|
|
25
|
+
listSellers(query?: Record<string, string | number | undefined>): Promise<ApiResponse<Seller[]>>;
|
|
26
|
+
updateSeller(id: string, data: Record<string, unknown>): Promise<ApiResponse<Seller>>;
|
|
27
|
+
deleteSeller(id: string): Promise<ApiResponse<{
|
|
28
|
+
deleted: boolean;
|
|
29
|
+
}>>;
|
|
30
|
+
verifySellerTin(id: string): Promise<ApiResponse<TinVerificationResult>>;
|
|
31
|
+
getSellerVerificationStatus(id: string): Promise<ApiResponse<TinVerificationResult>>;
|
|
32
|
+
createBuyer(data: Record<string, unknown>): Promise<ApiResponse<Buyer>>;
|
|
33
|
+
getBuyer(id: string): Promise<ApiResponse<Buyer>>;
|
|
34
|
+
listBuyers(query?: Record<string, string | number | undefined>): Promise<ApiResponse<Buyer[]>>;
|
|
35
|
+
updateBuyer(id: string, data: Record<string, unknown>): Promise<ApiResponse<Buyer>>;
|
|
36
|
+
deleteBuyer(id: string): Promise<ApiResponse<{
|
|
37
|
+
deleted: boolean;
|
|
38
|
+
}>>;
|
|
39
|
+
verifyBuyerTin(id: string): Promise<ApiResponse<TinVerificationResult>>;
|
|
40
|
+
getBuyerVerificationStatus(id: string): Promise<ApiResponse<TinVerificationResult>>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=invoice-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-client.d.ts","sourceRoot":"","sources":["../../src/client/invoice-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvoiceClient = void 0;
|
|
4
|
+
class InvoiceClient {
|
|
5
|
+
http;
|
|
6
|
+
constructor(http) {
|
|
7
|
+
this.http = http;
|
|
8
|
+
}
|
|
9
|
+
// ═══════════════════════════════════════════
|
|
10
|
+
// INVOICES
|
|
11
|
+
// ═══════════════════════════════════════════
|
|
12
|
+
async createInvoice(data) {
|
|
13
|
+
return this.http.request({ method: 'POST', path: '/i/v1/invoices', body: data });
|
|
14
|
+
}
|
|
15
|
+
async getInvoice(id) {
|
|
16
|
+
return this.http.request({ method: 'GET', path: `/i/v1/invoices/${id}` });
|
|
17
|
+
}
|
|
18
|
+
async listInvoices(query) {
|
|
19
|
+
return this.http.request({ method: 'GET', path: '/i/v1/invoices', query });
|
|
20
|
+
}
|
|
21
|
+
async updateInvoice(id, data) {
|
|
22
|
+
return this.http.request({ method: 'PATCH', path: `/i/v1/invoices/${id}`, body: data });
|
|
23
|
+
}
|
|
24
|
+
async deleteInvoice(id) {
|
|
25
|
+
return this.http.request({ method: 'DELETE', path: `/i/v1/invoices/${id}` });
|
|
26
|
+
}
|
|
27
|
+
async submitInvoice(id) {
|
|
28
|
+
return this.http.request({ method: 'POST', path: `/i/v1/invoices/${id}/submit` });
|
|
29
|
+
}
|
|
30
|
+
async batchSubmitInvoices(invoiceIds) {
|
|
31
|
+
return this.http.request({ method: 'POST', path: '/i/v1/invoices/batch-submit', body: { invoiceIds } });
|
|
32
|
+
}
|
|
33
|
+
async retryInvoice(id) {
|
|
34
|
+
return this.http.request({ method: 'POST', path: `/i/v1/invoices/${id}/retry` });
|
|
35
|
+
}
|
|
36
|
+
async cancelInvoice(id, reason, notes) {
|
|
37
|
+
return this.http.request({ method: 'POST', path: `/i/v1/invoices/${id}/cancel`, body: { reason, notes } });
|
|
38
|
+
}
|
|
39
|
+
async getInvoiceStatus(id) {
|
|
40
|
+
return this.http.request({ method: 'GET', path: `/i/v1/invoices/${id}/status` });
|
|
41
|
+
}
|
|
42
|
+
async queryInvoiceStatus(id) {
|
|
43
|
+
return this.http.request({ method: 'POST', path: `/i/v1/invoices/${id}/query-status` });
|
|
44
|
+
}
|
|
45
|
+
async validateInvoice(data) {
|
|
46
|
+
return this.http.request({ method: 'POST', path: '/i/v1/invoices/validate', body: data });
|
|
47
|
+
}
|
|
48
|
+
async downloadInvoice(id, format) {
|
|
49
|
+
return this.http.request({ method: 'GET', path: `/i/v1/invoices/${id}/download`, query: { format } });
|
|
50
|
+
}
|
|
51
|
+
async getInvoiceStatistics(query) {
|
|
52
|
+
return this.http.request({ method: 'GET', path: '/i/v1/invoices/statistics', query });
|
|
53
|
+
}
|
|
54
|
+
async getInvoiceSetup() {
|
|
55
|
+
return this.http.request({ method: 'GET', path: '/i/v1/invoices/setup' });
|
|
56
|
+
}
|
|
57
|
+
// ═══════════════════════════════════════════
|
|
58
|
+
// SELLERS
|
|
59
|
+
// ═══════════════════════════════════════════
|
|
60
|
+
async createSeller(data) {
|
|
61
|
+
return this.http.request({ method: 'POST', path: '/i/v1/sellers', body: data });
|
|
62
|
+
}
|
|
63
|
+
async getSeller(id) {
|
|
64
|
+
return this.http.request({ method: 'GET', path: `/i/v1/sellers/${id}` });
|
|
65
|
+
}
|
|
66
|
+
async listSellers(query) {
|
|
67
|
+
return this.http.request({ method: 'GET', path: '/i/v1/sellers', query });
|
|
68
|
+
}
|
|
69
|
+
async updateSeller(id, data) {
|
|
70
|
+
return this.http.request({ method: 'PATCH', path: `/i/v1/sellers/${id}`, body: data });
|
|
71
|
+
}
|
|
72
|
+
async deleteSeller(id) {
|
|
73
|
+
return this.http.request({ method: 'DELETE', path: `/i/v1/sellers/${id}` });
|
|
74
|
+
}
|
|
75
|
+
async verifySellerTin(id) {
|
|
76
|
+
return this.http.request({ method: 'POST', path: `/i/v1/sellers/${id}/verify-tin` });
|
|
77
|
+
}
|
|
78
|
+
async getSellerVerificationStatus(id) {
|
|
79
|
+
return this.http.request({ method: 'GET', path: `/i/v1/sellers/${id}/verification-status` });
|
|
80
|
+
}
|
|
81
|
+
// ═══════════════════════════════════════════
|
|
82
|
+
// BUYERS
|
|
83
|
+
// ═══════════════════════════════════════════
|
|
84
|
+
async createBuyer(data) {
|
|
85
|
+
return this.http.request({ method: 'POST', path: '/i/v1/buyers', body: data });
|
|
86
|
+
}
|
|
87
|
+
async getBuyer(id) {
|
|
88
|
+
return this.http.request({ method: 'GET', path: `/i/v1/buyers/${id}` });
|
|
89
|
+
}
|
|
90
|
+
async listBuyers(query) {
|
|
91
|
+
return this.http.request({ method: 'GET', path: '/i/v1/buyers', query });
|
|
92
|
+
}
|
|
93
|
+
async updateBuyer(id, data) {
|
|
94
|
+
return this.http.request({ method: 'PATCH', path: `/i/v1/buyers/${id}`, body: data });
|
|
95
|
+
}
|
|
96
|
+
async deleteBuyer(id) {
|
|
97
|
+
return this.http.request({ method: 'DELETE', path: `/i/v1/buyers/${id}` });
|
|
98
|
+
}
|
|
99
|
+
async verifyBuyerTin(id) {
|
|
100
|
+
return this.http.request({ method: 'POST', path: `/i/v1/buyers/${id}/verify-tin` });
|
|
101
|
+
}
|
|
102
|
+
async getBuyerVerificationStatus(id) {
|
|
103
|
+
return this.http.request({ method: 'GET', path: `/i/v1/buyers/${id}/verification-status` });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.InvoiceClient = InvoiceClient;
|
|
107
|
+
//# sourceMappingURL=invoice-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-client.js","sourceRoot":"","sources":["../../src/client/invoice-client.ts"],"names":[],"mappings":"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"}
|