@klozeo/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +141 -0
- package/dist/cjs/attribute-helpers.js +43 -0
- package/dist/cjs/attribute-helpers.js.map +1 -0
- package/dist/cjs/client.js +150 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.js +75 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/filters/index.js +320 -0
- package/dist/cjs/filters/index.js.map +1 -0
- package/dist/cjs/index.js +42 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/resources/leads.js +156 -0
- package/dist/cjs/resources/leads.js.map +1 -0
- package/dist/cjs/resources/notes.js +50 -0
- package/dist/cjs/resources/notes.js.map +1 -0
- package/dist/cjs/resources/scoring.js +63 -0
- package/dist/cjs/resources/scoring.js.map +1 -0
- package/dist/cjs/resources/webhooks.js +41 -0
- package/dist/cjs/resources/webhooks.js.map +1 -0
- package/dist/cjs/types.js +13 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.js +179 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/attribute-helpers.js +36 -0
- package/dist/esm/attribute-helpers.js.map +1 -0
- package/dist/esm/client.js +159 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.js +72 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/filters/index.js +304 -0
- package/dist/esm/filters/index.js.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/resources/leads.js +153 -0
- package/dist/esm/resources/leads.js.map +1 -0
- package/dist/esm/resources/notes.js +47 -0
- package/dist/esm/resources/notes.js.map +1 -0
- package/dist/esm/resources/scoring.js +60 -0
- package/dist/esm/resources/scoring.js.map +1 -0
- package/dist/esm/resources/webhooks.js +38 -0
- package/dist/esm/resources/webhooks.js.map +1 -0
- package/dist/esm/types.js +10 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.js +168 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/types/attribute-helpers.d.ts +27 -0
- package/dist/types/attribute-helpers.d.ts.map +1 -0
- package/dist/types/client.d.ts +64 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/errors.d.ts +44 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/filters/index.d.ts +173 -0
- package/dist/types/filters/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/resources/leads.d.ts +67 -0
- package/dist/types/resources/leads.d.ts.map +1 -0
- package/dist/types/resources/notes.d.ts +31 -0
- package/dist/types/resources/notes.d.ts.map +1 -0
- package/dist/types/resources/scoring.d.ts +35 -0
- package/dist/types/resources/scoring.d.ts.map +1 -0
- package/dist/types/resources/webhooks.d.ts +25 -0
- package/dist/types/resources/webhooks.d.ts.map +1 -0
- package/dist/types/types.d.ts +409 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils.d.ts +49 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# @klozeo/sdk
|
|
2
|
+
|
|
3
|
+
Official TypeScript SDK for the [Klozeo](https://klozeo.com) API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @klozeo/sdk
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @klozeo/sdk
|
|
11
|
+
# or
|
|
12
|
+
yarn add @klozeo/sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Requires:** Node.js 18+ or any modern browser (uses global `fetch`).
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { Klozeo, ExportFormat, textAttr, numberAttr } from "@klozeo/sdk";
|
|
21
|
+
import { city, rating, tags, or } from "@klozeo/sdk/filters";
|
|
22
|
+
|
|
23
|
+
const client = new Klozeo("sk_live_your_api_key");
|
|
24
|
+
|
|
25
|
+
// Create a lead
|
|
26
|
+
const resp = await client.leads.create({
|
|
27
|
+
name: "Acme Corporation",
|
|
28
|
+
source: "website",
|
|
29
|
+
city: "San Francisco",
|
|
30
|
+
email: "contact@acme.com",
|
|
31
|
+
rating: 4.5,
|
|
32
|
+
tags: ["enterprise", "saas"],
|
|
33
|
+
attributes: [
|
|
34
|
+
textAttr("industry", "Software"),
|
|
35
|
+
numberAttr("employees", 500),
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
console.log(`Created: ${resp.id}${resp.duplicate ? " (merged)" : ""}`);
|
|
39
|
+
|
|
40
|
+
// List with filters
|
|
41
|
+
const page = await client.leads.list({
|
|
42
|
+
filters: [city().eq("Berlin"), rating().gte(4.0)],
|
|
43
|
+
sortBy: "rating",
|
|
44
|
+
sortOrder: "desc",
|
|
45
|
+
limit: 20,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Iterate all pages automatically
|
|
49
|
+
for await (const lead of client.leads.iterate({ filters: [tags().contains("enterprise")] })) {
|
|
50
|
+
console.log(lead.name);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Export as CSV
|
|
54
|
+
const blob = await client.leads.export(ExportFormat.CSV, {
|
|
55
|
+
filters: [city().eq("Paris")],
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Client Options
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const client = new Klozeo("sk_live_your_api_key", {
|
|
63
|
+
baseUrl: "https://custom.api.com", // default: https://app.klozeo.com/api/v1
|
|
64
|
+
timeout: 30_000, // ms, default 30000
|
|
65
|
+
maxRetries: 3, // retries on 429/5xx, default 3
|
|
66
|
+
fetch: customFetch, // optional custom fetch
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Filters
|
|
71
|
+
|
|
72
|
+
Import filter helpers from `@klozeo/sdk/filters`:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { city, country, rating, reviewCount, tags, location, attr, or } from "@klozeo/sdk/filters";
|
|
76
|
+
|
|
77
|
+
// Text fields: name, city, country, state, category, source, email, phone, website
|
|
78
|
+
city().eq("Berlin")
|
|
79
|
+
city().contains("New")
|
|
80
|
+
email().isNotEmpty()
|
|
81
|
+
|
|
82
|
+
// Number fields: rating, reviewCount
|
|
83
|
+
rating().gte(4.0)
|
|
84
|
+
reviewCount().gt(100)
|
|
85
|
+
|
|
86
|
+
// Array field: tags
|
|
87
|
+
tags().contains("vip")
|
|
88
|
+
tags().isEmpty()
|
|
89
|
+
|
|
90
|
+
// Location
|
|
91
|
+
location().withinRadius(52.52, 13.405, 50) // within 50 km
|
|
92
|
+
|
|
93
|
+
// Custom attributes
|
|
94
|
+
attr("industry").eq("Software")
|
|
95
|
+
attr("employees").gte(100)
|
|
96
|
+
|
|
97
|
+
// OR logic
|
|
98
|
+
or().city().eq("Paris")
|
|
99
|
+
or().city().eq("Berlin")
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Error Handling
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import { KlozeoError, NotFoundError, RateLimitedError, ForbiddenError } from "@klozeo/sdk";
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
await client.leads.get("cl_nonexistent");
|
|
109
|
+
} catch (err) {
|
|
110
|
+
if (err instanceof NotFoundError) {
|
|
111
|
+
console.log("Lead not found");
|
|
112
|
+
} else if (err instanceof RateLimitedError) {
|
|
113
|
+
console.log(`Retry after ${err.retryAfter}s`);
|
|
114
|
+
} else if (err instanceof ForbiddenError) {
|
|
115
|
+
console.log("Leads limit reached — upgrade your plan");
|
|
116
|
+
} else if (err instanceof KlozeoError) {
|
|
117
|
+
console.log(`HTTP ${err.statusCode} [${err.code}] ${err.message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Resources
|
|
123
|
+
|
|
124
|
+
| Resource | Methods |
|
|
125
|
+
|---|---|
|
|
126
|
+
| `client.leads` | `create`, `get`, `update`, `delete`, `list`, `iterate`, `export`, `batchCreate`, `batchUpdate`, `batchDelete` |
|
|
127
|
+
| `client.notes` | `create`, `list`, `update`, `delete` |
|
|
128
|
+
| `client.scoring` | `listRules`, `createRule`, `getRule`, `updateRule`, `deleteRule`, `recalculate` |
|
|
129
|
+
| `client.webhooks` | `list`, `create`, `delete` |
|
|
130
|
+
|
|
131
|
+
## Rate Limit State
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
const state = client.rateLimitState();
|
|
135
|
+
// { limit: 100, remaining: 87 } or null before first request
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Links
|
|
139
|
+
|
|
140
|
+
- API docs: https://docs.klozeo.com
|
|
141
|
+
- Dashboard: https://app.klozeo.com
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.textAttr = textAttr;
|
|
4
|
+
exports.numberAttr = numberAttr;
|
|
5
|
+
exports.boolAttr = boolAttr;
|
|
6
|
+
exports.listAttr = listAttr;
|
|
7
|
+
exports.objectAttr = objectAttr;
|
|
8
|
+
/**
|
|
9
|
+
* Create a text attribute.
|
|
10
|
+
* @example textAttr("industry", "Software")
|
|
11
|
+
*/
|
|
12
|
+
function textAttr(name, value) {
|
|
13
|
+
return { name, type: "text", value };
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a numeric attribute.
|
|
17
|
+
* @example numberAttr("employees", 500)
|
|
18
|
+
*/
|
|
19
|
+
function numberAttr(name, value) {
|
|
20
|
+
return { name, type: "number", value };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a boolean attribute.
|
|
24
|
+
* @example boolAttr("verified", true)
|
|
25
|
+
*/
|
|
26
|
+
function boolAttr(name, value) {
|
|
27
|
+
return { name, type: "bool", value };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a list attribute.
|
|
31
|
+
* @example listAttr("products", ["CRM", "ERP"])
|
|
32
|
+
*/
|
|
33
|
+
function listAttr(name, value) {
|
|
34
|
+
return { name, type: "list", value };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create an object attribute.
|
|
38
|
+
* @example objectAttr("social", { linkedin: "https://linkedin.com/company/acme" })
|
|
39
|
+
*/
|
|
40
|
+
function objectAttr(name, value) {
|
|
41
|
+
return { name, type: "object", value };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=attribute-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-helpers.js","sourceRoot":"","sources":["../../src/attribute-helpers.ts"],"names":[],"mappings":";;AAMA,4BAEC;AAMD,gCAEC;AAMD,4BAEC;AAMD,4BAEC;AAMD,gCAEC;AAtCD;;;GAGG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAY,EAAE,KAAa;IACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,KAAc;IACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,KAAe;IACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAY,EAAE,KAA8B;IACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Klozeo = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
const errors_1 = require("./errors");
|
|
6
|
+
const leads_1 = require("./resources/leads");
|
|
7
|
+
const notes_1 = require("./resources/notes");
|
|
8
|
+
const scoring_1 = require("./resources/scoring");
|
|
9
|
+
const webhooks_1 = require("./resources/webhooks");
|
|
10
|
+
const DEFAULT_BASE_URL = "https://app.klozeo.com/api/v1";
|
|
11
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
12
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
13
|
+
/**
|
|
14
|
+
* Main Klozeo API client.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { Klozeo } from "@klozeo/sdk";
|
|
19
|
+
*
|
|
20
|
+
* const client = new Klozeo("sk_live_your_api_key");
|
|
21
|
+
* const lead = await client.leads.get("cl_...");
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
class Klozeo {
|
|
25
|
+
constructor(apiKey, options) {
|
|
26
|
+
this._rateLimitState = null;
|
|
27
|
+
if (!apiKey || typeof apiKey !== "string") {
|
|
28
|
+
throw new TypeError("Klozeo: apiKey must be a non-empty string");
|
|
29
|
+
}
|
|
30
|
+
this.apiKey = apiKey;
|
|
31
|
+
this.baseUrl = (options?.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
|
|
32
|
+
this.timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
33
|
+
this.maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
34
|
+
this.fetchImpl = options?.fetch ?? globalThis.fetch.bind(globalThis);
|
|
35
|
+
this.leads = new leads_1.LeadsResource(this);
|
|
36
|
+
this.notes = new notes_1.NotesResource(this);
|
|
37
|
+
this.scoring = new scoring_1.ScoringResource(this);
|
|
38
|
+
this.webhooks = new webhooks_1.WebhooksResource(this);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns the last observed rate-limit state from response headers,
|
|
42
|
+
* or `null` if no request has been made yet.
|
|
43
|
+
*/
|
|
44
|
+
rateLimitState() {
|
|
45
|
+
return this._rateLimitState;
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Internal HTTP helpers (implements HttpClient)
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Make a JSON API request with automatic retry on 429 / 5xx.
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
async request(method, path, opts = {}) {
|
|
55
|
+
const url = `${this.baseUrl}${path}`;
|
|
56
|
+
const headers = {
|
|
57
|
+
"X-API-Key": this.apiKey,
|
|
58
|
+
"Content-Type": "application/json",
|
|
59
|
+
Accept: "application/json",
|
|
60
|
+
};
|
|
61
|
+
const init = {
|
|
62
|
+
method,
|
|
63
|
+
headers,
|
|
64
|
+
...(opts.body !== undefined
|
|
65
|
+
? { body: JSON.stringify(opts.body) }
|
|
66
|
+
: {}),
|
|
67
|
+
};
|
|
68
|
+
return this._executeWithRetry(url, init, false);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Make a request that returns a Blob (used by the export endpoint).
|
|
72
|
+
* @internal
|
|
73
|
+
*/
|
|
74
|
+
async requestBlob(method, path) {
|
|
75
|
+
const url = `${this.baseUrl}${path}`;
|
|
76
|
+
const init = {
|
|
77
|
+
method,
|
|
78
|
+
headers: {
|
|
79
|
+
"X-API-Key": this.apiKey,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
return this._executeWithRetry(url, init, true);
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Private helpers
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
async _executeWithRetry(url, init, blobResponse) {
|
|
88
|
+
let lastError;
|
|
89
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
90
|
+
const response = await this._fetchWithTimeout(url, init);
|
|
91
|
+
// Update rate-limit state from every response
|
|
92
|
+
this._updateRateLimitState(response);
|
|
93
|
+
if (response.ok) {
|
|
94
|
+
if (blobResponse) {
|
|
95
|
+
return response.blob();
|
|
96
|
+
}
|
|
97
|
+
// 204 No Content — return empty object
|
|
98
|
+
if (response.status === 204) {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
return response.json();
|
|
102
|
+
}
|
|
103
|
+
// Build a typed error
|
|
104
|
+
const error = await (0, utils_1.parseError)(response);
|
|
105
|
+
// Retry on 429 and 5xx
|
|
106
|
+
const shouldRetry = attempt < this.maxRetries &&
|
|
107
|
+
(response.status === 429 || response.status >= 500);
|
|
108
|
+
if (!shouldRetry) {
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
// For 429, respect the Retry-After header
|
|
112
|
+
if (error instanceof errors_1.RateLimitedError) {
|
|
113
|
+
await (0, utils_1.sleep)(error.retryAfter * 1000);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
await (0, utils_1.sleep)((0, utils_1.backoffDelay)(attempt));
|
|
117
|
+
}
|
|
118
|
+
lastError = error;
|
|
119
|
+
}
|
|
120
|
+
// Should not reach here, but satisfy TypeScript
|
|
121
|
+
throw lastError ?? new Error("Request failed after retries");
|
|
122
|
+
}
|
|
123
|
+
async _fetchWithTimeout(url, init) {
|
|
124
|
+
if (typeof AbortController === "undefined") {
|
|
125
|
+
// Environments without AbortController (very old runtimes)
|
|
126
|
+
return this.fetchImpl(url, init);
|
|
127
|
+
}
|
|
128
|
+
const controller = new AbortController();
|
|
129
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
130
|
+
try {
|
|
131
|
+
return await this.fetchImpl(url, { ...init, signal: controller.signal });
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
clearTimeout(timer);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
_updateRateLimitState(response) {
|
|
138
|
+
const limit = response.headers.get("X-RateLimit-Limit");
|
|
139
|
+
const remaining = response.headers.get("X-RateLimit-Remaining");
|
|
140
|
+
if (limit !== null && remaining !== null) {
|
|
141
|
+
const parsedLimit = parseInt(limit, 10);
|
|
142
|
+
const parsedRemaining = parseInt(remaining, 10);
|
|
143
|
+
if (!isNaN(parsedLimit) && !isNaN(parsedRemaining)) {
|
|
144
|
+
this._rateLimitState = { limit: parsedLimit, remaining: parsedRemaining };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.Klozeo = Klozeo;
|
|
150
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BadRequestError = exports.RateLimitedError = exports.ForbiddenError = exports.UnauthorizedError = exports.NotFoundError = exports.KlozeoError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for all Klozeo API errors.
|
|
6
|
+
*/
|
|
7
|
+
class KlozeoError extends Error {
|
|
8
|
+
constructor(message, statusCode, code) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "KlozeoError";
|
|
11
|
+
this.statusCode = statusCode;
|
|
12
|
+
this.code = code;
|
|
13
|
+
// Maintain proper prototype chain for instanceof checks
|
|
14
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.KlozeoError = KlozeoError;
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when the API returns 404 Not Found.
|
|
20
|
+
*/
|
|
21
|
+
class NotFoundError extends KlozeoError {
|
|
22
|
+
constructor(message, code = "not_found") {
|
|
23
|
+
super(message, 404, code);
|
|
24
|
+
this.name = "NotFoundError";
|
|
25
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.NotFoundError = NotFoundError;
|
|
29
|
+
/**
|
|
30
|
+
* Thrown when the API returns 401 Unauthorized (missing or invalid API key).
|
|
31
|
+
*/
|
|
32
|
+
class UnauthorizedError extends KlozeoError {
|
|
33
|
+
constructor(message, code = "unauthorized") {
|
|
34
|
+
super(message, 401, code);
|
|
35
|
+
this.name = "UnauthorizedError";
|
|
36
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.UnauthorizedError = UnauthorizedError;
|
|
40
|
+
/**
|
|
41
|
+
* Thrown when the API returns 403 Forbidden (e.g. leads limit reached).
|
|
42
|
+
*/
|
|
43
|
+
class ForbiddenError extends KlozeoError {
|
|
44
|
+
constructor(message, code = "forbidden") {
|
|
45
|
+
super(message, 403, code);
|
|
46
|
+
this.name = "ForbiddenError";
|
|
47
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.ForbiddenError = ForbiddenError;
|
|
51
|
+
/**
|
|
52
|
+
* Thrown when the API returns 429 Too Many Requests.
|
|
53
|
+
* Check `retryAfter` (seconds) before retrying.
|
|
54
|
+
*/
|
|
55
|
+
class RateLimitedError extends KlozeoError {
|
|
56
|
+
constructor(message, retryAfter, code = "rate_limit_exceeded") {
|
|
57
|
+
super(message, 429, code);
|
|
58
|
+
this.name = "RateLimitedError";
|
|
59
|
+
this.retryAfter = retryAfter;
|
|
60
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.RateLimitedError = RateLimitedError;
|
|
64
|
+
/**
|
|
65
|
+
* Thrown when the API returns 400 Bad Request.
|
|
66
|
+
*/
|
|
67
|
+
class BadRequestError extends KlozeoError {
|
|
68
|
+
constructor(message, code = "bad_request") {
|
|
69
|
+
super(message, 400, code);
|
|
70
|
+
this.name = "BadRequestError";
|
|
71
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.BadRequestError = BadRequestError;
|
|
75
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,WAAY,SAAQ,KAAK;IAMpC,YAAY,OAAe,EAAE,UAAkB,EAAE,IAAY;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,wDAAwD;QACxD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAdD,kCAcC;AAED;;GAEG;AACH,MAAa,aAAc,SAAQ,WAAW;IAC5C,YAAY,OAAe,EAAE,IAAI,GAAG,WAAW;QAC7C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,sCAMC;AAED;;GAEG;AACH,MAAa,iBAAkB,SAAQ,WAAW;IAChD,YAAY,OAAe,EAAE,IAAI,GAAG,cAAc;QAChD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,8CAMC;AAED;;GAEG;AACH,MAAa,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAe,EAAE,IAAI,GAAG,WAAW;QAC7C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,wCAMC;AAED;;;GAGG;AACH,MAAa,gBAAiB,SAAQ,WAAW;IAI/C,YAAY,OAAe,EAAE,UAAkB,EAAE,IAAI,GAAG,qBAAqB;QAC3E,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAVD,4CAUC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,WAAW;IAC9C,YAAY,OAAe,EAAE,IAAI,GAAG,aAAa;QAC/C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,0CAMC"}
|