fexios
Version:
Fetch based HTTP client with similar API to axios for browser and Node.js
1 lines • 31.8 kB
Source Map (JSON)
{"version":3,"file":"fexios.cjs","sources":["../src/fexios.ts"],"sourcesContent":["import type {\n FexiosConfigs,\n FexiosContext,\n FexiosRequestOptions,\n FexiosFinalContext,\n FexiosMethods,\n FexiosHookStore,\n FexiosLifecycleEvents,\n FexiosHook,\n FexiosInterceptor,\n FexiosInterceptors,\n FexiosRequestShortcut,\n FexiosLifecycleEventMap,\n FexiosPlugin,\n} from './types.js'\nimport {\n createFexiosResponse,\n createFexiosWebSocketResponse,\n FexiosError,\n FexiosErrorCodes,\n FexiosHeaderBuilder,\n FexiosQueryBuilder,\n} from './models/index.js'\nimport { deepMerge, isPlainObject, CallableInstance } from './utils/index.js'\n\n/**\n * Fexios\n * @desc Fetch based HTTP client with similar API to axios for browser and Node.js\n */\nexport class Fexios extends CallableInstance<\n [\n string | URL | (Partial<FexiosRequestOptions> & { url: string | URL }),\n Partial<FexiosRequestOptions>?\n ],\n Promise<FexiosFinalContext<any>>\n> {\n static readonly version = import.meta.env.__VERSION__\n private static readonly FINAL_SYMBOL = Symbol('FEXIOS_FINAL_CONTEXT')\n public baseConfigs: FexiosConfigs\n // for axios compatibility\n get defaults() {\n return this.baseConfigs\n }\n set defaults(configs: FexiosConfigs) {\n this.baseConfigs = configs\n }\n static readonly DEFAULT_CONFIGS: FexiosConfigs = {\n baseURL: '',\n timeout: 0,\n credentials: undefined,\n headers: {},\n query: {},\n responseType: undefined,\n shouldThrow(response) {\n return !response.ok\n },\n fetch: globalThis.fetch,\n }\n protected hooks: FexiosHookStore[] = []\n static readonly ALL_METHODS: FexiosMethods[] = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'head',\n 'options',\n 'trace',\n ]\n static readonly METHODS_WITHOUT_BODY: FexiosMethods[] = [\n 'get',\n 'head',\n 'options',\n 'trace',\n ]\n\n constructor(baseConfigs: Partial<FexiosConfigs> = {}) {\n super('request')\n this.baseConfigs = deepMerge(Fexios.DEFAULT_CONFIGS, baseConfigs)\n Fexios.ALL_METHODS.forEach((m) =>\n this.createMethodShortcut(m.toLowerCase() as Lowercase<FexiosMethods>)\n )\n }\n\n async request<T = any>(\n url: string | URL,\n options?: Partial<FexiosRequestOptions>\n ): Promise<FexiosFinalContext<T>>\n async request<T = any>(\n options: Partial<FexiosRequestOptions> & { url: string | URL }\n ): Promise<FexiosFinalContext<T>>\n async request<T = any>(\n urlOrOptions:\n | string\n | URL\n | (Partial<FexiosRequestOptions> & { url: string | URL }),\n options?: Partial<FexiosRequestOptions>\n ): Promise<FexiosFinalContext<T>> {\n let ctx: FexiosContext = (options || {}) as FexiosContext\n\n if (typeof urlOrOptions === 'string' || urlOrOptions instanceof URL) {\n ctx.url = urlOrOptions.toString()\n } else if (typeof urlOrOptions === 'object') {\n ctx = urlOrOptions as FexiosContext\n }\n\n ctx = await this.emit('beforeInit', ctx)\n if ((ctx as any)[Fexios.FINAL_SYMBOL]) return ctx as any\n\n // first normalization\n // Only apply defaults once after beforeInit\n ctx = this.applyDefaults(ctx)\n\n // method/body check\n if (\n Fexios.METHODS_WITHOUT_BODY.includes(\n ctx.method?.toLocaleLowerCase() as FexiosMethods\n ) &&\n ctx.body\n ) {\n throw new FexiosError(\n FexiosErrorCodes.BODY_NOT_ALLOWED,\n `Request method \"${ctx.method}\" does not allow body`\n )\n }\n\n // beforeRequest\n ctx = await this.emit('beforeRequest', ctx)\n if ((ctx as any)[Fexios.FINAL_SYMBOL]) return ctx as any\n\n // resolve body & auto Content-Type\n let body: string | FormData | URLSearchParams | Blob | undefined\n const headerAutoPatch: Record<string, unknown> = {}\n if (typeof ctx.body !== 'undefined' && ctx.body !== null) {\n if (\n ctx.body instanceof Blob ||\n ctx.body instanceof FormData ||\n ctx.body instanceof URLSearchParams\n ) {\n body = ctx.body\n } else if (typeof ctx.body === 'object' && ctx.body !== null) {\n body = JSON.stringify(ctx.body)\n ctx.headers = this.mergeHeaders(ctx.headers, {\n 'Content-Type': 'application/json',\n })\n } else {\n body = ctx.body\n }\n }\n\n // if user didn't explicitly give content-type, auto patch it based on body\n const optionsHeaders = FexiosHeaderBuilder.makeHeaders(ctx.headers || {})\n if (!optionsHeaders.get('content-type') && body) {\n if (body instanceof FormData || body instanceof URLSearchParams) {\n // let browser set boundary automatically\n headerAutoPatch['content-type'] = null\n } else if (typeof body === 'string' && typeof ctx.body === 'object') {\n headerAutoPatch['content-type'] = 'application/json'\n } else if (body instanceof Blob) {\n headerAutoPatch['content-type'] =\n body.type || 'application/octet-stream'\n }\n }\n ctx.body = body\n\n // afterBodyTransformed\n ctx = await this.emit('afterBodyTransformed', ctx)\n if ((ctx as any)[Fexios.FINAL_SYMBOL]) return ctx as any\n\n // build Request\n const abortController =\n (ctx.abortController as AbortController | undefined) ??\n (globalThis.AbortController ? new AbortController() : undefined)\n\n // 此时 ctx.url 应该已经是完整 URL (由 applyDefaults 保证)\n // 但如果在 hooks 中被修改为相对路径,我们需要再次尝试 resolve\n const fallback = globalThis.location?.href || 'http://localhost'\n // Resolve base URL to absolute\n const baseForRequest = new URL(\n ctx.baseURL || this.baseConfigs.baseURL || fallback,\n fallback\n )\n const urlObjForRequest = new URL(ctx.url, baseForRequest)\n\n // 合并 ctx.query 到 URL searchParams (ctx.query 优先)\n const finalURLForRequest = FexiosQueryBuilder.makeURL(\n urlObjForRequest,\n (ctx as any as FexiosContext).query,\n urlObjForRequest.hash // 保留 hash\n ).toString()\n\n const rawRequest = new Request(finalURLForRequest, {\n method: ctx.method || 'GET',\n credentials: ctx.credentials,\n cache: ctx.cache,\n mode: ctx.mode,\n headers: FexiosHeaderBuilder.mergeHeaders(\n this.baseConfigs.headers,\n ctx.headers || {},\n headerAutoPatch\n ),\n body: ctx.body as any,\n signal: abortController?.signal,\n })\n ctx.rawRequest = rawRequest\n\n // beforeActualFetch\n ctx = await this.emit('beforeActualFetch', ctx)\n if ((ctx as any)[Fexios.FINAL_SYMBOL]) return ctx as any\n\n const timeout = ctx.timeout ?? this.baseConfigs.timeout ?? 60 * 1000\n const shouldThrow = ctx.shouldThrow ?? this.baseConfigs.shouldThrow\n\n // WebSocket 分支\n if (ctx.url.startsWith('ws') || ctx.responseType === 'ws') {\n const response = await createFexiosWebSocketResponse(\n ctx.url,\n undefined,\n timeout\n )\n const finalCtx = {\n ...ctx,\n response,\n rawResponse: undefined!,\n data: response.data,\n headers: response.headers,\n } as FexiosFinalContext<WebSocket>\n return this.emit('afterResponse', finalCtx) as Promise<\n FexiosFinalContext<T>\n >\n }\n\n // —— fetch + 超时控制 —— //\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n if (abortController) {\n timer =\n timeout > 0\n ? setTimeout(() => {\n abortController.abort()\n }, timeout)\n : undefined\n }\n\n const fetch = ctx.fetch || this.baseConfigs.fetch || globalThis.fetch\n const rawResponse = await fetch(ctx.rawRequest!).catch((err) => {\n if (timer) clearTimeout(timer)\n if (abortController?.signal.aborted) {\n throw new FexiosError(\n FexiosErrorCodes.TIMEOUT,\n `Request timed out after ${timeout}ms`,\n ctx\n )\n }\n throw new FexiosError(FexiosErrorCodes.NETWORK_ERROR, err.message, ctx)\n })\n\n if (timer) clearTimeout(timer)\n\n ctx.rawResponse = rawResponse\n ctx.response = await createFexiosResponse(\n rawResponse,\n ctx.responseType,\n (progress, buffer) => {\n options?.onProgress?.(progress, buffer)\n },\n shouldThrow,\n timeout\n )\n // Ensure ctx.rawResponse always points to ctx.response.rawResponse (the unread original Response).\n ctx.rawResponse = ctx.response.rawResponse\n\n Object.defineProperties(ctx, {\n url: { get: () => ctx.rawResponse?.url || finalURLForRequest },\n data: { get: () => ctx.response!.data },\n headers: { get: () => ctx.rawResponse!.headers },\n responseType: { get: () => ctx.response!.responseType },\n })\n\n return this.emit('afterResponse', ctx) as any\n } catch (error) {\n if (timer) clearTimeout(timer)\n throw error\n }\n }\n\n mergeQueries = FexiosQueryBuilder.mergeQueries\n mergeHeaders = FexiosHeaderBuilder.mergeHeaders\n\n private applyDefaults(ctx: FexiosContext): FexiosContext {\n const c = ctx as FexiosContext\n\n // 0. Inherit customEnv from baseConfigs\n // Priority: ctx.customEnv > baseConfigs.customEnv\n if ('customEnv' in this.baseConfigs) {\n c.customEnv = deepMerge(\n {}, // ensure we don't mutate baseConfigs\n (this.baseConfigs as any).customEnv,\n c.customEnv\n )\n }\n\n const fallback = globalThis.location?.href || 'http://localhost'\n\n // 1. Resolve Base URL\n // Priority: ctx.baseURL > defaults.baseURL > fallback\n const effectiveBase = c.baseURL || this.baseConfigs.baseURL || fallback\n\n const baseObj = new URL(effectiveBase, fallback)\n\n // 2. Resolve Full URL & Merge Base Search Params\n // new URL(path, base) will drop base's search params, so we need to merge them manually\n const reqURL = new URL(c.url.toString(), baseObj)\n\n const baseSearchParams = FexiosQueryBuilder.toQueryRecord(\n baseObj.searchParams\n )\n const reqSearchParams = FexiosQueryBuilder.toQueryRecord(\n reqURL.searchParams\n )\n\n // Priority: ctx.url (reqSearchParams) > base (baseSearchParams)\n const mergedSearchParams = FexiosQueryBuilder.mergeQueries(\n baseSearchParams,\n reqSearchParams\n )\n\n // Write back merged search params\n reqURL.search =\n FexiosQueryBuilder.makeSearchParams(mergedSearchParams).toString()\n\n // Update ctx.url to full URL\n // We keep ctx.baseURL for potential later usage (e.g. if hook changes url to relative)\n c.url = reqURL.toString()\n // delete c.baseURL\n\n // 3. Merge ctx.query\n // Priority: ctx.query > defaults.query\n // Note: ctx.query is NOT merged with ctx.url search params here\n const mergedQuery = FexiosQueryBuilder.mergeQueries(\n this.baseConfigs.query,\n c.query\n )\n\n // Restore null values from ctx.query to ensure they can delete params from URL later\n if (c.query) {\n this.restoreNulls(mergedQuery, c.query)\n }\n\n ;(c as any).query = mergedQuery\n\n return c\n }\n\n private restoreNulls(target: any, source: any) {\n if (!source || typeof source !== 'object') return\n for (const [k, v] of Object.entries(source)) {\n if (v === null) {\n target[k] = null\n } else if (isPlainObject(v)) {\n if (!target[k] || typeof target[k] !== 'object') {\n target[k] = {}\n }\n this.restoreNulls(target[k], v)\n }\n }\n }\n\n async emit<E extends FexiosLifecycleEvents, C = FexiosLifecycleEventMap[E]>(\n event: E,\n ctx: C,\n opts: { shouldHandleShortCircuitResponse?: boolean } = {\n shouldHandleShortCircuitResponse: true,\n }\n ): Promise<C> {\n const hooks = this.hooks.filter((h) => h.event === event)\n if (hooks.length === 0) return ctx\n\n const shortCircuit = async (baseCtx: any, raw: Response): Promise<any> => {\n const finalCtx: any = { ...baseCtx, rawResponse: raw }\n const response = await createFexiosResponse(\n raw,\n (baseCtx as FexiosContext).responseType,\n (progress, buffer) =>\n (baseCtx as FexiosContext).onProgress?.(progress, buffer),\n (baseCtx as FexiosContext).shouldThrow ?? this.baseConfigs.shouldThrow,\n (baseCtx as FexiosContext).timeout ??\n this.baseConfigs.timeout ??\n 60 * 1000\n )\n finalCtx.response = response\n // Keep the same invariant as normal request:\n // ctx.rawResponse === ctx.response.rawResponse (unread original Response).\n finalCtx.rawResponse = response.rawResponse\n finalCtx.data = response.data\n finalCtx.headers = response.headers\n\n if (event !== 'afterResponse') {\n const after = (await this.emit('afterResponse', finalCtx)) as any\n ;(after as any)[Fexios.FINAL_SYMBOL] = true\n return after\n } else {\n ;(finalCtx as any)[Fexios.FINAL_SYMBOL] = true\n return finalCtx\n }\n }\n\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i]\n const hookName = `${String(event)}#${\n hook.action.name || `anonymous#${i}`\n }`\n\n const marker = Symbol('FEXIOS_HOOK_CTX_MARK')\n try {\n ;(ctx as any)[marker] = marker\n } catch {}\n\n const result = await hook.action.call(this, ctx as any)\n\n try {\n delete (ctx as any)[marker]\n } catch {}\n\n if (result === false) {\n throw new FexiosError(\n FexiosErrorCodes.ABORTED_BY_HOOK,\n `Request aborted by hook \"${hookName}\"`,\n ctx as unknown as FexiosContext\n )\n }\n\n if (result instanceof Response) {\n if (opts.shouldHandleShortCircuitResponse !== false) {\n return shortCircuit(ctx, result)\n }\n ;(ctx as any).rawResponse = result\n } else if (\n result &&\n typeof result === 'object' &&\n (result as any)[marker] === marker\n ) {\n ctx = result as C\n } else {\n // no-op\n }\n }\n\n return ctx\n }\n\n on<E extends FexiosLifecycleEvents, C = FexiosLifecycleEventMap[E]>(\n event: E,\n action: FexiosHook<C>,\n prepend = false\n ) {\n if (typeof action !== 'function') {\n throw new FexiosError(\n FexiosErrorCodes.INVALID_HOOK_CALLBACK,\n `Hook should be a function, but got \"${typeof action}\"`\n )\n }\n this.hooks[prepend ? 'unshift' : 'push']({\n event,\n action: action as FexiosHook,\n })\n return this\n }\n\n off<E extends FexiosLifecycleEvents>(\n event: E,\n action: FexiosHook<FexiosLifecycleEventMap[E]>\n ): this\n off(event: '*' | null, action: FexiosHook<any>): this\n off(event: FexiosLifecycleEvents | '*' | null, action: FexiosHook<any>) {\n if (event === '*' || !event) {\n this.hooks = this.hooks.filter((hook) => hook.action !== action)\n } else {\n this.hooks = this.hooks.filter(\n (hook) => hook.event !== event || hook.action !== action\n )\n }\n return this\n }\n\n private createInterceptor<T extends FexiosLifecycleEvents>(\n event: T\n ): FexiosInterceptor<T> {\n return {\n handlers: () =>\n this.hooks\n .filter((hook) => hook.event === event)\n .map((hook) => hook.action),\n use: (hook, prepend = false) => {\n return this.on(event, hook, prepend)\n },\n clear: () => {\n this.hooks = this.hooks.filter((hook) => hook.event !== event)\n },\n }\n }\n\n readonly interceptors: FexiosInterceptors = {\n request: this.createInterceptor('beforeRequest'),\n response: this.createInterceptor('afterResponse'),\n }\n\n private createMethodShortcut<T extends Lowercase<FexiosMethods>>(method: T) {\n Reflect.defineProperty(this, method, {\n get: () => {\n return (\n url: string | URL,\n bodyOrQuery?: Record<string, any> | string | URLSearchParams,\n options?: Partial<FexiosRequestOptions>\n ) => {\n if (\n Fexios.METHODS_WITHOUT_BODY.includes(\n method.toLocaleLowerCase() as FexiosMethods\n )\n ) {\n options = bodyOrQuery as any\n } else {\n options = options || {}\n options.body = bodyOrQuery\n }\n return this.request(url, {\n ...options,\n method: method as FexiosMethods,\n })\n }\n },\n })\n return this\n }\n\n extends(configs: Partial<FexiosConfigs>) {\n const fexios = new Fexios(deepMerge(this.baseConfigs, configs))\n // clone hooks\n fexios.hooks = [...this.hooks]\n // clone and reinstall plugins\n fexios._plugins = new Map(this._plugins)\n fexios._plugins.forEach(async (plugin) => {\n await fexios.plugin(plugin)\n })\n return fexios\n }\n\n readonly create = Fexios.create\n static create(configs?: Partial<FexiosConfigs>) {\n return new Fexios(configs)\n }\n\n private _plugins = new Map<string, FexiosPlugin>()\n async plugin(plugin: FexiosPlugin) {\n if (\n typeof plugin?.name === 'string' &&\n typeof plugin?.install === 'function'\n ) {\n if (this._plugins.has(plugin.name)) {\n // already installed\n return this\n }\n const fx = await plugin.install(this)\n this._plugins.set(plugin.name, plugin)\n if (fx instanceof Fexios) {\n return fx\n }\n }\n return this\n }\n\n // 版本弃子们.jpg\n /** @deprecated Use `import { checkIsPlainObject } from 'fexios/utils'` instead */\n readonly checkIsPlainObject = isPlainObject\n\n /** @deprecated Use `mergeQueries` instead */\n readonly mergeQuery = this.mergeQueries\n}\n\n// 魔术技巧\nexport interface Fexios {\n <T = any>(\n url: string | URL,\n options?: Partial<FexiosRequestOptions>\n ): Promise<FexiosFinalContext<T>>\n <T = any>(\n options: Partial<FexiosRequestOptions> & { url: string | URL }\n ): Promise<FexiosFinalContext<T>>\n}\n\n// declare method shortcuts\nexport interface Fexios {\n get: FexiosRequestShortcut<'get'>\n post: FexiosRequestShortcut<'post'>\n put: FexiosRequestShortcut<'put'>\n patch: FexiosRequestShortcut<'patch'>\n delete: FexiosRequestShortcut<'delete'>\n head: FexiosRequestShortcut<'head'>\n options: FexiosRequestShortcut<'options'>\n trace: FexiosRequestShortcut<'trace'>\n}\n"],"names":["CallableInstance","deepMerge","FexiosError","FexiosErrorCodes","FexiosHeaderBuilder","FexiosQueryBuilder","createFexiosWebSocketResponse","createFexiosResponse","isPlainObject"],"mappings":"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"}