authula 0.7.9 → 0.7.11
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/{custom-fetch-Ce6_l1Qb.js → custom-fetch-CXJ4-i7I.js} +14 -2
- package/dist/custom-fetch-CXJ4-i7I.js.map +1 -0
- package/dist/{index-B2PrZi2E.d.ts → index-C-9W0QTR.d.ts} +103 -103
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins/index.d.ts +159 -159
- package/dist/plugins/index.js +17 -7
- package/dist/plugins/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/custom-fetch-Ce6_l1Qb.js.map +0 -1
|
@@ -67,8 +67,20 @@ function parseSetCookieToStore(raw, store) {
|
|
|
67
67
|
store.set(name, value, normalized);
|
|
68
68
|
} catch {}
|
|
69
69
|
}
|
|
70
|
+
function convertQueryKeysToSnakeCase(url) {
|
|
71
|
+
const qIndex = url.indexOf("?");
|
|
72
|
+
if (qIndex === -1) return url;
|
|
73
|
+
const base = url.slice(0, qIndex);
|
|
74
|
+
const searchParams = new URLSearchParams(url.slice(qIndex + 1));
|
|
75
|
+
const snakeParams = new URLSearchParams();
|
|
76
|
+
for (const [key, value] of searchParams.entries()) {
|
|
77
|
+
const snakeKey = key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
|
|
78
|
+
snakeParams.append(snakeKey, value);
|
|
79
|
+
}
|
|
80
|
+
return `${base}?${snakeParams.toString()}`;
|
|
81
|
+
}
|
|
70
82
|
async function customFetch(url, options) {
|
|
71
|
-
const resolvedUrl = prependBase(url, options?.baseUrl ?? "");
|
|
83
|
+
const resolvedUrl = convertQueryKeysToSnakeCase(prependBase(url, options?.baseUrl ?? ""));
|
|
72
84
|
const headers = new Headers(options?.headers || {});
|
|
73
85
|
let cookieStore = null;
|
|
74
86
|
let resolvedCookies;
|
|
@@ -115,4 +127,4 @@ async function customFetch(url, options) {
|
|
|
115
127
|
|
|
116
128
|
//#endregion
|
|
117
129
|
export { customFetch as n, ApiError as t };
|
|
118
|
-
//# sourceMappingURL=custom-fetch-
|
|
130
|
+
//# sourceMappingURL=custom-fetch-CXJ4-i7I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-fetch-CXJ4-i7I.js","names":[],"sources":["../src/mutators/custom-fetch.ts"],"sourcesContent":["import { parseSetCookie } from \"cookie\";\nimport { toCamelCaseKeys, toSnakeCaseKeys } from \"es-toolkit\";\n\nimport type { FetchContext, CookieStore } from \"../types\";\n\nexport class ApiError extends Error {\n status: number;\n data: any;\n headers: Headers;\n\n constructor(message: string, status: number, data: any, headers: Headers) {\n super(message || `Request failed with status ${status}`);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n this.headers = headers;\n }\n}\n\nfunction prependBase(url: string, base: string): string {\n if (!base) {\n return url;\n }\n if (/^https?:\\/\\//.test(url)) {\n return url.replace(/^https?:\\/\\/[^/]+/, base);\n }\n return `${base}${url.startsWith(\"/\") ? url : `/${url}`}`;\n}\n\nfunction convertRequestBodyToSnakeCase(\n body: BodyInit | null | undefined,\n): BodyInit | null | undefined {\n if (typeof body !== \"string\") {\n return body;\n }\n try {\n const parsed = JSON.parse(body);\n return parsed !== null && typeof parsed === \"object\"\n ? JSON.stringify(toSnakeCaseKeys(parsed))\n : body;\n } catch {\n return body;\n }\n}\n\nasync function parseJsonBody(res: Response): Promise<any> {\n if ([204, 205, 304].includes(res.status)) {\n return null;\n }\n const text = await res.text();\n return text ? JSON.parse(text) : null;\n}\n\nconst KNOWN_COOKIE_ATTRS = new Set([\n \"path\",\n \"domain\",\n \"expires\",\n \"maxAge\",\n \"httpOnly\",\n \"secure\",\n \"sameSite\",\n]);\n\nfunction parseSetCookieToStore(raw: string, store: CookieStore): void {\n let parsed: Record<string, any>;\n try {\n parsed = parseSetCookie(raw) as Record<string, any>;\n } catch {\n return;\n }\n if (!parsed) {\n return;\n }\n\n const { name, value, ...attrs } = parsed;\n const normalized: Record<string, any> = {};\n for (const [k, v] of Object.entries(attrs)) {\n const lower = k.toLowerCase();\n if (KNOWN_COOKIE_ATTRS.has(k)) {\n normalized[k] = v;\n } else if (lower === \"maxage\") normalized[\"maxAge\"] = v;\n else if (lower === \"httponly\") normalized[\"httpOnly\"] = v;\n else if (lower === \"samesite\") normalized[\"sameSite\"] = v;\n }\n\n try {\n store.set(name, value, normalized);\n } catch {\n // store may be immutable during SSR render\n }\n}\n\nexport function convertQueryKeysToSnakeCase(url: string): string {\n const qIndex = url.indexOf(\"?\");\n if (qIndex === -1) {\n return url;\n }\n\n const base = url.slice(0, qIndex);\n const searchParams = new URLSearchParams(url.slice(qIndex + 1));\n const snakeParams = new URLSearchParams();\n\n for (const [key, value] of searchParams.entries()) {\n const snakeKey = key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);\n snakeParams.append(snakeKey, value);\n }\n\n return `${base}?${snakeParams.toString()}`;\n}\n\nexport async function customFetch<T>(\n url: string,\n options?: RequestInit & {\n method?: string;\n baseUrl?: string;\n cookies?: () => CookieStore | Promise<CookieStore>;\n onBeforeFetch?: (ctx: FetchContext) => Promise<void>;\n onAfterFetch?: (\n ctx: FetchContext,\n res: Response,\n ) => Promise<\"retry\" | void>;\n },\n): Promise<T> {\n const resolvedUrl = convertQueryKeysToSnakeCase(\n prependBase(url, options?.baseUrl ?? \"\"),\n );\n\n const headers = new Headers(options?.headers || {});\n\n let cookieStore: CookieStore | null = null;\n let resolvedCookies: Record<string, string> | undefined;\n if (options?.cookies) {\n try {\n cookieStore = await options.cookies();\n const all = cookieStore.getAll();\n if (all.length > 0 && !headers.has(\"cookie\")) {\n headers.set(\n \"cookie\",\n all.map((c) => `${c.name}=${c.value}`).join(\"; \"),\n );\n }\n resolvedCookies = {};\n for (const c of all) {\n resolvedCookies[c.name] = c.value;\n }\n } catch {\n cookieStore = null;\n }\n }\n\n const ctx: FetchContext = {\n url: resolvedUrl,\n init: {\n method: options?.method ?? \"GET\",\n headers,\n body: convertRequestBodyToSnakeCase(options?.body),\n credentials: \"include\",\n signal: options?.signal ?? null,\n },\n meta: {},\n cookies: resolvedCookies,\n };\n\n if (options?.onBeforeFetch) {\n await options.onBeforeFetch(ctx);\n }\n\n let res = await fetch(ctx.url, ctx.init);\n\n if (options?.onAfterFetch) {\n const action = await options.onAfterFetch(ctx, res);\n if (action === \"retry\" && !ctx.meta.retry) {\n ctx.meta.retry = true;\n res = await fetch(ctx.url, ctx.init);\n }\n }\n\n if (cookieStore) {\n const values: string[] =\n typeof res.headers.getSetCookie === \"function\"\n ? res.headers.getSetCookie()\n : (res.headers.get(\"set-cookie\")?.split(\", \") ?? []);\n for (const raw of values) {\n parseSetCookieToStore(raw, cookieStore);\n }\n }\n\n const data = await parseJsonBody(res);\n\n if (!res.ok) {\n const message =\n typeof data === \"object\" && data !== null && \"message\" in data\n ? String(data.message)\n : \"\";\n throw new ApiError(message, res.status, data, res.headers);\n }\n\n return toCamelCaseKeys(data) as T;\n}\n"],"mappings":";;;;AAKA,IAAa,WAAb,cAA8B,MAAM;CAClC;CACA;CACA;CAEA,YAAY,SAAiB,QAAgB,MAAW,SAAkB;EACxE,MAAM,WAAW,8BAA8B,QAAQ;EACvD,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,KAAK,OAAO;EACZ,KAAK,UAAU;CACjB;AACF;AAEA,SAAS,YAAY,KAAa,MAAsB;CACtD,IAAI,CAAC,MACH,OAAO;CAET,IAAI,eAAe,KAAK,GAAG,GACzB,OAAO,IAAI,QAAQ,qBAAqB,IAAI;CAE9C,OAAO,GAAG,OAAO,IAAI,WAAW,GAAG,IAAI,MAAM,IAAI;AACnD;AAEA,SAAS,8BACP,MAC6B;CAC7B,IAAI,OAAO,SAAS,UAClB,OAAO;CAET,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;EAC9B,OAAO,WAAW,QAAQ,OAAO,WAAW,WACxC,KAAK,UAAU,gBAAgB,MAAM,CAAC,IACtC;CACN,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAe,cAAc,KAA6B;CACxD,IAAI;EAAC;EAAK;EAAK;CAAG,CAAC,CAAC,SAAS,IAAI,MAAM,GACrC,OAAO;CAET,MAAM,OAAO,MAAM,IAAI,KAAK;CAC5B,OAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AACnC;AAEA,MAAM,qCAAqB,IAAI,IAAI;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,sBAAsB,KAAa,OAA0B;CACpE,IAAI;CACJ,IAAI;EACF,SAAS,eAAe,GAAG;CAC7B,QAAQ;EACN;CACF;CACA,IAAI,CAAC,QACH;CAGF,MAAM,EAAE,MAAM,OAAO,GAAG,UAAU;CAClC,MAAM,aAAkC,CAAC;CACzC,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;EAC1C,MAAM,QAAQ,EAAE,YAAY;EAC5B,IAAI,mBAAmB,IAAI,CAAC,GAC1B,WAAW,KAAK;OACX,IAAI,UAAU,UAAU,WAAW,YAAY;OACjD,IAAI,UAAU,YAAY,WAAW,cAAc;OACnD,IAAI,UAAU,YAAY,WAAW,cAAc;CAC1D;CAEA,IAAI;EACF,MAAM,IAAI,MAAM,OAAO,UAAU;CACnC,QAAQ,CAER;AACF;AAEA,SAAgB,4BAA4B,KAAqB;CAC/D,MAAM,SAAS,IAAI,QAAQ,GAAG;CAC9B,IAAI,WAAW,IACb,OAAO;CAGT,MAAM,OAAO,IAAI,MAAM,GAAG,MAAM;CAChC,MAAM,eAAe,IAAI,gBAAgB,IAAI,MAAM,SAAS,CAAC,CAAC;CAC9D,MAAM,cAAc,IAAI,gBAAgB;CAExC,KAAK,MAAM,CAAC,KAAK,UAAU,aAAa,QAAQ,GAAG;EACjD,MAAM,WAAW,IAAI,QAAQ,WAAW,MAAM,IAAI,EAAE,YAAY,GAAG;EACnE,YAAY,OAAO,UAAU,KAAK;CACpC;CAEA,OAAO,GAAG,KAAK,GAAG,YAAY,SAAS;AACzC;AAEA,eAAsB,YACpB,KACA,SAUY;CACZ,MAAM,cAAc,4BAClB,YAAY,KAAK,SAAS,WAAW,EAAE,CACzC;CAEA,MAAM,UAAU,IAAI,QAAQ,SAAS,WAAW,CAAC,CAAC;CAElD,IAAI,cAAkC;CACtC,IAAI;CACJ,IAAI,SAAS,SACX,IAAI;EACF,cAAc,MAAM,QAAQ,QAAQ;EACpC,MAAM,MAAM,YAAY,OAAO;EAC/B,IAAI,IAAI,SAAS,KAAK,CAAC,QAAQ,IAAI,QAAQ,GACzC,QAAQ,IACN,UACA,IAAI,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAClD;EAEF,kBAAkB,CAAC;EACnB,KAAK,MAAM,KAAK,KACd,gBAAgB,EAAE,QAAQ,EAAE;CAEhC,QAAQ;EACN,cAAc;CAChB;CAGF,MAAM,MAAoB;EACxB,KAAK;EACL,MAAM;GACJ,QAAQ,SAAS,UAAU;GAC3B;GACA,MAAM,8BAA8B,SAAS,IAAI;GACjD,aAAa;GACb,QAAQ,SAAS,UAAU;EAC7B;EACA,MAAM,CAAC;EACP,SAAS;CACX;CAEA,IAAI,SAAS,eACX,MAAM,QAAQ,cAAc,GAAG;CAGjC,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI;CAEvC,IAAI,SAAS,cAEX;MAAI,MADiB,QAAQ,aAAa,KAAK,GAAG,MACnC,WAAW,CAAC,IAAI,KAAK,OAAO;GACzC,IAAI,KAAK,QAAQ;GACjB,MAAM,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI;EACrC;;CAGF,IAAI,aAAa;EACf,MAAM,SACJ,OAAO,IAAI,QAAQ,iBAAiB,aAChC,IAAI,QAAQ,aAAa,IACxB,IAAI,QAAQ,IAAI,YAAY,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC;EACtD,KAAK,MAAM,OAAO,QAChB,sBAAsB,KAAK,WAAW;CAE1C;CAEA,MAAM,OAAO,MAAM,cAAc,GAAG;CAEpC,IAAI,CAAC,IAAI,IAAI;EACX,MAAM,UACJ,OAAO,SAAS,YAAY,SAAS,QAAQ,aAAa,OACtD,OAAO,KAAK,OAAO,IACnB;EACN,MAAM,IAAI,SAAS,SAAS,IAAI,QAAQ,MAAM,IAAI,OAAO;CAC3D;CAEA,OAAO,gBAAgB,IAAI;AAC7B"}
|