@elyonar/einvoice-js 0.1.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/LICENSE +21 -0
- package/README.md +230 -0
- package/dist/cjs/client/http-client.d.ts +52 -0
- package/dist/cjs/client/http-client.d.ts.map +1 -0
- package/dist/cjs/client/http-client.js +117 -0
- package/dist/cjs/client/http-client.js.map +1 -0
- package/dist/cjs/client/index.d.ts +3 -0
- package/dist/cjs/client/index.d.ts.map +1 -0
- package/dist/cjs/client/index.js +6 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/einvoice.d.ts +69 -0
- package/dist/cjs/einvoice.d.ts.map +1 -0
- package/dist/cjs/einvoice.js +79 -0
- package/dist/cjs/einvoice.js.map +1 -0
- package/dist/cjs/errors.d.ts +74 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +98 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +12 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/services/billing.d.ts +75 -0
- package/dist/cjs/services/billing.d.ts.map +1 -0
- package/dist/cjs/services/billing.js +172 -0
- package/dist/cjs/services/billing.js.map +1 -0
- package/dist/cjs/services/buyers.d.ts +57 -0
- package/dist/cjs/services/buyers.d.ts.map +1 -0
- package/dist/cjs/services/buyers.js +110 -0
- package/dist/cjs/services/buyers.js.map +1 -0
- package/dist/cjs/services/index.d.ts +5 -0
- package/dist/cjs/services/index.d.ts.map +1 -0
- package/dist/cjs/services/index.js +12 -0
- package/dist/cjs/services/index.js.map +1 -0
- package/dist/cjs/services/invoices.d.ts +94 -0
- package/dist/cjs/services/invoices.d.ts.map +1 -0
- package/dist/cjs/services/invoices.js +193 -0
- package/dist/cjs/services/invoices.js.map +1 -0
- package/dist/cjs/services/sellers.d.ts +61 -0
- package/dist/cjs/services/sellers.d.ts.map +1 -0
- package/dist/cjs/services/sellers.js +114 -0
- package/dist/cjs/services/sellers.js.map +1 -0
- package/dist/cjs/types/billing.d.ts +174 -0
- package/dist/cjs/types/billing.d.ts.map +1 -0
- package/dist/cjs/types/billing.js +6 -0
- package/dist/cjs/types/billing.js.map +1 -0
- package/dist/cjs/types/common.d.ts +53 -0
- package/dist/cjs/types/common.d.ts.map +1 -0
- package/dist/cjs/types/common.js +6 -0
- package/dist/cjs/types/common.js.map +1 -0
- package/dist/cjs/types/index.d.ts +6 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +3 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/invoice.d.ts +183 -0
- package/dist/cjs/types/invoice.d.ts.map +1 -0
- package/dist/cjs/types/invoice.js +6 -0
- package/dist/cjs/types/invoice.js.map +1 -0
- package/dist/cjs/types/party.d.ts +128 -0
- package/dist/cjs/types/party.d.ts.map +1 -0
- package/dist/cjs/types/party.js +3 -0
- package/dist/cjs/types/party.js.map +1 -0
- package/dist/cjs/types/webhook.d.ts +14 -0
- package/dist/cjs/types/webhook.d.ts.map +1 -0
- package/dist/cjs/types/webhook.js +6 -0
- package/dist/cjs/types/webhook.js.map +1 -0
- package/dist/cjs/webhooks/index.d.ts +3 -0
- package/dist/cjs/webhooks/index.d.ts.map +1 -0
- package/dist/cjs/webhooks/index.js +6 -0
- package/dist/cjs/webhooks/index.js.map +1 -0
- package/dist/cjs/webhooks/verify.d.ts +43 -0
- package/dist/cjs/webhooks/verify.d.ts.map +1 -0
- package/dist/cjs/webhooks/verify.js +92 -0
- package/dist/cjs/webhooks/verify.js.map +1 -0
- package/dist/esm/client/http-client.d.ts +52 -0
- package/dist/esm/client/http-client.d.ts.map +1 -0
- package/dist/esm/client/http-client.js +113 -0
- package/dist/esm/client/http-client.js.map +1 -0
- package/dist/esm/client/index.d.ts +3 -0
- package/dist/esm/client/index.d.ts.map +1 -0
- package/dist/esm/client/index.js +2 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/einvoice.d.ts +69 -0
- package/dist/esm/einvoice.d.ts.map +1 -0
- package/dist/esm/einvoice.js +75 -0
- package/dist/esm/einvoice.js.map +1 -0
- package/dist/esm/errors.d.ts +74 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +89 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +24 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/services/billing.d.ts +75 -0
- package/dist/esm/services/billing.d.ts.map +1 -0
- package/dist/esm/services/billing.js +168 -0
- package/dist/esm/services/billing.js.map +1 -0
- package/dist/esm/services/buyers.d.ts +57 -0
- package/dist/esm/services/buyers.d.ts.map +1 -0
- package/dist/esm/services/buyers.js +106 -0
- package/dist/esm/services/buyers.js.map +1 -0
- package/dist/esm/services/index.d.ts +5 -0
- package/dist/esm/services/index.d.ts.map +1 -0
- package/dist/esm/services/index.js +5 -0
- package/dist/esm/services/index.js.map +1 -0
- package/dist/esm/services/invoices.d.ts +94 -0
- package/dist/esm/services/invoices.d.ts.map +1 -0
- package/dist/esm/services/invoices.js +189 -0
- package/dist/esm/services/invoices.js.map +1 -0
- package/dist/esm/services/sellers.d.ts +61 -0
- package/dist/esm/services/sellers.d.ts.map +1 -0
- package/dist/esm/services/sellers.js +110 -0
- package/dist/esm/services/sellers.js.map +1 -0
- package/dist/esm/types/billing.d.ts +174 -0
- package/dist/esm/types/billing.d.ts.map +1 -0
- package/dist/esm/types/billing.js +5 -0
- package/dist/esm/types/billing.js.map +1 -0
- package/dist/esm/types/common.d.ts +53 -0
- package/dist/esm/types/common.d.ts.map +1 -0
- package/dist/esm/types/common.js +5 -0
- package/dist/esm/types/common.js.map +1 -0
- package/dist/esm/types/index.d.ts +6 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/invoice.d.ts +183 -0
- package/dist/esm/types/invoice.d.ts.map +1 -0
- package/dist/esm/types/invoice.js +5 -0
- package/dist/esm/types/invoice.js.map +1 -0
- package/dist/esm/types/party.d.ts +128 -0
- package/dist/esm/types/party.d.ts.map +1 -0
- package/dist/esm/types/party.js +2 -0
- package/dist/esm/types/party.js.map +1 -0
- package/dist/esm/types/webhook.d.ts +14 -0
- package/dist/esm/types/webhook.d.ts.map +1 -0
- package/dist/esm/types/webhook.js +5 -0
- package/dist/esm/types/webhook.js.map +1 -0
- package/dist/esm/webhooks/index.d.ts +3 -0
- package/dist/esm/webhooks/index.d.ts.map +1 -0
- package/dist/esm/webhooks/index.js +2 -0
- package/dist/esm/webhooks/index.js.map +1 -0
- package/dist/esm/webhooks/verify.d.ts +43 -0
- package/dist/esm/webhooks/verify.d.ts.map +1 -0
- package/dist/esm/webhooks/verify.js +89 -0
- package/dist/esm/webhooks/verify.js.map +1 -0
- package/package.json +87 -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,230 @@
|
|
|
1
|
+
# @elyonar/einvoice-js
|
|
2
|
+
|
|
3
|
+
Official TypeScript/JavaScript SDK for the [E-Invoice Nigeria](https://einvoice.ng) platform.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@elyonar/einvoice-js)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- Full coverage of all E-Invoice APIs (invoices, sellers, buyers, billing)
|
|
11
|
+
- First-class TypeScript support with complete type definitions
|
|
12
|
+
- Automatic retry with exponential backoff and jitter
|
|
13
|
+
- Rate limit handling with `Retry-After` support
|
|
14
|
+
- Webhook signature verification (HMAC-SHA256 with replay protection)
|
|
15
|
+
- Zero runtime dependencies — uses native `fetch`, `crypto`, and `AbortController`
|
|
16
|
+
- Dual ESM/CJS builds for maximum compatibility
|
|
17
|
+
- Node.js 18+ support
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @elyonar/einvoice-js
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { EInvoice } from '@elyonar/einvoice-js';
|
|
29
|
+
|
|
30
|
+
const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
31
|
+
|
|
32
|
+
// Create an invoice
|
|
33
|
+
const invoice = await client.invoices.create({
|
|
34
|
+
sellerId: 'sel_123',
|
|
35
|
+
buyerId: 'buy_456',
|
|
36
|
+
invoiceDate: '2026-03-20',
|
|
37
|
+
dueDate: '2026-04-20',
|
|
38
|
+
currency: 'NGN',
|
|
39
|
+
lineItems: [
|
|
40
|
+
{ description: 'Consulting services', quantity: 10, unitPrice: 50000, vatRate: 7.5 },
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Submit to tax authority
|
|
45
|
+
const result = await client.invoices.submit(invoice.data.id);
|
|
46
|
+
console.log(result.data.jobId); // 'job_abc123'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Configuration
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
const client = new EInvoice({
|
|
53
|
+
apiKey: 'sk_live_...', // Required
|
|
54
|
+
baseUrl: 'https://api.einvoice.ng', // Default
|
|
55
|
+
timeout: 30000, // 30s default
|
|
56
|
+
maxRetries: 3, // Default
|
|
57
|
+
retryBaseDelay: 1000, // 1s default
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
| Option | Type | Default | Description |
|
|
62
|
+
|--------|------|---------|-------------|
|
|
63
|
+
| `apiKey` | `string` | — | **Required.** Your API key (`sk_live_*` or `sk_test_*`) |
|
|
64
|
+
| `baseUrl` | `string` | `https://api.einvoice.ng` | API gateway URL |
|
|
65
|
+
| `timeout` | `number` | `30000` | Request timeout in ms |
|
|
66
|
+
| `maxRetries` | `number` | `3` | Max retries for 5xx/429 errors |
|
|
67
|
+
| `retryBaseDelay` | `number` | `1000` | Base delay for exponential backoff (ms) |
|
|
68
|
+
|
|
69
|
+
## API Reference
|
|
70
|
+
|
|
71
|
+
### Invoices — `client.invoices`
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// CRUD
|
|
75
|
+
client.invoices.create(params) // Create a draft invoice
|
|
76
|
+
client.invoices.get(id) // Get invoice by ID
|
|
77
|
+
client.invoices.list(params?) // List with filters (status, date range, etc.)
|
|
78
|
+
client.invoices.update(id, params) // Update a draft invoice
|
|
79
|
+
client.invoices.delete(id) // Delete a draft invoice
|
|
80
|
+
|
|
81
|
+
// Submission
|
|
82
|
+
client.invoices.submit(id) // Submit to tax authority (irreversible)
|
|
83
|
+
client.invoices.batchSubmit(ids) // Batch submit 1–100 invoices
|
|
84
|
+
client.invoices.retry(id) // Retry a failed submission
|
|
85
|
+
client.invoices.cancel(id, params) // Cancel an accepted invoice
|
|
86
|
+
|
|
87
|
+
// Status & Validation
|
|
88
|
+
client.invoices.getStatus(id) // Get status from local DB
|
|
89
|
+
client.invoices.queryStatus(id) // Query tax authority for real-time status
|
|
90
|
+
client.invoices.validate(params) // Validate without creating
|
|
91
|
+
client.invoices.download(id, format?) // Get PDF/XML download URL
|
|
92
|
+
|
|
93
|
+
// Analytics
|
|
94
|
+
client.invoices.getStatistics(params?) // Invoice analytics
|
|
95
|
+
client.invoices.getSetup() // Reference data for creation
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Sellers — `client.sellers`
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
client.sellers.create(params) // Register a seller
|
|
102
|
+
client.sellers.get(id) // Get seller by ID
|
|
103
|
+
client.sellers.list(params?) // List sellers
|
|
104
|
+
client.sellers.update(id, params) // Update seller (TIN is immutable)
|
|
105
|
+
client.sellers.delete(id) // Delete seller (no invoices)
|
|
106
|
+
client.sellers.verifyTin(id) // Trigger TIN verification
|
|
107
|
+
client.sellers.getVerificationStatus(id) // Check verification status
|
|
108
|
+
client.sellers.search(query) // Search by name or TIN
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Buyers — `client.buyers`
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
client.buyers.create(params) // Register a buyer
|
|
115
|
+
client.buyers.get(id) // Get buyer by ID
|
|
116
|
+
client.buyers.list(params?) // List buyers
|
|
117
|
+
client.buyers.update(id, params) // Update buyer (TIN is immutable)
|
|
118
|
+
client.buyers.delete(id) // Delete buyer (no invoices)
|
|
119
|
+
client.buyers.verifyTin(id) // Trigger TIN verification
|
|
120
|
+
client.buyers.getVerificationStatus(id) // Check verification status
|
|
121
|
+
client.buyers.search(query) // Search by name or TIN
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Billing — `client.billing`
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// Account
|
|
128
|
+
client.billing.getAccount() // Credit balance & status
|
|
129
|
+
client.billing.checkBalance(credits) // Verify sufficient credits
|
|
130
|
+
client.billing.getSetup() // Full billing overview
|
|
131
|
+
|
|
132
|
+
// Plans & Packages
|
|
133
|
+
client.billing.getPlans(params?) // Available subscription plans
|
|
134
|
+
client.billing.getPackages(params?) // Available credit packages
|
|
135
|
+
|
|
136
|
+
// Subscriptions
|
|
137
|
+
client.billing.getActiveSubscription() // Current subscription
|
|
138
|
+
client.billing.getSubscriptionHistory() // Past subscriptions
|
|
139
|
+
|
|
140
|
+
// Payments & Credits
|
|
141
|
+
client.billing.purchaseCredits(params) // Buy credits (returns checkout URL)
|
|
142
|
+
client.billing.getPayments(params?) // Payment history
|
|
143
|
+
client.billing.getTransactions(params?) // Credit transaction history
|
|
144
|
+
|
|
145
|
+
// Analytics
|
|
146
|
+
client.billing.getUsageAnalytics(params?) // Submissions, credits, daily breakdown
|
|
147
|
+
client.billing.getConsumptionBreakdown() // Credits by API endpoint
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Webhook Verification
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import { verifyWebhook } from '@elyonar/einvoice-js/webhooks';
|
|
154
|
+
|
|
155
|
+
// Express example
|
|
156
|
+
app.post('/webhooks/einvoice', (req, res) => {
|
|
157
|
+
try {
|
|
158
|
+
const event = verifyWebhook(req.body, req.headers, process.env.WEBHOOK_SECRET);
|
|
159
|
+
|
|
160
|
+
switch (event.eventType) {
|
|
161
|
+
case 'invoice.approved':
|
|
162
|
+
console.log('Invoice approved:', event.data);
|
|
163
|
+
break;
|
|
164
|
+
case 'billing.low_credit_alert':
|
|
165
|
+
console.log('Low credits!', event.data);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
res.sendStatus(200);
|
|
170
|
+
} catch (err) {
|
|
171
|
+
console.error('Webhook verification failed:', err);
|
|
172
|
+
res.sendStatus(400);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
The `verifyWebhook` function performs HMAC-SHA256 signature verification with timing-safe comparison and 5-minute replay protection.
|
|
178
|
+
|
|
179
|
+
## Error Handling
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
import { EInvoiceApiError, EInvoiceRateLimitError } from '@elyonar/einvoice-js';
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
await client.invoices.submit('inv_123');
|
|
186
|
+
} catch (err) {
|
|
187
|
+
if (err instanceof EInvoiceRateLimitError) {
|
|
188
|
+
console.log(`Rate limited. Retry after ${err.retryAfter}s`);
|
|
189
|
+
} else if (err instanceof EInvoiceApiError) {
|
|
190
|
+
console.log(err.statusCode); // 422
|
|
191
|
+
console.log(err.errorCode); // 'INVALID_STATE_TRANSITION'
|
|
192
|
+
console.log(err.errors); // [{ field: 'status', message: '...' }]
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
| Error Class | When |
|
|
198
|
+
|-------------|------|
|
|
199
|
+
| `EInvoiceApiError` | API returned a 4xx/5xx error |
|
|
200
|
+
| `EInvoiceRateLimitError` | API returned 429 after max retries |
|
|
201
|
+
| `EInvoiceTimeoutError` | Request exceeded timeout |
|
|
202
|
+
| `EInvoiceConfigError` | Invalid SDK configuration |
|
|
203
|
+
| `EInvoiceWebhookError` | Webhook signature verification failed |
|
|
204
|
+
|
|
205
|
+
## Per-Request Options
|
|
206
|
+
|
|
207
|
+
Every method accepts an optional `RequestOptions` object:
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
const controller = new AbortController();
|
|
211
|
+
|
|
212
|
+
await client.invoices.list({ status: 'draft' }, {
|
|
213
|
+
timeout: 5000, // Override timeout for this request
|
|
214
|
+
signal: controller.signal, // AbortSignal for cancellation
|
|
215
|
+
headers: { 'X-Request-Id': 'req_123' }, // Additional headers
|
|
216
|
+
});
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Development
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
npm install # Install dependencies
|
|
223
|
+
npm test # Run tests with coverage
|
|
224
|
+
npm run build # Build ESM + CJS
|
|
225
|
+
npm run lint # Type check
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## License
|
|
229
|
+
|
|
230
|
+
MIT
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ApiResponse, RequestOptions as PerRequestOptions } from '../types/common.js';
|
|
2
|
+
export interface HttpClientConfig {
|
|
3
|
+
/**
|
|
4
|
+
* API key for authentication. Must start with `sk_live_` or `sk_test_`.
|
|
5
|
+
*/
|
|
6
|
+
apiKey: string;
|
|
7
|
+
/**
|
|
8
|
+
* Base URL of the E-Invoice API gateway.
|
|
9
|
+
* @default 'https://api.einvoice.ng'
|
|
10
|
+
*/
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Request timeout in milliseconds.
|
|
14
|
+
* @default 30000
|
|
15
|
+
*/
|
|
16
|
+
timeout?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum number of retry attempts for failed requests.
|
|
19
|
+
* Only 5xx errors and 429 rate limits are retried.
|
|
20
|
+
* @default 3
|
|
21
|
+
*/
|
|
22
|
+
maxRetries?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Base delay for exponential backoff (in milliseconds).
|
|
25
|
+
* @default 1000
|
|
26
|
+
*/
|
|
27
|
+
retryBaseDelay?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface InternalRequestOptions {
|
|
30
|
+
method: 'GET' | 'POST' | 'PATCH' | 'DELETE';
|
|
31
|
+
path: string;
|
|
32
|
+
body?: unknown;
|
|
33
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
34
|
+
requestOptions?: PerRequestOptions;
|
|
35
|
+
}
|
|
36
|
+
export declare class HttpClient {
|
|
37
|
+
private readonly baseUrl;
|
|
38
|
+
private readonly apiKey;
|
|
39
|
+
private readonly timeout;
|
|
40
|
+
private readonly maxRetries;
|
|
41
|
+
private readonly retryBaseDelay;
|
|
42
|
+
constructor(config: HttpClientConfig);
|
|
43
|
+
/**
|
|
44
|
+
* Make an authenticated HTTP request to the E-Invoice API.
|
|
45
|
+
*/
|
|
46
|
+
request<T>(options: InternalRequestOptions): Promise<ApiResponse<T>>;
|
|
47
|
+
private doFetch;
|
|
48
|
+
private buildUrl;
|
|
49
|
+
private calculateBackoff;
|
|
50
|
+
private sleep;
|
|
51
|
+
}
|
|
52
|
+
//# 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,cAAc,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAY3F,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,MAAM,WAAW,sBAAsB;IACrC,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,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9D,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACpC;AAMD,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;IAYpC;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YA2D5D,OAAO;IAgCrB,OAAO,CAAC,QAAQ;IAehB,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 = void 0;
|
|
4
|
+
const errors_js_1 = require("../errors.js");
|
|
5
|
+
// ═══════════════════════════════════════════
|
|
6
|
+
// HTTP Client
|
|
7
|
+
// ═══════════════════════════════════════════
|
|
8
|
+
class HttpClient {
|
|
9
|
+
baseUrl;
|
|
10
|
+
apiKey;
|
|
11
|
+
timeout;
|
|
12
|
+
maxRetries;
|
|
13
|
+
retryBaseDelay;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
if (!config.apiKey) {
|
|
16
|
+
throw new errors_js_1.EInvoiceConfigError('API key is required. Pass `apiKey` to the client constructor.');
|
|
17
|
+
}
|
|
18
|
+
this.baseUrl = (config.baseUrl ?? 'https://api.einvoice.ng').replace(/\/$/, '');
|
|
19
|
+
this.apiKey = config.apiKey;
|
|
20
|
+
this.timeout = config.timeout ?? 30_000;
|
|
21
|
+
this.maxRetries = config.maxRetries ?? 3;
|
|
22
|
+
this.retryBaseDelay = config.retryBaseDelay ?? 1000;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Make an authenticated HTTP request to the E-Invoice API.
|
|
26
|
+
*/
|
|
27
|
+
async request(options) {
|
|
28
|
+
const url = this.buildUrl(options.path, options.query);
|
|
29
|
+
const timeout = options.requestOptions?.timeout ?? this.timeout;
|
|
30
|
+
let lastError;
|
|
31
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
32
|
+
if (attempt > 0) {
|
|
33
|
+
const delay = this.calculateBackoff(attempt);
|
|
34
|
+
await this.sleep(delay);
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const response = await this.doFetch(url, options, timeout);
|
|
38
|
+
// Handle rate limiting
|
|
39
|
+
if (response.status === 429) {
|
|
40
|
+
const retryAfter = parseInt(response.headers.get('retry-after') ?? '5', 10);
|
|
41
|
+
if (attempt < this.maxRetries) {
|
|
42
|
+
await this.sleep(retryAfter * 1000);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
throw new errors_js_1.EInvoiceRateLimitError('Rate limit exceeded', retryAfter);
|
|
46
|
+
}
|
|
47
|
+
const body = await response.json();
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const meta = body?.meta;
|
|
50
|
+
throw new errors_js_1.EInvoiceApiError(meta?.message ?? `HTTP ${response.status}`, response.status, meta?.errors?.[0]?.code, meta?.errors ?? []);
|
|
51
|
+
}
|
|
52
|
+
return body;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// Convert AbortError to timeout error
|
|
56
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
57
|
+
throw new errors_js_1.EInvoiceTimeoutError(timeout);
|
|
58
|
+
}
|
|
59
|
+
lastError = error;
|
|
60
|
+
// Don't retry client errors (4xx except 429, which is handled above)
|
|
61
|
+
if (error instanceof errors_js_1.EInvoiceApiError && error.statusCode < 500) {
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
if (attempt === this.maxRetries) {
|
|
65
|
+
throw lastError;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
throw lastError ?? new Error('Request failed after retries');
|
|
70
|
+
}
|
|
71
|
+
async doFetch(url, options, timeout) {
|
|
72
|
+
const headers = {
|
|
73
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
74
|
+
'Content-Type': 'application/json',
|
|
75
|
+
'Accept': 'application/json',
|
|
76
|
+
...options.requestOptions?.headers,
|
|
77
|
+
};
|
|
78
|
+
const controller = new AbortController();
|
|
79
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
80
|
+
// If the caller provided an AbortSignal, wire it up
|
|
81
|
+
if (options.requestOptions?.signal) {
|
|
82
|
+
options.requestOptions.signal.addEventListener('abort', () => controller.abort());
|
|
83
|
+
}
|
|
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":";;;AACA,4CAKsB;AAkDtB,8CAA8C;AAC9C,cAAc;AACd,8CAA8C;AAE9C,MAAa,UAAU;IACJ,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,cAAc,CAAS;IAExC,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,+BAAmB,CAAC,+DAA+D,CAAC,CAAC;QACjG,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,yBAAyB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAI,OAA+B;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAChE,IAAI,SAA4B,CAAC;QAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBAE3D,uBAAuB;gBACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC5E,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;wBAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;wBACpC,SAAS;oBACX,CAAC;oBACD,MAAM,IAAI,kCAAsB,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC;gBACtE,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAoB,CAAC;gBAErD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;oBACxB,MAAM,IAAI,4BAAgB,CACxB,IAAI,EAAE,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAC1C,QAAQ,CAAC,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EACvB,IAAI,EAAE,MAAM,IAAI,EAAE,CACnB,CAAC;gBACJ,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sCAAsC;gBACtC,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACjE,MAAM,IAAI,gCAAoB,CAAC,OAAO,CAAC,CAAC;gBAC1C,CAAC;gBAED,SAAS,GAAG,KAAc,CAAC;gBAE3B,qEAAqE;gBACrE,IAAI,KAAK,YAAY,4BAAgB,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;oBAChE,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChC,MAAM,SAAS,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,GAAW,EACX,OAA+B,EAC/B,OAAe;QAEf,MAAM,OAAO,GAA2B;YACtC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACxC,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,kBAAkB;YAC5B,GAAG,OAAO,CAAC,cAAc,EAAE,OAAO;SACnC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,oDAAoD;QACpD,IAAI,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;YACnC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO;gBACP,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7D,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,QAAQ,CACd,IAAY,EACZ,KAA6D;QAE7D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,gBAAgB,CAAC,OAAe;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC;QAC1C,OAAO,IAAI,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF;AAzID,gCAyIC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
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
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":";;;AAAA,mDAA8C;AAArC,4GAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { HttpClientConfig } from './client/http-client.js';
|
|
2
|
+
import { InvoiceService } from './services/invoices.js';
|
|
3
|
+
import { SellerService } from './services/sellers.js';
|
|
4
|
+
import { BuyerService } from './services/buyers.js';
|
|
5
|
+
import { BillingService } from './services/billing.js';
|
|
6
|
+
/**
|
|
7
|
+
* The main E-Invoice SDK client.
|
|
8
|
+
*
|
|
9
|
+
* Provides access to all E-Invoice platform APIs through typed service objects.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { EInvoice } from '@elyonar/einvoice-js';
|
|
14
|
+
*
|
|
15
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
16
|
+
*
|
|
17
|
+
* // Invoices
|
|
18
|
+
* const invoice = await client.invoices.create({ ... });
|
|
19
|
+
* await client.invoices.submit(invoice.data.id);
|
|
20
|
+
*
|
|
21
|
+
* // Sellers & Buyers
|
|
22
|
+
* const sellers = await client.sellers.list();
|
|
23
|
+
* const buyers = await client.buyers.search('Acme');
|
|
24
|
+
*
|
|
25
|
+
* // Billing
|
|
26
|
+
* const balance = await client.billing.getAccount();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class EInvoice {
|
|
30
|
+
/** @internal */
|
|
31
|
+
private readonly httpClient;
|
|
32
|
+
/**
|
|
33
|
+
* Invoice management: create, submit, validate, download, and more.
|
|
34
|
+
*/
|
|
35
|
+
readonly invoices: InvoiceService;
|
|
36
|
+
/**
|
|
37
|
+
* Seller management: register, update, verify TIN.
|
|
38
|
+
*/
|
|
39
|
+
readonly sellers: SellerService;
|
|
40
|
+
/**
|
|
41
|
+
* Buyer management: register, update, verify TIN.
|
|
42
|
+
*/
|
|
43
|
+
readonly buyers: BuyerService;
|
|
44
|
+
/**
|
|
45
|
+
* Billing management: account, credits, subscriptions, payments, analytics.
|
|
46
|
+
*/
|
|
47
|
+
readonly billing: BillingService;
|
|
48
|
+
/**
|
|
49
|
+
* Create a new E-Invoice SDK client.
|
|
50
|
+
*
|
|
51
|
+
* @param config - Client configuration. At minimum, `apiKey` is required.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* // Minimal configuration
|
|
56
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
57
|
+
*
|
|
58
|
+
* // Full configuration
|
|
59
|
+
* const client = new EInvoice({
|
|
60
|
+
* apiKey: 'sk_live_...',
|
|
61
|
+
* baseUrl: 'https://api.einvoice.ng',
|
|
62
|
+
* timeout: 15000,
|
|
63
|
+
* maxRetries: 2,
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
constructor(config: HttpClientConfig);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=einvoice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"einvoice.d.ts","sourceRoot":"","sources":["../../src/einvoice.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,QAAQ;IACnB,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IAExC;;OAEG;IACH,SAAgB,QAAQ,EAAE,cAAc,CAAC;IAEzC;;OAEG;IACH,SAAgB,OAAO,EAAE,aAAa,CAAC;IAEvC;;OAEG;IACH,SAAgB,MAAM,EAAE,YAAY,CAAC;IAErC;;OAEG;IACH,SAAgB,OAAO,EAAE,cAAc,CAAC;IAExC;;;;;;;;;;;;;;;;;;OAkBG;gBACS,MAAM,EAAE,gBAAgB;CAQrC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EInvoice = void 0;
|
|
4
|
+
const http_client_js_1 = require("./client/http-client.js");
|
|
5
|
+
const invoices_js_1 = require("./services/invoices.js");
|
|
6
|
+
const sellers_js_1 = require("./services/sellers.js");
|
|
7
|
+
const buyers_js_1 = require("./services/buyers.js");
|
|
8
|
+
const billing_js_1 = require("./services/billing.js");
|
|
9
|
+
/**
|
|
10
|
+
* The main E-Invoice SDK client.
|
|
11
|
+
*
|
|
12
|
+
* Provides access to all E-Invoice platform APIs through typed service objects.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { EInvoice } from '@elyonar/einvoice-js';
|
|
17
|
+
*
|
|
18
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
19
|
+
*
|
|
20
|
+
* // Invoices
|
|
21
|
+
* const invoice = await client.invoices.create({ ... });
|
|
22
|
+
* await client.invoices.submit(invoice.data.id);
|
|
23
|
+
*
|
|
24
|
+
* // Sellers & Buyers
|
|
25
|
+
* const sellers = await client.sellers.list();
|
|
26
|
+
* const buyers = await client.buyers.search('Acme');
|
|
27
|
+
*
|
|
28
|
+
* // Billing
|
|
29
|
+
* const balance = await client.billing.getAccount();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
class EInvoice {
|
|
33
|
+
/** @internal */
|
|
34
|
+
httpClient;
|
|
35
|
+
/**
|
|
36
|
+
* Invoice management: create, submit, validate, download, and more.
|
|
37
|
+
*/
|
|
38
|
+
invoices;
|
|
39
|
+
/**
|
|
40
|
+
* Seller management: register, update, verify TIN.
|
|
41
|
+
*/
|
|
42
|
+
sellers;
|
|
43
|
+
/**
|
|
44
|
+
* Buyer management: register, update, verify TIN.
|
|
45
|
+
*/
|
|
46
|
+
buyers;
|
|
47
|
+
/**
|
|
48
|
+
* Billing management: account, credits, subscriptions, payments, analytics.
|
|
49
|
+
*/
|
|
50
|
+
billing;
|
|
51
|
+
/**
|
|
52
|
+
* Create a new E-Invoice SDK client.
|
|
53
|
+
*
|
|
54
|
+
* @param config - Client configuration. At minimum, `apiKey` is required.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* // Minimal configuration
|
|
59
|
+
* const client = new EInvoice({ apiKey: 'sk_test_...' });
|
|
60
|
+
*
|
|
61
|
+
* // Full configuration
|
|
62
|
+
* const client = new EInvoice({
|
|
63
|
+
* apiKey: 'sk_live_...',
|
|
64
|
+
* baseUrl: 'https://api.einvoice.ng',
|
|
65
|
+
* timeout: 15000,
|
|
66
|
+
* maxRetries: 2,
|
|
67
|
+
* });
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
constructor(config) {
|
|
71
|
+
this.httpClient = new http_client_js_1.HttpClient(config);
|
|
72
|
+
this.invoices = new invoices_js_1.InvoiceService(this.httpClient);
|
|
73
|
+
this.sellers = new sellers_js_1.SellerService(this.httpClient);
|
|
74
|
+
this.buyers = new buyers_js_1.BuyerService(this.httpClient);
|
|
75
|
+
this.billing = new billing_js_1.BillingService(this.httpClient);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.EInvoice = EInvoice;
|
|
79
|
+
//# sourceMappingURL=einvoice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"einvoice.js","sourceRoot":"","sources":["../../src/einvoice.ts"],"names":[],"mappings":";;;AAAA,4DAAqD;AAErD,wDAAwD;AACxD,sDAAsD;AACtD,oDAAoD;AACpD,sDAAuD;AAEvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,QAAQ;IACnB,gBAAgB;IACC,UAAU,CAAa;IAExC;;OAEG;IACa,QAAQ,CAAiB;IAEzC;;OAEG;IACa,OAAO,CAAgB;IAEvC;;OAEG;IACa,MAAM,CAAe;IAErC;;OAEG;IACa,OAAO,CAAiB;IAExC;;;;;;;;;;;;;;;;;;OAkBG;IACH,YAAY,MAAwB;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,2BAAU,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,CAAC,QAAQ,GAAG,IAAI,4BAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,0BAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,wBAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,2BAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;CACF;AAnDD,4BAmDC"}
|