zlient 1.0.0 → 1.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 zlient contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/auth.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { RequestOptions as ReqOpts } from "./types";
1
+ import type { RequestOptions as ReqOpts } from './types';
2
2
  export interface AuthProvider {
3
3
  /**
4
4
  * Apply authentication to the outgoing request.
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzD,MAAM,WAAW,YAAY;IACzB;;;OAGG;IACH,KAAK,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3F;AAED,qBAAa,MAAO,YAAW,YAAY;IACjC,KAAK;CACd;AAED,qBAAa,UAAW,YAAW,YAAY;IAC/B,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAC5E,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE;CAS1D;AAED,qBAAa,eAAgB,YAAW,YAAY;IACpC,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IACtD,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE;CAI3D"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,KAAK,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzF;AAED,qBAAa,MAAO,YAAW,YAAY;IACnC,KAAK;CAGZ;AAED,qBAAa,UAAW,YAAW,YAAY;IACjC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAC5E,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE;CASxD;AAED,qBAAa,eAAgB,YAAW,YAAY;IACtC,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IACtD,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE;CAIzD"}
@@ -1,6 +1,6 @@
1
- import { z } from "zod";
2
- import { HttpClient } from "../http/HttpClient";
3
- import { HTTPMethod, RequestOptions } from "../types";
1
+ import { z } from 'zod';
2
+ import { HttpClient } from '../http/HttpClient';
3
+ import { HTTPMethod, RequestOptions } from '../types';
4
4
  /**
5
5
  * Generic, strongly-typed endpoint with Zod schemas for request and response.
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEndpoint.d.ts","sourceRoot":"","sources":["../../src/api/endpoint/BaseEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGtD;;GAEG;AACH,8BAAsB,YAAY,CAAC,SAAS,SAAS,CAAC,CAAC,UAAU,EAAE,SAAS,SAAS,CAAC,CAAC,UAAU;IAMjF,SAAS,CAAC,MAAM,EAAE,UAAU;IALxC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAAC;IAC5D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACrE,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;gBAEvB,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE;QAAE,aAAa,CAAC,EAAE,SAAS,CAAC;QAAC,cAAc,EAAE,SAAS,CAAA;KAAE;IAKvG;;OAEG;IACG,IAAI,CACN,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EACxB,OAAO,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;CAkBjC"}
1
+ {"version":3,"file":"BaseEndpoint.d.ts","sourceRoot":"","sources":["../../lib/endpoint/BaseEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGtD;;GAEG;AACH,8BAAsB,YAAY,CAAC,SAAS,SAAS,CAAC,CAAC,UAAU,EAAE,SAAS,SAAS,CAAC,CAAC,UAAU;IAO7F,SAAS,CAAC,MAAM,EAAE,UAAU;IAN9B,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAAC;IAC5D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACrE,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;gBAGjC,MAAM,EAAE,UAAU,EAC5B,GAAG,EAAE;QAAE,aAAa,CAAC,EAAE,SAAS,CAAC;QAAC,cAAc,EAAE,SAAS,CAAA;KAAE;IAM/D;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;CAkB5F"}
@@ -1,5 +1,5 @@
1
- import { ClientOptions, HTTPMethod, RequestOptions } from "../types";
2
- import type { AuthProvider } from "../auth";
1
+ import { ClientOptions, HTTPMethod, RequestOptions } from '../types';
2
+ import type { AuthProvider } from '../auth';
3
3
  export declare class HttpClient {
4
4
  private fetchImpl;
5
5
  private baseUrls;
@@ -1 +1 @@
1
- {"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/api/http/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,aAAa,EAAa,UAAU,EAAgB,cAAc,EAAgC,MAAM,UAAU,CAAC;AACtI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,UAAU;IACnB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAe;gBAEf,IAAI,EAAE,aAAa,GAAG;QAAE,IAAI,CAAC,EAAE,YAAY,CAAA;KAAE;IAgBzD,OAAO,CAAC,IAAI,EAAE,YAAY;IAE1B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,KAAK;YAEC,SAAS;YAiBT,cAAc;YAMd,aAAa;IAMrB,OAAO,CAAC,CAAC,GAAG,OAAO,EACrB,MAAM,EAAE,MAAM,OAAO,UAAU,EAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;CA2D9C"}
1
+ {"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../lib/http/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EAEb,UAAU,EAEV,cAAc,EAGf,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAe;gBAEf,IAAI,EAAE,aAAa,GAAG;QAAE,IAAI,CAAC,EAAE,YAAY,CAAA;KAAE;IAiBzD,OAAO,CAAC,IAAI,EAAE,YAAY;IAI1B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,KAAK;YAIC,SAAS;YAoBT,cAAc;YAMd,aAAa;IAMrB,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,MAAM,EAAE,MAAM,OAAO,UAAU,EAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;CA+E5C"}
package/dist/index.cjs CHANGED
@@ -36,7 +36,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
36
36
  let zod = require("zod");
37
37
  zod = __toESM(zod);
38
38
 
39
- //#region src/api/types.ts
39
+ //#region lib/types.ts
40
40
  const HTTPMethod = {
41
41
  GET: "GET",
42
42
  POST: "POST",
@@ -80,14 +80,14 @@ function toQueryString(q) {
80
80
  }
81
81
 
82
82
  //#endregion
83
- //#region src/api/auth.ts
83
+ //#region lib/auth.ts
84
84
  var auth_exports = /* @__PURE__ */ __export({
85
85
  ApiKeyAuth: () => ApiKeyAuth,
86
86
  BearerTokenAuth: () => BearerTokenAuth,
87
87
  NoAuth: () => NoAuth
88
88
  });
89
89
  var NoAuth, ApiKeyAuth, BearerTokenAuth;
90
- var init_auth = __esm({ "src/api/auth.ts": (() => {
90
+ var init_auth = __esm({ "lib/auth.ts": (() => {
91
91
  NoAuth = class {
92
92
  async apply() {}
93
93
  };
@@ -122,7 +122,7 @@ var init_auth = __esm({ "src/api/auth.ts": (() => {
122
122
  }) });
123
123
 
124
124
  //#endregion
125
- //#region src/api/validation.ts
125
+ //#region lib/validation.ts
126
126
  function safeParse(schema, data) {
127
127
  const res = schema.safeParse(data);
128
128
  if (res.success) return {
@@ -141,7 +141,7 @@ function parseOrThrow(schema, data) {
141
141
  }
142
142
 
143
143
  //#endregion
144
- //#region src/api/http/HttpClient.ts
144
+ //#region lib/http/HttpClient.ts
145
145
  var HttpClient = class {
146
146
  fetchImpl;
147
147
  baseUrls;
@@ -266,7 +266,7 @@ var HttpClient = class {
266
266
  };
267
267
 
268
268
  //#endregion
269
- //#region src/api/endpoint/BaseEndpoint.ts
269
+ //#region lib/endpoint/BaseEndpoint.ts
270
270
  /**
271
271
  * Generic, strongly-typed endpoint with Zod schemas for request and response.
272
272
  */
@@ -297,7 +297,7 @@ var BaseEndpoint = class {
297
297
  };
298
298
 
299
299
  //#endregion
300
- //#region src/api/schemas/common.ts
300
+ //#region lib/schemas/common.ts
301
301
  const Id = zod.z.union([
302
302
  zod.z.string().min(1),
303
303
  zod.z.number(),
@@ -329,7 +329,7 @@ const Envelope = (inner) => zod.z.object({
329
329
  });
330
330
 
331
331
  //#endregion
332
- //#region src/api/index.ts
332
+ //#region lib/index.ts
333
333
  init_auth();
334
334
 
335
335
  //#endregion
@@ -349,4 +349,5 @@ exports.PaginationSchema = PaginationSchema;
349
349
  exports.Timestamps = Timestamps;
350
350
  exports.parseOrThrow = parseOrThrow;
351
351
  exports.safeParse = safeParse;
352
- exports.toQueryString = toQueryString;
352
+ exports.toQueryString = toQueryString;
353
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["z","s","opts: { header?: string; query?: string; value: string }","getToken: () => Promise<string> | string","k: string","err: any","init: RequestInit","timeoutId: any","client: HttpClient","z"],"sources":["../lib/types.ts","../lib/auth.ts","../lib/validation.ts","../lib/http/HttpClient.ts","../lib/endpoint/BaseEndpoint.ts","../lib/schemas/common.ts","../lib/index.ts"],"sourcesContent":["import { z, ZodError } from 'zod';\n\nexport type Dictionary<T = unknown> = Record<string, T>;\n\nexport type FetchLike = (input: string | Request | URL, init?: RequestInit) => Promise<Response>;\n\nexport type BaseUrlMap = {\n default: string;\n [service: string]: string;\n};\n\nexport type RetryStrategy = {\n maxRetries: number;\n /** milliseconds */\n baseDelayMs: number;\n /** Jitter factor 0..1 */\n jitter?: number;\n /** HTTP methods eligible for retry */\n retryMethods?: (keyof typeof HTTPMethod)[];\n /** Which status codes are retriable */\n shouldRetry?: (ctx: { attempt: number; error?: unknown; response?: Response }) => boolean;\n};\n\nexport const HTTPMethod = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n PATCH: 'PATCH',\n DELETE: 'DELETE',\n HEAD: 'HEAD',\n OPTIONS: 'OPTIONS',\n} as const;\n\nexport type HttpMethod = keyof typeof HTTPMethod;\n\nexport type AfterResponseHook = (ctx: {\n request: Request;\n response: Response;\n parsed?: unknown;\n}) => Promise<void> | void;\n\nexport type BeforeRequestHook = (ctx: { url: string; init: RequestInit }) => Promise<void> | void;\n\nexport interface Interceptors {\n beforeRequest?: BeforeRequestHook[];\n afterResponse?: AfterResponseHook[];\n}\n\nexport interface TimeoutOptions {\n /** ms */\n requestTimeoutMs?: number;\n}\n\nexport interface ClientOptions {\n baseUrls: BaseUrlMap;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n retry?: RetryStrategy;\n interceptors?: Interceptors;\n timeout?: TimeoutOptions;\n}\n\nexport type SafeParseResult<T> = { success: true; data: T } | { success: false; error: ZodError };\n\nexport class ApiError extends Error {\n public status?: number;\n public details?: unknown;\n public zodError?: ZodError;\n\n constructor(\n message: string,\n options?: { status?: number; cause?: unknown; details?: unknown; zodError?: ZodError }\n ) {\n super(message);\n this.name = 'ApiError';\n this.status = options?.status;\n this.details = options?.details;\n this.cause = options?.cause as any;\n this.zodError = options?.zodError;\n }\n}\n\nexport type Paginated<T> = {\n items: T[];\n total: number;\n page: number;\n pageSize: number;\n};\n\nexport const PaginationSchema = z.object({\n items: z.array(z.unknown()),\n total: z.number().int().nonnegative(),\n page: z.number().int().nonnegative(),\n pageSize: z.number().int().positive(),\n});\n\nexport type RequestOptions = {\n /** Override base URL for a single call */\n baseUrlKey?: keyof BaseUrlMap;\n /** Additional headers for this call only */\n headers?: Record<string, string>;\n /** Abort controller */\n signal?: AbortSignal;\n /** Custom query params */\n query?: URLSearchParams | Record<string, string | number | boolean | undefined>;\n};\n\n// Utility to build query strings\nexport function toQueryString(q?: RequestOptions['query']): string {\n if (!q) return '';\n if (q instanceof URLSearchParams) {\n const s = q.toString();\n return s ? `?${s}` : '';\n }\n const params = new URLSearchParams();\n Object.entries(q).forEach(([k, v]) => {\n if (v !== undefined) {\n params.append(k, String(v));\n }\n });\n const s = params.toString();\n return s ? `?${s}` : '';\n}\n","import type { RequestOptions as ReqOpts } from './types';\n\nexport interface AuthProvider {\n /**\n * Apply authentication to the outgoing request.\n * Called after SDK headers are assembled, but before request is sent.\n */\n apply(req: { url: string; init: RequestInit; options?: ReqOpts }): Promise<void> | void;\n}\n\nexport class NoAuth implements AuthProvider {\n async apply() {\n /* no-op */\n }\n}\n\nexport class ApiKeyAuth implements AuthProvider {\n constructor(private opts: { header?: string; query?: string; value: string }) {}\n apply({ url, init }: { url: string; init: RequestInit }) {\n if (this.opts.header) {\n init.headers = { ...(init.headers as any), [this.opts.header]: this.opts.value };\n } else if (this.opts.query) {\n const u = new URL(url);\n u.searchParams.set(this.opts.query, this.opts.value);\n (init as any).__urlOverride = u.toString();\n }\n }\n}\n\nexport class BearerTokenAuth implements AuthProvider {\n constructor(private getToken: () => Promise<string> | string) {}\n async apply({ init }: { url: string; init: RequestInit }) {\n const token = await this.getToken();\n init.headers = { ...(init.headers as any), Authorization: `Bearer ${token}` };\n }\n}\n","import { z } from 'zod';\nimport { ApiError, SafeParseResult } from './types';\n\nexport function safeParse<T>(schema: z.ZodTypeAny, data: unknown): SafeParseResult<T> {\n const res = schema.safeParse(data);\n if (res.success) return { success: true, data: res.data as T };\n return { success: false, error: res.error };\n}\n\nexport function parseOrThrow<T>(schema: z.ZodTypeAny, data: unknown): T {\n const res = schema.safeParse(data);\n if (!res.success) {\n throw new ApiError('Response validation failed', { zodError: res.error });\n }\n return res.data as T;\n}\n","import {\n ApiError,\n ClientOptions,\n FetchLike,\n HTTPMethod,\n Interceptors,\n RequestOptions,\n RetryStrategy,\n toQueryString,\n} from '../types';\nimport type { AuthProvider } from '../auth';\n\nexport class HttpClient {\n private fetchImpl: FetchLike;\n private baseUrls: ClientOptions['baseUrls'];\n private headers: Record<string, string>;\n private interceptors: Interceptors;\n private retry: RetryStrategy;\n private timeoutMs?: number;\n private auth: AuthProvider;\n\n constructor(opts: ClientOptions & { auth?: AuthProvider }) {\n this.fetchImpl = opts.fetch ?? (globalThis.fetch?.bind(globalThis) as FetchLike);\n if (!this.fetchImpl)\n throw new Error('No fetch implementation found. Pass one via options.fetch.');\n this.baseUrls = opts.baseUrls;\n this.headers = opts.headers ?? { 'Content-Type': 'application/json' };\n this.interceptors = opts.interceptors ?? {};\n this.retry = opts.retry ?? {\n maxRetries: 2,\n baseDelayMs: 250,\n jitter: 0.2,\n retryMethods: ['GET', 'HEAD'],\n };\n this.timeoutMs = opts.timeout?.requestTimeoutMs;\n this.auth = opts['auth'] ?? new (require('../auth').NoAuth)();\n }\n\n setAuth(auth: AuthProvider) {\n this.auth = auth;\n }\n\n private resolveBaseUrl(key?: keyof typeof this.baseUrls) {\n const k: string = (key as string) || 'default';\n const url = this.baseUrls[k];\n if (!url) throw new Error(`Unknown baseUrl key: ${k}`);\n return url.replace(/\\/$/, '');\n }\n\n private sleep(ms: number) {\n return new Promise((res) => setTimeout(res, ms));\n }\n\n private async withRetry<T>(\n fn: () => Promise<T>,\n canRetry: (ctx: { attempt: number; error?: unknown; response?: Response }) => boolean\n ): Promise<T> {\n let attempt = 0;\n const { maxRetries, baseDelayMs, jitter = 0.2 } = this.retry;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n return await fn();\n } catch (err: any) {\n if (attempt >= maxRetries || !canRetry({ attempt, error: err })) throw err;\n const backoff = baseDelayMs * 2 ** attempt;\n const j = 1 + (Math.random() * 2 - 1) * jitter;\n await this.sleep(backoff * j);\n attempt++;\n }\n }\n }\n\n private async runBeforeHooks(url: string, init: RequestInit) {\n for (const h of this.interceptors.beforeRequest ?? []) {\n await h({ url, init });\n }\n }\n\n private async runAfterHooks(req: Request, res: Response, parsed?: unknown) {\n for (const h of this.interceptors.afterResponse ?? []) {\n await h({ request: req, response: res, parsed });\n }\n }\n\n async request<T = unknown>(\n method: keyof typeof HTTPMethod,\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<{ data: T; response: Response }> {\n const base = this.resolveBaseUrl(options?.baseUrlKey);\n let url = `${base}${path}${toQueryString(options?.query)}`;\n\n const headers = { ...this.headers, ...(options?.headers ?? {}) };\n\n const controller = new AbortController();\n const signal = options?.signal ?? controller.signal;\n const init: RequestInit = {\n method,\n headers,\n body:\n body != null\n ? headers['Content-Type']?.includes('json')\n ? JSON.stringify(body)\n : (body as any)\n : undefined,\n signal,\n };\n\n await this.auth.apply({ url, init, options });\n if ((init as any).__urlOverride) url = (init as any).__urlOverride;\n await this.runBeforeHooks(url, init);\n\n const doFetch = async () => {\n // Apply timeout if configured\n let timeoutId: any;\n if (this.timeoutMs && !options?.signal) {\n timeoutId = setTimeout(\n () => controller.abort(new ApiError('Request timeout', { status: 0 })),\n this.timeoutMs\n );\n }\n\n try {\n const req = new Request(url, init);\n console.log('HTTP Request:', req.method, req.url, req);\n\n const res = await this.fetchImpl(req);\n if (!res.ok) {\n // Read response safely\n let text = '';\n try {\n text = await res.text();\n } catch {}\n throw new ApiError(`HTTP ${res.status}: ${res.statusText}`, {\n status: res.status,\n details: text,\n });\n }\n const contentType = res.headers.get('content-type') || '';\n const data = contentType.includes('json') ? await res.json() : ((await res.text()) as any);\n await this.runAfterHooks(new Request(url, init), res, data);\n return { data: data as T, response: res };\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n };\n\n const canRetry = ({\n response,\n error,\n }: {\n response?: Response;\n error?: any;\n attempt: number;\n }) => {\n // Retry on network errors or 5xx\n if (error instanceof ApiError && error.status && error.status >= 500) return true;\n if (error?.name === 'AbortError') return false;\n if (!error?.status && !response) return true; // network error\n return false;\n };\n\n if (!this.retry.retryMethods?.includes(method)) {\n return doFetch();\n }\n return this.withRetry(doFetch, canRetry);\n }\n}\n","import { z } from 'zod';\nimport { HttpClient } from '../http/HttpClient';\nimport { HTTPMethod, RequestOptions } from '../types';\nimport { parseOrThrow } from '../validation';\n\n/**\n * Generic, strongly-typed endpoint with Zod schemas for request and response.\n */\nexport abstract class BaseEndpoint<ReqSchema extends z.ZodTypeAny, ResSchema extends z.ZodTypeAny> {\n protected abstract readonly method: keyof typeof HTTPMethod;\n protected abstract readonly path: string | ((params: any) => string);\n protected readonly requestSchema?: ReqSchema;\n protected readonly responseSchema: ResSchema;\n\n constructor(\n protected client: HttpClient,\n cfg: { requestSchema?: ReqSchema; responseSchema: ResSchema }\n ) {\n this.requestSchema = cfg.requestSchema;\n this.responseSchema = cfg.responseSchema;\n }\n\n /**\n * Call the endpoint with strong typing derived from schemas.\n */\n async call(args: z.infer<ReqSchema>, options?: RequestOptions): Promise<z.infer<ResSchema>> {\n // Validate request body/params before sending (when schema provided)\n if (this.requestSchema) {\n const parsed = this.requestSchema.safeParse(args);\n if (!parsed.success) throw parsed.error;\n }\n\n const path = typeof this.path === 'function' ? this.path(args) : this.path;\n const body = this.method === 'GET' || this.method === 'HEAD' ? undefined : args;\n\n const { data } = await this.client.request(this.method, path, body, {\n ...options,\n // For GET with query params, allow request schema to include { query: {...} }\n query: (this.method === 'GET' ? (args as any)?.query : undefined) ?? options?.query,\n });\n\n return parseOrThrow<z.infer<ResSchema>>(this.responseSchema, data);\n }\n}\n","import { z } from 'zod';\n\nexport const Id = z.union([\n z.string().min(1),\n z.number(),\n z.uuid({\n version: 'v4',\n }),\n]);\nexport type Id = z.infer<typeof Id>;\n\nexport const Timestamps = z.object({\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n});\n\nexport const Meta = z.object({\n requestId: z.string().optional(),\n timestamp: z.iso.datetime().optional(),\n traceId: z.string().optional(),\n});\n\nexport const ErrorDetail = z.object({\n path: z.string().optional(),\n message: z.string(),\n});\n\nexport const ApiErrorSchema = z.object({\n code: z.string(),\n message: z.string(),\n details: z.array(ErrorDetail).optional(),\n});\n\nexport const Envelope = <T extends z.ZodTypeAny>(inner: T) =>\n z.object({\n success: z.boolean(),\n data: inner.optional(),\n error: ApiErrorSchema.optional(),\n meta: Meta.optional(),\n });\n","// Core types and utilities\nexport * from './types';\nexport * from './auth';\nexport * from './validation';\n\n// HTTP client and endpoint base class\nexport { HttpClient } from './http/HttpClient';\nexport { BaseEndpoint } from './endpoint/BaseEndpoint';\n\n// Common schemas\nexport * from './schemas/common';\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- export * from "./types";
2
- export * from "./auth";
3
- export * from "./validation";
4
- export { HttpClient } from "./http/HttpClient";
5
- export { BaseEndpoint } from "./endpoint/BaseEndpoint";
6
- export * from "./schemas/common";
1
+ export * from './types';
2
+ export * from './auth';
3
+ export * from './validation';
4
+ export { HttpClient } from './http/HttpClient';
5
+ export { BaseEndpoint } from './endpoint/BaseEndpoint';
6
+ export * from './schemas/common';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/api/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ var __copyProps = (to, from, except, desc) => {
29
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
30
 
31
31
  //#endregion
32
- //#region src/api/types.ts
32
+ //#region lib/types.ts
33
33
  const HTTPMethod = {
34
34
  GET: "GET",
35
35
  POST: "POST",
@@ -73,14 +73,14 @@ function toQueryString(q) {
73
73
  }
74
74
 
75
75
  //#endregion
76
- //#region src/api/auth.ts
76
+ //#region lib/auth.ts
77
77
  var auth_exports = /* @__PURE__ */ __export({
78
78
  ApiKeyAuth: () => ApiKeyAuth,
79
79
  BearerTokenAuth: () => BearerTokenAuth,
80
80
  NoAuth: () => NoAuth
81
81
  });
82
82
  var NoAuth, ApiKeyAuth, BearerTokenAuth;
83
- var init_auth = __esm({ "src/api/auth.ts": (() => {
83
+ var init_auth = __esm({ "lib/auth.ts": (() => {
84
84
  NoAuth = class {
85
85
  async apply() {}
86
86
  };
@@ -115,7 +115,7 @@ var init_auth = __esm({ "src/api/auth.ts": (() => {
115
115
  }) });
116
116
 
117
117
  //#endregion
118
- //#region src/api/validation.ts
118
+ //#region lib/validation.ts
119
119
  function safeParse(schema, data) {
120
120
  const res = schema.safeParse(data);
121
121
  if (res.success) return {
@@ -134,7 +134,7 @@ function parseOrThrow(schema, data) {
134
134
  }
135
135
 
136
136
  //#endregion
137
- //#region src/api/http/HttpClient.ts
137
+ //#region lib/http/HttpClient.ts
138
138
  var HttpClient = class {
139
139
  fetchImpl;
140
140
  baseUrls;
@@ -259,7 +259,7 @@ var HttpClient = class {
259
259
  };
260
260
 
261
261
  //#endregion
262
- //#region src/api/endpoint/BaseEndpoint.ts
262
+ //#region lib/endpoint/BaseEndpoint.ts
263
263
  /**
264
264
  * Generic, strongly-typed endpoint with Zod schemas for request and response.
265
265
  */
@@ -290,7 +290,7 @@ var BaseEndpoint = class {
290
290
  };
291
291
 
292
292
  //#endregion
293
- //#region src/api/schemas/common.ts
293
+ //#region lib/schemas/common.ts
294
294
  const Id = z.union([
295
295
  z.string().min(1),
296
296
  z.number(),
@@ -322,8 +322,9 @@ const Envelope = (inner) => z.object({
322
322
  });
323
323
 
324
324
  //#endregion
325
- //#region src/api/index.ts
325
+ //#region lib/index.ts
326
326
  init_auth();
327
327
 
328
328
  //#endregion
329
- export { ApiError, ApiErrorSchema, ApiKeyAuth, BaseEndpoint, BearerTokenAuth, Envelope, ErrorDetail, HTTPMethod, HttpClient, Id, Meta, NoAuth, PaginationSchema, Timestamps, parseOrThrow, safeParse, toQueryString };
329
+ export { ApiError, ApiErrorSchema, ApiKeyAuth, BaseEndpoint, BearerTokenAuth, Envelope, ErrorDetail, HTTPMethod, HttpClient, Id, Meta, NoAuth, PaginationSchema, Timestamps, parseOrThrow, safeParse, toQueryString };
330
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["s","opts: { header?: string; query?: string; value: string }","getToken: () => Promise<string> | string","k: string","err: any","init: RequestInit","timeoutId: any","client: HttpClient"],"sources":["../lib/types.ts","../lib/auth.ts","../lib/validation.ts","../lib/http/HttpClient.ts","../lib/endpoint/BaseEndpoint.ts","../lib/schemas/common.ts","../lib/index.ts"],"sourcesContent":["import { z, ZodError } from 'zod';\n\nexport type Dictionary<T = unknown> = Record<string, T>;\n\nexport type FetchLike = (input: string | Request | URL, init?: RequestInit) => Promise<Response>;\n\nexport type BaseUrlMap = {\n default: string;\n [service: string]: string;\n};\n\nexport type RetryStrategy = {\n maxRetries: number;\n /** milliseconds */\n baseDelayMs: number;\n /** Jitter factor 0..1 */\n jitter?: number;\n /** HTTP methods eligible for retry */\n retryMethods?: (keyof typeof HTTPMethod)[];\n /** Which status codes are retriable */\n shouldRetry?: (ctx: { attempt: number; error?: unknown; response?: Response }) => boolean;\n};\n\nexport const HTTPMethod = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n PATCH: 'PATCH',\n DELETE: 'DELETE',\n HEAD: 'HEAD',\n OPTIONS: 'OPTIONS',\n} as const;\n\nexport type HttpMethod = keyof typeof HTTPMethod;\n\nexport type AfterResponseHook = (ctx: {\n request: Request;\n response: Response;\n parsed?: unknown;\n}) => Promise<void> | void;\n\nexport type BeforeRequestHook = (ctx: { url: string; init: RequestInit }) => Promise<void> | void;\n\nexport interface Interceptors {\n beforeRequest?: BeforeRequestHook[];\n afterResponse?: AfterResponseHook[];\n}\n\nexport interface TimeoutOptions {\n /** ms */\n requestTimeoutMs?: number;\n}\n\nexport interface ClientOptions {\n baseUrls: BaseUrlMap;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n retry?: RetryStrategy;\n interceptors?: Interceptors;\n timeout?: TimeoutOptions;\n}\n\nexport type SafeParseResult<T> = { success: true; data: T } | { success: false; error: ZodError };\n\nexport class ApiError extends Error {\n public status?: number;\n public details?: unknown;\n public zodError?: ZodError;\n\n constructor(\n message: string,\n options?: { status?: number; cause?: unknown; details?: unknown; zodError?: ZodError }\n ) {\n super(message);\n this.name = 'ApiError';\n this.status = options?.status;\n this.details = options?.details;\n this.cause = options?.cause as any;\n this.zodError = options?.zodError;\n }\n}\n\nexport type Paginated<T> = {\n items: T[];\n total: number;\n page: number;\n pageSize: number;\n};\n\nexport const PaginationSchema = z.object({\n items: z.array(z.unknown()),\n total: z.number().int().nonnegative(),\n page: z.number().int().nonnegative(),\n pageSize: z.number().int().positive(),\n});\n\nexport type RequestOptions = {\n /** Override base URL for a single call */\n baseUrlKey?: keyof BaseUrlMap;\n /** Additional headers for this call only */\n headers?: Record<string, string>;\n /** Abort controller */\n signal?: AbortSignal;\n /** Custom query params */\n query?: URLSearchParams | Record<string, string | number | boolean | undefined>;\n};\n\n// Utility to build query strings\nexport function toQueryString(q?: RequestOptions['query']): string {\n if (!q) return '';\n if (q instanceof URLSearchParams) {\n const s = q.toString();\n return s ? `?${s}` : '';\n }\n const params = new URLSearchParams();\n Object.entries(q).forEach(([k, v]) => {\n if (v !== undefined) {\n params.append(k, String(v));\n }\n });\n const s = params.toString();\n return s ? `?${s}` : '';\n}\n","import type { RequestOptions as ReqOpts } from './types';\n\nexport interface AuthProvider {\n /**\n * Apply authentication to the outgoing request.\n * Called after SDK headers are assembled, but before request is sent.\n */\n apply(req: { url: string; init: RequestInit; options?: ReqOpts }): Promise<void> | void;\n}\n\nexport class NoAuth implements AuthProvider {\n async apply() {\n /* no-op */\n }\n}\n\nexport class ApiKeyAuth implements AuthProvider {\n constructor(private opts: { header?: string; query?: string; value: string }) {}\n apply({ url, init }: { url: string; init: RequestInit }) {\n if (this.opts.header) {\n init.headers = { ...(init.headers as any), [this.opts.header]: this.opts.value };\n } else if (this.opts.query) {\n const u = new URL(url);\n u.searchParams.set(this.opts.query, this.opts.value);\n (init as any).__urlOverride = u.toString();\n }\n }\n}\n\nexport class BearerTokenAuth implements AuthProvider {\n constructor(private getToken: () => Promise<string> | string) {}\n async apply({ init }: { url: string; init: RequestInit }) {\n const token = await this.getToken();\n init.headers = { ...(init.headers as any), Authorization: `Bearer ${token}` };\n }\n}\n","import { z } from 'zod';\nimport { ApiError, SafeParseResult } from './types';\n\nexport function safeParse<T>(schema: z.ZodTypeAny, data: unknown): SafeParseResult<T> {\n const res = schema.safeParse(data);\n if (res.success) return { success: true, data: res.data as T };\n return { success: false, error: res.error };\n}\n\nexport function parseOrThrow<T>(schema: z.ZodTypeAny, data: unknown): T {\n const res = schema.safeParse(data);\n if (!res.success) {\n throw new ApiError('Response validation failed', { zodError: res.error });\n }\n return res.data as T;\n}\n","import {\n ApiError,\n ClientOptions,\n FetchLike,\n HTTPMethod,\n Interceptors,\n RequestOptions,\n RetryStrategy,\n toQueryString,\n} from '../types';\nimport type { AuthProvider } from '../auth';\n\nexport class HttpClient {\n private fetchImpl: FetchLike;\n private baseUrls: ClientOptions['baseUrls'];\n private headers: Record<string, string>;\n private interceptors: Interceptors;\n private retry: RetryStrategy;\n private timeoutMs?: number;\n private auth: AuthProvider;\n\n constructor(opts: ClientOptions & { auth?: AuthProvider }) {\n this.fetchImpl = opts.fetch ?? (globalThis.fetch?.bind(globalThis) as FetchLike);\n if (!this.fetchImpl)\n throw new Error('No fetch implementation found. Pass one via options.fetch.');\n this.baseUrls = opts.baseUrls;\n this.headers = opts.headers ?? { 'Content-Type': 'application/json' };\n this.interceptors = opts.interceptors ?? {};\n this.retry = opts.retry ?? {\n maxRetries: 2,\n baseDelayMs: 250,\n jitter: 0.2,\n retryMethods: ['GET', 'HEAD'],\n };\n this.timeoutMs = opts.timeout?.requestTimeoutMs;\n this.auth = opts['auth'] ?? new (require('../auth').NoAuth)();\n }\n\n setAuth(auth: AuthProvider) {\n this.auth = auth;\n }\n\n private resolveBaseUrl(key?: keyof typeof this.baseUrls) {\n const k: string = (key as string) || 'default';\n const url = this.baseUrls[k];\n if (!url) throw new Error(`Unknown baseUrl key: ${k}`);\n return url.replace(/\\/$/, '');\n }\n\n private sleep(ms: number) {\n return new Promise((res) => setTimeout(res, ms));\n }\n\n private async withRetry<T>(\n fn: () => Promise<T>,\n canRetry: (ctx: { attempt: number; error?: unknown; response?: Response }) => boolean\n ): Promise<T> {\n let attempt = 0;\n const { maxRetries, baseDelayMs, jitter = 0.2 } = this.retry;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n return await fn();\n } catch (err: any) {\n if (attempt >= maxRetries || !canRetry({ attempt, error: err })) throw err;\n const backoff = baseDelayMs * 2 ** attempt;\n const j = 1 + (Math.random() * 2 - 1) * jitter;\n await this.sleep(backoff * j);\n attempt++;\n }\n }\n }\n\n private async runBeforeHooks(url: string, init: RequestInit) {\n for (const h of this.interceptors.beforeRequest ?? []) {\n await h({ url, init });\n }\n }\n\n private async runAfterHooks(req: Request, res: Response, parsed?: unknown) {\n for (const h of this.interceptors.afterResponse ?? []) {\n await h({ request: req, response: res, parsed });\n }\n }\n\n async request<T = unknown>(\n method: keyof typeof HTTPMethod,\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<{ data: T; response: Response }> {\n const base = this.resolveBaseUrl(options?.baseUrlKey);\n let url = `${base}${path}${toQueryString(options?.query)}`;\n\n const headers = { ...this.headers, ...(options?.headers ?? {}) };\n\n const controller = new AbortController();\n const signal = options?.signal ?? controller.signal;\n const init: RequestInit = {\n method,\n headers,\n body:\n body != null\n ? headers['Content-Type']?.includes('json')\n ? JSON.stringify(body)\n : (body as any)\n : undefined,\n signal,\n };\n\n await this.auth.apply({ url, init, options });\n if ((init as any).__urlOverride) url = (init as any).__urlOverride;\n await this.runBeforeHooks(url, init);\n\n const doFetch = async () => {\n // Apply timeout if configured\n let timeoutId: any;\n if (this.timeoutMs && !options?.signal) {\n timeoutId = setTimeout(\n () => controller.abort(new ApiError('Request timeout', { status: 0 })),\n this.timeoutMs\n );\n }\n\n try {\n const req = new Request(url, init);\n console.log('HTTP Request:', req.method, req.url, req);\n\n const res = await this.fetchImpl(req);\n if (!res.ok) {\n // Read response safely\n let text = '';\n try {\n text = await res.text();\n } catch {}\n throw new ApiError(`HTTP ${res.status}: ${res.statusText}`, {\n status: res.status,\n details: text,\n });\n }\n const contentType = res.headers.get('content-type') || '';\n const data = contentType.includes('json') ? await res.json() : ((await res.text()) as any);\n await this.runAfterHooks(new Request(url, init), res, data);\n return { data: data as T, response: res };\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n };\n\n const canRetry = ({\n response,\n error,\n }: {\n response?: Response;\n error?: any;\n attempt: number;\n }) => {\n // Retry on network errors or 5xx\n if (error instanceof ApiError && error.status && error.status >= 500) return true;\n if (error?.name === 'AbortError') return false;\n if (!error?.status && !response) return true; // network error\n return false;\n };\n\n if (!this.retry.retryMethods?.includes(method)) {\n return doFetch();\n }\n return this.withRetry(doFetch, canRetry);\n }\n}\n","import { z } from 'zod';\nimport { HttpClient } from '../http/HttpClient';\nimport { HTTPMethod, RequestOptions } from '../types';\nimport { parseOrThrow } from '../validation';\n\n/**\n * Generic, strongly-typed endpoint with Zod schemas for request and response.\n */\nexport abstract class BaseEndpoint<ReqSchema extends z.ZodTypeAny, ResSchema extends z.ZodTypeAny> {\n protected abstract readonly method: keyof typeof HTTPMethod;\n protected abstract readonly path: string | ((params: any) => string);\n protected readonly requestSchema?: ReqSchema;\n protected readonly responseSchema: ResSchema;\n\n constructor(\n protected client: HttpClient,\n cfg: { requestSchema?: ReqSchema; responseSchema: ResSchema }\n ) {\n this.requestSchema = cfg.requestSchema;\n this.responseSchema = cfg.responseSchema;\n }\n\n /**\n * Call the endpoint with strong typing derived from schemas.\n */\n async call(args: z.infer<ReqSchema>, options?: RequestOptions): Promise<z.infer<ResSchema>> {\n // Validate request body/params before sending (when schema provided)\n if (this.requestSchema) {\n const parsed = this.requestSchema.safeParse(args);\n if (!parsed.success) throw parsed.error;\n }\n\n const path = typeof this.path === 'function' ? this.path(args) : this.path;\n const body = this.method === 'GET' || this.method === 'HEAD' ? undefined : args;\n\n const { data } = await this.client.request(this.method, path, body, {\n ...options,\n // For GET with query params, allow request schema to include { query: {...} }\n query: (this.method === 'GET' ? (args as any)?.query : undefined) ?? options?.query,\n });\n\n return parseOrThrow<z.infer<ResSchema>>(this.responseSchema, data);\n }\n}\n","import { z } from 'zod';\n\nexport const Id = z.union([\n z.string().min(1),\n z.number(),\n z.uuid({\n version: 'v4',\n }),\n]);\nexport type Id = z.infer<typeof Id>;\n\nexport const Timestamps = z.object({\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n});\n\nexport const Meta = z.object({\n requestId: z.string().optional(),\n timestamp: z.iso.datetime().optional(),\n traceId: z.string().optional(),\n});\n\nexport const ErrorDetail = z.object({\n path: z.string().optional(),\n message: z.string(),\n});\n\nexport const ApiErrorSchema = z.object({\n code: z.string(),\n message: z.string(),\n details: z.array(ErrorDetail).optional(),\n});\n\nexport const Envelope = <T extends z.ZodTypeAny>(inner: T) =>\n z.object({\n success: z.boolean(),\n data: inner.optional(),\n error: ApiErrorSchema.optional(),\n meta: Meta.optional(),\n });\n","// Core types and utilities\nexport * from './types';\nexport * from './auth';\nexport * from './validation';\n\n// HTTP client and endpoint base class\nexport { HttpClient } from './http/HttpClient';\nexport { BaseEndpoint } from './endpoint/BaseEndpoint';\n\n// Common schemas\nexport * from './schemas/common';\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { z } from "zod";
1
+ import { z } from 'zod';
2
2
  export declare const Id: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodUUID]>;
3
3
  export type Id = z.infer<typeof Id>;
4
4
  export declare const Timestamps: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/api/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,EAAE,4DAEX,CAAC;AACL,MAAM,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAGpC,eAAO,MAAM,UAAU;;;iBAGrB,CAAC;AAGH,eAAO,MAAM,IAAI;;;;iBAIf,CAAC;AAGH,eAAO,MAAM,WAAW;;;iBAGtB,CAAC;AAGH,eAAO,MAAM,cAAc;;;;;;;iBAIzB,CAAC;AAGH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;iBAMnD,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../lib/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,EAAE,4DAMb,CAAC;AACH,MAAM,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAEpC,eAAO,MAAM,UAAU;;;iBAGrB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;iBAIf,CAAC;AAEH,eAAO,MAAM,WAAW;;;iBAGtB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;iBAIzB,CAAC;AAEH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;iBAMrD,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { z, ZodError } from "zod";
1
+ import { z, ZodError } from 'zod';
2
2
  export type Dictionary<T = unknown> = Record<string, T>;
3
3
  export type FetchLike = (input: string | Request | URL, init?: RequestInit) => Promise<Response>;
4
4
  export type BaseUrlMap = {
@@ -95,5 +95,5 @@ export type RequestOptions = {
95
95
  /** Custom query params */
96
96
  query?: URLSearchParams | Record<string, string | number | boolean | undefined>;
97
97
  };
98
- export declare function toQueryString(q?: RequestOptions["query"]): string;
98
+ export declare function toQueryString(q?: RequestOptions['query']): string;
99
99
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/api/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { z } from "zod";
2
- import { SafeParseResult } from "./types";
1
+ import { z } from 'zod';
2
+ import { SafeParseResult } from './types';
3
3
  export declare function safeParse<T>(schema: z.ZodTypeAny, data: unknown): SafeParseResult<T>;
4
4
  export declare function parseOrThrow<T>(schema: z.ZodTypeAny, data: unknown): T;
5
5
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/api/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAIpF;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CAMtE"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAIpF;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CAMtE"}
package/package.json CHANGED
@@ -1,36 +1,72 @@
1
1
  {
2
2
  "name": "zlient",
3
- "version": "1.0.0",
4
- "description": "A type-safe HTTP client framework with Zod validation",
3
+ "version": "1.0.1",
4
+ "description": "A type-safe HTTP client framework with Zod validation for building robust API clients",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
- "import": "./dist/index.js",
12
- "require": "./dist/index.cjs",
13
- "types": "./dist/index.d.ts"
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.cjs"
18
+ }
14
19
  }
15
20
  },
16
21
  "files": [
17
- "dist"
22
+ "dist",
23
+ "README.md",
24
+ "LICENSE"
18
25
  ],
19
26
  "scripts": {
20
- "build": "rolldown -c && tsc --emitDeclarationOnly --outDir dist",
21
- "prepublishOnly": "bun run build"
27
+ "build": "rolldown -c && tsc",
28
+ "dev": "rolldown -c -w",
29
+ "clean": "rm -rf dist",
30
+ "prebuild": "npm run clean",
31
+ "prepublishOnly": "npm run build",
32
+ "lint": "eslint lib/**/*.ts",
33
+ "lint:fix": "eslint lib/**/*.ts --fix",
34
+ "format": "prettier --write \"lib/**/*.ts\" \"examples/**/*.ts\"",
35
+ "format:check": "prettier --check \"lib/**/*.ts\" \"examples/**/*.ts\"",
36
+ "typecheck": "tsc --noEmit",
37
+ "test": "echo \"Error: no test specified\" && exit 1"
22
38
  },
23
39
  "keywords": [
24
40
  "http-client",
25
41
  "api-client",
26
42
  "zod",
27
43
  "validation",
28
- "typescript"
44
+ "typescript",
45
+ "fetch",
46
+ "rest-api",
47
+ "type-safe",
48
+ "schema-validation"
29
49
  ],
30
50
  "author": "",
31
51
  "license": "MIT",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/yourusername/zlient.git"
55
+ },
56
+ "bugs": {
57
+ "url": "https://github.com/yourusername/zlient/issues"
58
+ },
59
+ "homepage": "https://github.com/yourusername/zlient#readme",
60
+ "engines": {
61
+ "node": ">=16.0.0"
62
+ },
32
63
  "devDependencies": {
33
64
  "@types/bun": "latest",
65
+ "@typescript-eslint/eslint-plugin": "^8.46.2",
66
+ "@typescript-eslint/parser": "^8.46.2",
67
+ "eslint": "^9.38.0",
68
+ "eslint-config-prettier": "^10.1.8",
69
+ "prettier": "^3.6.2",
34
70
  "rolldown": "^1.0.0-beta.44",
35
71
  "typescript": "^5.9.3"
36
72
  },