{"id":26060338,"url":"https://github.com/L-Blondy/up-fetch","last_synced_at":"2025-03-08T14:01:39.176Z","repository":{"id":142882875,"uuid":"614296203","full_name":"L-Blondy/up-fetch","owner":"L-Blondy","description":null,"archived":false,"fork":false,"pushed_at":"2024-04-13T17:30:24.000Z","size":336,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-04-14T07:09:50.977Z","etag":null,"topics":[],"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/L-Blondy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-03-15T09:55:00.000Z","updated_at":"2024-04-15T07:50:55.848Z","dependencies_parsed_at":"2024-03-19T10:47:14.900Z","dependency_job_id":"3d0175b0-06df-4e5d-82a5-89a929f2604f","html_url":"https://github.com/L-Blondy/up-fetch","commit_stats":null,"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L-Blondy%2Fup-fetch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L-Blondy%2Fup-fetch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L-Blondy%2Fup-fetch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L-Blondy%2Fup-fetch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/L-Blondy","download_url":"https://codeload.github.com/L-Blondy/up-fetch/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242559204,"owners_count":20149326,"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":[],"created_at":"2025-03-08T14:01:38.108Z","updated_at":"2025-03-08T14:01:39.118Z","avatar_url":"https://github.com/L-Blondy.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eupfetch - advanced fetch client builder\u003c/h1\u003e\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/L-Blondy/up-fetch/refs/heads/master/logos/upfetch-logo-gold.svg\" alt=\"upfetch\"\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n   \u003ca href=\"https://www.npmjs.com/package/up-fetch\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/up-fetch.svg?color=EFBA5F\" alt=\"npm version\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://bundlephobia.com/package/up-fetch\"\u003e\u003cimg src=\"https://img.shields.io/bundlephobia/minzip/up-fetch?color=EFBA5F\" alt=\"npm bundle size\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://github.com/L-Blondy/up-fetch/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/npm/l/up-fetch.svg?color=EFBA5F\" alt=\"license\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://github.com/L-Blondy/up-fetch/graphs/commit-activity\"\u003e\u003cimg src=\"https://img.shields.io/github/commit-activity/m/L-Blondy/up-fetch?color=EFBA5F\" alt=\"commit activity\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://www.npmjs.com/package/up-fetch\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/up-fetch.svg?color=EFBA5F\" alt=\"downloads per month\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\n_upfetch_ is an advanced fetch client builder with standard schema validation, automatic response parsing, smart defaults and more. Designed to make data fetching type-safe and developer-friendly while keeping the familiar fetch API.\n\n[中文文档 (AI 翻译)](./README_ZH.md)\n\n## 🚀 Try v2 Beta!\n\nVersion 2 of upfetch is now available in beta! The changes mainly impact advanced use cases, so most projects won’t require any modifications. Give it a try with:\n\n```bash\nnpm i up-fetch@2.0.0-beta.3\n```\n\nCheck out the [Migration Guide](https://github.com/L-Blondy/up-fetch/blob/v2.0/MIGRATION_v1_v2.md) for details about changes and how to upgrade. \\\nFor a complete overview of new features, see the [v2 documentation](https://github.com/L-Blondy/up-fetch/tree/v2.0/README.md).\n\n## Table of Contents\n\n- [Highlights](#️-highlights)\n- [QuickStart](#️-quickstart)\n- [Key Features](#️-key-features)\n   - [Request Configuration](#️-request-configuration)\n   - [Simple Query Parameters](#️-simple-query-parameters)\n   - [Automatic Body Handling](#️-automatic-body-handling)\n   - [Schema Validation](#️-schema-validation)\n   - [Lifecycle Hooks](#️-lifecycle-hooks)\n   - [Timeout](#️-timeout)\n   - [Error Handling](#️-error-handling)\n- [Usage](#️-usage)\n   - [Authentication](#️-authentication)\n   - [Delete a default option](#️-delete-a-default-option)\n   - [FormData](#️-formdata)\n   - [HTTP Agent](#️-http-agent)\n   - [Multiple fetch clients](#️-multiple-fetch-clients)\n- [Advanced Usage](#️-advanced-usage)\n   - [Error as value](#️-error-as-value)\n   - [Custom response parsing](#️-custom-response-parsing)\n   - [Custom response errors](#️-custom-response-errors)\n   - [Custom params serialization](#️-custom-params-serialization)\n   - [Custom body serialization](#️-custom-body-serialization)\n   - [Defaults based on the request](#️-defaults-based-on-the-request)\n- [API Reference](#️-api-reference)\n- [Feature Comparison](#️-feature-comparison)\n- [Environment Support](#️-environment-support)\n\n## ➡️ Highlights\n\n- 🚀 **Lightweight** - 1.2kB gzipped, no dependency\n- 🔒 **Typesafe** - Validate API responses with [zod][zod], [valibot][valibot] or [arktype][arktype]\n- 🛠️ **Practical API** - Use objects for `params` and `body`, get parsed responses automatically\n- 🎨 **Flexible Config** - Set defaults like `baseUrl` or `headers` once, use everywhere\n- 🤝 **Familiar** - same API as fetch with additional options and sensible defaults\n\n## ➡️ QuickStart\n\n```bash\nnpm i up-fetch\n```\n\nCreate a new upfetch instance:\n\n```ts\nimport { up } from 'up-fetch'\n\nexport const upfetch = up(fetch)\n```\n\nMake a fetch request with schema validation:\n\n```ts\nimport { upfetch } from './upfetch'\nimport { z } from 'zod'\n\nconst user = await upfetch('https://a.b.c/users/1', {\n   schema: z.object({\n      id: z.number(),\n      name: z.string(),\n      avatar: z.string().url(),\n   }),\n})\n```\n\nThe response is already **parsed** and properly **typed** based on the schema.\n\n_upfetch_ extends the native fetch API, which means all standard fetch options are available.\n\n## ➡️ Key Features\n\n### ✔️ Request Configuration\n\nSet defaults for all requests when creating an instance:\n\n```ts\nconst upfetch = up(fetch, () =\u003e ({\n   baseUrl: 'https://a.b.c',\n   timeout: 30000,\n}))\n```\n\nCheck out the the [API Reference][api-reference] for the full list of options.\n\n### ✔️ Simple Query Parameters\n\n👎 With raw fetch:\n\n```ts\nfetch(\n   `https://api.example.com/todos?search=${search}\u0026skip=${skip}\u0026take=${take}`,\n)\n```\n\n👍 With _upfetch_:\n\n```ts\nupfetch('/todos', {\n   params: { search, skip, take },\n})\n```\n\nUse the [serializeParams][api-reference] option to customize the query parameter serialization.\n\n### ✔️ Automatic Body Handling\n\n👎 With raw fetch:\n\n```ts\nfetch('https://api.example.com/todos', {\n   method: 'POST',\n   headers: { 'Content-Type': 'application/json' },\n   body: JSON.stringify({ title: 'New Todo' }),\n})\n```\n\n👍 With _upfetch_:\n\n```ts\nupfetch('/todos', {\n   method: 'POST',\n   body: { title: 'New Todo' },\n})\n```\n\n_upfetch_ also supports all [fetch body types](https://developer.mozilla.org/en-US/docs/Web/API/RequestInit#body).\n\nCheck out the [serializeBody][api-reference] option to customize the body serialization.\n\n### ✔️ Schema Validation\n\nSince _upfetch_ follows the [Standard Schema Specification][standard-schema] it can be used with any schema library that implements the spec. \\\nSee the full list [here][standard-schema-libs].\n\n👉 With **zod** 3.24+\n\n```ts\nimport { z } from 'zod'\n\nconst posts = await upfetch('/posts/1', {\n   schema: z.object({\n      id: z.number(),\n      title: z.string(),\n   }),\n})\n```\n\n👉 With **valibot** 1.0+\n\n```ts\nimport { object, string, number } from 'valibot'\n\nconst posts = await upfetch('/posts/1', {\n   schema: object({\n      id: number(),\n      title: string(),\n   }),\n})\n```\n\n### ✔️ Lifecycle Hooks\n\nControl request/response lifecycle with simple hooks:\n\n```ts\nconst upfetch = up(fetch, () =\u003e ({\n   onRequest: (options) =\u003e {\n      // Called before the request is made, options might be mutated here\n   },\n   onSuccess: (data, options) =\u003e {\n      // Called when the request successfully completes\n   },\n   onError: (error, options) =\u003e {\n      // Called when the request fails\n   },\n}))\n```\n\n### ✔️ Timeout\n\nSet a timeout for one request:\n\n```ts\nupfetch('/todos', {\n   timeout: 3000,\n})\n```\n\nSet a default timeout for all requests:\n\n```ts\nconst upfetch = up(fetch, () =\u003e ({\n   timeout: 5000,\n}))\n```\n\n### ✔️ Error Handling\n\n#### 👉 \u003csamp\u003eResponseError\u003c/samp\u003e\n\nRaised when `response.ok` is `false`. \\\nUse `isResponseError` to identify this error type.\n\n```ts\nimport { isResponseError } from 'up-fetch'\n\ntry {\n   await upfetch('/todos/1')\n} catch (error) {\n   if (isResponseError(error)) {\n      console.log(error.status)\n   }\n}\n```\n\n- Use the [parseRejected][api-reference] option to throw a custom error instead.\n- Use the [reject][api-reference] option to decide **when** to throw.\n\n#### 👉 \u003csamp\u003eValidationError\u003c/samp\u003e\n\nRaised when schema validation fails. \\\nUse `isValidationError` to identify this error type.\n\n```ts\nimport { isValidationError } from 'up-fetch'\n\ntry {\n   await upfetch('/todos/1', { schema: todoSchema })\n} catch (error) {\n   if (isValidationError(error)) {\n      console.log(error.issues)\n   }\n}\n```\n\n## ➡️ Usage\n\n### ✔️ Authentication\n\nYou can easily add authentication to all requests by setting a default header:\n\n```ts\nconst upfetch = up(fetch, () =\u003e ({\n   headers: { Authorization: localStorage.getItem('bearer-token') },\n}))\n```\n\nThe bearer token will be retrieved from `localStorage` before each request.\n\n### ✔️ Delete a default option\n\nSimply pass `undefined`:\n\n```ts\nupfetch('/todos', {\n   signal: undefined,\n})\n```\n\n### ✔️ FormData\n\nGrab the FormData from a `form`.\n\n```ts\nconst form = document.querySelector('#my-form')\n\nupfetch('/todos', {\n   method: 'POST',\n   body: new FormData(form),\n})\n```\n\nOr create FormData from an object:\n\n```ts\nimport { serialize } from 'object-to-formdata'\n\nconst upfetch = up(fetch, () =\u003e ({\n   serializeBody: (body) =\u003e serialize(body),\n}))\n\nupfetch('https://a.b.c', {\n   method: 'POST',\n   body: { file: new File(['foo'], 'foo.txt') },\n})\n```\n\n### ✔️ HTTP Agent\n\nSince _upfetch_ is _\"fetch agnostic\"_, you can use [undici](https://github.com/nodejs/undici) instead of the native fetch implementation.\n\nOn a single request:\n\n```ts\nimport { fetch, Agent } from 'undici'\n\nconst upfetch = up(fetch)\n\nconst data = await upfetch('https://a.b.c', {\n   dispatcher: new Agent({\n      keepAliveTimeout: 10,\n      keepAliveMaxTimeout: 10,\n   }),\n})\n```\n\nOn all requests:\n\n```ts\nimport { fetch, Agent } from 'undici'\n\nconst upfetch = up(fetch, () =\u003e ({\n   dispatcher: new Agent({\n      keepAliveTimeout: 10,\n      keepAliveMaxTimeout: 10,\n   }),\n}))\n```\n\n### ✔️ Multiple fetch clients\n\nYou can create multiple upfetch instances with different defaults:\n\n```ts\nconst fetchMovie = up(fetch, () =\u003e ({\n   baseUrl: \"https://api.themoviedb.org\",\n   headers: {\n      accept: \"application/json\",\n      Authorization: `Bearer ${process.env.API_KEY}`,\n   },\n}))\n\nconst fetchFile = up(fetch, () =\u003e ({\n   parseResponse: async (res) =\u003e {\n      const name = res.url.split('/').at(-1) ?? ''\n      const type = res.headers.get('content-type') ?? ''\n      return new File([await res.blob()], name, { type })\n   },\n}))\n```\n\n## ➡️ Advanced Usage\n\n### ✔️ Error as value\n\nWhile the Fetch API does not throw an error when the response is not ok, _upfetch_ throws a `ResponseError` instead.\n\nIf you'd rather handle errors as values, set `reject` to return `false`. \\\nThis allows you to customize the `parseResponse` function to return both successful data and error responses in a structured format.\n\n```ts\nconst upfetch = up(fetch, () =\u003e ({\n   reject: () =\u003e false,\n   parseResponse: async (response) =\u003e {\n      const json = await response.json()\n      return response.ok\n         ? { data: json, error: null }\n         : { data: null, error: json }\n   },\n}))\n```\n\nUsage:\n\n```ts\nconst { data, error } = await upfetch('/users/1')\n```\n\n### ✔️ Custom response parsing\n\nBy default _upfetch_ is able to parse `json` and `text` sucessful responses automatically.\n\nThe `parseResponse` method is called when `reject` returns `false`.\nYou can use that option to parse other response types.\n\n```ts\nconst upfetch = up(fetch, () =\u003e ({\n   parseResponse: (response) =\u003e response.blob(),\n}))\n```\n\n💡 Note that the `parseResponse` method is called only when `reject` returns `false`.\n\n### ✔️ Custom response errors\n\nBy default _upfetch_ throws a `ResponseError` when `reject` returns `true`.\n\nIf you want to throw a custom error instead, you can pass a function to the `parseRejected` option.\n\n```ts\nconst upfetch = up(fetch, () =\u003e ({\n   parseRejected: async (response) =\u003e {\n      const status = response.status\n      const data = await response.json()\n      return new CustomError(status, data)\n   },\n}))\n```\n\n### ✔️ Custom params serialization\n\nBy default _upfetch_ serializes the params using `URLSearchParams`.\n\nYou can customize the params serialization by passing a function to the `serializeParams` option.\n\n```ts\nimport queryString from 'query-string'\n\nconst upfetch = up(fetch, () =\u003e ({\n   serializeParams: (params) =\u003e queryString.stringify(params),\n}))\n```\n\n### ✔️ Custom body serialization\n\nBy default _upfetch_ serializes the plain objects using `JSON.stringify`.\n\nYou can customize the body serialization by passing a function to the `serializeBody` option. It lets you:\n\n- **restrict the valid body type** by typing its first argument\n- **transform the body** in a valid `BodyInit` type\n\nThe following example show how to restrict the valid body type to `Record\u003cstring, any\u003e` and serialize it using `JSON.stringify`:\n\n```ts\n// Restrict the body type to Record\u003cstring, any\u003e and serialize it\nconst upfetch = up(fetch, () =\u003e ({\n   serializeBody: (body: Record\u003cstring, any\u003e) =\u003e JSON.stringify(body),\n}))\n\n// ❌ type error: the body is not a Record\u003cstring, any\u003e\nupfetch('https://a.b.c/todos', {\n   method: 'POST',\n   body: [['title', 'New Todo']],\n})\n\n// ✅ works fine with Record\u003cstring, any\u003e\nupfetch('https://a.b.c/todos', {\n   method: 'POST',\n   body: { title: 'New Todo' },\n})\n```\n\nThe following example uses `superjson` to serialize the body. The valid body type is inferred from `SuperJSON.stringify`.\n\n```ts\nimport SuperJSON from 'superjson'\n\nconst upfetch = up(fetch, () =\u003e ({\n   serializeBody: SuperJSON.stringify,\n}))\n```\n\n### ✔️ Defaults based on the request\n\nThe default options receive the fetcher arguments, this allows you to tailor the defaults based on the actual request.\n\n```ts\nconst upfetch = up(fetch, (input, options) =\u003e ({\n   baseUrl: 'https://example.com/',\n   headers: {\n      // Add authentication only for protected routes\n      Authorization:\n         typeof input === 'string' \u0026\u0026 input.startsWith('/api/protected/')\n            ? `Bearer ${getToken()}`\n            : undefined,\n   },\n   // Add tracking params only for public endpoints\n   params: {\n      trackingId:\n         typeof input === 'string' \u0026\u0026 input.startsWith('/public/')\n            ? crypto.randomUUID()\n            : undefined,\n   },\n   // Increase timeout for long-running operations\n   timeout:\n      typeof input === 'string' \u0026\u0026 input.startsWith('/export/') ? 30000 : 5000,\n}))\n```\n\n## ➡️ API Reference\n\n### \u003csamp\u003eup(fetch, getDefaultOptions?)\u003c/samp\u003e\n\nCreates a new upfetch instance with optional default options.\n\n```ts\nfunction up(\n   fetchFn: typeof globalThis.fetch,\n   getDefaultOptions?: (fetcherOptions: FetcherOptions) =\u003e DefaultOptions,\n): UpFetch\n```\n\n| Option                           | Signature                      | Description                                                                                               |\n| -------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------- |\n| `baseUrl`                        | `string`                       | Base URL for all requests.                                                                                |\n| `params`                         | `object`                       | The default query parameters.                                                                             |\n| `onRequest`                      | `(options) =\u003e void`            | Executes before the request is made.                                                                      |\n| `onError`                        | `(error, options) =\u003e void`     | Executes on error.                                                                                        |\n| `onSuccess`                      | `(data, options) =\u003e void`      | Executes when the request successfully completes.                                                         |\n| `parseResponse`                  | `(response, options) =\u003e data`  | The default success response parser. \u003cbr/\u003eIf omitted `json` and `text` response are parsed automatically. |\n| `parseRejected`                  | `(response, options) =\u003e error` | The default error response parser. \u003cbr/\u003eIf omitted `json` and `text` response are parsed automatically    |\n| `serializeBody`                  | `(body) =\u003e BodyInit`           | The default body serializer.\u003cbr/\u003e Restrict the valid `body` type by typing its first argument.            |\n| `serializeParams`                | `(params) =\u003e string`           | The default query parameter serializer.                                                                   |\n| `timeout`                        | `number`                       | The default timeout in milliseconds.                                                                      |\n| `reject`                         | `(response) =\u003e boolean`        | Decide when to reject the response.                                                                       |\n| _...and all other fetch options_ |                                |                                                                                                           |\n\n### \u003csamp\u003eupfetch(url, options?)\u003c/samp\u003e\n\nMakes a fetch request with the given options.\n\n```ts\nfunction upfetch(\n   url: string | URL | Request,\n   options?: FetcherOptions,\n): Promise\u003cany\u003e\n```\n\nOptions:\n\n| Option                           | Signature                      | Description                                                                                                                   |\n| -------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- |\n| `baseUrl`                        | `string`                       | Base URL for the request.                                                                                                     |\n| `params`                         | `object`                       | The query parameters.                                                                                                         |\n| `parseResponse`                  | `(response, options) =\u003e data`  | The success response parser.                                                                                                  |\n| `parseRejected`                  | `(response, options) =\u003e error` | The error response parser.                                                                                                    |\n| `schema`                         | `StandardSchemaV1`             | The schema to validate the response against.\u003cbr/\u003eThe schema must follow the [Standard Schema Specification][standard-schema]. |\n| `serializeBody`                  | `(body) =\u003e BodyInit`           | The body serializer.\u003cbr/\u003e Restrict the valid `body` type by typing its first argument.                                        |\n| `serializeParams`                | `(params) =\u003e string`           | The query parameter serializer.                                                                                               |\n| `timeout`                        | `number`                       | The timeout in milliseconds.                                                                                                  |\n| `reject`                         | `(response) =\u003e boolean`        | Decide when to reject the response.                                                                                           |\n| _...and all other fetch options_ |                                |                                                                                                                               |\n\n\u003cbr/\u003e\n\n### \u003csamp\u003eisResponseError(error)\u003c/samp\u003e\n\nChecks if the error is a `ResponseError`.\n\n### \u003csamp\u003eisValidationError(error)\u003c/samp\u003e\n\nChecks if the error is a `ValidationError`.\n\n### \u003csamp\u003eisJsonifiable(value)\u003c/samp\u003e\n\nDetermines whether a value can be safely converted to `json`.\n\nAre considered jsonifiable:\n\n- plain objects\n- arrays\n- class instances with a `toJSON` method\n\n## ➡️ Feature Comparison\n\nCheck out the [Feature Comparison][comparison] table to see how _upfetch_ compares to other fetching libraries.\n\n\u003cbr/\u003e\n\n## ➡️ Environment Support\n\n- ✅ Browsers (Chrome, Firefox, Safari, Edge)\n- ✅ Node.js (18.0+)\n- ✅ Bun\n- ✅ Deno\n- ✅ Cloudflare Workers\n- ✅ Vercel Edge Runtime\n\n\u003cdiv align=\"center\"\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\n\u003chr/\u003e\n\u003ch3\u003eShare on:\u003c/h3\u003e\n\n[![s][bsky-badge]][bsky-link]\n[![Share on Twitter][tweet-badge]][tweet-link]\n\n\u003cbr /\u003e\n\u003cbr /\u003e\n\u003c/div \u003e\n\n\u003c!-- Badges --\u003e\n\n[bsky-badge]: https://img.shields.io/badge/Bluesky-0085ff?logo=bluesky\u0026logoColor=fff\n[bsky-link]: https://bsky.app/intent/compose?text=https%3A%2F%2Fgithub.com%2FL-Blondy%2Fup-fetch\n[tweet-badge]: https://img.shields.io/badge/Twitter-0f1419?logo=x\u0026logoColor=fff\n[tweet-link]: https://twitter.com/intent/tweet?text=https%3A%2F%2Fgithub.com%2FL-Blondy%2Fup-fetch\n\n\u003c!-- links --\u003e\n\n[zod]: https://zod.dev/\n[valibot]: https://valibot.dev/\n[arktype]: https://arktype.dev/\n[standard-schema]: https://github.com/standard-schema/standard-schema\n[standard-schema-libs]: https://github.com/standard-schema/standard-schema?tab=readme-ov-file#what-schema-libraries-implement-the-spec\n[api-reference]: #️-api-reference\n[comparison]: https://github.com/L-Blondy/up-fetch/blob/master/COMPARISON.md\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FL-Blondy%2Fup-fetch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FL-Blondy%2Fup-fetch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FL-Blondy%2Fup-fetch/lists"}