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 +21 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/endpoint/BaseEndpoint.d.ts +3 -3
- package/dist/endpoint/BaseEndpoint.d.ts.map +1 -1
- package/dist/http/HttpClient.d.ts +2 -2
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/index.cjs +10 -9
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -0
- package/dist/schemas/common.d.ts +1 -1
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +2 -2
- package/dist/validation.d.ts.map +1 -1
- package/package.json +45 -9
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
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../
|
|
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
|
|
2
|
-
import { HttpClient } from
|
|
3
|
-
import { HTTPMethod, RequestOptions } from
|
|
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":["../../
|
|
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
|
|
2
|
-
import type { AuthProvider } from
|
|
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":["../../
|
|
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
|
|
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
|
|
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({ "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export { HttpClient } from
|
|
5
|
-
export { BaseEndpoint } from
|
|
6
|
-
export * from
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../
|
|
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
|
|
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
|
|
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({ "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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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"}
|
package/dist/schemas/common.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../
|
|
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
|
|
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[
|
|
98
|
+
export declare function toQueryString(q?: RequestOptions['query']): string;
|
|
99
99
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"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"}
|
package/dist/validation.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { SafeParseResult } from
|
|
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
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../
|
|
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.
|
|
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":
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
21
|
-
"
|
|
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
|
},
|