{"id":20610007,"url":"https://github.com/doxiaodong/intercept-fetch","last_synced_at":"2025-09-12T18:20:06.433Z","repository":{"id":57275154,"uuid":"82920546","full_name":"doxiaodong/intercept-fetch","owner":"doxiaodong","description":null,"archived":false,"fork":false,"pushed_at":"2022-12-10T13:55:20.000Z","size":139,"stargazers_count":14,"open_issues_count":2,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-04-25T19:44:43.417Z","etag":null,"topics":["api","fetch","intercept-fetch","interceptor","jsonp","promise"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/doxiaodong.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-02-23T11:27:04.000Z","updated_at":"2022-12-14T22:40:59.000Z","dependencies_parsed_at":"2023-01-26T07:31:34.441Z","dependency_job_id":null,"html_url":"https://github.com/doxiaodong/intercept-fetch","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doxiaodong%2Fintercept-fetch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doxiaodong%2Fintercept-fetch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doxiaodong%2Fintercept-fetch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doxiaodong%2Fintercept-fetch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/doxiaodong","download_url":"https://codeload.github.com/doxiaodong/intercept-fetch/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249006459,"owners_count":21197279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","fetch","intercept-fetch","interceptor","jsonp","promise"],"created_at":"2024-11-16T10:15:13.217Z","updated_at":"2025-04-15T04:32:17.430Z","avatar_url":"https://github.com/doxiaodong.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://img.shields.io/travis/doxiaodong/intercept-fetch.svg?style=flat-square)](https://travis-ci.org/doxiaodong/intercept-fetch)\n[![Downloads](https://img.shields.io/npm/dt/intercept-fetch.svg?style=flat-square)](https://www.npmjs.com/package/intercept-fetch)\n[![Versions](https://img.shields.io/npm/v/intercept-fetch.svg?style=flat-square)]()\n[![License](https://img.shields.io/npm/l/intercept-fetch.svg?style=flat-square)]()\n\n# Add interceptors in fetch api\n\n# Usage\n\n* install `npm i intercept-fetch --save`\n\n* add interceptors\n```typescript\nimport {\n  FetchClient,\n  Interceptor\n} from 'intercept-fetch'\n\nconst fetchClient = new FetchClient()\nconst interceptor = new Interceptor({\n  cors: {\n    id: 0,\n    request(url, config) {\n      url += '\u0026a=1'\n      config.mode = 'cors'\n      return Promise.resolve([url, config])\n    },\n    success(data) {\n      return new Promise((resolve) =\u003e {\n        setTimeout(() =\u003e {\n          console.log('res a', data)\n          data.a = 'intercepta'\n          resolve(data)\n        }, 1000)\n      })\n    }\n  },\n  credentials: {\n    id: 1,\n    request(url, config) {\n      url += '\u0026b=2'\n      config.credentials = 'include'\n      return Promise.resolve([url, config])\n    },\n    requestError(fetchError) {\n      return Promise.reject('requestError reject')\n      // or return Promise.resolve('requestError resolve')\n    },\n    response(response) {\n      return Promise.resolve(error)\n    },\n    success(data) {\n      return new Promise((resolve) =\u003e {\n        setTimeout(() =\u003e {\n          console.log('res b', data)\n          data.b = 'interceptb'\n          resolve(data)\n        }, 1000)\n      })\n    },\n    error(res) {\n      return Promise.resolve(res)\n    },\n    timeout(url) {\n      return Promise.resolve('timeout')\n      // default timeout is 10s\n      // or return Promise.reject('timeout)\n    }\n  }\n})\n\nfetchClient.setInterceptors(interceptor)\n\nfetchClient.get('https://google.com')\n\n```\n\n\u003e Warning: at end of each interceptor, you can reject(any) to catch, if you want to complete the fetch flow, please resolve as ref example!!!\n\n# class FetchClient\n\n* getInterceptors(): IInterceptors\n* setInterceptors(interceptors: Interceptor): void\n* clearInterceptors(): void\n* request(url: string | Request, config?: RequestInit): Promise\u003cany\u003e\n* get(url: string, param?: { [key: string]: any }, config?: RequestInit): Promise\u003cany\u003e\n```typescript\nfetchClient.get('http://google.com', { date: Date.now() })\n```\n* post(url: string, config?: RequestInit): Promise\u003cany\u003e\n* put(url: string, config?: RequestInit): Promise\u003cany\u003e\n* delete(url: string, config?: RequestInit): Promise\u003cany\u003e\n* options(url: string, config?: RequestInit): Promise\u003cany\u003e\n* head(url: string, config?: RequestInit): Promise\u003cany\u003e\n* patch(url: string, config?: RequestInit): Promise\u003cany\u003e\n\n# class Interceptor\n\n* interface\n```typescript\nexport interface IInterceptor {\n  id?: number\n  request?: (url: string | Request, config: RequestInit) =\u003e Promise\u003c[string | Request, RequestInit]\u003e\n  requestError?: (error: any) =\u003e Promise\u003cany\u003e\n  response?: (res: Response) =\u003e Promise\u003cResponse\u003e\n  success?: (data: any) =\u003e Promise\u003cany\u003e\n  error?: (res: Response) =\u003e Promise\u003cResponse\u003e\n  timeout?: (url: string) =\u003e Promise\u003cany\u003e\n  jsonpRequest?: (url: string, config?: fetchJsonp.Options) =\u003e Promise\u003c[string, fetchJsonp.Options]\u003e\n  jsonpResponse?: (res: fetchJsonp.Response) =\u003e Promise\u003cfetchJsonp.Response\u003e\n  jsonpSuccess?: (data: any) =\u003e Promise\u003cany\u003e\n  jsonpError?: (error: any) =\u003e Promise\u003cany\u003e\n}\nexport interface IInterceptors {\n  [key: string]: IInterceptor\n}\n```\n\n* set(key: string, value: IInterceptor): void\n* get(key: string): IInterceptor\n* delete(key: string): void\n* has(key: string): boolean\n* forEach(callback: (value?: IInterceptor, key?: string, target?: Interceptor) =\u003e void, thisArg?): void\n* merge(interceptors: Interceptor): Interceptor // merge this Interceptor to param Interceptor\n```typescript\nconst I = new Interceptor({\n  a: {\n\n  }\n})\nI.merge(new Interceptor({\n  a: {\n    request(url, config){\n      return Promise.resolve([url, config])\n    }\n  }, \n  b: {}\n}))\n\n// I\n// a: {\n// }, \n// b: {}\n```\n\n# Differences with https://github.com/werk85/fetch-intercept\n\n* All interceptors(request, response, success, error) are Promise\n\n* Provide a interceptor class\n\n* Can add more than one interceptors ordered by id, and the smaller id is call first\n\n* Support typescript\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoxiaodong%2Fintercept-fetch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoxiaodong%2Fintercept-fetch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoxiaodong%2Fintercept-fetch/lists"}