authula 0.5.4 → 0.6.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/README.md +79 -739
- package/dist/custom-fetch-ZBY99AZW.js +114 -0
- package/dist/custom-fetch-ZBY99AZW.js.map +1 -0
- package/dist/index-DHUQcsNV.d.ts +2011 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +14 -17
- package/dist/index.js.map +1 -1
- package/dist/plugins/index.d.ts +2935 -738
- package/dist/plugins/index.js +4091 -522
- package/dist/plugins/index.js.map +1 -1
- package/dist/rolldown-runtime-w6R9maHv.js +18 -0
- package/package.json +19 -18
- package/dist/fetch-BnZpQ0Yq.js +0 -128
- package/dist/fetch-BnZpQ0Yq.js.map +0 -1
- package/dist/fetch-CEj1gBkL.cjs +0 -163
- package/dist/fetch-CEj1gBkL.cjs.map +0 -1
- package/dist/index.cjs +0 -60
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -2
- package/dist/plugins/index.cjs +0 -696
- package/dist/plugins/index.cjs.map +0 -1
- package/dist/plugins/index.d.cts +0 -825
- package/dist/sdk-7eSlhCrf.d.cts +0 -167
- package/dist/sdk-7eSlhCrf.d.ts +0 -167
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { parseSetCookie } from "cookie";
|
|
2
|
+
import { toCamelCaseKeys, toSnakeCaseKeys } from "es-toolkit";
|
|
3
|
+
|
|
4
|
+
//#region src/mutators/custom-fetch.ts
|
|
5
|
+
var ApiError = class extends Error {
|
|
6
|
+
status;
|
|
7
|
+
data;
|
|
8
|
+
headers;
|
|
9
|
+
constructor(message, status, data, headers) {
|
|
10
|
+
super(message || `Request failed with status ${status}`);
|
|
11
|
+
this.name = "ApiError";
|
|
12
|
+
this.status = status;
|
|
13
|
+
this.data = data;
|
|
14
|
+
this.headers = headers;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
function prependBase(url, base) {
|
|
18
|
+
if (!base) return url;
|
|
19
|
+
if (/^https?:\/\//.test(url)) return url.replace(/^https?:\/\/[^/]+/, base);
|
|
20
|
+
return `${base}${url.startsWith("/") ? url : `/${url}`}`;
|
|
21
|
+
}
|
|
22
|
+
function convertRequestBodyToSnakeCase(body) {
|
|
23
|
+
if (typeof body !== "string") return body;
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(body);
|
|
26
|
+
return parsed !== null && typeof parsed === "object" ? JSON.stringify(toSnakeCaseKeys(parsed)) : body;
|
|
27
|
+
} catch {
|
|
28
|
+
return body;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function parseJsonBody(res) {
|
|
32
|
+
if ([
|
|
33
|
+
204,
|
|
34
|
+
205,
|
|
35
|
+
304
|
|
36
|
+
].includes(res.status)) return null;
|
|
37
|
+
const text = await res.text();
|
|
38
|
+
return text ? JSON.parse(text) : null;
|
|
39
|
+
}
|
|
40
|
+
const KNOWN_COOKIE_ATTRS = /* @__PURE__ */ new Set([
|
|
41
|
+
"path",
|
|
42
|
+
"domain",
|
|
43
|
+
"expires",
|
|
44
|
+
"maxAge",
|
|
45
|
+
"httpOnly",
|
|
46
|
+
"secure",
|
|
47
|
+
"sameSite"
|
|
48
|
+
]);
|
|
49
|
+
function parseSetCookieToStore(raw, store) {
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = parseSetCookie(raw);
|
|
53
|
+
} catch {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (!parsed) return;
|
|
57
|
+
const { name, value, ...attrs } = parsed;
|
|
58
|
+
const normalized = {};
|
|
59
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
60
|
+
const lower = k.toLowerCase();
|
|
61
|
+
if (KNOWN_COOKIE_ATTRS.has(k)) normalized[k] = v;
|
|
62
|
+
else if (lower === "maxage") normalized["maxAge"] = v;
|
|
63
|
+
else if (lower === "httponly") normalized["httpOnly"] = v;
|
|
64
|
+
else if (lower === "samesite") normalized["sameSite"] = v;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
store.set(name, value, normalized);
|
|
68
|
+
} catch {}
|
|
69
|
+
}
|
|
70
|
+
async function customFetch(url, options) {
|
|
71
|
+
const resolvedUrl = prependBase(url, options?.baseUrl ?? "");
|
|
72
|
+
const headers = new Headers(options?.headers || {});
|
|
73
|
+
let cookieStore = null;
|
|
74
|
+
if (options?.cookies) try {
|
|
75
|
+
cookieStore = await options.cookies();
|
|
76
|
+
const all = cookieStore.getAll();
|
|
77
|
+
if (all.length > 0 && !headers.has("cookie")) headers.set("cookie", all.map((c) => `${c.name}=${c.value}`).join("; "));
|
|
78
|
+
} catch {
|
|
79
|
+
cookieStore = null;
|
|
80
|
+
}
|
|
81
|
+
const ctx = {
|
|
82
|
+
url: resolvedUrl,
|
|
83
|
+
init: {
|
|
84
|
+
method: options?.method ?? "GET",
|
|
85
|
+
headers,
|
|
86
|
+
body: convertRequestBodyToSnakeCase(options?.body),
|
|
87
|
+
credentials: "include",
|
|
88
|
+
signal: options?.signal ?? null
|
|
89
|
+
},
|
|
90
|
+
meta: {}
|
|
91
|
+
};
|
|
92
|
+
if (options?.onBeforeFetch) await options.onBeforeFetch(ctx);
|
|
93
|
+
let res = await fetch(ctx.url, ctx.init);
|
|
94
|
+
if (options?.onAfterFetch) {
|
|
95
|
+
if (await options.onAfterFetch(ctx, res) === "retry" && !ctx.meta.retry) {
|
|
96
|
+
ctx.meta.retry = true;
|
|
97
|
+
res = await fetch(ctx.url, ctx.init);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (cookieStore) {
|
|
101
|
+
const values = typeof res.headers.getSetCookie === "function" ? res.headers.getSetCookie() : res.headers.get("set-cookie")?.split(", ") ?? [];
|
|
102
|
+
for (const raw of values) parseSetCookieToStore(raw, cookieStore);
|
|
103
|
+
}
|
|
104
|
+
const data = await parseJsonBody(res);
|
|
105
|
+
if (!res.ok) {
|
|
106
|
+
const message = typeof data === "object" && data !== null && "message" in data ? String(data.message) : "";
|
|
107
|
+
throw new ApiError(message, res.status, data, res.headers);
|
|
108
|
+
}
|
|
109
|
+
return toCamelCaseKeys(data);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
//#endregion
|
|
113
|
+
export { customFetch as n, ApiError as t };
|
|
114
|
+
//# sourceMappingURL=custom-fetch-ZBY99AZW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-fetch-ZBY99AZW.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 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 = prependBase(url, options?.baseUrl ?? \"\");\n\n const headers = new Headers(options?.headers || {});\n\n let cookieStore: CookieStore | null = null;\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 } 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 };\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":"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"}
|