wretch
    Preparing search index...

    Interface Wretch<Self, Chain, Resolver, ErrorType>

    The Wretch object used to perform easy fetch requests.

    import wretch from "wretch"

    // Reusable wretch instance
    const w = wretch("https://domain.com", { mode: "cors" })

    Immutability : almost every method of this class return a fresh Wretch object.

    interface Wretch<
        Self = unknown,
        Chain = unknown,
        Resolver = undefined,
        ErrorType = undefined,
    > {
        accept(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            headerValue: string,
        ): this;
        addon<W, R>(
            addon: WretchAddon<W, R>,
        ): W & Self & Wretch<Self & W, Chain & R, Resolver, ErrorType>;
        addon<W1, R1, W2, R2>(
            addon: [WretchAddon<W1, R1>, WretchAddon<W2, R2>],
        ): W1 & W2 & Self & Wretch<
            Self & W1 & W2,
            Chain & R1 & R2,
            Resolver,
            ErrorType,
        >;
        addon<W1, R1, W2, R2, W3, R3>(
            addon: [WretchAddon<W1, R1>, WretchAddon<W2, R2>, WretchAddon<W3, R3>],
        ): W1 & W2 & W3 & Self & Wretch<
            Self & W1 & W2 & W3,
            Chain & R1 & R2 & R3,
            Resolver,
            ErrorType,
        >;
        addon<W1, R1, W2, R2, W3, R3, W4, R4>(
            addon: [
                WretchAddon<W1, R1>,
                WretchAddon<W2, R2>,
                WretchAddon<W3, R3>,
                WretchAddon<W4, R4>,
            ],
        ): W1 & W2 & W3 & W4 & Self & Wretch<
            Self & W1 & W2 & W3 & W4,
            Chain & R1 & R2 & R3 & R4,
            Resolver,
            ErrorType,
        >;
        addon<W1, R1, W2, R2, W3, R3, W4, R4, W5, R5>(
            addon: [
                WretchAddon<W1, R1>,
                WretchAddon<W2, R2>,
                WretchAddon<W3, R3>,
                WretchAddon<W4, R4>,
                WretchAddon<W5, R5>,
            ],
        ): W1 & W2 & W3 & W4 & W5 & Self & Wretch<
            Self & W1 & W2 & W3 & W4 & W5,
            Chain & R1 & R2 & R3 & R4 & R5,
            Resolver,
            ErrorType,
        >;
        addon<W1, R1, W2, R2, W3, R3, W4, R4, W5, R5, W6, R6>(
            addon: [
                WretchAddon<W1, R1>,
                WretchAddon<W2, R2>,
                WretchAddon<W3, R3>,
                WretchAddon<W4, R4>,
                WretchAddon<W5, R5>,
                WretchAddon<W6, R6>,
            ],
        ): W1 & W2 & W3 & W4 & W5 & W6 & Self & Wretch<
            Self & W1 & W2 & W3 & W4 & W5 & W6,
            Chain & R1 & R2 & R3 & R4 & R5 & R6,
            Resolver,
            ErrorType,
        >;
        addon<W1, R1, W2, R2, W3, R3, W4, R4, W5, R5, W6, R6, W7, R7>(
            addon: [
                WretchAddon<W1, R1>,
                WretchAddon<W2, R2>,
                WretchAddon<W3, R3>,
                WretchAddon<W4, R4>,
                WretchAddon<W5, R5>,
                WretchAddon<W6, R6>,
                WretchAddon<W7, R7>,
            ],
        ): W1 & W2 & W3 & W4 & W5 & W6 & W7 & Self & Wretch<
            Self & W1 & W2 & W3 & W4 & W5 & W6 & W7,
            Chain & R1 & R2 & R3 & R4 & R5 & R6 & R7,
            Resolver,
            ErrorType,
        >;
        addon<W1, R1, W2, R2, W3, R3, W4, R4, W5, R5, W6, R6, W7, R7, W8, R8>(
            addon: [
                WretchAddon<W1, R1>,
                WretchAddon<W2, R2>,
                WretchAddon<W3, R3>,
                WretchAddon<W4, R4>,
                WretchAddon<W5, R5>,
                WretchAddon<W6, R6>,
                WretchAddon<W7, R7>,
                WretchAddon<W8, R8>,
            ],
        ): W1 & W2 & W3 & W4 & W5 & W6 & W7 & W8 & Self & Wretch<
            Self & W1 & W2 & W3 & W4 & W5 & W6 & W7 & W8,
            Chain & R1 & R2 & R3 & R4 & R5 & R6 & R7 & R8,
            Resolver,
            ErrorType,
        >;
        addon<
            W1,
            R1,
            W2,
            R2,
            W3,
            R3,
            W4,
            R4,
            W5,
            R5,
            W6,
            R6,
            W7,
            R7,
            W8,
            R8,
            W9,
            R9,
        >(
            addon: [
                WretchAddon<W1, R1>,
                WretchAddon<W2, R2>,
                WretchAddon<W3, R3>,
                WretchAddon<W4, R4>,
                WretchAddon<W5, R5>,
                WretchAddon<W6, R6>,
            ],
        ): W1 & W2 & W3 & W4 & W5 & W6 & W7 & W8 & W9 & Self & Wretch<
            Self & W1 & W2 & W3 & W4 & W5 & W6 & W7 & W8 & W9,
            Chain & R1 & R2 & R3 & R4 & R5 & R6 & R7 & R8 & R9,
            Resolver,
            ErrorType,
        >;
        auth(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            headerValue: string,
        ): this;
        body(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            contents: any,
        ): this;
        catcher(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            errorId: string | number | symbol,
            catcher: (
                error: ErrorType extends undefined ? WretchError : ErrorType,
                originalRequest: this,
            ) => any,
        ): Wretch<
            Self,
            Chain,
            Resolver,
            ErrorType extends undefined ? WretchError : ErrorType,
        >;
        catcherFallback(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            catcher: (
                error: ErrorType extends undefined ? WretchError : ErrorType,
                originalRequest: this,
            ) => any,
        ): Wretch<
            Self,
            Chain,
            Resolver,
            ErrorType extends undefined ? WretchError : ErrorType,
        >;
        content(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            headerValue: string,
        ): this;
        customError<T>(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            transformer: (
                error: WretchError,
                response: WretchResponse,
                request: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            ) => T | Promise<T>,
        ): Self & Wretch<Self, Chain, Resolver, T>;
        defer<Clear extends boolean = false>(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            callback: WretchDeferredCallback<Self, Chain, Resolver, ErrorType>,
            clear?: Clear,
        ): this;
        delete(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            url?: string,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        fetch(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            method?: string,
            url?: string,
            body?: any,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        fetchPolyfill(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            fetch: (url: string, opts: WretchOptions) => Promise<Response>,
        ): this;
        get(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            url?: string,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        head(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            url?: string,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        headers(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            headerValues: HeadersInit,
        ): this;
        json(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            jsObject: object,
            contentType?: string,
        ): this;
        middlewares(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            middlewares: ConfiguredMiddleware[],
            clear?: boolean,
        ): this;
        options(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            options: WretchOptions,
            replace?: boolean,
        ): this;
        opts(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            url?: string,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        patch(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            body?: any,
            url?: string,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        post(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            body?: any,
            url?: string,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        put(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            body?: any,
            url?: string,
        ): Resolver extends undefined
            ? Chain & WretchResponseChain<
                Self,
                Chain,
                Resolver<Resolver>,
                ErrorType,
            >
            : Resolver;
        resolve<ResolverReturn, Clear extends boolean = false>(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            resolver: (
                chain: Resolver extends undefined
                    ? Chain & WretchResponseChain<Self, Chain, undefined, ErrorType>
                    : Clear extends true
                        ? Chain & WretchResponseChain<Self, Chain, undefined, ErrorType>
                        : Resolver,
                originalRequest: Self & Wretch<
                    Self,
                    Chain,
                    Clear extends true ? undefined : Resolver,
                    ErrorType,
                >,
            ) => ResolverReturn,
            clear?: Clear,
        ): Self & Wretch<Self, Chain, ResolverReturn, ErrorType>;
        toFetch(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
        ): (url: string, options?: WretchOptions) => Promise<Response>;
        url(
            this: Self & Wretch<Self, Chain, Resolver, ErrorType>,
            url: string,
            replace?: boolean,
        ): this;
    }

    Type Parameters

    • Self = unknown
    • Chain = unknown
    • Resolver = undefined
    • ErrorType = undefined
    Index

    Body Types

    • Sets the "Content-Type" header, stringifies an object and sets the request body.

      const jsonObject = { a: 1, b: 2, c: 3 };
      wretch("...").json(jsonObject).post();
      // Note that calling an 'http verb' method with an object argument is equivalent:
      wretch("...").post(jsonObject);

      Parameters

      Returns this

    HTTP

    • Sends the request using the accumulated fetch options.

      Can be used to replay requests.

      const reAuthOn401 = wretch()
      .catcher(401, async (error, request) => {
      // Renew credentials
      const token = await wretch("/renewtoken").get().text();
      storeToken(token);
      // Replay the original request with new credentials
      return request.auth(token).fetch().unauthorized((err) => {
      throw err;
      }).json();
      });

      reAuthOn401
      .get("/resource")
      .json() // <- Will only be called for the original promise
      .then(callback); // <- Will be called for the original OR the replayed promise result

      Parameters

      • this: Self & Wretch<Self, Chain, Resolver, ErrorType>
      • Optionalmethod: string

        The HTTP method to use

      • Optionalurl: string

        Some url to append

      • Optionalbody: any

        Set the body. Behaviour varies depending on the argument type, an object is considered as json.

      Returns Resolver extends undefined
          ? Chain & WretchResponseChain<
              Self,
              Chain,
              Resolver<Resolver>,
              ErrorType,
          >
          : Resolver

    post

    Helpers

    • Adds a catcher which will be called on every subsequent request error.

      Very useful when you need to perform a repetitive action on a specific error code.

      const w = wretch()
      .catcher(404, err => redirect("/routes/notfound", err.message))
      .catcher(500, err => flashMessage("internal.server.error"))

      // No need to catch the 404 or 500 codes, they are already taken care of.
      w.get("http://myapi.com/get/something").json()

      // Default catchers can be overridden if needed.
      w
      .get("http://myapi.com/get/something")
      .notFound(err =>
      // overrides the default 'redirect' catcher
      )
      .json()

      The original request is passed along the error and can be used in order to perform an additional request.

      const reAuthOn401 = wretch()
      .catcher(401, async (error, request) => {
      // Renew credentials
      const token = await wretch("/renewtoken").get().text();
      storeToken(token);
      // Replay the original request with new credentials
      return request.auth(token).fetch().unauthorized((err) => {
      throw err;
      }).json();
      });

      reAuthOn401
      .get("/resource")
      .json() // <- Will only be called for the original promise
      .then(callback); // <- Will be called for the original OR the replayed promise result

      Parameters

      Returns Wretch<
          Self,
          Chain,
          Resolver,
          ErrorType extends undefined ? WretchError : ErrorType,
      >

    • Configures custom error parsing for all error responses.

      Allows you to transform errors and add custom properties that will be fully typed across all error handlers (.error(), .badRequest(), .unauthorized(), etc.).

      interface ApiError {
      code: number;
      message: string;
      }

      const api = wretch("https://api.example.com")
      .customError<ApiError>(async (error, response, request) => {
      const json = await response.json();
      return { ...error, ...json };
      });

      // All error handlers now have typed access to ApiError properties
      api.get("/resource")
      .badRequest(error => {
      // error.code and error.message are fully typed as ApiError
      console.log(error.code, error.message);
      })
      .json();

      Type Parameters

      • T

      Parameters

      Returns Self & Wretch<Self, Chain, Resolver, T>

    • Defer one or multiple request chain methods that will get called just before the request is sent.

      // Small fictional example: deferred authentication

      // If you cannot retrieve the auth token while configuring the wretch object you can use .defer to postpone the call
      const api = wretch("http://some-domain.com").defer((w, url, options) => {
      // If we are hitting the route /user…
      if (//user/.test(url)) {
      const { token } = options.context;
      return w.auth(token);
      }
      return w;
      });

      // ... //

      const token = await getToken(request.session.user);

      // .auth gets called here automatically
      api.options({
      context: { token },
      }).get("/user/1").res();

      Type Parameters

      • Clear extends boolean = false

      Parameters

      Returns this

    • Sets a custom fetch implementation to use for requests.

      This is useful for:

      • Adding custom middleware to fetch
      • Using alternative fetch implementations
      • Mocking fetch in tests
      • Adding performance monitoring
      // Add performance monitoring to fetch
      const customFetch = (url, opts) => {
      console.time(url)
      return fetch(url, opts).finally(() => console.timeEnd(url))
      }

      wretch("http://domain.com")
      .fetchPolyfill(customFetch)
      .get()

      Parameters

      Returns this

    • Sets the request headers.

      wretch("...")
      .headers({ "Content-Type": "text/plain", Accept: "application/json" })
      .post("my text")
      .json();

      Parameters

      Returns this

    • Add middlewares to intercept a request before being sent.

      // A simple delay middleware.
      const delayMiddleware = delay => next => (url, opts) => {
      return new Promise(res => setTimeout(() => res(next(url, opts)), delay))
      }

      // The request will be delayed by 1 second.
      wretch("...").middlewares([
      delayMiddleware(1000)
      ]).get().res()

      Parameters

      Returns this

    • Sets the fetch options.

      wretch("...").options({ credentials: "same-origin" });
      

      Wretch being immutable, you can store the object for later use.

      const corsWretch = wretch().options({ credentials: "include", mode: "cors" });

      corsWretch.get("http://endpoint1");
      corsWretch.get("http://endpoint2");

      You can override instead of mixing in the existing options by passing a boolean flag.

      // By default options are mixed in :
      let w = wretch()
      .options({ headers: { "Accept": "application/json" } })
      .options({ encoding: "same-origin", headers: { "X-Custom": "Header" } });
      console.log(JSON.stringify(w._options))
      // => {"encoding":"same-origin", "headers":{"Accept":"application/json","X-Custom":"Header"}}

      // With the flag, options are overridden :
      w = wretch()
      .options({ headers: { "Accept": "application/json" } })
      .options(
      { encoding: "same-origin", headers: { "X-Custom": "Header" } },
      true,
      );
      console.log(JSON.stringify(w._options))
      // => {"encoding":"same-origin","headers":{"X-Custom":"Header"}}

      Parameters

      Returns this

    • Converts the wretch instance into a fetch-like function that preserves all accumulated configuration (middlewares, catchers, options, headers, etc.).

      Useful for integrating with libraries that expect a fetch function signature.

      const myFetch = wretch("https://api.example.com")
      .auth("Bearer token")
      .catcher(401, handleAuth)
      .middlewares([retry()])
      .toFetch()

      // Use like regular fetch but with all the wretch configuration
      const response = await myFetch("/users", { method: "GET" })

      Parameters

      Returns (url: string, options?: WretchOptions) => Promise<Response>

    • Appends or replaces the url.

      wretch("/root").url("/sub").get().json();

      // Can be used to set a base url

      // Subsequent requests made using the 'blogs' object will be prefixed with "http://domain.com/api/blogs"
      const blogs = wretch("http://domain.com/api/blogs");

      // Perfect for CRUD apis
      const id = await blogs.post({ name: "my blog" }).json(blog => blog.id);
      const blog = await blogs.get(`/${id}`).json();
      console.log(blog.name);

      await blogs.url(`/${id}`).delete().res();

      // And to replace the base url if needed :
      const noMoreBlogs = blogs.url("http://domain2.com/", true);

      Parameters

      Returns this