@frihet/sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -0
- package/dist/index.cjs +542 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +458 -0
- package/dist/index.d.ts +458 -0
- package/dist/index.js +500 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
// src/error.ts
|
|
2
|
+
var FrihetError = class extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "FrihetError";
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
var APIError = class extends FrihetError {
|
|
9
|
+
status;
|
|
10
|
+
code;
|
|
11
|
+
requestId;
|
|
12
|
+
constructor(status, code, message, requestId) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "APIError";
|
|
15
|
+
this.status = status;
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.requestId = requestId;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var AuthenticationError = class extends APIError {
|
|
21
|
+
constructor(message = "Invalid or missing API key") {
|
|
22
|
+
super(401, "authentication_error", message);
|
|
23
|
+
this.name = "AuthenticationError";
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var NotFoundError = class extends APIError {
|
|
27
|
+
constructor(message = "Resource not found") {
|
|
28
|
+
super(404, "not_found", message);
|
|
29
|
+
this.name = "NotFoundError";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
var ValidationError = class extends APIError {
|
|
33
|
+
details;
|
|
34
|
+
constructor(message, details) {
|
|
35
|
+
super(400, "validation_error", message);
|
|
36
|
+
this.name = "ValidationError";
|
|
37
|
+
this.details = details;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var RateLimitError = class extends APIError {
|
|
41
|
+
retryAfter;
|
|
42
|
+
constructor(retryAfter) {
|
|
43
|
+
super(429, "rate_limit_exceeded", "Rate limit exceeded. Please retry later.");
|
|
44
|
+
this.name = "RateLimitError";
|
|
45
|
+
this.retryAfter = retryAfter;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var TimeoutError = class extends FrihetError {
|
|
49
|
+
constructor(timeoutMs) {
|
|
50
|
+
super(`Request timed out after ${timeoutMs}ms`);
|
|
51
|
+
this.name = "TimeoutError";
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// src/client.ts
|
|
56
|
+
var DEFAULT_BASE_URL = "https://api.frihet.io/v1";
|
|
57
|
+
var DEFAULT_TIMEOUT_MS = 3e4;
|
|
58
|
+
var MAX_RETRIES = 3;
|
|
59
|
+
var BASE_RETRY_DELAY_MS = 1e3;
|
|
60
|
+
var SDK_VERSION = "1.0.0";
|
|
61
|
+
var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([429, 500, 502, 503, 504]);
|
|
62
|
+
var HttpClient = class {
|
|
63
|
+
apiKey;
|
|
64
|
+
baseUrl;
|
|
65
|
+
timeout;
|
|
66
|
+
constructor(opts) {
|
|
67
|
+
if (!opts.apiKey) {
|
|
68
|
+
throw new Error("apiKey is required. Get one at https://app.frihet.io/settings/security");
|
|
69
|
+
}
|
|
70
|
+
this.apiKey = opts.apiKey;
|
|
71
|
+
this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
72
|
+
this.timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
73
|
+
}
|
|
74
|
+
get defaultHeaders() {
|
|
75
|
+
return {
|
|
76
|
+
"X-API-Key": this.apiKey,
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
"Accept": "application/json",
|
|
79
|
+
"User-Agent": `@frihet/sdk/${SDK_VERSION} (node)`
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async get(path, query, opts) {
|
|
83
|
+
return this.request("GET", path, void 0, query, opts);
|
|
84
|
+
}
|
|
85
|
+
async post(path, body, opts) {
|
|
86
|
+
return this.request("POST", path, body, void 0, opts);
|
|
87
|
+
}
|
|
88
|
+
async patch(path, body, opts) {
|
|
89
|
+
return this.request("PATCH", path, body, void 0, opts);
|
|
90
|
+
}
|
|
91
|
+
async del(path, opts) {
|
|
92
|
+
return this.request("DELETE", path, void 0, void 0, opts);
|
|
93
|
+
}
|
|
94
|
+
async getPage(path, query, opts) {
|
|
95
|
+
const raw = await this.requestRaw("GET", path, void 0, query, opts);
|
|
96
|
+
const body = await raw.json();
|
|
97
|
+
const page = this.extractPageFromEnvelope(body);
|
|
98
|
+
if (!page) {
|
|
99
|
+
throw new APIError(200, "invalid_response", "Expected paginated response with data array", this.extractRequestId(raw));
|
|
100
|
+
}
|
|
101
|
+
return page;
|
|
102
|
+
}
|
|
103
|
+
async getRaw(path, opts) {
|
|
104
|
+
const response = await this.requestRaw("GET", path, void 0, void 0, opts);
|
|
105
|
+
return response.arrayBuffer();
|
|
106
|
+
}
|
|
107
|
+
async request(method, path, body, query, opts) {
|
|
108
|
+
const response = await this.requestRaw(method, path, body, query, opts);
|
|
109
|
+
if (response.status === 204) {
|
|
110
|
+
return void 0;
|
|
111
|
+
}
|
|
112
|
+
const json = await response.json();
|
|
113
|
+
return this.unwrapEnvelope(json);
|
|
114
|
+
}
|
|
115
|
+
async requestRaw(method, path, body, query, opts, retryCount = 0) {
|
|
116
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
117
|
+
if (query) {
|
|
118
|
+
for (const [key, value] of Object.entries(query)) {
|
|
119
|
+
if (value !== void 0) url.searchParams.set(key, String(value));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const headers = { ...this.defaultHeaders };
|
|
123
|
+
if (opts?.idempotencyKey) {
|
|
124
|
+
headers["Idempotency-Key"] = opts.idempotencyKey;
|
|
125
|
+
}
|
|
126
|
+
const controller = new AbortController();
|
|
127
|
+
const timeoutMs = opts?.timeout ?? this.timeout;
|
|
128
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
129
|
+
let response;
|
|
130
|
+
try {
|
|
131
|
+
response = await fetch(url.toString(), {
|
|
132
|
+
method,
|
|
133
|
+
headers,
|
|
134
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
135
|
+
signal: opts?.signal ?? controller.signal
|
|
136
|
+
});
|
|
137
|
+
} catch (err) {
|
|
138
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
139
|
+
throw new TimeoutError(timeoutMs);
|
|
140
|
+
}
|
|
141
|
+
if (retryCount < MAX_RETRIES) {
|
|
142
|
+
const delayMs = BASE_RETRY_DELAY_MS * Math.pow(2, retryCount);
|
|
143
|
+
await new Promise((r) => setTimeout(r, delayMs));
|
|
144
|
+
return this.requestRaw(method, path, body, query, opts, retryCount + 1);
|
|
145
|
+
}
|
|
146
|
+
throw err;
|
|
147
|
+
} finally {
|
|
148
|
+
clearTimeout(timeoutId);
|
|
149
|
+
}
|
|
150
|
+
if (RETRYABLE_STATUS_CODES.has(response.status) && retryCount < MAX_RETRIES) {
|
|
151
|
+
if (response.status === 429) {
|
|
152
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
153
|
+
const delayMs = retryAfter ? parseInt(retryAfter, 10) * 1e3 : BASE_RETRY_DELAY_MS * Math.pow(2, retryCount);
|
|
154
|
+
await new Promise((r) => setTimeout(r, delayMs));
|
|
155
|
+
} else {
|
|
156
|
+
const delayMs = BASE_RETRY_DELAY_MS * Math.pow(2, retryCount);
|
|
157
|
+
await new Promise((r) => setTimeout(r, delayMs));
|
|
158
|
+
}
|
|
159
|
+
return this.requestRaw(method, path, body, query, opts, retryCount + 1);
|
|
160
|
+
}
|
|
161
|
+
if (response.status === 429) {
|
|
162
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
163
|
+
throw new RateLimitError(retryAfter ? parseInt(retryAfter, 10) : void 0);
|
|
164
|
+
}
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
const requestId = this.extractRequestId(response);
|
|
167
|
+
let errorBody;
|
|
168
|
+
try {
|
|
169
|
+
const json = await response.json();
|
|
170
|
+
errorBody = json.error ? json : json.data ?? json;
|
|
171
|
+
} catch {
|
|
172
|
+
errorBody = { error: `http_${response.status}`, message: response.statusText };
|
|
173
|
+
}
|
|
174
|
+
throw this.buildError(response.status, errorBody, requestId);
|
|
175
|
+
}
|
|
176
|
+
return response;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Unwrap the API response envelope.
|
|
180
|
+
* API returns: { data: T, meta: {...} } for single resources
|
|
181
|
+
* { data: T[], total, limit, offset, meta: {...} } for lists
|
|
182
|
+
*/
|
|
183
|
+
unwrapEnvelope(json) {
|
|
184
|
+
if (json && typeof json === "object" && "data" in json) {
|
|
185
|
+
const obj = json;
|
|
186
|
+
if ("total" in obj && "limit" in obj) {
|
|
187
|
+
return json;
|
|
188
|
+
}
|
|
189
|
+
return obj.data;
|
|
190
|
+
}
|
|
191
|
+
return json;
|
|
192
|
+
}
|
|
193
|
+
extractPageFromEnvelope(json) {
|
|
194
|
+
if (!json || typeof json !== "object") return null;
|
|
195
|
+
const obj = json;
|
|
196
|
+
if (Array.isArray(obj.data) && "total" in obj) {
|
|
197
|
+
return { data: obj.data, total: obj.total, limit: obj.limit, offset: obj.offset };
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
extractRequestId(response) {
|
|
202
|
+
return response.headers.get("X-Request-Id") ?? void 0;
|
|
203
|
+
}
|
|
204
|
+
buildError(status, body, requestId) {
|
|
205
|
+
switch (status) {
|
|
206
|
+
case 401:
|
|
207
|
+
return new AuthenticationError(body.message);
|
|
208
|
+
case 404:
|
|
209
|
+
return new NotFoundError(body.message);
|
|
210
|
+
case 400:
|
|
211
|
+
case 422:
|
|
212
|
+
return new ValidationError(body.message ?? body.error, body.details);
|
|
213
|
+
case 429:
|
|
214
|
+
return new RateLimitError();
|
|
215
|
+
default:
|
|
216
|
+
return new APIError(status, body.error, body.message ?? body.error, requestId);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// src/resources/invoices.ts
|
|
222
|
+
var enc = encodeURIComponent;
|
|
223
|
+
var Invoices = class {
|
|
224
|
+
constructor(_client) {
|
|
225
|
+
this._client = _client;
|
|
226
|
+
}
|
|
227
|
+
list(params, opts) {
|
|
228
|
+
return this._client.getPage("/invoices", params, opts);
|
|
229
|
+
}
|
|
230
|
+
retrieve(id, opts) {
|
|
231
|
+
return this._client.get(`/invoices/${enc(id)}`, void 0, opts);
|
|
232
|
+
}
|
|
233
|
+
create(params, opts) {
|
|
234
|
+
return this._client.post("/invoices", params, opts);
|
|
235
|
+
}
|
|
236
|
+
update(id, params, opts) {
|
|
237
|
+
return this._client.patch(`/invoices/${enc(id)}`, params, opts);
|
|
238
|
+
}
|
|
239
|
+
del(id, opts) {
|
|
240
|
+
return this._client.del(`/invoices/${enc(id)}`, opts);
|
|
241
|
+
}
|
|
242
|
+
search(query, params, opts) {
|
|
243
|
+
return this._client.getPage("/invoices", { q: query, ...params }, opts);
|
|
244
|
+
}
|
|
245
|
+
markPaid(id, paidDate, opts) {
|
|
246
|
+
return this._client.post(`/invoices/${enc(id)}/paid`, paidDate ? { paidDate } : void 0, opts);
|
|
247
|
+
}
|
|
248
|
+
send(id, params, opts) {
|
|
249
|
+
return this._client.post(`/invoices/${enc(id)}/send`, params, opts);
|
|
250
|
+
}
|
|
251
|
+
pdf(id, opts) {
|
|
252
|
+
return this._client.getRaw(`/invoices/${enc(id)}/pdf`, opts);
|
|
253
|
+
}
|
|
254
|
+
createBatch(items, opts) {
|
|
255
|
+
return this._client.post("/invoices/batch", items, opts);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// src/resources/expenses.ts
|
|
260
|
+
var enc2 = encodeURIComponent;
|
|
261
|
+
var Expenses = class {
|
|
262
|
+
constructor(_client) {
|
|
263
|
+
this._client = _client;
|
|
264
|
+
}
|
|
265
|
+
list(params, opts) {
|
|
266
|
+
return this._client.getPage("/expenses", params, opts);
|
|
267
|
+
}
|
|
268
|
+
retrieve(id, opts) {
|
|
269
|
+
return this._client.get(`/expenses/${enc2(id)}`, void 0, opts);
|
|
270
|
+
}
|
|
271
|
+
create(params, opts) {
|
|
272
|
+
return this._client.post("/expenses", params, opts);
|
|
273
|
+
}
|
|
274
|
+
update(id, params, opts) {
|
|
275
|
+
return this._client.patch(`/expenses/${enc2(id)}`, params, opts);
|
|
276
|
+
}
|
|
277
|
+
del(id, opts) {
|
|
278
|
+
return this._client.del(`/expenses/${enc2(id)}`, opts);
|
|
279
|
+
}
|
|
280
|
+
search(query, params, opts) {
|
|
281
|
+
return this._client.getPage("/expenses", { q: query, ...params }, opts);
|
|
282
|
+
}
|
|
283
|
+
createBatch(items, opts) {
|
|
284
|
+
return this._client.post("/expenses/batch", items, opts);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
// src/resources/clients.ts
|
|
289
|
+
var enc3 = encodeURIComponent;
|
|
290
|
+
var Clients = class {
|
|
291
|
+
constructor(_client) {
|
|
292
|
+
this._client = _client;
|
|
293
|
+
}
|
|
294
|
+
list(params, opts) {
|
|
295
|
+
return this._client.getPage("/clients", params, opts);
|
|
296
|
+
}
|
|
297
|
+
retrieve(id, opts) {
|
|
298
|
+
return this._client.get(`/clients/${enc3(id)}`, void 0, opts);
|
|
299
|
+
}
|
|
300
|
+
create(params, opts) {
|
|
301
|
+
return this._client.post("/clients", params, opts);
|
|
302
|
+
}
|
|
303
|
+
update(id, params, opts) {
|
|
304
|
+
return this._client.patch(`/clients/${enc3(id)}`, params, opts);
|
|
305
|
+
}
|
|
306
|
+
del(id, opts) {
|
|
307
|
+
return this._client.del(`/clients/${enc3(id)}`, opts);
|
|
308
|
+
}
|
|
309
|
+
search(query, params, opts) {
|
|
310
|
+
return this._client.getPage("/clients", { q: query, ...params }, opts);
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
// src/resources/products.ts
|
|
315
|
+
var enc4 = encodeURIComponent;
|
|
316
|
+
var Products = class {
|
|
317
|
+
constructor(_client) {
|
|
318
|
+
this._client = _client;
|
|
319
|
+
}
|
|
320
|
+
list(params, opts) {
|
|
321
|
+
return this._client.getPage("/products", params, opts);
|
|
322
|
+
}
|
|
323
|
+
retrieve(id, opts) {
|
|
324
|
+
return this._client.get(`/products/${enc4(id)}`, void 0, opts);
|
|
325
|
+
}
|
|
326
|
+
create(params, opts) {
|
|
327
|
+
return this._client.post("/products", params, opts);
|
|
328
|
+
}
|
|
329
|
+
update(id, params, opts) {
|
|
330
|
+
return this._client.patch(`/products/${enc4(id)}`, params, opts);
|
|
331
|
+
}
|
|
332
|
+
del(id, opts) {
|
|
333
|
+
return this._client.del(`/products/${enc4(id)}`, opts);
|
|
334
|
+
}
|
|
335
|
+
search(query, params, opts) {
|
|
336
|
+
return this._client.getPage("/products", { q: query, ...params }, opts);
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// src/resources/quotes.ts
|
|
341
|
+
var enc5 = encodeURIComponent;
|
|
342
|
+
var Quotes = class {
|
|
343
|
+
constructor(_client) {
|
|
344
|
+
this._client = _client;
|
|
345
|
+
}
|
|
346
|
+
list(params, opts) {
|
|
347
|
+
return this._client.getPage("/quotes", params, opts);
|
|
348
|
+
}
|
|
349
|
+
retrieve(id, opts) {
|
|
350
|
+
return this._client.get(`/quotes/${enc5(id)}`, void 0, opts);
|
|
351
|
+
}
|
|
352
|
+
create(params, opts) {
|
|
353
|
+
return this._client.post("/quotes", params, opts);
|
|
354
|
+
}
|
|
355
|
+
update(id, params, opts) {
|
|
356
|
+
return this._client.patch(`/quotes/${enc5(id)}`, params, opts);
|
|
357
|
+
}
|
|
358
|
+
del(id, opts) {
|
|
359
|
+
return this._client.del(`/quotes/${enc5(id)}`, opts);
|
|
360
|
+
}
|
|
361
|
+
search(query, params, opts) {
|
|
362
|
+
return this._client.getPage("/quotes", { q: query, ...params }, opts);
|
|
363
|
+
}
|
|
364
|
+
pdf(id, opts) {
|
|
365
|
+
return this._client.getRaw(`/quotes/${enc5(id)}/pdf`, opts);
|
|
366
|
+
}
|
|
367
|
+
send(id, params, opts) {
|
|
368
|
+
return this._client.post(`/quotes/${enc5(id)}/send`, params, opts);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// src/resources/vendors.ts
|
|
373
|
+
var enc6 = encodeURIComponent;
|
|
374
|
+
var Vendors = class {
|
|
375
|
+
constructor(_client) {
|
|
376
|
+
this._client = _client;
|
|
377
|
+
}
|
|
378
|
+
list(params, opts) {
|
|
379
|
+
return this._client.getPage("/vendors", params, opts);
|
|
380
|
+
}
|
|
381
|
+
retrieve(id, opts) {
|
|
382
|
+
return this._client.get(`/vendors/${enc6(id)}`, void 0, opts);
|
|
383
|
+
}
|
|
384
|
+
create(params, opts) {
|
|
385
|
+
return this._client.post("/vendors", params, opts);
|
|
386
|
+
}
|
|
387
|
+
update(id, params, opts) {
|
|
388
|
+
return this._client.patch(`/vendors/${enc6(id)}`, params, opts);
|
|
389
|
+
}
|
|
390
|
+
del(id, opts) {
|
|
391
|
+
return this._client.del(`/vendors/${enc6(id)}`, opts);
|
|
392
|
+
}
|
|
393
|
+
search(query, params, opts) {
|
|
394
|
+
return this._client.getPage("/vendors", { q: query, ...params }, opts);
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
// src/resources/webhooks.ts
|
|
399
|
+
import { createHmac } from "crypto";
|
|
400
|
+
var enc7 = encodeURIComponent;
|
|
401
|
+
var Webhooks = class {
|
|
402
|
+
constructor(_client) {
|
|
403
|
+
this._client = _client;
|
|
404
|
+
}
|
|
405
|
+
list(params, opts) {
|
|
406
|
+
return this._client.getPage("/webhooks", params, opts);
|
|
407
|
+
}
|
|
408
|
+
retrieve(id, opts) {
|
|
409
|
+
return this._client.get(`/webhooks/${enc7(id)}`, void 0, opts);
|
|
410
|
+
}
|
|
411
|
+
create(params, opts) {
|
|
412
|
+
return this._client.post("/webhooks", params, opts);
|
|
413
|
+
}
|
|
414
|
+
update(id, params, opts) {
|
|
415
|
+
return this._client.patch(`/webhooks/${enc7(id)}`, params, opts);
|
|
416
|
+
}
|
|
417
|
+
del(id, opts) {
|
|
418
|
+
return this._client.del(`/webhooks/${enc7(id)}`, opts);
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Verify a webhook signature. Use this in your webhook handler to confirm
|
|
422
|
+
* the payload was sent by Frihet.
|
|
423
|
+
*
|
|
424
|
+
* @param payload - Raw request body (string or Buffer)
|
|
425
|
+
* @param signature - Value of the X-Frihet-Signature header
|
|
426
|
+
* @param secret - Your webhook secret
|
|
427
|
+
*/
|
|
428
|
+
static verifySignature(payload, signature, secret) {
|
|
429
|
+
const expected = `sha256=${createHmac("sha256", secret).update(payload).digest("hex")}`;
|
|
430
|
+
if (expected.length !== signature.length) return false;
|
|
431
|
+
let mismatch = 0;
|
|
432
|
+
for (let i = 0; i < expected.length; i++) {
|
|
433
|
+
mismatch |= expected.charCodeAt(i) ^ signature.charCodeAt(i);
|
|
434
|
+
}
|
|
435
|
+
return mismatch === 0;
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
// src/resources/intelligence.ts
|
|
440
|
+
var Intelligence = class {
|
|
441
|
+
constructor(_client) {
|
|
442
|
+
this._client = _client;
|
|
443
|
+
}
|
|
444
|
+
context(opts) {
|
|
445
|
+
return this._client.get("/context", void 0, opts);
|
|
446
|
+
}
|
|
447
|
+
summary(params, opts) {
|
|
448
|
+
return this._client.get("/summary", params, opts);
|
|
449
|
+
}
|
|
450
|
+
monthly(month, opts) {
|
|
451
|
+
return this._client.get("/monthly", month ? { month } : void 0, opts);
|
|
452
|
+
}
|
|
453
|
+
quarterly(quarter, opts) {
|
|
454
|
+
return this._client.get("/quarterly", quarter ? { quarter } : void 0, opts);
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
// src/index.ts
|
|
459
|
+
var Frihet = class {
|
|
460
|
+
invoices;
|
|
461
|
+
expenses;
|
|
462
|
+
clients;
|
|
463
|
+
vendors;
|
|
464
|
+
products;
|
|
465
|
+
quotes;
|
|
466
|
+
webhooks;
|
|
467
|
+
intelligence;
|
|
468
|
+
constructor(opts) {
|
|
469
|
+
const client = new HttpClient(opts);
|
|
470
|
+
this.invoices = new Invoices(client);
|
|
471
|
+
this.expenses = new Expenses(client);
|
|
472
|
+
this.clients = new Clients(client);
|
|
473
|
+
this.vendors = new Vendors(client);
|
|
474
|
+
this.products = new Products(client);
|
|
475
|
+
this.quotes = new Quotes(client);
|
|
476
|
+
this.webhooks = new Webhooks(client);
|
|
477
|
+
this.intelligence = new Intelligence(client);
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
var index_default = Frihet;
|
|
481
|
+
export {
|
|
482
|
+
APIError,
|
|
483
|
+
AuthenticationError,
|
|
484
|
+
Clients,
|
|
485
|
+
Expenses,
|
|
486
|
+
Frihet,
|
|
487
|
+
FrihetError,
|
|
488
|
+
Intelligence,
|
|
489
|
+
Invoices,
|
|
490
|
+
NotFoundError,
|
|
491
|
+
Products,
|
|
492
|
+
Quotes,
|
|
493
|
+
RateLimitError,
|
|
494
|
+
TimeoutError,
|
|
495
|
+
ValidationError,
|
|
496
|
+
Vendors,
|
|
497
|
+
Webhooks,
|
|
498
|
+
index_default as default
|
|
499
|
+
};
|
|
500
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error.ts","../src/client.ts","../src/resources/invoices.ts","../src/resources/expenses.ts","../src/resources/clients.ts","../src/resources/products.ts","../src/resources/quotes.ts","../src/resources/vendors.ts","../src/resources/webhooks.ts","../src/resources/intelligence.ts","../src/index.ts"],"sourcesContent":["export class FrihetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FrihetError';\n }\n}\n\nexport class APIError extends FrihetError {\n readonly status: number;\n readonly code: string;\n readonly requestId?: string;\n\n constructor(status: number, code: string, message: string, requestId?: string) {\n super(message);\n this.name = 'APIError';\n this.status = status;\n this.code = code;\n this.requestId = requestId;\n }\n}\n\nexport class AuthenticationError extends APIError {\n constructor(message = 'Invalid or missing API key') {\n super(401, 'authentication_error', message);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class NotFoundError extends APIError {\n constructor(message = 'Resource not found') {\n super(404, 'not_found', message);\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends APIError {\n readonly details?: unknown[];\n\n constructor(message: string, details?: unknown[]) {\n super(400, 'validation_error', message);\n this.name = 'ValidationError';\n this.details = details;\n }\n}\n\nexport class RateLimitError extends APIError {\n readonly retryAfter?: number;\n\n constructor(retryAfter?: number) {\n super(429, 'rate_limit_exceeded', 'Rate limit exceeded. Please retry later.');\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\nexport class TimeoutError extends FrihetError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutError';\n }\n}\n","import { APIError, AuthenticationError, NotFoundError, RateLimitError, TimeoutError, ValidationError } from './error.js';\nimport type { FrihetOptions, Page, RequestOptions } from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://api.frihet.io/v1';\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_RETRIES = 3;\nconst BASE_RETRY_DELAY_MS = 1000;\nconst SDK_VERSION = '1.0.0';\nconst RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503, 504]);\n\ninterface ApiErrorBody {\n error: string;\n message?: string;\n details?: unknown[];\n}\n\nexport class HttpClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly timeout: number;\n\n constructor(opts: FrihetOptions) {\n if (!opts.apiKey) {\n throw new Error('apiKey is required. Get one at https://app.frihet.io/settings/security');\n }\n this.apiKey = opts.apiKey;\n this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;\n }\n\n private get defaultHeaders(): Record<string, string> {\n return {\n 'X-API-Key': this.apiKey,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'User-Agent': `@frihet/sdk/${SDK_VERSION} (node)`,\n };\n }\n\n async get<T>(path: string, query?: Record<string, string | number | undefined>, opts?: RequestOptions): Promise<T> {\n return this.request('GET', path, undefined, query, opts);\n }\n\n async post<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<T> {\n return this.request('POST', path, body, undefined, opts);\n }\n\n async patch<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<T> {\n return this.request('PATCH', path, body, undefined, opts);\n }\n\n async del<T>(path: string, opts?: RequestOptions): Promise<T> {\n return this.request('DELETE', path, undefined, undefined, opts);\n }\n\n async getPage<T>(path: string, query?: Record<string, string | number | undefined>, opts?: RequestOptions): Promise<Page<T>> {\n const raw = await this.requestRaw('GET', path, undefined, query, opts);\n const body = await raw.json();\n const page = this.extractPageFromEnvelope<T>(body);\n if (!page) {\n throw new APIError(200, 'invalid_response', 'Expected paginated response with data array', this.extractRequestId(raw));\n }\n return page;\n }\n\n async getRaw(path: string, opts?: RequestOptions): Promise<ArrayBuffer> {\n const response = await this.requestRaw('GET', path, undefined, undefined, opts);\n return response.arrayBuffer();\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | undefined>,\n opts?: RequestOptions,\n ): Promise<T> {\n const response = await this.requestRaw(method, path, body, query, opts);\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const json = await response.json();\n return this.unwrapEnvelope<T>(json);\n }\n\n private async requestRaw(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | undefined>,\n opts?: RequestOptions,\n retryCount = 0,\n ): Promise<Response> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n }\n\n const headers = { ...this.defaultHeaders };\n if (opts?.idempotencyKey) {\n headers['Idempotency-Key'] = opts.idempotencyKey;\n }\n\n const controller = new AbortController();\n const timeoutMs = opts?.timeout ?? this.timeout;\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: opts?.signal ?? controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new TimeoutError(timeoutMs);\n }\n // Network error (DNS, TLS, connection refused) — retry if possible\n if (retryCount < MAX_RETRIES) {\n const delayMs = BASE_RETRY_DELAY_MS * Math.pow(2, retryCount);\n await new Promise(r => setTimeout(r, delayMs));\n return this.requestRaw(method, path, body, query, opts, retryCount + 1);\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n\n // Retryable status codes (429 rate limit + 5xx server errors)\n if (RETRYABLE_STATUS_CODES.has(response.status) && retryCount < MAX_RETRIES) {\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const delayMs = retryAfter\n ? parseInt(retryAfter, 10) * 1000\n : BASE_RETRY_DELAY_MS * Math.pow(2, retryCount);\n await new Promise(r => setTimeout(r, delayMs));\n } else {\n // 5xx — exponential backoff\n const delayMs = BASE_RETRY_DELAY_MS * Math.pow(2, retryCount);\n await new Promise(r => setTimeout(r, delayMs));\n }\n return this.requestRaw(method, path, body, query, opts, retryCount + 1);\n }\n\n // Final rate limit error (after retries exhausted)\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new RateLimitError(retryAfter ? parseInt(retryAfter, 10) : undefined);\n }\n\n // Error responses\n if (!response.ok) {\n const requestId = this.extractRequestId(response);\n let errorBody: ApiErrorBody;\n try {\n const json = await response.json();\n // API error responses may or may not be wrapped\n errorBody = json.error ? json : (json.data ?? json);\n } catch {\n errorBody = { error: `http_${response.status}`, message: response.statusText };\n }\n throw this.buildError(response.status, errorBody, requestId);\n }\n\n return response;\n }\n\n /**\n * Unwrap the API response envelope.\n * API returns: { data: T, meta: {...} } for single resources\n * { data: T[], total, limit, offset, meta: {...} } for lists\n */\n private unwrapEnvelope<T>(json: unknown): T {\n if (json && typeof json === 'object' && 'data' in json) {\n const obj = json as Record<string, unknown>;\n // Paginated response — return full envelope so Page<T> shape is preserved\n if ('total' in obj && 'limit' in obj) {\n return json as T;\n }\n // Single resource or action result — unwrap\n return obj.data as T;\n }\n // No envelope (shouldn't happen with current API, but be safe)\n return json as T;\n }\n\n private extractPageFromEnvelope<T>(json: unknown): Page<T> | null {\n if (!json || typeof json !== 'object') return null;\n const obj = json as Record<string, unknown>;\n\n // Direct paginated shape\n if (Array.isArray(obj.data) && 'total' in obj) {\n return { data: obj.data as T[], total: obj.total as number, limit: obj.limit as number, offset: obj.offset as number };\n }\n return null;\n }\n\n private extractRequestId(response: Response): string | undefined {\n return response.headers.get('X-Request-Id') ?? undefined;\n }\n\n private buildError(status: number, body: ApiErrorBody, requestId?: string): APIError {\n switch (status) {\n case 401: return new AuthenticationError(body.message);\n case 404: return new NotFoundError(body.message);\n case 400:\n case 422: return new ValidationError(body.message ?? body.error, body.details);\n case 429: return new RateLimitError();\n default: return new APIError(status, body.error, body.message ?? body.error, requestId);\n }\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type {\n Invoice, CreateInvoiceParams, UpdateInvoiceParams, InvoiceListParams,\n SendInvoiceParams, MarkPaidResult, SendResult, Page, BatchResult, RequestOptions,\n} from '../types.js';\n\nconst enc = encodeURIComponent;\n\nexport class Invoices {\n constructor(private _client: HttpClient) {}\n\n list(params?: InvoiceListParams, opts?: RequestOptions): Promise<Page<Invoice>> {\n return this._client.getPage('/invoices', params as Record<string, string | number | undefined>, opts);\n }\n\n retrieve(id: string, opts?: RequestOptions): Promise<Invoice> {\n return this._client.get(`/invoices/${enc(id)}`, undefined, opts);\n }\n\n create(params: CreateInvoiceParams, opts?: RequestOptions): Promise<Invoice> {\n return this._client.post('/invoices', params, opts);\n }\n\n update(id: string, params: UpdateInvoiceParams, opts?: RequestOptions): Promise<Invoice> {\n return this._client.patch(`/invoices/${enc(id)}`, params, opts);\n }\n\n del(id: string, opts?: RequestOptions): Promise<void> {\n return this._client.del(`/invoices/${enc(id)}`, opts);\n }\n\n search(query: string, params?: Omit<InvoiceListParams, 'q'>, opts?: RequestOptions): Promise<Page<Invoice>> {\n return this._client.getPage('/invoices', { q: query, ...params } as Record<string, string | number | undefined>, opts);\n }\n\n markPaid(id: string, paidDate?: string, opts?: RequestOptions): Promise<MarkPaidResult> {\n return this._client.post(`/invoices/${enc(id)}/paid`, paidDate ? { paidDate } : undefined, opts);\n }\n\n send(id: string, params: SendInvoiceParams, opts?: RequestOptions): Promise<SendResult> {\n return this._client.post(`/invoices/${enc(id)}/send`, params, opts);\n }\n\n pdf(id: string, opts?: RequestOptions): Promise<ArrayBuffer> {\n return this._client.getRaw(`/invoices/${enc(id)}/pdf`, opts);\n }\n\n createBatch(items: CreateInvoiceParams[], opts?: RequestOptions): Promise<BatchResult<Invoice>> {\n return this._client.post('/invoices/batch', items, opts);\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type {\n Expense, CreateExpenseParams, UpdateExpenseParams, ExpenseListParams,\n Page, BatchResult, RequestOptions,\n} from '../types.js';\n\nconst enc = encodeURIComponent;\n\nexport class Expenses {\n constructor(private _client: HttpClient) {}\n\n list(params?: ExpenseListParams, opts?: RequestOptions): Promise<Page<Expense>> {\n return this._client.getPage('/expenses', params as Record<string, string | number | undefined>, opts);\n }\n\n retrieve(id: string, opts?: RequestOptions): Promise<Expense> {\n return this._client.get(`/expenses/${enc(id)}`, undefined, opts);\n }\n\n create(params: CreateExpenseParams, opts?: RequestOptions): Promise<Expense> {\n return this._client.post('/expenses', params, opts);\n }\n\n update(id: string, params: UpdateExpenseParams, opts?: RequestOptions): Promise<Expense> {\n return this._client.patch(`/expenses/${enc(id)}`, params, opts);\n }\n\n del(id: string, opts?: RequestOptions): Promise<void> {\n return this._client.del(`/expenses/${enc(id)}`, opts);\n }\n\n search(query: string, params?: Omit<ExpenseListParams, 'q'>, opts?: RequestOptions): Promise<Page<Expense>> {\n return this._client.getPage('/expenses', { q: query, ...params } as Record<string, string | number | undefined>, opts);\n }\n\n createBatch(items: CreateExpenseParams[], opts?: RequestOptions): Promise<BatchResult<Expense>> {\n return this._client.post('/expenses/batch', items, opts);\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type { Client, CreateClientParams, UpdateClientParams, ClientListParams, Page, RequestOptions } from '../types.js';\n\nconst enc = encodeURIComponent;\n\nexport class Clients {\n constructor(private _client: HttpClient) {}\n\n list(params?: ClientListParams, opts?: RequestOptions): Promise<Page<Client>> {\n return this._client.getPage('/clients', params as Record<string, string | number | undefined>, opts);\n }\n\n retrieve(id: string, opts?: RequestOptions): Promise<Client> {\n return this._client.get(`/clients/${enc(id)}`, undefined, opts);\n }\n\n create(params: CreateClientParams, opts?: RequestOptions): Promise<Client> {\n return this._client.post('/clients', params, opts);\n }\n\n update(id: string, params: UpdateClientParams, opts?: RequestOptions): Promise<Client> {\n return this._client.patch(`/clients/${enc(id)}`, params, opts);\n }\n\n del(id: string, opts?: RequestOptions): Promise<void> {\n return this._client.del(`/clients/${enc(id)}`, opts);\n }\n\n search(query: string, params?: Omit<ClientListParams, 'q'>, opts?: RequestOptions): Promise<Page<Client>> {\n return this._client.getPage('/clients', { q: query, ...params } as Record<string, string | number | undefined>, opts);\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type { Product, CreateProductParams, UpdateProductParams, ProductListParams, Page, RequestOptions } from '../types.js';\n\nconst enc = encodeURIComponent;\n\nexport class Products {\n constructor(private _client: HttpClient) {}\n\n list(params?: ProductListParams, opts?: RequestOptions): Promise<Page<Product>> {\n return this._client.getPage('/products', params as Record<string, string | number | undefined>, opts);\n }\n\n retrieve(id: string, opts?: RequestOptions): Promise<Product> {\n return this._client.get(`/products/${enc(id)}`, undefined, opts);\n }\n\n create(params: CreateProductParams, opts?: RequestOptions): Promise<Product> {\n return this._client.post('/products', params, opts);\n }\n\n update(id: string, params: UpdateProductParams, opts?: RequestOptions): Promise<Product> {\n return this._client.patch(`/products/${enc(id)}`, params, opts);\n }\n\n del(id: string, opts?: RequestOptions): Promise<void> {\n return this._client.del(`/products/${enc(id)}`, opts);\n }\n\n search(query: string, params?: Omit<ProductListParams, 'q'>, opts?: RequestOptions): Promise<Page<Product>> {\n return this._client.getPage('/products', { q: query, ...params } as Record<string, string | number | undefined>, opts);\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type {\n Quote, CreateQuoteParams, UpdateQuoteParams, QuoteListParams,\n Page, RequestOptions,\n} from '../types.js';\n\nconst enc = encodeURIComponent;\n\nexport class Quotes {\n constructor(private _client: HttpClient) {}\n\n list(params?: QuoteListParams, opts?: RequestOptions): Promise<Page<Quote>> {\n return this._client.getPage('/quotes', params as Record<string, string | number | undefined>, opts);\n }\n\n retrieve(id: string, opts?: RequestOptions): Promise<Quote> {\n return this._client.get(`/quotes/${enc(id)}`, undefined, opts);\n }\n\n create(params: CreateQuoteParams, opts?: RequestOptions): Promise<Quote> {\n return this._client.post('/quotes', params, opts);\n }\n\n update(id: string, params: UpdateQuoteParams, opts?: RequestOptions): Promise<Quote> {\n return this._client.patch(`/quotes/${enc(id)}`, params, opts);\n }\n\n del(id: string, opts?: RequestOptions): Promise<void> {\n return this._client.del(`/quotes/${enc(id)}`, opts);\n }\n\n search(query: string, params?: Omit<QuoteListParams, 'q'>, opts?: RequestOptions): Promise<Page<Quote>> {\n return this._client.getPage('/quotes', { q: query, ...params } as Record<string, string | number | undefined>, opts);\n }\n\n pdf(id: string, opts?: RequestOptions): Promise<ArrayBuffer> {\n return this._client.getRaw(`/quotes/${enc(id)}/pdf`, opts);\n }\n\n send(id: string, params: { recipientEmail: string; recipientName?: string; customMessage?: string; locale?: 'es' | 'en' }, opts?: RequestOptions): Promise<{ success: boolean; messageId: string; }> {\n return this._client.post(`/quotes/${enc(id)}/send`, params, opts);\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type { Vendor, CreateVendorParams, UpdateVendorParams, VendorListParams, Page, RequestOptions } from '../types.js';\n\nconst enc = encodeURIComponent;\n\nexport class Vendors {\n constructor(private _client: HttpClient) {}\n\n list(params?: VendorListParams, opts?: RequestOptions): Promise<Page<Vendor>> {\n return this._client.getPage('/vendors', params as Record<string, string | number | undefined>, opts);\n }\n\n retrieve(id: string, opts?: RequestOptions): Promise<Vendor> {\n return this._client.get(`/vendors/${enc(id)}`, undefined, opts);\n }\n\n create(params: CreateVendorParams, opts?: RequestOptions): Promise<Vendor> {\n return this._client.post('/vendors', params, opts);\n }\n\n update(id: string, params: UpdateVendorParams, opts?: RequestOptions): Promise<Vendor> {\n return this._client.patch(`/vendors/${enc(id)}`, params, opts);\n }\n\n del(id: string, opts?: RequestOptions): Promise<void> {\n return this._client.del(`/vendors/${enc(id)}`, opts);\n }\n\n search(query: string, params?: Omit<VendorListParams, 'q'>, opts?: RequestOptions): Promise<Page<Vendor>> {\n return this._client.getPage('/vendors', { q: query, ...params } as Record<string, string | number | undefined>, opts);\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type { Webhook, CreateWebhookParams, UpdateWebhookParams, WebhookListParams, Page, RequestOptions } from '../types.js';\nimport { createHmac } from 'node:crypto';\n\nconst enc = encodeURIComponent;\n\nexport class Webhooks {\n constructor(private _client: HttpClient) {}\n\n list(params?: WebhookListParams, opts?: RequestOptions): Promise<Page<Webhook>> {\n return this._client.getPage('/webhooks', params as Record<string, string | number | undefined>, opts);\n }\n\n retrieve(id: string, opts?: RequestOptions): Promise<Webhook> {\n return this._client.get(`/webhooks/${enc(id)}`, undefined, opts);\n }\n\n create(params: CreateWebhookParams, opts?: RequestOptions): Promise<Webhook> {\n return this._client.post('/webhooks', params, opts);\n }\n\n update(id: string, params: UpdateWebhookParams, opts?: RequestOptions): Promise<Webhook> {\n return this._client.patch(`/webhooks/${enc(id)}`, params, opts);\n }\n\n del(id: string, opts?: RequestOptions): Promise<void> {\n return this._client.del(`/webhooks/${enc(id)}`, opts);\n }\n\n /**\n * Verify a webhook signature. Use this in your webhook handler to confirm\n * the payload was sent by Frihet.\n *\n * @param payload - Raw request body (string or Buffer)\n * @param signature - Value of the X-Frihet-Signature header\n * @param secret - Your webhook secret\n */\n static verifySignature(payload: string | Buffer, signature: string, secret: string): boolean {\n const expected = `sha256=${createHmac('sha256', secret).update(payload).digest('hex')}`;\n if (expected.length !== signature.length) return false;\n // Constant-time comparison\n let mismatch = 0;\n for (let i = 0; i < expected.length; i++) {\n mismatch |= expected.charCodeAt(i) ^ signature.charCodeAt(i);\n }\n return mismatch === 0;\n }\n}\n","import type { HttpClient } from '../client.js';\nimport type {\n BusinessContext, MonthlySummary, QuarterlyTaxes, FinancialSummary,\n SummaryParams, RequestOptions,\n} from '../types.js';\n\nexport class Intelligence {\n constructor(private _client: HttpClient) {}\n\n context(opts?: RequestOptions): Promise<BusinessContext> {\n return this._client.get('/context', undefined, opts);\n }\n\n summary(params?: SummaryParams, opts?: RequestOptions): Promise<FinancialSummary> {\n return this._client.get('/summary', params as Record<string, string | number | undefined>, opts);\n }\n\n monthly(month?: string, opts?: RequestOptions): Promise<MonthlySummary> {\n return this._client.get('/monthly', month ? { month } : undefined, opts);\n }\n\n quarterly(quarter?: string, opts?: RequestOptions): Promise<QuarterlyTaxes> {\n return this._client.get('/quarterly', quarter ? { quarter } : undefined, opts);\n }\n}\n","import { HttpClient } from './client.js';\nimport { Invoices } from './resources/invoices.js';\nimport { Expenses } from './resources/expenses.js';\nimport { Clients } from './resources/clients.js';\nimport { Products } from './resources/products.js';\nimport { Quotes } from './resources/quotes.js';\nimport { Vendors } from './resources/vendors.js';\nimport { Webhooks } from './resources/webhooks.js';\nimport { Intelligence } from './resources/intelligence.js';\nimport type { FrihetOptions } from './types.js';\n\nexport class Frihet {\n readonly invoices: Invoices;\n readonly expenses: Expenses;\n readonly clients: Clients;\n readonly vendors: Vendors;\n readonly products: Products;\n readonly quotes: Quotes;\n readonly webhooks: Webhooks;\n readonly intelligence: Intelligence;\n\n constructor(opts: FrihetOptions) {\n const client = new HttpClient(opts);\n this.invoices = new Invoices(client);\n this.expenses = new Expenses(client);\n this.clients = new Clients(client);\n this.vendors = new Vendors(client);\n this.products = new Products(client);\n this.quotes = new Quotes(client);\n this.webhooks = new Webhooks(client);\n this.intelligence = new Intelligence(client);\n }\n}\n\nexport default Frihet;\n\n// Re-export everything\nexport { Invoices } from './resources/invoices.js';\nexport { Expenses } from './resources/expenses.js';\nexport { Clients } from './resources/clients.js';\nexport { Products } from './resources/products.js';\nexport { Quotes } from './resources/quotes.js';\nexport { Vendors } from './resources/vendors.js';\nexport { Webhooks } from './resources/webhooks.js';\nexport { Intelligence } from './resources/intelligence.js';\nexport { FrihetError, APIError, AuthenticationError, NotFoundError, ValidationError, RateLimitError, TimeoutError } from './error.js';\nexport type * from './types.js';\n"],"mappings":"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","names":["enc","enc","enc","enc","enc","enc"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@frihet/sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Official Frihet SDK — AI-native business management API client",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"clean": "rm -rf dist",
|
|
27
|
+
"typecheck": "tsc --noEmit"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"frihet",
|
|
31
|
+
"erp",
|
|
32
|
+
"invoicing",
|
|
33
|
+
"api",
|
|
34
|
+
"sdk",
|
|
35
|
+
"typescript",
|
|
36
|
+
"business",
|
|
37
|
+
"accounting",
|
|
38
|
+
"ai",
|
|
39
|
+
"mcp"
|
|
40
|
+
],
|
|
41
|
+
"author": "Frihet <hello@frihet.io> (https://frihet.io)",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"homepage": "https://docs.frihet.io/desarrolladores/api-rest",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "https://github.com/Frihet-io/frihet-sdk.git",
|
|
47
|
+
"directory": "packages/sdk"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/Frihet-io/frihet-sdk/issues"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^25.5.0",
|
|
54
|
+
"tsup": "^8.0.0",
|
|
55
|
+
"typescript": "^5.7.0"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=18"
|
|
59
|
+
}
|
|
60
|
+
}
|