openapi-typescript icon indicating copy to clipboard operation
openapi-typescript copied to clipboard

allow Request class to be provided in options (#1563)

Open elliots opened this issue 11 months ago • 7 comments

Changes

What does this PR change? Link to any related issue(s).

Allows you to provide the Request class to use.

see: https://github.com/drwpow/openapi-typescript/issues/1563

Caused issues for us using node 20's fetch, unidici's fetch, and node-fetch in different places.

Providing back as a base for someone else to continue, I may not have time soon.

How to Review

How can a reviewer review your changes? What should be kept in mind for this review?

Checklist

  • [ ] Unit tests updated
  • [ ] docs/ updated (if necessary)
  • [ ] pnpm run update:examples run (only applicable for openapi-typescript)

elliots avatar Mar 18 '24 05:03 elliots

⚠️ No Changeset found

Latest commit: 94070f1688a73d9a87eb7e9fa534b0a649bcf6ce

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

changeset-bot[bot] avatar Mar 18 '24 05:03 changeset-bot[bot]

Yup this is looking great, and what I was thinking. This will need 2 things:

  1. A simple test (which proves the types and runtime work as-expected)
  2. A patch changeset (see comment). Patch is sufficient because pre 1.0, minor means “breaking change” which this shouldn’t be.

drwpow avatar Mar 18 '24 11:03 drwpow

I had issues with the Request & the fetch on Vercel's environment.

The fix we used was in two steps:

  1. Provide a custom fetch for the client
export const OpenAPI = createClient<paths>({
  baseUrl: env.API_URL,
  fetch(request) {
    return fetch(request.url, request);
  },
});
  1. Make middleware return a new Request with two arguments instead of just returning the received request
const authMiddleware: Middleware = {
  onRequest(req) {
    if (UNPROTECTED_ROUTES.some((pathname) => req.url.startsWith(pathname))) {
      return undefined;
    }

    req.headers.set("Authorization", `Bearer ${accessToken}`);

    return new Request(req.url, req);
  },
};

We lost a few hours debugging this and I'm still unsure what was the cause but it was related to the fetch + Request

depsimon avatar Jun 05 '24 13:06 depsimon

Still open to this landing if this PR gets updated resolving the conflicts and passing CI! (the last commit still wasn’t mergeable).

drwpow avatar Jun 24 '24 15:06 drwpow

Hey, I would really like that change. Is there any way I can help to get this merged? Seems like it's only about some linting error that unfortunately I cannot see in the logs.

jscheffner avatar Aug 09 '24 11:08 jscheffner

Hey, I would really like that change. Is there any way I can help to get this merged? Seems like it's only about some linting error that unfortunately I cannot see in the logs.

@jscheffner it seems that it is only about linting and some conflicts, feel free to open a new PR so we can merge this.

kerwanp avatar Aug 10 '24 00:08 kerwanp

I just ran into this requirement as well - here is the PR to implement it

FYI @drwpow 🚀

tobiasdcl avatar Sep 10 '24 21:09 tobiasdcl