@amaster.ai/http-client 1.1.8 → 1.1.10
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 +76 -0
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -2
- package/dist/index.d.ts +35 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -1 +1,77 @@
|
|
|
1
1
|
# @amaster.ai/http-client
|
|
2
|
+
|
|
3
|
+
Base HTTP client for Amaster SDK packages.
|
|
4
|
+
|
|
5
|
+
## createHttpClient
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { createHttpClient } from "@amaster.ai/http-client";
|
|
9
|
+
|
|
10
|
+
const http = createHttpClient({
|
|
11
|
+
baseURL: "https://api.example.com",
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: "Bearer token",
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Native fetch adapter with hooks
|
|
19
|
+
|
|
20
|
+
For runtimes that want to keep using native `fetch` but still reuse `http-client`'s
|
|
21
|
+
URL resolution, default headers, response unwrap, error handling, and datetime processing,
|
|
22
|
+
use `adapter: "fetch"` with `fetchAdapter` hooks:
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { createHttpClient } from "@amaster.ai/http-client";
|
|
26
|
+
|
|
27
|
+
const http = createHttpClient({
|
|
28
|
+
adapter: "fetch",
|
|
29
|
+
baseURL: "http://runtime:3000",
|
|
30
|
+
headers: {
|
|
31
|
+
Authorization: "Bearer token",
|
|
32
|
+
"X-Tenant-ID": "app1",
|
|
33
|
+
"X-Env": "dev",
|
|
34
|
+
},
|
|
35
|
+
fetchAdapter: {
|
|
36
|
+
onRequest({ init }) {
|
|
37
|
+
const headers = new Headers(init.headers);
|
|
38
|
+
if (init.body instanceof FormData) {
|
|
39
|
+
headers.delete("Content-Type");
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
init: {
|
|
43
|
+
...init,
|
|
44
|
+
headers,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
async parseResponseBody({ response, config }) {
|
|
49
|
+
if (config.responseType === "blob") {
|
|
50
|
+
return await response.blob();
|
|
51
|
+
}
|
|
52
|
+
return await response.json();
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Request hook
|
|
59
|
+
|
|
60
|
+
If you only need to normalize the final request config before it reaches the adapter,
|
|
61
|
+
use `beforeRequest`:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { createHttpClient } from "@amaster.ai/http-client";
|
|
65
|
+
|
|
66
|
+
const http = createHttpClient({
|
|
67
|
+
beforeRequest(config) {
|
|
68
|
+
return {
|
|
69
|
+
...config,
|
|
70
|
+
headers: {
|
|
71
|
+
...config.headers,
|
|
72
|
+
"X-Trace-Id": "trace-123",
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
```
|
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';function
|
|
2
|
-
\u2192 Details:`,
|
|
1
|
+
'use strict';function b(e){if(!e)return "Request failed";if(typeof e=="string")return e;if(typeof e=="object"){let t=e;return t.message||t.error||t.msg||t.detail||"Request failed"}return "Request failed"}function U(e){if(!e||typeof e!="object"||!("data"in e))return false;if("status"in e){let t=e.status;return t===0||t===1||t==="0"||t==="1"}return false}function F(e){return U(e)?e.data:e}var _=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;function B(e){return _.test(e)}function L(e){return `${e.replace(" ","T")}.000Z`}function h(e){if(e==null||e instanceof Blob||e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e;if(Array.isArray(e))return e.map(t=>h(t));if(typeof e=="object"){let t={};for(let[n,o]of Object.entries(e))t[n]=h(o);return t}return typeof e=="string"&&B(e)?L(e):e}function j(e){return /^https?:\/\//i.test(e)}function I(e,t){let n=e.replace(/\/+$/,""),o=t.startsWith("/")?t:`/${t}`;return `${n}${o}`}function H(e){if(!e||typeof e!="object")return "";let t=Object.entries(e).filter(([,s])=>s!=null);if(t.length===0)return "";let n=globalThis?.URLSearchParams,o="";if(n){let s=new n;for(let[i,r]of t)if(Array.isArray(r))for(let a of r)s.append(i,String(a));else s.append(i,String(r));o=s.toString();}else o=t.flatMap(([s,i])=>Array.isArray(i)?i.map(r=>[s,r]):[[s,i]]).map(([s,i])=>`${encodeURIComponent(s)}=${encodeURIComponent(String(i))}`).join("&");return o?`?${o}`:""}function A(e,t){let n=H(t);return n?e.includes("?")?`${e}&${n.slice(1)}`:`${e}${n}`:e}function $(){let e="";try{e=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}return String(e||"").trim()}function C(e,t){let n=String(e.url||"");if(j(n))return A(n,e.params);let o=String(e.baseURL||t?.baseURL||$()||"").trim(),s=o?I(o,n):n;return A(s,e.params)}var k=null;function E(e){k=e??null;}function O(e){return e?.miniGlobal??e?.options?.miniGlobal}function G(e,t){let n=t?.getEnv?.(),o=t?.ENV_TYPE;return o?.TT!==void 0&&n===o.TT?{tt:e}:o?.WEAPP!==void 0&&n===o.WEAPP?{wx:e}:typeof e?.createEventSource=="function"?{tt:e}:typeof e?.request=="function"?{wx:e}:{}}function M(e,t){if(typeof e=="string"){let n=e.trim().toUpperCase();if(n==="TT"||n==="DOUYIN")return "douyin";if(n==="WEAPP"||n==="WECHAT")return "wechat"}if(t){if(typeof t.TT<"u"&&e===t.TT)return "douyin";if(typeof t.WEAPP<"u"&&e===t.WEAPP)return "wechat"}}function y(){let e=typeof globalThis<"u"?globalThis:typeof global<"u"?global:typeof window<"u"?window:{},t=k?.Taro??e?.Taro,n=O(t),o=G(n,t);return {Taro:t,wx:o.wx??(typeof wx<"u"?wx:e?.wx),tt:o.tt??(typeof tt<"u"?tt:e?.tt),my:typeof my<"u"?my:e?.my,swan:typeof swan<"u"?swan:e?.swan,qq:typeof qq<"u"?qq:e?.qq,jd:typeof jd<"u"?jd:e?.jd}}function D(){let e=y(),t=M(e.Taro?.getEnv?.(),e.Taro?.ENV_TYPE);if(t)return t;if(typeof e.tt<"u")return "douyin";if(typeof e.wx<"u")return "wechat"}function N(e){let t=y();if(typeof t.Taro?.login=="function")return t.Taro.login.bind(t.Taro);let o=(e==="douyin"?[t.tt,t.wx]:e==="wechat"?[t.wx,t.tt]:[t.tt,t.wx]).find(s=>typeof s?.login=="function");return typeof o?.login=="function"?o.login.bind(o):null}function P(){let e=y();return typeof e?.wx?.request=="function"?e.wx.request.bind(e.wx):typeof e?.tt?.request=="function"?e.tt.request.bind(e.tt):typeof e?.my?.request=="function"?e.my.request.bind(e.my):typeof e?.swan?.request=="function"?e.swan.request.bind(e.swan):typeof e?.qq?.request=="function"?e.qq.request.bind(e.qq):typeof e?.jd?.request=="function"?e.jd.request.bind(e.jd):typeof e?.Taro?.request=="function"?e.Taro.request.bind(e.Taro):null}async function W(e,t){return await new Promise((n,o)=>{let s=false,i=a=>{s||(s=true,n(a));},r=a=>{s||(s=true,o(a));};try{let a=e({...t,success:i,fail:r});if(a&&typeof a.then=="function"){a.then(i,r);return}a&&typeof a=="object"&&("statusCode"in a||"status"in a||"data"in a)&&i(a);}catch(a){r(a);}})}function w(e,t){let n={...e||{}};if(!t)return n;if(typeof t=="object")for(let[o,s]of Object.entries(t))s!=null&&(n[o]=String(s));return n}function V(e){if(e!==void 0)return typeof e=="string"||e instanceof Blob||e instanceof ArrayBuffer||e instanceof FormData||e instanceof URLSearchParams||ArrayBuffer.isView(e)?e:JSON.stringify(e)}async function Y(e){if((e.headers.get("content-type")||"").includes("application/json"))try{return await e.json()}catch{return null}let n=await e.text();if(!n)return null;try{return JSON.parse(n)}catch{return n}}function v(e){let t=e?.fetch??globalThis.fetch?.bind(globalThis);if(typeof t!="function")throw new Error("Fetch API not found. Provide fetchAdapter.fetch explicitly.");return async n=>{let o=w(void 0,n.headers),s={method:String(n.method||"GET").toUpperCase(),headers:o,body:V(n.data)},i={config:n,url:C(n),init:s},r=await e?.onRequest?.(i),a=r?.url??i.url,f=r?.init??i.init,c=await t(a,f),p=e?.parseResponseBody??(g=>Y(g.response));return {status:c.status,data:await p({config:n,response:c,request:{config:n,url:a,init:f}}),headers:c.headers}}}async function z(e,t){let n=P();if(!n)throw new Error("Mini-program request API not found (wx/tt/my/... or global Taro.request).");let o=C(e,t),s=String(e.method||"GET").toUpperCase(),i=w(t?.headers,e.headers),r=await W(n,{url:o,method:s,header:i,data:e.data});return {status:r?.statusCode??r?.status??0,data:r?.data,headers:r?.header}}function x(e){let t=e;return typeof t=="function"&&!!t?.defaults&&!!t?.interceptors}function T(e,t,n,o,s=true){if(!s)return;let i=String(e.method||"GET").toUpperCase(),r=e.url;console.error(`[HTTP Error] ${i} ${r} - ${t} ${n}`,`
|
|
2
|
+
\u2192 Details:`,o);}function J(e){let t,n,o=false;return x(e)?(t=e,o=true):(n=e,n?.runtime&&E(n.runtime),n?.adapter&&x(n.adapter)&&(t=n.adapter,o=true,n={...n,adapter:void 0})),{async request(s){try{let i=s;if("body"in s&&s.body!==void 0){let{body:u,...l}=s;i={...l,data:u};}i={...i,baseURL:i.baseURL??n?.baseURL,headers:w(n?.headers,i.headers)},n?.beforeRequest&&(i=await n.beforeRequest(i));let r=0,a=null,f=n?.adapter??(P()?"taro":"axios"),c=typeof f=="function"?f:f==="fetch"?"fetch":f==="taro"?"taro":"axios";if(typeof c=="function"){let u=await c(i);r=u.status??0,a=u.data??null;}else if(c==="fetch"){let u=await v(n?.fetchAdapter)(i);r=u.status??0,a=u.data??null;}else if(c==="taro"){let u=await z(i,n);r=u.status??0,a=u.data??null;}else {t||(t=(await import('axios')).default.create({baseURL:n?.baseURL}));let u=i;if(o){let m=t.defaults.headers||{},S=i.headers||{},q={};for(let[d,R]of Object.entries(m))d==="common"||d==="get"||d==="post"||d==="put"||d==="patch"||d==="delete"||d==="head"||d==="options"||R!=null&&(q[d]=String(R));u={...i,headers:{...q,...S}};}let l=await t(u);r=l?.status??0,a=l?.data;}if(r>=200&&r<300){let l=(n?.transformResponse??F)(a);return {data:h(l)??null,error:null,status:r}}let p=b(a)||`HTTP ${r}`,g=n?.logErrors!==!1;return T(s,r,p,a,g),{data:null,error:{status:r,message:p,details:a},status:r}}catch(i){let r=i,a=r?.response?.status||r?.statusCode||0,f=r?.response?.data??r?.data,c=b(f)||r?.message||"Network error",p=n?.logErrors!==false;return T(s,a,c,f||r,p),{data:null,error:{status:a,message:c,details:f},status:a}}}}}exports.createFetchAdapter=v;exports.createHttpClient=J;exports.detectMiniProgramPlatform=D;exports.getMiniProgramLogin=N;exports.getMiniProgramRequest=P;exports.resolveMiniProgramGlobals=y;exports.resolveTaroMiniProgramPlatform=M;exports.setMiniProgramRuntime=E;//# sourceMappingURL=index.cjs.map
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http.ts"],"names":["normalizeErrorMessage","payload","errorPayload","isBackendStandardFormat","data","status","defaultUnwrapBackendResponse","responseData","BACKEND_DATETIME_REGEX","isBackendDatetime","value","parseBackendDatetime","processResponseDates","item","processed","key","isAbsoluteUrl","url","joinBaseUrl","baseURL","b","u","encodeQuery","params","entries","v","URLSearchParamsCtor","q","sp","k","appendParamsToUrl","readEnvBaseUrl","resolveUrl","config","options","raw","withBase","registeredMiniProgramRuntime","setMiniProgramRuntime","runtime","resolveTaroMiniGlobal","taro","resolveMiniProgramPlatformGlobals","miniGlobal","env","envType","resolveTaroMiniProgramPlatform","normalizedEnv","resolveMiniProgramGlobals","fallbackGlobal","platformGlobals","detectMiniProgramPlatform","taroPlatform","getMiniProgramLogin","platform","nativeRuntime","candidate","getMiniProgramRequest","callMaybePromiseRequest","fn","resolve","reject","settled","resolveOnce","rejectOnce","error","ret","mergeHeaders","base","extra","out","taroLikeAdapter","req","method","header","res","isAxiosInstance","logErrorToConsole","message","details","shouldLog","createHttpClient","axiosInstanceOrOptions","instance","isUserProvidedInstance","processedConfig","body","rest","adapterChoice","adapter","r","finalConfig","defaultHeaders","configHeaders","flattenedDefaults","resp","transformedData","errorMessage","error_"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable no-unused-vars */\nimport type { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport type ClientError = {\n message: string;\n status?: number;\n code?: string;\n details?: unknown;\n};\n\nexport type ClientResult<T> = {\n data: T | null;\n error: ClientError | null;\n status: number;\n};\n\nexport type RequestConfig = AxiosRequestConfig & {\n url: string;\n method: NonNullable<AxiosRequestConfig[\"method\"]> | string;\n};\n\nexport type AdapterResponse = {\n status: number;\n data: unknown;\n headers?: unknown;\n};\n\nexport type HttpAdapter = (_config: RequestConfig) => Promise<AdapterResponse>;\n\nexport type MiniProgramRuntime = {\n Taro?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n getEnv?: () => unknown;\n ENV_TYPE?: Record<string, unknown>;\n miniGlobal?: unknown;\n options?: {\n miniGlobal?: unknown;\n };\n };\n};\n\nexport type SupportedMiniProgramPlatform = \"wechat\" | \"douyin\";\n\nexport type ResolvedMiniProgramGlobals = MiniProgramRuntime & {\n wx?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n };\n tt?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n };\n my?: {\n request?: (_opts: any) => any;\n };\n swan?: {\n request?: (_opts: any) => any;\n };\n qq?: {\n request?: (_opts: any) => any;\n };\n jd?: {\n request?: (_opts: any) => any;\n };\n};\n\nexport type HttpClientOptions = {\n /**\n * HTTP adapter to use:\n * - undefined: auto-detect (taro if mini-program APIs exist, otherwise axios)\n * - \"taro\": force mini-program request (wx/tt/my/...) or global Taro.request\n * - \"axios\": force axios\n * - AxiosInstance: use provided axios instance\n * - function: custom adapter\n */\n adapter?: \"taro\" | \"axios\" | AxiosInstance | HttpAdapter;\n /**\n * Base URL to prefix when `config.url` is relative (e.g. \"/api/...\").\n * \n * If not provided:\n * - Taro/mini-program: auto-reads from process.env.TARO_APP_API_BASE_URL or process.env.VITE_API_BASE_URL\n * - H5/Browser: no baseURL (expects dev proxy or absolute URLs)\n */\n baseURL?: string;\n /** Default headers merged into each request */\n headers?: Record<string, string>;\n /**\n * Custom response transform function to extract/modify data from backend response\n * If not provided, uses default transform logic for { status: 0/1, data: {...} }\n * \n * Similar to axios's transformResponse option\n * \n * @example\n * ```typescript\n * // For backend that returns: { statusCode: 200, data: {...} }\n * const client = createHttpClient({\n * transformResponse: (response) => {\n * if (response && typeof response === 'object' && 'data' in response) {\n * return response.data;\n * }\n * return response;\n * }\n * });\n * ```\n */\n transformResponse?: <T>(responseData: unknown) => T;\n /**\n * Whether to log errors to console (default: true)\n * Set to false to disable automatic error logging\n */\n logErrors?: boolean;\n /**\n * Explicitly provide the Taro runtime object when it is not exposed on `globalThis`.\n */\n runtime?: Partial<MiniProgramRuntime>;\n};\n\nexport type HttpClient = {\n request<T>(\n _config: RequestConfig\n ): Promise<ClientResult<T>>;\n};\n\ninterface ErrorPayload {\n message?: string;\n error?: string;\n msg?: string;\n detail?: string;\n}\n\nfunction normalizeErrorMessage(payload: unknown): string {\n if (!payload) {\n return \"Request failed\";\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n if (typeof payload === \"object\") {\n const errorPayload = payload as ErrorPayload;\n return (\n errorPayload.message ||\n errorPayload.error ||\n errorPayload.msg ||\n errorPayload.detail ||\n \"Request failed\"\n );\n }\n return \"Request failed\";\n}\n\ninterface BackendStandardResponse {\n status: number | string;\n data: unknown;\n}\n\n/**\n * Check if response data matches backend standard format: { status: 0/1, data: {...} }\n * Handles both number and string status values\n */\nfunction isBackendStandardFormat(data: unknown): data is BackendStandardResponse {\n if (!data || typeof data !== \"object\" || !(\"data\" in data)) {\n return false;\n }\n\n // Check status field - handle both number and string values\n if (\"status\" in data) {\n const status = (data as BackendStandardResponse).status;\n // Accept 0, 1, \"0\", \"1\" as valid status values\n return status === 0 || status === 1 || status === \"0\" || status === \"1\";\n }\n\n return false;\n}\n\n/**\n * Default unwrap logic for backend standard format response\n * Backend returns: { status: 0, data: {...} }\n * We extract the inner 'data' field for cleaner client usage\n */\nfunction defaultUnwrapBackendResponse<T>(responseData: unknown): T {\n if (isBackendStandardFormat(responseData)) {\n // Extract inner data field\n return responseData.data as T;\n }\n // Return as-is if not standard format (e.g., BPM/Workflow APIs)\n return responseData as T;\n}\n\n/**\n * Backend datetime format regex: \"YYYY-MM-DD HH:MM:SS\"\n */\nconst BACKEND_DATETIME_REGEX = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/;\n\n/**\n * Check if a string matches backend datetime format\n */\nfunction isBackendDatetime(value: string): boolean {\n return BACKEND_DATETIME_REGEX.test(value);\n}\n\n/**\n * Convert backend datetime string to ISO 8601 format\n * \"2026-01-05 10:30:45\" → \"2026-01-05T10:30:45.000Z\"\n */\nfunction parseBackendDatetime(value: string): string {\n // Replace space with T and append Z for UTC\n return `${value.replace(\" \", \"T\")}.000Z`;\n}\n\n/**\n * Recursively process response data to convert backend datetime strings to ISO format\n * Handles nested objects and arrays\n */\nfunction processResponseDates(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processResponseDates(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processResponseDates(value);\n }\n return processed;\n }\n\n // Handle backend datetime strings\n if (typeof data === \"string\" && isBackendDatetime(data)) {\n return parseBackendDatetime(data);\n }\n\n return data;\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return /^https?:\\/\\//i.test(url);\n}\n\nfunction joinBaseUrl(baseURL: string, url: string): string {\n const b = baseURL.replace(/\\/+$/, \"\");\n const u = url.startsWith(\"/\") ? url : `/${url}`;\n return `${b}${u}`;\n}\n\nfunction encodeQuery(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"\";\n const entries = Object.entries(params as Record<string, unknown>).filter(\n ([, v]) => v !== undefined && v !== null\n );\n if (entries.length === 0) return \"\";\n const URLSearchParamsCtor = (globalThis as any)?.URLSearchParams as\n | (new () => { append: (k: string, v: string) => void; toString: () => string })\n | undefined;\n\n let q = \"\";\n if (URLSearchParamsCtor) {\n const sp = new URLSearchParamsCtor();\n for (const [k, v] of entries) {\n if (Array.isArray(v)) {\n for (const item of v) sp.append(k, String(item));\n } else {\n sp.append(k, String(v));\n }\n }\n q = sp.toString();\n } else {\n // Minimal fallback (older runtimes): k=v&k=v...\n q = entries\n .flatMap(([k, v]) =>\n Array.isArray(v) ? v.map((item) => [k, item] as const) : ([[k, v]] as const)\n )\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n }\n return q ? `?${q}` : \"\";\n}\n\nfunction appendParamsToUrl(url: string, params: unknown): string {\n const q = encodeQuery(params);\n if (!q) return url;\n if (url.includes(\"?\")) return `${url}&${q.slice(1)}`;\n return `${url}${q}`;\n}\n\nfunction readEnvBaseUrl(): string {\n let value = \"\";\n\n // Taro defineConstants and most bundlers replace process.env.* at build time.\n // Guard for browser runtimes where process may not exist.\n try {\n value =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined (browser) -> ignore\n }\n\n return String(value || \"\").trim();\n}\n\nfunction resolveUrl(config: RequestConfig, options?: HttpClientOptions): string {\n const raw = String(config.url || \"\");\n if (isAbsoluteUrl(raw)) return appendParamsToUrl(raw, (config as any).params);\n\n const baseURL =\n String((config as any).baseURL || options?.baseURL || readEnvBaseUrl() || \"\").trim();\n const withBase = baseURL ? joinBaseUrl(baseURL, raw) : raw;\n return appendParamsToUrl(withBase, (config as any).params);\n}\n\ndeclare const wx: any;\ndeclare const tt: any;\ndeclare const my: any;\ndeclare const swan: any;\ndeclare const qq: any;\ndeclare const jd: any;\n\nlet registeredMiniProgramRuntime: Partial<MiniProgramRuntime> | null = null;\n\nexport function setMiniProgramRuntime(runtime?: Partial<MiniProgramRuntime> | null): void {\n registeredMiniProgramRuntime = runtime ?? null;\n}\n\nfunction resolveTaroMiniGlobal(taro: MiniProgramRuntime[\"Taro\"] | undefined): any {\n return taro?.miniGlobal ?? taro?.options?.miniGlobal;\n}\n\nfunction resolveMiniProgramPlatformGlobals(miniGlobal: any, taro: MiniProgramRuntime[\"Taro\"] | undefined) {\n const env = taro?.getEnv?.();\n const envType = taro?.ENV_TYPE;\n\n if (envType?.TT !== undefined && env === envType.TT) {\n return { tt: miniGlobal };\n }\n\n if (envType?.WEAPP !== undefined && env === envType.WEAPP) {\n return { wx: miniGlobal };\n }\n\n if (typeof miniGlobal?.createEventSource === \"function\") {\n return { tt: miniGlobal };\n }\n\n if (typeof miniGlobal?.request === \"function\") {\n return { wx: miniGlobal };\n }\n\n return {};\n}\n\nexport function resolveTaroMiniProgramPlatform(\n env: unknown,\n envType?: Record<string, unknown>\n): SupportedMiniProgramPlatform | undefined {\n if (typeof env === \"string\") {\n const normalizedEnv = env.trim().toUpperCase();\n if (normalizedEnv === \"TT\" || normalizedEnv === \"DOUYIN\") {\n return \"douyin\";\n }\n if (normalizedEnv === \"WEAPP\" || normalizedEnv === \"WECHAT\") {\n return \"wechat\";\n }\n }\n\n if (envType) {\n if (typeof envType.TT !== \"undefined\" && env === envType.TT) {\n return \"douyin\";\n }\n if (typeof envType.WEAPP !== \"undefined\" && env === envType.WEAPP) {\n return \"wechat\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveMiniProgramGlobals(): ResolvedMiniProgramGlobals {\n const fallbackGlobal =\n typeof globalThis !== \"undefined\"\n ? (globalThis as any)\n : typeof global !== \"undefined\"\n ? (global as any)\n : typeof window !== \"undefined\"\n ? (window as any)\n : {};\n const taro = registeredMiniProgramRuntime?.Taro ?? fallbackGlobal?.Taro;\n const miniGlobal = resolveTaroMiniGlobal(taro);\n const platformGlobals = resolveMiniProgramPlatformGlobals(miniGlobal, taro);\n\n return {\n Taro: taro,\n wx: platformGlobals.wx ?? (typeof wx !== \"undefined\" ? wx : fallbackGlobal?.wx),\n tt: platformGlobals.tt ?? (typeof tt !== \"undefined\" ? tt : fallbackGlobal?.tt),\n my: typeof my !== \"undefined\" ? my : fallbackGlobal?.my,\n swan: typeof swan !== \"undefined\" ? swan : fallbackGlobal?.swan,\n qq: typeof qq !== \"undefined\" ? qq : fallbackGlobal?.qq,\n jd: typeof jd !== \"undefined\" ? jd : fallbackGlobal?.jd,\n };\n}\n\nexport function detectMiniProgramPlatform(): SupportedMiniProgramPlatform | undefined {\n const runtime = resolveMiniProgramGlobals();\n const taroPlatform = resolveTaroMiniProgramPlatform(runtime.Taro?.getEnv?.(), runtime.Taro?.ENV_TYPE);\n\n if (taroPlatform) {\n return taroPlatform;\n }\n\n if (typeof runtime.tt !== \"undefined\") {\n return \"douyin\";\n }\n\n if (typeof runtime.wx !== \"undefined\") {\n return \"wechat\";\n }\n\n return undefined;\n}\n\ntype MiniProgramLoginFn = (options?: {\n success?: (result: { code?: string }) => void;\n fail?: (error: unknown) => void;\n}) => Promise<{ code?: string }> | { code?: string } | void;\n\nexport function getMiniProgramLogin(\n platform?: SupportedMiniProgramPlatform\n): MiniProgramLoginFn | null {\n const runtime = resolveMiniProgramGlobals();\n\n if (typeof runtime.Taro?.login === \"function\") {\n return runtime.Taro.login.bind(runtime.Taro);\n }\n\n const candidates = platform === \"douyin\"\n ? [runtime.tt, runtime.wx]\n : platform === \"wechat\"\n ? [runtime.wx, runtime.tt]\n : [runtime.tt, runtime.wx];\n const nativeRuntime = candidates.find(candidate => typeof candidate?.login === \"function\");\n\n if (typeof nativeRuntime?.login === \"function\") {\n return nativeRuntime.login.bind(nativeRuntime);\n }\n\n return null;\n}\n\nexport function getMiniProgramRequest(): ((_opts: any) => any) | null {\n const runtime = resolveMiniProgramGlobals();\n if (typeof runtime?.wx?.request === \"function\") return runtime.wx.request.bind(runtime.wx);\n if (typeof runtime?.tt?.request === \"function\") return runtime.tt.request.bind(runtime.tt);\n if (typeof runtime?.my?.request === \"function\") return runtime.my.request.bind(runtime.my);\n if (typeof runtime?.swan?.request === \"function\") return runtime.swan.request.bind(runtime.swan);\n if (typeof runtime?.qq?.request === \"function\") return runtime.qq.request.bind(runtime.qq);\n if (typeof runtime?.jd?.request === \"function\") return runtime.jd.request.bind(runtime.jd);\n if (typeof runtime?.Taro?.request === \"function\") return runtime.Taro.request.bind(runtime.Taro);\n return null;\n}\n\nasync function callMaybePromiseRequest(fn: (options: any) => any, options: any): Promise<any> {\n return await new Promise((resolve, reject) => {\n let settled = false;\n\n const resolveOnce = (value: any) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(value);\n };\n\n const rejectOnce = (error: any) => {\n if (settled) {\n return;\n }\n settled = true;\n reject(error);\n };\n\n try {\n const ret = fn({\n ...options,\n success: resolveOnce,\n fail: rejectOnce,\n });\n\n if (ret && typeof ret.then === \"function\") {\n void ret.then(resolveOnce, rejectOnce);\n return;\n }\n\n // Some adapters may synchronously return a response object instead of\n // invoking callbacks. Reuse that result instead of issuing a second request.\n if (ret && typeof ret === \"object\" && (\"statusCode\" in ret || \"status\" in ret || \"data\" in ret)) {\n resolveOnce(ret);\n }\n } catch (error) {\n rejectOnce(error);\n }\n });\n}\n\nfunction mergeHeaders(\n base: Record<string, string> | undefined,\n extra: unknown\n): Record<string, string> {\n const out: Record<string, string> = { ...(base || {}) };\n if (!extra) return out;\n if (typeof extra === \"object\") {\n for (const [k, v] of Object.entries(extra as Record<string, unknown>)) {\n if (v === undefined || v === null) continue;\n out[k] = String(v);\n }\n }\n return out;\n}\n\nasync function taroLikeAdapter(config: RequestConfig, options?: HttpClientOptions): Promise<AdapterResponse> {\n const req = getMiniProgramRequest();\n if (!req) {\n throw new Error(\"Mini-program request API not found (wx/tt/my/... or global Taro.request).\");\n }\n const url = resolveUrl(config, options);\n const method = String(config.method || \"GET\").toUpperCase();\n const header = mergeHeaders(options?.headers, (config as any).headers);\n\n const res = await callMaybePromiseRequest(req, {\n url,\n method,\n header,\n data: (config as any).data,\n });\n\n const status = (res?.statusCode ?? res?.status ?? 0) as number;\n return { status, data: res?.data, headers: res?.header };\n}\n\nfunction isAxiosInstance(value: unknown): value is AxiosInstance {\n const v: any = value as any;\n // axios instance is callable and has defaults + interceptors\n return typeof v === \"function\" && !!v?.defaults && !!v?.interceptors;\n}\n\n/**\n * Log error to console with detailed information\n * Only logs if logErrors option is not explicitly set to false\n */\nfunction logErrorToConsole(\n config: RequestConfig,\n status: number,\n message: string,\n details: unknown,\n shouldLog: boolean = true\n): void {\n if (!shouldLog) return;\n\n const method = String(config.method || \"GET\").toUpperCase();\n const url = config.url;\n\n // Format error message with request context\n console.error(\n `[HTTP Error] ${method} ${url} - ${status} ${message}`,\n \"\\n→ Details:\",\n details\n );\n}\n\n/**\n * Create an HTTP client instance\n * \n * @param axiosInstance - Optional axios instance to use (defaults to a basic axios instance)\n * @returns HttpClient with request method\n * \n * @example\n * ```typescript\n * import axios from \"axios\";\n * import { createHttpClient } from \"@amaster.ai/http-client\";\n * \n * const instance = axios.create({ baseURL: \"https://api.example.com\" });\n * const client = createHttpClient(instance);\n * \n * const result = await client.request({\n * url: \"/users\",\n * method: \"get\",\n * });\n * ```\n */\nexport function createHttpClient(axiosInstanceOrOptions?: AxiosInstance | HttpClientOptions): HttpClient {\n // Import axios dynamically to avoid bundling it\n let instance: AxiosInstance | undefined;\n let options: HttpClientOptions | undefined;\n let isUserProvidedInstance = false;\n\n if (isAxiosInstance(axiosInstanceOrOptions)) {\n instance = axiosInstanceOrOptions;\n isUserProvidedInstance = true;\n } else {\n options = axiosInstanceOrOptions;\n if (options?.runtime) {\n setMiniProgramRuntime(options.runtime);\n }\n // Check if adapter is an axios instance\n if (options?.adapter && isAxiosInstance(options.adapter)) {\n instance = options.adapter;\n isUserProvidedInstance = true;\n // Remove adapter from options to avoid confusion\n options = { ...options, adapter: undefined };\n }\n }\n\n return {\n async request<T>(\n config: RequestConfig\n ) {\n try {\n // 兼容 body 参数,自动转换为 data(支持 Fetch API 习惯)\n let processedConfig = config;\n if ('body' in config && (config as any).body !== undefined) {\n const { body, ...rest } = config as any;\n processedConfig = { ...rest, data: body };\n }\n\n let status = 0;\n let responseData: unknown = null;\n\n // Resolve the adapter at request time instead of client-creation time.\n // In mini-programs, global request APIs may not be attached yet when the\n // SDK instance is constructed, but they are available by the time an\n // actual request is made.\n const adapterChoice = options?.adapter ?? (getMiniProgramRequest() ? \"taro\" : \"axios\");\n\n const adapter =\n typeof adapterChoice === \"function\" ? adapterChoice :\n adapterChoice === \"taro\" ? \"taro\" :\n \"axios\";\n\n if (typeof adapter === \"function\") {\n const r = await adapter(processedConfig);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else if (adapter === \"taro\") {\n const r = await taroLikeAdapter(processedConfig, options);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else {\n // axios path\n if (!instance) {\n const axios = await import(\"axios\");\n instance = axios.default.create({\n baseURL: options?.baseURL,\n });\n }\n \n // Axios behavior: if config.headers is set, it REPLACES defaults.headers\n // We need to manually merge instance defaults with request headers\n let finalConfig: any = processedConfig;\n \n if (isUserProvidedInstance) {\n // For user-provided instances, merge defaults.headers with config.headers\n const defaultHeaders = instance.defaults.headers || {};\n const configHeaders = (processedConfig as any).headers || {};\n \n // Flatten axios headers structure (common, get, post, etc. + top-level)\n const flattenedDefaults: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (key === 'common' || key === 'get' || key === 'post' || key === 'put' || \n key === 'patch' || key === 'delete' || key === 'head' || key === 'options') {\n // These are method-specific headers, skip for now\n continue;\n }\n if (value !== undefined && value !== null) {\n flattenedDefaults[key] = String(value);\n }\n }\n \n // Merge: defaults < config headers\n finalConfig = {\n ...processedConfig,\n headers: { ...flattenedDefaults, ...configHeaders },\n };\n } else if (options?.headers) {\n // For auto-created instances, merge options.headers\n finalConfig = {\n ...processedConfig,\n headers: mergeHeaders(options.headers, (processedConfig as any).headers),\n };\n }\n \n const resp = await instance(finalConfig);\n status = resp?.status ?? 0;\n responseData = resp?.data;\n }\n\n if (status >= 200 && status < 300) {\n // Transform backend response using custom or default logic\n const transformFn = options?.transformResponse ?? defaultUnwrapBackendResponse;\n const transformedData = transformFn<T>(responseData);\n // Convert backend datetime strings to ISO format\n const processedData = processResponseDates(transformedData);\n return { data: (processedData ?? null) as T | null, error: null, status };\n }\n\n // Non-2xx status code - log error before returning\n const errorMessage = normalizeErrorMessage(responseData) || `HTTP ${status}`;\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, responseData, shouldLog);\n\n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details: responseData,\n },\n status,\n };\n } catch (error_: unknown) {\n // Catch network errors, timeouts, and other exceptions\n const error = error_ as any;\n const status = error?.response?.status || error?.statusCode || 0;\n const details = error?.response?.data ?? error?.data;\n const errorMessage = normalizeErrorMessage(details) || error?.message || \"Network error\";\n \n // Log error to console\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, details || error, shouldLog);\n \n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details,\n },\n status,\n };\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/http.ts"],"names":["normalizeErrorMessage","payload","errorPayload","isBackendStandardFormat","data","status","defaultUnwrapBackendResponse","responseData","BACKEND_DATETIME_REGEX","isBackendDatetime","value","parseBackendDatetime","processResponseDates","item","processed","key","isAbsoluteUrl","url","joinBaseUrl","baseURL","b","u","encodeQuery","params","entries","v","URLSearchParamsCtor","q","sp","k","appendParamsToUrl","readEnvBaseUrl","resolveUrl","config","options","raw","withBase","registeredMiniProgramRuntime","setMiniProgramRuntime","runtime","resolveTaroMiniGlobal","taro","resolveMiniProgramPlatformGlobals","miniGlobal","env","envType","resolveTaroMiniProgramPlatform","normalizedEnv","resolveMiniProgramGlobals","fallbackGlobal","platformGlobals","detectMiniProgramPlatform","taroPlatform","getMiniProgramLogin","platform","nativeRuntime","candidate","getMiniProgramRequest","callMaybePromiseRequest","fn","resolve","reject","settled","resolveOnce","rejectOnce","error","ret","mergeHeaders","base","extra","out","toRequestBody","defaultParseFetchResponseBody","response","text","createFetchAdapter","fetchFn","headers","init","requestContext","patch","finalUrl","finalInit","parseResponseBody","ctx","taroLikeAdapter","req","method","header","res","isAxiosInstance","logErrorToConsole","message","details","shouldLog","createHttpClient","axiosInstanceOrOptions","instance","isUserProvidedInstance","processedConfig","body","rest","adapterChoice","adapter","r","finalConfig","defaultHeaders","configHeaders","flattenedDefaults","resp","transformedData","errorMessage","error_"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable no-unused-vars */\nimport type { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport type ClientError = {\n message: string;\n status?: number;\n code?: string;\n details?: unknown;\n};\n\nexport type ClientResult<T> = {\n data: T | null;\n error: ClientError | null;\n status: number;\n};\n\nexport type RequestConfig = AxiosRequestConfig & {\n url: string;\n method: NonNullable<AxiosRequestConfig[\"method\"]> | string;\n};\n\nexport type AdapterResponse = {\n status: number;\n data: unknown;\n headers?: unknown;\n};\n\nexport type HttpAdapter = (_config: RequestConfig) => Promise<AdapterResponse>;\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport type FetchAdapterRequestContext = {\n config: RequestConfig;\n url: string;\n init: RequestInit;\n};\n\nexport type FetchAdapterRequestPatch = {\n url?: string;\n init?: RequestInit;\n};\n\nexport type FetchAdapterResponseContext = {\n config: RequestConfig;\n response: Response;\n request: FetchAdapterRequestContext;\n};\n\nexport type FetchAdapterOptions = {\n fetch?: FetchLike;\n onRequest?: (\n context: FetchAdapterRequestContext,\n ) => MaybePromise<FetchAdapterRequestPatch | void>;\n parseResponseBody?: (\n context: FetchAdapterResponseContext,\n ) => MaybePromise<unknown>;\n};\n\nexport type MiniProgramRuntime = {\n Taro?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n getEnv?: () => unknown;\n ENV_TYPE?: Record<string, unknown>;\n miniGlobal?: unknown;\n options?: {\n miniGlobal?: unknown;\n };\n };\n};\n\nexport type SupportedMiniProgramPlatform = \"wechat\" | \"douyin\";\n\nexport type ResolvedMiniProgramGlobals = MiniProgramRuntime & {\n wx?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n };\n tt?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n createEventSource?: (_opts: any) => any;\n };\n my?: {\n request?: (_opts: any) => any;\n };\n swan?: {\n request?: (_opts: any) => any;\n };\n qq?: {\n request?: (_opts: any) => any;\n };\n jd?: {\n request?: (_opts: any) => any;\n };\n};\n\nexport type HttpClientOptions = {\n /**\n * HTTP adapter to use:\n * - undefined: auto-detect (taro if mini-program APIs exist, otherwise axios)\n * - \"taro\": force mini-program request (wx/tt/my/...) or global Taro.request\n * - \"axios\": force axios\n * - AxiosInstance: use provided axios instance\n * - function: custom adapter\n */\n adapter?: \"taro\" | \"axios\" | \"fetch\" | AxiosInstance | HttpAdapter;\n /**\n * Base URL to prefix when `config.url` is relative (e.g. \"/api/...\").\n * \n * If not provided:\n * - Taro/mini-program: auto-reads from process.env.TARO_APP_API_BASE_URL or process.env.VITE_API_BASE_URL\n * - H5/Browser: no baseURL (expects dev proxy or absolute URLs)\n */\n baseURL?: string;\n /** Default headers merged into each request */\n headers?: Record<string, string>;\n /**\n * Custom response transform function to extract/modify data from backend response\n * If not provided, uses default transform logic for { status: 0/1, data: {...} }\n * \n * Similar to axios's transformResponse option\n * \n * @example\n * ```typescript\n * // For backend that returns: { statusCode: 200, data: {...} }\n * const client = createHttpClient({\n * transformResponse: (response) => {\n * if (response && typeof response === 'object' && 'data' in response) {\n * return response.data;\n * }\n * return response;\n * }\n * });\n * ```\n */\n transformResponse?: <T>(responseData: unknown) => T;\n /**\n * Whether to log errors to console (default: true)\n * Set to false to disable automatic error logging\n */\n logErrors?: boolean;\n /**\n * Explicitly provide the Taro runtime object when it is not exposed on `globalThis`.\n */\n runtime?: Partial<MiniProgramRuntime>;\n /**\n * Hook to normalize/mutate the final request config before it reaches the adapter.\n * Useful for adding/removing headers or rewriting per-request config in special runtimes.\n */\n beforeRequest?: (_config: RequestConfig) => MaybePromise<RequestConfig>;\n /**\n * Built-in fetch adapter options for runtimes that want to use native fetch\n * while still reusing http-client's baseURL/header/transform pipeline.\n */\n fetchAdapter?: FetchAdapterOptions;\n};\n\nexport type HttpClient = {\n request<T>(\n _config: RequestConfig\n ): Promise<ClientResult<T>>;\n};\n\ninterface ErrorPayload {\n message?: string;\n error?: string;\n msg?: string;\n detail?: string;\n}\n\nfunction normalizeErrorMessage(payload: unknown): string {\n if (!payload) {\n return \"Request failed\";\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n if (typeof payload === \"object\") {\n const errorPayload = payload as ErrorPayload;\n return (\n errorPayload.message ||\n errorPayload.error ||\n errorPayload.msg ||\n errorPayload.detail ||\n \"Request failed\"\n );\n }\n return \"Request failed\";\n}\n\ninterface BackendStandardResponse {\n status: number | string;\n data: unknown;\n}\n\n/**\n * Check if response data matches backend standard format: { status: 0/1, data: {...} }\n * Handles both number and string status values\n */\nfunction isBackendStandardFormat(data: unknown): data is BackendStandardResponse {\n if (!data || typeof data !== \"object\" || !(\"data\" in data)) {\n return false;\n }\n\n // Check status field - handle both number and string values\n if (\"status\" in data) {\n const status = (data as BackendStandardResponse).status;\n // Accept 0, 1, \"0\", \"1\" as valid status values\n return status === 0 || status === 1 || status === \"0\" || status === \"1\";\n }\n\n return false;\n}\n\n/**\n * Default unwrap logic for backend standard format response\n * Backend returns: { status: 0, data: {...} }\n * We extract the inner 'data' field for cleaner client usage\n */\nfunction defaultUnwrapBackendResponse<T>(responseData: unknown): T {\n if (isBackendStandardFormat(responseData)) {\n // Extract inner data field\n return responseData.data as T;\n }\n // Return as-is if not standard format (e.g., BPM/Workflow APIs)\n return responseData as T;\n}\n\n/**\n * Backend datetime format regex: \"YYYY-MM-DD HH:MM:SS\"\n */\nconst BACKEND_DATETIME_REGEX = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/;\n\n/**\n * Check if a string matches backend datetime format\n */\nfunction isBackendDatetime(value: string): boolean {\n return BACKEND_DATETIME_REGEX.test(value);\n}\n\n/**\n * Convert backend datetime string to ISO 8601 format\n * \"2026-01-05 10:30:45\" → \"2026-01-05T10:30:45.000Z\"\n */\nfunction parseBackendDatetime(value: string): string {\n // Replace space with T and append Z for UTC\n return `${value.replace(\" \", \"T\")}.000Z`;\n}\n\n/**\n * Recursively process response data to convert backend datetime strings to ISO format\n * Handles nested objects and arrays\n */\nfunction processResponseDates(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (\n data instanceof Blob ||\n data instanceof ArrayBuffer ||\n ArrayBuffer.isView(data)\n ) {\n return data;\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processResponseDates(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processResponseDates(value);\n }\n return processed;\n }\n\n // Handle backend datetime strings\n if (typeof data === \"string\" && isBackendDatetime(data)) {\n return parseBackendDatetime(data);\n }\n\n return data;\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return /^https?:\\/\\//i.test(url);\n}\n\nfunction joinBaseUrl(baseURL: string, url: string): string {\n const b = baseURL.replace(/\\/+$/, \"\");\n const u = url.startsWith(\"/\") ? url : `/${url}`;\n return `${b}${u}`;\n}\n\nfunction encodeQuery(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"\";\n const entries = Object.entries(params as Record<string, unknown>).filter(\n ([, v]) => v !== undefined && v !== null\n );\n if (entries.length === 0) return \"\";\n const URLSearchParamsCtor = (globalThis as any)?.URLSearchParams as\n | (new () => { append: (k: string, v: string) => void; toString: () => string })\n | undefined;\n\n let q = \"\";\n if (URLSearchParamsCtor) {\n const sp = new URLSearchParamsCtor();\n for (const [k, v] of entries) {\n if (Array.isArray(v)) {\n for (const item of v) sp.append(k, String(item));\n } else {\n sp.append(k, String(v));\n }\n }\n q = sp.toString();\n } else {\n // Minimal fallback (older runtimes): k=v&k=v...\n q = entries\n .flatMap(([k, v]) =>\n Array.isArray(v) ? v.map((item) => [k, item] as const) : ([[k, v]] as const)\n )\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n }\n return q ? `?${q}` : \"\";\n}\n\nfunction appendParamsToUrl(url: string, params: unknown): string {\n const q = encodeQuery(params);\n if (!q) return url;\n if (url.includes(\"?\")) return `${url}&${q.slice(1)}`;\n return `${url}${q}`;\n}\n\nfunction readEnvBaseUrl(): string {\n let value = \"\";\n\n // Taro defineConstants and most bundlers replace process.env.* at build time.\n // Guard for browser runtimes where process may not exist.\n try {\n value =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined (browser) -> ignore\n }\n\n return String(value || \"\").trim();\n}\n\nfunction resolveUrl(config: RequestConfig, options?: HttpClientOptions): string {\n const raw = String(config.url || \"\");\n if (isAbsoluteUrl(raw)) return appendParamsToUrl(raw, (config as any).params);\n\n const baseURL =\n String((config as any).baseURL || options?.baseURL || readEnvBaseUrl() || \"\").trim();\n const withBase = baseURL ? joinBaseUrl(baseURL, raw) : raw;\n return appendParamsToUrl(withBase, (config as any).params);\n}\n\ndeclare const wx: any;\ndeclare const tt: any;\ndeclare const my: any;\ndeclare const swan: any;\ndeclare const qq: any;\ndeclare const jd: any;\n\nlet registeredMiniProgramRuntime: Partial<MiniProgramRuntime> | null = null;\n\nexport function setMiniProgramRuntime(runtime?: Partial<MiniProgramRuntime> | null): void {\n registeredMiniProgramRuntime = runtime ?? null;\n}\n\nfunction resolveTaroMiniGlobal(taro: MiniProgramRuntime[\"Taro\"] | undefined): any {\n return taro?.miniGlobal ?? taro?.options?.miniGlobal;\n}\n\nfunction resolveMiniProgramPlatformGlobals(miniGlobal: any, taro: MiniProgramRuntime[\"Taro\"] | undefined) {\n const env = taro?.getEnv?.();\n const envType = taro?.ENV_TYPE;\n\n if (envType?.TT !== undefined && env === envType.TT) {\n return { tt: miniGlobal };\n }\n\n if (envType?.WEAPP !== undefined && env === envType.WEAPP) {\n return { wx: miniGlobal };\n }\n\n if (typeof miniGlobal?.createEventSource === \"function\") {\n return { tt: miniGlobal };\n }\n\n if (typeof miniGlobal?.request === \"function\") {\n return { wx: miniGlobal };\n }\n\n return {};\n}\n\nexport function resolveTaroMiniProgramPlatform(\n env: unknown,\n envType?: Record<string, unknown>\n): SupportedMiniProgramPlatform | undefined {\n if (typeof env === \"string\") {\n const normalizedEnv = env.trim().toUpperCase();\n if (normalizedEnv === \"TT\" || normalizedEnv === \"DOUYIN\") {\n return \"douyin\";\n }\n if (normalizedEnv === \"WEAPP\" || normalizedEnv === \"WECHAT\") {\n return \"wechat\";\n }\n }\n\n if (envType) {\n if (typeof envType.TT !== \"undefined\" && env === envType.TT) {\n return \"douyin\";\n }\n if (typeof envType.WEAPP !== \"undefined\" && env === envType.WEAPP) {\n return \"wechat\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveMiniProgramGlobals(): ResolvedMiniProgramGlobals {\n const fallbackGlobal =\n typeof globalThis !== \"undefined\"\n ? (globalThis as any)\n : typeof global !== \"undefined\"\n ? (global as any)\n : typeof window !== \"undefined\"\n ? (window as any)\n : {};\n const taro = registeredMiniProgramRuntime?.Taro ?? fallbackGlobal?.Taro;\n const miniGlobal = resolveTaroMiniGlobal(taro);\n const platformGlobals = resolveMiniProgramPlatformGlobals(miniGlobal, taro);\n\n return {\n Taro: taro,\n wx: platformGlobals.wx ?? (typeof wx !== \"undefined\" ? wx : fallbackGlobal?.wx),\n tt: platformGlobals.tt ?? (typeof tt !== \"undefined\" ? tt : fallbackGlobal?.tt),\n my: typeof my !== \"undefined\" ? my : fallbackGlobal?.my,\n swan: typeof swan !== \"undefined\" ? swan : fallbackGlobal?.swan,\n qq: typeof qq !== \"undefined\" ? qq : fallbackGlobal?.qq,\n jd: typeof jd !== \"undefined\" ? jd : fallbackGlobal?.jd,\n };\n}\n\nexport function detectMiniProgramPlatform(): SupportedMiniProgramPlatform | undefined {\n const runtime = resolveMiniProgramGlobals();\n const taroPlatform = resolveTaroMiniProgramPlatform(runtime.Taro?.getEnv?.(), runtime.Taro?.ENV_TYPE);\n\n if (taroPlatform) {\n return taroPlatform;\n }\n\n if (typeof runtime.tt !== \"undefined\") {\n return \"douyin\";\n }\n\n if (typeof runtime.wx !== \"undefined\") {\n return \"wechat\";\n }\n\n return undefined;\n}\n\ntype MiniProgramLoginFn = (options?: {\n success?: (result: { code?: string }) => void;\n fail?: (error: unknown) => void;\n}) => Promise<{ code?: string }> | { code?: string } | void;\n\nexport function getMiniProgramLogin(\n platform?: SupportedMiniProgramPlatform\n): MiniProgramLoginFn | null {\n const runtime = resolveMiniProgramGlobals();\n\n if (typeof runtime.Taro?.login === \"function\") {\n return runtime.Taro.login.bind(runtime.Taro);\n }\n\n const candidates = platform === \"douyin\"\n ? [runtime.tt, runtime.wx]\n : platform === \"wechat\"\n ? [runtime.wx, runtime.tt]\n : [runtime.tt, runtime.wx];\n const nativeRuntime = candidates.find(candidate => typeof candidate?.login === \"function\");\n\n if (typeof nativeRuntime?.login === \"function\") {\n return nativeRuntime.login.bind(nativeRuntime);\n }\n\n return null;\n}\n\nexport function getMiniProgramRequest(): ((_opts: any) => any) | null {\n const runtime = resolveMiniProgramGlobals();\n if (typeof runtime?.wx?.request === \"function\") return runtime.wx.request.bind(runtime.wx);\n if (typeof runtime?.tt?.request === \"function\") return runtime.tt.request.bind(runtime.tt);\n if (typeof runtime?.my?.request === \"function\") return runtime.my.request.bind(runtime.my);\n if (typeof runtime?.swan?.request === \"function\") return runtime.swan.request.bind(runtime.swan);\n if (typeof runtime?.qq?.request === \"function\") return runtime.qq.request.bind(runtime.qq);\n if (typeof runtime?.jd?.request === \"function\") return runtime.jd.request.bind(runtime.jd);\n if (typeof runtime?.Taro?.request === \"function\") return runtime.Taro.request.bind(runtime.Taro);\n return null;\n}\n\nasync function callMaybePromiseRequest(fn: (options: any) => any, options: any): Promise<any> {\n return await new Promise((resolve, reject) => {\n let settled = false;\n\n const resolveOnce = (value: any) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(value);\n };\n\n const rejectOnce = (error: any) => {\n if (settled) {\n return;\n }\n settled = true;\n reject(error);\n };\n\n try {\n const ret = fn({\n ...options,\n success: resolveOnce,\n fail: rejectOnce,\n });\n\n if (ret && typeof ret.then === \"function\") {\n void ret.then(resolveOnce, rejectOnce);\n return;\n }\n\n // Some adapters may synchronously return a response object instead of\n // invoking callbacks. Reuse that result instead of issuing a second request.\n if (ret && typeof ret === \"object\" && (\"statusCode\" in ret || \"status\" in ret || \"data\" in ret)) {\n resolveOnce(ret);\n }\n } catch (error) {\n rejectOnce(error);\n }\n });\n}\n\nfunction mergeHeaders(\n base: Record<string, string> | undefined,\n extra: unknown\n): Record<string, string> {\n const out: Record<string, string> = { ...(base || {}) };\n if (!extra) return out;\n if (typeof extra === \"object\") {\n for (const [k, v] of Object.entries(extra as Record<string, unknown>)) {\n if (v === undefined || v === null) continue;\n out[k] = String(v);\n }\n }\n return out;\n}\n\nfunction toRequestBody(data: unknown): BodyInit | undefined {\n if (data === undefined) {\n return undefined;\n }\n\n if (\n typeof data === \"string\" ||\n data instanceof Blob ||\n data instanceof ArrayBuffer ||\n data instanceof FormData ||\n data instanceof URLSearchParams\n ) {\n return data as BodyInit;\n }\n\n if (ArrayBuffer.isView(data)) {\n return data as unknown as BodyInit;\n }\n\n return JSON.stringify(data);\n}\n\nasync function defaultParseFetchResponseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n try {\n return await response.json();\n } catch {\n return null;\n }\n }\n\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function createFetchAdapter(options?: FetchAdapterOptions): HttpAdapter {\n const fetchFn = options?.fetch ?? globalThis.fetch?.bind(globalThis);\n\n if (typeof fetchFn !== \"function\") {\n throw new Error(\"Fetch API not found. Provide fetchAdapter.fetch explicitly.\");\n }\n\n return async (config: RequestConfig): Promise<AdapterResponse> => {\n const headers = mergeHeaders(undefined, (config as any).headers);\n const init: RequestInit = {\n method: String(config.method || \"GET\").toUpperCase(),\n headers,\n body: toRequestBody((config as any).data),\n };\n const requestContext: FetchAdapterRequestContext = {\n config,\n url: resolveUrl(config),\n init,\n };\n\n const patch = await options?.onRequest?.(requestContext);\n const finalUrl = patch?.url ?? requestContext.url;\n const finalInit = patch?.init ?? requestContext.init;\n\n const response = await fetchFn(finalUrl, finalInit);\n const parseResponseBody =\n options?.parseResponseBody ?? ((ctx: FetchAdapterResponseContext) =>\n defaultParseFetchResponseBody(ctx.response));\n\n return {\n status: response.status,\n data: await parseResponseBody({\n config,\n response,\n request: {\n config,\n url: finalUrl,\n init: finalInit,\n },\n }),\n headers: response.headers,\n };\n };\n}\n\nasync function taroLikeAdapter(config: RequestConfig, options?: HttpClientOptions): Promise<AdapterResponse> {\n const req = getMiniProgramRequest();\n if (!req) {\n throw new Error(\"Mini-program request API not found (wx/tt/my/... or global Taro.request).\");\n }\n const url = resolveUrl(config, options);\n const method = String(config.method || \"GET\").toUpperCase();\n const header = mergeHeaders(options?.headers, (config as any).headers);\n\n const res = await callMaybePromiseRequest(req, {\n url,\n method,\n header,\n data: (config as any).data,\n });\n\n const status = (res?.statusCode ?? res?.status ?? 0) as number;\n return { status, data: res?.data, headers: res?.header };\n}\n\nfunction isAxiosInstance(value: unknown): value is AxiosInstance {\n const v: any = value as any;\n // axios instance is callable and has defaults + interceptors\n return typeof v === \"function\" && !!v?.defaults && !!v?.interceptors;\n}\n\n/**\n * Log error to console with detailed information\n * Only logs if logErrors option is not explicitly set to false\n */\nfunction logErrorToConsole(\n config: RequestConfig,\n status: number,\n message: string,\n details: unknown,\n shouldLog: boolean = true\n): void {\n if (!shouldLog) return;\n\n const method = String(config.method || \"GET\").toUpperCase();\n const url = config.url;\n\n // Format error message with request context\n console.error(\n `[HTTP Error] ${method} ${url} - ${status} ${message}`,\n \"\\n→ Details:\",\n details\n );\n}\n\n/**\n * Create an HTTP client instance\n * \n * @param axiosInstance - Optional axios instance to use (defaults to a basic axios instance)\n * @returns HttpClient with request method\n * \n * @example\n * ```typescript\n * import axios from \"axios\";\n * import { createHttpClient } from \"@amaster.ai/http-client\";\n * \n * const instance = axios.create({ baseURL: \"https://api.example.com\" });\n * const client = createHttpClient(instance);\n * \n * const result = await client.request({\n * url: \"/users\",\n * method: \"get\",\n * });\n * ```\n */\nexport function createHttpClient(axiosInstanceOrOptions?: AxiosInstance | HttpClientOptions): HttpClient {\n // Import axios dynamically to avoid bundling it\n let instance: AxiosInstance | undefined;\n let options: HttpClientOptions | undefined;\n let isUserProvidedInstance = false;\n\n if (isAxiosInstance(axiosInstanceOrOptions)) {\n instance = axiosInstanceOrOptions;\n isUserProvidedInstance = true;\n } else {\n options = axiosInstanceOrOptions;\n if (options?.runtime) {\n setMiniProgramRuntime(options.runtime);\n }\n // Check if adapter is an axios instance\n if (options?.adapter && isAxiosInstance(options.adapter)) {\n instance = options.adapter;\n isUserProvidedInstance = true;\n // Remove adapter from options to avoid confusion\n options = { ...options, adapter: undefined };\n }\n }\n\n return {\n async request<T>(\n config: RequestConfig\n ) {\n try {\n // 兼容 body 参数,自动转换为 data(支持 Fetch API 习惯)\n let processedConfig = config;\n if ('body' in config && (config as any).body !== undefined) {\n const { body, ...rest } = config as any;\n processedConfig = { ...rest, data: body };\n }\n\n processedConfig = {\n ...processedConfig,\n baseURL: (processedConfig as any).baseURL ?? options?.baseURL,\n headers: mergeHeaders(options?.headers, (processedConfig as any).headers),\n };\n\n if (options?.beforeRequest) {\n processedConfig = await options.beforeRequest(processedConfig);\n }\n\n let status = 0;\n let responseData: unknown = null;\n\n // Resolve the adapter at request time instead of client-creation time.\n // In mini-programs, global request APIs may not be attached yet when the\n // SDK instance is constructed, but they are available by the time an\n // actual request is made.\n const adapterChoice = options?.adapter ?? (getMiniProgramRequest() ? \"taro\" : \"axios\");\n\n const adapter =\n typeof adapterChoice === \"function\" ? adapterChoice :\n adapterChoice === \"fetch\" ? \"fetch\" :\n adapterChoice === \"taro\" ? \"taro\" :\n \"axios\";\n\n if (typeof adapter === \"function\") {\n const r = await adapter(processedConfig);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else if (adapter === \"fetch\") {\n const r = await createFetchAdapter(options?.fetchAdapter)(processedConfig);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else if (adapter === \"taro\") {\n const r = await taroLikeAdapter(processedConfig, options);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else {\n // axios path\n if (!instance) {\n const axios = await import(\"axios\");\n instance = axios.default.create({\n baseURL: options?.baseURL,\n });\n }\n \n // Axios behavior: if config.headers is set, it REPLACES defaults.headers\n // We need to manually merge instance defaults with request headers\n let finalConfig: any = processedConfig;\n \n if (isUserProvidedInstance) {\n // For user-provided instances, merge defaults.headers with config.headers\n const defaultHeaders = instance.defaults.headers || {};\n const configHeaders = (processedConfig as any).headers || {};\n \n // Flatten axios headers structure (common, get, post, etc. + top-level)\n const flattenedDefaults: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (key === 'common' || key === 'get' || key === 'post' || key === 'put' || \n key === 'patch' || key === 'delete' || key === 'head' || key === 'options') {\n // These are method-specific headers, skip for now\n continue;\n }\n if (value !== undefined && value !== null) {\n flattenedDefaults[key] = String(value);\n }\n }\n \n // Merge: defaults < config headers\n finalConfig = {\n ...processedConfig,\n headers: { ...flattenedDefaults, ...configHeaders },\n };\n }\n \n const resp = await instance(finalConfig);\n status = resp?.status ?? 0;\n responseData = resp?.data;\n }\n\n if (status >= 200 && status < 300) {\n // Transform backend response using custom or default logic\n const transformFn = options?.transformResponse ?? defaultUnwrapBackendResponse;\n const transformedData = transformFn<T>(responseData);\n // Convert backend datetime strings to ISO format\n const processedData = processResponseDates(transformedData);\n return { data: (processedData ?? null) as T | null, error: null, status };\n }\n\n // Non-2xx status code - log error before returning\n const errorMessage = normalizeErrorMessage(responseData) || `HTTP ${status}`;\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, responseData, shouldLog);\n\n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details: responseData,\n },\n status,\n };\n } catch (error_: unknown) {\n // Catch network errors, timeouts, and other exceptions\n const error = error_ as any;\n const status = error?.response?.status || error?.statusCode || 0;\n const details = error?.response?.data ?? error?.data;\n const errorMessage = normalizeErrorMessage(details) || error?.message || \"Network error\";\n \n // Log error to console\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, details || error, shouldLog);\n \n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details,\n },\n status,\n };\n }\n },\n };\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -21,6 +21,27 @@ type AdapterResponse = {
|
|
|
21
21
|
headers?: unknown;
|
|
22
22
|
};
|
|
23
23
|
type HttpAdapter = (_config: RequestConfig) => Promise<AdapterResponse>;
|
|
24
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
25
|
+
type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
26
|
+
type FetchAdapterRequestContext = {
|
|
27
|
+
config: RequestConfig;
|
|
28
|
+
url: string;
|
|
29
|
+
init: RequestInit;
|
|
30
|
+
};
|
|
31
|
+
type FetchAdapterRequestPatch = {
|
|
32
|
+
url?: string;
|
|
33
|
+
init?: RequestInit;
|
|
34
|
+
};
|
|
35
|
+
type FetchAdapterResponseContext = {
|
|
36
|
+
config: RequestConfig;
|
|
37
|
+
response: Response;
|
|
38
|
+
request: FetchAdapterRequestContext;
|
|
39
|
+
};
|
|
40
|
+
type FetchAdapterOptions = {
|
|
41
|
+
fetch?: FetchLike;
|
|
42
|
+
onRequest?: (context: FetchAdapterRequestContext) => MaybePromise<FetchAdapterRequestPatch | void>;
|
|
43
|
+
parseResponseBody?: (context: FetchAdapterResponseContext) => MaybePromise<unknown>;
|
|
44
|
+
};
|
|
24
45
|
type MiniProgramRuntime = {
|
|
25
46
|
Taro?: {
|
|
26
47
|
request?: (_opts: any) => any;
|
|
@@ -42,6 +63,7 @@ type ResolvedMiniProgramGlobals = MiniProgramRuntime & {
|
|
|
42
63
|
tt?: {
|
|
43
64
|
request?: (_opts: any) => any;
|
|
44
65
|
login?: (_opts?: any) => any;
|
|
66
|
+
createEventSource?: (_opts: any) => any;
|
|
45
67
|
};
|
|
46
68
|
my?: {
|
|
47
69
|
request?: (_opts: any) => any;
|
|
@@ -65,7 +87,7 @@ type HttpClientOptions = {
|
|
|
65
87
|
* - AxiosInstance: use provided axios instance
|
|
66
88
|
* - function: custom adapter
|
|
67
89
|
*/
|
|
68
|
-
adapter?: "taro" | "axios" | AxiosInstance | HttpAdapter;
|
|
90
|
+
adapter?: "taro" | "axios" | "fetch" | AxiosInstance | HttpAdapter;
|
|
69
91
|
/**
|
|
70
92
|
* Base URL to prefix when `config.url` is relative (e.g. "/api/...").
|
|
71
93
|
*
|
|
@@ -105,6 +127,16 @@ type HttpClientOptions = {
|
|
|
105
127
|
* Explicitly provide the Taro runtime object when it is not exposed on `globalThis`.
|
|
106
128
|
*/
|
|
107
129
|
runtime?: Partial<MiniProgramRuntime>;
|
|
130
|
+
/**
|
|
131
|
+
* Hook to normalize/mutate the final request config before it reaches the adapter.
|
|
132
|
+
* Useful for adding/removing headers or rewriting per-request config in special runtimes.
|
|
133
|
+
*/
|
|
134
|
+
beforeRequest?: (_config: RequestConfig) => MaybePromise<RequestConfig>;
|
|
135
|
+
/**
|
|
136
|
+
* Built-in fetch adapter options for runtimes that want to use native fetch
|
|
137
|
+
* while still reusing http-client's baseURL/header/transform pipeline.
|
|
138
|
+
*/
|
|
139
|
+
fetchAdapter?: FetchAdapterOptions;
|
|
108
140
|
};
|
|
109
141
|
type HttpClient = {
|
|
110
142
|
request<T>(_config: RequestConfig): Promise<ClientResult<T>>;
|
|
@@ -125,6 +157,7 @@ type MiniProgramLoginFn = (options?: {
|
|
|
125
157
|
} | void;
|
|
126
158
|
declare function getMiniProgramLogin(platform?: SupportedMiniProgramPlatform): MiniProgramLoginFn | null;
|
|
127
159
|
declare function getMiniProgramRequest(): ((_opts: any) => any) | null;
|
|
160
|
+
declare function createFetchAdapter(options?: FetchAdapterOptions): HttpAdapter;
|
|
128
161
|
/**
|
|
129
162
|
* Create an HTTP client instance
|
|
130
163
|
*
|
|
@@ -147,4 +180,4 @@ declare function getMiniProgramRequest(): ((_opts: any) => any) | null;
|
|
|
147
180
|
*/
|
|
148
181
|
declare function createHttpClient(axiosInstanceOrOptions?: AxiosInstance | HttpClientOptions): HttpClient;
|
|
149
182
|
|
|
150
|
-
export { type AdapterResponse, type ClientError, type ClientResult, type HttpAdapter, type HttpClient, type HttpClientOptions, type MiniProgramRuntime, type RequestConfig, type ResolvedMiniProgramGlobals, type SupportedMiniProgramPlatform, createHttpClient, detectMiniProgramPlatform, getMiniProgramLogin, getMiniProgramRequest, resolveMiniProgramGlobals, resolveTaroMiniProgramPlatform, setMiniProgramRuntime };
|
|
183
|
+
export { type AdapterResponse, type ClientError, type ClientResult, type FetchAdapterOptions, type FetchAdapterRequestContext, type FetchAdapterRequestPatch, type FetchAdapterResponseContext, type FetchLike, type HttpAdapter, type HttpClient, type HttpClientOptions, type MiniProgramRuntime, type RequestConfig, type ResolvedMiniProgramGlobals, type SupportedMiniProgramPlatform, createFetchAdapter, createHttpClient, detectMiniProgramPlatform, getMiniProgramLogin, getMiniProgramRequest, resolveMiniProgramGlobals, resolveTaroMiniProgramPlatform, setMiniProgramRuntime };
|
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,27 @@ type AdapterResponse = {
|
|
|
21
21
|
headers?: unknown;
|
|
22
22
|
};
|
|
23
23
|
type HttpAdapter = (_config: RequestConfig) => Promise<AdapterResponse>;
|
|
24
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
25
|
+
type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
26
|
+
type FetchAdapterRequestContext = {
|
|
27
|
+
config: RequestConfig;
|
|
28
|
+
url: string;
|
|
29
|
+
init: RequestInit;
|
|
30
|
+
};
|
|
31
|
+
type FetchAdapterRequestPatch = {
|
|
32
|
+
url?: string;
|
|
33
|
+
init?: RequestInit;
|
|
34
|
+
};
|
|
35
|
+
type FetchAdapterResponseContext = {
|
|
36
|
+
config: RequestConfig;
|
|
37
|
+
response: Response;
|
|
38
|
+
request: FetchAdapterRequestContext;
|
|
39
|
+
};
|
|
40
|
+
type FetchAdapterOptions = {
|
|
41
|
+
fetch?: FetchLike;
|
|
42
|
+
onRequest?: (context: FetchAdapterRequestContext) => MaybePromise<FetchAdapterRequestPatch | void>;
|
|
43
|
+
parseResponseBody?: (context: FetchAdapterResponseContext) => MaybePromise<unknown>;
|
|
44
|
+
};
|
|
24
45
|
type MiniProgramRuntime = {
|
|
25
46
|
Taro?: {
|
|
26
47
|
request?: (_opts: any) => any;
|
|
@@ -42,6 +63,7 @@ type ResolvedMiniProgramGlobals = MiniProgramRuntime & {
|
|
|
42
63
|
tt?: {
|
|
43
64
|
request?: (_opts: any) => any;
|
|
44
65
|
login?: (_opts?: any) => any;
|
|
66
|
+
createEventSource?: (_opts: any) => any;
|
|
45
67
|
};
|
|
46
68
|
my?: {
|
|
47
69
|
request?: (_opts: any) => any;
|
|
@@ -65,7 +87,7 @@ type HttpClientOptions = {
|
|
|
65
87
|
* - AxiosInstance: use provided axios instance
|
|
66
88
|
* - function: custom adapter
|
|
67
89
|
*/
|
|
68
|
-
adapter?: "taro" | "axios" | AxiosInstance | HttpAdapter;
|
|
90
|
+
adapter?: "taro" | "axios" | "fetch" | AxiosInstance | HttpAdapter;
|
|
69
91
|
/**
|
|
70
92
|
* Base URL to prefix when `config.url` is relative (e.g. "/api/...").
|
|
71
93
|
*
|
|
@@ -105,6 +127,16 @@ type HttpClientOptions = {
|
|
|
105
127
|
* Explicitly provide the Taro runtime object when it is not exposed on `globalThis`.
|
|
106
128
|
*/
|
|
107
129
|
runtime?: Partial<MiniProgramRuntime>;
|
|
130
|
+
/**
|
|
131
|
+
* Hook to normalize/mutate the final request config before it reaches the adapter.
|
|
132
|
+
* Useful for adding/removing headers or rewriting per-request config in special runtimes.
|
|
133
|
+
*/
|
|
134
|
+
beforeRequest?: (_config: RequestConfig) => MaybePromise<RequestConfig>;
|
|
135
|
+
/**
|
|
136
|
+
* Built-in fetch adapter options for runtimes that want to use native fetch
|
|
137
|
+
* while still reusing http-client's baseURL/header/transform pipeline.
|
|
138
|
+
*/
|
|
139
|
+
fetchAdapter?: FetchAdapterOptions;
|
|
108
140
|
};
|
|
109
141
|
type HttpClient = {
|
|
110
142
|
request<T>(_config: RequestConfig): Promise<ClientResult<T>>;
|
|
@@ -125,6 +157,7 @@ type MiniProgramLoginFn = (options?: {
|
|
|
125
157
|
} | void;
|
|
126
158
|
declare function getMiniProgramLogin(platform?: SupportedMiniProgramPlatform): MiniProgramLoginFn | null;
|
|
127
159
|
declare function getMiniProgramRequest(): ((_opts: any) => any) | null;
|
|
160
|
+
declare function createFetchAdapter(options?: FetchAdapterOptions): HttpAdapter;
|
|
128
161
|
/**
|
|
129
162
|
* Create an HTTP client instance
|
|
130
163
|
*
|
|
@@ -147,4 +180,4 @@ declare function getMiniProgramRequest(): ((_opts: any) => any) | null;
|
|
|
147
180
|
*/
|
|
148
181
|
declare function createHttpClient(axiosInstanceOrOptions?: AxiosInstance | HttpClientOptions): HttpClient;
|
|
149
182
|
|
|
150
|
-
export { type AdapterResponse, type ClientError, type ClientResult, type HttpAdapter, type HttpClient, type HttpClientOptions, type MiniProgramRuntime, type RequestConfig, type ResolvedMiniProgramGlobals, type SupportedMiniProgramPlatform, createHttpClient, detectMiniProgramPlatform, getMiniProgramLogin, getMiniProgramRequest, resolveMiniProgramGlobals, resolveTaroMiniProgramPlatform, setMiniProgramRuntime };
|
|
183
|
+
export { type AdapterResponse, type ClientError, type ClientResult, type FetchAdapterOptions, type FetchAdapterRequestContext, type FetchAdapterRequestPatch, type FetchAdapterResponseContext, type FetchLike, type HttpAdapter, type HttpClient, type HttpClientOptions, type MiniProgramRuntime, type RequestConfig, type ResolvedMiniProgramGlobals, type SupportedMiniProgramPlatform, createFetchAdapter, createHttpClient, detectMiniProgramPlatform, getMiniProgramLogin, getMiniProgramRequest, resolveMiniProgramGlobals, resolveTaroMiniProgramPlatform, setMiniProgramRuntime };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
function
|
|
2
|
-
\u2192 Details:`,
|
|
1
|
+
function b(e){if(!e)return "Request failed";if(typeof e=="string")return e;if(typeof e=="object"){let t=e;return t.message||t.error||t.msg||t.detail||"Request failed"}return "Request failed"}function U(e){if(!e||typeof e!="object"||!("data"in e))return false;if("status"in e){let t=e.status;return t===0||t===1||t==="0"||t==="1"}return false}function F(e){return U(e)?e.data:e}var _=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;function B(e){return _.test(e)}function L(e){return `${e.replace(" ","T")}.000Z`}function h(e){if(e==null||e instanceof Blob||e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e;if(Array.isArray(e))return e.map(t=>h(t));if(typeof e=="object"){let t={};for(let[n,o]of Object.entries(e))t[n]=h(o);return t}return typeof e=="string"&&B(e)?L(e):e}function j(e){return /^https?:\/\//i.test(e)}function I(e,t){let n=e.replace(/\/+$/,""),o=t.startsWith("/")?t:`/${t}`;return `${n}${o}`}function H(e){if(!e||typeof e!="object")return "";let t=Object.entries(e).filter(([,s])=>s!=null);if(t.length===0)return "";let n=globalThis?.URLSearchParams,o="";if(n){let s=new n;for(let[i,r]of t)if(Array.isArray(r))for(let a of r)s.append(i,String(a));else s.append(i,String(r));o=s.toString();}else o=t.flatMap(([s,i])=>Array.isArray(i)?i.map(r=>[s,r]):[[s,i]]).map(([s,i])=>`${encodeURIComponent(s)}=${encodeURIComponent(String(i))}`).join("&");return o?`?${o}`:""}function A(e,t){let n=H(t);return n?e.includes("?")?`${e}&${n.slice(1)}`:`${e}${n}`:e}function $(){let e="";try{e=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}return String(e||"").trim()}function C(e,t){let n=String(e.url||"");if(j(n))return A(n,e.params);let o=String(e.baseURL||t?.baseURL||$()||"").trim(),s=o?I(o,n):n;return A(s,e.params)}var k=null;function E(e){k=e??null;}function O(e){return e?.miniGlobal??e?.options?.miniGlobal}function G(e,t){let n=t?.getEnv?.(),o=t?.ENV_TYPE;return o?.TT!==void 0&&n===o.TT?{tt:e}:o?.WEAPP!==void 0&&n===o.WEAPP?{wx:e}:typeof e?.createEventSource=="function"?{tt:e}:typeof e?.request=="function"?{wx:e}:{}}function M(e,t){if(typeof e=="string"){let n=e.trim().toUpperCase();if(n==="TT"||n==="DOUYIN")return "douyin";if(n==="WEAPP"||n==="WECHAT")return "wechat"}if(t){if(typeof t.TT<"u"&&e===t.TT)return "douyin";if(typeof t.WEAPP<"u"&&e===t.WEAPP)return "wechat"}}function y(){let e=typeof globalThis<"u"?globalThis:typeof global<"u"?global:typeof window<"u"?window:{},t=k?.Taro??e?.Taro,n=O(t),o=G(n,t);return {Taro:t,wx:o.wx??(typeof wx<"u"?wx:e?.wx),tt:o.tt??(typeof tt<"u"?tt:e?.tt),my:typeof my<"u"?my:e?.my,swan:typeof swan<"u"?swan:e?.swan,qq:typeof qq<"u"?qq:e?.qq,jd:typeof jd<"u"?jd:e?.jd}}function D(){let e=y(),t=M(e.Taro?.getEnv?.(),e.Taro?.ENV_TYPE);if(t)return t;if(typeof e.tt<"u")return "douyin";if(typeof e.wx<"u")return "wechat"}function N(e){let t=y();if(typeof t.Taro?.login=="function")return t.Taro.login.bind(t.Taro);let o=(e==="douyin"?[t.tt,t.wx]:e==="wechat"?[t.wx,t.tt]:[t.tt,t.wx]).find(s=>typeof s?.login=="function");return typeof o?.login=="function"?o.login.bind(o):null}function P(){let e=y();return typeof e?.wx?.request=="function"?e.wx.request.bind(e.wx):typeof e?.tt?.request=="function"?e.tt.request.bind(e.tt):typeof e?.my?.request=="function"?e.my.request.bind(e.my):typeof e?.swan?.request=="function"?e.swan.request.bind(e.swan):typeof e?.qq?.request=="function"?e.qq.request.bind(e.qq):typeof e?.jd?.request=="function"?e.jd.request.bind(e.jd):typeof e?.Taro?.request=="function"?e.Taro.request.bind(e.Taro):null}async function W(e,t){return await new Promise((n,o)=>{let s=false,i=a=>{s||(s=true,n(a));},r=a=>{s||(s=true,o(a));};try{let a=e({...t,success:i,fail:r});if(a&&typeof a.then=="function"){a.then(i,r);return}a&&typeof a=="object"&&("statusCode"in a||"status"in a||"data"in a)&&i(a);}catch(a){r(a);}})}function w(e,t){let n={...e||{}};if(!t)return n;if(typeof t=="object")for(let[o,s]of Object.entries(t))s!=null&&(n[o]=String(s));return n}function V(e){if(e!==void 0)return typeof e=="string"||e instanceof Blob||e instanceof ArrayBuffer||e instanceof FormData||e instanceof URLSearchParams||ArrayBuffer.isView(e)?e:JSON.stringify(e)}async function Y(e){if((e.headers.get("content-type")||"").includes("application/json"))try{return await e.json()}catch{return null}let n=await e.text();if(!n)return null;try{return JSON.parse(n)}catch{return n}}function v(e){let t=e?.fetch??globalThis.fetch?.bind(globalThis);if(typeof t!="function")throw new Error("Fetch API not found. Provide fetchAdapter.fetch explicitly.");return async n=>{let o=w(void 0,n.headers),s={method:String(n.method||"GET").toUpperCase(),headers:o,body:V(n.data)},i={config:n,url:C(n),init:s},r=await e?.onRequest?.(i),a=r?.url??i.url,f=r?.init??i.init,c=await t(a,f),p=e?.parseResponseBody??(g=>Y(g.response));return {status:c.status,data:await p({config:n,response:c,request:{config:n,url:a,init:f}}),headers:c.headers}}}async function z(e,t){let n=P();if(!n)throw new Error("Mini-program request API not found (wx/tt/my/... or global Taro.request).");let o=C(e,t),s=String(e.method||"GET").toUpperCase(),i=w(t?.headers,e.headers),r=await W(n,{url:o,method:s,header:i,data:e.data});return {status:r?.statusCode??r?.status??0,data:r?.data,headers:r?.header}}function x(e){let t=e;return typeof t=="function"&&!!t?.defaults&&!!t?.interceptors}function T(e,t,n,o,s=true){if(!s)return;let i=String(e.method||"GET").toUpperCase(),r=e.url;console.error(`[HTTP Error] ${i} ${r} - ${t} ${n}`,`
|
|
2
|
+
\u2192 Details:`,o);}function J(e){let t,n,o=false;return x(e)?(t=e,o=true):(n=e,n?.runtime&&E(n.runtime),n?.adapter&&x(n.adapter)&&(t=n.adapter,o=true,n={...n,adapter:void 0})),{async request(s){try{let i=s;if("body"in s&&s.body!==void 0){let{body:u,...l}=s;i={...l,data:u};}i={...i,baseURL:i.baseURL??n?.baseURL,headers:w(n?.headers,i.headers)},n?.beforeRequest&&(i=await n.beforeRequest(i));let r=0,a=null,f=n?.adapter??(P()?"taro":"axios"),c=typeof f=="function"?f:f==="fetch"?"fetch":f==="taro"?"taro":"axios";if(typeof c=="function"){let u=await c(i);r=u.status??0,a=u.data??null;}else if(c==="fetch"){let u=await v(n?.fetchAdapter)(i);r=u.status??0,a=u.data??null;}else if(c==="taro"){let u=await z(i,n);r=u.status??0,a=u.data??null;}else {t||(t=(await import('axios')).default.create({baseURL:n?.baseURL}));let u=i;if(o){let m=t.defaults.headers||{},S=i.headers||{},q={};for(let[d,R]of Object.entries(m))d==="common"||d==="get"||d==="post"||d==="put"||d==="patch"||d==="delete"||d==="head"||d==="options"||R!=null&&(q[d]=String(R));u={...i,headers:{...q,...S}};}let l=await t(u);r=l?.status??0,a=l?.data;}if(r>=200&&r<300){let l=(n?.transformResponse??F)(a);return {data:h(l)??null,error:null,status:r}}let p=b(a)||`HTTP ${r}`,g=n?.logErrors!==!1;return T(s,r,p,a,g),{data:null,error:{status:r,message:p,details:a},status:r}}catch(i){let r=i,a=r?.response?.status||r?.statusCode||0,f=r?.response?.data??r?.data,c=b(f)||r?.message||"Network error",p=n?.logErrors!==false;return T(s,a,c,f||r,p),{data:null,error:{status:a,message:c,details:f},status:a}}}}}export{v as createFetchAdapter,J as createHttpClient,D as detectMiniProgramPlatform,N as getMiniProgramLogin,P as getMiniProgramRequest,y as resolveMiniProgramGlobals,M as resolveTaroMiniProgramPlatform,E as setMiniProgramRuntime};//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http.ts"],"names":["normalizeErrorMessage","payload","errorPayload","isBackendStandardFormat","data","status","defaultUnwrapBackendResponse","responseData","BACKEND_DATETIME_REGEX","isBackendDatetime","value","parseBackendDatetime","processResponseDates","item","processed","key","isAbsoluteUrl","url","joinBaseUrl","baseURL","b","u","encodeQuery","params","entries","v","URLSearchParamsCtor","q","sp","k","appendParamsToUrl","readEnvBaseUrl","resolveUrl","config","options","raw","withBase","registeredMiniProgramRuntime","setMiniProgramRuntime","runtime","resolveTaroMiniGlobal","taro","resolveMiniProgramPlatformGlobals","miniGlobal","env","envType","resolveTaroMiniProgramPlatform","normalizedEnv","resolveMiniProgramGlobals","fallbackGlobal","platformGlobals","detectMiniProgramPlatform","taroPlatform","getMiniProgramLogin","platform","nativeRuntime","candidate","getMiniProgramRequest","callMaybePromiseRequest","fn","resolve","reject","settled","resolveOnce","rejectOnce","error","ret","mergeHeaders","base","extra","out","taroLikeAdapter","req","method","header","res","isAxiosInstance","logErrorToConsole","message","details","shouldLog","createHttpClient","axiosInstanceOrOptions","instance","isUserProvidedInstance","processedConfig","body","rest","adapterChoice","adapter","r","finalConfig","defaultHeaders","configHeaders","flattenedDefaults","resp","transformedData","errorMessage","error_"],"mappings":"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","file":"index.js","sourcesContent":["/* eslint-disable no-unused-vars */\nimport type { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport type ClientError = {\n message: string;\n status?: number;\n code?: string;\n details?: unknown;\n};\n\nexport type ClientResult<T> = {\n data: T | null;\n error: ClientError | null;\n status: number;\n};\n\nexport type RequestConfig = AxiosRequestConfig & {\n url: string;\n method: NonNullable<AxiosRequestConfig[\"method\"]> | string;\n};\n\nexport type AdapterResponse = {\n status: number;\n data: unknown;\n headers?: unknown;\n};\n\nexport type HttpAdapter = (_config: RequestConfig) => Promise<AdapterResponse>;\n\nexport type MiniProgramRuntime = {\n Taro?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n getEnv?: () => unknown;\n ENV_TYPE?: Record<string, unknown>;\n miniGlobal?: unknown;\n options?: {\n miniGlobal?: unknown;\n };\n };\n};\n\nexport type SupportedMiniProgramPlatform = \"wechat\" | \"douyin\";\n\nexport type ResolvedMiniProgramGlobals = MiniProgramRuntime & {\n wx?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n };\n tt?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n };\n my?: {\n request?: (_opts: any) => any;\n };\n swan?: {\n request?: (_opts: any) => any;\n };\n qq?: {\n request?: (_opts: any) => any;\n };\n jd?: {\n request?: (_opts: any) => any;\n };\n};\n\nexport type HttpClientOptions = {\n /**\n * HTTP adapter to use:\n * - undefined: auto-detect (taro if mini-program APIs exist, otherwise axios)\n * - \"taro\": force mini-program request (wx/tt/my/...) or global Taro.request\n * - \"axios\": force axios\n * - AxiosInstance: use provided axios instance\n * - function: custom adapter\n */\n adapter?: \"taro\" | \"axios\" | AxiosInstance | HttpAdapter;\n /**\n * Base URL to prefix when `config.url` is relative (e.g. \"/api/...\").\n * \n * If not provided:\n * - Taro/mini-program: auto-reads from process.env.TARO_APP_API_BASE_URL or process.env.VITE_API_BASE_URL\n * - H5/Browser: no baseURL (expects dev proxy or absolute URLs)\n */\n baseURL?: string;\n /** Default headers merged into each request */\n headers?: Record<string, string>;\n /**\n * Custom response transform function to extract/modify data from backend response\n * If not provided, uses default transform logic for { status: 0/1, data: {...} }\n * \n * Similar to axios's transformResponse option\n * \n * @example\n * ```typescript\n * // For backend that returns: { statusCode: 200, data: {...} }\n * const client = createHttpClient({\n * transformResponse: (response) => {\n * if (response && typeof response === 'object' && 'data' in response) {\n * return response.data;\n * }\n * return response;\n * }\n * });\n * ```\n */\n transformResponse?: <T>(responseData: unknown) => T;\n /**\n * Whether to log errors to console (default: true)\n * Set to false to disable automatic error logging\n */\n logErrors?: boolean;\n /**\n * Explicitly provide the Taro runtime object when it is not exposed on `globalThis`.\n */\n runtime?: Partial<MiniProgramRuntime>;\n};\n\nexport type HttpClient = {\n request<T>(\n _config: RequestConfig\n ): Promise<ClientResult<T>>;\n};\n\ninterface ErrorPayload {\n message?: string;\n error?: string;\n msg?: string;\n detail?: string;\n}\n\nfunction normalizeErrorMessage(payload: unknown): string {\n if (!payload) {\n return \"Request failed\";\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n if (typeof payload === \"object\") {\n const errorPayload = payload as ErrorPayload;\n return (\n errorPayload.message ||\n errorPayload.error ||\n errorPayload.msg ||\n errorPayload.detail ||\n \"Request failed\"\n );\n }\n return \"Request failed\";\n}\n\ninterface BackendStandardResponse {\n status: number | string;\n data: unknown;\n}\n\n/**\n * Check if response data matches backend standard format: { status: 0/1, data: {...} }\n * Handles both number and string status values\n */\nfunction isBackendStandardFormat(data: unknown): data is BackendStandardResponse {\n if (!data || typeof data !== \"object\" || !(\"data\" in data)) {\n return false;\n }\n\n // Check status field - handle both number and string values\n if (\"status\" in data) {\n const status = (data as BackendStandardResponse).status;\n // Accept 0, 1, \"0\", \"1\" as valid status values\n return status === 0 || status === 1 || status === \"0\" || status === \"1\";\n }\n\n return false;\n}\n\n/**\n * Default unwrap logic for backend standard format response\n * Backend returns: { status: 0, data: {...} }\n * We extract the inner 'data' field for cleaner client usage\n */\nfunction defaultUnwrapBackendResponse<T>(responseData: unknown): T {\n if (isBackendStandardFormat(responseData)) {\n // Extract inner data field\n return responseData.data as T;\n }\n // Return as-is if not standard format (e.g., BPM/Workflow APIs)\n return responseData as T;\n}\n\n/**\n * Backend datetime format regex: \"YYYY-MM-DD HH:MM:SS\"\n */\nconst BACKEND_DATETIME_REGEX = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/;\n\n/**\n * Check if a string matches backend datetime format\n */\nfunction isBackendDatetime(value: string): boolean {\n return BACKEND_DATETIME_REGEX.test(value);\n}\n\n/**\n * Convert backend datetime string to ISO 8601 format\n * \"2026-01-05 10:30:45\" → \"2026-01-05T10:30:45.000Z\"\n */\nfunction parseBackendDatetime(value: string): string {\n // Replace space with T and append Z for UTC\n return `${value.replace(\" \", \"T\")}.000Z`;\n}\n\n/**\n * Recursively process response data to convert backend datetime strings to ISO format\n * Handles nested objects and arrays\n */\nfunction processResponseDates(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processResponseDates(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processResponseDates(value);\n }\n return processed;\n }\n\n // Handle backend datetime strings\n if (typeof data === \"string\" && isBackendDatetime(data)) {\n return parseBackendDatetime(data);\n }\n\n return data;\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return /^https?:\\/\\//i.test(url);\n}\n\nfunction joinBaseUrl(baseURL: string, url: string): string {\n const b = baseURL.replace(/\\/+$/, \"\");\n const u = url.startsWith(\"/\") ? url : `/${url}`;\n return `${b}${u}`;\n}\n\nfunction encodeQuery(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"\";\n const entries = Object.entries(params as Record<string, unknown>).filter(\n ([, v]) => v !== undefined && v !== null\n );\n if (entries.length === 0) return \"\";\n const URLSearchParamsCtor = (globalThis as any)?.URLSearchParams as\n | (new () => { append: (k: string, v: string) => void; toString: () => string })\n | undefined;\n\n let q = \"\";\n if (URLSearchParamsCtor) {\n const sp = new URLSearchParamsCtor();\n for (const [k, v] of entries) {\n if (Array.isArray(v)) {\n for (const item of v) sp.append(k, String(item));\n } else {\n sp.append(k, String(v));\n }\n }\n q = sp.toString();\n } else {\n // Minimal fallback (older runtimes): k=v&k=v...\n q = entries\n .flatMap(([k, v]) =>\n Array.isArray(v) ? v.map((item) => [k, item] as const) : ([[k, v]] as const)\n )\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n }\n return q ? `?${q}` : \"\";\n}\n\nfunction appendParamsToUrl(url: string, params: unknown): string {\n const q = encodeQuery(params);\n if (!q) return url;\n if (url.includes(\"?\")) return `${url}&${q.slice(1)}`;\n return `${url}${q}`;\n}\n\nfunction readEnvBaseUrl(): string {\n let value = \"\";\n\n // Taro defineConstants and most bundlers replace process.env.* at build time.\n // Guard for browser runtimes where process may not exist.\n try {\n value =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined (browser) -> ignore\n }\n\n return String(value || \"\").trim();\n}\n\nfunction resolveUrl(config: RequestConfig, options?: HttpClientOptions): string {\n const raw = String(config.url || \"\");\n if (isAbsoluteUrl(raw)) return appendParamsToUrl(raw, (config as any).params);\n\n const baseURL =\n String((config as any).baseURL || options?.baseURL || readEnvBaseUrl() || \"\").trim();\n const withBase = baseURL ? joinBaseUrl(baseURL, raw) : raw;\n return appendParamsToUrl(withBase, (config as any).params);\n}\n\ndeclare const wx: any;\ndeclare const tt: any;\ndeclare const my: any;\ndeclare const swan: any;\ndeclare const qq: any;\ndeclare const jd: any;\n\nlet registeredMiniProgramRuntime: Partial<MiniProgramRuntime> | null = null;\n\nexport function setMiniProgramRuntime(runtime?: Partial<MiniProgramRuntime> | null): void {\n registeredMiniProgramRuntime = runtime ?? null;\n}\n\nfunction resolveTaroMiniGlobal(taro: MiniProgramRuntime[\"Taro\"] | undefined): any {\n return taro?.miniGlobal ?? taro?.options?.miniGlobal;\n}\n\nfunction resolveMiniProgramPlatformGlobals(miniGlobal: any, taro: MiniProgramRuntime[\"Taro\"] | undefined) {\n const env = taro?.getEnv?.();\n const envType = taro?.ENV_TYPE;\n\n if (envType?.TT !== undefined && env === envType.TT) {\n return { tt: miniGlobal };\n }\n\n if (envType?.WEAPP !== undefined && env === envType.WEAPP) {\n return { wx: miniGlobal };\n }\n\n if (typeof miniGlobal?.createEventSource === \"function\") {\n return { tt: miniGlobal };\n }\n\n if (typeof miniGlobal?.request === \"function\") {\n return { wx: miniGlobal };\n }\n\n return {};\n}\n\nexport function resolveTaroMiniProgramPlatform(\n env: unknown,\n envType?: Record<string, unknown>\n): SupportedMiniProgramPlatform | undefined {\n if (typeof env === \"string\") {\n const normalizedEnv = env.trim().toUpperCase();\n if (normalizedEnv === \"TT\" || normalizedEnv === \"DOUYIN\") {\n return \"douyin\";\n }\n if (normalizedEnv === \"WEAPP\" || normalizedEnv === \"WECHAT\") {\n return \"wechat\";\n }\n }\n\n if (envType) {\n if (typeof envType.TT !== \"undefined\" && env === envType.TT) {\n return \"douyin\";\n }\n if (typeof envType.WEAPP !== \"undefined\" && env === envType.WEAPP) {\n return \"wechat\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveMiniProgramGlobals(): ResolvedMiniProgramGlobals {\n const fallbackGlobal =\n typeof globalThis !== \"undefined\"\n ? (globalThis as any)\n : typeof global !== \"undefined\"\n ? (global as any)\n : typeof window !== \"undefined\"\n ? (window as any)\n : {};\n const taro = registeredMiniProgramRuntime?.Taro ?? fallbackGlobal?.Taro;\n const miniGlobal = resolveTaroMiniGlobal(taro);\n const platformGlobals = resolveMiniProgramPlatformGlobals(miniGlobal, taro);\n\n return {\n Taro: taro,\n wx: platformGlobals.wx ?? (typeof wx !== \"undefined\" ? wx : fallbackGlobal?.wx),\n tt: platformGlobals.tt ?? (typeof tt !== \"undefined\" ? tt : fallbackGlobal?.tt),\n my: typeof my !== \"undefined\" ? my : fallbackGlobal?.my,\n swan: typeof swan !== \"undefined\" ? swan : fallbackGlobal?.swan,\n qq: typeof qq !== \"undefined\" ? qq : fallbackGlobal?.qq,\n jd: typeof jd !== \"undefined\" ? jd : fallbackGlobal?.jd,\n };\n}\n\nexport function detectMiniProgramPlatform(): SupportedMiniProgramPlatform | undefined {\n const runtime = resolveMiniProgramGlobals();\n const taroPlatform = resolveTaroMiniProgramPlatform(runtime.Taro?.getEnv?.(), runtime.Taro?.ENV_TYPE);\n\n if (taroPlatform) {\n return taroPlatform;\n }\n\n if (typeof runtime.tt !== \"undefined\") {\n return \"douyin\";\n }\n\n if (typeof runtime.wx !== \"undefined\") {\n return \"wechat\";\n }\n\n return undefined;\n}\n\ntype MiniProgramLoginFn = (options?: {\n success?: (result: { code?: string }) => void;\n fail?: (error: unknown) => void;\n}) => Promise<{ code?: string }> | { code?: string } | void;\n\nexport function getMiniProgramLogin(\n platform?: SupportedMiniProgramPlatform\n): MiniProgramLoginFn | null {\n const runtime = resolveMiniProgramGlobals();\n\n if (typeof runtime.Taro?.login === \"function\") {\n return runtime.Taro.login.bind(runtime.Taro);\n }\n\n const candidates = platform === \"douyin\"\n ? [runtime.tt, runtime.wx]\n : platform === \"wechat\"\n ? [runtime.wx, runtime.tt]\n : [runtime.tt, runtime.wx];\n const nativeRuntime = candidates.find(candidate => typeof candidate?.login === \"function\");\n\n if (typeof nativeRuntime?.login === \"function\") {\n return nativeRuntime.login.bind(nativeRuntime);\n }\n\n return null;\n}\n\nexport function getMiniProgramRequest(): ((_opts: any) => any) | null {\n const runtime = resolveMiniProgramGlobals();\n if (typeof runtime?.wx?.request === \"function\") return runtime.wx.request.bind(runtime.wx);\n if (typeof runtime?.tt?.request === \"function\") return runtime.tt.request.bind(runtime.tt);\n if (typeof runtime?.my?.request === \"function\") return runtime.my.request.bind(runtime.my);\n if (typeof runtime?.swan?.request === \"function\") return runtime.swan.request.bind(runtime.swan);\n if (typeof runtime?.qq?.request === \"function\") return runtime.qq.request.bind(runtime.qq);\n if (typeof runtime?.jd?.request === \"function\") return runtime.jd.request.bind(runtime.jd);\n if (typeof runtime?.Taro?.request === \"function\") return runtime.Taro.request.bind(runtime.Taro);\n return null;\n}\n\nasync function callMaybePromiseRequest(fn: (options: any) => any, options: any): Promise<any> {\n return await new Promise((resolve, reject) => {\n let settled = false;\n\n const resolveOnce = (value: any) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(value);\n };\n\n const rejectOnce = (error: any) => {\n if (settled) {\n return;\n }\n settled = true;\n reject(error);\n };\n\n try {\n const ret = fn({\n ...options,\n success: resolveOnce,\n fail: rejectOnce,\n });\n\n if (ret && typeof ret.then === \"function\") {\n void ret.then(resolveOnce, rejectOnce);\n return;\n }\n\n // Some adapters may synchronously return a response object instead of\n // invoking callbacks. Reuse that result instead of issuing a second request.\n if (ret && typeof ret === \"object\" && (\"statusCode\" in ret || \"status\" in ret || \"data\" in ret)) {\n resolveOnce(ret);\n }\n } catch (error) {\n rejectOnce(error);\n }\n });\n}\n\nfunction mergeHeaders(\n base: Record<string, string> | undefined,\n extra: unknown\n): Record<string, string> {\n const out: Record<string, string> = { ...(base || {}) };\n if (!extra) return out;\n if (typeof extra === \"object\") {\n for (const [k, v] of Object.entries(extra as Record<string, unknown>)) {\n if (v === undefined || v === null) continue;\n out[k] = String(v);\n }\n }\n return out;\n}\n\nasync function taroLikeAdapter(config: RequestConfig, options?: HttpClientOptions): Promise<AdapterResponse> {\n const req = getMiniProgramRequest();\n if (!req) {\n throw new Error(\"Mini-program request API not found (wx/tt/my/... or global Taro.request).\");\n }\n const url = resolveUrl(config, options);\n const method = String(config.method || \"GET\").toUpperCase();\n const header = mergeHeaders(options?.headers, (config as any).headers);\n\n const res = await callMaybePromiseRequest(req, {\n url,\n method,\n header,\n data: (config as any).data,\n });\n\n const status = (res?.statusCode ?? res?.status ?? 0) as number;\n return { status, data: res?.data, headers: res?.header };\n}\n\nfunction isAxiosInstance(value: unknown): value is AxiosInstance {\n const v: any = value as any;\n // axios instance is callable and has defaults + interceptors\n return typeof v === \"function\" && !!v?.defaults && !!v?.interceptors;\n}\n\n/**\n * Log error to console with detailed information\n * Only logs if logErrors option is not explicitly set to false\n */\nfunction logErrorToConsole(\n config: RequestConfig,\n status: number,\n message: string,\n details: unknown,\n shouldLog: boolean = true\n): void {\n if (!shouldLog) return;\n\n const method = String(config.method || \"GET\").toUpperCase();\n const url = config.url;\n\n // Format error message with request context\n console.error(\n `[HTTP Error] ${method} ${url} - ${status} ${message}`,\n \"\\n→ Details:\",\n details\n );\n}\n\n/**\n * Create an HTTP client instance\n * \n * @param axiosInstance - Optional axios instance to use (defaults to a basic axios instance)\n * @returns HttpClient with request method\n * \n * @example\n * ```typescript\n * import axios from \"axios\";\n * import { createHttpClient } from \"@amaster.ai/http-client\";\n * \n * const instance = axios.create({ baseURL: \"https://api.example.com\" });\n * const client = createHttpClient(instance);\n * \n * const result = await client.request({\n * url: \"/users\",\n * method: \"get\",\n * });\n * ```\n */\nexport function createHttpClient(axiosInstanceOrOptions?: AxiosInstance | HttpClientOptions): HttpClient {\n // Import axios dynamically to avoid bundling it\n let instance: AxiosInstance | undefined;\n let options: HttpClientOptions | undefined;\n let isUserProvidedInstance = false;\n\n if (isAxiosInstance(axiosInstanceOrOptions)) {\n instance = axiosInstanceOrOptions;\n isUserProvidedInstance = true;\n } else {\n options = axiosInstanceOrOptions;\n if (options?.runtime) {\n setMiniProgramRuntime(options.runtime);\n }\n // Check if adapter is an axios instance\n if (options?.adapter && isAxiosInstance(options.adapter)) {\n instance = options.adapter;\n isUserProvidedInstance = true;\n // Remove adapter from options to avoid confusion\n options = { ...options, adapter: undefined };\n }\n }\n\n return {\n async request<T>(\n config: RequestConfig\n ) {\n try {\n // 兼容 body 参数,自动转换为 data(支持 Fetch API 习惯)\n let processedConfig = config;\n if ('body' in config && (config as any).body !== undefined) {\n const { body, ...rest } = config as any;\n processedConfig = { ...rest, data: body };\n }\n\n let status = 0;\n let responseData: unknown = null;\n\n // Resolve the adapter at request time instead of client-creation time.\n // In mini-programs, global request APIs may not be attached yet when the\n // SDK instance is constructed, but they are available by the time an\n // actual request is made.\n const adapterChoice = options?.adapter ?? (getMiniProgramRequest() ? \"taro\" : \"axios\");\n\n const adapter =\n typeof adapterChoice === \"function\" ? adapterChoice :\n adapterChoice === \"taro\" ? \"taro\" :\n \"axios\";\n\n if (typeof adapter === \"function\") {\n const r = await adapter(processedConfig);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else if (adapter === \"taro\") {\n const r = await taroLikeAdapter(processedConfig, options);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else {\n // axios path\n if (!instance) {\n const axios = await import(\"axios\");\n instance = axios.default.create({\n baseURL: options?.baseURL,\n });\n }\n \n // Axios behavior: if config.headers is set, it REPLACES defaults.headers\n // We need to manually merge instance defaults with request headers\n let finalConfig: any = processedConfig;\n \n if (isUserProvidedInstance) {\n // For user-provided instances, merge defaults.headers with config.headers\n const defaultHeaders = instance.defaults.headers || {};\n const configHeaders = (processedConfig as any).headers || {};\n \n // Flatten axios headers structure (common, get, post, etc. + top-level)\n const flattenedDefaults: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (key === 'common' || key === 'get' || key === 'post' || key === 'put' || \n key === 'patch' || key === 'delete' || key === 'head' || key === 'options') {\n // These are method-specific headers, skip for now\n continue;\n }\n if (value !== undefined && value !== null) {\n flattenedDefaults[key] = String(value);\n }\n }\n \n // Merge: defaults < config headers\n finalConfig = {\n ...processedConfig,\n headers: { ...flattenedDefaults, ...configHeaders },\n };\n } else if (options?.headers) {\n // For auto-created instances, merge options.headers\n finalConfig = {\n ...processedConfig,\n headers: mergeHeaders(options.headers, (processedConfig as any).headers),\n };\n }\n \n const resp = await instance(finalConfig);\n status = resp?.status ?? 0;\n responseData = resp?.data;\n }\n\n if (status >= 200 && status < 300) {\n // Transform backend response using custom or default logic\n const transformFn = options?.transformResponse ?? defaultUnwrapBackendResponse;\n const transformedData = transformFn<T>(responseData);\n // Convert backend datetime strings to ISO format\n const processedData = processResponseDates(transformedData);\n return { data: (processedData ?? null) as T | null, error: null, status };\n }\n\n // Non-2xx status code - log error before returning\n const errorMessage = normalizeErrorMessage(responseData) || `HTTP ${status}`;\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, responseData, shouldLog);\n\n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details: responseData,\n },\n status,\n };\n } catch (error_: unknown) {\n // Catch network errors, timeouts, and other exceptions\n const error = error_ as any;\n const status = error?.response?.status || error?.statusCode || 0;\n const details = error?.response?.data ?? error?.data;\n const errorMessage = normalizeErrorMessage(details) || error?.message || \"Network error\";\n \n // Log error to console\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, details || error, shouldLog);\n \n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details,\n },\n status,\n };\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/http.ts"],"names":["normalizeErrorMessage","payload","errorPayload","isBackendStandardFormat","data","status","defaultUnwrapBackendResponse","responseData","BACKEND_DATETIME_REGEX","isBackendDatetime","value","parseBackendDatetime","processResponseDates","item","processed","key","isAbsoluteUrl","url","joinBaseUrl","baseURL","b","u","encodeQuery","params","entries","v","URLSearchParamsCtor","q","sp","k","appendParamsToUrl","readEnvBaseUrl","resolveUrl","config","options","raw","withBase","registeredMiniProgramRuntime","setMiniProgramRuntime","runtime","resolveTaroMiniGlobal","taro","resolveMiniProgramPlatformGlobals","miniGlobal","env","envType","resolveTaroMiniProgramPlatform","normalizedEnv","resolveMiniProgramGlobals","fallbackGlobal","platformGlobals","detectMiniProgramPlatform","taroPlatform","getMiniProgramLogin","platform","nativeRuntime","candidate","getMiniProgramRequest","callMaybePromiseRequest","fn","resolve","reject","settled","resolveOnce","rejectOnce","error","ret","mergeHeaders","base","extra","out","toRequestBody","defaultParseFetchResponseBody","response","text","createFetchAdapter","fetchFn","headers","init","requestContext","patch","finalUrl","finalInit","parseResponseBody","ctx","taroLikeAdapter","req","method","header","res","isAxiosInstance","logErrorToConsole","message","details","shouldLog","createHttpClient","axiosInstanceOrOptions","instance","isUserProvidedInstance","processedConfig","body","rest","adapterChoice","adapter","r","finalConfig","defaultHeaders","configHeaders","flattenedDefaults","resp","transformedData","errorMessage","error_"],"mappings":"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","file":"index.js","sourcesContent":["/* eslint-disable no-unused-vars */\nimport type { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport type ClientError = {\n message: string;\n status?: number;\n code?: string;\n details?: unknown;\n};\n\nexport type ClientResult<T> = {\n data: T | null;\n error: ClientError | null;\n status: number;\n};\n\nexport type RequestConfig = AxiosRequestConfig & {\n url: string;\n method: NonNullable<AxiosRequestConfig[\"method\"]> | string;\n};\n\nexport type AdapterResponse = {\n status: number;\n data: unknown;\n headers?: unknown;\n};\n\nexport type HttpAdapter = (_config: RequestConfig) => Promise<AdapterResponse>;\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport type FetchAdapterRequestContext = {\n config: RequestConfig;\n url: string;\n init: RequestInit;\n};\n\nexport type FetchAdapterRequestPatch = {\n url?: string;\n init?: RequestInit;\n};\n\nexport type FetchAdapterResponseContext = {\n config: RequestConfig;\n response: Response;\n request: FetchAdapterRequestContext;\n};\n\nexport type FetchAdapterOptions = {\n fetch?: FetchLike;\n onRequest?: (\n context: FetchAdapterRequestContext,\n ) => MaybePromise<FetchAdapterRequestPatch | void>;\n parseResponseBody?: (\n context: FetchAdapterResponseContext,\n ) => MaybePromise<unknown>;\n};\n\nexport type MiniProgramRuntime = {\n Taro?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n getEnv?: () => unknown;\n ENV_TYPE?: Record<string, unknown>;\n miniGlobal?: unknown;\n options?: {\n miniGlobal?: unknown;\n };\n };\n};\n\nexport type SupportedMiniProgramPlatform = \"wechat\" | \"douyin\";\n\nexport type ResolvedMiniProgramGlobals = MiniProgramRuntime & {\n wx?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n };\n tt?: {\n request?: (_opts: any) => any;\n login?: (_opts?: any) => any;\n createEventSource?: (_opts: any) => any;\n };\n my?: {\n request?: (_opts: any) => any;\n };\n swan?: {\n request?: (_opts: any) => any;\n };\n qq?: {\n request?: (_opts: any) => any;\n };\n jd?: {\n request?: (_opts: any) => any;\n };\n};\n\nexport type HttpClientOptions = {\n /**\n * HTTP adapter to use:\n * - undefined: auto-detect (taro if mini-program APIs exist, otherwise axios)\n * - \"taro\": force mini-program request (wx/tt/my/...) or global Taro.request\n * - \"axios\": force axios\n * - AxiosInstance: use provided axios instance\n * - function: custom adapter\n */\n adapter?: \"taro\" | \"axios\" | \"fetch\" | AxiosInstance | HttpAdapter;\n /**\n * Base URL to prefix when `config.url` is relative (e.g. \"/api/...\").\n * \n * If not provided:\n * - Taro/mini-program: auto-reads from process.env.TARO_APP_API_BASE_URL or process.env.VITE_API_BASE_URL\n * - H5/Browser: no baseURL (expects dev proxy or absolute URLs)\n */\n baseURL?: string;\n /** Default headers merged into each request */\n headers?: Record<string, string>;\n /**\n * Custom response transform function to extract/modify data from backend response\n * If not provided, uses default transform logic for { status: 0/1, data: {...} }\n * \n * Similar to axios's transformResponse option\n * \n * @example\n * ```typescript\n * // For backend that returns: { statusCode: 200, data: {...} }\n * const client = createHttpClient({\n * transformResponse: (response) => {\n * if (response && typeof response === 'object' && 'data' in response) {\n * return response.data;\n * }\n * return response;\n * }\n * });\n * ```\n */\n transformResponse?: <T>(responseData: unknown) => T;\n /**\n * Whether to log errors to console (default: true)\n * Set to false to disable automatic error logging\n */\n logErrors?: boolean;\n /**\n * Explicitly provide the Taro runtime object when it is not exposed on `globalThis`.\n */\n runtime?: Partial<MiniProgramRuntime>;\n /**\n * Hook to normalize/mutate the final request config before it reaches the adapter.\n * Useful for adding/removing headers or rewriting per-request config in special runtimes.\n */\n beforeRequest?: (_config: RequestConfig) => MaybePromise<RequestConfig>;\n /**\n * Built-in fetch adapter options for runtimes that want to use native fetch\n * while still reusing http-client's baseURL/header/transform pipeline.\n */\n fetchAdapter?: FetchAdapterOptions;\n};\n\nexport type HttpClient = {\n request<T>(\n _config: RequestConfig\n ): Promise<ClientResult<T>>;\n};\n\ninterface ErrorPayload {\n message?: string;\n error?: string;\n msg?: string;\n detail?: string;\n}\n\nfunction normalizeErrorMessage(payload: unknown): string {\n if (!payload) {\n return \"Request failed\";\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n if (typeof payload === \"object\") {\n const errorPayload = payload as ErrorPayload;\n return (\n errorPayload.message ||\n errorPayload.error ||\n errorPayload.msg ||\n errorPayload.detail ||\n \"Request failed\"\n );\n }\n return \"Request failed\";\n}\n\ninterface BackendStandardResponse {\n status: number | string;\n data: unknown;\n}\n\n/**\n * Check if response data matches backend standard format: { status: 0/1, data: {...} }\n * Handles both number and string status values\n */\nfunction isBackendStandardFormat(data: unknown): data is BackendStandardResponse {\n if (!data || typeof data !== \"object\" || !(\"data\" in data)) {\n return false;\n }\n\n // Check status field - handle both number and string values\n if (\"status\" in data) {\n const status = (data as BackendStandardResponse).status;\n // Accept 0, 1, \"0\", \"1\" as valid status values\n return status === 0 || status === 1 || status === \"0\" || status === \"1\";\n }\n\n return false;\n}\n\n/**\n * Default unwrap logic for backend standard format response\n * Backend returns: { status: 0, data: {...} }\n * We extract the inner 'data' field for cleaner client usage\n */\nfunction defaultUnwrapBackendResponse<T>(responseData: unknown): T {\n if (isBackendStandardFormat(responseData)) {\n // Extract inner data field\n return responseData.data as T;\n }\n // Return as-is if not standard format (e.g., BPM/Workflow APIs)\n return responseData as T;\n}\n\n/**\n * Backend datetime format regex: \"YYYY-MM-DD HH:MM:SS\"\n */\nconst BACKEND_DATETIME_REGEX = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/;\n\n/**\n * Check if a string matches backend datetime format\n */\nfunction isBackendDatetime(value: string): boolean {\n return BACKEND_DATETIME_REGEX.test(value);\n}\n\n/**\n * Convert backend datetime string to ISO 8601 format\n * \"2026-01-05 10:30:45\" → \"2026-01-05T10:30:45.000Z\"\n */\nfunction parseBackendDatetime(value: string): string {\n // Replace space with T and append Z for UTC\n return `${value.replace(\" \", \"T\")}.000Z`;\n}\n\n/**\n * Recursively process response data to convert backend datetime strings to ISO format\n * Handles nested objects and arrays\n */\nfunction processResponseDates(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (\n data instanceof Blob ||\n data instanceof ArrayBuffer ||\n ArrayBuffer.isView(data)\n ) {\n return data;\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processResponseDates(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processResponseDates(value);\n }\n return processed;\n }\n\n // Handle backend datetime strings\n if (typeof data === \"string\" && isBackendDatetime(data)) {\n return parseBackendDatetime(data);\n }\n\n return data;\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return /^https?:\\/\\//i.test(url);\n}\n\nfunction joinBaseUrl(baseURL: string, url: string): string {\n const b = baseURL.replace(/\\/+$/, \"\");\n const u = url.startsWith(\"/\") ? url : `/${url}`;\n return `${b}${u}`;\n}\n\nfunction encodeQuery(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"\";\n const entries = Object.entries(params as Record<string, unknown>).filter(\n ([, v]) => v !== undefined && v !== null\n );\n if (entries.length === 0) return \"\";\n const URLSearchParamsCtor = (globalThis as any)?.URLSearchParams as\n | (new () => { append: (k: string, v: string) => void; toString: () => string })\n | undefined;\n\n let q = \"\";\n if (URLSearchParamsCtor) {\n const sp = new URLSearchParamsCtor();\n for (const [k, v] of entries) {\n if (Array.isArray(v)) {\n for (const item of v) sp.append(k, String(item));\n } else {\n sp.append(k, String(v));\n }\n }\n q = sp.toString();\n } else {\n // Minimal fallback (older runtimes): k=v&k=v...\n q = entries\n .flatMap(([k, v]) =>\n Array.isArray(v) ? v.map((item) => [k, item] as const) : ([[k, v]] as const)\n )\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n }\n return q ? `?${q}` : \"\";\n}\n\nfunction appendParamsToUrl(url: string, params: unknown): string {\n const q = encodeQuery(params);\n if (!q) return url;\n if (url.includes(\"?\")) return `${url}&${q.slice(1)}`;\n return `${url}${q}`;\n}\n\nfunction readEnvBaseUrl(): string {\n let value = \"\";\n\n // Taro defineConstants and most bundlers replace process.env.* at build time.\n // Guard for browser runtimes where process may not exist.\n try {\n value =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined (browser) -> ignore\n }\n\n return String(value || \"\").trim();\n}\n\nfunction resolveUrl(config: RequestConfig, options?: HttpClientOptions): string {\n const raw = String(config.url || \"\");\n if (isAbsoluteUrl(raw)) return appendParamsToUrl(raw, (config as any).params);\n\n const baseURL =\n String((config as any).baseURL || options?.baseURL || readEnvBaseUrl() || \"\").trim();\n const withBase = baseURL ? joinBaseUrl(baseURL, raw) : raw;\n return appendParamsToUrl(withBase, (config as any).params);\n}\n\ndeclare const wx: any;\ndeclare const tt: any;\ndeclare const my: any;\ndeclare const swan: any;\ndeclare const qq: any;\ndeclare const jd: any;\n\nlet registeredMiniProgramRuntime: Partial<MiniProgramRuntime> | null = null;\n\nexport function setMiniProgramRuntime(runtime?: Partial<MiniProgramRuntime> | null): void {\n registeredMiniProgramRuntime = runtime ?? null;\n}\n\nfunction resolveTaroMiniGlobal(taro: MiniProgramRuntime[\"Taro\"] | undefined): any {\n return taro?.miniGlobal ?? taro?.options?.miniGlobal;\n}\n\nfunction resolveMiniProgramPlatformGlobals(miniGlobal: any, taro: MiniProgramRuntime[\"Taro\"] | undefined) {\n const env = taro?.getEnv?.();\n const envType = taro?.ENV_TYPE;\n\n if (envType?.TT !== undefined && env === envType.TT) {\n return { tt: miniGlobal };\n }\n\n if (envType?.WEAPP !== undefined && env === envType.WEAPP) {\n return { wx: miniGlobal };\n }\n\n if (typeof miniGlobal?.createEventSource === \"function\") {\n return { tt: miniGlobal };\n }\n\n if (typeof miniGlobal?.request === \"function\") {\n return { wx: miniGlobal };\n }\n\n return {};\n}\n\nexport function resolveTaroMiniProgramPlatform(\n env: unknown,\n envType?: Record<string, unknown>\n): SupportedMiniProgramPlatform | undefined {\n if (typeof env === \"string\") {\n const normalizedEnv = env.trim().toUpperCase();\n if (normalizedEnv === \"TT\" || normalizedEnv === \"DOUYIN\") {\n return \"douyin\";\n }\n if (normalizedEnv === \"WEAPP\" || normalizedEnv === \"WECHAT\") {\n return \"wechat\";\n }\n }\n\n if (envType) {\n if (typeof envType.TT !== \"undefined\" && env === envType.TT) {\n return \"douyin\";\n }\n if (typeof envType.WEAPP !== \"undefined\" && env === envType.WEAPP) {\n return \"wechat\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveMiniProgramGlobals(): ResolvedMiniProgramGlobals {\n const fallbackGlobal =\n typeof globalThis !== \"undefined\"\n ? (globalThis as any)\n : typeof global !== \"undefined\"\n ? (global as any)\n : typeof window !== \"undefined\"\n ? (window as any)\n : {};\n const taro = registeredMiniProgramRuntime?.Taro ?? fallbackGlobal?.Taro;\n const miniGlobal = resolveTaroMiniGlobal(taro);\n const platformGlobals = resolveMiniProgramPlatformGlobals(miniGlobal, taro);\n\n return {\n Taro: taro,\n wx: platformGlobals.wx ?? (typeof wx !== \"undefined\" ? wx : fallbackGlobal?.wx),\n tt: platformGlobals.tt ?? (typeof tt !== \"undefined\" ? tt : fallbackGlobal?.tt),\n my: typeof my !== \"undefined\" ? my : fallbackGlobal?.my,\n swan: typeof swan !== \"undefined\" ? swan : fallbackGlobal?.swan,\n qq: typeof qq !== \"undefined\" ? qq : fallbackGlobal?.qq,\n jd: typeof jd !== \"undefined\" ? jd : fallbackGlobal?.jd,\n };\n}\n\nexport function detectMiniProgramPlatform(): SupportedMiniProgramPlatform | undefined {\n const runtime = resolveMiniProgramGlobals();\n const taroPlatform = resolveTaroMiniProgramPlatform(runtime.Taro?.getEnv?.(), runtime.Taro?.ENV_TYPE);\n\n if (taroPlatform) {\n return taroPlatform;\n }\n\n if (typeof runtime.tt !== \"undefined\") {\n return \"douyin\";\n }\n\n if (typeof runtime.wx !== \"undefined\") {\n return \"wechat\";\n }\n\n return undefined;\n}\n\ntype MiniProgramLoginFn = (options?: {\n success?: (result: { code?: string }) => void;\n fail?: (error: unknown) => void;\n}) => Promise<{ code?: string }> | { code?: string } | void;\n\nexport function getMiniProgramLogin(\n platform?: SupportedMiniProgramPlatform\n): MiniProgramLoginFn | null {\n const runtime = resolveMiniProgramGlobals();\n\n if (typeof runtime.Taro?.login === \"function\") {\n return runtime.Taro.login.bind(runtime.Taro);\n }\n\n const candidates = platform === \"douyin\"\n ? [runtime.tt, runtime.wx]\n : platform === \"wechat\"\n ? [runtime.wx, runtime.tt]\n : [runtime.tt, runtime.wx];\n const nativeRuntime = candidates.find(candidate => typeof candidate?.login === \"function\");\n\n if (typeof nativeRuntime?.login === \"function\") {\n return nativeRuntime.login.bind(nativeRuntime);\n }\n\n return null;\n}\n\nexport function getMiniProgramRequest(): ((_opts: any) => any) | null {\n const runtime = resolveMiniProgramGlobals();\n if (typeof runtime?.wx?.request === \"function\") return runtime.wx.request.bind(runtime.wx);\n if (typeof runtime?.tt?.request === \"function\") return runtime.tt.request.bind(runtime.tt);\n if (typeof runtime?.my?.request === \"function\") return runtime.my.request.bind(runtime.my);\n if (typeof runtime?.swan?.request === \"function\") return runtime.swan.request.bind(runtime.swan);\n if (typeof runtime?.qq?.request === \"function\") return runtime.qq.request.bind(runtime.qq);\n if (typeof runtime?.jd?.request === \"function\") return runtime.jd.request.bind(runtime.jd);\n if (typeof runtime?.Taro?.request === \"function\") return runtime.Taro.request.bind(runtime.Taro);\n return null;\n}\n\nasync function callMaybePromiseRequest(fn: (options: any) => any, options: any): Promise<any> {\n return await new Promise((resolve, reject) => {\n let settled = false;\n\n const resolveOnce = (value: any) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(value);\n };\n\n const rejectOnce = (error: any) => {\n if (settled) {\n return;\n }\n settled = true;\n reject(error);\n };\n\n try {\n const ret = fn({\n ...options,\n success: resolveOnce,\n fail: rejectOnce,\n });\n\n if (ret && typeof ret.then === \"function\") {\n void ret.then(resolveOnce, rejectOnce);\n return;\n }\n\n // Some adapters may synchronously return a response object instead of\n // invoking callbacks. Reuse that result instead of issuing a second request.\n if (ret && typeof ret === \"object\" && (\"statusCode\" in ret || \"status\" in ret || \"data\" in ret)) {\n resolveOnce(ret);\n }\n } catch (error) {\n rejectOnce(error);\n }\n });\n}\n\nfunction mergeHeaders(\n base: Record<string, string> | undefined,\n extra: unknown\n): Record<string, string> {\n const out: Record<string, string> = { ...(base || {}) };\n if (!extra) return out;\n if (typeof extra === \"object\") {\n for (const [k, v] of Object.entries(extra as Record<string, unknown>)) {\n if (v === undefined || v === null) continue;\n out[k] = String(v);\n }\n }\n return out;\n}\n\nfunction toRequestBody(data: unknown): BodyInit | undefined {\n if (data === undefined) {\n return undefined;\n }\n\n if (\n typeof data === \"string\" ||\n data instanceof Blob ||\n data instanceof ArrayBuffer ||\n data instanceof FormData ||\n data instanceof URLSearchParams\n ) {\n return data as BodyInit;\n }\n\n if (ArrayBuffer.isView(data)) {\n return data as unknown as BodyInit;\n }\n\n return JSON.stringify(data);\n}\n\nasync function defaultParseFetchResponseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n try {\n return await response.json();\n } catch {\n return null;\n }\n }\n\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function createFetchAdapter(options?: FetchAdapterOptions): HttpAdapter {\n const fetchFn = options?.fetch ?? globalThis.fetch?.bind(globalThis);\n\n if (typeof fetchFn !== \"function\") {\n throw new Error(\"Fetch API not found. Provide fetchAdapter.fetch explicitly.\");\n }\n\n return async (config: RequestConfig): Promise<AdapterResponse> => {\n const headers = mergeHeaders(undefined, (config as any).headers);\n const init: RequestInit = {\n method: String(config.method || \"GET\").toUpperCase(),\n headers,\n body: toRequestBody((config as any).data),\n };\n const requestContext: FetchAdapterRequestContext = {\n config,\n url: resolveUrl(config),\n init,\n };\n\n const patch = await options?.onRequest?.(requestContext);\n const finalUrl = patch?.url ?? requestContext.url;\n const finalInit = patch?.init ?? requestContext.init;\n\n const response = await fetchFn(finalUrl, finalInit);\n const parseResponseBody =\n options?.parseResponseBody ?? ((ctx: FetchAdapterResponseContext) =>\n defaultParseFetchResponseBody(ctx.response));\n\n return {\n status: response.status,\n data: await parseResponseBody({\n config,\n response,\n request: {\n config,\n url: finalUrl,\n init: finalInit,\n },\n }),\n headers: response.headers,\n };\n };\n}\n\nasync function taroLikeAdapter(config: RequestConfig, options?: HttpClientOptions): Promise<AdapterResponse> {\n const req = getMiniProgramRequest();\n if (!req) {\n throw new Error(\"Mini-program request API not found (wx/tt/my/... or global Taro.request).\");\n }\n const url = resolveUrl(config, options);\n const method = String(config.method || \"GET\").toUpperCase();\n const header = mergeHeaders(options?.headers, (config as any).headers);\n\n const res = await callMaybePromiseRequest(req, {\n url,\n method,\n header,\n data: (config as any).data,\n });\n\n const status = (res?.statusCode ?? res?.status ?? 0) as number;\n return { status, data: res?.data, headers: res?.header };\n}\n\nfunction isAxiosInstance(value: unknown): value is AxiosInstance {\n const v: any = value as any;\n // axios instance is callable and has defaults + interceptors\n return typeof v === \"function\" && !!v?.defaults && !!v?.interceptors;\n}\n\n/**\n * Log error to console with detailed information\n * Only logs if logErrors option is not explicitly set to false\n */\nfunction logErrorToConsole(\n config: RequestConfig,\n status: number,\n message: string,\n details: unknown,\n shouldLog: boolean = true\n): void {\n if (!shouldLog) return;\n\n const method = String(config.method || \"GET\").toUpperCase();\n const url = config.url;\n\n // Format error message with request context\n console.error(\n `[HTTP Error] ${method} ${url} - ${status} ${message}`,\n \"\\n→ Details:\",\n details\n );\n}\n\n/**\n * Create an HTTP client instance\n * \n * @param axiosInstance - Optional axios instance to use (defaults to a basic axios instance)\n * @returns HttpClient with request method\n * \n * @example\n * ```typescript\n * import axios from \"axios\";\n * import { createHttpClient } from \"@amaster.ai/http-client\";\n * \n * const instance = axios.create({ baseURL: \"https://api.example.com\" });\n * const client = createHttpClient(instance);\n * \n * const result = await client.request({\n * url: \"/users\",\n * method: \"get\",\n * });\n * ```\n */\nexport function createHttpClient(axiosInstanceOrOptions?: AxiosInstance | HttpClientOptions): HttpClient {\n // Import axios dynamically to avoid bundling it\n let instance: AxiosInstance | undefined;\n let options: HttpClientOptions | undefined;\n let isUserProvidedInstance = false;\n\n if (isAxiosInstance(axiosInstanceOrOptions)) {\n instance = axiosInstanceOrOptions;\n isUserProvidedInstance = true;\n } else {\n options = axiosInstanceOrOptions;\n if (options?.runtime) {\n setMiniProgramRuntime(options.runtime);\n }\n // Check if adapter is an axios instance\n if (options?.adapter && isAxiosInstance(options.adapter)) {\n instance = options.adapter;\n isUserProvidedInstance = true;\n // Remove adapter from options to avoid confusion\n options = { ...options, adapter: undefined };\n }\n }\n\n return {\n async request<T>(\n config: RequestConfig\n ) {\n try {\n // 兼容 body 参数,自动转换为 data(支持 Fetch API 习惯)\n let processedConfig = config;\n if ('body' in config && (config as any).body !== undefined) {\n const { body, ...rest } = config as any;\n processedConfig = { ...rest, data: body };\n }\n\n processedConfig = {\n ...processedConfig,\n baseURL: (processedConfig as any).baseURL ?? options?.baseURL,\n headers: mergeHeaders(options?.headers, (processedConfig as any).headers),\n };\n\n if (options?.beforeRequest) {\n processedConfig = await options.beforeRequest(processedConfig);\n }\n\n let status = 0;\n let responseData: unknown = null;\n\n // Resolve the adapter at request time instead of client-creation time.\n // In mini-programs, global request APIs may not be attached yet when the\n // SDK instance is constructed, but they are available by the time an\n // actual request is made.\n const adapterChoice = options?.adapter ?? (getMiniProgramRequest() ? \"taro\" : \"axios\");\n\n const adapter =\n typeof adapterChoice === \"function\" ? adapterChoice :\n adapterChoice === \"fetch\" ? \"fetch\" :\n adapterChoice === \"taro\" ? \"taro\" :\n \"axios\";\n\n if (typeof adapter === \"function\") {\n const r = await adapter(processedConfig);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else if (adapter === \"fetch\") {\n const r = await createFetchAdapter(options?.fetchAdapter)(processedConfig);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else if (adapter === \"taro\") {\n const r = await taroLikeAdapter(processedConfig, options);\n status = r.status ?? 0;\n responseData = r.data ?? null;\n } else {\n // axios path\n if (!instance) {\n const axios = await import(\"axios\");\n instance = axios.default.create({\n baseURL: options?.baseURL,\n });\n }\n \n // Axios behavior: if config.headers is set, it REPLACES defaults.headers\n // We need to manually merge instance defaults with request headers\n let finalConfig: any = processedConfig;\n \n if (isUserProvidedInstance) {\n // For user-provided instances, merge defaults.headers with config.headers\n const defaultHeaders = instance.defaults.headers || {};\n const configHeaders = (processedConfig as any).headers || {};\n \n // Flatten axios headers structure (common, get, post, etc. + top-level)\n const flattenedDefaults: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (key === 'common' || key === 'get' || key === 'post' || key === 'put' || \n key === 'patch' || key === 'delete' || key === 'head' || key === 'options') {\n // These are method-specific headers, skip for now\n continue;\n }\n if (value !== undefined && value !== null) {\n flattenedDefaults[key] = String(value);\n }\n }\n \n // Merge: defaults < config headers\n finalConfig = {\n ...processedConfig,\n headers: { ...flattenedDefaults, ...configHeaders },\n };\n }\n \n const resp = await instance(finalConfig);\n status = resp?.status ?? 0;\n responseData = resp?.data;\n }\n\n if (status >= 200 && status < 300) {\n // Transform backend response using custom or default logic\n const transformFn = options?.transformResponse ?? defaultUnwrapBackendResponse;\n const transformedData = transformFn<T>(responseData);\n // Convert backend datetime strings to ISO format\n const processedData = processResponseDates(transformedData);\n return { data: (processedData ?? null) as T | null, error: null, status };\n }\n\n // Non-2xx status code - log error before returning\n const errorMessage = normalizeErrorMessage(responseData) || `HTTP ${status}`;\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, responseData, shouldLog);\n\n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details: responseData,\n },\n status,\n };\n } catch (error_: unknown) {\n // Catch network errors, timeouts, and other exceptions\n const error = error_ as any;\n const status = error?.response?.status || error?.statusCode || 0;\n const details = error?.response?.data ?? error?.data;\n const errorMessage = normalizeErrorMessage(details) || error?.message || \"Network error\";\n \n // Log error to console\n const shouldLog = options?.logErrors !== false; // Default to true\n logErrorToConsole(config, status, errorMessage, details || error, shouldLog);\n \n return {\n data: null,\n error: {\n status,\n message: errorMessage,\n details,\n },\n status,\n };\n }\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amaster.ai/http-client",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.10",
|
|
4
4
|
"description": "Base HTTP client with error handling and response unwrapping",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -41,12 +41,15 @@
|
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"axios": "^1.11.0",
|
|
43
43
|
"tsup": "^8.3.5",
|
|
44
|
-
"typescript": "~5.7.2"
|
|
44
|
+
"typescript": "~5.7.2",
|
|
45
|
+
"vitest": "^2.1.9"
|
|
45
46
|
},
|
|
46
47
|
"scripts": {
|
|
47
48
|
"build": "tsup",
|
|
48
49
|
"dev": "tsup --watch",
|
|
49
50
|
"clean": "rm -rf dist *.tsbuildinfo",
|
|
51
|
+
"test": "vitest run",
|
|
52
|
+
"test:watch": "vitest",
|
|
50
53
|
"type-check": "tsc --noEmit"
|
|
51
54
|
}
|
|
52
55
|
}
|