@taxora/sdk 1.0.5 → 1.0.6
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 +30 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -3
- package/dist/index.d.ts +30 -3
- package/dist/index.js +30 -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, providerVatState, providerNote, providerLastCheckedAt, hasApiError, errorMessage, nextApiRecheckAt, providerDocument) {
|
|
493
505
|
this.uuid = uuid;
|
|
494
506
|
this.vatUid = vatUid;
|
|
495
507
|
this.state = state;
|
|
@@ -510,6 +522,9 @@ var VatResource = class _VatResource {
|
|
|
510
522
|
this.providerVatState = providerVatState;
|
|
511
523
|
this.providerNote = providerNote;
|
|
512
524
|
this.providerLastCheckedAt = providerLastCheckedAt;
|
|
525
|
+
this.hasApiError = hasApiError;
|
|
526
|
+
this.errorMessage = errorMessage;
|
|
527
|
+
this.nextApiRecheckAt = nextApiRecheckAt;
|
|
513
528
|
this.providerDocument = providerDocument;
|
|
514
529
|
}
|
|
515
530
|
uuid;
|
|
@@ -532,6 +547,9 @@ var VatResource = class _VatResource {
|
|
|
532
547
|
providerVatState;
|
|
533
548
|
providerNote;
|
|
534
549
|
providerLastCheckedAt;
|
|
550
|
+
hasApiError;
|
|
551
|
+
errorMessage;
|
|
552
|
+
nextApiRecheckAt;
|
|
535
553
|
providerDocument;
|
|
536
554
|
static fromArray(data) {
|
|
537
555
|
const str = (key) => {
|
|
@@ -542,6 +560,9 @@ var VatResource = class _VatResource {
|
|
|
542
560
|
const state = stateRaw !== void 0 && Object.values(VatState).includes(stateRaw) ? stateRaw : void 0;
|
|
543
561
|
const checkedAt = str("checked_at") ? new Date(data["checked_at"]) : void 0;
|
|
544
562
|
const providerLastCheckedAt = str("provider_last_checked_at") ? new Date(data["provider_last_checked_at"]) : void 0;
|
|
563
|
+
const hasApiError = data["has_api_error"] === null ? null : typeof data["has_api_error"] === "boolean" ? data["has_api_error"] : void 0;
|
|
564
|
+
const errorMessage = data["error_message"] === null ? null : typeof data["error_message"] === "string" ? data["error_message"] : void 0;
|
|
565
|
+
const nextApiRecheckAt = data["next_api_recheck_at"] === null ? null : typeof data["next_api_recheck_at"] === "string" ? data["next_api_recheck_at"] : void 0;
|
|
545
566
|
const breakdown = Array.isArray(data["breakdown"]) ? data["breakdown"].map(ScoreBreakdown.fromArray) : void 0;
|
|
546
567
|
const usedProviders = Array.isArray(data["used_providers"]) ? data["used_providers"].filter((v) => typeof v === "string") : void 0;
|
|
547
568
|
const scoreAttempts = Array.isArray(data["score_attempts"]) ? data["score_attempts"] : void 0;
|
|
@@ -567,6 +588,9 @@ var VatResource = class _VatResource {
|
|
|
567
588
|
str("provider_vat_state"),
|
|
568
589
|
str("provider_note"),
|
|
569
590
|
providerLastCheckedAt,
|
|
591
|
+
hasApiError,
|
|
592
|
+
errorMessage,
|
|
593
|
+
nextApiRecheckAt,
|
|
570
594
|
ProviderDocument.fromArray(data["provider_document"]) ?? void 0
|
|
571
595
|
);
|
|
572
596
|
}
|
|
@@ -599,6 +623,9 @@ var VatResource = class _VatResource {
|
|
|
599
623
|
provider_vat_state: this.providerVatState ?? null,
|
|
600
624
|
provider_note: this.providerNote ?? null,
|
|
601
625
|
provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,
|
|
626
|
+
has_api_error: this.hasApiError ?? null,
|
|
627
|
+
error_message: this.errorMessage ?? null,
|
|
628
|
+
next_api_recheck_at: this.nextApiRecheckAt ?? null,
|
|
602
629
|
provider_document: this.providerDocument?.toArray() ?? null
|
|
603
630
|
};
|
|
604
631
|
}
|
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 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\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 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 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 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: {
|
|
@@ -151,11 +175,14 @@ declare class VatResource {
|
|
|
151
175
|
readonly providerVatState: string | undefined;
|
|
152
176
|
readonly providerNote: string | undefined;
|
|
153
177
|
readonly providerLastCheckedAt: Date | undefined;
|
|
178
|
+
readonly hasApiError: boolean | null | undefined;
|
|
179
|
+
readonly errorMessage: string | null | undefined;
|
|
180
|
+
readonly nextApiRecheckAt: string | null | undefined;
|
|
154
181
|
readonly providerDocument: ProviderDocument | undefined;
|
|
155
182
|
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
183
|
source?: string;
|
|
157
184
|
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);
|
|
185
|
+
}> | undefined, breakdown: ScoreBreakdown[] | undefined, environment: string | undefined, provider: string | undefined, usedProviders: string[] | 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
186
|
static fromArray(data: Record<string, unknown>): VatResource;
|
|
160
187
|
getBackendLink(): string | null;
|
|
161
188
|
toArray(): Record<string, unknown>;
|
|
@@ -312,4 +339,4 @@ declare class AuthRetryHttpClient implements HttpClientInterface {
|
|
|
312
339
|
private injectAuthHeader;
|
|
313
340
|
}
|
|
314
341
|
|
|
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 };
|
|
342
|
+
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: {
|
|
@@ -151,11 +175,14 @@ declare class VatResource {
|
|
|
151
175
|
readonly providerVatState: string | undefined;
|
|
152
176
|
readonly providerNote: string | undefined;
|
|
153
177
|
readonly providerLastCheckedAt: Date | undefined;
|
|
178
|
+
readonly hasApiError: boolean | null | undefined;
|
|
179
|
+
readonly errorMessage: string | null | undefined;
|
|
180
|
+
readonly nextApiRecheckAt: string | null | undefined;
|
|
154
181
|
readonly providerDocument: ProviderDocument | undefined;
|
|
155
182
|
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
183
|
source?: string;
|
|
157
184
|
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);
|
|
185
|
+
}> | undefined, breakdown: ScoreBreakdown[] | undefined, environment: string | undefined, provider: string | undefined, usedProviders: string[] | 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
186
|
static fromArray(data: Record<string, unknown>): VatResource;
|
|
160
187
|
getBackendLink(): string | null;
|
|
161
188
|
toArray(): Record<string, unknown>;
|
|
@@ -312,4 +339,4 @@ declare class AuthRetryHttpClient implements HttpClientInterface {
|
|
|
312
339
|
private injectAuthHeader;
|
|
313
340
|
}
|
|
314
341
|
|
|
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 };
|
|
342
|
+
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, providerVatState, providerNote, providerLastCheckedAt, hasApiError, errorMessage, nextApiRecheckAt, providerDocument) {
|
|
439
451
|
this.uuid = uuid;
|
|
440
452
|
this.vatUid = vatUid;
|
|
441
453
|
this.state = state;
|
|
@@ -456,6 +468,9 @@ var VatResource = class _VatResource {
|
|
|
456
468
|
this.providerVatState = providerVatState;
|
|
457
469
|
this.providerNote = providerNote;
|
|
458
470
|
this.providerLastCheckedAt = providerLastCheckedAt;
|
|
471
|
+
this.hasApiError = hasApiError;
|
|
472
|
+
this.errorMessage = errorMessage;
|
|
473
|
+
this.nextApiRecheckAt = nextApiRecheckAt;
|
|
459
474
|
this.providerDocument = providerDocument;
|
|
460
475
|
}
|
|
461
476
|
uuid;
|
|
@@ -478,6 +493,9 @@ var VatResource = class _VatResource {
|
|
|
478
493
|
providerVatState;
|
|
479
494
|
providerNote;
|
|
480
495
|
providerLastCheckedAt;
|
|
496
|
+
hasApiError;
|
|
497
|
+
errorMessage;
|
|
498
|
+
nextApiRecheckAt;
|
|
481
499
|
providerDocument;
|
|
482
500
|
static fromArray(data) {
|
|
483
501
|
const str = (key) => {
|
|
@@ -488,6 +506,9 @@ var VatResource = class _VatResource {
|
|
|
488
506
|
const state = stateRaw !== void 0 && Object.values(VatState).includes(stateRaw) ? stateRaw : void 0;
|
|
489
507
|
const checkedAt = str("checked_at") ? new Date(data["checked_at"]) : void 0;
|
|
490
508
|
const providerLastCheckedAt = str("provider_last_checked_at") ? new Date(data["provider_last_checked_at"]) : void 0;
|
|
509
|
+
const hasApiError = data["has_api_error"] === null ? null : typeof data["has_api_error"] === "boolean" ? data["has_api_error"] : void 0;
|
|
510
|
+
const errorMessage = data["error_message"] === null ? null : typeof data["error_message"] === "string" ? data["error_message"] : void 0;
|
|
511
|
+
const nextApiRecheckAt = data["next_api_recheck_at"] === null ? null : typeof data["next_api_recheck_at"] === "string" ? data["next_api_recheck_at"] : void 0;
|
|
491
512
|
const breakdown = Array.isArray(data["breakdown"]) ? data["breakdown"].map(ScoreBreakdown.fromArray) : void 0;
|
|
492
513
|
const usedProviders = Array.isArray(data["used_providers"]) ? data["used_providers"].filter((v) => typeof v === "string") : void 0;
|
|
493
514
|
const scoreAttempts = Array.isArray(data["score_attempts"]) ? data["score_attempts"] : void 0;
|
|
@@ -513,6 +534,9 @@ var VatResource = class _VatResource {
|
|
|
513
534
|
str("provider_vat_state"),
|
|
514
535
|
str("provider_note"),
|
|
515
536
|
providerLastCheckedAt,
|
|
537
|
+
hasApiError,
|
|
538
|
+
errorMessage,
|
|
539
|
+
nextApiRecheckAt,
|
|
516
540
|
ProviderDocument.fromArray(data["provider_document"]) ?? void 0
|
|
517
541
|
);
|
|
518
542
|
}
|
|
@@ -545,6 +569,9 @@ var VatResource = class _VatResource {
|
|
|
545
569
|
provider_vat_state: this.providerVatState ?? null,
|
|
546
570
|
provider_note: this.providerNote ?? null,
|
|
547
571
|
provider_last_checked_at: this.providerLastCheckedAt?.toISOString() ?? null,
|
|
572
|
+
has_api_error: this.hasApiError ?? null,
|
|
573
|
+
error_message: this.errorMessage ?? null,
|
|
574
|
+
next_api_recheck_at: this.nextApiRecheckAt ?? null,
|
|
548
575
|
provider_document: this.providerDocument?.toArray() ?? null
|
|
549
576
|
};
|
|
550
577
|
}
|
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":"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","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 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\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 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 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 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"]}
|