@gatectr/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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +199 -0
  3. package/dist/cjs/client.d.ts +50 -0
  4. package/dist/cjs/client.d.ts.map +1 -0
  5. package/dist/cjs/client.js +316 -0
  6. package/dist/cjs/client.js.map +1 -0
  7. package/dist/cjs/errors.d.ts +42 -0
  8. package/dist/cjs/errors.d.ts.map +1 -0
  9. package/dist/cjs/errors.js +84 -0
  10. package/dist/cjs/errors.js.map +1 -0
  11. package/dist/cjs/http.d.ts +26 -0
  12. package/dist/cjs/http.d.ts.map +1 -0
  13. package/dist/cjs/http.js +164 -0
  14. package/dist/cjs/http.js.map +1 -0
  15. package/dist/cjs/index.d.ts +4 -0
  16. package/dist/cjs/index.d.ts.map +1 -0
  17. package/dist/cjs/index.js +15 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/package.json +3 -0
  20. package/dist/cjs/stream.d.ts +8 -0
  21. package/dist/cjs/stream.d.ts.map +1 -0
  22. package/dist/cjs/stream.js +100 -0
  23. package/dist/cjs/stream.js.map +1 -0
  24. package/dist/cjs/types.d.ts +155 -0
  25. package/dist/cjs/types.d.ts.map +1 -0
  26. package/dist/cjs/types.js +3 -0
  27. package/dist/cjs/types.js.map +1 -0
  28. package/dist/esm/client.d.ts +50 -0
  29. package/dist/esm/client.d.ts.map +1 -0
  30. package/dist/esm/client.js +312 -0
  31. package/dist/esm/client.js.map +1 -0
  32. package/dist/esm/errors.d.ts +42 -0
  33. package/dist/esm/errors.d.ts.map +1 -0
  34. package/dist/esm/errors.js +75 -0
  35. package/dist/esm/errors.js.map +1 -0
  36. package/dist/esm/http.d.ts +26 -0
  37. package/dist/esm/http.d.ts.map +1 -0
  38. package/dist/esm/http.js +160 -0
  39. package/dist/esm/http.js.map +1 -0
  40. package/dist/esm/index.d.ts +4 -0
  41. package/dist/esm/index.d.ts.map +1 -0
  42. package/dist/esm/index.js +5 -0
  43. package/dist/esm/index.js.map +1 -0
  44. package/dist/esm/stream.d.ts +8 -0
  45. package/dist/esm/stream.d.ts.map +1 -0
  46. package/dist/esm/stream.js +97 -0
  47. package/dist/esm/stream.js.map +1 -0
  48. package/dist/esm/types.d.ts +155 -0
  49. package/dist/esm/types.d.ts.map +1 -0
  50. package/dist/esm/types.js +2 -0
  51. package/dist/esm/types.js.map +1 -0
  52. package/package.json +88 -0
