@taxora/sdk 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/dist/index.cjs +47 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -3
- package/dist/index.d.ts +33 -3
- package/dist/index.js +47 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,6 +61,9 @@ const vat = await client.vat.validate('ATU12345678', 'Example GmbH');
|
|
|
61
61
|
console.log(vat.state); // 'valid' | 'invalid' | 'fraud' | 'unknown'
|
|
62
62
|
console.log(vat.companyName); // Official company name from registry
|
|
63
63
|
console.log(vat.score); // Overall confidence score (0.0 – 1.0)
|
|
64
|
+
console.log(vat.hasApiError); // true when the official provider had a technical failure
|
|
65
|
+
console.log(vat.errorMessage); // technical provider error details, if returned
|
|
66
|
+
console.log(vat.nextApiRecheckAt); // planned retry timestamp, if returned
|
|
64
67
|
|
|
65
68
|
for (const step of vat.breakdown ?? []) {
|
|
66
69
|
console.log(`${step.stepName} → ${step.scoreContribution}`);
|
|
@@ -79,6 +82,9 @@ const vatWithAddress = await client.vat.validate('ATU12345678', 'Example GmbH',
|
|
|
79
82
|
|
|
80
83
|
// 3️⃣ Access company context
|
|
81
84
|
const company = await client.company.get();
|
|
85
|
+
console.log(company.api_rate_limit); // General API request limit
|
|
86
|
+
console.log(company.vat_rate_limit); // VAT validation request limit
|
|
87
|
+
console.log(company.rate_limit); // Deprecated legacy field, if returned by older API payloads
|
|
82
88
|
|
|
83
89
|
// 4️⃣ Export certificates
|
|
84
90
|
const exportJob = await client.vat.certificatesBulkExport('2024-01-01', '2024-12-31');
|
|
@@ -87,7 +93,7 @@ import { writeFileSync } from 'fs';
|
|
|
87
93
|
writeFileSync('certificates.zip', zip);
|
|
88
94
|
```
|
|
89
95
|
|
|
90
|
-
`vat.validate()` returns a `VatResource` with the canonical VAT UID, status, company data, and optional
|
|
96
|
+
`vat.validate()` returns a `VatResource` with the canonical VAT UID, status, company data, optional scoring details, and optional API error metadata. `state` remains backward-compatible and still reflects the canonical business result, while `hasApiError`, `errorMessage`, and `nextApiRecheckAt` let you detect cases where the official provider response was technically unreliable. The `score` reflects overall confidence (higher is better), while `breakdown` is an array of `ScoreBreakdown` objects describing each validation step, its score contribution, and metadata (e.g. matched addresses or mismatched fields).
|
|
91
97
|
|
|
92
98
|
Need a custom HTTP client (e.g. for logging or retries)? Pass it via the factory:
|
|
93
99
|
|
|
@@ -127,6 +133,8 @@ Each endpoint handles:
|
|
|
127
133
|
- Bearer token injection and proactive refresh if expired
|
|
128
134
|
- JSON/binary response parsing into typed DTOs
|
|
129
135
|
|
|
136
|
+
`client.company.get()` returns a typed company resource. Prefer `api_rate_limit` and `vat_rate_limit`; legacy `rate_limit` remains available only for older compatibility payloads and is deprecated.
|
|
137
|
+
|
|
130
138
|
`VatEndpoint` and `CompanyEndpoint` use the `AuthRetryHttpClient` wrapper, which transparently handles preemptive token refresh and 401 retry — `AuthEndpoint` always uses the raw HTTP client to avoid circular refresh calls.
|
|
131
139
|
|
|
132
140
|
---
|
|
@@ -239,6 +247,13 @@ console.log(vat.state); // VatState value
|
|
|
239
247
|
console.log(vat.score); // 0.0 – 1.0
|
|
240
248
|
console.log(vat.companyAddress?.toString()); // Full address string
|
|
241
249
|
console.log(vat.getBackendLink()); // https://app.taxora.io/vat/history/{uuid}
|
|
250
|
+
|
|
251
|
+
// Technical provider errors are additive and do not replace the canonical state.
|
|
252
|
+
const retryCase = await client.vat.validate('ATU44000001', 'Example GmbH');
|
|
253
|
+
if (retryCase.state === 'invalid' && retryCase.hasApiError) {
|
|
254
|
+
console.log(retryCase.errorMessage);
|
|
255
|
+
console.log(retryCase.nextApiRecheckAt);
|
|
256
|
+
}
|
|
242
257
|
```
|
|
243
258
|
|
|
244
259
|
### Schema Validation (format check only)
|
package/dist/index.cjs
CHANGED
|
@@ -222,6 +222,18 @@ var AuthEndpoint = class {
|
|
|
222
222
|
}
|
|
223
223
|
};
|
|
224
224
|
|
|
225
|
+
// src/dto/CompanyResource.ts
|
|
226
|
+
function normalizeCompanyResource(data) {
|
|
227
|
+
const apiRateLimit = typeof data["api_rate_limit"] === "number" ? data["api_rate_limit"] : void 0;
|
|
228
|
+
const vatRateLimit = typeof data["vat_rate_limit"] === "number" ? data["vat_rate_limit"] : void 0;
|
|
229
|
+
const legacyRateLimit = typeof data["rate_limit"] === "number" ? data["rate_limit"] : void 0;
|
|
230
|
+
return {
|
|
231
|
+
...data,
|
|
232
|
+
api_rate_limit: apiRateLimit ?? legacyRateLimit ?? 0,
|
|
233
|
+
vat_rate_limit: vatRateLimit ?? legacyRateLimit ?? 0
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
225
237
|
// src/endpoints/CompanyEndpoint.ts
|
|
226
238
|
var CompanyEndpoint = class {
|
|
227
239
|
constructor(baseUrl, apiKey, tokenStorage, httpClient) {
|
|
@@ -259,9 +271,9 @@ var CompanyEndpoint = class {
|
|
|
259
271
|
}
|
|
260
272
|
const obj = parsed;
|
|
261
273
|
if (obj["data"] !== void 0 && typeof obj["data"] === "object" && obj["data"] !== null) {
|
|
262
|
-
return obj["data"];
|
|
274
|
+
return normalizeCompanyResource(obj["data"]);
|
|
263
275
|
}
|
|
264
|
-
return obj;
|
|
276
|
+
return normalizeCompanyResource(obj);
|
|
265
277
|
}
|
|
266
278
|
};
|
|
267
279
|
|
|
@@ -489,7 +501,7 @@ var ProviderDocument = class _ProviderDocument {
|
|
|
489
501
|
|
|
490
502
|
// src/dto/VatResource.ts
|
|
491
503
|
var VatResource = class _VatResource {
|
|
492
|
-
constructor(uuid, vatUid, state, countryCode, companyName, companyAddress, requestedCompanyName, requestedCompanyNameOriginal, requestedInputAddress, checkedAt, score, scoreSource, scoreAttempts, breakdown, environment, provider, usedProviders, providerVatState, providerNote, providerLastCheckedAt, providerDocument) {
|
|
504
|
+
constructor(uuid, vatUid, state, countryCode, companyName, companyAddress, requestedCompanyName, requestedCompanyNameOriginal, requestedInputAddress, checkedAt, score, scoreSource, scoreAttempts, breakdown, environment, provider, usedProviders, providerValid, providerVatState, providerNote, providerLastCheckedAt, hasApiError, errorMessage, nextApiRecheckAt, providerDocument) {
|
|
493
505
|
this.uuid = uuid;
|
|
494
506
|
this.vatUid = vatUid;
|
|
495
507
|
this.state = state;
|
|
@@ -507,9 +519,13 @@ var VatResource = class _VatResource {
|
|
|
507
519
|
this.environment = environment;
|
|
508
520
|
this.provider = provider;
|
|
509
521
|
this.usedProviders = usedProviders;
|
|
522
|
+
this.providerValid = providerValid;
|
|
510
523
|
this.providerVatState = providerVatState;
|
|
511
524
|
this.providerNote = providerNote;
|
|
512
525
|
this.providerLastCheckedAt = providerLastCheckedAt;
|
|
526
|
+
this.hasApiError = hasApiError;
|
|
527
|
+
this.errorMessage = errorMessage;
|
|
528
|
+
this.nextApiRecheckAt = nextApiRecheckAt;
|
|
513
529
|
this.providerDocument = providerDocument;
|
|
514
530
|
}
|
|
515
531
|
uuid;
|
|
@@ -529,9 +545,13 @@ var VatResource = class _VatResource {
|
|
|
529
545
|
environment;
|
|
530
546
|
provider;
|
|
531
547
|
usedProviders;
|
|
548
|
+
providerValid;
|
|
532
549
|
providerVatState;
|
|
533
550
|
providerNote;
|
|
534
551
|
providerLastCheckedAt;
|
|
552
|
+
hasApiError;
|
|
553
|
+
errorMessage;
|
|
554
|
+
nextApiRecheckAt;
|
|
535
555
|
providerDocument;
|
|
536
556
|
static fromArray(data) {
|
|
537
557
|
const str = (key) => {
|
|
@@ -542,6 +562,10 @@ var VatResource = class _VatResource {
|
|
|
542
562
|
const state = stateRaw !== void 0 && Object.values(VatState).includes(stateRaw) ? stateRaw : void 0;
|
|
543
563
|
const checkedAt = str("checked_at") ? new Date(data["checked_at"]) : void 0;
|
|
544
564
|
const providerLastCheckedAt = str("provider_last_checked_at") ? new Date(data["provider_last_checked_at"]) : void 0;
|
|
565
|
+
const hasApiError = data["has_api_error"] === null ? null : typeof data["has_api_error"] === "boolean" ? data["has_api_error"] : void 0;
|
|
566
|
+
const errorMessage = data["error_message"] === null ? null : typeof data["error_message"] === "string" ? data["error_message"] : void 0;
|
|
567
|
+
const nextApiRecheckAt = data["next_api_recheck_at"] === null ? null : typeof data["next_api_recheck_at"] === "string" ? data["next_api_recheck_at"] : void 0;
|
|
568
|
+
const providerValid = data["provider_valid"] === null ? null : typeof data["provider_valid"] === "boolean" ? data["provider_valid"] : void 0;
|
|
545
569
|
const breakdown = Array.isArray(data["breakdown"]) ? data["breakdown"].map(ScoreBreakdown.fromArray) : void 0;
|
|
546
570
|
const usedProviders = Array.isArray(data["used_providers"]) ? data["used_providers"].filter((v) => typeof v === "string") : void 0;
|
|
547
571
|
const scoreAttempts = Array.isArray(data["score_attempts"]) ? data["score_attempts"] : void 0;
|
|
@@ -564,9 +588,13 @@ var VatResource = class _VatResource {
|
|
|
564
588
|
str("environment"),
|
|
565
589
|
str("provider"),
|
|
566
590
|
usedProviders,
|
|
591
|
+
providerValid,
|
|
567
592
|
str("provider_vat_state"),
|
|
568
593
|
str("provider_note"),
|
|
569
594
|
providerLastCheckedAt,
|
|
595
|
+
hasApiError,
|
|
596
|
+
errorMessage,
|
|
597
|
+
nextApiRecheckAt,
|
|
570
598
|
ProviderDocument.fromArray(data["provider_document"]) ?? void 0
|
|
571
599
|
);
|
|
572
600
|
}
|
|
@@ -577,6 +605,18 @@ var VatResource = class _VatResource {
|
|
|
577
605
|
}
|
|
578
606
|
return `https://app.sandbox.taxora.io/vat/history/${this.uuid}`;
|
|
579
607
|
}
|
|
608
|
+
isValid(useProviderState = false) {
|
|
609
|
+
if (useProviderState) {
|
|
610
|
+
return this.isProviderValid();
|
|
611
|
+
}
|
|
612
|
+
return this.state === VatState.VALID;
|
|
613
|
+
}
|
|
614
|
+
isProviderValid() {
|
|
615
|
+
if (this.providerValid !== void 0 && this.providerValid !== null) {
|
|
616
|
+
return this.providerValid;
|
|
617
|
+
}
|
|
618
|
+
return this.providerVatState === VatState.VALID;
|
|
619
|
+
}
|
|
580
620
|
toArray() {
|
|
581
621
|
return {
|
|
582
622
|
uuid: this.uuid,
|
|
@@ -596,9 +636,13 @@ var VatResource = class _VatResource {
|
|
|
596
636
|
environment: this.environment ?? null,
|
|
597
637
|
provider: this.provider ?? null,
|
|
598
638
|
used_providers: this.usedProviders ?? null,
|
|
639
|
+
provider_valid: this.providerValid ?? null,
|
|
599
640
|
provider_vat_state: this.providerVatState ?? null,
|
|
600
641
|
provider_note: this.providerNote ?? null,
|
|
601
642
|
provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,
|
|
643
|
+
has_api_error: this.hasApiError ?? null,
|
|
644
|
+
error_message: this.errorMessage ?? null,
|
|
645
|
+
next_api_recheck_at: this.nextApiRecheckAt ?? null,
|
|
602
646
|
provider_document: this.providerDocument?.toArray() ?? null
|
|
603
647
|
};
|
|
604
648
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/endpoints/AuthEndpoint.ts","../src/dto/Token.ts","../src/enums/LoginIdentifier.ts","../src/exceptions/TaxoraException.ts","../src/exceptions/AuthenticationException.ts","../src/exceptions/HttpException.ts","../src/endpoints/CompanyEndpoint.ts","../src/enums/VatState.ts","../src/dto/CompanyAddress.ts","../src/dto/ScoreBreakdown.ts","../src/dto/ProviderDocumentLine.ts","../src/dto/ProviderDocument.ts","../src/dto/VatResource.ts","../src/dto/VatCollection.ts","../src/dto/VatCertificateExport.ts","../src/dto/VatValidationAddressInput.ts","../src/exceptions/ValidationException.ts","../src/endpoints/VatEndpoint.ts","../src/enums/Environment.ts","../src/http/FetchHttpClient.ts","../src/http/InMemoryTokenStorage.ts","../src/http/AuthRetryHttpClient.ts","../src/client/TaxoraClient.ts","../src/client/TaxoraClientFactory.ts","../src/enums/ApiVersion.ts","../src/enums/Language.ts"],"sourcesContent":["// Client\nexport { TaxoraClient } from './client/TaxoraClient.js';\nexport { TaxoraClientFactory } from './client/TaxoraClientFactory.js';\nexport type { TaxoraClientOptions } from './client/TaxoraClient.js';\n\n// Endpoints\nexport { AuthEndpoint } from './endpoints/AuthEndpoint.js';\nexport { CompanyEndpoint } from './endpoints/CompanyEndpoint.js';\nexport { VatEndpoint } from './endpoints/VatEndpoint.js';\n\n// DTOs\nexport { Token } from './dto/Token.js';\nexport { ScoreBreakdown } from './dto/ScoreBreakdown.js';\nexport { CompanyAddress } from './dto/CompanyAddress.js';\nexport { VatValidationAddressInput } from './dto/VatValidationAddressInput.js';\nexport { ProviderDocumentLine } from './dto/ProviderDocumentLine.js';\nexport { ProviderDocument } from './dto/ProviderDocument.js';\nexport { VatResource } from './dto/VatResource.js';\nexport { VatCollection } from './dto/VatCollection.js';\nexport { VatCertificateExport } from './dto/VatCertificateExport.js';\n\n// Enums\nexport { Environment, getBaseUrl } from './enums/Environment.js';\nexport type { Environment as EnvironmentType } from './enums/Environment.js';\nexport { ApiVersion } from './enums/ApiVersion.js';\nexport { Language } from './enums/Language.js';\nexport { LoginIdentifier } from './enums/LoginIdentifier.js';\nexport { VatState, getFailedVatStates, describeVatState } from './enums/VatState.js';\n\n// Exceptions\nexport { TaxoraException } from './exceptions/TaxoraException.js';\nexport { AuthenticationException } from './exceptions/AuthenticationException.js';\nexport { HttpException } from './exceptions/HttpException.js';\nexport { ValidationException } from './exceptions/ValidationException.js';\n\n// HTTP\nexport type { TokenStorageInterface } from './http/TokenStorageInterface.js';\nexport { InMemoryTokenStorage } from './http/InMemoryTokenStorage.js';\nexport type { HttpClientInterface } from './http/HttpClientInterface.js';\nexport { FetchHttpClient } from './http/FetchHttpClient.js';\nexport { AuthRetryHttpClient } from './http/AuthRetryHttpClient.js';\n","import { hostname } from 'os';\nimport { Token } from '../dto/Token.js';\nimport { LoginIdentifier } from '../enums/LoginIdentifier.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class AuthEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async login(\n identifier: string,\n password: string,\n device?: string,\n loginIdentifier: LoginIdentifier = LoginIdentifier.EMAIL,\n ): Promise<Token> {\n const deviceName = device ?? hostname();\n\n const body: Record<string, string> = {\n identifier: loginIdentifier,\n password,\n device_name: deviceName,\n };\n\n if (loginIdentifier === LoginIdentifier.CLIENT_ID) {\n body['client_id'] = identifier;\n } else {\n body['email'] = identifier;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/login`, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Authentication failed: invalid credentials', {\n status: 401,\n body: responseText,\n });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n async loginWithClientId(clientId: string, password: string, device?: string): Promise<Token> {\n return this.login(clientId, password, device, LoginIdentifier.CLIENT_ID);\n }\n\n async refresh(): Promise<Token> {\n const storedToken = this.tokenStorage.get();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n if (storedToken) {\n headers['Authorization'] = `Bearer ${storedToken.accessToken}`;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/refresh`, { headers });\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Token refresh failed: unauthorized', { status: 401, body: responseText });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n private parseResponse(responseText: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n}\n","export class Token {\n constructor(\n public readonly accessToken: string,\n public readonly tokenType: string,\n public readonly expiresAt: Date,\n ) {}\n\n isExpired(bufferSeconds = 15): boolean {\n return new Date(Date.now() + bufferSeconds * 1000) >= this.expiresAt;\n }\n\n static fromArray(data: Record<string, unknown>): Token {\n let accessToken = String(data['access_token'] ?? '');\n if (accessToken.startsWith('Bearer ')) {\n accessToken = accessToken.slice(7);\n }\n\n const tokenType = String(data['token_type'] ?? 'Bearer');\n const expiresIn = typeof data['expires_in'] === 'number' ? data['expires_in'] : 3600;\n const expiresAt = new Date(Date.now() + expiresIn * 1000);\n\n return new Token(accessToken, tokenType, expiresAt);\n }\n\n toArray(): { access_token: string; token_type: string; expires_at: string } {\n return {\n access_token: this.accessToken,\n token_type: this.tokenType,\n expires_at: this.expiresAt.toISOString(),\n };\n }\n}\n","export const LoginIdentifier = {\n EMAIL: 'email',\n CLIENT_ID: 'client_id',\n} as const;\n\nexport type LoginIdentifier = (typeof LoginIdentifier)[keyof typeof LoginIdentifier];\n","export class TaxoraException extends Error {\n public readonly context: Record<string, unknown>;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message);\n this.name = 'TaxoraException';\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class AuthenticationException extends TaxoraException {\n public readonly statusCode = 401;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'AuthenticationException';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class HttpException extends TaxoraException {\n public readonly statusCode: number;\n public readonly responseBody: string;\n\n constructor(message: string, statusCode: number, responseBody: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'HttpException';\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getStatusCode(): number {\n return this.statusCode;\n }\n\n getResponseBody(): string {\n return this.responseBody;\n }\n}\n","import { HttpException } from '../exceptions/HttpException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class CompanyEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async get(): Promise<Record<string, unknown>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n\n const response = await this.httpClient.request('GET', `${this.baseUrl}/company`, { headers });\n const responseText = await response.text();\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n}\n","export const VatState = {\n VALID: 'valid',\n INVALID: 'invalid',\n FRAUD: 'fraud',\n UNKNOWN: 'unknown',\n} as const;\n\nexport type VatState = (typeof VatState)[keyof typeof VatState];\n\nexport function getFailedVatStates(): VatState[] {\n return [VatState.INVALID, VatState.FRAUD];\n}\n\nconst DESCRIPTIONS: Record<VatState, string> = {\n [VatState.VALID]: 'The VAT number is valid and active.',\n [VatState.INVALID]: 'The VAT number is invalid or not registered.',\n [VatState.FRAUD]: 'The VAT number has been flagged as potentially fraudulent.',\n [VatState.UNKNOWN]: 'The VAT number state could not be determined.',\n};\n\nexport function describeVatState(state: VatState): string {\n return DESCRIPTIONS[state];\n}\n","interface CompanyAddressProps {\n fullAddress?: string | null;\n name?: string | null;\n street?: string | null;\n postalCode?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n raw?: string | null;\n}\n\nexport class CompanyAddress {\n public readonly fullAddress: string | null;\n public readonly name: string | null;\n public readonly street: string | null;\n public readonly postalCode: string | null;\n public readonly city: string | null;\n public readonly state: string | null;\n public readonly country: string | null;\n public readonly raw: string | null;\n\n constructor(props: CompanyAddressProps) {\n this.name = props.name ?? null;\n this.street = props.street ?? null;\n this.postalCode = props.postalCode ?? null;\n this.city = props.city ?? null;\n this.state = props.state ?? null;\n this.country = props.country ?? null;\n this.raw = props.raw ?? null;\n this.fullAddress = props.fullAddress ?? this.assembleFullAddress();\n }\n\n private assembleFullAddress(): string | null {\n const parts = [this.street, this.postalCode, this.city, this.country].filter(Boolean);\n return parts.length > 0 ? parts.join(', ') : null;\n }\n\n static from(value: unknown): CompanyAddress | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return CompanyAddress.fromArray(parsed as Record<string, unknown>, trimmed);\n }\n } catch {\n // Not valid JSON — treat as plain string\n }\n return new CompanyAddress({ raw: trimmed });\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n return CompanyAddress.fromArray(value as Record<string, unknown>, null);\n }\n\n return null;\n }\n\n static fromArray(data: Record<string, unknown>, raw: string | null): CompanyAddress {\n const get = (key: string): string | null => {\n const val = data[key] ?? data[key.replace(/_/g, '-')];\n return typeof val === 'string' && val.trim() ? val.trim() : null;\n };\n\n return new CompanyAddress({\n fullAddress: get('full_address'),\n name: get('name'),\n street: get('street'),\n postalCode: get('postal_code') ?? get('postalCode'),\n city: get('city'),\n state: get('state'),\n country: get('country'),\n raw,\n });\n }\n\n toArray(): Record<string, string | null> {\n return {\n full_address: this.fullAddress,\n name: this.name,\n street: this.street,\n postal_code: this.postalCode,\n city: this.city,\n state: this.state,\n country: this.country,\n };\n }\n\n toString(): string {\n return this.fullAddress ?? this.raw ?? '';\n }\n}\n","export class ScoreBreakdown {\n constructor(\n public readonly stepName: string,\n public readonly scoreContribution: number,\n public readonly metadata: Record<string, unknown>,\n ) {}\n\n static fromArray(data: Record<string, unknown>): ScoreBreakdown {\n return new ScoreBreakdown(\n typeof data['step_name'] === 'string' ? data['step_name'] : '',\n typeof data['score_contribution'] === 'number' ? data['score_contribution'] : 0,\n data['metadata'] !== null && typeof data['metadata'] === 'object' && !Array.isArray(data['metadata'])\n ? (data['metadata'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): { step_name: string; score_contribution: number; metadata: Record<string, unknown> } {\n return {\n step_name: this.stepName,\n score_contribution: this.scoreContribution,\n metadata: this.metadata,\n };\n }\n}\n","export class ProviderDocumentLine {\n constructor(\n public readonly id: number | null,\n public readonly vatUid: string | null,\n public readonly rowNumber: number | null,\n public readonly entryIdentifier: string | null,\n public readonly reference: string | null,\n public readonly meta: Record<string, unknown>,\n ) {}\n\n static fromArray(data: unknown): ProviderDocumentLine | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n return new ProviderDocumentLine(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['vat_uid'] === 'string' ? d['vat_uid'] : null,\n typeof d['row_number'] === 'number' ? d['row_number'] : null,\n typeof d['entry_identifier'] === 'string' ? d['entry_identifier'] : null,\n typeof d['reference'] === 'string' ? d['reference'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n vat_uid: this.vatUid,\n row_number: this.rowNumber,\n entry_identifier: this.entryIdentifier,\n reference: this.reference,\n meta: this.meta,\n };\n }\n}\n","import { ProviderDocumentLine } from './ProviderDocumentLine.js';\n\nexport class ProviderDocument {\n constructor(\n public readonly id: number | null,\n public readonly provider: string | null,\n public readonly documentType: string | null,\n public readonly state: string | null,\n public readonly documentDate: Date | null,\n public readonly mime: string | null,\n public readonly size: number | null,\n public readonly hash: string | null,\n public readonly meta: Record<string, unknown>,\n public readonly line: ProviderDocumentLine | null,\n ) {}\n\n static fromArray(data: unknown): ProviderDocument | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n const documentDate =\n typeof d['document_date'] === 'string' && d['document_date'] ? new Date(d['document_date']) : null;\n\n return new ProviderDocument(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['provider'] === 'string' ? d['provider'] : null,\n typeof d['document_type'] === 'string' ? d['document_type'] : null,\n typeof d['state'] === 'string' ? d['state'] : null,\n documentDate,\n typeof d['mime'] === 'string' ? d['mime'] : null,\n typeof d['size'] === 'number' ? d['size'] : null,\n typeof d['hash'] === 'string' ? d['hash'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n ProviderDocumentLine.fromArray(d['line']),\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n provider: this.provider,\n document_type: this.documentType,\n state: this.state,\n document_date: this.documentDate?.toISOString() ?? null,\n mime: this.mime,\n size: this.size,\n hash: this.hash,\n meta: this.meta,\n line: this.line?.toArray() ?? null,\n };\n }\n}\n","import { VatState } from '../enums/VatState.js';\nimport { CompanyAddress } from './CompanyAddress.js';\nimport { ScoreBreakdown } from './ScoreBreakdown.js';\nimport { ProviderDocument } from './ProviderDocument.js';\n\nexport class VatResource {\n constructor(\n public readonly uuid: string | undefined,\n public readonly vatUid: string | undefined,\n public readonly state: VatState | undefined,\n public readonly countryCode: string | undefined,\n public readonly companyName: string | undefined,\n public readonly companyAddress: CompanyAddress | undefined,\n public readonly requestedCompanyName: string | undefined,\n public readonly requestedCompanyNameOriginal: string | undefined,\n public readonly requestedInputAddress: Record<string, string | null> | undefined,\n public readonly checkedAt: Date | undefined,\n public readonly score: number | undefined,\n public readonly scoreSource: string | undefined,\n public readonly scoreAttempts: Array<{ source?: string; score?: number }> | undefined,\n public readonly breakdown: ScoreBreakdown[] | undefined,\n public readonly environment: string | undefined,\n public readonly provider: string | undefined,\n public readonly usedProviders: string[] | undefined,\n public readonly providerVatState: string | undefined,\n public readonly providerNote: string | undefined,\n public readonly providerLastCheckedAt: Date | undefined,\n public readonly providerDocument: ProviderDocument | undefined,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatResource {\n const str = (key: string): string | undefined => {\n const v = data[key];\n return typeof v === 'string' ? v : undefined;\n };\n\n const stateRaw = str('state');\n const state =\n stateRaw !== undefined && Object.values(VatState).includes(stateRaw as VatState)\n ? (stateRaw as VatState)\n : undefined;\n\n const checkedAt = str('checked_at') ? new Date(data['checked_at'] as string) : undefined;\n const providerLastCheckedAt = str('provider_last_checked_at')\n ? new Date(data['provider_last_checked_at'] as string)\n : undefined;\n\n const breakdown = Array.isArray(data['breakdown'])\n ? (data['breakdown'] as Record<string, unknown>[]).map(ScoreBreakdown.fromArray)\n : undefined;\n\n const usedProviders = Array.isArray(data['used_providers'])\n ? (data['used_providers'] as unknown[]).filter((v): v is string => typeof v === 'string')\n : undefined;\n\n const scoreAttempts = Array.isArray(data['score_attempts'])\n ? (data['score_attempts'] as Record<string, unknown>[])\n : undefined;\n\n const requestedInputAddress =\n data['requested_input_address'] !== null &&\n typeof data['requested_input_address'] === 'object' &&\n !Array.isArray(data['requested_input_address'])\n ? (data['requested_input_address'] as Record<string, string | null>)\n : undefined;\n\n return new VatResource(\n str('uuid'),\n str('vat_uid'),\n state,\n str('country_code'),\n str('company_name'),\n CompanyAddress.from(data['company_address']) ?? undefined,\n str('requested_company_name'),\n str('requested_company_name_original'),\n requestedInputAddress,\n checkedAt,\n typeof data['score'] === 'number' ? data['score'] : undefined,\n str('score_source'),\n scoreAttempts,\n breakdown,\n str('environment'),\n str('provider'),\n usedProviders,\n str('provider_vat_state'),\n str('provider_note'),\n providerLastCheckedAt,\n ProviderDocument.fromArray(data['provider_document']) ?? undefined,\n );\n }\n\n getBackendLink(): string | null {\n if (!this.uuid) return null;\n if (this.environment === 'LIVE') {\n return `https://app.taxora.io/vat/history/${this.uuid}`;\n }\n return `https://app.sandbox.taxora.io/vat/history/${this.uuid}`;\n }\n\n toArray(): Record<string, unknown> {\n return {\n uuid: this.uuid,\n vat_uid: this.vatUid,\n state: this.state,\n country_code: this.countryCode,\n company_name: this.companyName,\n company_address: this.companyAddress?.toArray() ?? null,\n requested_company_name: this.requestedCompanyName,\n requested_company_name_original: this.requestedCompanyNameOriginal,\n requested_input_address: this.requestedInputAddress ?? null,\n checked_at: this.checkedAt?.toISOString() ?? null,\n score: this.score ?? null,\n score_source: this.scoreSource ?? null,\n score_attempts: this.scoreAttempts ?? null,\n breakdown: this.breakdown?.map((b) => b.toArray()) ?? null,\n environment: this.environment ?? null,\n provider: this.provider ?? null,\n used_providers: this.usedProviders ?? null,\n provider_vat_state: this.providerVatState ?? null,\n provider_note: this.providerNote ?? null,\n provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,\n provider_document: this.providerDocument?.toArray() ?? null,\n };\n }\n}\n","import { VatResource } from './VatResource.js';\n\nexport class VatCollection implements Iterable<VatResource> {\n private readonly items: VatResource[];\n public readonly self: string | undefined;\n\n constructor(items: VatResource[], self?: string) {\n this.items = items;\n this.self = self;\n }\n\n static fromResponse(data: unknown): VatCollection {\n if (Array.isArray(data)) {\n return new VatCollection((data as Record<string, unknown>[]).map(VatResource.fromArray));\n }\n\n if (typeof data === 'object' && data !== null) {\n const obj = data as Record<string, unknown>;\n const items = Array.isArray(obj['data'])\n ? (obj['data'] as Record<string, unknown>[]).map(VatResource.fromArray)\n : [];\n const self = typeof obj['self'] === 'string' ? obj['self'] : undefined;\n return new VatCollection(items, self);\n }\n\n return new VatCollection([]);\n }\n\n [Symbol.iterator](): Iterator<VatResource> {\n return this.items[Symbol.iterator]();\n }\n\n get length(): number {\n return this.items.length;\n }\n\n all(): VatResource[] {\n return [...this.items];\n }\n}\n","export class VatCertificateExport {\n constructor(\n public readonly exportId: string,\n public readonly message?: string,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatCertificateExport {\n return new VatCertificateExport(\n typeof data['export_id'] === 'string' ? data['export_id'] : '',\n typeof data['message'] === 'string' ? data['message'] : undefined,\n );\n }\n\n toArray(): { export_id: string; message?: string } {\n const result: { export_id: string; message?: string } = { export_id: this.exportId };\n if (this.message !== undefined) result.message = this.message;\n return result;\n }\n}\n","import { TaxoraException } from '../exceptions/TaxoraException.js';\n\ninterface VatValidationAddressInputProps {\n addressLine1?: string;\n addressLine2?: string;\n postalCode?: string;\n city?: string;\n countryCode?: string;\n}\n\nconst ALLOWED_KEYS = new Set(['address_line_1', 'address_line_2', 'postal_code', 'city', 'country_code']);\n\nexport class VatValidationAddressInput {\n public readonly addressLine1?: string;\n public readonly addressLine2?: string;\n public readonly postalCode?: string;\n public readonly city?: string;\n public readonly countryCode?: string;\n\n constructor(props: VatValidationAddressInputProps) {\n if (props.addressLine1 !== undefined && props.addressLine1.length > 255) {\n throw new TaxoraException('addressLine1 must not exceed 255 characters');\n }\n if (props.addressLine2 !== undefined && props.addressLine2.length > 255) {\n throw new TaxoraException('addressLine2 must not exceed 255 characters');\n }\n if (props.countryCode !== undefined && props.countryCode.length !== 2) {\n throw new TaxoraException('countryCode must be exactly 2 characters (ISO 3166-1 alpha-2)');\n }\n\n this.addressLine1 = props.addressLine1;\n this.addressLine2 = props.addressLine2;\n this.postalCode = props.postalCode;\n this.city = props.city;\n this.countryCode = props.countryCode;\n }\n\n static fromArray(data: Record<string, unknown>): VatValidationAddressInput {\n for (const key of Object.keys(data)) {\n if (!ALLOWED_KEYS.has(key)) {\n throw new TaxoraException(`Unsupported field: \"${key}\". Allowed fields: ${[...ALLOWED_KEYS].join(', ')}`);\n }\n }\n\n const getString = (key: string): string | undefined => {\n const val = data[key];\n if (typeof val !== 'string') return undefined;\n const trimmed = val.trim();\n return trimmed || undefined;\n };\n\n const countryCode = getString('country_code');\n\n return new VatValidationAddressInput({\n addressLine1: getString('address_line_1'),\n addressLine2: getString('address_line_2'),\n postalCode: getString('postal_code'),\n city: getString('city'),\n countryCode: countryCode ? countryCode.toUpperCase() : undefined,\n });\n }\n\n toArray(): Record<string, string> {\n const result: Record<string, string> = {};\n if (this.addressLine1 !== undefined) result['address_line_1'] = this.addressLine1;\n if (this.addressLine2 !== undefined) result['address_line_2'] = this.addressLine2;\n if (this.postalCode !== undefined) result['postal_code'] = this.postalCode;\n if (this.city !== undefined) result['city'] = this.city;\n if (this.countryCode !== undefined) result['country_code'] = this.countryCode;\n return result;\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class ValidationException extends TaxoraException {\n public readonly statusCode = 422;\n private readonly errors: Record<string, string[]>;\n\n constructor(message: string, errors: Record<string, string[]>, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'ValidationException';\n this.errors = errors;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getErrors(): Record<string, string[]> {\n return this.errors;\n }\n}\n","import { VatResource } from '../dto/VatResource.js';\nimport { VatCollection } from '../dto/VatCollection.js';\nimport { VatCertificateExport } from '../dto/VatCertificateExport.js';\nimport { VatValidationAddressInput } from '../dto/VatValidationAddressInput.js';\nimport { type Language } from '../enums/Language.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { ValidationException } from '../exceptions/ValidationException.js';\nimport { TaxoraException } from '../exceptions/TaxoraException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport class VatEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async validate(\n vatUid: string,\n companyName?: string,\n provider?: string,\n addressInput?: VatValidationAddressInput | Record<string, string>,\n ): Promise<VatResource> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n if (companyName) body['company_name'] = companyName;\n if (provider) body['source'] = provider;\n\n if (addressInput) {\n body['address_input'] = addressInput instanceof VatValidationAddressInput ? addressInput.toArray() : addressInput;\n }\n\n return this.validateWithGatewayRetry(body, 2);\n }\n\n private async validateWithGatewayRetry(body: Record<string, unknown>, attemptsLeft: number): Promise<VatResource> {\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate`, body);\n\n if (response.status === 504) {\n if (attemptsLeft <= 1) {\n const text = await response.text();\n throw new HttpException('VAT validation timed out after multiple attempts', 504, text);\n }\n return this.validateWithGatewayRetry(body, attemptsLeft - 1);\n }\n\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async validateMultiple(vatUids: string[], companyNames?: string[], provider?: string): Promise<VatCollection> {\n const body: Record<string, unknown> = { vat_uids: vatUids };\n if (companyNames) body['company_names'] = companyNames;\n if (provider) body['source'] = provider;\n\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/multiple`, body);\n const data = await this.parseJsonResponse(response);\n\n return VatCollection.fromResponse(data);\n }\n\n async validateSchema(vatUid: string): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/schema`, body);\n return this.parseJsonResponse(response);\n }\n\n async state(vatUid: string): Promise<VatResource> {\n const response = await this.sendRequest('GET', `${this.baseUrl}/vat/state/${encodeURIComponent(vatUid)}`);\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async history(vatUid?: string): Promise<VatCollection> {\n let url = `${this.baseUrl}/vat/history`;\n if (vatUid) url += `?vat_uid=${encodeURIComponent(vatUid)}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async search(term?: string, perPage?: number): Promise<VatCollection> {\n const params = new URLSearchParams();\n if (term) params.set('term', term);\n if (perPage !== undefined) params.set('per_page', String(perPage));\n\n const queryString = params.toString();\n const url = `${this.baseUrl}/vat/search${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async certificate(uuid: string, lang?: Language): Promise<Uint8Array> {\n let url = `${this.baseUrl}/vat/certificate/${encodeURIComponent(uuid)}`;\n if (lang) url += `?lang=${lang}`;\n\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n async certificatesBulkExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/bulk-export`, fromDate, toDate, countries, lang);\n }\n\n async certificatesListExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/list-export`, fromDate, toDate, countries, lang);\n }\n\n private async exportRequest(\n url: string,\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n const from = this.formatDate(fromDate);\n const to = this.formatDate(toDate);\n\n const body: Record<string, unknown> = { from_date: from, to_date: to };\n if (countries && countries.length > 0) body['countries'] = countries;\n if (lang) body['lang'] = lang;\n\n const response = await this.sendRequest('POST', url, body);\n const data = await this.parseJsonResponse(response, [200, 202]);\n\n const exportObj = VatCertificateExport.fromArray(data);\n if (!exportObj.exportId) {\n throw new TaxoraException('Export response is missing export_id');\n }\n\n return exportObj;\n }\n\n async downloadBulkExport(exportId: string): Promise<Uint8Array> {\n const url = `${this.baseUrl}/vat/certificates/bulk-export/${encodeURIComponent(exportId)}/download`;\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n return headers;\n }\n\n private async sendRequest(method: string, url: string, body?: Record<string, unknown>): Promise<Response> {\n const options: RequestInit = { headers: this.buildHeaders() };\n if (body) options.body = JSON.stringify(body);\n\n return this.httpClient.request(method, url, options);\n }\n\n private async sendBinaryRequest(method: string, url: string): Promise<Response> {\n const headers = this.buildHeaders();\n delete headers['Content-Type'];\n\n const response = await this.httpClient.request(method, url, { headers });\n if (!response.ok) {\n const text = await response.text();\n throw new HttpException(`HTTP error ${response.status}`, response.status, text);\n }\n return response;\n }\n\n private async parseJsonResponse(\n response: Response,\n acceptedStatuses: number[] = [200],\n ): Promise<Record<string, unknown>> {\n const responseText = await response.text();\n\n if (response.status === 422) {\n let errors: Record<string, string[]> = {};\n try {\n const parsed = JSON.parse(responseText) as Record<string, unknown>;\n if (parsed['errors'] !== null && typeof parsed['errors'] === 'object' && !Array.isArray(parsed['errors'])) {\n errors = parsed['errors'] as Record<string, string[]>;\n }\n } catch {\n // ignore parse errors\n }\n throw new ValidationException('Validation failed', errors);\n }\n\n if (!response.ok && !acceptedStatuses.includes(response.status)) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && (typeof obj['data'] === 'object' || Array.isArray(obj['data']))) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n\n private formatDate(date: Date | string): string {\n if (date instanceof Date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n if (!DATE_REGEX.test(date)) {\n throw new TaxoraException(`Invalid date format: \"${date}\". Expected YYYY-MM-DD.`);\n }\n\n return date;\n }\n}\n","export const Environment = {\n SANDBOX: 'sandbox',\n PRODUCTION: 'production',\n} as const;\n\nexport type Environment = (typeof Environment)[keyof typeof Environment];\n\nconst BASE_URLS: Record<Environment, string> = {\n [Environment.SANDBOX]: 'https://sandbox.taxora.io/v1',\n [Environment.PRODUCTION]: 'https://api.taxora.io/v1',\n};\n\nexport function getBaseUrl(environment: Environment): string {\n return BASE_URLS[environment];\n}\n","import { type HttpClientInterface } from './HttpClientInterface.js';\n\nexport class FetchHttpClient implements HttpClientInterface {\n async request(method: string, url: string, options: RequestInit = {}): Promise<Response> {\n return fetch(url, { ...options, method });\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nexport class InMemoryTokenStorage implements TokenStorageInterface {\n private token: Token | null = null;\n\n get(): Token | null {\n return this.token;\n }\n\n set(token: Token): void {\n this.token = token;\n }\n\n clear(): void {\n this.token = null;\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { type HttpClientInterface } from './HttpClientInterface.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nconst AUTH_PATH_PATTERN = /\\/auth\\//;\n\n/**\n * HTTP client wrapper that handles:\n * - Preemptive token refresh when the stored token is expired\n * - Automatic retry with a fresh token on 401 responses\n * - Passthrough for /auth/ routes (no interception)\n */\nexport class AuthRetryHttpClient implements HttpClientInterface {\n constructor(\n private readonly inner: HttpClientInterface,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly refreshFn: () => Promise<Token>,\n ) {}\n\n async request(method: string, url: string, options?: RequestInit): Promise<Response> {\n // Auth routes bypass all retry logic\n if (AUTH_PATH_PATTERN.test(url)) {\n return this.inner.request(method, url, options);\n }\n\n // Preemptive refresh if token is expired\n const currentToken = this.tokenStorage.get();\n if (currentToken?.isExpired()) {\n await this.refreshFn();\n }\n\n // Build request with potentially refreshed token\n const updatedOptions = this.injectAuthHeader(options);\n const response = await this.inner.request(method, url, updatedOptions);\n\n // 401: refresh once and retry\n if (response.status === 401) {\n await this.refreshFn();\n const retryOptions = this.injectAuthHeader(options);\n const retryResponse = await this.inner.request(method, url, retryOptions);\n\n if (retryResponse.status === 401) {\n const body = await retryResponse.text();\n throw new AuthenticationException('Authentication failed after token refresh', { status: 401, body });\n }\n\n return retryResponse;\n }\n\n return response;\n }\n\n private injectAuthHeader(options?: RequestInit): RequestInit {\n const token = this.tokenStorage.get();\n if (!token) return options ?? {};\n\n const existing = options?.headers ?? {};\n const headers = { ...(existing as Record<string, string>), Authorization: `Bearer ${token.accessToken}` };\n return { ...(options ?? {}), headers };\n }\n}\n","import { AuthEndpoint } from '../endpoints/AuthEndpoint.js';\nimport { CompanyEndpoint } from '../endpoints/CompanyEndpoint.js';\nimport { VatEndpoint } from '../endpoints/VatEndpoint.js';\nimport { Environment, getBaseUrl } from '../enums/Environment.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { FetchHttpClient } from '../http/FetchHttpClient.js';\nimport { InMemoryTokenStorage } from '../http/InMemoryTokenStorage.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\nimport { AuthRetryHttpClient } from '../http/AuthRetryHttpClient.js';\n\nexport interface TaxoraClientOptions {\n apiKey: string;\n environment?: Environment;\n tokenStorage?: TokenStorageInterface;\n httpClient?: HttpClientInterface;\n}\n\nexport class TaxoraClient {\n public readonly auth: AuthEndpoint;\n public readonly vat: VatEndpoint;\n public readonly company: CompanyEndpoint;\n public readonly baseUrl: string;\n\n constructor(options: TaxoraClientOptions) {\n const environment = options.environment ?? Environment.SANDBOX;\n const tokenStorage = options.tokenStorage ?? new InMemoryTokenStorage();\n const httpClient = options.httpClient ?? new FetchHttpClient();\n\n this.baseUrl = getBaseUrl(environment);\n\n // Auth endpoint uses the raw HTTP client — no retry interception for auth routes\n this.auth = new AuthEndpoint(this.baseUrl, options.apiKey, tokenStorage, httpClient);\n\n // All other endpoints use the retry-capable client that handles 401 auto-refresh\n const retryClient = new AuthRetryHttpClient(httpClient, tokenStorage, () => this.auth.refresh());\n\n this.vat = new VatEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n this.company = new CompanyEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n }\n}\n","import { TaxoraClient, type TaxoraClientOptions } from './TaxoraClient.js';\n\nexport class TaxoraClientFactory {\n static create(options: TaxoraClientOptions): TaxoraClient {\n return new TaxoraClient(options);\n }\n}\n","export const ApiVersion = {\n V1: 'v1',\n} as const;\n\nexport type ApiVersion = (typeof ApiVersion)[keyof typeof ApiVersion];\n","export const Language = {\n ENGLISH: 'en',\n GERMAN: 'de',\n} as const;\n\nexport type Language = (typeof Language)[keyof typeof Language];\n"],"mappings":"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","names":["parsed"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/endpoints/AuthEndpoint.ts","../src/dto/Token.ts","../src/enums/LoginIdentifier.ts","../src/exceptions/TaxoraException.ts","../src/exceptions/AuthenticationException.ts","../src/exceptions/HttpException.ts","../src/dto/CompanyResource.ts","../src/endpoints/CompanyEndpoint.ts","../src/enums/VatState.ts","../src/dto/CompanyAddress.ts","../src/dto/ScoreBreakdown.ts","../src/dto/ProviderDocumentLine.ts","../src/dto/ProviderDocument.ts","../src/dto/VatResource.ts","../src/dto/VatCollection.ts","../src/dto/VatCertificateExport.ts","../src/dto/VatValidationAddressInput.ts","../src/exceptions/ValidationException.ts","../src/endpoints/VatEndpoint.ts","../src/enums/Environment.ts","../src/http/FetchHttpClient.ts","../src/http/InMemoryTokenStorage.ts","../src/http/AuthRetryHttpClient.ts","../src/client/TaxoraClient.ts","../src/client/TaxoraClientFactory.ts","../src/enums/ApiVersion.ts","../src/enums/Language.ts"],"sourcesContent":["// Client\nexport { TaxoraClient } from './client/TaxoraClient.js';\nexport { TaxoraClientFactory } from './client/TaxoraClientFactory.js';\nexport type { TaxoraClientOptions } from './client/TaxoraClient.js';\n\n// Endpoints\nexport { AuthEndpoint } from './endpoints/AuthEndpoint.js';\nexport { CompanyEndpoint } from './endpoints/CompanyEndpoint.js';\nexport { VatEndpoint } from './endpoints/VatEndpoint.js';\n\n// DTOs\nexport { Token } from './dto/Token.js';\nexport { ScoreBreakdown } from './dto/ScoreBreakdown.js';\nexport { CompanyAddress } from './dto/CompanyAddress.js';\nexport type { CompanyResource } from './dto/CompanyResource.js';\nexport { VatValidationAddressInput } from './dto/VatValidationAddressInput.js';\nexport { ProviderDocumentLine } from './dto/ProviderDocumentLine.js';\nexport { ProviderDocument } from './dto/ProviderDocument.js';\nexport { VatResource } from './dto/VatResource.js';\nexport { VatCollection } from './dto/VatCollection.js';\nexport { VatCertificateExport } from './dto/VatCertificateExport.js';\n\n// Enums\nexport { Environment, getBaseUrl } from './enums/Environment.js';\nexport type { Environment as EnvironmentType } from './enums/Environment.js';\nexport { ApiVersion } from './enums/ApiVersion.js';\nexport { Language } from './enums/Language.js';\nexport { LoginIdentifier } from './enums/LoginIdentifier.js';\nexport { VatState, getFailedVatStates, describeVatState } from './enums/VatState.js';\n\n// Exceptions\nexport { TaxoraException } from './exceptions/TaxoraException.js';\nexport { AuthenticationException } from './exceptions/AuthenticationException.js';\nexport { HttpException } from './exceptions/HttpException.js';\nexport { ValidationException } from './exceptions/ValidationException.js';\n\n// HTTP\nexport type { TokenStorageInterface } from './http/TokenStorageInterface.js';\nexport { InMemoryTokenStorage } from './http/InMemoryTokenStorage.js';\nexport type { HttpClientInterface } from './http/HttpClientInterface.js';\nexport { FetchHttpClient } from './http/FetchHttpClient.js';\nexport { AuthRetryHttpClient } from './http/AuthRetryHttpClient.js';\n","import { hostname } from 'os';\nimport { Token } from '../dto/Token.js';\nimport { LoginIdentifier } from '../enums/LoginIdentifier.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class AuthEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async login(\n identifier: string,\n password: string,\n device?: string,\n loginIdentifier: LoginIdentifier = LoginIdentifier.EMAIL,\n ): Promise<Token> {\n const deviceName = device ?? hostname();\n\n const body: Record<string, string> = {\n identifier: loginIdentifier,\n password,\n device_name: deviceName,\n };\n\n if (loginIdentifier === LoginIdentifier.CLIENT_ID) {\n body['client_id'] = identifier;\n } else {\n body['email'] = identifier;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/login`, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Authentication failed: invalid credentials', {\n status: 401,\n body: responseText,\n });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n async loginWithClientId(clientId: string, password: string, device?: string): Promise<Token> {\n return this.login(clientId, password, device, LoginIdentifier.CLIENT_ID);\n }\n\n async refresh(): Promise<Token> {\n const storedToken = this.tokenStorage.get();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n if (storedToken) {\n headers['Authorization'] = `Bearer ${storedToken.accessToken}`;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/refresh`, { headers });\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Token refresh failed: unauthorized', { status: 401, body: responseText });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n private parseResponse(responseText: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n}\n","export class Token {\n constructor(\n public readonly accessToken: string,\n public readonly tokenType: string,\n public readonly expiresAt: Date,\n ) {}\n\n isExpired(bufferSeconds = 15): boolean {\n return new Date(Date.now() + bufferSeconds * 1000) >= this.expiresAt;\n }\n\n static fromArray(data: Record<string, unknown>): Token {\n let accessToken = String(data['access_token'] ?? '');\n if (accessToken.startsWith('Bearer ')) {\n accessToken = accessToken.slice(7);\n }\n\n const tokenType = String(data['token_type'] ?? 'Bearer');\n const expiresIn = typeof data['expires_in'] === 'number' ? data['expires_in'] : 3600;\n const expiresAt = new Date(Date.now() + expiresIn * 1000);\n\n return new Token(accessToken, tokenType, expiresAt);\n }\n\n toArray(): { access_token: string; token_type: string; expires_at: string } {\n return {\n access_token: this.accessToken,\n token_type: this.tokenType,\n expires_at: this.expiresAt.toISOString(),\n };\n }\n}\n","export const LoginIdentifier = {\n EMAIL: 'email',\n CLIENT_ID: 'client_id',\n} as const;\n\nexport type LoginIdentifier = (typeof LoginIdentifier)[keyof typeof LoginIdentifier];\n","export class TaxoraException extends Error {\n public readonly context: Record<string, unknown>;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message);\n this.name = 'TaxoraException';\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class AuthenticationException extends TaxoraException {\n public readonly statusCode = 401;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'AuthenticationException';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class HttpException extends TaxoraException {\n public readonly statusCode: number;\n public readonly responseBody: string;\n\n constructor(message: string, statusCode: number, responseBody: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'HttpException';\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getStatusCode(): number {\n return this.statusCode;\n }\n\n getResponseBody(): string {\n return this.responseBody;\n }\n}\n","export interface CompanyResource {\n id?: number;\n uuid?: string;\n name?: string;\n vat_uid?: string;\n address_line_1?: string | null;\n address_line_2?: string | null;\n street?: string | null;\n zip_code?: string | null;\n city?: string | null;\n country_code?: string | null;\n email?: string;\n phone_number?: string | null;\n api_rate_limit: number;\n vat_rate_limit: number;\n /**\n * @deprecated Use api_rate_limit and vat_rate_limit instead.\n */\n rate_limit?: number;\n state?: string;\n source?: string;\n [key: string]: unknown;\n}\n\nexport function normalizeCompanyResource(data: Record<string, unknown>): CompanyResource {\n const apiRateLimit = typeof data['api_rate_limit'] === 'number' ? data['api_rate_limit'] : undefined;\n const vatRateLimit = typeof data['vat_rate_limit'] === 'number' ? data['vat_rate_limit'] : undefined;\n const legacyRateLimit = typeof data['rate_limit'] === 'number' ? data['rate_limit'] : undefined;\n\n return {\n ...data,\n api_rate_limit: apiRateLimit ?? legacyRateLimit ?? 0,\n vat_rate_limit: vatRateLimit ?? legacyRateLimit ?? 0,\n };\n}\n","import { HttpException } from '../exceptions/HttpException.js';\nimport { normalizeCompanyResource, type CompanyResource } from '../dto/CompanyResource.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class CompanyEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async get(): Promise<CompanyResource> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n\n const response = await this.httpClient.request('GET', `${this.baseUrl}/company`, { headers });\n const responseText = await response.text();\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return normalizeCompanyResource(obj['data'] as Record<string, unknown>);\n }\n\n return normalizeCompanyResource(obj);\n }\n}\n","export const VatState = {\n VALID: 'valid',\n INVALID: 'invalid',\n FRAUD: 'fraud',\n UNKNOWN: 'unknown',\n} as const;\n\nexport type VatState = (typeof VatState)[keyof typeof VatState];\n\nexport function getFailedVatStates(): VatState[] {\n return [VatState.INVALID, VatState.FRAUD];\n}\n\nconst DESCRIPTIONS: Record<VatState, string> = {\n [VatState.VALID]: 'The VAT number is valid and active.',\n [VatState.INVALID]: 'The VAT number is invalid or not registered.',\n [VatState.FRAUD]: 'The VAT number has been flagged as potentially fraudulent.',\n [VatState.UNKNOWN]: 'The VAT number state could not be determined.',\n};\n\nexport function describeVatState(state: VatState): string {\n return DESCRIPTIONS[state];\n}\n","interface CompanyAddressProps {\n fullAddress?: string | null;\n name?: string | null;\n street?: string | null;\n postalCode?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n raw?: string | null;\n}\n\nexport class CompanyAddress {\n public readonly fullAddress: string | null;\n public readonly name: string | null;\n public readonly street: string | null;\n public readonly postalCode: string | null;\n public readonly city: string | null;\n public readonly state: string | null;\n public readonly country: string | null;\n public readonly raw: string | null;\n\n constructor(props: CompanyAddressProps) {\n this.name = props.name ?? null;\n this.street = props.street ?? null;\n this.postalCode = props.postalCode ?? null;\n this.city = props.city ?? null;\n this.state = props.state ?? null;\n this.country = props.country ?? null;\n this.raw = props.raw ?? null;\n this.fullAddress = props.fullAddress ?? this.assembleFullAddress();\n }\n\n private assembleFullAddress(): string | null {\n const parts = [this.street, this.postalCode, this.city, this.country].filter(Boolean);\n return parts.length > 0 ? parts.join(', ') : null;\n }\n\n static from(value: unknown): CompanyAddress | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return CompanyAddress.fromArray(parsed as Record<string, unknown>, trimmed);\n }\n } catch {\n // Not valid JSON — treat as plain string\n }\n return new CompanyAddress({ raw: trimmed });\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n return CompanyAddress.fromArray(value as Record<string, unknown>, null);\n }\n\n return null;\n }\n\n static fromArray(data: Record<string, unknown>, raw: string | null): CompanyAddress {\n const get = (key: string): string | null => {\n const val = data[key] ?? data[key.replace(/_/g, '-')];\n return typeof val === 'string' && val.trim() ? val.trim() : null;\n };\n\n return new CompanyAddress({\n fullAddress: get('full_address'),\n name: get('name'),\n street: get('street'),\n postalCode: get('postal_code') ?? get('postalCode'),\n city: get('city'),\n state: get('state'),\n country: get('country'),\n raw,\n });\n }\n\n toArray(): Record<string, string | null> {\n return {\n full_address: this.fullAddress,\n name: this.name,\n street: this.street,\n postal_code: this.postalCode,\n city: this.city,\n state: this.state,\n country: this.country,\n };\n }\n\n toString(): string {\n return this.fullAddress ?? this.raw ?? '';\n }\n}\n","export class ScoreBreakdown {\n constructor(\n public readonly stepName: string,\n public readonly scoreContribution: number,\n public readonly metadata: Record<string, unknown>,\n ) {}\n\n static fromArray(data: Record<string, unknown>): ScoreBreakdown {\n return new ScoreBreakdown(\n typeof data['step_name'] === 'string' ? data['step_name'] : '',\n typeof data['score_contribution'] === 'number' ? data['score_contribution'] : 0,\n data['metadata'] !== null && typeof data['metadata'] === 'object' && !Array.isArray(data['metadata'])\n ? (data['metadata'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): { step_name: string; score_contribution: number; metadata: Record<string, unknown> } {\n return {\n step_name: this.stepName,\n score_contribution: this.scoreContribution,\n metadata: this.metadata,\n };\n }\n}\n","export class ProviderDocumentLine {\n constructor(\n public readonly id: number | null,\n public readonly vatUid: string | null,\n public readonly rowNumber: number | null,\n public readonly entryIdentifier: string | null,\n public readonly reference: string | null,\n public readonly meta: Record<string, unknown>,\n ) {}\n\n static fromArray(data: unknown): ProviderDocumentLine | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n return new ProviderDocumentLine(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['vat_uid'] === 'string' ? d['vat_uid'] : null,\n typeof d['row_number'] === 'number' ? d['row_number'] : null,\n typeof d['entry_identifier'] === 'string' ? d['entry_identifier'] : null,\n typeof d['reference'] === 'string' ? d['reference'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n vat_uid: this.vatUid,\n row_number: this.rowNumber,\n entry_identifier: this.entryIdentifier,\n reference: this.reference,\n meta: this.meta,\n };\n }\n}\n","import { ProviderDocumentLine } from './ProviderDocumentLine.js';\n\nexport class ProviderDocument {\n constructor(\n public readonly id: number | null,\n public readonly provider: string | null,\n public readonly documentType: string | null,\n public readonly state: string | null,\n public readonly documentDate: Date | null,\n public readonly mime: string | null,\n public readonly size: number | null,\n public readonly hash: string | null,\n public readonly meta: Record<string, unknown>,\n public readonly line: ProviderDocumentLine | null,\n ) {}\n\n static fromArray(data: unknown): ProviderDocument | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n const documentDate =\n typeof d['document_date'] === 'string' && d['document_date'] ? new Date(d['document_date']) : null;\n\n return new ProviderDocument(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['provider'] === 'string' ? d['provider'] : null,\n typeof d['document_type'] === 'string' ? d['document_type'] : null,\n typeof d['state'] === 'string' ? d['state'] : null,\n documentDate,\n typeof d['mime'] === 'string' ? d['mime'] : null,\n typeof d['size'] === 'number' ? d['size'] : null,\n typeof d['hash'] === 'string' ? d['hash'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n ProviderDocumentLine.fromArray(d['line']),\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n provider: this.provider,\n document_type: this.documentType,\n state: this.state,\n document_date: this.documentDate?.toISOString() ?? null,\n mime: this.mime,\n size: this.size,\n hash: this.hash,\n meta: this.meta,\n line: this.line?.toArray() ?? null,\n };\n }\n}\n","import { VatState } from '../enums/VatState.js';\nimport { CompanyAddress } from './CompanyAddress.js';\nimport { ScoreBreakdown } from './ScoreBreakdown.js';\nimport { ProviderDocument } from './ProviderDocument.js';\n\nexport class VatResource {\n constructor(\n public readonly uuid: string | undefined,\n public readonly vatUid: string | undefined,\n public readonly state: VatState | undefined,\n public readonly countryCode: string | undefined,\n public readonly companyName: string | undefined,\n public readonly companyAddress: CompanyAddress | undefined,\n public readonly requestedCompanyName: string | undefined,\n public readonly requestedCompanyNameOriginal: string | undefined,\n public readonly requestedInputAddress: Record<string, string | null> | undefined,\n public readonly checkedAt: Date | undefined,\n public readonly score: number | undefined,\n public readonly scoreSource: string | undefined,\n public readonly scoreAttempts: Array<{ source?: string; score?: number }> | undefined,\n public readonly breakdown: ScoreBreakdown[] | undefined,\n public readonly environment: string | undefined,\n public readonly provider: string | undefined,\n public readonly usedProviders: string[] | undefined,\n public readonly providerValid: boolean | null | undefined,\n public readonly providerVatState: string | undefined,\n public readonly providerNote: string | undefined,\n public readonly providerLastCheckedAt: Date | undefined,\n public readonly hasApiError: boolean | null | undefined,\n public readonly errorMessage: string | null | undefined,\n public readonly nextApiRecheckAt: string | null | undefined,\n public readonly providerDocument: ProviderDocument | undefined,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatResource {\n const str = (key: string): string | undefined => {\n const v = data[key];\n return typeof v === 'string' ? v : undefined;\n };\n\n const stateRaw = str('state');\n const state =\n stateRaw !== undefined && Object.values(VatState).includes(stateRaw as VatState)\n ? (stateRaw as VatState)\n : undefined;\n\n const checkedAt = str('checked_at') ? new Date(data['checked_at'] as string) : undefined;\n const providerLastCheckedAt = str('provider_last_checked_at')\n ? new Date(data['provider_last_checked_at'] as string)\n : undefined;\n const hasApiError =\n data['has_api_error'] === null\n ? null\n : typeof data['has_api_error'] === 'boolean'\n ? data['has_api_error']\n : undefined;\n const errorMessage =\n data['error_message'] === null\n ? null\n : typeof data['error_message'] === 'string'\n ? data['error_message']\n : undefined;\n const nextApiRecheckAt =\n data['next_api_recheck_at'] === null\n ? null\n : typeof data['next_api_recheck_at'] === 'string'\n ? data['next_api_recheck_at']\n : undefined;\n const providerValid =\n data['provider_valid'] === null\n ? null\n : typeof data['provider_valid'] === 'boolean'\n ? data['provider_valid']\n : undefined;\n\n const breakdown = Array.isArray(data['breakdown'])\n ? (data['breakdown'] as Record<string, unknown>[]).map(ScoreBreakdown.fromArray)\n : undefined;\n\n const usedProviders = Array.isArray(data['used_providers'])\n ? (data['used_providers'] as unknown[]).filter((v): v is string => typeof v === 'string')\n : undefined;\n\n const scoreAttempts = Array.isArray(data['score_attempts'])\n ? (data['score_attempts'] as Record<string, unknown>[])\n : undefined;\n\n const requestedInputAddress =\n data['requested_input_address'] !== null &&\n typeof data['requested_input_address'] === 'object' &&\n !Array.isArray(data['requested_input_address'])\n ? (data['requested_input_address'] as Record<string, string | null>)\n : undefined;\n\n return new VatResource(\n str('uuid'),\n str('vat_uid'),\n state,\n str('country_code'),\n str('company_name'),\n CompanyAddress.from(data['company_address']) ?? undefined,\n str('requested_company_name'),\n str('requested_company_name_original'),\n requestedInputAddress,\n checkedAt,\n typeof data['score'] === 'number' ? data['score'] : undefined,\n str('score_source'),\n scoreAttempts,\n breakdown,\n str('environment'),\n str('provider'),\n usedProviders,\n providerValid,\n str('provider_vat_state'),\n str('provider_note'),\n providerLastCheckedAt,\n hasApiError,\n errorMessage,\n nextApiRecheckAt,\n ProviderDocument.fromArray(data['provider_document']) ?? undefined,\n );\n }\n\n getBackendLink(): string | null {\n if (!this.uuid) return null;\n if (this.environment === 'LIVE') {\n return `https://app.taxora.io/vat/history/${this.uuid}`;\n }\n return `https://app.sandbox.taxora.io/vat/history/${this.uuid}`;\n }\n\n isValid(useProviderState = false): boolean {\n if (useProviderState) {\n return this.isProviderValid();\n }\n\n return this.state === VatState.VALID;\n }\n\n isProviderValid(): boolean {\n if (this.providerValid !== undefined && this.providerValid !== null) {\n return this.providerValid;\n }\n\n return this.providerVatState === VatState.VALID;\n }\n\n toArray(): Record<string, unknown> {\n return {\n uuid: this.uuid,\n vat_uid: this.vatUid,\n state: this.state,\n country_code: this.countryCode,\n company_name: this.companyName,\n company_address: this.companyAddress?.toArray() ?? null,\n requested_company_name: this.requestedCompanyName,\n requested_company_name_original: this.requestedCompanyNameOriginal,\n requested_input_address: this.requestedInputAddress ?? null,\n checked_at: this.checkedAt?.toISOString() ?? null,\n score: this.score ?? null,\n score_source: this.scoreSource ?? null,\n score_attempts: this.scoreAttempts ?? null,\n breakdown: this.breakdown?.map((b) => b.toArray()) ?? null,\n environment: this.environment ?? null,\n provider: this.provider ?? null,\n used_providers: this.usedProviders ?? null,\n provider_valid: this.providerValid ?? null,\n provider_vat_state: this.providerVatState ?? null,\n provider_note: this.providerNote ?? null,\n provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,\n has_api_error: this.hasApiError ?? null,\n error_message: this.errorMessage ?? null,\n next_api_recheck_at: this.nextApiRecheckAt ?? null,\n provider_document: this.providerDocument?.toArray() ?? null,\n };\n }\n}\n","import { VatResource } from './VatResource.js';\n\nexport class VatCollection implements Iterable<VatResource> {\n private readonly items: VatResource[];\n public readonly self: string | undefined;\n\n constructor(items: VatResource[], self?: string) {\n this.items = items;\n this.self = self;\n }\n\n static fromResponse(data: unknown): VatCollection {\n if (Array.isArray(data)) {\n return new VatCollection((data as Record<string, unknown>[]).map(VatResource.fromArray));\n }\n\n if (typeof data === 'object' && data !== null) {\n const obj = data as Record<string, unknown>;\n const items = Array.isArray(obj['data'])\n ? (obj['data'] as Record<string, unknown>[]).map(VatResource.fromArray)\n : [];\n const self = typeof obj['self'] === 'string' ? obj['self'] : undefined;\n return new VatCollection(items, self);\n }\n\n return new VatCollection([]);\n }\n\n [Symbol.iterator](): Iterator<VatResource> {\n return this.items[Symbol.iterator]();\n }\n\n get length(): number {\n return this.items.length;\n }\n\n all(): VatResource[] {\n return [...this.items];\n }\n}\n","export class VatCertificateExport {\n constructor(\n public readonly exportId: string,\n public readonly message?: string,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatCertificateExport {\n return new VatCertificateExport(\n typeof data['export_id'] === 'string' ? data['export_id'] : '',\n typeof data['message'] === 'string' ? data['message'] : undefined,\n );\n }\n\n toArray(): { export_id: string; message?: string } {\n const result: { export_id: string; message?: string } = { export_id: this.exportId };\n if (this.message !== undefined) result.message = this.message;\n return result;\n }\n}\n","import { TaxoraException } from '../exceptions/TaxoraException.js';\n\ninterface VatValidationAddressInputProps {\n addressLine1?: string;\n addressLine2?: string;\n postalCode?: string;\n city?: string;\n countryCode?: string;\n}\n\nconst ALLOWED_KEYS = new Set(['address_line_1', 'address_line_2', 'postal_code', 'city', 'country_code']);\n\nexport class VatValidationAddressInput {\n public readonly addressLine1?: string;\n public readonly addressLine2?: string;\n public readonly postalCode?: string;\n public readonly city?: string;\n public readonly countryCode?: string;\n\n constructor(props: VatValidationAddressInputProps) {\n if (props.addressLine1 !== undefined && props.addressLine1.length > 255) {\n throw new TaxoraException('addressLine1 must not exceed 255 characters');\n }\n if (props.addressLine2 !== undefined && props.addressLine2.length > 255) {\n throw new TaxoraException('addressLine2 must not exceed 255 characters');\n }\n if (props.countryCode !== undefined && props.countryCode.length !== 2) {\n throw new TaxoraException('countryCode must be exactly 2 characters (ISO 3166-1 alpha-2)');\n }\n\n this.addressLine1 = props.addressLine1;\n this.addressLine2 = props.addressLine2;\n this.postalCode = props.postalCode;\n this.city = props.city;\n this.countryCode = props.countryCode;\n }\n\n static fromArray(data: Record<string, unknown>): VatValidationAddressInput {\n for (const key of Object.keys(data)) {\n if (!ALLOWED_KEYS.has(key)) {\n throw new TaxoraException(`Unsupported field: \"${key}\". Allowed fields: ${[...ALLOWED_KEYS].join(', ')}`);\n }\n }\n\n const getString = (key: string): string | undefined => {\n const val = data[key];\n if (typeof val !== 'string') return undefined;\n const trimmed = val.trim();\n return trimmed || undefined;\n };\n\n const countryCode = getString('country_code');\n\n return new VatValidationAddressInput({\n addressLine1: getString('address_line_1'),\n addressLine2: getString('address_line_2'),\n postalCode: getString('postal_code'),\n city: getString('city'),\n countryCode: countryCode ? countryCode.toUpperCase() : undefined,\n });\n }\n\n toArray(): Record<string, string> {\n const result: Record<string, string> = {};\n if (this.addressLine1 !== undefined) result['address_line_1'] = this.addressLine1;\n if (this.addressLine2 !== undefined) result['address_line_2'] = this.addressLine2;\n if (this.postalCode !== undefined) result['postal_code'] = this.postalCode;\n if (this.city !== undefined) result['city'] = this.city;\n if (this.countryCode !== undefined) result['country_code'] = this.countryCode;\n return result;\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class ValidationException extends TaxoraException {\n public readonly statusCode = 422;\n private readonly errors: Record<string, string[]>;\n\n constructor(message: string, errors: Record<string, string[]>, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'ValidationException';\n this.errors = errors;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getErrors(): Record<string, string[]> {\n return this.errors;\n }\n}\n","import { VatResource } from '../dto/VatResource.js';\nimport { VatCollection } from '../dto/VatCollection.js';\nimport { VatCertificateExport } from '../dto/VatCertificateExport.js';\nimport { VatValidationAddressInput } from '../dto/VatValidationAddressInput.js';\nimport { type Language } from '../enums/Language.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { ValidationException } from '../exceptions/ValidationException.js';\nimport { TaxoraException } from '../exceptions/TaxoraException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport class VatEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async validate(\n vatUid: string,\n companyName?: string,\n provider?: string,\n addressInput?: VatValidationAddressInput | Record<string, string>,\n ): Promise<VatResource> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n if (companyName) body['company_name'] = companyName;\n if (provider) body['source'] = provider;\n\n if (addressInput) {\n body['address_input'] = addressInput instanceof VatValidationAddressInput ? addressInput.toArray() : addressInput;\n }\n\n return this.validateWithGatewayRetry(body, 2);\n }\n\n private async validateWithGatewayRetry(body: Record<string, unknown>, attemptsLeft: number): Promise<VatResource> {\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate`, body);\n\n if (response.status === 504) {\n if (attemptsLeft <= 1) {\n const text = await response.text();\n throw new HttpException('VAT validation timed out after multiple attempts', 504, text);\n }\n return this.validateWithGatewayRetry(body, attemptsLeft - 1);\n }\n\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async validateMultiple(vatUids: string[], companyNames?: string[], provider?: string): Promise<VatCollection> {\n const body: Record<string, unknown> = { vat_uids: vatUids };\n if (companyNames) body['company_names'] = companyNames;\n if (provider) body['source'] = provider;\n\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/multiple`, body);\n const data = await this.parseJsonResponse(response);\n\n return VatCollection.fromResponse(data);\n }\n\n async validateSchema(vatUid: string): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/schema`, body);\n return this.parseJsonResponse(response);\n }\n\n async state(vatUid: string): Promise<VatResource> {\n const response = await this.sendRequest('GET', `${this.baseUrl}/vat/state/${encodeURIComponent(vatUid)}`);\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async history(vatUid?: string): Promise<VatCollection> {\n let url = `${this.baseUrl}/vat/history`;\n if (vatUid) url += `?vat_uid=${encodeURIComponent(vatUid)}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async search(term?: string, perPage?: number): Promise<VatCollection> {\n const params = new URLSearchParams();\n if (term) params.set('term', term);\n if (perPage !== undefined) params.set('per_page', String(perPage));\n\n const queryString = params.toString();\n const url = `${this.baseUrl}/vat/search${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async certificate(uuid: string, lang?: Language): Promise<Uint8Array> {\n let url = `${this.baseUrl}/vat/certificate/${encodeURIComponent(uuid)}`;\n if (lang) url += `?lang=${lang}`;\n\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n async certificatesBulkExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/bulk-export`, fromDate, toDate, countries, lang);\n }\n\n async certificatesListExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/list-export`, fromDate, toDate, countries, lang);\n }\n\n private async exportRequest(\n url: string,\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n const from = this.formatDate(fromDate);\n const to = this.formatDate(toDate);\n\n const body: Record<string, unknown> = { from_date: from, to_date: to };\n if (countries && countries.length > 0) body['countries'] = countries;\n if (lang) body['lang'] = lang;\n\n const response = await this.sendRequest('POST', url, body);\n const data = await this.parseJsonResponse(response, [200, 202]);\n\n const exportObj = VatCertificateExport.fromArray(data);\n if (!exportObj.exportId) {\n throw new TaxoraException('Export response is missing export_id');\n }\n\n return exportObj;\n }\n\n async downloadBulkExport(exportId: string): Promise<Uint8Array> {\n const url = `${this.baseUrl}/vat/certificates/bulk-export/${encodeURIComponent(exportId)}/download`;\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n return headers;\n }\n\n private async sendRequest(method: string, url: string, body?: Record<string, unknown>): Promise<Response> {\n const options: RequestInit = { headers: this.buildHeaders() };\n if (body) options.body = JSON.stringify(body);\n\n return this.httpClient.request(method, url, options);\n }\n\n private async sendBinaryRequest(method: string, url: string): Promise<Response> {\n const headers = this.buildHeaders();\n delete headers['Content-Type'];\n\n const response = await this.httpClient.request(method, url, { headers });\n if (!response.ok) {\n const text = await response.text();\n throw new HttpException(`HTTP error ${response.status}`, response.status, text);\n }\n return response;\n }\n\n private async parseJsonResponse(\n response: Response,\n acceptedStatuses: number[] = [200],\n ): Promise<Record<string, unknown>> {\n const responseText = await response.text();\n\n if (response.status === 422) {\n let errors: Record<string, string[]> = {};\n try {\n const parsed = JSON.parse(responseText) as Record<string, unknown>;\n if (parsed['errors'] !== null && typeof parsed['errors'] === 'object' && !Array.isArray(parsed['errors'])) {\n errors = parsed['errors'] as Record<string, string[]>;\n }\n } catch {\n // ignore parse errors\n }\n throw new ValidationException('Validation failed', errors);\n }\n\n if (!response.ok && !acceptedStatuses.includes(response.status)) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && (typeof obj['data'] === 'object' || Array.isArray(obj['data']))) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n\n private formatDate(date: Date | string): string {\n if (date instanceof Date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n if (!DATE_REGEX.test(date)) {\n throw new TaxoraException(`Invalid date format: \"${date}\". Expected YYYY-MM-DD.`);\n }\n\n return date;\n }\n}\n","export const Environment = {\n SANDBOX: 'sandbox',\n PRODUCTION: 'production',\n} as const;\n\nexport type Environment = (typeof Environment)[keyof typeof Environment];\n\nconst BASE_URLS: Record<Environment, string> = {\n [Environment.SANDBOX]: 'https://sandbox.taxora.io/v1',\n [Environment.PRODUCTION]: 'https://api.taxora.io/v1',\n};\n\nexport function getBaseUrl(environment: Environment): string {\n return BASE_URLS[environment];\n}\n","import { type HttpClientInterface } from './HttpClientInterface.js';\n\nexport class FetchHttpClient implements HttpClientInterface {\n async request(method: string, url: string, options: RequestInit = {}): Promise<Response> {\n return fetch(url, { ...options, method });\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nexport class InMemoryTokenStorage implements TokenStorageInterface {\n private token: Token | null = null;\n\n get(): Token | null {\n return this.token;\n }\n\n set(token: Token): void {\n this.token = token;\n }\n\n clear(): void {\n this.token = null;\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { type HttpClientInterface } from './HttpClientInterface.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nconst AUTH_PATH_PATTERN = /\\/auth\\//;\n\n/**\n * HTTP client wrapper that handles:\n * - Preemptive token refresh when the stored token is expired\n * - Automatic retry with a fresh token on 401 responses\n * - Passthrough for /auth/ routes (no interception)\n */\nexport class AuthRetryHttpClient implements HttpClientInterface {\n constructor(\n private readonly inner: HttpClientInterface,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly refreshFn: () => Promise<Token>,\n ) {}\n\n async request(method: string, url: string, options?: RequestInit): Promise<Response> {\n // Auth routes bypass all retry logic\n if (AUTH_PATH_PATTERN.test(url)) {\n return this.inner.request(method, url, options);\n }\n\n // Preemptive refresh if token is expired\n const currentToken = this.tokenStorage.get();\n if (currentToken?.isExpired()) {\n await this.refreshFn();\n }\n\n // Build request with potentially refreshed token\n const updatedOptions = this.injectAuthHeader(options);\n const response = await this.inner.request(method, url, updatedOptions);\n\n // 401: refresh once and retry\n if (response.status === 401) {\n await this.refreshFn();\n const retryOptions = this.injectAuthHeader(options);\n const retryResponse = await this.inner.request(method, url, retryOptions);\n\n if (retryResponse.status === 401) {\n const body = await retryResponse.text();\n throw new AuthenticationException('Authentication failed after token refresh', { status: 401, body });\n }\n\n return retryResponse;\n }\n\n return response;\n }\n\n private injectAuthHeader(options?: RequestInit): RequestInit {\n const token = this.tokenStorage.get();\n if (!token) return options ?? {};\n\n const existing = options?.headers ?? {};\n const headers = { ...(existing as Record<string, string>), Authorization: `Bearer ${token.accessToken}` };\n return { ...(options ?? {}), headers };\n }\n}\n","import { AuthEndpoint } from '../endpoints/AuthEndpoint.js';\nimport { CompanyEndpoint } from '../endpoints/CompanyEndpoint.js';\nimport { VatEndpoint } from '../endpoints/VatEndpoint.js';\nimport { Environment, getBaseUrl } from '../enums/Environment.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { FetchHttpClient } from '../http/FetchHttpClient.js';\nimport { InMemoryTokenStorage } from '../http/InMemoryTokenStorage.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\nimport { AuthRetryHttpClient } from '../http/AuthRetryHttpClient.js';\n\nexport interface TaxoraClientOptions {\n apiKey: string;\n environment?: Environment;\n tokenStorage?: TokenStorageInterface;\n httpClient?: HttpClientInterface;\n}\n\nexport class TaxoraClient {\n public readonly auth: AuthEndpoint;\n public readonly vat: VatEndpoint;\n public readonly company: CompanyEndpoint;\n public readonly baseUrl: string;\n\n constructor(options: TaxoraClientOptions) {\n const environment = options.environment ?? Environment.SANDBOX;\n const tokenStorage = options.tokenStorage ?? new InMemoryTokenStorage();\n const httpClient = options.httpClient ?? new FetchHttpClient();\n\n this.baseUrl = getBaseUrl(environment);\n\n // Auth endpoint uses the raw HTTP client — no retry interception for auth routes\n this.auth = new AuthEndpoint(this.baseUrl, options.apiKey, tokenStorage, httpClient);\n\n // All other endpoints use the retry-capable client that handles 401 auto-refresh\n const retryClient = new AuthRetryHttpClient(httpClient, tokenStorage, () => this.auth.refresh());\n\n this.vat = new VatEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n this.company = new CompanyEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n }\n}\n","import { TaxoraClient, type TaxoraClientOptions } from './TaxoraClient.js';\n\nexport class TaxoraClientFactory {\n static create(options: TaxoraClientOptions): TaxoraClient {\n return new TaxoraClient(options);\n }\n}\n","export const ApiVersion = {\n V1: 'v1',\n} as const;\n\nexport type ApiVersion = (typeof ApiVersion)[keyof typeof ApiVersion];\n","export const Language = {\n ENGLISH: 'en',\n GERMAN: 'de',\n} as const;\n\nexport type Language = (typeof Language)[keyof typeof Language];\n"],"mappings":"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","names":["parsed"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -40,13 +40,37 @@ declare class AuthEndpoint {
|
|
|
40
40
|
private parseResponse;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
interface CompanyResource {
|
|
44
|
+
id?: number;
|
|
45
|
+
uuid?: string;
|
|
46
|
+
name?: string;
|
|
47
|
+
vat_uid?: string;
|
|
48
|
+
address_line_1?: string | null;
|
|
49
|
+
address_line_2?: string | null;
|
|
50
|
+
street?: string | null;
|
|
51
|
+
zip_code?: string | null;
|
|
52
|
+
city?: string | null;
|
|
53
|
+
country_code?: string | null;
|
|
54
|
+
email?: string;
|
|
55
|
+
phone_number?: string | null;
|
|
56
|
+
api_rate_limit: number;
|
|
57
|
+
vat_rate_limit: number;
|
|
58
|
+
/**
|
|
59
|
+
* @deprecated Use api_rate_limit and vat_rate_limit instead.
|
|
60
|
+
*/
|
|
61
|
+
rate_limit?: number;
|
|
62
|
+
state?: string;
|
|
63
|
+
source?: string;
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
}
|
|
66
|
+
|
|
43
67
|
declare class CompanyEndpoint {
|
|
44
68
|
private readonly baseUrl;
|
|
45
69
|
private readonly apiKey;
|
|
46
70
|
private readonly tokenStorage;
|
|
47
71
|
private readonly httpClient;
|
|
48
72
|
constructor(baseUrl: string, apiKey: string, tokenStorage: TokenStorageInterface, httpClient: HttpClientInterface);
|
|
49
|
-
get(): Promise<
|
|
73
|
+
get(): Promise<CompanyResource>;
|
|
50
74
|
}
|
|
51
75
|
|
|
52
76
|
declare const VatState: {
|
|
@@ -148,16 +172,22 @@ declare class VatResource {
|
|
|
148
172
|
readonly environment: string | undefined;
|
|
149
173
|
readonly provider: string | undefined;
|
|
150
174
|
readonly usedProviders: string[] | undefined;
|
|
175
|
+
readonly providerValid: boolean | null | undefined;
|
|
151
176
|
readonly providerVatState: string | undefined;
|
|
152
177
|
readonly providerNote: string | undefined;
|
|
153
178
|
readonly providerLastCheckedAt: Date | undefined;
|
|
179
|
+
readonly hasApiError: boolean | null | undefined;
|
|
180
|
+
readonly errorMessage: string | null | undefined;
|
|
181
|
+
readonly nextApiRecheckAt: string | null | undefined;
|
|
154
182
|
readonly providerDocument: ProviderDocument | undefined;
|
|
155
183
|
constructor(uuid: string | undefined, vatUid: string | undefined, state: VatState | undefined, countryCode: string | undefined, companyName: string | undefined, companyAddress: CompanyAddress | undefined, requestedCompanyName: string | undefined, requestedCompanyNameOriginal: string | undefined, requestedInputAddress: Record<string, string | null> | undefined, checkedAt: Date | undefined, score: number | undefined, scoreSource: string | undefined, scoreAttempts: Array<{
|
|
156
184
|
source?: string;
|
|
157
185
|
score?: number;
|
|
158
|
-
}> | undefined, breakdown: ScoreBreakdown[] | undefined, environment: string | undefined, provider: string | undefined, usedProviders: string[] | undefined, providerVatState: string | undefined, providerNote: string | undefined, providerLastCheckedAt: Date | undefined, providerDocument: ProviderDocument | undefined);
|
|
186
|
+
}> | undefined, breakdown: ScoreBreakdown[] | undefined, environment: string | undefined, provider: string | undefined, usedProviders: string[] | undefined, providerValid: boolean | null | undefined, providerVatState: string | undefined, providerNote: string | undefined, providerLastCheckedAt: Date | undefined, hasApiError: boolean | null | undefined, errorMessage: string | null | undefined, nextApiRecheckAt: string | null | undefined, providerDocument: ProviderDocument | undefined);
|
|
159
187
|
static fromArray(data: Record<string, unknown>): VatResource;
|
|
160
188
|
getBackendLink(): string | null;
|
|
189
|
+
isValid(useProviderState?: boolean): boolean;
|
|
190
|
+
isProviderValid(): boolean;
|
|
161
191
|
toArray(): Record<string, unknown>;
|
|
162
192
|
}
|
|
163
193
|
|
|
@@ -312,4 +342,4 @@ declare class AuthRetryHttpClient implements HttpClientInterface {
|
|
|
312
342
|
private injectAuthHeader;
|
|
313
343
|
}
|
|
314
344
|
|
|
315
|
-
export { ApiVersion, AuthEndpoint, AuthRetryHttpClient, AuthenticationException, CompanyAddress, CompanyEndpoint, Environment, Environment as EnvironmentType, FetchHttpClient, type HttpClientInterface, HttpException, InMemoryTokenStorage, Language, LoginIdentifier, ProviderDocument, ProviderDocumentLine, ScoreBreakdown, TaxoraClient, TaxoraClientFactory, type TaxoraClientOptions, TaxoraException, Token, type TokenStorageInterface, ValidationException, VatCertificateExport, VatCollection, VatEndpoint, VatResource, VatState, VatValidationAddressInput, describeVatState, getBaseUrl, getFailedVatStates };
|
|
345
|
+
export { ApiVersion, AuthEndpoint, AuthRetryHttpClient, AuthenticationException, CompanyAddress, CompanyEndpoint, type CompanyResource, Environment, Environment as EnvironmentType, FetchHttpClient, type HttpClientInterface, HttpException, InMemoryTokenStorage, Language, LoginIdentifier, ProviderDocument, ProviderDocumentLine, ScoreBreakdown, TaxoraClient, TaxoraClientFactory, type TaxoraClientOptions, TaxoraException, Token, type TokenStorageInterface, ValidationException, VatCertificateExport, VatCollection, VatEndpoint, VatResource, VatState, VatValidationAddressInput, describeVatState, getBaseUrl, getFailedVatStates };
|
package/dist/index.d.ts
CHANGED
|
@@ -40,13 +40,37 @@ declare class AuthEndpoint {
|
|
|
40
40
|
private parseResponse;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
interface CompanyResource {
|
|
44
|
+
id?: number;
|
|
45
|
+
uuid?: string;
|
|
46
|
+
name?: string;
|
|
47
|
+
vat_uid?: string;
|
|
48
|
+
address_line_1?: string | null;
|
|
49
|
+
address_line_2?: string | null;
|
|
50
|
+
street?: string | null;
|
|
51
|
+
zip_code?: string | null;
|
|
52
|
+
city?: string | null;
|
|
53
|
+
country_code?: string | null;
|
|
54
|
+
email?: string;
|
|
55
|
+
phone_number?: string | null;
|
|
56
|
+
api_rate_limit: number;
|
|
57
|
+
vat_rate_limit: number;
|
|
58
|
+
/**
|
|
59
|
+
* @deprecated Use api_rate_limit and vat_rate_limit instead.
|
|
60
|
+
*/
|
|
61
|
+
rate_limit?: number;
|
|
62
|
+
state?: string;
|
|
63
|
+
source?: string;
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
}
|
|
66
|
+
|
|
43
67
|
declare class CompanyEndpoint {
|
|
44
68
|
private readonly baseUrl;
|
|
45
69
|
private readonly apiKey;
|
|
46
70
|
private readonly tokenStorage;
|
|
47
71
|
private readonly httpClient;
|
|
48
72
|
constructor(baseUrl: string, apiKey: string, tokenStorage: TokenStorageInterface, httpClient: HttpClientInterface);
|
|
49
|
-
get(): Promise<
|
|
73
|
+
get(): Promise<CompanyResource>;
|
|
50
74
|
}
|
|
51
75
|
|
|
52
76
|
declare const VatState: {
|
|
@@ -148,16 +172,22 @@ declare class VatResource {
|
|
|
148
172
|
readonly environment: string | undefined;
|
|
149
173
|
readonly provider: string | undefined;
|
|
150
174
|
readonly usedProviders: string[] | undefined;
|
|
175
|
+
readonly providerValid: boolean | null | undefined;
|
|
151
176
|
readonly providerVatState: string | undefined;
|
|
152
177
|
readonly providerNote: string | undefined;
|
|
153
178
|
readonly providerLastCheckedAt: Date | undefined;
|
|
179
|
+
readonly hasApiError: boolean | null | undefined;
|
|
180
|
+
readonly errorMessage: string | null | undefined;
|
|
181
|
+
readonly nextApiRecheckAt: string | null | undefined;
|
|
154
182
|
readonly providerDocument: ProviderDocument | undefined;
|
|
155
183
|
constructor(uuid: string | undefined, vatUid: string | undefined, state: VatState | undefined, countryCode: string | undefined, companyName: string | undefined, companyAddress: CompanyAddress | undefined, requestedCompanyName: string | undefined, requestedCompanyNameOriginal: string | undefined, requestedInputAddress: Record<string, string | null> | undefined, checkedAt: Date | undefined, score: number | undefined, scoreSource: string | undefined, scoreAttempts: Array<{
|
|
156
184
|
source?: string;
|
|
157
185
|
score?: number;
|
|
158
|
-
}> | undefined, breakdown: ScoreBreakdown[] | undefined, environment: string | undefined, provider: string | undefined, usedProviders: string[] | undefined, providerVatState: string | undefined, providerNote: string | undefined, providerLastCheckedAt: Date | undefined, providerDocument: ProviderDocument | undefined);
|
|
186
|
+
}> | undefined, breakdown: ScoreBreakdown[] | undefined, environment: string | undefined, provider: string | undefined, usedProviders: string[] | undefined, providerValid: boolean | null | undefined, providerVatState: string | undefined, providerNote: string | undefined, providerLastCheckedAt: Date | undefined, hasApiError: boolean | null | undefined, errorMessage: string | null | undefined, nextApiRecheckAt: string | null | undefined, providerDocument: ProviderDocument | undefined);
|
|
159
187
|
static fromArray(data: Record<string, unknown>): VatResource;
|
|
160
188
|
getBackendLink(): string | null;
|
|
189
|
+
isValid(useProviderState?: boolean): boolean;
|
|
190
|
+
isProviderValid(): boolean;
|
|
161
191
|
toArray(): Record<string, unknown>;
|
|
162
192
|
}
|
|
163
193
|
|
|
@@ -312,4 +342,4 @@ declare class AuthRetryHttpClient implements HttpClientInterface {
|
|
|
312
342
|
private injectAuthHeader;
|
|
313
343
|
}
|
|
314
344
|
|
|
315
|
-
export { ApiVersion, AuthEndpoint, AuthRetryHttpClient, AuthenticationException, CompanyAddress, CompanyEndpoint, Environment, Environment as EnvironmentType, FetchHttpClient, type HttpClientInterface, HttpException, InMemoryTokenStorage, Language, LoginIdentifier, ProviderDocument, ProviderDocumentLine, ScoreBreakdown, TaxoraClient, TaxoraClientFactory, type TaxoraClientOptions, TaxoraException, Token, type TokenStorageInterface, ValidationException, VatCertificateExport, VatCollection, VatEndpoint, VatResource, VatState, VatValidationAddressInput, describeVatState, getBaseUrl, getFailedVatStates };
|
|
345
|
+
export { ApiVersion, AuthEndpoint, AuthRetryHttpClient, AuthenticationException, CompanyAddress, CompanyEndpoint, type CompanyResource, Environment, Environment as EnvironmentType, FetchHttpClient, type HttpClientInterface, HttpException, InMemoryTokenStorage, Language, LoginIdentifier, ProviderDocument, ProviderDocumentLine, ScoreBreakdown, TaxoraClient, TaxoraClientFactory, type TaxoraClientOptions, TaxoraException, Token, type TokenStorageInterface, ValidationException, VatCertificateExport, VatCollection, VatEndpoint, VatResource, VatState, VatValidationAddressInput, describeVatState, getBaseUrl, getFailedVatStates };
|
package/dist/index.js
CHANGED
|
@@ -168,6 +168,18 @@ var AuthEndpoint = class {
|
|
|
168
168
|
}
|
|
169
169
|
};
|
|
170
170
|
|
|
171
|
+
// src/dto/CompanyResource.ts
|
|
172
|
+
function normalizeCompanyResource(data) {
|
|
173
|
+
const apiRateLimit = typeof data["api_rate_limit"] === "number" ? data["api_rate_limit"] : void 0;
|
|
174
|
+
const vatRateLimit = typeof data["vat_rate_limit"] === "number" ? data["vat_rate_limit"] : void 0;
|
|
175
|
+
const legacyRateLimit = typeof data["rate_limit"] === "number" ? data["rate_limit"] : void 0;
|
|
176
|
+
return {
|
|
177
|
+
...data,
|
|
178
|
+
api_rate_limit: apiRateLimit ?? legacyRateLimit ?? 0,
|
|
179
|
+
vat_rate_limit: vatRateLimit ?? legacyRateLimit ?? 0
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
171
183
|
// src/endpoints/CompanyEndpoint.ts
|
|
172
184
|
var CompanyEndpoint = class {
|
|
173
185
|
constructor(baseUrl, apiKey, tokenStorage, httpClient) {
|
|
@@ -205,9 +217,9 @@ var CompanyEndpoint = class {
|
|
|
205
217
|
}
|
|
206
218
|
const obj = parsed;
|
|
207
219
|
if (obj["data"] !== void 0 && typeof obj["data"] === "object" && obj["data"] !== null) {
|
|
208
|
-
return obj["data"];
|
|
220
|
+
return normalizeCompanyResource(obj["data"]);
|
|
209
221
|
}
|
|
210
|
-
return obj;
|
|
222
|
+
return normalizeCompanyResource(obj);
|
|
211
223
|
}
|
|
212
224
|
};
|
|
213
225
|
|
|
@@ -435,7 +447,7 @@ var ProviderDocument = class _ProviderDocument {
|
|
|
435
447
|
|
|
436
448
|
// src/dto/VatResource.ts
|
|
437
449
|
var VatResource = class _VatResource {
|
|
438
|
-
constructor(uuid, vatUid, state, countryCode, companyName, companyAddress, requestedCompanyName, requestedCompanyNameOriginal, requestedInputAddress, checkedAt, score, scoreSource, scoreAttempts, breakdown, environment, provider, usedProviders, providerVatState, providerNote, providerLastCheckedAt, providerDocument) {
|
|
450
|
+
constructor(uuid, vatUid, state, countryCode, companyName, companyAddress, requestedCompanyName, requestedCompanyNameOriginal, requestedInputAddress, checkedAt, score, scoreSource, scoreAttempts, breakdown, environment, provider, usedProviders, providerValid, providerVatState, providerNote, providerLastCheckedAt, hasApiError, errorMessage, nextApiRecheckAt, providerDocument) {
|
|
439
451
|
this.uuid = uuid;
|
|
440
452
|
this.vatUid = vatUid;
|
|
441
453
|
this.state = state;
|
|
@@ -453,9 +465,13 @@ var VatResource = class _VatResource {
|
|
|
453
465
|
this.environment = environment;
|
|
454
466
|
this.provider = provider;
|
|
455
467
|
this.usedProviders = usedProviders;
|
|
468
|
+
this.providerValid = providerValid;
|
|
456
469
|
this.providerVatState = providerVatState;
|
|
457
470
|
this.providerNote = providerNote;
|
|
458
471
|
this.providerLastCheckedAt = providerLastCheckedAt;
|
|
472
|
+
this.hasApiError = hasApiError;
|
|
473
|
+
this.errorMessage = errorMessage;
|
|
474
|
+
this.nextApiRecheckAt = nextApiRecheckAt;
|
|
459
475
|
this.providerDocument = providerDocument;
|
|
460
476
|
}
|
|
461
477
|
uuid;
|
|
@@ -475,9 +491,13 @@ var VatResource = class _VatResource {
|
|
|
475
491
|
environment;
|
|
476
492
|
provider;
|
|
477
493
|
usedProviders;
|
|
494
|
+
providerValid;
|
|
478
495
|
providerVatState;
|
|
479
496
|
providerNote;
|
|
480
497
|
providerLastCheckedAt;
|
|
498
|
+
hasApiError;
|
|
499
|
+
errorMessage;
|
|
500
|
+
nextApiRecheckAt;
|
|
481
501
|
providerDocument;
|
|
482
502
|
static fromArray(data) {
|
|
483
503
|
const str = (key) => {
|
|
@@ -488,6 +508,10 @@ var VatResource = class _VatResource {
|
|
|
488
508
|
const state = stateRaw !== void 0 && Object.values(VatState).includes(stateRaw) ? stateRaw : void 0;
|
|
489
509
|
const checkedAt = str("checked_at") ? new Date(data["checked_at"]) : void 0;
|
|
490
510
|
const providerLastCheckedAt = str("provider_last_checked_at") ? new Date(data["provider_last_checked_at"]) : void 0;
|
|
511
|
+
const hasApiError = data["has_api_error"] === null ? null : typeof data["has_api_error"] === "boolean" ? data["has_api_error"] : void 0;
|
|
512
|
+
const errorMessage = data["error_message"] === null ? null : typeof data["error_message"] === "string" ? data["error_message"] : void 0;
|
|
513
|
+
const nextApiRecheckAt = data["next_api_recheck_at"] === null ? null : typeof data["next_api_recheck_at"] === "string" ? data["next_api_recheck_at"] : void 0;
|
|
514
|
+
const providerValid = data["provider_valid"] === null ? null : typeof data["provider_valid"] === "boolean" ? data["provider_valid"] : void 0;
|
|
491
515
|
const breakdown = Array.isArray(data["breakdown"]) ? data["breakdown"].map(ScoreBreakdown.fromArray) : void 0;
|
|
492
516
|
const usedProviders = Array.isArray(data["used_providers"]) ? data["used_providers"].filter((v) => typeof v === "string") : void 0;
|
|
493
517
|
const scoreAttempts = Array.isArray(data["score_attempts"]) ? data["score_attempts"] : void 0;
|
|
@@ -510,9 +534,13 @@ var VatResource = class _VatResource {
|
|
|
510
534
|
str("environment"),
|
|
511
535
|
str("provider"),
|
|
512
536
|
usedProviders,
|
|
537
|
+
providerValid,
|
|
513
538
|
str("provider_vat_state"),
|
|
514
539
|
str("provider_note"),
|
|
515
540
|
providerLastCheckedAt,
|
|
541
|
+
hasApiError,
|
|
542
|
+
errorMessage,
|
|
543
|
+
nextApiRecheckAt,
|
|
516
544
|
ProviderDocument.fromArray(data["provider_document"]) ?? void 0
|
|
517
545
|
);
|
|
518
546
|
}
|
|
@@ -523,6 +551,18 @@ var VatResource = class _VatResource {
|
|
|
523
551
|
}
|
|
524
552
|
return `https://app.sandbox.taxora.io/vat/history/${this.uuid}`;
|
|
525
553
|
}
|
|
554
|
+
isValid(useProviderState = false) {
|
|
555
|
+
if (useProviderState) {
|
|
556
|
+
return this.isProviderValid();
|
|
557
|
+
}
|
|
558
|
+
return this.state === VatState.VALID;
|
|
559
|
+
}
|
|
560
|
+
isProviderValid() {
|
|
561
|
+
if (this.providerValid !== void 0 && this.providerValid !== null) {
|
|
562
|
+
return this.providerValid;
|
|
563
|
+
}
|
|
564
|
+
return this.providerVatState === VatState.VALID;
|
|
565
|
+
}
|
|
526
566
|
toArray() {
|
|
527
567
|
return {
|
|
528
568
|
uuid: this.uuid,
|
|
@@ -542,9 +582,13 @@ var VatResource = class _VatResource {
|
|
|
542
582
|
environment: this.environment ?? null,
|
|
543
583
|
provider: this.provider ?? null,
|
|
544
584
|
used_providers: this.usedProviders ?? null,
|
|
585
|
+
provider_valid: this.providerValid ?? null,
|
|
545
586
|
provider_vat_state: this.providerVatState ?? null,
|
|
546
587
|
provider_note: this.providerNote ?? null,
|
|
547
588
|
provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,
|
|
589
|
+
has_api_error: this.hasApiError ?? null,
|
|
590
|
+
error_message: this.errorMessage ?? null,
|
|
591
|
+
next_api_recheck_at: this.nextApiRecheckAt ?? null,
|
|
548
592
|
provider_document: this.providerDocument?.toArray() ?? null
|
|
549
593
|
};
|
|
550
594
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/endpoints/AuthEndpoint.ts","../src/dto/Token.ts","../src/enums/LoginIdentifier.ts","../src/exceptions/TaxoraException.ts","../src/exceptions/AuthenticationException.ts","../src/exceptions/HttpException.ts","../src/endpoints/CompanyEndpoint.ts","../src/enums/VatState.ts","../src/dto/CompanyAddress.ts","../src/dto/ScoreBreakdown.ts","../src/dto/ProviderDocumentLine.ts","../src/dto/ProviderDocument.ts","../src/dto/VatResource.ts","../src/dto/VatCollection.ts","../src/dto/VatCertificateExport.ts","../src/dto/VatValidationAddressInput.ts","../src/exceptions/ValidationException.ts","../src/endpoints/VatEndpoint.ts","../src/enums/Environment.ts","../src/http/FetchHttpClient.ts","../src/http/InMemoryTokenStorage.ts","../src/http/AuthRetryHttpClient.ts","../src/client/TaxoraClient.ts","../src/client/TaxoraClientFactory.ts","../src/enums/ApiVersion.ts","../src/enums/Language.ts"],"sourcesContent":["import { hostname } from 'os';\nimport { Token } from '../dto/Token.js';\nimport { LoginIdentifier } from '../enums/LoginIdentifier.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class AuthEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async login(\n identifier: string,\n password: string,\n device?: string,\n loginIdentifier: LoginIdentifier = LoginIdentifier.EMAIL,\n ): Promise<Token> {\n const deviceName = device ?? hostname();\n\n const body: Record<string, string> = {\n identifier: loginIdentifier,\n password,\n device_name: deviceName,\n };\n\n if (loginIdentifier === LoginIdentifier.CLIENT_ID) {\n body['client_id'] = identifier;\n } else {\n body['email'] = identifier;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/login`, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Authentication failed: invalid credentials', {\n status: 401,\n body: responseText,\n });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n async loginWithClientId(clientId: string, password: string, device?: string): Promise<Token> {\n return this.login(clientId, password, device, LoginIdentifier.CLIENT_ID);\n }\n\n async refresh(): Promise<Token> {\n const storedToken = this.tokenStorage.get();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n if (storedToken) {\n headers['Authorization'] = `Bearer ${storedToken.accessToken}`;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/refresh`, { headers });\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Token refresh failed: unauthorized', { status: 401, body: responseText });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n private parseResponse(responseText: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n}\n","export class Token {\n constructor(\n public readonly accessToken: string,\n public readonly tokenType: string,\n public readonly expiresAt: Date,\n ) {}\n\n isExpired(bufferSeconds = 15): boolean {\n return new Date(Date.now() + bufferSeconds * 1000) >= this.expiresAt;\n }\n\n static fromArray(data: Record<string, unknown>): Token {\n let accessToken = String(data['access_token'] ?? '');\n if (accessToken.startsWith('Bearer ')) {\n accessToken = accessToken.slice(7);\n }\n\n const tokenType = String(data['token_type'] ?? 'Bearer');\n const expiresIn = typeof data['expires_in'] === 'number' ? data['expires_in'] : 3600;\n const expiresAt = new Date(Date.now() + expiresIn * 1000);\n\n return new Token(accessToken, tokenType, expiresAt);\n }\n\n toArray(): { access_token: string; token_type: string; expires_at: string } {\n return {\n access_token: this.accessToken,\n token_type: this.tokenType,\n expires_at: this.expiresAt.toISOString(),\n };\n }\n}\n","export const LoginIdentifier = {\n EMAIL: 'email',\n CLIENT_ID: 'client_id',\n} as const;\n\nexport type LoginIdentifier = (typeof LoginIdentifier)[keyof typeof LoginIdentifier];\n","export class TaxoraException extends Error {\n public readonly context: Record<string, unknown>;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message);\n this.name = 'TaxoraException';\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class AuthenticationException extends TaxoraException {\n public readonly statusCode = 401;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'AuthenticationException';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class HttpException extends TaxoraException {\n public readonly statusCode: number;\n public readonly responseBody: string;\n\n constructor(message: string, statusCode: number, responseBody: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'HttpException';\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getStatusCode(): number {\n return this.statusCode;\n }\n\n getResponseBody(): string {\n return this.responseBody;\n }\n}\n","import { HttpException } from '../exceptions/HttpException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class CompanyEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async get(): Promise<Record<string, unknown>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n\n const response = await this.httpClient.request('GET', `${this.baseUrl}/company`, { headers });\n const responseText = await response.text();\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n}\n","export const VatState = {\n VALID: 'valid',\n INVALID: 'invalid',\n FRAUD: 'fraud',\n UNKNOWN: 'unknown',\n} as const;\n\nexport type VatState = (typeof VatState)[keyof typeof VatState];\n\nexport function getFailedVatStates(): VatState[] {\n return [VatState.INVALID, VatState.FRAUD];\n}\n\nconst DESCRIPTIONS: Record<VatState, string> = {\n [VatState.VALID]: 'The VAT number is valid and active.',\n [VatState.INVALID]: 'The VAT number is invalid or not registered.',\n [VatState.FRAUD]: 'The VAT number has been flagged as potentially fraudulent.',\n [VatState.UNKNOWN]: 'The VAT number state could not be determined.',\n};\n\nexport function describeVatState(state: VatState): string {\n return DESCRIPTIONS[state];\n}\n","interface CompanyAddressProps {\n fullAddress?: string | null;\n name?: string | null;\n street?: string | null;\n postalCode?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n raw?: string | null;\n}\n\nexport class CompanyAddress {\n public readonly fullAddress: string | null;\n public readonly name: string | null;\n public readonly street: string | null;\n public readonly postalCode: string | null;\n public readonly city: string | null;\n public readonly state: string | null;\n public readonly country: string | null;\n public readonly raw: string | null;\n\n constructor(props: CompanyAddressProps) {\n this.name = props.name ?? null;\n this.street = props.street ?? null;\n this.postalCode = props.postalCode ?? null;\n this.city = props.city ?? null;\n this.state = props.state ?? null;\n this.country = props.country ?? null;\n this.raw = props.raw ?? null;\n this.fullAddress = props.fullAddress ?? this.assembleFullAddress();\n }\n\n private assembleFullAddress(): string | null {\n const parts = [this.street, this.postalCode, this.city, this.country].filter(Boolean);\n return parts.length > 0 ? parts.join(', ') : null;\n }\n\n static from(value: unknown): CompanyAddress | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return CompanyAddress.fromArray(parsed as Record<string, unknown>, trimmed);\n }\n } catch {\n // Not valid JSON — treat as plain string\n }\n return new CompanyAddress({ raw: trimmed });\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n return CompanyAddress.fromArray(value as Record<string, unknown>, null);\n }\n\n return null;\n }\n\n static fromArray(data: Record<string, unknown>, raw: string | null): CompanyAddress {\n const get = (key: string): string | null => {\n const val = data[key] ?? data[key.replace(/_/g, '-')];\n return typeof val === 'string' && val.trim() ? val.trim() : null;\n };\n\n return new CompanyAddress({\n fullAddress: get('full_address'),\n name: get('name'),\n street: get('street'),\n postalCode: get('postal_code') ?? get('postalCode'),\n city: get('city'),\n state: get('state'),\n country: get('country'),\n raw,\n });\n }\n\n toArray(): Record<string, string | null> {\n return {\n full_address: this.fullAddress,\n name: this.name,\n street: this.street,\n postal_code: this.postalCode,\n city: this.city,\n state: this.state,\n country: this.country,\n };\n }\n\n toString(): string {\n return this.fullAddress ?? this.raw ?? '';\n }\n}\n","export class ScoreBreakdown {\n constructor(\n public readonly stepName: string,\n public readonly scoreContribution: number,\n public readonly metadata: Record<string, unknown>,\n ) {}\n\n static fromArray(data: Record<string, unknown>): ScoreBreakdown {\n return new ScoreBreakdown(\n typeof data['step_name'] === 'string' ? data['step_name'] : '',\n typeof data['score_contribution'] === 'number' ? data['score_contribution'] : 0,\n data['metadata'] !== null && typeof data['metadata'] === 'object' && !Array.isArray(data['metadata'])\n ? (data['metadata'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): { step_name: string; score_contribution: number; metadata: Record<string, unknown> } {\n return {\n step_name: this.stepName,\n score_contribution: this.scoreContribution,\n metadata: this.metadata,\n };\n }\n}\n","export class ProviderDocumentLine {\n constructor(\n public readonly id: number | null,\n public readonly vatUid: string | null,\n public readonly rowNumber: number | null,\n public readonly entryIdentifier: string | null,\n public readonly reference: string | null,\n public readonly meta: Record<string, unknown>,\n ) {}\n\n static fromArray(data: unknown): ProviderDocumentLine | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n return new ProviderDocumentLine(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['vat_uid'] === 'string' ? d['vat_uid'] : null,\n typeof d['row_number'] === 'number' ? d['row_number'] : null,\n typeof d['entry_identifier'] === 'string' ? d['entry_identifier'] : null,\n typeof d['reference'] === 'string' ? d['reference'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n vat_uid: this.vatUid,\n row_number: this.rowNumber,\n entry_identifier: this.entryIdentifier,\n reference: this.reference,\n meta: this.meta,\n };\n }\n}\n","import { ProviderDocumentLine } from './ProviderDocumentLine.js';\n\nexport class ProviderDocument {\n constructor(\n public readonly id: number | null,\n public readonly provider: string | null,\n public readonly documentType: string | null,\n public readonly state: string | null,\n public readonly documentDate: Date | null,\n public readonly mime: string | null,\n public readonly size: number | null,\n public readonly hash: string | null,\n public readonly meta: Record<string, unknown>,\n public readonly line: ProviderDocumentLine | null,\n ) {}\n\n static fromArray(data: unknown): ProviderDocument | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n const documentDate =\n typeof d['document_date'] === 'string' && d['document_date'] ? new Date(d['document_date']) : null;\n\n return new ProviderDocument(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['provider'] === 'string' ? d['provider'] : null,\n typeof d['document_type'] === 'string' ? d['document_type'] : null,\n typeof d['state'] === 'string' ? d['state'] : null,\n documentDate,\n typeof d['mime'] === 'string' ? d['mime'] : null,\n typeof d['size'] === 'number' ? d['size'] : null,\n typeof d['hash'] === 'string' ? d['hash'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n ProviderDocumentLine.fromArray(d['line']),\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n provider: this.provider,\n document_type: this.documentType,\n state: this.state,\n document_date: this.documentDate?.toISOString() ?? null,\n mime: this.mime,\n size: this.size,\n hash: this.hash,\n meta: this.meta,\n line: this.line?.toArray() ?? null,\n };\n }\n}\n","import { VatState } from '../enums/VatState.js';\nimport { CompanyAddress } from './CompanyAddress.js';\nimport { ScoreBreakdown } from './ScoreBreakdown.js';\nimport { ProviderDocument } from './ProviderDocument.js';\n\nexport class VatResource {\n constructor(\n public readonly uuid: string | undefined,\n public readonly vatUid: string | undefined,\n public readonly state: VatState | undefined,\n public readonly countryCode: string | undefined,\n public readonly companyName: string | undefined,\n public readonly companyAddress: CompanyAddress | undefined,\n public readonly requestedCompanyName: string | undefined,\n public readonly requestedCompanyNameOriginal: string | undefined,\n public readonly requestedInputAddress: Record<string, string | null> | undefined,\n public readonly checkedAt: Date | undefined,\n public readonly score: number | undefined,\n public readonly scoreSource: string | undefined,\n public readonly scoreAttempts: Array<{ source?: string; score?: number }> | undefined,\n public readonly breakdown: ScoreBreakdown[] | undefined,\n public readonly environment: string | undefined,\n public readonly provider: string | undefined,\n public readonly usedProviders: string[] | undefined,\n public readonly providerVatState: string | undefined,\n public readonly providerNote: string | undefined,\n public readonly providerLastCheckedAt: Date | undefined,\n public readonly providerDocument: ProviderDocument | undefined,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatResource {\n const str = (key: string): string | undefined => {\n const v = data[key];\n return typeof v === 'string' ? v : undefined;\n };\n\n const stateRaw = str('state');\n const state =\n stateRaw !== undefined && Object.values(VatState).includes(stateRaw as VatState)\n ? (stateRaw as VatState)\n : undefined;\n\n const checkedAt = str('checked_at') ? new Date(data['checked_at'] as string) : undefined;\n const providerLastCheckedAt = str('provider_last_checked_at')\n ? new Date(data['provider_last_checked_at'] as string)\n : undefined;\n\n const breakdown = Array.isArray(data['breakdown'])\n ? (data['breakdown'] as Record<string, unknown>[]).map(ScoreBreakdown.fromArray)\n : undefined;\n\n const usedProviders = Array.isArray(data['used_providers'])\n ? (data['used_providers'] as unknown[]).filter((v): v is string => typeof v === 'string')\n : undefined;\n\n const scoreAttempts = Array.isArray(data['score_attempts'])\n ? (data['score_attempts'] as Record<string, unknown>[])\n : undefined;\n\n const requestedInputAddress =\n data['requested_input_address'] !== null &&\n typeof data['requested_input_address'] === 'object' &&\n !Array.isArray(data['requested_input_address'])\n ? (data['requested_input_address'] as Record<string, string | null>)\n : undefined;\n\n return new VatResource(\n str('uuid'),\n str('vat_uid'),\n state,\n str('country_code'),\n str('company_name'),\n CompanyAddress.from(data['company_address']) ?? undefined,\n str('requested_company_name'),\n str('requested_company_name_original'),\n requestedInputAddress,\n checkedAt,\n typeof data['score'] === 'number' ? data['score'] : undefined,\n str('score_source'),\n scoreAttempts,\n breakdown,\n str('environment'),\n str('provider'),\n usedProviders,\n str('provider_vat_state'),\n str('provider_note'),\n providerLastCheckedAt,\n ProviderDocument.fromArray(data['provider_document']) ?? undefined,\n );\n }\n\n getBackendLink(): string | null {\n if (!this.uuid) return null;\n if (this.environment === 'LIVE') {\n return `https://app.taxora.io/vat/history/${this.uuid}`;\n }\n return `https://app.sandbox.taxora.io/vat/history/${this.uuid}`;\n }\n\n toArray(): Record<string, unknown> {\n return {\n uuid: this.uuid,\n vat_uid: this.vatUid,\n state: this.state,\n country_code: this.countryCode,\n company_name: this.companyName,\n company_address: this.companyAddress?.toArray() ?? null,\n requested_company_name: this.requestedCompanyName,\n requested_company_name_original: this.requestedCompanyNameOriginal,\n requested_input_address: this.requestedInputAddress ?? null,\n checked_at: this.checkedAt?.toISOString() ?? null,\n score: this.score ?? null,\n score_source: this.scoreSource ?? null,\n score_attempts: this.scoreAttempts ?? null,\n breakdown: this.breakdown?.map((b) => b.toArray()) ?? null,\n environment: this.environment ?? null,\n provider: this.provider ?? null,\n used_providers: this.usedProviders ?? null,\n provider_vat_state: this.providerVatState ?? null,\n provider_note: this.providerNote ?? null,\n provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,\n provider_document: this.providerDocument?.toArray() ?? null,\n };\n }\n}\n","import { VatResource } from './VatResource.js';\n\nexport class VatCollection implements Iterable<VatResource> {\n private readonly items: VatResource[];\n public readonly self: string | undefined;\n\n constructor(items: VatResource[], self?: string) {\n this.items = items;\n this.self = self;\n }\n\n static fromResponse(data: unknown): VatCollection {\n if (Array.isArray(data)) {\n return new VatCollection((data as Record<string, unknown>[]).map(VatResource.fromArray));\n }\n\n if (typeof data === 'object' && data !== null) {\n const obj = data as Record<string, unknown>;\n const items = Array.isArray(obj['data'])\n ? (obj['data'] as Record<string, unknown>[]).map(VatResource.fromArray)\n : [];\n const self = typeof obj['self'] === 'string' ? obj['self'] : undefined;\n return new VatCollection(items, self);\n }\n\n return new VatCollection([]);\n }\n\n [Symbol.iterator](): Iterator<VatResource> {\n return this.items[Symbol.iterator]();\n }\n\n get length(): number {\n return this.items.length;\n }\n\n all(): VatResource[] {\n return [...this.items];\n }\n}\n","export class VatCertificateExport {\n constructor(\n public readonly exportId: string,\n public readonly message?: string,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatCertificateExport {\n return new VatCertificateExport(\n typeof data['export_id'] === 'string' ? data['export_id'] : '',\n typeof data['message'] === 'string' ? data['message'] : undefined,\n );\n }\n\n toArray(): { export_id: string; message?: string } {\n const result: { export_id: string; message?: string } = { export_id: this.exportId };\n if (this.message !== undefined) result.message = this.message;\n return result;\n }\n}\n","import { TaxoraException } from '../exceptions/TaxoraException.js';\n\ninterface VatValidationAddressInputProps {\n addressLine1?: string;\n addressLine2?: string;\n postalCode?: string;\n city?: string;\n countryCode?: string;\n}\n\nconst ALLOWED_KEYS = new Set(['address_line_1', 'address_line_2', 'postal_code', 'city', 'country_code']);\n\nexport class VatValidationAddressInput {\n public readonly addressLine1?: string;\n public readonly addressLine2?: string;\n public readonly postalCode?: string;\n public readonly city?: string;\n public readonly countryCode?: string;\n\n constructor(props: VatValidationAddressInputProps) {\n if (props.addressLine1 !== undefined && props.addressLine1.length > 255) {\n throw new TaxoraException('addressLine1 must not exceed 255 characters');\n }\n if (props.addressLine2 !== undefined && props.addressLine2.length > 255) {\n throw new TaxoraException('addressLine2 must not exceed 255 characters');\n }\n if (props.countryCode !== undefined && props.countryCode.length !== 2) {\n throw new TaxoraException('countryCode must be exactly 2 characters (ISO 3166-1 alpha-2)');\n }\n\n this.addressLine1 = props.addressLine1;\n this.addressLine2 = props.addressLine2;\n this.postalCode = props.postalCode;\n this.city = props.city;\n this.countryCode = props.countryCode;\n }\n\n static fromArray(data: Record<string, unknown>): VatValidationAddressInput {\n for (const key of Object.keys(data)) {\n if (!ALLOWED_KEYS.has(key)) {\n throw new TaxoraException(`Unsupported field: \"${key}\". Allowed fields: ${[...ALLOWED_KEYS].join(', ')}`);\n }\n }\n\n const getString = (key: string): string | undefined => {\n const val = data[key];\n if (typeof val !== 'string') return undefined;\n const trimmed = val.trim();\n return trimmed || undefined;\n };\n\n const countryCode = getString('country_code');\n\n return new VatValidationAddressInput({\n addressLine1: getString('address_line_1'),\n addressLine2: getString('address_line_2'),\n postalCode: getString('postal_code'),\n city: getString('city'),\n countryCode: countryCode ? countryCode.toUpperCase() : undefined,\n });\n }\n\n toArray(): Record<string, string> {\n const result: Record<string, string> = {};\n if (this.addressLine1 !== undefined) result['address_line_1'] = this.addressLine1;\n if (this.addressLine2 !== undefined) result['address_line_2'] = this.addressLine2;\n if (this.postalCode !== undefined) result['postal_code'] = this.postalCode;\n if (this.city !== undefined) result['city'] = this.city;\n if (this.countryCode !== undefined) result['country_code'] = this.countryCode;\n return result;\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class ValidationException extends TaxoraException {\n public readonly statusCode = 422;\n private readonly errors: Record<string, string[]>;\n\n constructor(message: string, errors: Record<string, string[]>, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'ValidationException';\n this.errors = errors;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getErrors(): Record<string, string[]> {\n return this.errors;\n }\n}\n","import { VatResource } from '../dto/VatResource.js';\nimport { VatCollection } from '../dto/VatCollection.js';\nimport { VatCertificateExport } from '../dto/VatCertificateExport.js';\nimport { VatValidationAddressInput } from '../dto/VatValidationAddressInput.js';\nimport { type Language } from '../enums/Language.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { ValidationException } from '../exceptions/ValidationException.js';\nimport { TaxoraException } from '../exceptions/TaxoraException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport class VatEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async validate(\n vatUid: string,\n companyName?: string,\n provider?: string,\n addressInput?: VatValidationAddressInput | Record<string, string>,\n ): Promise<VatResource> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n if (companyName) body['company_name'] = companyName;\n if (provider) body['source'] = provider;\n\n if (addressInput) {\n body['address_input'] = addressInput instanceof VatValidationAddressInput ? addressInput.toArray() : addressInput;\n }\n\n return this.validateWithGatewayRetry(body, 2);\n }\n\n private async validateWithGatewayRetry(body: Record<string, unknown>, attemptsLeft: number): Promise<VatResource> {\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate`, body);\n\n if (response.status === 504) {\n if (attemptsLeft <= 1) {\n const text = await response.text();\n throw new HttpException('VAT validation timed out after multiple attempts', 504, text);\n }\n return this.validateWithGatewayRetry(body, attemptsLeft - 1);\n }\n\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async validateMultiple(vatUids: string[], companyNames?: string[], provider?: string): Promise<VatCollection> {\n const body: Record<string, unknown> = { vat_uids: vatUids };\n if (companyNames) body['company_names'] = companyNames;\n if (provider) body['source'] = provider;\n\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/multiple`, body);\n const data = await this.parseJsonResponse(response);\n\n return VatCollection.fromResponse(data);\n }\n\n async validateSchema(vatUid: string): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/schema`, body);\n return this.parseJsonResponse(response);\n }\n\n async state(vatUid: string): Promise<VatResource> {\n const response = await this.sendRequest('GET', `${this.baseUrl}/vat/state/${encodeURIComponent(vatUid)}`);\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async history(vatUid?: string): Promise<VatCollection> {\n let url = `${this.baseUrl}/vat/history`;\n if (vatUid) url += `?vat_uid=${encodeURIComponent(vatUid)}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async search(term?: string, perPage?: number): Promise<VatCollection> {\n const params = new URLSearchParams();\n if (term) params.set('term', term);\n if (perPage !== undefined) params.set('per_page', String(perPage));\n\n const queryString = params.toString();\n const url = `${this.baseUrl}/vat/search${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async certificate(uuid: string, lang?: Language): Promise<Uint8Array> {\n let url = `${this.baseUrl}/vat/certificate/${encodeURIComponent(uuid)}`;\n if (lang) url += `?lang=${lang}`;\n\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n async certificatesBulkExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/bulk-export`, fromDate, toDate, countries, lang);\n }\n\n async certificatesListExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/list-export`, fromDate, toDate, countries, lang);\n }\n\n private async exportRequest(\n url: string,\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n const from = this.formatDate(fromDate);\n const to = this.formatDate(toDate);\n\n const body: Record<string, unknown> = { from_date: from, to_date: to };\n if (countries && countries.length > 0) body['countries'] = countries;\n if (lang) body['lang'] = lang;\n\n const response = await this.sendRequest('POST', url, body);\n const data = await this.parseJsonResponse(response, [200, 202]);\n\n const exportObj = VatCertificateExport.fromArray(data);\n if (!exportObj.exportId) {\n throw new TaxoraException('Export response is missing export_id');\n }\n\n return exportObj;\n }\n\n async downloadBulkExport(exportId: string): Promise<Uint8Array> {\n const url = `${this.baseUrl}/vat/certificates/bulk-export/${encodeURIComponent(exportId)}/download`;\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n return headers;\n }\n\n private async sendRequest(method: string, url: string, body?: Record<string, unknown>): Promise<Response> {\n const options: RequestInit = { headers: this.buildHeaders() };\n if (body) options.body = JSON.stringify(body);\n\n return this.httpClient.request(method, url, options);\n }\n\n private async sendBinaryRequest(method: string, url: string): Promise<Response> {\n const headers = this.buildHeaders();\n delete headers['Content-Type'];\n\n const response = await this.httpClient.request(method, url, { headers });\n if (!response.ok) {\n const text = await response.text();\n throw new HttpException(`HTTP error ${response.status}`, response.status, text);\n }\n return response;\n }\n\n private async parseJsonResponse(\n response: Response,\n acceptedStatuses: number[] = [200],\n ): Promise<Record<string, unknown>> {\n const responseText = await response.text();\n\n if (response.status === 422) {\n let errors: Record<string, string[]> = {};\n try {\n const parsed = JSON.parse(responseText) as Record<string, unknown>;\n if (parsed['errors'] !== null && typeof parsed['errors'] === 'object' && !Array.isArray(parsed['errors'])) {\n errors = parsed['errors'] as Record<string, string[]>;\n }\n } catch {\n // ignore parse errors\n }\n throw new ValidationException('Validation failed', errors);\n }\n\n if (!response.ok && !acceptedStatuses.includes(response.status)) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && (typeof obj['data'] === 'object' || Array.isArray(obj['data']))) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n\n private formatDate(date: Date | string): string {\n if (date instanceof Date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n if (!DATE_REGEX.test(date)) {\n throw new TaxoraException(`Invalid date format: \"${date}\". Expected YYYY-MM-DD.`);\n }\n\n return date;\n }\n}\n","export const Environment = {\n SANDBOX: 'sandbox',\n PRODUCTION: 'production',\n} as const;\n\nexport type Environment = (typeof Environment)[keyof typeof Environment];\n\nconst BASE_URLS: Record<Environment, string> = {\n [Environment.SANDBOX]: 'https://sandbox.taxora.io/v1',\n [Environment.PRODUCTION]: 'https://api.taxora.io/v1',\n};\n\nexport function getBaseUrl(environment: Environment): string {\n return BASE_URLS[environment];\n}\n","import { type HttpClientInterface } from './HttpClientInterface.js';\n\nexport class FetchHttpClient implements HttpClientInterface {\n async request(method: string, url: string, options: RequestInit = {}): Promise<Response> {\n return fetch(url, { ...options, method });\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nexport class InMemoryTokenStorage implements TokenStorageInterface {\n private token: Token | null = null;\n\n get(): Token | null {\n return this.token;\n }\n\n set(token: Token): void {\n this.token = token;\n }\n\n clear(): void {\n this.token = null;\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { type HttpClientInterface } from './HttpClientInterface.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nconst AUTH_PATH_PATTERN = /\\/auth\\//;\n\n/**\n * HTTP client wrapper that handles:\n * - Preemptive token refresh when the stored token is expired\n * - Automatic retry with a fresh token on 401 responses\n * - Passthrough for /auth/ routes (no interception)\n */\nexport class AuthRetryHttpClient implements HttpClientInterface {\n constructor(\n private readonly inner: HttpClientInterface,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly refreshFn: () => Promise<Token>,\n ) {}\n\n async request(method: string, url: string, options?: RequestInit): Promise<Response> {\n // Auth routes bypass all retry logic\n if (AUTH_PATH_PATTERN.test(url)) {\n return this.inner.request(method, url, options);\n }\n\n // Preemptive refresh if token is expired\n const currentToken = this.tokenStorage.get();\n if (currentToken?.isExpired()) {\n await this.refreshFn();\n }\n\n // Build request with potentially refreshed token\n const updatedOptions = this.injectAuthHeader(options);\n const response = await this.inner.request(method, url, updatedOptions);\n\n // 401: refresh once and retry\n if (response.status === 401) {\n await this.refreshFn();\n const retryOptions = this.injectAuthHeader(options);\n const retryResponse = await this.inner.request(method, url, retryOptions);\n\n if (retryResponse.status === 401) {\n const body = await retryResponse.text();\n throw new AuthenticationException('Authentication failed after token refresh', { status: 401, body });\n }\n\n return retryResponse;\n }\n\n return response;\n }\n\n private injectAuthHeader(options?: RequestInit): RequestInit {\n const token = this.tokenStorage.get();\n if (!token) return options ?? {};\n\n const existing = options?.headers ?? {};\n const headers = { ...(existing as Record<string, string>), Authorization: `Bearer ${token.accessToken}` };\n return { ...(options ?? {}), headers };\n }\n}\n","import { AuthEndpoint } from '../endpoints/AuthEndpoint.js';\nimport { CompanyEndpoint } from '../endpoints/CompanyEndpoint.js';\nimport { VatEndpoint } from '../endpoints/VatEndpoint.js';\nimport { Environment, getBaseUrl } from '../enums/Environment.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { FetchHttpClient } from '../http/FetchHttpClient.js';\nimport { InMemoryTokenStorage } from '../http/InMemoryTokenStorage.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\nimport { AuthRetryHttpClient } from '../http/AuthRetryHttpClient.js';\n\nexport interface TaxoraClientOptions {\n apiKey: string;\n environment?: Environment;\n tokenStorage?: TokenStorageInterface;\n httpClient?: HttpClientInterface;\n}\n\nexport class TaxoraClient {\n public readonly auth: AuthEndpoint;\n public readonly vat: VatEndpoint;\n public readonly company: CompanyEndpoint;\n public readonly baseUrl: string;\n\n constructor(options: TaxoraClientOptions) {\n const environment = options.environment ?? Environment.SANDBOX;\n const tokenStorage = options.tokenStorage ?? new InMemoryTokenStorage();\n const httpClient = options.httpClient ?? new FetchHttpClient();\n\n this.baseUrl = getBaseUrl(environment);\n\n // Auth endpoint uses the raw HTTP client — no retry interception for auth routes\n this.auth = new AuthEndpoint(this.baseUrl, options.apiKey, tokenStorage, httpClient);\n\n // All other endpoints use the retry-capable client that handles 401 auto-refresh\n const retryClient = new AuthRetryHttpClient(httpClient, tokenStorage, () => this.auth.refresh());\n\n this.vat = new VatEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n this.company = new CompanyEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n }\n}\n","import { TaxoraClient, type TaxoraClientOptions } from './TaxoraClient.js';\n\nexport class TaxoraClientFactory {\n static create(options: TaxoraClientOptions): TaxoraClient {\n return new TaxoraClient(options);\n }\n}\n","export const ApiVersion = {\n V1: 'v1',\n} as const;\n\nexport type ApiVersion = (typeof ApiVersion)[keyof typeof ApiVersion];\n","export const Language = {\n ENGLISH: 'en',\n GERMAN: 'de',\n} as const;\n\nexport type Language = (typeof Language)[keyof typeof Language];\n"],"mappings":";AAAA,SAAS,gBAAgB;;;ACAlB,IAAM,QAAN,MAAM,OAAM;AAAA,EACjB,YACkB,aACA,WACA,WAChB;AAHgB;AACA;AACA;AAAA,EACf;AAAA,EAHe;AAAA,EACA;AAAA,EACA;AAAA,EAGlB,UAAU,gBAAgB,IAAa;AACrC,WAAO,IAAI,KAAK,KAAK,IAAI,IAAI,gBAAgB,GAAI,KAAK,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,UAAU,MAAsC;AACrD,QAAI,cAAc,OAAO,KAAK,cAAc,KAAK,EAAE;AACnD,QAAI,YAAY,WAAW,SAAS,GAAG;AACrC,oBAAc,YAAY,MAAM,CAAC;AAAA,IACnC;AAEA,UAAM,YAAY,OAAO,KAAK,YAAY,KAAK,QAAQ;AACvD,UAAM,YAAY,OAAO,KAAK,YAAY,MAAM,WAAW,KAAK,YAAY,IAAI;AAChF,UAAM,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,GAAI;AAExD,WAAO,IAAI,OAAM,aAAa,WAAW,SAAS;AAAA,EACpD;AAAA,EAEA,UAA4E;AAC1E,WAAO;AAAA,MACL,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK,UAAU,YAAY;AAAA,IACzC;AAAA,EACF;AACF;;;AC/BO,IAAM,kBAAkB;AAAA,EAC7B,OAAO;AAAA,EACP,WAAW;AACb;;;ACHO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzB;AAAA,EAEhB,YAAY,SAAiB,UAAmC,CAAC,GAAG;AAClE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;;;ACPO,IAAM,0BAAN,cAAsC,gBAAgB;AAAA,EAC3C,aAAa;AAAA,EAE7B,YAAY,SAAiB,UAAmC,CAAC,GAAG;AAClE,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;;;ACRO,IAAM,gBAAN,cAA4B,gBAAgB;AAAA,EACjC;AAAA,EACA;AAAA,EAEhB,YAAY,SAAiB,YAAoB,cAAsB,UAAmC,CAAC,GAAG;AAC5G,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AAAA,EAEA,gBAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;;;ALbO,IAAM,eAAN,MAAmB;AAAA,EACxB,YACmB,SACA,QACA,cACA,YACjB;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAM,MACJ,YACA,UACA,QACA,kBAAmC,gBAAgB,OACnC;AAChB,UAAM,aAAa,UAAU,SAAS;AAEtC,UAAM,OAA+B;AAAA,MACnC,YAAY;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,IACf;AAEA,QAAI,oBAAoB,gBAAgB,WAAW;AACjD,WAAK,WAAW,IAAI;AAAA,IACtB,OAAO;AACL,WAAK,OAAO,IAAI;AAAA,IAClB;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,QAAQ,GAAG,KAAK,OAAO,eAAe;AAAA,MACnF,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,UAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,wBAAwB,8CAA8C;AAAA,QAC9E,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,cAAc,cAAc,SAAS,MAAM,IAAI,SAAS,QAAQ,YAAY;AAAA,IACxF;AAEA,UAAM,OAAO,KAAK,cAAc,YAAY;AAC5C,UAAM,QAAQ,MAAM,UAAU,IAAI;AAClC,SAAK,aAAa,IAAI,KAAK;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,UAAkB,UAAkB,QAAiC;AAC3F,WAAO,KAAK,MAAM,UAAU,UAAU,QAAQ,gBAAgB,SAAS;AAAA,EACzE;AAAA,EAEA,MAAM,UAA0B;AAC9B,UAAM,cAAc,KAAK,aAAa,IAAI;AAC1C,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,aAAa,KAAK;AAAA,IACpB;AAEA,QAAI,aAAa;AACf,cAAQ,eAAe,IAAI,UAAU,YAAY,WAAW;AAAA,IAC9D;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,QAAQ,GAAG,KAAK,OAAO,iBAAiB,EAAE,QAAQ,CAAC;AAClG,UAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,wBAAwB,sCAAsC,EAAE,QAAQ,KAAK,MAAM,aAAa,CAAC;AAAA,IAC7G;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,cAAc,cAAc,SAAS,MAAM,IAAI,SAAS,QAAQ,YAAY;AAAA,IACxF;AAEA,UAAM,OAAO,KAAK,cAAc,YAAY;AAC5C,UAAM,QAAQ,MAAM,UAAU,IAAI;AAClC,SAAK,aAAa,IAAI,KAAK;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,cAA+C;AACnE,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,YAAY;AAAA,IAClC,QAAQ;AACN,YAAM,IAAI,cAAc,yBAAyB,GAAG,YAAY;AAAA,IAClE;AAEA,QAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,YAAM,IAAI,cAAc,8BAA8B,GAAG,YAAY;AAAA,IACvE;AAEA,UAAM,MAAM;AACZ,QAAI,IAAI,MAAM,MAAM,UAAa,OAAO,IAAI,MAAM,MAAM,YAAY,IAAI,MAAM,MAAM,MAAM;AACxF,aAAO,IAAI,MAAM;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AACF;;;AM9GO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACmB,SACA,QACA,cACA,YACjB;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAM,MAAwC;AAC5C,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,aAAa,KAAK;AAAA,IACpB;AAEA,UAAM,QAAQ,KAAK,aAAa,IAAI;AACpC,QAAI,OAAO;AACT,cAAQ,eAAe,IAAI,UAAU,MAAM,WAAW;AAAA,IACxD;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,OAAO,GAAG,KAAK,OAAO,YAAY,EAAE,QAAQ,CAAC;AAC5F,UAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,cAAc,cAAc,SAAS,MAAM,IAAI,SAAS,QAAQ,YAAY;AAAA,IACxF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,YAAY;AAAA,IAClC,QAAQ;AACN,YAAM,IAAI,cAAc,yBAAyB,GAAG,YAAY;AAAA,IAClE;AAEA,QAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,YAAM,IAAI,cAAc,8BAA8B,GAAG,YAAY;AAAA,IACvE;AAEA,UAAM,MAAM;AACZ,QAAI,IAAI,MAAM,MAAM,UAAa,OAAO,IAAI,MAAM,MAAM,YAAY,IAAI,MAAM,MAAM,MAAM;AACxF,aAAO,IAAI,MAAM;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AACF;;;AChDO,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX;AAIO,SAAS,qBAAiC;AAC/C,SAAO,CAAC,SAAS,SAAS,SAAS,KAAK;AAC1C;AAEA,IAAM,eAAyC;AAAA,EAC7C,CAAC,SAAS,KAAK,GAAG;AAAA,EAClB,CAAC,SAAS,OAAO,GAAG;AAAA,EACpB,CAAC,SAAS,KAAK,GAAG;AAAA,EAClB,CAAC,SAAS,OAAO,GAAG;AACtB;AAEO,SAAS,iBAAiB,OAAyB;AACxD,SAAO,aAAa,KAAK;AAC3B;;;ACXO,IAAM,iBAAN,MAAM,gBAAe;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,OAA4B;AACtC,SAAK,OAAO,MAAM,QAAQ;AAC1B,SAAK,SAAS,MAAM,UAAU;AAC9B,SAAK,aAAa,MAAM,cAAc;AACtC,SAAK,OAAO,MAAM,QAAQ;AAC1B,SAAK,QAAQ,MAAM,SAAS;AAC5B,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,MAAM,MAAM,OAAO;AACxB,SAAK,cAAc,MAAM,eAAe,KAAK,oBAAoB;AAAA,EACnE;AAAA,EAEQ,sBAAqC;AAC3C,UAAM,QAAQ,CAAC,KAAK,QAAQ,KAAK,YAAY,KAAK,MAAM,KAAK,OAAO,EAAE,OAAO,OAAO;AACpF,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,EAC/C;AAAA,EAEA,OAAO,KAAK,OAAuC;AACjD,QAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAElD,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,CAAC,QAAS,QAAO;AAErB,UAAI;AACF,cAAM,SAAkB,KAAK,MAAM,OAAO;AAC1C,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,iBAAO,gBAAe,UAAU,QAAmC,OAAO;AAAA,QAC5E;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO,IAAI,gBAAe,EAAE,KAAK,QAAQ,CAAC;AAAA,IAC5C;AAEA,QAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AACtD,aAAO,gBAAe,UAAU,OAAkC,IAAI;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,UAAU,MAA+B,KAAoC;AAClF,UAAM,MAAM,CAAC,QAA+B;AAC1C,YAAM,MAAM,KAAK,GAAG,KAAK,KAAK,IAAI,QAAQ,MAAM,GAAG,CAAC;AACpD,aAAO,OAAO,QAAQ,YAAY,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,IAC9D;AAEA,WAAO,IAAI,gBAAe;AAAA,MACxB,aAAa,IAAI,cAAc;AAAA,MAC/B,MAAM,IAAI,MAAM;AAAA,MAChB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,IAAI,aAAa,KAAK,IAAI,YAAY;AAAA,MAClD,MAAM,IAAI,MAAM;AAAA,MAChB,OAAO,IAAI,OAAO;AAAA,MAClB,SAAS,IAAI,SAAS;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAyC;AACvC,WAAO;AAAA,MACL,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK,eAAe,KAAK,OAAO;AAAA,EACzC;AACF;;;AC/FO,IAAM,iBAAN,MAAM,gBAAe;AAAA,EAC1B,YACkB,UACA,mBACA,UAChB;AAHgB;AACA;AACA;AAAA,EACf;AAAA,EAHe;AAAA,EACA;AAAA,EACA;AAAA,EAGlB,OAAO,UAAU,MAA+C;AAC9D,WAAO,IAAI;AAAA,MACT,OAAO,KAAK,WAAW,MAAM,WAAW,KAAK,WAAW,IAAI;AAAA,MAC5D,OAAO,KAAK,oBAAoB,MAAM,WAAW,KAAK,oBAAoB,IAAI;AAAA,MAC9E,KAAK,UAAU,MAAM,QAAQ,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC,MAAM,QAAQ,KAAK,UAAU,CAAC,IAC/F,KAAK,UAAU,IAChB,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEA,UAAgG;AAC9F,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,oBAAoB,KAAK;AAAA,MACzB,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACF;;;ACxBO,IAAM,uBAAN,MAAM,sBAAqB;AAAA,EAChC,YACkB,IACA,QACA,WACA,iBACA,WACA,MAChB;AANgB;AACA;AACA;AACA;AACA;AACA;AAAA,EACf;AAAA,EANe;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGlB,OAAO,UAAU,MAA4C;AAC3D,QAAI,SAAS,QAAQ,SAAS,UAAa,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AAC1F,aAAO;AAAA,IACT;AACA,UAAM,IAAI;AAEV,WAAO,IAAI;AAAA,MACT,OAAO,EAAE,IAAI,MAAM,WAAW,EAAE,IAAI,IAAI;AAAA,MACxC,OAAO,EAAE,SAAS,MAAM,WAAW,EAAE,SAAS,IAAI;AAAA,MAClD,OAAO,EAAE,YAAY,MAAM,WAAW,EAAE,YAAY,IAAI;AAAA,MACxD,OAAO,EAAE,kBAAkB,MAAM,WAAW,EAAE,kBAAkB,IAAI;AAAA,MACpE,OAAO,EAAE,WAAW,MAAM,WAAW,EAAE,WAAW,IAAI;AAAA,MACtD,EAAE,MAAM,MAAM,QAAQ,OAAO,EAAE,MAAM,MAAM,YAAY,CAAC,MAAM,QAAQ,EAAE,MAAM,CAAC,IAC1E,EAAE,MAAM,IACT,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEA,UAAmC;AACjC,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,kBAAkB,KAAK;AAAA,MACvB,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AACF;;;ACpCO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAC5B,YACkB,IACA,UACA,cACA,OACA,cACA,MACA,MACA,MACA,MACA,MAChB;AAVgB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,EACf;AAAA,EAVe;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGlB,OAAO,UAAU,MAAwC;AACvD,QAAI,SAAS,QAAQ,SAAS,UAAa,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AAC1F,aAAO;AAAA,IACT;AACA,UAAM,IAAI;AAEV,UAAM,eACJ,OAAO,EAAE,eAAe,MAAM,YAAY,EAAE,eAAe,IAAI,IAAI,KAAK,EAAE,eAAe,CAAC,IAAI;AAEhG,WAAO,IAAI;AAAA,MACT,OAAO,EAAE,IAAI,MAAM,WAAW,EAAE,IAAI,IAAI;AAAA,MACxC,OAAO,EAAE,UAAU,MAAM,WAAW,EAAE,UAAU,IAAI;AAAA,MACpD,OAAO,EAAE,eAAe,MAAM,WAAW,EAAE,eAAe,IAAI;AAAA,MAC9D,OAAO,EAAE,OAAO,MAAM,WAAW,EAAE,OAAO,IAAI;AAAA,MAC9C;AAAA,MACA,OAAO,EAAE,MAAM,MAAM,WAAW,EAAE,MAAM,IAAI;AAAA,MAC5C,OAAO,EAAE,MAAM,MAAM,WAAW,EAAE,MAAM,IAAI;AAAA,MAC5C,OAAO,EAAE,MAAM,MAAM,WAAW,EAAE,MAAM,IAAI;AAAA,MAC5C,EAAE,MAAM,MAAM,QAAQ,OAAO,EAAE,MAAM,MAAM,YAAY,CAAC,MAAM,QAAQ,EAAE,MAAM,CAAC,IAC1E,EAAE,MAAM,IACT,CAAC;AAAA,MACL,qBAAqB,UAAU,EAAE,MAAM,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,UAAmC;AACjC,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,eAAe,KAAK;AAAA,MACpB,OAAO,KAAK;AAAA,MACZ,eAAe,KAAK,cAAc,YAAY,KAAK;AAAA,MACnD,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,MAAM,QAAQ,KAAK;AAAA,IAChC;AAAA,EACF;AACF;;;AClDO,IAAM,cAAN,MAAM,aAAY;AAAA,EACvB,YACkB,MACA,QACA,OACA,aACA,aACA,gBACA,sBACA,8BACA,uBACA,WACA,OACA,aACA,eACA,WACA,aACA,UACA,eACA,kBACA,cACA,uBACA,kBAChB;AArBgB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,EACf;AAAA,EArBe;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGlB,OAAO,UAAU,MAA4C;AAC3D,UAAM,MAAM,CAAC,QAAoC;AAC/C,YAAM,IAAI,KAAK,GAAG;AAClB,aAAO,OAAO,MAAM,WAAW,IAAI;AAAA,IACrC;AAEA,UAAM,WAAW,IAAI,OAAO;AAC5B,UAAM,QACJ,aAAa,UAAa,OAAO,OAAO,QAAQ,EAAE,SAAS,QAAoB,IAC1E,WACD;AAEN,UAAM,YAAY,IAAI,YAAY,IAAI,IAAI,KAAK,KAAK,YAAY,CAAW,IAAI;AAC/E,UAAM,wBAAwB,IAAI,0BAA0B,IACxD,IAAI,KAAK,KAAK,0BAA0B,CAAW,IACnD;AAEJ,UAAM,YAAY,MAAM,QAAQ,KAAK,WAAW,CAAC,IAC5C,KAAK,WAAW,EAAgC,IAAI,eAAe,SAAS,IAC7E;AAEJ,UAAM,gBAAgB,MAAM,QAAQ,KAAK,gBAAgB,CAAC,IACrD,KAAK,gBAAgB,EAAgB,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IACtF;AAEJ,UAAM,gBAAgB,MAAM,QAAQ,KAAK,gBAAgB,CAAC,IACrD,KAAK,gBAAgB,IACtB;AAEJ,UAAM,wBACJ,KAAK,yBAAyB,MAAM,QACpC,OAAO,KAAK,yBAAyB,MAAM,YAC3C,CAAC,MAAM,QAAQ,KAAK,yBAAyB,CAAC,IACzC,KAAK,yBAAyB,IAC/B;AAEN,WAAO,IAAI;AAAA,MACT,IAAI,MAAM;AAAA,MACV,IAAI,SAAS;AAAA,MACb;AAAA,MACA,IAAI,cAAc;AAAA,MAClB,IAAI,cAAc;AAAA,MAClB,eAAe,KAAK,KAAK,iBAAiB,CAAC,KAAK;AAAA,MAChD,IAAI,wBAAwB;AAAA,MAC5B,IAAI,iCAAiC;AAAA,MACrC;AAAA,MACA;AAAA,MACA,OAAO,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,IAAI;AAAA,MACpD,IAAI,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA,IAAI,aAAa;AAAA,MACjB,IAAI,UAAU;AAAA,MACd;AAAA,MACA,IAAI,oBAAoB;AAAA,MACxB,IAAI,eAAe;AAAA,MACnB;AAAA,MACA,iBAAiB,UAAU,KAAK,mBAAmB,CAAC,KAAK;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,iBAAgC;AAC9B,QAAI,CAAC,KAAK,KAAM,QAAO;AACvB,QAAI,KAAK,gBAAgB,QAAQ;AAC/B,aAAO,qCAAqC,KAAK,IAAI;AAAA,IACvD;AACA,WAAO,6CAA6C,KAAK,IAAI;AAAA,EAC/D;AAAA,EAEA,UAAmC;AACjC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK,gBAAgB,QAAQ,KAAK;AAAA,MACnD,wBAAwB,KAAK;AAAA,MAC7B,iCAAiC,KAAK;AAAA,MACtC,yBAAyB,KAAK,yBAAyB;AAAA,MACvD,YAAY,KAAK,WAAW,YAAY,KAAK;AAAA,MAC7C,OAAO,KAAK,SAAS;AAAA,MACrB,cAAc,KAAK,eAAe;AAAA,MAClC,gBAAgB,KAAK,iBAAiB;AAAA,MACtC,WAAW,KAAK,WAAW,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK;AAAA,MACtD,aAAa,KAAK,eAAe;AAAA,MACjC,UAAU,KAAK,YAAY;AAAA,MAC3B,gBAAgB,KAAK,iBAAiB;AAAA,MACtC,oBAAoB,KAAK,oBAAoB;AAAA,MAC7C,eAAe,KAAK,gBAAgB;AAAA,MACpC,0BAA0B,KAAK,uBAAuB,YAAY,KAAK;AAAA,MACvE,mBAAmB,KAAK,kBAAkB,QAAQ,KAAK;AAAA,IACzD;AAAA,EACF;AACF;;;AC1HO,IAAM,gBAAN,MAAM,eAA+C;AAAA,EACzC;AAAA,EACD;AAAA,EAEhB,YAAY,OAAsB,MAAe;AAC/C,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAO,aAAa,MAA8B;AAChD,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,IAAI,eAAe,KAAmC,IAAI,YAAY,SAAS,CAAC;AAAA,IACzF;AAEA,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,YAAM,MAAM;AACZ,YAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,CAAC,IAClC,IAAI,MAAM,EAAgC,IAAI,YAAY,SAAS,IACpE,CAAC;AACL,YAAM,OAAO,OAAO,IAAI,MAAM,MAAM,WAAW,IAAI,MAAM,IAAI;AAC7D,aAAO,IAAI,eAAc,OAAO,IAAI;AAAA,IACtC;AAEA,WAAO,IAAI,eAAc,CAAC,CAAC;AAAA,EAC7B;AAAA,EAEA,CAAC,OAAO,QAAQ,IAA2B;AACzC,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,MAAqB;AACnB,WAAO,CAAC,GAAG,KAAK,KAAK;AAAA,EACvB;AACF;;;ACvCO,IAAM,uBAAN,MAAM,sBAAqB;AAAA,EAChC,YACkB,UACA,SAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAFe;AAAA,EACA;AAAA,EAGlB,OAAO,UAAU,MAAqD;AACpE,WAAO,IAAI;AAAA,MACT,OAAO,KAAK,WAAW,MAAM,WAAW,KAAK,WAAW,IAAI;AAAA,MAC5D,OAAO,KAAK,SAAS,MAAM,WAAW,KAAK,SAAS,IAAI;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,UAAmD;AACjD,UAAM,SAAkD,EAAE,WAAW,KAAK,SAAS;AACnF,QAAI,KAAK,YAAY,OAAW,QAAO,UAAU,KAAK;AACtD,WAAO;AAAA,EACT;AACF;;;ACRA,IAAM,eAAe,oBAAI,IAAI,CAAC,kBAAkB,kBAAkB,eAAe,QAAQ,cAAc,CAAC;AAEjG,IAAM,4BAAN,MAAM,2BAA0B;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,OAAuC;AACjD,QAAI,MAAM,iBAAiB,UAAa,MAAM,aAAa,SAAS,KAAK;AACvE,YAAM,IAAI,gBAAgB,6CAA6C;AAAA,IACzE;AACA,QAAI,MAAM,iBAAiB,UAAa,MAAM,aAAa,SAAS,KAAK;AACvE,YAAM,IAAI,gBAAgB,6CAA6C;AAAA,IACzE;AACA,QAAI,MAAM,gBAAgB,UAAa,MAAM,YAAY,WAAW,GAAG;AACrE,YAAM,IAAI,gBAAgB,+DAA+D;AAAA,IAC3F;AAEA,SAAK,eAAe,MAAM;AAC1B,SAAK,eAAe,MAAM;AAC1B,SAAK,aAAa,MAAM;AACxB,SAAK,OAAO,MAAM;AAClB,SAAK,cAAc,MAAM;AAAA,EAC3B;AAAA,EAEA,OAAO,UAAU,MAA0D;AACzE,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,UAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,cAAM,IAAI,gBAAgB,uBAAuB,GAAG,sBAAsB,CAAC,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MAC1G;AAAA,IACF;AAEA,UAAM,YAAY,CAAC,QAAoC;AACrD,YAAM,MAAM,KAAK,GAAG;AACpB,UAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,YAAM,UAAU,IAAI,KAAK;AACzB,aAAO,WAAW;AAAA,IACpB;AAEA,UAAM,cAAc,UAAU,cAAc;AAE5C,WAAO,IAAI,2BAA0B;AAAA,MACnC,cAAc,UAAU,gBAAgB;AAAA,MACxC,cAAc,UAAU,gBAAgB;AAAA,MACxC,YAAY,UAAU,aAAa;AAAA,MACnC,MAAM,UAAU,MAAM;AAAA,MACtB,aAAa,cAAc,YAAY,YAAY,IAAI;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEA,UAAkC;AAChC,UAAM,SAAiC,CAAC;AACxC,QAAI,KAAK,iBAAiB,OAAW,QAAO,gBAAgB,IAAI,KAAK;AACrE,QAAI,KAAK,iBAAiB,OAAW,QAAO,gBAAgB,IAAI,KAAK;AACrE,QAAI,KAAK,eAAe,OAAW,QAAO,aAAa,IAAI,KAAK;AAChE,QAAI,KAAK,SAAS,OAAW,QAAO,MAAM,IAAI,KAAK;AACnD,QAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,IAAI,KAAK;AAClE,WAAO;AAAA,EACT;AACF;;;ACrEO,IAAM,sBAAN,cAAkC,gBAAgB;AAAA,EACvC,aAAa;AAAA,EACZ;AAAA,EAEjB,YAAY,SAAiB,QAAkC,UAAmC,CAAC,GAAG;AACpG,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AAAA,EAEA,YAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AACF;;;ACLA,IAAM,aAAa;AAEZ,IAAM,cAAN,MAAkB;AAAA,EACvB,YACmB,SACA,QACA,cACA,YACjB;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAM,SACJ,QACA,aACA,UACA,cACsB;AACtB,UAAM,OAAgC,EAAE,SAAS,OAAO;AACxD,QAAI,YAAa,MAAK,cAAc,IAAI;AACxC,QAAI,SAAU,MAAK,QAAQ,IAAI;AAE/B,QAAI,cAAc;AAChB,WAAK,eAAe,IAAI,wBAAwB,4BAA4B,aAAa,QAAQ,IAAI;AAAA,IACvG;AAEA,WAAO,KAAK,yBAAyB,MAAM,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAc,yBAAyB,MAA+B,cAA4C;AAChH,UAAM,WAAW,MAAM,KAAK,YAAY,QAAQ,GAAG,KAAK,OAAO,iBAAiB,IAAI;AAEpF,QAAI,SAAS,WAAW,KAAK;AAC3B,UAAI,gBAAgB,GAAG;AACrB,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,IAAI,cAAc,oDAAoD,KAAK,IAAI;AAAA,MACvF;AACA,aAAO,KAAK,yBAAyB,MAAM,eAAe,CAAC;AAAA,IAC7D;AAEA,UAAM,OAAO,MAAM,KAAK,kBAAkB,QAAQ;AAClD,WAAO,YAAY,UAAU,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,iBAAiB,SAAmB,cAAyB,UAA2C;AAC5G,UAAM,OAAgC,EAAE,UAAU,QAAQ;AAC1D,QAAI,aAAc,MAAK,eAAe,IAAI;AAC1C,QAAI,SAAU,MAAK,QAAQ,IAAI;AAE/B,UAAM,WAAW,MAAM,KAAK,YAAY,QAAQ,GAAG,KAAK,OAAO,0BAA0B,IAAI;AAC7F,UAAM,OAAO,MAAM,KAAK,kBAAkB,QAAQ;AAElD,WAAO,cAAc,aAAa,IAAI;AAAA,EACxC;AAAA,EAEA,MAAM,eAAe,QAAkD;AACrE,UAAM,OAAgC,EAAE,SAAS,OAAO;AACxD,UAAM,WAAW,MAAM,KAAK,YAAY,QAAQ,GAAG,KAAK,OAAO,wBAAwB,IAAI;AAC3F,WAAO,KAAK,kBAAkB,QAAQ;AAAA,EACxC;AAAA,EAEA,MAAM,MAAM,QAAsC;AAChD,UAAM,WAAW,MAAM,KAAK,YAAY,OAAO,GAAG,KAAK,OAAO,cAAc,mBAAmB,MAAM,CAAC,EAAE;AACxG,UAAM,OAAO,MAAM,KAAK,kBAAkB,QAAQ;AAClD,WAAO,YAAY,UAAU,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,QAAQ,QAAyC;AACrD,QAAI,MAAM,GAAG,KAAK,OAAO;AACzB,QAAI,OAAQ,QAAO,YAAY,mBAAmB,MAAM,CAAC;AAEzD,UAAM,WAAW,MAAM,KAAK,YAAY,OAAO,GAAG;AAClD,UAAM,OAAO,MAAM,KAAK,kBAAkB,QAAQ;AAClD,WAAO,cAAc,aAAa,IAAI;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,MAAe,SAA0C;AACpE,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,KAAM,QAAO,IAAI,QAAQ,IAAI;AACjC,QAAI,YAAY,OAAW,QAAO,IAAI,YAAY,OAAO,OAAO,CAAC;AAEjE,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,GAAG,KAAK,OAAO,cAAc,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7E,UAAM,WAAW,MAAM,KAAK,YAAY,OAAO,GAAG;AAClD,UAAM,OAAO,MAAM,KAAK,kBAAkB,QAAQ;AAClD,WAAO,cAAc,aAAa,IAAI;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,MAAc,MAAsC;AACpE,QAAI,MAAM,GAAG,KAAK,OAAO,oBAAoB,mBAAmB,IAAI,CAAC;AACrE,QAAI,KAAM,QAAO,SAAS,IAAI;AAE9B,UAAM,WAAW,MAAM,KAAK,kBAAkB,OAAO,GAAG;AACxD,UAAM,SAAS,MAAM,SAAS,YAAY;AAC1C,WAAO,IAAI,WAAW,MAAM;AAAA,EAC9B;AAAA,EAEA,MAAM,uBACJ,UACA,QACA,WACA,MAC+B;AAC/B,WAAO,KAAK,cAAc,GAAG,KAAK,OAAO,iCAAiC,UAAU,QAAQ,WAAW,IAAI;AAAA,EAC7G;AAAA,EAEA,MAAM,uBACJ,UACA,QACA,WACA,MAC+B;AAC/B,WAAO,KAAK,cAAc,GAAG,KAAK,OAAO,iCAAiC,UAAU,QAAQ,WAAW,IAAI;AAAA,EAC7G;AAAA,EAEA,MAAc,cACZ,KACA,UACA,QACA,WACA,MAC+B;AAC/B,UAAM,OAAO,KAAK,WAAW,QAAQ;AACrC,UAAM,KAAK,KAAK,WAAW,MAAM;AAEjC,UAAM,OAAgC,EAAE,WAAW,MAAM,SAAS,GAAG;AACrE,QAAI,aAAa,UAAU,SAAS,EAAG,MAAK,WAAW,IAAI;AAC3D,QAAI,KAAM,MAAK,MAAM,IAAI;AAEzB,UAAM,WAAW,MAAM,KAAK,YAAY,QAAQ,KAAK,IAAI;AACzD,UAAM,OAAO,MAAM,KAAK,kBAAkB,UAAU,CAAC,KAAK,GAAG,CAAC;AAE9D,UAAM,YAAY,qBAAqB,UAAU,IAAI;AACrD,QAAI,CAAC,UAAU,UAAU;AACvB,YAAM,IAAI,gBAAgB,sCAAsC;AAAA,IAClE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,UAAuC;AAC9D,UAAM,MAAM,GAAG,KAAK,OAAO,iCAAiC,mBAAmB,QAAQ,CAAC;AACxF,UAAM,WAAW,MAAM,KAAK,kBAAkB,OAAO,GAAG;AACxD,UAAM,SAAS,MAAM,SAAS,YAAY;AAC1C,WAAO,IAAI,WAAW,MAAM;AAAA,EAC9B;AAAA,EAEQ,eAAuC;AAC7C,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,aAAa,KAAK;AAAA,IACpB;AACA,UAAM,QAAQ,KAAK,aAAa,IAAI;AACpC,QAAI,OAAO;AACT,cAAQ,eAAe,IAAI,UAAU,MAAM,WAAW;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YAAY,QAAgB,KAAa,MAAmD;AACxG,UAAM,UAAuB,EAAE,SAAS,KAAK,aAAa,EAAE;AAC5D,QAAI,KAAM,SAAQ,OAAO,KAAK,UAAU,IAAI;AAE5C,WAAO,KAAK,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAAA,EACrD;AAAA,EAEA,MAAc,kBAAkB,QAAgB,KAAgC;AAC9E,UAAM,UAAU,KAAK,aAAa;AAClC,WAAO,QAAQ,cAAc;AAE7B,UAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,QAAQ,KAAK,EAAE,QAAQ,CAAC;AACvE,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI,cAAc,cAAc,SAAS,MAAM,IAAI,SAAS,QAAQ,IAAI;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBACZ,UACA,mBAA6B,CAAC,GAAG,GACC;AAClC,UAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,QAAI,SAAS,WAAW,KAAK;AAC3B,UAAI,SAAmC,CAAC;AACxC,UAAI;AACF,cAAMA,UAAS,KAAK,MAAM,YAAY;AACtC,YAAIA,QAAO,QAAQ,MAAM,QAAQ,OAAOA,QAAO,QAAQ,MAAM,YAAY,CAAC,MAAM,QAAQA,QAAO,QAAQ,CAAC,GAAG;AACzG,mBAASA,QAAO,QAAQ;AAAA,QAC1B;AAAA,MACF,QAAQ;AAAA,MAER;AACA,YAAM,IAAI,oBAAoB,qBAAqB,MAAM;AAAA,IAC3D;AAEA,QAAI,CAAC,SAAS,MAAM,CAAC,iBAAiB,SAAS,SAAS,MAAM,GAAG;AAC/D,YAAM,IAAI,cAAc,cAAc,SAAS,MAAM,IAAI,SAAS,QAAQ,YAAY;AAAA,IACxF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,YAAY;AAAA,IAClC,QAAQ;AACN,YAAM,IAAI,cAAc,yBAAyB,GAAG,YAAY;AAAA,IAClE;AAEA,QAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,YAAM,IAAI,cAAc,8BAA8B,GAAG,YAAY;AAAA,IACvE;AAEA,UAAM,MAAM;AACZ,QAAI,IAAI,MAAM,MAAM,WAAc,OAAO,IAAI,MAAM,MAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI;AAChG,aAAO,IAAI,MAAM;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,MAA6B;AAC9C,QAAI,gBAAgB,MAAM;AACxB,YAAM,OAAO,KAAK,YAAY;AAC9B,YAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,YAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,aAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAAA,IAChC;AAEA,QAAI,CAAC,WAAW,KAAK,IAAI,GAAG;AAC1B,YAAM,IAAI,gBAAgB,yBAAyB,IAAI,yBAAyB;AAAA,IAClF;AAEA,WAAO;AAAA,EACT;AACF;;;ACpPO,IAAM,cAAc;AAAA,EACzB,SAAS;AAAA,EACT,YAAY;AACd;AAIA,IAAM,YAAyC;AAAA,EAC7C,CAAC,YAAY,OAAO,GAAG;AAAA,EACvB,CAAC,YAAY,UAAU,GAAG;AAC5B;AAEO,SAAS,WAAW,aAAkC;AAC3D,SAAO,UAAU,WAAW;AAC9B;;;ACZO,IAAM,kBAAN,MAAqD;AAAA,EAC1D,MAAM,QAAQ,QAAgB,KAAa,UAAuB,CAAC,GAAsB;AACvF,WAAO,MAAM,KAAK,EAAE,GAAG,SAAS,OAAO,CAAC;AAAA,EAC1C;AACF;;;ACHO,IAAM,uBAAN,MAA4D;AAAA,EACzD,QAAsB;AAAA,EAE9B,MAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAoB;AACtB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ;AAAA,EACf;AACF;;;ACZA,IAAM,oBAAoB;AAQnB,IAAM,sBAAN,MAAyD;AAAA,EAC9D,YACmB,OACA,cACA,WACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAM,QAAQ,QAAgB,KAAa,SAA0C;AAEnF,QAAI,kBAAkB,KAAK,GAAG,GAAG;AAC/B,aAAO,KAAK,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAAA,IAChD;AAGA,UAAM,eAAe,KAAK,aAAa,IAAI;AAC3C,QAAI,cAAc,UAAU,GAAG;AAC7B,YAAM,KAAK,UAAU;AAAA,IACvB;AAGA,UAAM,iBAAiB,KAAK,iBAAiB,OAAO;AACpD,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,cAAc;AAGrE,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,KAAK,UAAU;AACrB,YAAM,eAAe,KAAK,iBAAiB,OAAO;AAClD,YAAM,gBAAgB,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,YAAY;AAExE,UAAI,cAAc,WAAW,KAAK;AAChC,cAAM,OAAO,MAAM,cAAc,KAAK;AACtC,cAAM,IAAI,wBAAwB,6CAA6C,EAAE,QAAQ,KAAK,KAAK,CAAC;AAAA,MACtG;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,SAAoC;AAC3D,UAAM,QAAQ,KAAK,aAAa,IAAI;AACpC,QAAI,CAAC,MAAO,QAAO,WAAW,CAAC;AAE/B,UAAM,WAAW,SAAS,WAAW,CAAC;AACtC,UAAM,UAAU,EAAE,GAAI,UAAqC,eAAe,UAAU,MAAM,WAAW,GAAG;AACxG,WAAO,EAAE,GAAI,WAAW,CAAC,GAAI,QAAQ;AAAA,EACvC;AACF;;;AC5CO,IAAM,eAAN,MAAmB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,SAA8B;AACxC,UAAM,cAAc,QAAQ,eAAe,YAAY;AACvD,UAAM,eAAe,QAAQ,gBAAgB,IAAI,qBAAqB;AACtE,UAAM,aAAa,QAAQ,cAAc,IAAI,gBAAgB;AAE7D,SAAK,UAAU,WAAW,WAAW;AAGrC,SAAK,OAAO,IAAI,aAAa,KAAK,SAAS,QAAQ,QAAQ,cAAc,UAAU;AAGnF,UAAM,cAAc,IAAI,oBAAoB,YAAY,cAAc,MAAM,KAAK,KAAK,QAAQ,CAAC;AAE/F,SAAK,MAAM,IAAI,YAAY,KAAK,SAAS,QAAQ,QAAQ,cAAc,WAAW;AAClF,SAAK,UAAU,IAAI,gBAAgB,KAAK,SAAS,QAAQ,QAAQ,cAAc,WAAW;AAAA,EAC5F;AACF;;;ACrCO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,OAAO,OAAO,SAA4C;AACxD,WAAO,IAAI,aAAa,OAAO;AAAA,EACjC;AACF;;;ACNO,IAAM,aAAa;AAAA,EACxB,IAAI;AACN;;;ACFO,IAAM,WAAW;AAAA,EACtB,SAAS;AAAA,EACT,QAAQ;AACV;","names":["parsed"]}
|
|
1
|
+
{"version":3,"sources":["../src/endpoints/AuthEndpoint.ts","../src/dto/Token.ts","../src/enums/LoginIdentifier.ts","../src/exceptions/TaxoraException.ts","../src/exceptions/AuthenticationException.ts","../src/exceptions/HttpException.ts","../src/dto/CompanyResource.ts","../src/endpoints/CompanyEndpoint.ts","../src/enums/VatState.ts","../src/dto/CompanyAddress.ts","../src/dto/ScoreBreakdown.ts","../src/dto/ProviderDocumentLine.ts","../src/dto/ProviderDocument.ts","../src/dto/VatResource.ts","../src/dto/VatCollection.ts","../src/dto/VatCertificateExport.ts","../src/dto/VatValidationAddressInput.ts","../src/exceptions/ValidationException.ts","../src/endpoints/VatEndpoint.ts","../src/enums/Environment.ts","../src/http/FetchHttpClient.ts","../src/http/InMemoryTokenStorage.ts","../src/http/AuthRetryHttpClient.ts","../src/client/TaxoraClient.ts","../src/client/TaxoraClientFactory.ts","../src/enums/ApiVersion.ts","../src/enums/Language.ts"],"sourcesContent":["import { hostname } from 'os';\nimport { Token } from '../dto/Token.js';\nimport { LoginIdentifier } from '../enums/LoginIdentifier.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class AuthEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async login(\n identifier: string,\n password: string,\n device?: string,\n loginIdentifier: LoginIdentifier = LoginIdentifier.EMAIL,\n ): Promise<Token> {\n const deviceName = device ?? hostname();\n\n const body: Record<string, string> = {\n identifier: loginIdentifier,\n password,\n device_name: deviceName,\n };\n\n if (loginIdentifier === LoginIdentifier.CLIENT_ID) {\n body['client_id'] = identifier;\n } else {\n body['email'] = identifier;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/login`, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Authentication failed: invalid credentials', {\n status: 401,\n body: responseText,\n });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n async loginWithClientId(clientId: string, password: string, device?: string): Promise<Token> {\n return this.login(clientId, password, device, LoginIdentifier.CLIENT_ID);\n }\n\n async refresh(): Promise<Token> {\n const storedToken = this.tokenStorage.get();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n if (storedToken) {\n headers['Authorization'] = `Bearer ${storedToken.accessToken}`;\n }\n\n const response = await this.httpClient.request('POST', `${this.baseUrl}/auth/refresh`, { headers });\n const responseText = await response.text();\n\n if (response.status === 401) {\n throw new AuthenticationException('Token refresh failed: unauthorized', { status: 401, body: responseText });\n }\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n const data = this.parseResponse(responseText);\n const token = Token.fromArray(data);\n this.tokenStorage.set(token);\n return token;\n }\n\n private parseResponse(responseText: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n}\n","export class Token {\n constructor(\n public readonly accessToken: string,\n public readonly tokenType: string,\n public readonly expiresAt: Date,\n ) {}\n\n isExpired(bufferSeconds = 15): boolean {\n return new Date(Date.now() + bufferSeconds * 1000) >= this.expiresAt;\n }\n\n static fromArray(data: Record<string, unknown>): Token {\n let accessToken = String(data['access_token'] ?? '');\n if (accessToken.startsWith('Bearer ')) {\n accessToken = accessToken.slice(7);\n }\n\n const tokenType = String(data['token_type'] ?? 'Bearer');\n const expiresIn = typeof data['expires_in'] === 'number' ? data['expires_in'] : 3600;\n const expiresAt = new Date(Date.now() + expiresIn * 1000);\n\n return new Token(accessToken, tokenType, expiresAt);\n }\n\n toArray(): { access_token: string; token_type: string; expires_at: string } {\n return {\n access_token: this.accessToken,\n token_type: this.tokenType,\n expires_at: this.expiresAt.toISOString(),\n };\n }\n}\n","export const LoginIdentifier = {\n EMAIL: 'email',\n CLIENT_ID: 'client_id',\n} as const;\n\nexport type LoginIdentifier = (typeof LoginIdentifier)[keyof typeof LoginIdentifier];\n","export class TaxoraException extends Error {\n public readonly context: Record<string, unknown>;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message);\n this.name = 'TaxoraException';\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class AuthenticationException extends TaxoraException {\n public readonly statusCode = 401;\n\n constructor(message: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'AuthenticationException';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class HttpException extends TaxoraException {\n public readonly statusCode: number;\n public readonly responseBody: string;\n\n constructor(message: string, statusCode: number, responseBody: string, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'HttpException';\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getStatusCode(): number {\n return this.statusCode;\n }\n\n getResponseBody(): string {\n return this.responseBody;\n }\n}\n","export interface CompanyResource {\n id?: number;\n uuid?: string;\n name?: string;\n vat_uid?: string;\n address_line_1?: string | null;\n address_line_2?: string | null;\n street?: string | null;\n zip_code?: string | null;\n city?: string | null;\n country_code?: string | null;\n email?: string;\n phone_number?: string | null;\n api_rate_limit: number;\n vat_rate_limit: number;\n /**\n * @deprecated Use api_rate_limit and vat_rate_limit instead.\n */\n rate_limit?: number;\n state?: string;\n source?: string;\n [key: string]: unknown;\n}\n\nexport function normalizeCompanyResource(data: Record<string, unknown>): CompanyResource {\n const apiRateLimit = typeof data['api_rate_limit'] === 'number' ? data['api_rate_limit'] : undefined;\n const vatRateLimit = typeof data['vat_rate_limit'] === 'number' ? data['vat_rate_limit'] : undefined;\n const legacyRateLimit = typeof data['rate_limit'] === 'number' ? data['rate_limit'] : undefined;\n\n return {\n ...data,\n api_rate_limit: apiRateLimit ?? legacyRateLimit ?? 0,\n vat_rate_limit: vatRateLimit ?? legacyRateLimit ?? 0,\n };\n}\n","import { HttpException } from '../exceptions/HttpException.js';\nimport { normalizeCompanyResource, type CompanyResource } from '../dto/CompanyResource.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nexport class CompanyEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async get(): Promise<CompanyResource> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n\n const response = await this.httpClient.request('GET', `${this.baseUrl}/company`, { headers });\n const responseText = await response.text();\n\n if (!response.ok) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && typeof obj['data'] === 'object' && obj['data'] !== null) {\n return normalizeCompanyResource(obj['data'] as Record<string, unknown>);\n }\n\n return normalizeCompanyResource(obj);\n }\n}\n","export const VatState = {\n VALID: 'valid',\n INVALID: 'invalid',\n FRAUD: 'fraud',\n UNKNOWN: 'unknown',\n} as const;\n\nexport type VatState = (typeof VatState)[keyof typeof VatState];\n\nexport function getFailedVatStates(): VatState[] {\n return [VatState.INVALID, VatState.FRAUD];\n}\n\nconst DESCRIPTIONS: Record<VatState, string> = {\n [VatState.VALID]: 'The VAT number is valid and active.',\n [VatState.INVALID]: 'The VAT number is invalid or not registered.',\n [VatState.FRAUD]: 'The VAT number has been flagged as potentially fraudulent.',\n [VatState.UNKNOWN]: 'The VAT number state could not be determined.',\n};\n\nexport function describeVatState(state: VatState): string {\n return DESCRIPTIONS[state];\n}\n","interface CompanyAddressProps {\n fullAddress?: string | null;\n name?: string | null;\n street?: string | null;\n postalCode?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n raw?: string | null;\n}\n\nexport class CompanyAddress {\n public readonly fullAddress: string | null;\n public readonly name: string | null;\n public readonly street: string | null;\n public readonly postalCode: string | null;\n public readonly city: string | null;\n public readonly state: string | null;\n public readonly country: string | null;\n public readonly raw: string | null;\n\n constructor(props: CompanyAddressProps) {\n this.name = props.name ?? null;\n this.street = props.street ?? null;\n this.postalCode = props.postalCode ?? null;\n this.city = props.city ?? null;\n this.state = props.state ?? null;\n this.country = props.country ?? null;\n this.raw = props.raw ?? null;\n this.fullAddress = props.fullAddress ?? this.assembleFullAddress();\n }\n\n private assembleFullAddress(): string | null {\n const parts = [this.street, this.postalCode, this.city, this.country].filter(Boolean);\n return parts.length > 0 ? parts.join(', ') : null;\n }\n\n static from(value: unknown): CompanyAddress | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return CompanyAddress.fromArray(parsed as Record<string, unknown>, trimmed);\n }\n } catch {\n // Not valid JSON — treat as plain string\n }\n return new CompanyAddress({ raw: trimmed });\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n return CompanyAddress.fromArray(value as Record<string, unknown>, null);\n }\n\n return null;\n }\n\n static fromArray(data: Record<string, unknown>, raw: string | null): CompanyAddress {\n const get = (key: string): string | null => {\n const val = data[key] ?? data[key.replace(/_/g, '-')];\n return typeof val === 'string' && val.trim() ? val.trim() : null;\n };\n\n return new CompanyAddress({\n fullAddress: get('full_address'),\n name: get('name'),\n street: get('street'),\n postalCode: get('postal_code') ?? get('postalCode'),\n city: get('city'),\n state: get('state'),\n country: get('country'),\n raw,\n });\n }\n\n toArray(): Record<string, string | null> {\n return {\n full_address: this.fullAddress,\n name: this.name,\n street: this.street,\n postal_code: this.postalCode,\n city: this.city,\n state: this.state,\n country: this.country,\n };\n }\n\n toString(): string {\n return this.fullAddress ?? this.raw ?? '';\n }\n}\n","export class ScoreBreakdown {\n constructor(\n public readonly stepName: string,\n public readonly scoreContribution: number,\n public readonly metadata: Record<string, unknown>,\n ) {}\n\n static fromArray(data: Record<string, unknown>): ScoreBreakdown {\n return new ScoreBreakdown(\n typeof data['step_name'] === 'string' ? data['step_name'] : '',\n typeof data['score_contribution'] === 'number' ? data['score_contribution'] : 0,\n data['metadata'] !== null && typeof data['metadata'] === 'object' && !Array.isArray(data['metadata'])\n ? (data['metadata'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): { step_name: string; score_contribution: number; metadata: Record<string, unknown> } {\n return {\n step_name: this.stepName,\n score_contribution: this.scoreContribution,\n metadata: this.metadata,\n };\n }\n}\n","export class ProviderDocumentLine {\n constructor(\n public readonly id: number | null,\n public readonly vatUid: string | null,\n public readonly rowNumber: number | null,\n public readonly entryIdentifier: string | null,\n public readonly reference: string | null,\n public readonly meta: Record<string, unknown>,\n ) {}\n\n static fromArray(data: unknown): ProviderDocumentLine | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n return new ProviderDocumentLine(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['vat_uid'] === 'string' ? d['vat_uid'] : null,\n typeof d['row_number'] === 'number' ? d['row_number'] : null,\n typeof d['entry_identifier'] === 'string' ? d['entry_identifier'] : null,\n typeof d['reference'] === 'string' ? d['reference'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n vat_uid: this.vatUid,\n row_number: this.rowNumber,\n entry_identifier: this.entryIdentifier,\n reference: this.reference,\n meta: this.meta,\n };\n }\n}\n","import { ProviderDocumentLine } from './ProviderDocumentLine.js';\n\nexport class ProviderDocument {\n constructor(\n public readonly id: number | null,\n public readonly provider: string | null,\n public readonly documentType: string | null,\n public readonly state: string | null,\n public readonly documentDate: Date | null,\n public readonly mime: string | null,\n public readonly size: number | null,\n public readonly hash: string | null,\n public readonly meta: Record<string, unknown>,\n public readonly line: ProviderDocumentLine | null,\n ) {}\n\n static fromArray(data: unknown): ProviderDocument | null {\n if (data === null || data === undefined || typeof data !== 'object' || Array.isArray(data)) {\n return null;\n }\n const d = data as Record<string, unknown>;\n\n const documentDate =\n typeof d['document_date'] === 'string' && d['document_date'] ? new Date(d['document_date']) : null;\n\n return new ProviderDocument(\n typeof d['id'] === 'number' ? d['id'] : null,\n typeof d['provider'] === 'string' ? d['provider'] : null,\n typeof d['document_type'] === 'string' ? d['document_type'] : null,\n typeof d['state'] === 'string' ? d['state'] : null,\n documentDate,\n typeof d['mime'] === 'string' ? d['mime'] : null,\n typeof d['size'] === 'number' ? d['size'] : null,\n typeof d['hash'] === 'string' ? d['hash'] : null,\n d['meta'] !== null && typeof d['meta'] === 'object' && !Array.isArray(d['meta'])\n ? (d['meta'] as Record<string, unknown>)\n : {},\n ProviderDocumentLine.fromArray(d['line']),\n );\n }\n\n toArray(): Record<string, unknown> {\n return {\n id: this.id,\n provider: this.provider,\n document_type: this.documentType,\n state: this.state,\n document_date: this.documentDate?.toISOString() ?? null,\n mime: this.mime,\n size: this.size,\n hash: this.hash,\n meta: this.meta,\n line: this.line?.toArray() ?? null,\n };\n }\n}\n","import { VatState } from '../enums/VatState.js';\nimport { CompanyAddress } from './CompanyAddress.js';\nimport { ScoreBreakdown } from './ScoreBreakdown.js';\nimport { ProviderDocument } from './ProviderDocument.js';\n\nexport class VatResource {\n constructor(\n public readonly uuid: string | undefined,\n public readonly vatUid: string | undefined,\n public readonly state: VatState | undefined,\n public readonly countryCode: string | undefined,\n public readonly companyName: string | undefined,\n public readonly companyAddress: CompanyAddress | undefined,\n public readonly requestedCompanyName: string | undefined,\n public readonly requestedCompanyNameOriginal: string | undefined,\n public readonly requestedInputAddress: Record<string, string | null> | undefined,\n public readonly checkedAt: Date | undefined,\n public readonly score: number | undefined,\n public readonly scoreSource: string | undefined,\n public readonly scoreAttempts: Array<{ source?: string; score?: number }> | undefined,\n public readonly breakdown: ScoreBreakdown[] | undefined,\n public readonly environment: string | undefined,\n public readonly provider: string | undefined,\n public readonly usedProviders: string[] | undefined,\n public readonly providerValid: boolean | null | undefined,\n public readonly providerVatState: string | undefined,\n public readonly providerNote: string | undefined,\n public readonly providerLastCheckedAt: Date | undefined,\n public readonly hasApiError: boolean | null | undefined,\n public readonly errorMessage: string | null | undefined,\n public readonly nextApiRecheckAt: string | null | undefined,\n public readonly providerDocument: ProviderDocument | undefined,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatResource {\n const str = (key: string): string | undefined => {\n const v = data[key];\n return typeof v === 'string' ? v : undefined;\n };\n\n const stateRaw = str('state');\n const state =\n stateRaw !== undefined && Object.values(VatState).includes(stateRaw as VatState)\n ? (stateRaw as VatState)\n : undefined;\n\n const checkedAt = str('checked_at') ? new Date(data['checked_at'] as string) : undefined;\n const providerLastCheckedAt = str('provider_last_checked_at')\n ? new Date(data['provider_last_checked_at'] as string)\n : undefined;\n const hasApiError =\n data['has_api_error'] === null\n ? null\n : typeof data['has_api_error'] === 'boolean'\n ? data['has_api_error']\n : undefined;\n const errorMessage =\n data['error_message'] === null\n ? null\n : typeof data['error_message'] === 'string'\n ? data['error_message']\n : undefined;\n const nextApiRecheckAt =\n data['next_api_recheck_at'] === null\n ? null\n : typeof data['next_api_recheck_at'] === 'string'\n ? data['next_api_recheck_at']\n : undefined;\n const providerValid =\n data['provider_valid'] === null\n ? null\n : typeof data['provider_valid'] === 'boolean'\n ? data['provider_valid']\n : undefined;\n\n const breakdown = Array.isArray(data['breakdown'])\n ? (data['breakdown'] as Record<string, unknown>[]).map(ScoreBreakdown.fromArray)\n : undefined;\n\n const usedProviders = Array.isArray(data['used_providers'])\n ? (data['used_providers'] as unknown[]).filter((v): v is string => typeof v === 'string')\n : undefined;\n\n const scoreAttempts = Array.isArray(data['score_attempts'])\n ? (data['score_attempts'] as Record<string, unknown>[])\n : undefined;\n\n const requestedInputAddress =\n data['requested_input_address'] !== null &&\n typeof data['requested_input_address'] === 'object' &&\n !Array.isArray(data['requested_input_address'])\n ? (data['requested_input_address'] as Record<string, string | null>)\n : undefined;\n\n return new VatResource(\n str('uuid'),\n str('vat_uid'),\n state,\n str('country_code'),\n str('company_name'),\n CompanyAddress.from(data['company_address']) ?? undefined,\n str('requested_company_name'),\n str('requested_company_name_original'),\n requestedInputAddress,\n checkedAt,\n typeof data['score'] === 'number' ? data['score'] : undefined,\n str('score_source'),\n scoreAttempts,\n breakdown,\n str('environment'),\n str('provider'),\n usedProviders,\n providerValid,\n str('provider_vat_state'),\n str('provider_note'),\n providerLastCheckedAt,\n hasApiError,\n errorMessage,\n nextApiRecheckAt,\n ProviderDocument.fromArray(data['provider_document']) ?? undefined,\n );\n }\n\n getBackendLink(): string | null {\n if (!this.uuid) return null;\n if (this.environment === 'LIVE') {\n return `https://app.taxora.io/vat/history/${this.uuid}`;\n }\n return `https://app.sandbox.taxora.io/vat/history/${this.uuid}`;\n }\n\n isValid(useProviderState = false): boolean {\n if (useProviderState) {\n return this.isProviderValid();\n }\n\n return this.state === VatState.VALID;\n }\n\n isProviderValid(): boolean {\n if (this.providerValid !== undefined && this.providerValid !== null) {\n return this.providerValid;\n }\n\n return this.providerVatState === VatState.VALID;\n }\n\n toArray(): Record<string, unknown> {\n return {\n uuid: this.uuid,\n vat_uid: this.vatUid,\n state: this.state,\n country_code: this.countryCode,\n company_name: this.companyName,\n company_address: this.companyAddress?.toArray() ?? null,\n requested_company_name: this.requestedCompanyName,\n requested_company_name_original: this.requestedCompanyNameOriginal,\n requested_input_address: this.requestedInputAddress ?? null,\n checked_at: this.checkedAt?.toISOString() ?? null,\n score: this.score ?? null,\n score_source: this.scoreSource ?? null,\n score_attempts: this.scoreAttempts ?? null,\n breakdown: this.breakdown?.map((b) => b.toArray()) ?? null,\n environment: this.environment ?? null,\n provider: this.provider ?? null,\n used_providers: this.usedProviders ?? null,\n provider_valid: this.providerValid ?? null,\n provider_vat_state: this.providerVatState ?? null,\n provider_note: this.providerNote ?? null,\n provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,\n has_api_error: this.hasApiError ?? null,\n error_message: this.errorMessage ?? null,\n next_api_recheck_at: this.nextApiRecheckAt ?? null,\n provider_document: this.providerDocument?.toArray() ?? null,\n };\n }\n}\n","import { VatResource } from './VatResource.js';\n\nexport class VatCollection implements Iterable<VatResource> {\n private readonly items: VatResource[];\n public readonly self: string | undefined;\n\n constructor(items: VatResource[], self?: string) {\n this.items = items;\n this.self = self;\n }\n\n static fromResponse(data: unknown): VatCollection {\n if (Array.isArray(data)) {\n return new VatCollection((data as Record<string, unknown>[]).map(VatResource.fromArray));\n }\n\n if (typeof data === 'object' && data !== null) {\n const obj = data as Record<string, unknown>;\n const items = Array.isArray(obj['data'])\n ? (obj['data'] as Record<string, unknown>[]).map(VatResource.fromArray)\n : [];\n const self = typeof obj['self'] === 'string' ? obj['self'] : undefined;\n return new VatCollection(items, self);\n }\n\n return new VatCollection([]);\n }\n\n [Symbol.iterator](): Iterator<VatResource> {\n return this.items[Symbol.iterator]();\n }\n\n get length(): number {\n return this.items.length;\n }\n\n all(): VatResource[] {\n return [...this.items];\n }\n}\n","export class VatCertificateExport {\n constructor(\n public readonly exportId: string,\n public readonly message?: string,\n ) {}\n\n static fromArray(data: Record<string, unknown>): VatCertificateExport {\n return new VatCertificateExport(\n typeof data['export_id'] === 'string' ? data['export_id'] : '',\n typeof data['message'] === 'string' ? data['message'] : undefined,\n );\n }\n\n toArray(): { export_id: string; message?: string } {\n const result: { export_id: string; message?: string } = { export_id: this.exportId };\n if (this.message !== undefined) result.message = this.message;\n return result;\n }\n}\n","import { TaxoraException } from '../exceptions/TaxoraException.js';\n\ninterface VatValidationAddressInputProps {\n addressLine1?: string;\n addressLine2?: string;\n postalCode?: string;\n city?: string;\n countryCode?: string;\n}\n\nconst ALLOWED_KEYS = new Set(['address_line_1', 'address_line_2', 'postal_code', 'city', 'country_code']);\n\nexport class VatValidationAddressInput {\n public readonly addressLine1?: string;\n public readonly addressLine2?: string;\n public readonly postalCode?: string;\n public readonly city?: string;\n public readonly countryCode?: string;\n\n constructor(props: VatValidationAddressInputProps) {\n if (props.addressLine1 !== undefined && props.addressLine1.length > 255) {\n throw new TaxoraException('addressLine1 must not exceed 255 characters');\n }\n if (props.addressLine2 !== undefined && props.addressLine2.length > 255) {\n throw new TaxoraException('addressLine2 must not exceed 255 characters');\n }\n if (props.countryCode !== undefined && props.countryCode.length !== 2) {\n throw new TaxoraException('countryCode must be exactly 2 characters (ISO 3166-1 alpha-2)');\n }\n\n this.addressLine1 = props.addressLine1;\n this.addressLine2 = props.addressLine2;\n this.postalCode = props.postalCode;\n this.city = props.city;\n this.countryCode = props.countryCode;\n }\n\n static fromArray(data: Record<string, unknown>): VatValidationAddressInput {\n for (const key of Object.keys(data)) {\n if (!ALLOWED_KEYS.has(key)) {\n throw new TaxoraException(`Unsupported field: \"${key}\". Allowed fields: ${[...ALLOWED_KEYS].join(', ')}`);\n }\n }\n\n const getString = (key: string): string | undefined => {\n const val = data[key];\n if (typeof val !== 'string') return undefined;\n const trimmed = val.trim();\n return trimmed || undefined;\n };\n\n const countryCode = getString('country_code');\n\n return new VatValidationAddressInput({\n addressLine1: getString('address_line_1'),\n addressLine2: getString('address_line_2'),\n postalCode: getString('postal_code'),\n city: getString('city'),\n countryCode: countryCode ? countryCode.toUpperCase() : undefined,\n });\n }\n\n toArray(): Record<string, string> {\n const result: Record<string, string> = {};\n if (this.addressLine1 !== undefined) result['address_line_1'] = this.addressLine1;\n if (this.addressLine2 !== undefined) result['address_line_2'] = this.addressLine2;\n if (this.postalCode !== undefined) result['postal_code'] = this.postalCode;\n if (this.city !== undefined) result['city'] = this.city;\n if (this.countryCode !== undefined) result['country_code'] = this.countryCode;\n return result;\n }\n}\n","import { TaxoraException } from './TaxoraException.js';\n\nexport class ValidationException extends TaxoraException {\n public readonly statusCode = 422;\n private readonly errors: Record<string, string[]>;\n\n constructor(message: string, errors: Record<string, string[]>, context: Record<string, unknown> = {}) {\n super(message, context);\n this.name = 'ValidationException';\n this.errors = errors;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n getErrors(): Record<string, string[]> {\n return this.errors;\n }\n}\n","import { VatResource } from '../dto/VatResource.js';\nimport { VatCollection } from '../dto/VatCollection.js';\nimport { VatCertificateExport } from '../dto/VatCertificateExport.js';\nimport { VatValidationAddressInput } from '../dto/VatValidationAddressInput.js';\nimport { type Language } from '../enums/Language.js';\nimport { HttpException } from '../exceptions/HttpException.js';\nimport { ValidationException } from '../exceptions/ValidationException.js';\nimport { TaxoraException } from '../exceptions/TaxoraException.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport class VatEndpoint {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly httpClient: HttpClientInterface,\n ) {}\n\n async validate(\n vatUid: string,\n companyName?: string,\n provider?: string,\n addressInput?: VatValidationAddressInput | Record<string, string>,\n ): Promise<VatResource> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n if (companyName) body['company_name'] = companyName;\n if (provider) body['source'] = provider;\n\n if (addressInput) {\n body['address_input'] = addressInput instanceof VatValidationAddressInput ? addressInput.toArray() : addressInput;\n }\n\n return this.validateWithGatewayRetry(body, 2);\n }\n\n private async validateWithGatewayRetry(body: Record<string, unknown>, attemptsLeft: number): Promise<VatResource> {\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate`, body);\n\n if (response.status === 504) {\n if (attemptsLeft <= 1) {\n const text = await response.text();\n throw new HttpException('VAT validation timed out after multiple attempts', 504, text);\n }\n return this.validateWithGatewayRetry(body, attemptsLeft - 1);\n }\n\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async validateMultiple(vatUids: string[], companyNames?: string[], provider?: string): Promise<VatCollection> {\n const body: Record<string, unknown> = { vat_uids: vatUids };\n if (companyNames) body['company_names'] = companyNames;\n if (provider) body['source'] = provider;\n\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/multiple`, body);\n const data = await this.parseJsonResponse(response);\n\n return VatCollection.fromResponse(data);\n }\n\n async validateSchema(vatUid: string): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = { vat_uid: vatUid };\n const response = await this.sendRequest('POST', `${this.baseUrl}/vat/validate/schema`, body);\n return this.parseJsonResponse(response);\n }\n\n async state(vatUid: string): Promise<VatResource> {\n const response = await this.sendRequest('GET', `${this.baseUrl}/vat/state/${encodeURIComponent(vatUid)}`);\n const data = await this.parseJsonResponse(response);\n return VatResource.fromArray(data);\n }\n\n async history(vatUid?: string): Promise<VatCollection> {\n let url = `${this.baseUrl}/vat/history`;\n if (vatUid) url += `?vat_uid=${encodeURIComponent(vatUid)}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async search(term?: string, perPage?: number): Promise<VatCollection> {\n const params = new URLSearchParams();\n if (term) params.set('term', term);\n if (perPage !== undefined) params.set('per_page', String(perPage));\n\n const queryString = params.toString();\n const url = `${this.baseUrl}/vat/search${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.sendRequest('GET', url);\n const data = await this.parseJsonResponse(response);\n return VatCollection.fromResponse(data);\n }\n\n async certificate(uuid: string, lang?: Language): Promise<Uint8Array> {\n let url = `${this.baseUrl}/vat/certificate/${encodeURIComponent(uuid)}`;\n if (lang) url += `?lang=${lang}`;\n\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n async certificatesBulkExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/bulk-export`, fromDate, toDate, countries, lang);\n }\n\n async certificatesListExport(\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n return this.exportRequest(`${this.baseUrl}/vat/certificates/list-export`, fromDate, toDate, countries, lang);\n }\n\n private async exportRequest(\n url: string,\n fromDate: Date | string,\n toDate: Date | string,\n countries?: string[],\n lang?: Language,\n ): Promise<VatCertificateExport> {\n const from = this.formatDate(fromDate);\n const to = this.formatDate(toDate);\n\n const body: Record<string, unknown> = { from_date: from, to_date: to };\n if (countries && countries.length > 0) body['countries'] = countries;\n if (lang) body['lang'] = lang;\n\n const response = await this.sendRequest('POST', url, body);\n const data = await this.parseJsonResponse(response, [200, 202]);\n\n const exportObj = VatCertificateExport.fromArray(data);\n if (!exportObj.exportId) {\n throw new TaxoraException('Export response is missing export_id');\n }\n\n return exportObj;\n }\n\n async downloadBulkExport(exportId: string): Promise<Uint8Array> {\n const url = `${this.baseUrl}/vat/certificates/bulk-export/${encodeURIComponent(exportId)}/download`;\n const response = await this.sendBinaryRequest('GET', url);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n };\n const token = this.tokenStorage.get();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n return headers;\n }\n\n private async sendRequest(method: string, url: string, body?: Record<string, unknown>): Promise<Response> {\n const options: RequestInit = { headers: this.buildHeaders() };\n if (body) options.body = JSON.stringify(body);\n\n return this.httpClient.request(method, url, options);\n }\n\n private async sendBinaryRequest(method: string, url: string): Promise<Response> {\n const headers = this.buildHeaders();\n delete headers['Content-Type'];\n\n const response = await this.httpClient.request(method, url, { headers });\n if (!response.ok) {\n const text = await response.text();\n throw new HttpException(`HTTP error ${response.status}`, response.status, text);\n }\n return response;\n }\n\n private async parseJsonResponse(\n response: Response,\n acceptedStatuses: number[] = [200],\n ): Promise<Record<string, unknown>> {\n const responseText = await response.text();\n\n if (response.status === 422) {\n let errors: Record<string, string[]> = {};\n try {\n const parsed = JSON.parse(responseText) as Record<string, unknown>;\n if (parsed['errors'] !== null && typeof parsed['errors'] === 'object' && !Array.isArray(parsed['errors'])) {\n errors = parsed['errors'] as Record<string, string[]>;\n }\n } catch {\n // ignore parse errors\n }\n throw new ValidationException('Validation failed', errors);\n }\n\n if (!response.ok && !acceptedStatuses.includes(response.status)) {\n throw new HttpException(`HTTP error ${response.status}`, response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n throw new HttpException('Invalid JSON response', 0, responseText);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new HttpException('Unexpected response format', 0, responseText);\n }\n\n const obj = parsed as Record<string, unknown>;\n if (obj['data'] !== undefined && (typeof obj['data'] === 'object' || Array.isArray(obj['data']))) {\n return obj['data'] as Record<string, unknown>;\n }\n\n return obj;\n }\n\n private formatDate(date: Date | string): string {\n if (date instanceof Date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n if (!DATE_REGEX.test(date)) {\n throw new TaxoraException(`Invalid date format: \"${date}\". Expected YYYY-MM-DD.`);\n }\n\n return date;\n }\n}\n","export const Environment = {\n SANDBOX: 'sandbox',\n PRODUCTION: 'production',\n} as const;\n\nexport type Environment = (typeof Environment)[keyof typeof Environment];\n\nconst BASE_URLS: Record<Environment, string> = {\n [Environment.SANDBOX]: 'https://sandbox.taxora.io/v1',\n [Environment.PRODUCTION]: 'https://api.taxora.io/v1',\n};\n\nexport function getBaseUrl(environment: Environment): string {\n return BASE_URLS[environment];\n}\n","import { type HttpClientInterface } from './HttpClientInterface.js';\n\nexport class FetchHttpClient implements HttpClientInterface {\n async request(method: string, url: string, options: RequestInit = {}): Promise<Response> {\n return fetch(url, { ...options, method });\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nexport class InMemoryTokenStorage implements TokenStorageInterface {\n private token: Token | null = null;\n\n get(): Token | null {\n return this.token;\n }\n\n set(token: Token): void {\n this.token = token;\n }\n\n clear(): void {\n this.token = null;\n }\n}\n","import { type Token } from '../dto/Token.js';\nimport { AuthenticationException } from '../exceptions/AuthenticationException.js';\nimport { type HttpClientInterface } from './HttpClientInterface.js';\nimport { type TokenStorageInterface } from './TokenStorageInterface.js';\n\nconst AUTH_PATH_PATTERN = /\\/auth\\//;\n\n/**\n * HTTP client wrapper that handles:\n * - Preemptive token refresh when the stored token is expired\n * - Automatic retry with a fresh token on 401 responses\n * - Passthrough for /auth/ routes (no interception)\n */\nexport class AuthRetryHttpClient implements HttpClientInterface {\n constructor(\n private readonly inner: HttpClientInterface,\n private readonly tokenStorage: TokenStorageInterface,\n private readonly refreshFn: () => Promise<Token>,\n ) {}\n\n async request(method: string, url: string, options?: RequestInit): Promise<Response> {\n // Auth routes bypass all retry logic\n if (AUTH_PATH_PATTERN.test(url)) {\n return this.inner.request(method, url, options);\n }\n\n // Preemptive refresh if token is expired\n const currentToken = this.tokenStorage.get();\n if (currentToken?.isExpired()) {\n await this.refreshFn();\n }\n\n // Build request with potentially refreshed token\n const updatedOptions = this.injectAuthHeader(options);\n const response = await this.inner.request(method, url, updatedOptions);\n\n // 401: refresh once and retry\n if (response.status === 401) {\n await this.refreshFn();\n const retryOptions = this.injectAuthHeader(options);\n const retryResponse = await this.inner.request(method, url, retryOptions);\n\n if (retryResponse.status === 401) {\n const body = await retryResponse.text();\n throw new AuthenticationException('Authentication failed after token refresh', { status: 401, body });\n }\n\n return retryResponse;\n }\n\n return response;\n }\n\n private injectAuthHeader(options?: RequestInit): RequestInit {\n const token = this.tokenStorage.get();\n if (!token) return options ?? {};\n\n const existing = options?.headers ?? {};\n const headers = { ...(existing as Record<string, string>), Authorization: `Bearer ${token.accessToken}` };\n return { ...(options ?? {}), headers };\n }\n}\n","import { AuthEndpoint } from '../endpoints/AuthEndpoint.js';\nimport { CompanyEndpoint } from '../endpoints/CompanyEndpoint.js';\nimport { VatEndpoint } from '../endpoints/VatEndpoint.js';\nimport { Environment, getBaseUrl } from '../enums/Environment.js';\nimport { type HttpClientInterface } from '../http/HttpClientInterface.js';\nimport { FetchHttpClient } from '../http/FetchHttpClient.js';\nimport { InMemoryTokenStorage } from '../http/InMemoryTokenStorage.js';\nimport { type TokenStorageInterface } from '../http/TokenStorageInterface.js';\nimport { AuthRetryHttpClient } from '../http/AuthRetryHttpClient.js';\n\nexport interface TaxoraClientOptions {\n apiKey: string;\n environment?: Environment;\n tokenStorage?: TokenStorageInterface;\n httpClient?: HttpClientInterface;\n}\n\nexport class TaxoraClient {\n public readonly auth: AuthEndpoint;\n public readonly vat: VatEndpoint;\n public readonly company: CompanyEndpoint;\n public readonly baseUrl: string;\n\n constructor(options: TaxoraClientOptions) {\n const environment = options.environment ?? Environment.SANDBOX;\n const tokenStorage = options.tokenStorage ?? new InMemoryTokenStorage();\n const httpClient = options.httpClient ?? new FetchHttpClient();\n\n this.baseUrl = getBaseUrl(environment);\n\n // Auth endpoint uses the raw HTTP client — no retry interception for auth routes\n this.auth = new AuthEndpoint(this.baseUrl, options.apiKey, tokenStorage, httpClient);\n\n // All other endpoints use the retry-capable client that handles 401 auto-refresh\n const retryClient = new AuthRetryHttpClient(httpClient, tokenStorage, () => this.auth.refresh());\n\n this.vat = new VatEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n this.company = new CompanyEndpoint(this.baseUrl, options.apiKey, tokenStorage, retryClient);\n }\n}\n","import { TaxoraClient, type TaxoraClientOptions } from './TaxoraClient.js';\n\nexport class TaxoraClientFactory {\n static create(options: TaxoraClientOptions): TaxoraClient {\n return new TaxoraClient(options);\n }\n}\n","export const ApiVersion = {\n V1: 'v1',\n} as const;\n\nexport type ApiVersion = (typeof ApiVersion)[keyof typeof ApiVersion];\n","export const Language = {\n ENGLISH: 'en',\n GERMAN: 'de',\n} as const;\n\nexport type Language = (typeof Language)[keyof typeof Language];\n"],"mappings":"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","names":["parsed"]}
|