@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.
Files changed (69) hide show
  1. package/README.md +141 -0
  2. package/dist/cjs/attribute-helpers.js +43 -0
  3. package/dist/cjs/attribute-helpers.js.map +1 -0
  4. package/dist/cjs/client.js +150 -0
  5. package/dist/cjs/client.js.map +1 -0
  6. package/dist/cjs/errors.js +75 -0
  7. package/dist/cjs/errors.js.map +1 -0
  8. package/dist/cjs/filters/index.js +320 -0
  9. package/dist/cjs/filters/index.js.map +1 -0
  10. package/dist/cjs/index.js +42 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/package.json +3 -0
  13. package/dist/cjs/resources/leads.js +156 -0
  14. package/dist/cjs/resources/leads.js.map +1 -0
  15. package/dist/cjs/resources/notes.js +50 -0
  16. package/dist/cjs/resources/notes.js.map +1 -0
  17. package/dist/cjs/resources/scoring.js +63 -0
  18. package/dist/cjs/resources/scoring.js.map +1 -0
  19. package/dist/cjs/resources/webhooks.js +41 -0
  20. package/dist/cjs/resources/webhooks.js.map +1 -0
  21. package/dist/cjs/types.js +13 -0
  22. package/dist/cjs/types.js.map +1 -0
  23. package/dist/cjs/utils.js +179 -0
  24. package/dist/cjs/utils.js.map +1 -0
  25. package/dist/esm/attribute-helpers.js +36 -0
  26. package/dist/esm/attribute-helpers.js.map +1 -0
  27. package/dist/esm/client.js +159 -0
  28. package/dist/esm/client.js.map +1 -0
  29. package/dist/esm/errors.js +72 -0
  30. package/dist/esm/errors.js.map +1 -0
  31. package/dist/esm/filters/index.js +304 -0
  32. package/dist/esm/filters/index.js.map +1 -0
  33. package/dist/esm/index.js +26 -0
  34. package/dist/esm/index.js.map +1 -0
  35. package/dist/esm/resources/leads.js +153 -0
  36. package/dist/esm/resources/leads.js.map +1 -0
  37. package/dist/esm/resources/notes.js +47 -0
  38. package/dist/esm/resources/notes.js.map +1 -0
  39. package/dist/esm/resources/scoring.js +60 -0
  40. package/dist/esm/resources/scoring.js.map +1 -0
  41. package/dist/esm/resources/webhooks.js +38 -0
  42. package/dist/esm/resources/webhooks.js.map +1 -0
  43. package/dist/esm/types.js +10 -0
  44. package/dist/esm/types.js.map +1 -0
  45. package/dist/esm/utils.js +168 -0
  46. package/dist/esm/utils.js.map +1 -0
  47. package/dist/types/attribute-helpers.d.ts +27 -0
  48. package/dist/types/attribute-helpers.d.ts.map +1 -0
  49. package/dist/types/client.d.ts +64 -0
  50. package/dist/types/client.d.ts.map +1 -0
  51. package/dist/types/errors.d.ts +44 -0
  52. package/dist/types/errors.d.ts.map +1 -0
  53. package/dist/types/filters/index.d.ts +173 -0
  54. package/dist/types/filters/index.d.ts.map +1 -0
  55. package/dist/types/index.d.ts +23 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. package/dist/types/resources/leads.d.ts +67 -0
  58. package/dist/types/resources/leads.d.ts.map +1 -0
  59. package/dist/types/resources/notes.d.ts +31 -0
  60. package/dist/types/resources/notes.d.ts.map +1 -0
  61. package/dist/types/resources/scoring.d.ts +35 -0
  62. package/dist/types/resources/scoring.d.ts.map +1 -0
  63. package/dist/types/resources/webhooks.d.ts +25 -0
  64. package/dist/types/resources/webhooks.d.ts.map +1 -0
  65. package/dist/types/types.d.ts +409 -0
  66. package/dist/types/types.d.ts.map +1 -0
  67. package/dist/types/utils.d.ts +49 -0
  68. package/dist/types/utils.d.ts.map +1 -0
  69. 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":";;;AACA,mCAA0D;AAC1D,qCAA4C;AAC5C,6CAAkD;AAClD,6CAAkD;AAClD,iDAAsD;AACtD,mDAAwD;AAExD,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AACzD,MAAM,eAAe,GAAG,KAAM,CAAC;AAC/B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAe9B;;;;;;;;;;GAUG;AACH,MAAa,MAAM;IAiBjB,YAAY,MAAc,EAAE,OAAuB;QAF3C,oBAAe,GAA0B,IAAI,CAAC;QAGpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAErE,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAa,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAa,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,yBAAe,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,8EAA8E;IAC9E,gDAAgD;IAChD,8EAA8E;IAE9E;;;OAGG;IACH,KAAK,CAAC,OAAO,CACX,MAAc,EACd,IAAY,EACZ,OAA2B,EAAE;QAE7B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,MAAM,IAAI,GAAgB;YACxB,MAAM;YACN,OAAO;YACP,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;gBACzB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACrC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QAEF,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,IAAY;QAC5C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAgB;YACxB,MAAM;YACN,OAAO,EAAE;gBACP,WAAW,EAAE,IAAI,CAAC,MAAM;aACzB;SACF,CAAC;QAEF,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAkB,CAAC;IAClE,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,KAAK,CAAC,iBAAiB,CAC7B,GAAW,EACX,IAAiB,EACjB,YAAqB;QAErB,IAAI,SAA4B,CAAC;QAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAEzD,8CAA8C;YAC9C,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAErC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACzB,CAAC;gBACD,uCAAuC;gBACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;YAED,sBAAsB;YACtB,MAAM,KAAK,GAAG,MAAM,IAAA,kBAAU,EAAC,QAAQ,CAAC,CAAC;YAEzC,uBAAuB;YACvB,MAAM,WAAW,GACf,OAAO,GAAG,IAAI,CAAC,UAAU;gBACzB,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;YAEtD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,KAAK,CAAC;YACd,CAAC;YAED,0CAA0C;YAC1C,IAAI,KAAK,YAAY,yBAAgB,EAAE,CAAC;gBACtC,MAAM,IAAA,aAAK,EAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAA,aAAK,EAAC,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;QAED,gDAAgD;QAChD,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,GAAW,EACX,IAAiB;QAEjB,IAAI,OAAO,eAAe,KAAK,WAAW,EAAE,CAAC;YAC3C,2DAA2D;YAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,QAAkB;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAChE,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,eAAe,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,eAAe,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA3KD,wBA2KC"}
@@ -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"}