// the find
jaydenseric/apollo-upload-client
A terminating Apollo Link for Apollo Client that fetches a GraphQL multipart request if the GraphQL variables contain files (by default FileList, File, or Blob instances), or else fetches a regular GraphQL POST or GET request (depending on the config and GraphQL operation).
A terminating Apollo Link that transparently switches between multipart form uploads and regular GraphQL POST/GET requests based on whether variables contain File/FileList/Blob instances. Implements the GraphQL multipart request spec, so it needs a matching server-side handler (graphql-upload or equivalent). For anyone doing file uploads with Apollo Client, this is the standard approach.
Automatic detection of file variables means you don't change your mutation structure — just pass a File where you'd pass any other variable and the link handles the rest. Ships as pure ESM with no main index module, forcing explicit deep imports which keeps bundle sizes honest. The isExtractableFile export is public and customizable, so you can extend it to handle ReactNative's file objects or other non-standard file types. Actively maintained with recent activity (March 2026) despite being a narrow, stable library.
The TypeScript story is awkward — types come from JS files with @ts-check comments, requiring allowJs and maxNodeModuleJsDepth in tsconfig rather than shipping .d.ts files; this will confuse anyone with a strict TS setup. No built-in progress tracking for uploads, which is the first thing anyone actually building a file upload UI asks for. Server setup is entirely your problem — the readme points to the spec and examples repo, but if your backend doesn't implement graphql-multipart-request-spec exactly right you'll get cryptic errors with no diagnostics. The flat repo structure with no src/ directory and test utilities scattered in a test/ folder suggests this is a one-person project that hasn't needed to scale.