@@ -0,0 +1,160 @@
1
+ // sdk-node/src/http.ts
2
+ import { GateCtrApiError, GateCtrNetworkError, GateCtrTimeoutError } from "./errors.js";
3
+ /** Status codes that warrant automatic retry */
4
+ const RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);
5
+ /** Status codes that should never be retried */
6
+ const NON_RETRYABLE_STATUSES = new Set([400, 401, 403, 404]);
7
+ /**
8
+ * Exponential backoff with jitter.
9
+ * delay = min(500 * 2^attempt + jitter(0-100ms), 10_000ms)
10
+ */
11
+ export function backoffMs(attempt) {
12
+ const base = 500 * Math.pow(2, attempt);
13
+ const jitter = Math.floor(Math.random() * 101);
14
+ return Math.min(base + jitter, 10_000);
15
+ }
16
+ /** Sleep for the given number of milliseconds */
17
+ function sleep(ms) {
18
+ return new Promise((resolve) => setTimeout(resolve, ms));
19
+ }
20
+ /**
21
+ * Combines multiple AbortSignals into one. Safe for Node 18+.
22
+ * The returned signal aborts when any of the input signals abort.
23
+ */
24
+ function combineSignals(signals) {
25
+ const controller = new AbortController();
26
+ for (const signal of signals) {
27
+ if (signal.aborted) {
28
+ controller.abort(signal.reason);
29
+ return controller.signal;
30
+ }
31
+ signal.addEventListener("abort", () => {
32
+ controller.abort(signal.reason);
33
+ }, { once: true });
34
+ }
35
+ return controller.signal;
36
+ }
37
+ /**
38
+ * Core HTTP request function with retry loop and timeout.
39
+ * Throws typed GateCtr errors — never raw fetch errors.
40
+ */
41
+ export async function httpRequest(opts) {
42
+ const { method, url, headers, body, signal: callerSignal, timeoutMs, maxRetries } = opts;
43
+ let lastError;
44
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
45
+ // Apply backoff before retry attempts (not before the first attempt)
46
+ if (attempt > 0) {
47
+ await sleep(backoffMs(attempt - 1));
48
+ }
49
+ // Create a per-attempt AbortController for timeout
50
+ const timeoutController = new AbortController();
51
+ const timeoutId = setTimeout(() => {
52
+ timeoutController.abort();
53
+ }, timeoutMs);
54
+ // Combine caller signal with timeout signal
55
+ const combinedSignal = callerSignal
56
+ ? combineSignals([callerSignal, timeoutController.signal])
57
+ : timeoutController.signal;
58
+ let response;
59
+ try {
60
+ response = await fetch(url, {
61
+ method,
62
+ headers,
63
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
64
+ signal: combinedSignal,
65
+ });
66
+ }
67
+ catch (err) {
68
+ clearTimeout(timeoutId);
69
+ // Distinguish timeout from other network errors
70
+ if (timeoutController.signal.aborted && !callerSignal?.aborted) {
71
+ throw new GateCtrTimeoutError(timeoutMs);
72
+ }
73
+ // Caller cancelled — rethrow as-is so the caller can handle it
74
+ if (callerSignal?.aborted) {
75
+ throw err;
76
+ }
77
+ // Other network error (DNS, ECONNREFUSED, etc.)
78
+ lastError = new GateCtrNetworkError(`Network error: ${err instanceof Error ? err.message : String(err)}`, err);
79
+ // Network errors are retryable
80
+ if (attempt < maxRetries) {
81
+ continue;
82
+ }
83
+ throw lastError;
84
+ }
85
+ clearTimeout(timeoutId);
86
+ // 2xx — success
87
+ if (response.status >= 200 && response.status < 300) {
88
+ return {
89
+ status: response.status,
90
+ headers: response.headers,
91
+ body: response.body,
92
+ json: () => response.json(),
93
+ };
94
+ }
95
+ // Non-retryable client errors — throw immediately
96
+ if (NON_RETRYABLE_STATUSES.has(response.status)) {
97
+ const requestId = response.headers.get("x-gatectr-request-id") ?? undefined;
98
+ let code = "api_error";
99
+ let message = `HTTP ${String(response.status)}`;
100
+ try {
101
+ const errorBody = (await response.json());
102
+ if (typeof errorBody["code"] === "string")
103
+ code = errorBody["code"];
104
+ if (typeof errorBody["message"] === "string")
105
+ message = errorBody["message"];
106
+ if (typeof errorBody["error"] === "string")
107
+ message = errorBody["error"];
108
+ }
109
+ catch {
110
+ // ignore parse errors
111
+ }
112
+ throw new GateCtrApiError({
113
+ message,
114
+ status: response.status,
115
+ code,
116
+ ...(requestId !== undefined ? { requestId } : {}),
117
+ });
118
+ }
119
+ // Retryable server errors
120
+ if (RETRYABLE_STATUSES.has(response.status)) {
121
+ const requestId = response.headers.get("x-gatectr-request-id") ?? undefined;
122
+ let code = "server_error";
123
+ let message = `HTTP ${String(response.status)}`;
124
+ try {
125
+ const errorBody = (await response.json());
126
+ if (typeof errorBody["code"] === "string")
127
+ code = errorBody["code"];
128
+ if (typeof errorBody["message"] === "string")
129
+ message = errorBody["message"];
130
+ }
131
+ catch {
132
+ // ignore parse errors
133
+ }
134
+ lastError = new GateCtrApiError({
135
+ message,
136
+ status: response.status,
137
+ code,
138
+ ...(requestId !== undefined ? { requestId } : {}),
139
+ });
140
+ if (attempt < maxRetries) {
141
+ continue;
142
+ }
143
+ throw lastError;
144
+ }
145
+ // Unknown status — treat as non-retryable
146
+ const requestId = response.headers.get("x-gatectr-request-id") ?? undefined;
147
+ throw new GateCtrApiError({
148
+ message: `Unexpected HTTP status ${String(response.status)}`,
149
+ status: response.status,
150
+ code: "unexpected_status",
151
+ ...(requestId !== undefined ? { requestId } : {}),
152
+ });
153
+ }
154
+ // Should never reach here, but TypeScript needs it
155
+ const fallback = lastError instanceof Error
156
+ ? lastError
157
+ : new GateCtrNetworkError("Request failed after retries");
158
+ throw fallback;
159
+ }
160
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { GateCtr } from "./client.js";
2
+ export { GateCtrError, GateCtrConfigError, GateCtrApiError, GateCtrTimeoutError, GateCtrStreamError, GateCtrNetworkError, } from "./errors.js";
3
+ export type { GateCtrConfig, PerRequestOptions, Message, GateCtrMetadata, UsageCounts, CompleteParams, CompleteResponse, ChatParams, ChatResponse, StreamParams, StreamChunk, ModelInfo, ModelsResponse, UsageParams, UsageByProject, UsageResponse, } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,OAAO,EACP,eAAe,EACf,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,SAAS,EACT,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ // sdk-node/src/index.ts
2
+ // Public API surface for @gatectr/sdk
3
+ export { GateCtr } from "./client.js";
4
+ export { GateCtrError, GateCtrConfigError, GateCtrApiError, GateCtrTimeoutError, GateCtrStreamError, GateCtrNetworkError, } from "./errors.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,sCAAsC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { StreamChunk } from "./types.js";
2
+ /**
3
+ * Parses a Server-Sent Events (SSE) stream from a ReadableStream body.
4
+ * Yields StreamChunk for each data line, stops cleanly on [DONE] sentinel.
5
+ * Propagates GateCtrStreamError on connection abort or parse error.
6
+ */
7
+ export declare function parseSSE(body: ReadableStream<Uint8Array>, signal?: AbortSignal): AsyncGenerator<StreamChunk>;
8
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;GAIG;AACH,wBAAuB,QAAQ,CAC7B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,WAAW,CAAC,CAqG7B"}
@@ -0,0 +1,97 @@
1
+ // sdk-node/src/stream.ts
2
+ import { GateCtrStreamError } from "./errors.js";
3
+ /**
4
+ * Parses a Server-Sent Events (SSE) stream from a ReadableStream body.
5
+ * Yields StreamChunk for each data line, stops cleanly on [DONE] sentinel.
6
+ * Propagates GateCtrStreamError on connection abort or parse error.
7
+ */
8
+ export async function* parseSSE(body, signal) {
9
+ const decoder = new TextDecoder();
10
+ const reader = body.getReader();
11
+ let buffer = "";
12
+ try {
13
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
14
+ while (true) {
15
+ // Check for cancellation before each read
16
+ if (signal !== undefined && signal.aborted) {
17
+ throw new GateCtrStreamError("Stream cancelled by caller");
18
+ }
19
+ let done;
20
+ let value;
21
+ try {
22
+ ({ done, value } = await reader.read());
23
+ }
24
+ catch (err) {
25
+ throw new GateCtrStreamError(`Stream read error: ${err instanceof Error ? err.message : String(err)}`, err);
26
+ }
27
+ if (done)
28
+ break;
29
+ if (value !== undefined) {
30
+ buffer += decoder.decode(value, { stream: true });
31
+ }
32
+ // Process all complete lines in the buffer
33
+ const lines = buffer.split("\n");
34
+ // Keep the last (potentially incomplete) line in the buffer
35
+ buffer = lines.pop() ?? "";
36
+ for (const line of lines) {
37
+ const trimmed = line.trim();
38
+ // Skip empty lines and comment lines
39
+ if (trimmed === "" || trimmed.startsWith(":"))
40
+ continue;
41
+ // Parse data lines
42
+ if (trimmed.startsWith("data:")) {
43
+ const data = trimmed.slice(5).trim();
44
+ // [DONE] sentinel — stream is complete
45
+ if (data === "[DONE]") {
46
+ return;
47
+ }
48
+ // Parse JSON payload
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(data);
52
+ }
53
+ catch (err) {
54
+ throw new GateCtrStreamError(`Failed to parse SSE data as JSON: ${data}`, err);
55
+ }
56
+ const chunk = parsed;
57
+ const choices = chunk["choices"];
58
+ const firstChoice = choices?.[0];
59
+ const delta = firstChoice?.["delta"];
60
+ const content = delta?.["content"];
61
+ const finishReason = firstChoice?.["finish_reason"];
62
+ yield {
63
+ id: typeof chunk["id"] === "string" ? chunk["id"] : "",
64
+ delta: typeof content === "string" ? content : null,
65
+ finishReason: typeof finishReason === "string" ? finishReason : null,
66
+ };
67
+ }
68
+ }
69
+ }
70
+ // Flush any remaining buffer content
71
+ if (buffer.trim().startsWith("data:")) {
72
+ const data = buffer.trim().slice(5).trim();
73
+ if (data !== "[DONE]" && data !== "") {
74
+ try {
75
+ const parsed = JSON.parse(data);
76
+ const choices = parsed["choices"];
77
+ const firstChoice = choices?.[0];
78
+ const delta = firstChoice?.["delta"];
79
+ const content = delta?.["content"];
80
+ const finishReason = firstChoice?.["finish_reason"];
81
+ yield {
82
+ id: typeof parsed["id"] === "string" ? parsed["id"] : "",
83
+ delta: typeof content === "string" ? content : null,
84
+ finishReason: typeof finishReason === "string" ? finishReason : null,
85
+ };
86
+ }
87
+ catch {
88
+ // ignore incomplete final chunk
89
+ }
90
+ }
91
+ }
92
+ }
93
+ finally {
94
+ reader.releaseLock();
95
+ }
96
+ }
97
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /** Client configuration passed to the GateCtr constructor */
2
+ export interface GateCtrConfig {
3
+ /** Bearer token for authentication. Falls back to GATECTR_API_KEY env var. */
4
+ apiKey?: string;
5
+ /** Base URL for the GateCtr API. Default: "https://api.gatectr.com/v1" */
6
+ baseUrl?: string;
7
+ /** Request timeout in milliseconds. Default: 30000 */
8
+ timeout?: number;
9
+ /** Maximum number of retries for transient errors. Default: 3 */
10
+ maxRetries?: number;
11
+ /** Enable Context Optimizer globally. Default: true */
12
+ optimize?: boolean;
13
+ /** Enable Model Router globally. Default: false */
14
+ route?: boolean;
15
+ }
16
+ /** Per-request GateCtr overrides passed in params.gatectr */
17
+ export interface PerRequestOptions {
18
+ /** Budget ID to enforce for this request */
19
+ budgetId?: string;
20
+ /** Override client-level optimize setting for this request */
21
+ optimize?: boolean;
22
+ /** Override client-level route setting for this request */
23
+ route?: boolean;
24
+ }
25
+ /** OpenAI-compatible message shape */
26
+ export interface Message {
27
+ role: "system" | "user" | "assistant";
28
+ content: string;
29
+ }
30
+ /** GateCtr metadata present on every response */
31
+ export interface GateCtrMetadata {
32
+ /** Unique request ID from X-GateCtr-Request-Id header */
33
+ requestId: string;
34
+ /** Request latency in ms from X-GateCtr-Latency-Ms header */
35
+ latencyMs: number;
36
+ /** Whether the request exceeded the budget, from X-GateCtr-Overage header */
37
+ overage: boolean;
38
+ /** The model that actually processed the request */
39
+ modelUsed: string;
40
+ /** Number of tokens saved by the Context Optimizer */
41
+ tokensSaved: number;
42
+ }
43
+ /** Token usage counts */
44
+ export interface UsageCounts {
45
+ prompt_tokens: number;
46
+ completion_tokens: number;
47
+ total_tokens: number;
48
+ }
49
+ /** Parameters for client.complete() */
50
+ export interface CompleteParams {
51
+ model: string;
52
+ messages: Message[];
53
+ max_tokens?: number;
54
+ temperature?: number;
55
+ /** Per-request GateCtr overrides */
56
+ gatectr?: PerRequestOptions;
57
+ /** AbortSignal to cancel the request */
58
+ signal?: AbortSignal;
59
+ }
60
+ /** Response from client.complete() */
61
+ export interface CompleteResponse {
62
+ id: string;
63
+ object: "text_completion";
64
+ model: string;
65
+ choices: Array<{
66
+ text: string;
67
+ finish_reason: string;
68
+ }>;
69
+ usage: UsageCounts;
70
+ gatectr: GateCtrMetadata;
71
+ }
72
+ /** Parameters for client.chat() */
73
+ export interface ChatParams {
74
+ model: string;
75
+ messages: Message[];
76
+ max_tokens?: number;
77
+ temperature?: number;
78
+ /** Per-request GateCtr overrides */
79
+ gatectr?: PerRequestOptions;
80
+ /** AbortSignal to cancel the request */
81
+ signal?: AbortSignal;
82
+ }
83
+ /** Response from client.chat() */
84
+ export interface ChatResponse {
85
+ id: string;
86
+ object: "chat.completion";
87
+ model: string;
88
+ choices: Array<{
89
+ message: Message;
90
+ finish_reason: string;
91
+ }>;
92
+ usage: UsageCounts;
93
+ gatectr: GateCtrMetadata;
94
+ }
95
+ /** Parameters for client.stream() */
96
+ export interface StreamParams {
97
+ model: string;
98
+ messages: Message[];
99
+ max_tokens?: number;
100
+ temperature?: number;
101
+ /** Per-request GateCtr overrides */
102
+ gatectr?: PerRequestOptions;
103
+ /** AbortSignal to cancel the stream */
104
+ signal?: AbortSignal;
105
+ }
106
+ /** A single SSE chunk yielded by client.stream() */
107
+ export interface StreamChunk {
108
+ /** Completion ID */
109
+ id: string;
110
+ /** Incremental text delta, null on final chunk */
111
+ delta: string | null;
112
+ /** Finish reason, non-null on final chunk */
113
+ finishReason: string | null;
114
+ }
115
+ /** Information about a single available model */
116
+ export interface ModelInfo {
117
+ modelId: string;
118
+ displayName: string;
119
+ provider: string;
120
+ contextWindow: number;
121
+ capabilities: string[];
122
+ }
123
+ /** Response from client.models() */
124
+ export interface ModelsResponse {
125
+ models: ModelInfo[];
126
+ requestId: string;
127
+ }
128
+ /** Optional filters for client.usage() */
129
+ export interface UsageParams {
130
+ /** Start date in YYYY-MM-DD format */
131
+ from?: string;
132
+ /** End date in YYYY-MM-DD format */
133
+ to?: string;
134
+ /** Filter by project ID */
135
+ projectId?: string;
136
+ }
137
+ /** Per-project usage breakdown */
138
+ export interface UsageByProject {
139
+ projectId: string | null;
140
+ totalTokens: number;
141
+ totalRequests: number;
142
+ totalCostUsd: number;
143
+ }
144
+ /** Response from client.usage() */
145
+ export interface UsageResponse {
146
+ totalTokens: number;
147
+ totalRequests: number;
148
+ totalCostUsd: number;
149
+ savedTokens: number;
150
+ from: string;
151
+ to: string;
152
+ byProject: UsageByProject[];
153
+ budgetStatus?: Record<string, unknown>;
154
+ }
155
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@gatectr/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Node.js SDK for GateCtr — One gateway. Every LLM.",
5
+ "license": "MIT",
6
+ "author": "GateCtr",
7
+ "homepage": "https://gatectr.com",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/GateCtr/sdk-node.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/GateCtr/sdk-node/issues"
14
+ },
15
+ "keywords": [
16
+ "llm",
17
+ "openai",
18
+ "anthropic",
19
+ "gateway",
20
+ "ai",
21
+ "sdk"
22
+ ],
23
+ "engines": {
24
+ "node": ">=22"
25
+ },
26
+ "packageManager": "pnpm@10.32.1",
27
+ "type": "module",
28
+ "main": "./dist/cjs/index.js",
29
+ "module": "./dist/esm/index.js",
30
+ "types": "./dist/esm/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "import": {
34
+ "types": "./dist/esm/index.d.ts",
35
+ "default": "./dist/esm/index.js"
36
+ },
37
+ "require": {
38
+ "types": "./dist/cjs/index.d.ts",
39
+ "default": "./dist/cjs/index.js"
40
+ }
41
+ }
42
+ },
43
+ "files": [
44
+ "dist/",
45
+ "README.md"
46
+ ],
47
+ "scripts": {
48
+ "build": "pnpm clean && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && node scripts/postbuild.mjs",
49
+ "clean": "node scripts/clean.mjs",
50
+ "lint": "eslint src/ tests/",
51
+ "format": "prettier --write .",
52
+ "test": "vitest run",
53
+ "test:coverage": "vitest run --coverage",
54
+ "typecheck": "tsc --noEmit",
55
+ "changeset": "changeset",
56
+ "version": "changeset version",
57
+ "release": "pnpm build && changeset publish",
58
+ "prepublishOnly": "pnpm clean && pnpm build && pnpm test",
59
+ "prepare": "husky"
60
+ },
61
+ "devDependencies": {
62
+ "@changesets/cli": "^2.30.0",
63
+ "@types/node": "^22.0.0",
64
+ "@commitlint/cli": "^19.0.0",
65
+ "@commitlint/config-conventional": "^19.0.0",
66
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
67
+ "@typescript-eslint/parser": "^8.0.0",
68
+ "@vitest/coverage-v8": "^2.0.0",
69
+ "eslint": "^9.0.0",
70
+ "fast-check": "^3.0.0",
71
+ "husky": "^9.0.0",
72
+ "lint-staged": "^15.0.0",
73
+ "msw": "^2.12.11",
74
+ "prettier": "^3.0.0",
75
+ "typescript": "^5.0.0",
76
+ "vitest": "^2.0.0"
77
+ },
78
+ "lint-staged": {
79
+ "src/**/*.ts": [
80
+ "eslint --fix",
81
+ "prettier --write"
82
+ ],
83
+ "tests/**/*.ts": [
84
+ "eslint --fix",
85
+ "prettier --write"
86
+ ]
87
+ }
88
+ }