@cedvict/http-guardian 0.0.1-next.0 → 0.0.1-next.3
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/dist/index.d.ts +2 -1
- package/dist/index.js +19 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -53,6 +53,7 @@ declare class ParseError extends Error {
|
|
|
53
53
|
name: string;
|
|
54
54
|
constructor(message: string, raw?: unknown | undefined, cause?: unknown | undefined);
|
|
55
55
|
}
|
|
56
|
+
declare const ILLEGAL_INVOCATION_HINT = "Detected a browser fetch invocation error (\"Illegal invocation\"). This usually happens when passing a detached reference to window.fetch. Fix by configuring the client with fetch: (input, init) => window.fetch(input, init) or fetch: window.fetch.bind(window).";
|
|
56
57
|
|
|
57
58
|
type NotifyEvent = {
|
|
58
59
|
type: "http-error";
|
|
@@ -263,4 +264,4 @@ declare const alertNotifier: Notifier;
|
|
|
263
264
|
*/
|
|
264
265
|
declare function tailwindAlertRenderer(event: NotifyEvent): string;
|
|
265
266
|
|
|
266
|
-
export { type AppError, type AuthConfig, type CacheEntry, type CacheOptions, type CacheStore, type ClientResult, type Guard, type HttpClientOptions, type HttpMethod, NetworkError, type Notifier, type NotifyEvent, ParseError, RedirectError, type RedirectMode, type RedirectPolicy, type RequestContext, type RequestOptions, type Schema, type ShapeParser, TimeoutError, alertNotifier, bearerAuth, consoleNotifier, cookieAuth, createApiParserGraphQL, createApiParserLaravel, createApiParserNest, createApiParserRestClassic, createHttpClient, createShapeParser, fromZod, memoryCache, noAuth, retryGuard, schema, tailwindAlertRenderer };
|
|
267
|
+
export { type AppError, type AuthConfig, type CacheEntry, type CacheOptions, type CacheStore, type ClientResult, type Guard, type HttpClientOptions, type HttpMethod, ILLEGAL_INVOCATION_HINT, NetworkError, type Notifier, type NotifyEvent, ParseError, RedirectError, type RedirectMode, type RedirectPolicy, type RequestContext, type RequestOptions, type Schema, type ShapeParser, TimeoutError, alertNotifier, bearerAuth, consoleNotifier, cookieAuth, createApiParserGraphQL, createApiParserLaravel, createApiParserNest, createApiParserRestClassic, createHttpClient, createShapeParser, fromZod, memoryCache, noAuth, retryGuard, schema, tailwindAlertRenderer };
|
package/dist/index.js
CHANGED
|
@@ -164,10 +164,20 @@ var ParseError = class extends Error {
|
|
|
164
164
|
}
|
|
165
165
|
name = "ParseError";
|
|
166
166
|
};
|
|
167
|
+
var ILLEGAL_INVOCATION_HINT = `Detected a browser fetch invocation error ("Illegal invocation"). This usually happens when passing a detached reference to window.fetch. Fix by configuring the client with fetch: (input, init) => window.fetch(input, init) or fetch: window.fetch.bind(window).`;
|
|
167
168
|
|
|
168
169
|
// src/client/httpClient.ts
|
|
170
|
+
function isIllegalInvocation(err) {
|
|
171
|
+
const msg = String(err?.message ?? err);
|
|
172
|
+
return /Illegal invocation/i.test(msg);
|
|
173
|
+
}
|
|
174
|
+
function normalizeFetch(f) {
|
|
175
|
+
const bound = f.bind ? f.bind(globalThis) : f;
|
|
176
|
+
return ((input, init) => bound(input, init));
|
|
177
|
+
}
|
|
169
178
|
var REDIRECT_STATUSES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
|
|
170
179
|
function createHttpClient(opts) {
|
|
180
|
+
const resolvedFetch = opts.fetch ? normalizeFetch(opts.fetch) : ((input, init) => globalThis.fetch(input, init));
|
|
171
181
|
const cache = opts.cache;
|
|
172
182
|
const inFlight = new InFlight();
|
|
173
183
|
const defaultNotifier = opts.notifier ?? consoleNotifier;
|
|
@@ -247,6 +257,7 @@ function createHttpClient(opts) {
|
|
|
247
257
|
}
|
|
248
258
|
const res = await fetchWithRedirects({
|
|
249
259
|
opts,
|
|
260
|
+
resolvedFetch,
|
|
250
261
|
pipeline,
|
|
251
262
|
method,
|
|
252
263
|
url: requestUrl,
|
|
@@ -267,6 +278,7 @@ function createHttpClient(opts) {
|
|
|
267
278
|
try {
|
|
268
279
|
const res2 = await fetchWithRedirects({
|
|
269
280
|
opts,
|
|
281
|
+
resolvedFetch,
|
|
270
282
|
pipeline,
|
|
271
283
|
method,
|
|
272
284
|
url: requestUrl,
|
|
@@ -288,7 +300,10 @@ function createHttpClient(opts) {
|
|
|
288
300
|
const stored = await promise;
|
|
289
301
|
return asClientResult(stored, requestUrl, opts, ro, notifier, shouldNotify);
|
|
290
302
|
} catch (e) {
|
|
291
|
-
const err = e instanceof TimeoutError ? e : new NetworkError(
|
|
303
|
+
const err = e instanceof TimeoutError ? e : new NetworkError(
|
|
304
|
+
isIllegalInvocation(e) ? `Network request failed. ${ILLEGAL_INVOCATION_HINT}` : "Network request failed",
|
|
305
|
+
e
|
|
306
|
+
);
|
|
292
307
|
if (shouldNotify({ ok: false, status: 0 })) notifier.notify({ type: "network-error", level: "error", title: "Network error", message: err.message, url: requestUrl });
|
|
293
308
|
return { ok: false, status: 0, headers: new Headers(), errors: [{ message: err.message, details: e }], raw: null, url: requestUrl };
|
|
294
309
|
}
|
|
@@ -363,10 +378,11 @@ function makeCtx(args, redirect) {
|
|
|
363
378
|
attempt: 0,
|
|
364
379
|
auth: args.opts.auth,
|
|
365
380
|
redirect,
|
|
366
|
-
_fetch: args.
|
|
381
|
+
_fetch: args.resolvedFetch
|
|
367
382
|
};
|
|
368
383
|
}
|
|
369
384
|
async function decodeResponse(res) {
|
|
385
|
+
if (res.status === 204) return null;
|
|
370
386
|
const ct = res.headers.get("content-type") ?? "";
|
|
371
387
|
if (ct.includes("application/json")) {
|
|
372
388
|
try {
|
|
@@ -655,6 +671,6 @@ function createApiParserGraphQL(opts) {
|
|
|
655
671
|
});
|
|
656
672
|
}
|
|
657
673
|
|
|
658
|
-
export { NetworkError, ParseError, RedirectError, TimeoutError, alertNotifier, bearerAuth, consoleNotifier, cookieAuth, createApiParserGraphQL, createApiParserLaravel, createApiParserNest, createApiParserRestClassic, createHttpClient, createShapeParser, fromZod, memoryCache, noAuth, retryGuard, schema, tailwindAlertRenderer };
|
|
674
|
+
export { ILLEGAL_INVOCATION_HINT, NetworkError, ParseError, RedirectError, TimeoutError, alertNotifier, bearerAuth, consoleNotifier, cookieAuth, createApiParserGraphQL, createApiParserLaravel, createApiParserNest, createApiParserRestClassic, createHttpClient, createShapeParser, fromZod, memoryCache, noAuth, retryGuard, schema, tailwindAlertRenderer };
|
|
659
675
|
//# sourceMappingURL=index.js.map
|
|
660
676
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/compose.ts","../src/internal/url.ts","../src/internal/authGuard.ts","../src/internal/stableStringify.ts","../src/cache/key.ts","../src/cache/inFlight.ts","../src/notify/defaults.ts","../src/client/errors.ts","../src/client/httpClient.ts","../src/auth/authConfig.ts","../src/guards/retryGuard.ts","../src/cache/memoryCache.ts","../src/parsing/shapeParser.ts","../src/parsing/schemaAdapter.ts","../src/parsing/presets.ts"],"names":["errors","msg"],"mappings":"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","file":"index.js","sourcesContent":["import type { Guard } from \"../guards/types.js\";\nimport type { RequestContext } from \"./context.js\";\n\n/**\n * Koa-like middleware composition with correct TypeScript typing.\n */\nexport function composeGuards(\n guards: Guard[],\n terminal: (ctx: RequestContext) => Promise<Response>\n): (ctx: RequestContext) => Promise<Response> {\n return (ctx: RequestContext) => {\n let idx = -1;\n\n const dispatch = (i: number, c: RequestContext): Promise<Response> => {\n if (i <= idx) return Promise.reject(new Error(\"composeGuards: next() called multiple times\"));\n idx = i;\n const guard = guards[i];\n if (!guard) return terminal(c);\n return guard(c, (nextCtx) => dispatch(i + 1, nextCtx));\n };\n\n return dispatch(0, ctx);\n };\n}\n","export function joinUrl(baseUrl: string, path: string): string {\n if (!baseUrl) return path;\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) return path;\n const b = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${b}${p}`;\n}\n\nexport function withQuery(url: string, query?: Record<string, string | number | boolean | null | undefined>): string {\n if (!query) return url;\n const u = new URL(url);\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n u.searchParams.set(k, String(v));\n }\n return u.toString();\n}\n","import type { Guard } from \"../guards/types.js\";\nimport type { AuthConfig } from \"../auth/authConfig.js\";\n\nfunction sanitizeHeaderValue(v: string): string | null {\n // Prevent header injection via CRLF\n if (/[\\r\\n]/.test(v)) return null;\n return v;\n}\n\nexport function authGuard(auth: AuthConfig): Guard {\n return async (ctx, next) => {\n if (ctx.noAuth) return next(ctx);\n if (auth.mode === \"none\") return next(ctx);\n\n if (auth.mode === \"bearer\") {\n const token = await auth.getToken();\n if (token) {\n const headerName = auth.headerName ?? \"Authorization\";\n const prefix = auth.prefix ?? \"Bearer\";\n const safe = sanitizeHeaderValue(`${prefix} ${token}`);\n if (safe) ctx.headers.set(headerName, safe);\n }\n return next(ctx);\n }\n\n ctx.credentials = auth.credentials ?? \"include\";\n if (auth.csrf) {\n const csrf = await auth.csrf.getToken();\n if (csrf) ctx.headers.set(auth.csrf.headerName, csrf);\n }\n return next(ctx);\n };\n}\n","export function stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(v: any): any {\n if (v === null || typeof v !== \"object\") return v;\n if (Array.isArray(v)) return v.map(sortValue);\n\n const proto = Object.getPrototypeOf(v);\n if (proto !== Object.prototype && proto !== null) return v;\n\n const out: Record<string, any> = {};\n for (const key of Object.keys(v).sort()) out[key] = sortValue(v[key]);\n return out;\n}\n","import { stableStringify } from \"../internal/stableStringify.js\";\n\nexport function makeCacheKey(parts: {\n method: string;\n url: string;\n headers?: Headers;\n body?: unknown;\n idempotencyKey?: string;\n keyOverride?: string;\n}): string {\n if (parts.keyOverride) return parts.keyOverride;\n\n const headerObj: Record<string, string> = {};\n if (parts.headers) {\n const accept = parts.headers.get(\"accept\");\n const contentType = parts.headers.get(\"content-type\");\n if (accept) headerObj[\"accept\"] = accept;\n if (contentType) headerObj[\"content-type\"] = contentType;\n }\n\n return stableStringify({\n m: parts.method,\n u: parts.url,\n h: headerObj,\n b: parts.body ?? null,\n i: parts.idempotencyKey ?? null,\n });\n}\n","/**\n * In-flight request de-duplication.\n */\nexport class InFlight {\n private readonly map = new Map<string, Promise<unknown>>();\n\n get(key: string) {\n return this.map.get(key);\n }\n\n set(key: string, p: Promise<unknown>) {\n this.map.set(key, p);\n p.finally(() => {\n if (this.map.get(key) === p) this.map.delete(key);\n }).catch(() => {});\n }\n\n clear() {\n this.map.clear();\n }\n}\n","import type { Notifier, NotifyEvent } from \"./types.js\";\n\nexport const consoleNotifier: Notifier = {\n notify: (e: NotifyEvent) => {\n console[e.level === \"error\" ? \"error\" : \"warn\"](`[${e.type}] ${e.title}: ${e.message}`, e);\n },\n};\n\nexport const alertNotifier: Notifier = {\n notify: (e: NotifyEvent) => {\n if (typeof window !== \"undefined\" && typeof window.alert === \"function\") window.alert(`${e.title}\\n\\n${e.message}`);\n },\n};\n\n/**\n * Returns an HTML string you can inject in your own UI layer (Tailwind classes).\n * Note: this package does not manipulate the DOM by itself.\n */\nexport function tailwindAlertRenderer(event: NotifyEvent): string {\n const base = \"rounded-lg border p-4 shadow-sm\";\n const color =\n event.level === \"warning\"\n ? \"border-amber-200 bg-amber-50 text-amber-900\"\n : \"border-red-200 bg-red-50 text-red-900\";\n\n const title = escapeHtml(event.title);\n const msg = escapeHtml(event.message);\n\n return `<div class=\"${base} ${color}\"><div class=\"font-semibold\">${title}</div><div class=\"mt-1 text-sm\">${msg}</div></div>`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" }[c]!));\n}\n","export type AppError = {\n message: string;\n code?: string;\n field?: string;\n details?: unknown;\n};\n\nexport class NetworkError extends Error {\n name = \"NetworkError\";\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n }\n}\n\nexport class TimeoutError extends Error {\n name = \"TimeoutError\";\n constructor(message = \"Request timed out\") {\n super(message);\n }\n}\n\nexport class RedirectError extends Error {\n name = \"RedirectError\";\n constructor(message: string, public readonly fromUrl: string, public readonly toUrl?: string) {\n super(message);\n }\n}\n\nexport class ParseError extends Error {\n name = \"ParseError\";\n constructor(message: string, public readonly raw?: unknown, public readonly cause?: unknown) {\n super(message);\n }\n}\n","import type { HttpClientOptions, RequestOptions, ClientResult, HttpMethod } from \"./types.js\";\nimport { composeGuards } from \"../internal/compose.js\";\nimport { joinUrl, withQuery } from \"../internal/url.js\";\nimport type { RequestContext } from \"../internal/context.js\";\nimport { authGuard } from \"../internal/authGuard.js\";\nimport { makeCacheKey } from \"../cache/key.js\";\nimport { InFlight } from \"../cache/inFlight.js\";\nimport { consoleNotifier } from \"../notify/defaults.js\";\nimport { NetworkError, TimeoutError, RedirectError, ParseError, type AppError } from \"./errors.js\";\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nexport function createHttpClient(opts: HttpClientOptions) {\n const cache = opts.cache;\n const inFlight = new InFlight();\n\n const defaultNotifier = opts.notifier ?? consoleNotifier;\n const shouldNotify = opts.defaults?.shouldNotify ?? ((r) => !r.ok);\n\n const baseGuards = [authGuard(opts.auth), ...(opts.guards ?? [])];\n\n async function terminal(ctx: RequestContext): Promise<Response> {\n const controller = ctx.timeoutMs ? new AbortController() : undefined;\n const timeout = ctx.timeoutMs ? setTimeout(() => controller?.abort(new TimeoutError()), ctx.timeoutMs) : undefined;\n\n try {\n const init: RequestInit = {\n method: ctx.method,\n headers: ctx.headers,\n ...(ctx.body !== undefined ? { body: ctx.body } : {}),\n ...(ctx.signal\n ? { signal: controller ? anySignal([ctx.signal, controller.signal]) : ctx.signal }\n : (controller ? { signal: controller.signal } : {})),\n ...(ctx.credentials !== undefined ? { credentials: ctx.credentials } : {}),\n ...(ctx.redirect !== undefined ? { redirect: ctx.redirect } : {}),\n};\n\nreturn await ctx._fetch(ctx.url, init);\n\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n }\n\n const pipeline = composeGuards(baseGuards, terminal);\n\n async function request<T>(method: HttpMethod, path: string, ro?: RequestOptions<T>): Promise<ClientResult<T>> {\n const requestUrl = withQuery(joinUrl(opts.baseUrl, path), ro?.query);\n\n const headers = new Headers();\n if (opts.defaults?.headers) for (const [k, v] of Object.entries(opts.defaults.headers)) headers.set(k, v);\n if (ro?.headers) for (const [k, v] of Object.entries(ro.headers)) if (v !== undefined) headers.set(k, v);\n\n let body: BodyInit | undefined;\n let bodyForKey: unknown = undefined;\n\n if (ro?.json !== undefined) {\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n if (!headers.has(\"accept\")) headers.set(\"accept\", \"application/json\");\n body = JSON.stringify(ro.json);\n bodyForKey = ro.json;\n } else if (ro?.body !== undefined) {\n body = ro.body;\n bodyForKey = \"[body]\";\n if (!headers.has(\"accept\")) headers.set(\"accept\", \"application/json\");\n } else {\n if (!headers.has(\"accept\")) headers.set(\"accept\", \"application/json\");\n }\n\n const timeoutMs = ro?.timeoutMs ?? opts.defaults?.timeoutMs;\n const notifier = ro?.notifier ?? defaultNotifier;\n\n const cacheOpts = ro?.cache;\n const wantsCache = method === \"GET\" && !!cache && !!cacheOpts;\n const dedupe = cacheOpts?.dedupe ?? true;\n\n const canDedupeWrite = method !== \"GET\" && !!ro?.idempotencyKey;\n const inflightKey =\n (wantsCache || canDedupeWrite) && dedupe\n ? makeCacheKey({ method, url: requestUrl, headers, ...(method === \"GET\" ? {} : { body: bodyForKey }), ...(ro?.idempotencyKey !== undefined ? { idempotencyKey: ro.idempotencyKey } : {}), ...(cacheOpts?.key !== undefined ? { keyOverride: cacheOpts.key } : {}) })\n : undefined;\n\n if (inflightKey) {\n const existing = inFlight.get(inflightKey);\n if (existing) {\n try {\n const stored = await existing;\n return asClientResult<T>(stored, requestUrl, opts, ro, notifier, shouldNotify);\n } catch {\n // ignore and proceed\n }\n }\n }\n\n const promise = (async () => {\n if (wantsCache) {\n const key = inflightKey!;\n const cached = cache!.get(key);\n const policy = cacheOpts?.policy ?? \"cacheFirst\";\n\n if (cached) {\n if (policy === \"networkOnly\") {\n // ignore\n } else if (policy === \"staleWhileRevalidate\") {\n void refreshInBackground(key);\n return { kind: \"cache-hit\", url: requestUrl, status: 200, headers: new Headers(), raw: cached.value };\n } else if (policy === \"cacheOnly\" || policy === \"cacheFirst\") {\n return { kind: \"cache-hit\", url: requestUrl, status: 200, headers: new Headers(), raw: cached.value };\n }\n } else if (policy === \"cacheOnly\") {\n return { kind: \"cache-miss\", url: requestUrl, status: 0, headers: new Headers(), raw: null };\n }\n }\n\n const res = await fetchWithRedirects({\n opts,\n pipeline,\n method,\n url: requestUrl,\n headers,\n ...(body !== undefined ? { body } : {}),\n ...(ro?.signal ? { signal: ro.signal } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(ro?.noAuth ? { noAuth: true } : {}),\n });\n\n const raw = await decodeResponse(res);\n const envelope = { kind: \"network\", url: res.url || requestUrl, status: res.status, headers: res.headers, raw };\n\n if (wantsCache && cacheOpts && res.ok) {\n const key = inflightKey!;\n cache!.set(key, { expiresAt: Date.now() + cacheOpts.ttlMs, value: raw, ...(cacheOpts.tags ? { tags: cacheOpts.tags } : {}) });\n }\n\n return envelope;\n\n async function refreshInBackground(key: string) {\n try {\n const res2 = await fetchWithRedirects({\n opts,\n pipeline,\n method,\n url: requestUrl,\n headers,\n ...(body !== undefined ? { body } : {}),\n ...(ro?.signal ? { signal: ro.signal } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(ro?.noAuth ? { noAuth: true } : {}),\n });\n if (!res2.ok) return;\n const raw2 = await decodeResponse(res2);\n cache!.set(key, { expiresAt: Date.now() + cacheOpts!.ttlMs, value: raw2, ...(cacheOpts!.tags ? { tags: cacheOpts!.tags } : {}) });\n } catch {\n // ignore\n }\n }\n })();\n\n if (inflightKey) inFlight.set(inflightKey, promise);\n\n try {\n const stored = await promise;\n return asClientResult<T>(stored, requestUrl, opts, ro, notifier, shouldNotify);\n } catch (e) {\n const err = e instanceof TimeoutError ? e : new NetworkError(\"Network request failed\", e);\n if (shouldNotify({ ok: false, status: 0 })) notifier.notify({ type: \"network-error\", level: \"error\", title: \"Network error\", message: err.message, url: requestUrl });\n return { ok: false, status: 0, headers: new Headers(), errors: [{ message: err.message, details: e }], raw: null, url: requestUrl };\n }\n }\n\n return {\n get: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"GET\", path, ro),\n post: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"POST\", path, ro),\n put: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"PUT\", path, ro),\n patch: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"PATCH\", path, ro),\n delete: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"DELETE\", path, ro),\n cache: { invalidateByTag: (tag: string) => cache?.invalidateByTag(tag) ?? 0, clear: () => cache?.clear() },\n };\n}\n\nasync function fetchWithRedirects(args: {\n opts: HttpClientOptions;\n pipeline: (ctx: RequestContext) => Promise<Response>;\n method: HttpMethod;\n url: string;\n headers: Headers;\n body?: BodyInit;\n signal?: AbortSignal;\n timeoutMs?: number;\n noAuth?: boolean;\n}): Promise<Response> {\n const policy = args.opts.redirects ?? { mode: \"follow\" as const, maxHops: 5 };\n const maxHops = policy.maxHops ?? 5;\n\n if (policy.mode === \"follow\") return args.pipeline(makeCtx(args, \"follow\"));\n if (policy.mode === \"error\") return args.pipeline(makeCtx(args, \"error\"));\n\n let currentUrl = args.url;\n let method: HttpMethod = args.method;\n let body = args.body;\n\n for (let hop = 0; hop <= maxHops; hop++) {\n const res = await args.pipeline(\n makeCtx({\n ...args,\n url: currentUrl,\n method,\n ...(body !== undefined ? { body } : {}),\n }, \"manual\")\n );\n if (!REDIRECT_STATUSES.has(res.status)) return res;\n\n const loc = res.headers.get(\"location\");\n if (!loc) throw new RedirectError(\"Redirect without Location header\", currentUrl);\n const nextUrl = new URL(loc, currentUrl).toString();\n\n const decision = policy.onRedirect?.({ fromUrl: currentUrl, toUrl: nextUrl, status: res.status, hop, method });\n if (decision?.action === \"deny\") throw new RedirectError(decision.reason ?? \"Redirect denied by policy\", currentUrl, nextUrl);\n const finalUrl = decision?.action === \"modify\" ? decision.url : nextUrl;\n\n // Security: avoid leaking bearer auth to a different origin on redirects (manual mode).\n stripAuthOnCrossOriginRedirect(args.opts, args.url, finalUrl, args.headers);\n\n if (res.status === 303) { method = \"GET\"; body = undefined; }\n else if ((res.status === 301 || res.status === 302) && method !== \"GET\") { method = \"GET\"; body = undefined; }\n\n currentUrl = finalUrl;\n if (hop === maxHops) throw new RedirectError(`Too many redirects (>${maxHops})`, args.url, currentUrl);\n }\n\n return args.pipeline(makeCtx(args, \"manual\"));\n}\n\nfunction stripAuthOnCrossOriginRedirect(opts: HttpClientOptions, initialUrl: string, toUrl: string, headers: Headers) {\n try {\n if (opts.auth.mode !== \"bearer\") return;\n const initialOrigin = new URL(initialUrl).origin;\n const toOrigin = new URL(toUrl).origin;\n if (initialOrigin !== toOrigin) {\n const headerName = opts.auth.headerName ?? \"Authorization\";\n headers.delete(headerName);\n }\n } catch {\n // ignore\n }\n}\n\nfunction makeCtx(\n args: {\n opts: HttpClientOptions;\n method: HttpMethod;\n url: string;\n headers: Headers;\n body?: BodyInit;\n signal?: AbortSignal;\n timeoutMs?: number;\n noAuth?: boolean;\n },\n redirect: RequestRedirect\n): RequestContext {\n return {\n method: args.method,\n url: args.url,\n headers: args.headers,\n\n ...(args.body !== undefined ? { body: args.body } : {}),\n ...(args.signal ? { signal: args.signal } : {}),\n ...(args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}),\n ...(args.noAuth ? { noAuth: true } : {}),\n\n attempt: 0,\n auth: args.opts.auth,\n redirect,\n _fetch: args.opts.fetch ?? fetch,\n };\n}\n\n\nasync function decodeResponse(res: Response): Promise<unknown> {\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (ct.includes(\"application/json\")) {\n try { return await res.json(); }\n catch (e) { throw new ParseError(\"Failed to parse JSON response\", undefined, e); }\n }\n try { return await res.text(); }\n catch (e) { throw new ParseError(\"Failed to read response body\", undefined, e); }\n}\n\nfunction asClientResult<T>(\n envelope: any,\n requestUrl: string,\n opts: HttpClientOptions,\n ro: RequestOptions<T> | undefined,\n notifier: import(\"../notify/types.js\").Notifier,\n shouldNotify: (r: { ok: boolean; status: number }) => boolean\n): ClientResult<T> {\n if (envelope?.kind === \"cache-miss\") {\n const errors: AppError[] = [{ message: \"Cache miss\" }];\n if (shouldNotify({ ok: false, status: 0 })) notifier.notify({ type: \"http-error\", level: \"warning\", title: \"Cache\", message: \"Cache miss\", status: 0, errors, url: requestUrl });\n return { ok: false, status: 0, headers: new Headers(), errors, raw: envelope.raw, url: requestUrl };\n }\n\n const status = envelope.status ?? 0;\n const raw = envelope.raw;\n const resHeaders: Headers = envelope.headers ?? new Headers();\n const finalUrl = envelope.url ?? requestUrl;\n\n const okByParser = opts.parser.isSuccess(raw, status);\n\n if (okByParser && status >= 200 && status < 400) {\n const dataRaw = opts.parser.getData(raw);\n try {\n const data = ro?.dataSchema ? ro.dataSchema.parse(dataRaw) : (dataRaw as T);\n return { ok: true, status, headers: resHeaders, data, raw, url: finalUrl };\n } catch (e) {\n const msg = e instanceof Error ? e.message : \"Schema parse failed\";\n if (shouldNotify({ ok: false, status })) notifier.notify({ type: \"parse-error\", level: \"error\", title: \"Parse error\", message: msg, url: finalUrl });\n return { ok: false, status, headers: resHeaders, errors: [{ message: msg, details: e }], raw, url: finalUrl };\n }\n }\n\n const errors = opts.parser.getErrors(raw, status);\n const msg = errors[0]?.message ?? (status ? `HTTP ${status}` : \"Request failed\");\n if (shouldNotify({ ok: false, status })) notifier.notify({ type: \"http-error\", level: status >= 500 ? \"error\" : \"warning\", title: \"Request failed\", message: msg, status, errors, url: finalUrl });\n return { ok: false, status, headers: resHeaders, errors, raw, url: finalUrl };\n}\n\nfunction anySignal(signals: Array<AbortSignal | undefined>): AbortSignal {\n const valid = signals.filter(Boolean) as AbortSignal[];\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n for (const s of valid) {\n if (s.aborted) controller.abort();\n s.addEventListener(\"abort\", onAbort, { once: true });\n }\n return controller.signal;\n}\n","export type AuthConfig =\n | {\n mode: \"bearer\";\n getToken: () => string | null | Promise<string | null>;\n headerName?: string;\n prefix?: string;\n }\n | {\n mode: \"cookie\";\n credentials?: RequestCredentials;\n csrf?: { headerName: string; getToken: () => string | null | Promise<string | null> };\n }\n | { mode: \"none\" };\n\nexport function bearerAuth(\n getToken: () => string | null | Promise<string | null>,\n opts?: { headerName?: string; prefix?: string }\n): AuthConfig {\n return {\n mode: \"bearer\",\n getToken,\n ...(opts?.headerName !== undefined ? { headerName: opts.headerName } : {}),\n ...(opts?.prefix !== undefined ? { prefix: opts.prefix } : {}),\n };\n}\n\nexport function cookieAuth(opts?: {\n credentials?: RequestCredentials;\n csrf?: { headerName: string; getToken: () => string | null | Promise<string | null> };\n}): AuthConfig {\n return {\n mode: \"cookie\",\n ...(opts?.credentials !== undefined ? { credentials: opts.credentials } : {}),\n ...(opts?.csrf !== undefined ? { csrf: opts.csrf } : {}),\n };\n}\n\nexport function noAuth(): AuthConfig {\n return { mode: \"none\" };\n}\n","import type { Guard } from \"./types.js\";\n\n/**\n * Simple retry guard for transient HTTP statuses.\n * Note: this doesn't retry network errors thrown by fetch itself (those are handled by the client wrapper).\n */\nexport function retryGuard(opts?: { retries?: number; retryOn?: number[]; baseDelayMs?: number; maxDelayMs?: number }): Guard {\n const retries = opts?.retries ?? 0;\n const retryOn = new Set(opts?.retryOn ?? [502, 503, 504]);\n const baseDelay = opts?.baseDelayMs ?? 150;\n const maxDelay = opts?.maxDelayMs ?? 1500;\n\n return async (ctx, next) => {\n let last: Response | undefined;\n for (let attempt = 0; attempt <= retries; attempt++) {\n ctx.attempt = attempt;\n last = await next(ctx);\n if (!retryOn.has(last.status)) return last;\n if (attempt === retries) return last;\n const delay = Math.min(maxDelay, baseDelay * 2 ** attempt);\n await new Promise((r) => setTimeout(r, delay));\n }\n return last!;\n };\n}\n","import type { CacheEntry, CacheStore } from \"./types.js\";\n\n/**\n * Simple in-memory LRU-ish cache with tag invalidation.\n */\nexport function memoryCache(opts?: { maxEntries?: number }): CacheStore {\n const max = opts?.maxEntries ?? 1000;\n const map = new Map<string, CacheEntry>();\n const tagIndex = new Map<string, Set<string>>();\n\n function touch(key: string) {\n const v = map.get(key);\n if (!v) return;\n map.delete(key);\n map.set(key, v);\n }\n\n function deindexTags(key: string, entry?: CacheEntry) {\n const tags = entry?.tags;\n if (!tags?.length) return;\n for (const t of tags) {\n const set = tagIndex.get(t);\n if (!set) continue;\n set.delete(key);\n if (set.size === 0) tagIndex.delete(t);\n }\n }\n\n function indexTags(key: string, tags?: string[]) {\n if (!tags?.length) return;\n for (const t of tags) {\n let set = tagIndex.get(t);\n if (!set) {\n set = new Set();\n tagIndex.set(t, set);\n }\n set.add(key);\n }\n }\n\n function del(key: string) {\n const prev = map.get(key);\n if (prev) deindexTags(key, prev);\n map.delete(key);\n }\n\n function ensureLimit() {\n while (map.size > max) {\n const firstKey = map.keys().next().value as string | undefined;\n if (!firstKey) break;\n del(firstKey);\n }\n }\n\n return {\n get(key) {\n const entry = map.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n del(key);\n return undefined;\n }\n touch(key);\n return entry;\n },\n set(key, entry) {\n const prev = map.get(key);\n if (prev) deindexTags(key, prev);\n map.set(key, entry);\n indexTags(key, entry.tags);\n ensureLimit();\n },\n delete: del,\n invalidateByTag(tag) {\n const set = tagIndex.get(tag);\n if (!set) return 0;\n const keys = Array.from(set);\n let n = 0;\n for (const k of keys) {\n if (map.has(k)) {\n del(k);\n n++;\n }\n }\n return n;\n },\n clear() {\n map.clear();\n tagIndex.clear();\n },\n };\n}\n","import type { AppError } from \"../client/errors.js\";\n\nexport type ShapeParser = {\n isSuccess: (raw: unknown, status: number) => boolean;\n getData: (raw: unknown) => unknown;\n getErrors: (raw: unknown, status: number) => AppError[];\n};\n\nexport function createShapeParser(p: ShapeParser): ShapeParser {\n return p;\n}\n","export type Schema<T> = { parse: (input: unknown) => T };\n\nexport function schema<T>(impl: Schema<T>): Schema<T> {\n return impl;\n}\n\n/**\n * Optional helper to wrap a zod-like schema without adding a dependency.\n */\nexport function fromZod<T>(zodSchema: {\n parse?: (i: unknown) => T;\n safeParse?: (i: unknown) => { success: true; data: T } | { success: false; error: unknown };\n}): Schema<T> {\n if (typeof zodSchema.parse === \"function\") return { parse: (i) => zodSchema.parse!(i) };\n if (typeof zodSchema.safeParse === \"function\") {\n return {\n parse: (i) => {\n const r = zodSchema.safeParse!(i) as any;\n if (r && r.success) return r.data;\n throw new Error(\"Schema validation failed\");\n },\n };\n }\n throw new Error(\"Unsupported zod-like schema: expected parse or safeParse\");\n}\n","import type { AppError } from \"../client/errors.js\";\nimport { createShapeParser, type ShapeParser } from \"./shapeParser.js\";\n\nexport function createApiParserRestClassic(opts?: {\n successField?: string;\n dataField?: string;\n errorField?: string;\n messageField?: string;\n}): ShapeParser {\n const successField = opts?.successField ?? \"success\";\n const dataField = opts?.dataField ?? \"data\";\n const errorField = opts?.errorField ?? \"error\";\n const messageField = opts?.messageField ?? \"message\";\n\n return createShapeParser({\n isSuccess: (raw, status) => {\n if (raw && typeof raw === \"object\" && successField in (raw as any)) return Boolean((raw as any)[successField]);\n return status >= 200 && status < 400;\n },\n getData: (raw) => (raw && typeof raw === \"object\" && dataField in (raw as any)) ? (raw as any)[dataField] : raw,\n getErrors: (raw, status) => {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n const r: any = raw;\n const err = r[errorField] ?? r[messageField] ?? r[\"errors\"];\n if (!err) return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n\n if (typeof err === \"string\") return [{ message: err }];\n if (Array.isArray(err)) return err.map((e) => ({ message: String(e) }));\n\n if (typeof err === \"object\") {\n if (typeof err.message === \"string\") return [{ message: err.message, ...(err.code ? { code: String(err.code) } : {}), details: err }];\n return [{ message: String(r[messageField] ?? \"Request failed\"), details: err }];\n }\n return [{ message: String(err) }];\n },\n });\n}\n\nexport function createApiParserLaravel(opts?: { dataField?: string }): ShapeParser {\n const dataField = opts?.dataField ?? \"data\";\n return createShapeParser({\n isSuccess: (_raw, status) => status >= 200 && status < 400,\n getData: (raw) => (raw && typeof raw === \"object\" && dataField in (raw as any)) ? (raw as any)[dataField] : raw,\n getErrors: (raw, status) => laravelErrors(raw, status),\n });\n}\n\nfunction laravelErrors(raw: unknown, status: number): AppError[] {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n const r: any = raw;\n\n if (r.errors && typeof r.errors === \"object\") {\n const out: AppError[] = [];\n for (const [field, msgs] of Object.entries(r.errors)) {\n if (Array.isArray(msgs)) for (const m of msgs) out.push({ field, message: String(m) });\n else out.push({ field, message: String(msgs) });\n }\n if (out.length) return out;\n }\n\n const msg = typeof r.message === \"string\" ? r.message : (status ? `HTTP ${status}` : \"Request failed\");\n return [{ message: msg, details: r }];\n}\n\nexport function createApiParserNest(): ShapeParser {\n return createShapeParser({\n isSuccess: (_raw, status) => status >= 200 && status < 400,\n getData: (raw) => raw,\n getErrors: (raw, status) => nestErrors(raw, status),\n });\n}\n\nfunction nestErrors(raw: unknown, status: number): AppError[] {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n const r: any = raw;\n const msg = r.message;\n\n if (Array.isArray(msg)) return msg.map((m: any) => ({ message: String(m), details: r }));\n if (typeof msg === \"string\") return [{ message: msg, ...(r.error ? { code: String(r.error) } : {}), details: r }];\n\n return [{ message: status ? `HTTP ${status}` : \"Request failed\", details: r }];\n}\n\nexport function createApiParserGraphQL(opts?: { allowPartialData?: boolean }): ShapeParser {\n const allowPartial = opts?.allowPartialData ?? false;\n\n return createShapeParser({\n isSuccess: (raw, status) => {\n if (status < 200 || status >= 400) return false;\n if (!raw || typeof raw !== \"object\") return false;\n const r: any = raw;\n const hasErrors = Array.isArray(r.errors) && r.errors.length > 0;\n if (hasErrors && !allowPartial) return false;\n return \"data\" in r;\n },\n getData: (raw) => (raw && typeof raw === \"object\") ? (raw as any).data : raw,\n getErrors: (raw, status) => {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"GraphQL request failed\" }];\n const r: any = raw;\n const errs = Array.isArray(r.errors) ? r.errors : [];\n if (!errs.length) return status >= 400 ? [{ message: `HTTP ${status}` }] : [{ message: \"GraphQL request failed\" }];\n return errs.map((e: any) => ({\n message: typeof e?.message === \"string\" ? e.message : \"GraphQL error\",\n code: e?.extensions?.code ? String(e.extensions.code) : undefined,\n details: e,\n }));\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/compose.ts","../src/internal/url.ts","../src/internal/authGuard.ts","../src/internal/stableStringify.ts","../src/cache/key.ts","../src/cache/inFlight.ts","../src/notify/defaults.ts","../src/client/errors.ts","../src/client/httpClient.ts","../src/auth/authConfig.ts","../src/guards/retryGuard.ts","../src/cache/memoryCache.ts","../src/parsing/shapeParser.ts","../src/parsing/schemaAdapter.ts","../src/parsing/presets.ts"],"names":["errors","msg"],"mappings":"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","file":"index.js","sourcesContent":["import type { Guard } from \"../guards/types.js\";\nimport type { RequestContext } from \"./context.js\";\n\n/**\n * Koa-like middleware composition with correct TypeScript typing.\n */\nexport function composeGuards(\n guards: Guard[],\n terminal: (ctx: RequestContext) => Promise<Response>\n): (ctx: RequestContext) => Promise<Response> {\n return (ctx: RequestContext) => {\n let idx = -1;\n\n const dispatch = (i: number, c: RequestContext): Promise<Response> => {\n if (i <= idx) return Promise.reject(new Error(\"composeGuards: next() called multiple times\"));\n idx = i;\n const guard = guards[i];\n if (!guard) return terminal(c);\n return guard(c, (nextCtx) => dispatch(i + 1, nextCtx));\n };\n\n return dispatch(0, ctx);\n };\n}\n","export function joinUrl(baseUrl: string, path: string): string {\n if (!baseUrl) return path;\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) return path;\n const b = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${b}${p}`;\n}\n\nexport function withQuery(url: string, query?: Record<string, string | number | boolean | null | undefined>): string {\n if (!query) return url;\n const u = new URL(url);\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n u.searchParams.set(k, String(v));\n }\n return u.toString();\n}\n","import type { Guard } from \"../guards/types.js\";\nimport type { AuthConfig } from \"../auth/authConfig.js\";\n\nfunction sanitizeHeaderValue(v: string): string | null {\n // Prevent header injection via CRLF\n if (/[\\r\\n]/.test(v)) return null;\n return v;\n}\n\nexport function authGuard(auth: AuthConfig): Guard {\n return async (ctx, next) => {\n if (ctx.noAuth) return next(ctx);\n if (auth.mode === \"none\") return next(ctx);\n\n if (auth.mode === \"bearer\") {\n const token = await auth.getToken();\n if (token) {\n const headerName = auth.headerName ?? \"Authorization\";\n const prefix = auth.prefix ?? \"Bearer\";\n const safe = sanitizeHeaderValue(`${prefix} ${token}`);\n if (safe) ctx.headers.set(headerName, safe);\n }\n return next(ctx);\n }\n\n ctx.credentials = auth.credentials ?? \"include\";\n if (auth.csrf) {\n const csrf = await auth.csrf.getToken();\n if (csrf) ctx.headers.set(auth.csrf.headerName, csrf);\n }\n return next(ctx);\n };\n}\n","export function stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(v: any): any {\n if (v === null || typeof v !== \"object\") return v;\n if (Array.isArray(v)) return v.map(sortValue);\n\n const proto = Object.getPrototypeOf(v);\n if (proto !== Object.prototype && proto !== null) return v;\n\n const out: Record<string, any> = {};\n for (const key of Object.keys(v).sort()) out[key] = sortValue(v[key]);\n return out;\n}\n","import { stableStringify } from \"../internal/stableStringify.js\";\n\nexport function makeCacheKey(parts: {\n method: string;\n url: string;\n headers?: Headers;\n body?: unknown;\n idempotencyKey?: string;\n keyOverride?: string;\n}): string {\n if (parts.keyOverride) return parts.keyOverride;\n\n const headerObj: Record<string, string> = {};\n if (parts.headers) {\n const accept = parts.headers.get(\"accept\");\n const contentType = parts.headers.get(\"content-type\");\n if (accept) headerObj[\"accept\"] = accept;\n if (contentType) headerObj[\"content-type\"] = contentType;\n }\n\n return stableStringify({\n m: parts.method,\n u: parts.url,\n h: headerObj,\n b: parts.body ?? null,\n i: parts.idempotencyKey ?? null,\n });\n}\n","/**\n * In-flight request de-duplication.\n */\nexport class InFlight {\n private readonly map = new Map<string, Promise<unknown>>();\n\n get(key: string) {\n return this.map.get(key);\n }\n\n set(key: string, p: Promise<unknown>) {\n this.map.set(key, p);\n p.finally(() => {\n if (this.map.get(key) === p) this.map.delete(key);\n }).catch(() => {});\n }\n\n clear() {\n this.map.clear();\n }\n}\n","import type { Notifier, NotifyEvent } from \"./types.js\";\n\nexport const consoleNotifier: Notifier = {\n notify: (e: NotifyEvent) => {\n console[e.level === \"error\" ? \"error\" : \"warn\"](`[${e.type}] ${e.title}: ${e.message}`, e);\n },\n};\n\nexport const alertNotifier: Notifier = {\n notify: (e: NotifyEvent) => {\n if (typeof window !== \"undefined\" && typeof window.alert === \"function\") window.alert(`${e.title}\\n\\n${e.message}`);\n },\n};\n\n/**\n * Returns an HTML string you can inject in your own UI layer (Tailwind classes).\n * Note: this package does not manipulate the DOM by itself.\n */\nexport function tailwindAlertRenderer(event: NotifyEvent): string {\n const base = \"rounded-lg border p-4 shadow-sm\";\n const color =\n event.level === \"warning\"\n ? \"border-amber-200 bg-amber-50 text-amber-900\"\n : \"border-red-200 bg-red-50 text-red-900\";\n\n const title = escapeHtml(event.title);\n const msg = escapeHtml(event.message);\n\n return `<div class=\"${base} ${color}\"><div class=\"font-semibold\">${title}</div><div class=\"mt-1 text-sm\">${msg}</div></div>`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" }[c]!));\n}\n","export type AppError = {\n message: string;\n code?: string;\n field?: string;\n details?: unknown;\n};\n\nexport class NetworkError extends Error {\n name = \"NetworkError\";\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n }\n}\n\nexport class TimeoutError extends Error {\n name = \"TimeoutError\";\n constructor(message = \"Request timed out\") {\n super(message);\n }\n}\n\nexport class RedirectError extends Error {\n name = \"RedirectError\";\n constructor(message: string, public readonly fromUrl: string, public readonly toUrl?: string) {\n super(message);\n }\n}\n\nexport class ParseError extends Error {\n name = \"ParseError\";\n constructor(message: string, public readonly raw?: unknown, public readonly cause?: unknown) {\n super(message);\n }\n}\n\n\nexport const ILLEGAL_INVOCATION_HINT = `Detected a browser fetch invocation error (\"Illegal invocation\"). This usually happens when passing a detached reference to window.fetch. Fix by configuring the client with fetch: (input, init) => window.fetch(input, init) or fetch: window.fetch.bind(window).`;\n","import type { HttpClientOptions, RequestOptions, ClientResult, HttpMethod } from \"./types.js\";\nimport { composeGuards } from \"../internal/compose.js\";\nimport { joinUrl, withQuery } from \"../internal/url.js\";\nimport type { RequestContext } from \"../internal/context.js\";\nimport { authGuard } from \"../internal/authGuard.js\";\nimport { makeCacheKey } from \"../cache/key.js\";\nimport { InFlight } from \"../cache/inFlight.js\";\nimport { consoleNotifier } from \"../notify/defaults.js\";\nimport {\n NetworkError,\n TimeoutError,\n RedirectError,\n ParseError,\n type AppError,\n ILLEGAL_INVOCATION_HINT\n} from \"./errors.js\";\n\nfunction isIllegalInvocation(err: unknown): boolean {\n const msg = String((err as any)?.message ?? err);\n return /Illegal invocation/i.test(msg);\n}\n\nfunction normalizeFetch(f: typeof globalThis.fetch): typeof globalThis.fetch {\n const bound = (f as any).bind ? (f as any).bind(globalThis) : f;\n return ((input: any, init?: any) => bound(input, init)) as typeof globalThis.fetch;\n}\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nexport function createHttpClient(opts: HttpClientOptions) {\n const resolvedFetch: typeof globalThis.fetch = opts.fetch\n ? normalizeFetch(opts.fetch)\n : ((input: any, init?: any) => globalThis.fetch(input, init)) as typeof globalThis.fetch;\n const cache = opts.cache;\n const inFlight = new InFlight();\n\n const defaultNotifier = opts.notifier ?? consoleNotifier;\n const shouldNotify = opts.defaults?.shouldNotify ?? ((r) => !r.ok);\n\n const baseGuards = [authGuard(opts.auth), ...(opts.guards ?? [])];\n\n async function terminal(ctx: RequestContext): Promise<Response> {\n const controller = ctx.timeoutMs ? new AbortController() : undefined;\n const timeout = ctx.timeoutMs ? setTimeout(() => controller?.abort(new TimeoutError()), ctx.timeoutMs) : undefined;\n\n try {\n const init: RequestInit = {\n method: ctx.method,\n headers: ctx.headers,\n ...(ctx.body !== undefined ? { body: ctx.body } : {}),\n ...(ctx.signal\n ? { signal: controller ? anySignal([ctx.signal, controller.signal]) : ctx.signal }\n : (controller ? { signal: controller.signal } : {})),\n ...(ctx.credentials !== undefined ? { credentials: ctx.credentials } : {}),\n ...(ctx.redirect !== undefined ? { redirect: ctx.redirect } : {}),\n};\n\nreturn await ctx._fetch(ctx.url, init);\n\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n }\n\n const pipeline = composeGuards(baseGuards, terminal);\n\n async function request<T>(method: HttpMethod, path: string, ro?: RequestOptions<T>): Promise<ClientResult<T>> {\n const requestUrl = withQuery(joinUrl(opts.baseUrl, path), ro?.query);\n\n const headers = new Headers();\n if (opts.defaults?.headers) for (const [k, v] of Object.entries(opts.defaults.headers)) headers.set(k, v);\n if (ro?.headers) for (const [k, v] of Object.entries(ro.headers)) if (v !== undefined) headers.set(k, v);\n\n let body: BodyInit | undefined;\n let bodyForKey: unknown = undefined;\n\n if (ro?.json !== undefined) {\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n if (!headers.has(\"accept\")) headers.set(\"accept\", \"application/json\");\n body = JSON.stringify(ro.json);\n bodyForKey = ro.json;\n } else if (ro?.body !== undefined) {\n body = ro.body;\n bodyForKey = \"[body]\";\n if (!headers.has(\"accept\")) headers.set(\"accept\", \"application/json\");\n } else {\n if (!headers.has(\"accept\")) headers.set(\"accept\", \"application/json\");\n }\n\n const timeoutMs = ro?.timeoutMs ?? opts.defaults?.timeoutMs;\n const notifier = ro?.notifier ?? defaultNotifier;\n\n const cacheOpts = ro?.cache;\n const wantsCache = method === \"GET\" && !!cache && !!cacheOpts;\n const dedupe = cacheOpts?.dedupe ?? true;\n\n const canDedupeWrite = method !== \"GET\" && !!ro?.idempotencyKey;\n const inflightKey =\n (wantsCache || canDedupeWrite) && dedupe\n ? makeCacheKey({ method, url: requestUrl, headers, ...(method === \"GET\" ? {} : { body: bodyForKey }), ...(ro?.idempotencyKey !== undefined ? { idempotencyKey: ro.idempotencyKey } : {}), ...(cacheOpts?.key !== undefined ? { keyOverride: cacheOpts.key } : {}) })\n : undefined;\n\n if (inflightKey) {\n const existing = inFlight.get(inflightKey);\n if (existing) {\n try {\n const stored = await existing;\n return asClientResult<T>(stored, requestUrl, opts, ro, notifier, shouldNotify);\n } catch {\n // ignore and proceed\n }\n }\n }\n\n const promise = (async () => {\n if (wantsCache) {\n const key = inflightKey!;\n const cached = cache!.get(key);\n const policy = cacheOpts?.policy ?? \"cacheFirst\";\n\n if (cached) {\n if (policy === \"networkOnly\") {\n // ignore\n } else if (policy === \"staleWhileRevalidate\") {\n void refreshInBackground(key);\n return { kind: \"cache-hit\", url: requestUrl, status: 200, headers: new Headers(), raw: cached.value };\n } else if (policy === \"cacheOnly\" || policy === \"cacheFirst\") {\n return { kind: \"cache-hit\", url: requestUrl, status: 200, headers: new Headers(), raw: cached.value };\n }\n } else if (policy === \"cacheOnly\") {\n return { kind: \"cache-miss\", url: requestUrl, status: 0, headers: new Headers(), raw: null };\n }\n }\n\n const res = await fetchWithRedirects({\n opts,\n resolvedFetch,\n pipeline,\n method,\n url: requestUrl,\n headers,\n ...(body !== undefined ? { body } : {}),\n ...(ro?.signal ? { signal: ro.signal } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(ro?.noAuth ? { noAuth: true } : {}),\n });\n\n const raw = await decodeResponse(res);\n const envelope = { kind: \"network\", url: res.url || requestUrl, status: res.status, headers: res.headers, raw };\n\n if (wantsCache && cacheOpts && res.ok) {\n const key = inflightKey!;\n cache!.set(key, { expiresAt: Date.now() + cacheOpts.ttlMs, value: raw, ...(cacheOpts.tags ? { tags: cacheOpts.tags } : {}) });\n }\n\n return envelope;\n\n async function refreshInBackground(key: string) {\n try {\n const res2 = await fetchWithRedirects({\n opts,\n resolvedFetch,\n pipeline,\n method,\n url: requestUrl,\n headers,\n ...(body !== undefined ? { body } : {}),\n ...(ro?.signal ? { signal: ro.signal } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(ro?.noAuth ? { noAuth: true } : {}),\n });\n if (!res2.ok) return;\n const raw2 = await decodeResponse(res2);\n cache!.set(key, { expiresAt: Date.now() + cacheOpts!.ttlMs, value: raw2, ...(cacheOpts!.tags ? { tags: cacheOpts!.tags } : {}) });\n } catch {\n // ignore\n }\n }\n })();\n\n if (inflightKey) inFlight.set(inflightKey, promise);\n\n try {\n const stored = await promise;\n return asClientResult<T>(stored, requestUrl, opts, ro, notifier, shouldNotify);\n } catch (e) {\n const err = e instanceof TimeoutError\n ? e\n : new NetworkError(\n isIllegalInvocation(e) ? `Network request failed. ${ILLEGAL_INVOCATION_HINT}` : \"Network request failed\",\n e\n );\n if (shouldNotify({ ok: false, status: 0 })) notifier.notify({ type: \"network-error\", level: \"error\", title: \"Network error\", message: err.message, url: requestUrl });\n return { ok: false, status: 0, headers: new Headers(), errors: [{ message: err.message, details: e }], raw: null, url: requestUrl };\n }\n }\n\n return {\n get: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"GET\", path, ro),\n post: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"POST\", path, ro),\n put: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"PUT\", path, ro),\n patch: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"PATCH\", path, ro),\n delete: <T>(path: string, ro?: RequestOptions<T>) => request<T>(\"DELETE\", path, ro),\n cache: { invalidateByTag: (tag: string) => cache?.invalidateByTag(tag) ?? 0, clear: () => cache?.clear() },\n };\n}\n\nasync function fetchWithRedirects(args: {\n opts: HttpClientOptions;\n resolvedFetch: typeof globalThis.fetch;\n pipeline: (ctx: RequestContext) => Promise<Response>;\n method: HttpMethod;\n url: string;\n headers: Headers;\n body?: BodyInit;\n signal?: AbortSignal;\n timeoutMs?: number;\n noAuth?: boolean;\n}): Promise<Response> {\n const policy = args.opts.redirects ?? { mode: \"follow\" as const, maxHops: 5 };\n const maxHops = policy.maxHops ?? 5;\n\n if (policy.mode === \"follow\") return args.pipeline(makeCtx(args, \"follow\"));\n if (policy.mode === \"error\") return args.pipeline(makeCtx(args, \"error\"));\n\n let currentUrl = args.url;\n let method: HttpMethod = args.method;\n let body = args.body;\n\n for (let hop = 0; hop <= maxHops; hop++) {\n const res = await args.pipeline(\n makeCtx({\n ...args,\n url: currentUrl,\n method,\n ...(body !== undefined ? { body } : {}),\n }, \"manual\")\n );\n if (!REDIRECT_STATUSES.has(res.status)) return res;\n\n const loc = res.headers.get(\"location\");\n if (!loc) throw new RedirectError(\"Redirect without Location header\", currentUrl);\n const nextUrl = new URL(loc, currentUrl).toString();\n\n const decision = policy.onRedirect?.({ fromUrl: currentUrl, toUrl: nextUrl, status: res.status, hop, method });\n if (decision?.action === \"deny\") throw new RedirectError(decision.reason ?? \"Redirect denied by policy\", currentUrl, nextUrl);\n const finalUrl = decision?.action === \"modify\" ? decision.url : nextUrl;\n\n // Security: avoid leaking bearer auth to a different origin on redirects (manual mode).\n stripAuthOnCrossOriginRedirect(args.opts, args.url, finalUrl, args.headers);\n\n if (res.status === 303) { method = \"GET\"; body = undefined; }\n else if ((res.status === 301 || res.status === 302) && method !== \"GET\") { method = \"GET\"; body = undefined; }\n\n currentUrl = finalUrl;\n if (hop === maxHops) throw new RedirectError(`Too many redirects (>${maxHops})`, args.url, currentUrl);\n }\n\n return args.pipeline(makeCtx(args, \"manual\"));\n}\n\nfunction stripAuthOnCrossOriginRedirect(opts: HttpClientOptions, initialUrl: string, toUrl: string, headers: Headers) {\n try {\n if (opts.auth.mode !== \"bearer\") return;\n const initialOrigin = new URL(initialUrl).origin;\n const toOrigin = new URL(toUrl).origin;\n if (initialOrigin !== toOrigin) {\n const headerName = opts.auth.headerName ?? \"Authorization\";\n headers.delete(headerName);\n }\n } catch {\n // ignore\n }\n}\n\nfunction makeCtx(\n args: {\n opts: HttpClientOptions;\n resolvedFetch: typeof globalThis.fetch;\n method: HttpMethod;\n url: string;\n headers: Headers;\n body?: BodyInit;\n signal?: AbortSignal;\n timeoutMs?: number;\n noAuth?: boolean;\n },\n redirect: RequestRedirect\n): RequestContext {\n return {\n method: args.method,\n url: args.url,\n headers: args.headers,\n\n ...(args.body !== undefined ? { body: args.body } : {}),\n ...(args.signal ? { signal: args.signal } : {}),\n ...(args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}),\n ...(args.noAuth ? { noAuth: true } : {}),\n\n attempt: 0,\n auth: args.opts.auth,\n redirect,\n _fetch: args.resolvedFetch,\n };\n}\n\n\nasync function decodeResponse(res: Response): Promise<unknown> {\n if (res.status === 204) return null;\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (ct.includes(\"application/json\")) {\n try { return await res.json(); }\n catch (e) { throw new ParseError(\"Failed to parse JSON response\", undefined, e); }\n }\n try { return await res.text(); }\n catch (e) { throw new ParseError(\"Failed to read response body\", undefined, e); }\n}\n\nfunction asClientResult<T>(\n envelope: any,\n requestUrl: string,\n opts: HttpClientOptions,\n ro: RequestOptions<T> | undefined,\n notifier: import(\"../notify/types.js\").Notifier,\n shouldNotify: (r: { ok: boolean; status: number }) => boolean\n): ClientResult<T> {\n if (envelope?.kind === \"cache-miss\") {\n const errors: AppError[] = [{ message: \"Cache miss\" }];\n if (shouldNotify({ ok: false, status: 0 })) notifier.notify({ type: \"http-error\", level: \"warning\", title: \"Cache\", message: \"Cache miss\", status: 0, errors, url: requestUrl });\n return { ok: false, status: 0, headers: new Headers(), errors, raw: envelope.raw, url: requestUrl };\n }\n\n const status = envelope.status ?? 0;\n const raw = envelope.raw;\n const resHeaders: Headers = envelope.headers ?? new Headers();\n const finalUrl = envelope.url ?? requestUrl;\n\n const okByParser = opts.parser.isSuccess(raw, status);\n\n if (okByParser && status >= 200 && status < 400) {\n const dataRaw = opts.parser.getData(raw);\n try {\n const data = ro?.dataSchema ? ro.dataSchema.parse(dataRaw) : (dataRaw as T);\n return { ok: true, status, headers: resHeaders, data, raw, url: finalUrl };\n } catch (e) {\n const msg = e instanceof Error ? e.message : \"Schema parse failed\";\n if (shouldNotify({ ok: false, status })) notifier.notify({ type: \"parse-error\", level: \"error\", title: \"Parse error\", message: msg, url: finalUrl });\n return { ok: false, status, headers: resHeaders, errors: [{ message: msg, details: e }], raw, url: finalUrl };\n }\n }\n\n const errors = opts.parser.getErrors(raw, status);\n const msg = errors[0]?.message ?? (status ? `HTTP ${status}` : \"Request failed\");\n if (shouldNotify({ ok: false, status })) notifier.notify({ type: \"http-error\", level: status >= 500 ? \"error\" : \"warning\", title: \"Request failed\", message: msg, status, errors, url: finalUrl });\n return { ok: false, status, headers: resHeaders, errors, raw, url: finalUrl };\n}\n\nfunction anySignal(signals: Array<AbortSignal | undefined>): AbortSignal {\n const valid = signals.filter(Boolean) as AbortSignal[];\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n for (const s of valid) {\n if (s.aborted) controller.abort();\n s.addEventListener(\"abort\", onAbort, { once: true });\n }\n return controller.signal;\n}\n","export type AuthConfig =\n | {\n mode: \"bearer\";\n getToken: () => string | null | Promise<string | null>;\n headerName?: string;\n prefix?: string;\n }\n | {\n mode: \"cookie\";\n credentials?: RequestCredentials;\n csrf?: { headerName: string; getToken: () => string | null | Promise<string | null> };\n }\n | { mode: \"none\" };\n\nexport function bearerAuth(\n getToken: () => string | null | Promise<string | null>,\n opts?: { headerName?: string; prefix?: string }\n): AuthConfig {\n return {\n mode: \"bearer\",\n getToken,\n ...(opts?.headerName !== undefined ? { headerName: opts.headerName } : {}),\n ...(opts?.prefix !== undefined ? { prefix: opts.prefix } : {}),\n };\n}\n\nexport function cookieAuth(opts?: {\n credentials?: RequestCredentials;\n csrf?: { headerName: string; getToken: () => string | null | Promise<string | null> };\n}): AuthConfig {\n return {\n mode: \"cookie\",\n ...(opts?.credentials !== undefined ? { credentials: opts.credentials } : {}),\n ...(opts?.csrf !== undefined ? { csrf: opts.csrf } : {}),\n };\n}\n\nexport function noAuth(): AuthConfig {\n return { mode: \"none\" };\n}\n","import type { Guard } from \"./types.js\";\n\n/**\n * Simple retry guard for transient HTTP statuses.\n * Note: this doesn't retry network errors thrown by fetch itself (those are handled by the client wrapper).\n */\nexport function retryGuard(opts?: { retries?: number; retryOn?: number[]; baseDelayMs?: number; maxDelayMs?: number }): Guard {\n const retries = opts?.retries ?? 0;\n const retryOn = new Set(opts?.retryOn ?? [502, 503, 504]);\n const baseDelay = opts?.baseDelayMs ?? 150;\n const maxDelay = opts?.maxDelayMs ?? 1500;\n\n return async (ctx, next) => {\n let last: Response | undefined;\n for (let attempt = 0; attempt <= retries; attempt++) {\n ctx.attempt = attempt;\n last = await next(ctx);\n if (!retryOn.has(last.status)) return last;\n if (attempt === retries) return last;\n const delay = Math.min(maxDelay, baseDelay * 2 ** attempt);\n await new Promise((r) => setTimeout(r, delay));\n }\n return last!;\n };\n}\n","import type { CacheEntry, CacheStore } from \"./types.js\";\n\n/**\n * Simple in-memory LRU-ish cache with tag invalidation.\n */\nexport function memoryCache(opts?: { maxEntries?: number }): CacheStore {\n const max = opts?.maxEntries ?? 1000;\n const map = new Map<string, CacheEntry>();\n const tagIndex = new Map<string, Set<string>>();\n\n function touch(key: string) {\n const v = map.get(key);\n if (!v) return;\n map.delete(key);\n map.set(key, v);\n }\n\n function deindexTags(key: string, entry?: CacheEntry) {\n const tags = entry?.tags;\n if (!tags?.length) return;\n for (const t of tags) {\n const set = tagIndex.get(t);\n if (!set) continue;\n set.delete(key);\n if (set.size === 0) tagIndex.delete(t);\n }\n }\n\n function indexTags(key: string, tags?: string[]) {\n if (!tags?.length) return;\n for (const t of tags) {\n let set = tagIndex.get(t);\n if (!set) {\n set = new Set();\n tagIndex.set(t, set);\n }\n set.add(key);\n }\n }\n\n function del(key: string) {\n const prev = map.get(key);\n if (prev) deindexTags(key, prev);\n map.delete(key);\n }\n\n function ensureLimit() {\n while (map.size > max) {\n const firstKey = map.keys().next().value as string | undefined;\n if (!firstKey) break;\n del(firstKey);\n }\n }\n\n return {\n get(key) {\n const entry = map.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n del(key);\n return undefined;\n }\n touch(key);\n return entry;\n },\n set(key, entry) {\n const prev = map.get(key);\n if (prev) deindexTags(key, prev);\n map.set(key, entry);\n indexTags(key, entry.tags);\n ensureLimit();\n },\n delete: del,\n invalidateByTag(tag) {\n const set = tagIndex.get(tag);\n if (!set) return 0;\n const keys = Array.from(set);\n let n = 0;\n for (const k of keys) {\n if (map.has(k)) {\n del(k);\n n++;\n }\n }\n return n;\n },\n clear() {\n map.clear();\n tagIndex.clear();\n },\n };\n}\n","import type { AppError } from \"../client/errors.js\";\n\nexport type ShapeParser = {\n isSuccess: (raw: unknown, status: number) => boolean;\n getData: (raw: unknown) => unknown;\n getErrors: (raw: unknown, status: number) => AppError[];\n};\n\nexport function createShapeParser(p: ShapeParser): ShapeParser {\n return p;\n}\n","export type Schema<T> = { parse: (input: unknown) => T };\n\nexport function schema<T>(impl: Schema<T>): Schema<T> {\n return impl;\n}\n\n/**\n * Optional helper to wrap a zod-like schema without adding a dependency.\n */\nexport function fromZod<T>(zodSchema: {\n parse?: (i: unknown) => T;\n safeParse?: (i: unknown) => { success: true; data: T } | { success: false; error: unknown };\n}): Schema<T> {\n if (typeof zodSchema.parse === \"function\") return { parse: (i) => zodSchema.parse!(i) };\n if (typeof zodSchema.safeParse === \"function\") {\n return {\n parse: (i) => {\n const r = zodSchema.safeParse!(i) as any;\n if (r && r.success) return r.data;\n throw new Error(\"Schema validation failed\");\n },\n };\n }\n throw new Error(\"Unsupported zod-like schema: expected parse or safeParse\");\n}\n","import type { AppError } from \"../client/errors.js\";\nimport { createShapeParser, type ShapeParser } from \"./shapeParser.js\";\n\nexport function createApiParserRestClassic(opts?: {\n successField?: string;\n dataField?: string;\n errorField?: string;\n messageField?: string;\n}): ShapeParser {\n const successField = opts?.successField ?? \"success\";\n const dataField = opts?.dataField ?? \"data\";\n const errorField = opts?.errorField ?? \"error\";\n const messageField = opts?.messageField ?? \"message\";\n\n return createShapeParser({\n isSuccess: (raw, status) => {\n if (raw && typeof raw === \"object\" && successField in (raw as any)) return Boolean((raw as any)[successField]);\n return status >= 200 && status < 400;\n },\n getData: (raw) => (raw && typeof raw === \"object\" && dataField in (raw as any)) ? (raw as any)[dataField] : raw,\n getErrors: (raw, status) => {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n const r: any = raw;\n const err = r[errorField] ?? r[messageField] ?? r[\"errors\"];\n if (!err) return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n\n if (typeof err === \"string\") return [{ message: err }];\n if (Array.isArray(err)) return err.map((e) => ({ message: String(e) }));\n\n if (typeof err === \"object\") {\n if (typeof err.message === \"string\") return [{ message: err.message, ...(err.code ? { code: String(err.code) } : {}), details: err }];\n return [{ message: String(r[messageField] ?? \"Request failed\"), details: err }];\n }\n return [{ message: String(err) }];\n },\n });\n}\n\nexport function createApiParserLaravel(opts?: { dataField?: string }): ShapeParser {\n const dataField = opts?.dataField ?? \"data\";\n return createShapeParser({\n isSuccess: (_raw, status) => status >= 200 && status < 400,\n getData: (raw) => (raw && typeof raw === \"object\" && dataField in (raw as any)) ? (raw as any)[dataField] : raw,\n getErrors: (raw, status) => laravelErrors(raw, status),\n });\n}\n\nfunction laravelErrors(raw: unknown, status: number): AppError[] {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n const r: any = raw;\n\n if (r.errors && typeof r.errors === \"object\") {\n const out: AppError[] = [];\n for (const [field, msgs] of Object.entries(r.errors)) {\n if (Array.isArray(msgs)) for (const m of msgs) out.push({ field, message: String(m) });\n else out.push({ field, message: String(msgs) });\n }\n if (out.length) return out;\n }\n\n const msg = typeof r.message === \"string\" ? r.message : (status ? `HTTP ${status}` : \"Request failed\");\n return [{ message: msg, details: r }];\n}\n\nexport function createApiParserNest(): ShapeParser {\n return createShapeParser({\n isSuccess: (_raw, status) => status >= 200 && status < 400,\n getData: (raw) => raw,\n getErrors: (raw, status) => nestErrors(raw, status),\n });\n}\n\nfunction nestErrors(raw: unknown, status: number): AppError[] {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"Request failed\" }];\n const r: any = raw;\n const msg = r.message;\n\n if (Array.isArray(msg)) return msg.map((m: any) => ({ message: String(m), details: r }));\n if (typeof msg === \"string\") return [{ message: msg, ...(r.error ? { code: String(r.error) } : {}), details: r }];\n\n return [{ message: status ? `HTTP ${status}` : \"Request failed\", details: r }];\n}\n\nexport function createApiParserGraphQL(opts?: { allowPartialData?: boolean }): ShapeParser {\n const allowPartial = opts?.allowPartialData ?? false;\n\n return createShapeParser({\n isSuccess: (raw, status) => {\n if (status < 200 || status >= 400) return false;\n if (!raw || typeof raw !== \"object\") return false;\n const r: any = raw;\n const hasErrors = Array.isArray(r.errors) && r.errors.length > 0;\n if (hasErrors && !allowPartial) return false;\n return \"data\" in r;\n },\n getData: (raw) => (raw && typeof raw === \"object\") ? (raw as any).data : raw,\n getErrors: (raw, status) => {\n if (!raw || typeof raw !== \"object\") return status ? [{ message: `HTTP ${status}` }] : [{ message: \"GraphQL request failed\" }];\n const r: any = raw;\n const errs = Array.isArray(r.errors) ? r.errors : [];\n if (!errs.length) return status >= 400 ? [{ message: `HTTP ${status}` }] : [{ message: \"GraphQL request failed\" }];\n return errs.map((e: any) => ({\n message: typeof e?.message === \"string\" ? e.message : \"GraphQL error\",\n code: e?.extensions?.code ? String(e.extensions.code) : undefined,\n details: e,\n }));\n },\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cedvict/http-guardian",
|
|
3
|
-
"version": "0.0.1-next.
|
|
3
|
+
"version": "0.0.1-next.3",
|
|
4
4
|
"description": "Configurable HTTP client for TypeScript: auth (bearer/cookie), guards, cache+dedupe, dynamic envelope parsing presets, notifications, redirect handling.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|