@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.
Files changed (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +230 -0
  3. package/dist/cjs/client/http-client.d.ts +52 -0
  4. package/dist/cjs/client/http-client.d.ts.map +1 -0
  5. package/dist/cjs/client/http-client.js +117 -0
  6. package/dist/cjs/client/http-client.js.map +1 -0
  7. package/dist/cjs/client/index.d.ts +3 -0
  8. package/dist/cjs/client/index.d.ts.map +1 -0
  9. package/dist/cjs/client/index.js +6 -0
  10. package/dist/cjs/client/index.js.map +1 -0
  11. package/dist/cjs/einvoice.d.ts +69 -0
  12. package/dist/cjs/einvoice.d.ts.map +1 -0
  13. package/dist/cjs/einvoice.js +79 -0
  14. package/dist/cjs/einvoice.js.map +1 -0
  15. package/dist/cjs/errors.d.ts +74 -0
  16. package/dist/cjs/errors.d.ts.map +1 -0
  17. package/dist/cjs/errors.js +98 -0
  18. package/dist/cjs/errors.js.map +1 -0
  19. package/dist/cjs/index.d.ts +12 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +40 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/package.json +1 -0
  24. package/dist/cjs/services/billing.d.ts +75 -0
  25. package/dist/cjs/services/billing.d.ts.map +1 -0
  26. package/dist/cjs/services/billing.js +172 -0
  27. package/dist/cjs/services/billing.js.map +1 -0
  28. package/dist/cjs/services/buyers.d.ts +57 -0
  29. package/dist/cjs/services/buyers.d.ts.map +1 -0
  30. package/dist/cjs/services/buyers.js +110 -0
  31. package/dist/cjs/services/buyers.js.map +1 -0
  32. package/dist/cjs/services/index.d.ts +5 -0
  33. package/dist/cjs/services/index.d.ts.map +1 -0
  34. package/dist/cjs/services/index.js +12 -0
  35. package/dist/cjs/services/index.js.map +1 -0
  36. package/dist/cjs/services/invoices.d.ts +94 -0
  37. package/dist/cjs/services/invoices.d.ts.map +1 -0
  38. package/dist/cjs/services/invoices.js +193 -0
  39. package/dist/cjs/services/invoices.js.map +1 -0
  40. package/dist/cjs/services/sellers.d.ts +61 -0
  41. package/dist/cjs/services/sellers.d.ts.map +1 -0
  42. package/dist/cjs/services/sellers.js +114 -0
  43. package/dist/cjs/services/sellers.js.map +1 -0
  44. package/dist/cjs/types/billing.d.ts +174 -0
  45. package/dist/cjs/types/billing.d.ts.map +1 -0
  46. package/dist/cjs/types/billing.js +6 -0
  47. package/dist/cjs/types/billing.js.map +1 -0
  48. package/dist/cjs/types/common.d.ts +53 -0
  49. package/dist/cjs/types/common.d.ts.map +1 -0
  50. package/dist/cjs/types/common.js +6 -0
  51. package/dist/cjs/types/common.js.map +1 -0
  52. package/dist/cjs/types/index.d.ts +6 -0
  53. package/dist/cjs/types/index.d.ts.map +1 -0
  54. package/dist/cjs/types/index.js +3 -0
  55. package/dist/cjs/types/index.js.map +1 -0
  56. package/dist/cjs/types/invoice.d.ts +183 -0
  57. package/dist/cjs/types/invoice.d.ts.map +1 -0
  58. package/dist/cjs/types/invoice.js +6 -0
  59. package/dist/cjs/types/invoice.js.map +1 -0
  60. package/dist/cjs/types/party.d.ts +128 -0
  61. package/dist/cjs/types/party.d.ts.map +1 -0
  62. package/dist/cjs/types/party.js +3 -0
  63. package/dist/cjs/types/party.js.map +1 -0
  64. package/dist/cjs/types/webhook.d.ts +14 -0
  65. package/dist/cjs/types/webhook.d.ts.map +1 -0
  66. package/dist/cjs/types/webhook.js +6 -0
  67. package/dist/cjs/types/webhook.js.map +1 -0
  68. package/dist/cjs/webhooks/index.d.ts +3 -0
  69. package/dist/cjs/webhooks/index.d.ts.map +1 -0
  70. package/dist/cjs/webhooks/index.js +6 -0
  71. package/dist/cjs/webhooks/index.js.map +1 -0
  72. package/dist/cjs/webhooks/verify.d.ts +43 -0
  73. package/dist/cjs/webhooks/verify.d.ts.map +1 -0
  74. package/dist/cjs/webhooks/verify.js +92 -0
  75. package/dist/cjs/webhooks/verify.js.map +1 -0
  76. package/dist/esm/client/http-client.d.ts +52 -0
  77. package/dist/esm/client/http-client.d.ts.map +1 -0
  78. package/dist/esm/client/http-client.js +113 -0
  79. package/dist/esm/client/http-client.js.map +1 -0
  80. package/dist/esm/client/index.d.ts +3 -0
  81. package/dist/esm/client/index.d.ts.map +1 -0
  82. package/dist/esm/client/index.js +2 -0
  83. package/dist/esm/client/index.js.map +1 -0
  84. package/dist/esm/einvoice.d.ts +69 -0
  85. package/dist/esm/einvoice.d.ts.map +1 -0
  86. package/dist/esm/einvoice.js +75 -0
  87. package/dist/esm/einvoice.js.map +1 -0
  88. package/dist/esm/errors.d.ts +74 -0
  89. package/dist/esm/errors.d.ts.map +1 -0
  90. package/dist/esm/errors.js +89 -0
  91. package/dist/esm/errors.js.map +1 -0
  92. package/dist/esm/index.d.ts +12 -0
  93. package/dist/esm/index.d.ts.map +1 -0
  94. package/dist/esm/index.js +24 -0
  95. package/dist/esm/index.js.map +1 -0
  96. package/dist/esm/services/billing.d.ts +75 -0
  97. package/dist/esm/services/billing.d.ts.map +1 -0
  98. package/dist/esm/services/billing.js +168 -0
  99. package/dist/esm/services/billing.js.map +1 -0
  100. package/dist/esm/services/buyers.d.ts +57 -0
  101. package/dist/esm/services/buyers.d.ts.map +1 -0
  102. package/dist/esm/services/buyers.js +106 -0
  103. package/dist/esm/services/buyers.js.map +1 -0
  104. package/dist/esm/services/index.d.ts +5 -0
  105. package/dist/esm/services/index.d.ts.map +1 -0
  106. package/dist/esm/services/index.js +5 -0
  107. package/dist/esm/services/index.js.map +1 -0
  108. package/dist/esm/services/invoices.d.ts +94 -0
  109. package/dist/esm/services/invoices.d.ts.map +1 -0
  110. package/dist/esm/services/invoices.js +189 -0
  111. package/dist/esm/services/invoices.js.map +1 -0
  112. package/dist/esm/services/sellers.d.ts +61 -0
  113. package/dist/esm/services/sellers.d.ts.map +1 -0
  114. package/dist/esm/services/sellers.js +110 -0
  115. package/dist/esm/services/sellers.js.map +1 -0
  116. package/dist/esm/types/billing.d.ts +174 -0
  117. package/dist/esm/types/billing.d.ts.map +1 -0
  118. package/dist/esm/types/billing.js +5 -0
  119. package/dist/esm/types/billing.js.map +1 -0
  120. package/dist/esm/types/common.d.ts +53 -0
  121. package/dist/esm/types/common.d.ts.map +1 -0
  122. package/dist/esm/types/common.js +5 -0
  123. package/dist/esm/types/common.js.map +1 -0
  124. package/dist/esm/types/index.d.ts +6 -0
  125. package/dist/esm/types/index.d.ts.map +1 -0
  126. package/dist/esm/types/index.js +2 -0
  127. package/dist/esm/types/index.js.map +1 -0
  128. package/dist/esm/types/invoice.d.ts +183 -0
  129. package/dist/esm/types/invoice.d.ts.map +1 -0
  130. package/dist/esm/types/invoice.js +5 -0
  131. package/dist/esm/types/invoice.js.map +1 -0
  132. package/dist/esm/types/party.d.ts +128 -0
  133. package/dist/esm/types/party.d.ts.map +1 -0
  134. package/dist/esm/types/party.js +2 -0
  135. package/dist/esm/types/party.js.map +1 -0
  136. package/dist/esm/types/webhook.d.ts +14 -0
  137. package/dist/esm/types/webhook.d.ts.map +1 -0
  138. package/dist/esm/types/webhook.js +5 -0
  139. package/dist/esm/types/webhook.js.map +1 -0
  140. package/dist/esm/webhooks/index.d.ts +3 -0
  141. package/dist/esm/webhooks/index.d.ts.map +1 -0
  142. package/dist/esm/webhooks/index.js +2 -0
  143. package/dist/esm/webhooks/index.js.map +1 -0
  144. package/dist/esm/webhooks/verify.d.ts +43 -0
  145. package/dist/esm/webhooks/verify.d.ts.map +1 -0
  146. package/dist/esm/webhooks/verify.js +89 -0
  147. package/dist/esm/webhooks/verify.js.map +1 -0
  148. 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
+ [![npm version](https://img.shields.io/npm/v/@elyonar/einvoice-js)](https://www.npmjs.com/package/@elyonar/einvoice-js)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](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":"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"}
@@ -0,0 +1,3 @@
1
+ export { HttpClient } from './http-client.js';
2
+ export type { HttpClientConfig, InternalRequestOptions } from './http-client.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}